blob: 42e84ee00c0e6e2c5ecd50dd6a3fdbe55da6a301 [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
******************************************************************************/
//@ sourceURL=DataBinding.js
///////////////////
// Event Delegation
var MODEL_KEY = "org.eclipse.rap.addons.autosuggest#Model";
function handleEvent( event ) {
if( event.widget ) {
var model = rap.getObject( event.widget.getData( MODEL_KEY ) );
if( event.widget.classname === "rwt.dropdown.DropDown" ) {
handleDropDownEvent( model, event );
} else {
handleTextEvent( model, event );
}
} else {
handleModelEvent.apply( this, arguments );
}
}
function handleDropDownEvent( model, event ) {
switch( event.type ) {
case SWT.Show:
case SWT.Hide:
onDropDownChangeVisible( model, event );
break;
case SWT.Selection:
onDropDownSelection( model, event );
break;
case SWT.DefaultSelection:
onDropDownDefaultSelection( model, event );
break;
}
}
function handleTextEvent( model, event ) {
var userAction = getUserAction( event );
switch( event.type ) {
case SWT.Modify:
onTextModify( model, event, userAction );
break;
}
setUserAction( event );
}
function handleModelEvent( event ) {
var model = event.source;
var textWidget;
try {
textWidget = rap.getObject( model.get( "textWidgetId" ) );
} catch( ex ) {
// When Text is disposed, AutoSuggest may perform a set operation before it is disposed as well
return;
}
var dropDown = rap.getObject( model.get( "dropDownWidgetId" ) );
switch( event.property ) {
case "text":
onModelChangeText( textWidget, model, event );
break;
case "textSelection":
onModelChangeTextSelection( textWidget, model, event );
break;
case "currentSuggestionTexts":
onModelChangeCurrentSuggestionTexts( dropDown, model, event );
break;
case "suggestionsVisible":
onModelChangeSuggestionsVisible( dropDown, model, event );
break;
}
}
function setUserAction( event ) {
if( event.type === SWT.Verify ) {
// See Bug 404896 - [ClientScripting] Verify event keyCode is always zero when replacing txt
var action = ( event.text !== "" /* && event.keyCode !== 0 */ ) ? "typing" : "deleting";
event.widget.setData( "userAction", action );
}
}
function getUserAction( event ) {
var action = event.widget.getData( "userAction" );
event.widget.setData( "userAction", null );
return action;
}
/////////////////
// Event Handling
function onTextModify( model, event, userAction ) {
var text = event.widget.getText();
model.set( "text", text, { "action" : "sync" } );
if( userAction ) {
model.set( "userText", text, { "action" : userAction } );
}
}
function onDropDownChangeVisible( model, event ) {
model.set( "suggestionsVisible", event.widget.getVisible(), { "action" : "sync" } );
}
function onDropDownSelection( model, event ) {
model.set( "selectedSuggestionIndex", event.index, { "action" : "sync" } );
}
function onDropDownDefaultSelection( model, event ) {
model.notify( "accept", { type : "accept", "source" : model } );
}
function onModelChangeCurrentSuggestionTexts( dropDown, model, event ) {
dropDown.setItems( model.get( "currentSuggestionTexts" ) );
}
function onModelChangeSuggestionsVisible( dropDown, model, event ) {
if( event.options.action !== "sync" ) {
dropDown.setVisible( event.value );
}
}
function onModelChangeText( textWidget, model, event ) {
if( event.options.action !== "sync" ) {
textWidget.setText( event.value );
}
}
function onModelChangeTextSelection( textWidget, model, event ) {
textWidget.setSelection( event.value );
}