/*
* 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 java.util.Vector;
import net.rim.sdk.resourceutil.ResourceUtil;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
class ResourceCellEditorDialog extends Dialog implements IDisplayable {
private IResourceCellEditor _keyEditor;
private IResourceCellEditor _valueEditor;
private IResourceCellEditor _commentEditor;
private String _originalLocaleName;
private Object _originalLocaleValue;
private static final int NUM_CHARS_COMMENT_TEXT = 40;
private static final int NUM_LINES_COMMENT_TEXT = 5;
private static final int NUM_CHARS_VALUE_TEXT = 30;
private static final int NUM_LINES_VALUE_LIST = 5;
public ResourceCellEditorDialog( Shell parentShell, IResourceCellEditor keyEditor, IResourceCellEditor valueEditor,
IResourceCellEditor commentEditor, String originalLocaleName, Object originalLocaleValue ) {
super( parentShell );
setShellStyle( getShellStyle() | SWT.RESIZE );
_keyEditor = keyEditor;
_valueEditor = valueEditor;
_commentEditor = commentEditor;
_originalLocaleName = originalLocaleName;
_originalLocaleValue = originalLocaleValue;
}
public final void display() {
open();
}
protected void configureShell( Shell newShell ) {
super.configureShell( newShell );
newShell.setText( "Edit Resource Line" );
}
protected Control createDialogArea( Composite parent ) {
Composite container = (Composite) super.createDialogArea( parent );
container.setLayout( new GridLayout( 1, false ) );
createKeyArea( container );
createCommentArea( container );
createValueArea( container );
createOriginalLocaleArea( container );
return container;
}
protected void okPressed() {
_keyEditor.apply();
_valueEditor.apply();
_commentEditor.apply();
super.okPressed();
}
protected void cancelPressed() {
_keyEditor.cancel();
_valueEditor.cancel();
_commentEditor.cancel();
super.cancelPressed();
}
private void createCommentArea( Composite container ) {
GridData data = new GridData();
data.verticalIndent = 5;
Label commentLabel = new Label( container, SWT.NONE );
commentLabel.setText( "Comment:" );
commentLabel.setLayoutData( data );
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
data.heightHint = getTextHeight( container ) * NUM_LINES_COMMENT_TEXT;
data.widthHint = getTextWidth( container ) * NUM_CHARS_COMMENT_TEXT;
final Text commentText = new Text( container, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL );
commentText.setText( (String) _commentEditor.getValue() );
commentText.setLayoutData( data );
commentText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
commentTextChanged( commentText.getText() );
}
} );
}
private void createKeyArea( Composite container ) {
Label keyLabel = new Label( container, SWT.NONE );
keyLabel.setText( "Key:" );
GridData data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
final Text keyText = new Text( container, SWT.BORDER );
keyText.setText( (String) _keyEditor.getValue() );
keyText.setLayoutData( data );
keyText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
keyTextChanged( keyText.getText() );
}
} );
}
private void createOriginalLocaleArea( Composite container ) {
if( _originalLocaleName != null && _originalLocaleValue != null ) {
GridData data = new GridData();
data.verticalIndent = 5;
Label originalLocaleLabel = new Label( container, SWT.NONE );
originalLocaleLabel.setText( "Original Locale Value (" + _originalLocaleName + ")" );
originalLocaleLabel.setLayoutData( data );
String[] valuesArray;
if( _originalLocaleValue instanceof String ) {
valuesArray = new String[] { (String) _originalLocaleValue };
} else if( _originalLocaleValue instanceof Vector ) {
Vector< String > originalLocaleValues = (Vector< String >) _originalLocaleValue;
valuesArray = originalLocaleValues.toArray( new String[ originalLocaleValues.size() ] );
} else {
throw new IllegalStateException( "Original locale value is neither String nor Vector<String>" );
}
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
List originalLocaleValueList = new List( container, SWT.NONE );
originalLocaleValueList.setItems( valuesArray );
originalLocaleValueList.setLayoutData( data );
originalLocaleValueList.setEnabled( false );
}
}
private void createValueArea( Composite container ) {
GridData data = new GridData();
data.verticalIndent = 5;
Label valueLabel = new Label( container, SWT.NONE );
valueLabel.setText( "Value:" );
valueLabel.setLayoutData( data );
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
Object value = _valueEditor.getValue();
if( value instanceof String ) {
final Text valueText = new Text( container, SWT.BORDER );
String escapedValue = ResourceUtil.unicodeToEscaped( (String) value );
valueText.setText( escapedValue );
valueText.setLayoutData( data );
valueText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
valueTextChanged( valueText.getText() );
}
} );
} else if( value instanceof Vector ) {
// Create components
final List valueList = new List( container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL );
Composite composite = new Composite( container, SWT.NONE );
final Text valueText = new Text( composite, SWT.BORDER );
final Button addButton = new Button( composite, SWT.PUSH | SWT.CENTER );
final Button editButton = new Button( composite, SWT.PUSH | SWT.CENTER );
final Button removeButton = new Button( composite, SWT.PUSH | SWT.CENTER );
// Lay out and set up components
data.heightHint = getTextHeight( container ) * NUM_LINES_VALUE_LIST;
valueList.setLayoutData( data );
Vector< String > values = (Vector< String >) value;
String[] valuesArray = values.toArray( new String[ values.size() ] );
valueList.setItems( valuesArray );
valueList.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
setValueTextFromValueListSelection( valueList, valueText );
setEditButtonEnabled( editButton, valueList );
setRemoveButtonEnabled( removeButton, valueList );
}
} );
data = new GridData();
data.horizontalAlignment = SWT.CENTER;
composite.setLayoutData( data );
composite.setLayout( new GridLayout( 4, false ) );
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.widthHint = getTextWidth( composite ) * NUM_CHARS_VALUE_TEXT;
valueText.setLayoutData( data );
addButton.setText( "Add" );
addButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
String text = valueText.getText();
int index = valueList.getSelectionIndex();
if( index == -1 ) {
index = valueList.getItemCount();
} else {
++index;
}
addToValueList( valueList, index, text );
setEditButtonEnabled( editButton, valueList );
setRemoveButtonEnabled( removeButton, valueList );
keyValuesChanged( valueList );
}
} );
editButton.setText( "Edit" );
editButton.setEnabled( false );
editButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
setValueListSelectionFromValueText( valueList, valueText );
keyValuesChanged( valueList );
}
} );
removeButton.setText( "Remove" );
removeButton.setEnabled( false );
removeButton.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
int index = valueList.getSelectionIndex();
valueList.remove( index );
if( index == valueList.getItemCount() ) {
--index;
}
valueList.setSelection( index );
setValueTextFromValueListSelection( valueList, valueText );
setEditButtonEnabled( editButton, valueList );
setRemoveButtonEnabled( removeButton, valueList );
keyValuesChanged( valueList );
}
} );
} else {
throw new IllegalStateException( "Resource value is neither String nor Vector<String>" );
}
}
private void commentTextChanged( String newText ) {
_commentEditor.changeValue( newText );
}
private static int getTextHeight( Control control ) {
GC gc = new GC( control );
gc.setFont( control.getFont() );
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
return fontMetrics.getHeight();
}
private static int getTextWidth( Control control ) {
GC gc = new GC( control );
gc.setFont( control.getFont() );
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
return fontMetrics.getAverageCharWidth();
}
private void keyTextChanged( String newText ) {
_keyEditor.changeValue( newText );
}
private void keyValuesChanged( List valueList ) {
String[] valueStrings = valueList.getItems();
Vector< String > values = new Vector< String >( valueStrings.length );
for( int i = 0; i < valueStrings.length; ++i ) {
values.add( i, valueStrings[ i ] );
}
_valueEditor.changeValue( values );
}
private static void setEditButtonEnabled( Button editButton, List valueList ) {
boolean enabled = valueList.getSelectionIndex() != -1;
editButton.setEnabled( enabled );
}
private static void setRemoveButtonEnabled( Button removeButton, List valueList ) {
boolean enabled = valueList.getSelectionIndex() != -1;
removeButton.setEnabled( enabled );
}
private static void setValueListSelectionFromValueText( List valueList, Text valueText ) {
int index = valueList.getSelectionIndex();
if( index != -1 ) {
String text = valueText.getText();
text = ResourceUtil.escapedToUnicode( text );
valueList.setItem( index, text );
}
}
private static void setValueTextFromValueListSelection( List valueList, Text valueText ) {
int index = valueList.getSelectionIndex();
if( index != -1 ) {
String text = valueList.getItem( index );
text = ResourceUtil.unicodeToEscaped( text );
valueText.setText( text );
} else {
valueText.setText( "" );
}
}
private static void addToValueList( List valueList, int index, String text ) {
text = ResourceUtil.escapedToUnicode( text );
valueList.add( text, index );
valueList.setSelection( index );
}
private void valueTextChanged( String newText ) {
_valueEditor.changeValue( newText );
}
}