/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.editors.locale;
import net.rim.sdk.resourceutil.ResourceUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
class ResourceCellEditorTextBox implements IDisplayable {
private int _columnIndex;
private IResourceCellEditor _editor;
private FocusListener _focusListener;
private boolean _isDisposed;
private Table _table;
private TableEditor _tableEditor;
private Text _text;
// TODO: add TextActionHandler
ResourceCellEditorTextBox( Table table, int columnIndex, IResourceCellEditor editor ) {
_table = table;
_columnIndex = columnIndex;
_editor = editor;
_text = createText();
_tableEditor = createTableEditor();
}
public void display() {
if( _isDisposed ) {
return;
}
TableItem item = _table.getSelection()[ 0 ];
_tableEditor.setEditor( _text, item, _columnIndex );
String escapedValue = ResourceUtil.unicodeToEscaped( (String) _editor.getValue() );
_text.setText( escapedValue );
_text.selectAll();
_text.setFocus();
_text.setVisible( true );
}
private void applyValueAndDisposeEditor() {
// remove FocusListener in case firing the apply event causes
// focus to be lost, otherwise applyValueAndDisposeEditor()
// could get called again as a result
_text.removeFocusListener( _focusListener );
_editor.apply();
disposeEditor();
}
private void cancelAndDisposeEditor() {
// remove FocusListener in case firing the cancel event causes
// focus to be lost, otherwise applyValueAndDisposeEditor()
// could get called as a result
_text.removeFocusListener( _focusListener );
_editor.cancel();
disposeEditor();
}
private TableEditor createTableEditor() {
TableEditor tableEditor = new TableEditor( _table );
tableEditor.horizontalAlignment = SWT.LEFT;
tableEditor.grabHorizontal = true;
return tableEditor;
}
private Text createText() {
final Text text = new Text( _table, SWT.NONE );
text.addListener( SWT.Traverse, new Listener() {
public void handleEvent( Event event ) {
switch( event.detail ) {
case SWT.TRAVERSE_ESCAPE:
cancelAndDisposeEditor();
event.doit = true;
event.detail = SWT.TRAVERSE_NONE;
break;
case SWT.TRAVERSE_RETURN:
applyValueAndDisposeEditor();
event.doit = true;
event.detail = SWT.TRAVERSE_NONE;
break;
}
}
} );
text.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
_editor.changeValue( text.getText() );
}
} );
_focusListener = new FocusAdapter() {
public void focusLost( FocusEvent e ) {
applyValueAndDisposeEditor();
}
};
text.addFocusListener( _focusListener );
text.setVisible( false );
return text;
}
private void disposeEditor() {
if( _isDisposed ) {
return;
}
_tableEditor.setEditor( null, null, _columnIndex );
_tableEditor.dispose();
_tableEditor = null;
_text.setVisible( false );
_text.dispose();
_text = null;
_isDisposed = true;
}
}