blob: 765091bcc5218281b6685d0f7ec25959762c1ab9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 EclipseSource.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
var VIEWER_KEY = "org.eclipse.rap.addons.dropdown.viewer.DropDownViewer#viewer";
var searchItems = rwt.dropdown.DropDown.searchItems;
var createQuery = rwt.dropdown.DropDown.createQuery;
function handleEvent( event ) {
switch( event.type ) {
case SWT.Modify:
handleModify( event );
break;
case SWT.Verify:
handleVerify( event );
break;
case SWT.KeyDown:
handleKeyDown( event );
break;
case SWT.MouseDown:
handleMouseDown( event );
break;
}
}
function handleVerify( event ) {
// See Bug 404896 - [ClientScripting] Verify event keyCode is always zero when replacing txt
if( event.text !== "" /* && event.keyCode !== 0 */ ) {
event.widget.setData( "typing", true );
} else {
event.widget.setData( "deleting", true );
}
}
function handleModify( event ) {
var widget = event.widget;
var text = widget.getText().toLowerCase();
var viewer = rap.getObject( widget.getData( VIEWER_KEY ) );
var dropdown = rap.getObject( viewer.get( "dropDown" ) );
var data = viewer.get( "elements" );
var result = searchItems( data, createQuery( text ) );
if( result.items.length === 0 ) {
result = searchItems( data, /.*/ );
if( text.length >= 1 ) {
showError( viewer, true )
} else {
showError( viewer, false )
}
} else {
showError( viewer, false )
}
var typing = widget.getData( "typing" );
if( typing || widget.getData( "deleting" ) ) {
dropdown.setData( "userText", widget.getText() );
}
var selecting = widget.getData( "selecting" );
widget.setData( "typing", false );
widget.setData( "deleting", false );
widget.setData( "selecting", false );
if( !selecting ) {
if( result.items.length > 0 ) {
dropdown.setItems( result.items );
dropdown.setData( "indexMapping", result.indicies );
dropdown.setData( "internalShow", true );
dropdown.show();
dropdown.setData( "internalShow", false );
var sel = widget.getSelection();
var common = commonText( result.items );
if( typing && result.items.length === 1 ) {
dropdown.setSelectionIndex( 0 );
}
if( typing && common && common.length > text.length ) {
var newSel = [ sel[ 0 ], common.length ];
widget.setText( common );
widget.setSelection( newSel );
}
} else {
dropdown.hide();
}
}
}
function handleKeyDown( event ) {
var widget = event.widget;
var viewer = rap.getObject( widget.getData( VIEWER_KEY ) );
var dropdown = rap.getObject( viewer.get( "dropDown" ) );
switch( event.keyCode ) {
case SWT.CR:
var sel = widget.getSelection();
widget.setSelection( [ sel[ 1 ], sel[ 1 ] ] );
break;
}
}
function handleMouseDown( event ) {
var widget = event.widget;
var viewer = rap.getObject( widget.getData( VIEWER_KEY ) );
var dropdown = rap.getObject( viewer.get( "dropDown" ) );
dropdown.setVisible( !dropdown.getVisible() );
}
function commonText( items ) {
var result = null;
if( items.length === 1 ) {
result = items[ 0 ];
} else {
var cont = true;
var commonTo = 0;
while( cont ) {
var next = items[ 0 ].indexOf( " ", commonTo + 1 ); // TODO [tb] : also respect ,"':;
if( next !== -1 ) {
var testString = items[ 0 ].slice( 0, next + 1 );
var commons = searchItems( items, createQuery( testString, true ) ).items;
if( items.length === commons.length ) {
commonTo = next + 1;
} else {
cont = false;
}
} else {
cont = false;
}
}
if( commonTo > 0 ) {
result = items[ 0 ].slice( 0, commonTo );
}
}
return result;
}
function showError( viewer, value ) {
var text = rap.getObject( viewer.get( "text" ) );
var decorator = rap.getObject( viewer.get( "decorator" ) );
text.setBackground( value ? [ 255, 255, 128 ] : null );
decorator.setVisible( value );
}