import java.util.Map.Entry;
import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.tizen.common.util.Assert;
import org.tizen.common.util.CollectionUtil;
import org.tizen.common.util.SWTUtil;
+import org.tizen.common.util.StringUtil;
/**
protected String title = "Dynamic Dialog"; // default. If you want to change, use setter.
protected int width = 500; // default. This is fixed currently.
+ protected Text errorMessageText;
+ protected String errorMessage;
+
// inputted fields
protected Collection<UserField> fields;
}
@Override
+ protected int getShellStyle() {
+ return super.getShellStyle() | SWT.APPLICATION_MODAL;
+ }
+
+ @Override
protected Point getInitialSize() {
Point initialSize = super.getInitialSize();
return initialSize;
}
+ protected void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+
+ if ( this.errorMessageText != null && !this.errorMessageText.isDisposed()) {
+ this.errorMessageText.setText( StringUtil.nvl( errorMessage ) ); //$NON-NLS-1$
+
+ boolean hasError = StringUtil.hasLength( errorMessage );
+ this.errorMessageText.setEnabled( hasError );
+ this.errorMessageText.setVisible( hasError );
+ this.errorMessageText.getParent().update();
+
+ Control button = getButton( IDialogConstants.OK_ID );
+ if (button != null) {
+ button.setEnabled( !hasError );
+ }
+ }
+ }
+
+ protected Text createErrorMessageText(Composite parent) {
+ errorMessageText = new Text( parent, SWT.READ_ONLY | SWT.WRAP );
+ errorMessageText.setLayoutData( new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL ) );
+ errorMessageText.setBackground( errorMessageText.getDisplay().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ) );
+
+ setErrorMessage(errorMessage);
+
+ return errorMessageText;
+ }
+
+ private String validateInput(UserField userField) {
+ // validate this
+ InputValidator validator = userField.getValidator();
+ if ( validator != null ) {
+ Control control = this.controlMap.get( userField.getId() );
+ if ( control instanceof Text && control.isEnabled()) {
+ String text = ((Text) control).getText();
+ String errorMsg = validator.check( text );
+ if ( StringUtil.hasText( errorMsg ) ) {
+ return errorMsg;
+ }
+ }
+ }
+
+ // validate childs
+ Collection<UserField> children = userField.getChildren();
+ if ( children != null ) {
+ for ( UserField child : children ) {
+ String errorMsg = validateInput( child );
+ if ( StringUtil.hasText( errorMsg ) ) {
+ return errorMsg;
+ }
+ }
+ }
+
+ return StringUtil.EMPTY_STRING;
+ }
+
+ protected void validateInput() {
+ String errorMessage = null;
+
+ // validate
+ for ( UserField userField : this.fields ) {
+ errorMessage = validateInput( userField );
+ if ( StringUtil.hasText( errorMessage ) ) {
+ break;
+ }
+ }
+
+ setErrorMessage( errorMessage );
+ }
+
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
*/
// create super dialog control
Composite superContents = (Composite) super.createContents( parent );
- Control dialogArea = this.getDialogArea();
+ Composite dialogArea = (Composite) this.getDialogArea();
+
+ this.createErrorMessageText( dialogArea );
+
boolean firstControl = true;
for ( UserField field : this.fields ) {
// create dynamic dialog control
- Control control = createDynamicControl( (Composite) dialogArea, field );
+ Control control = createDynamicControl( dialogArea, field );
// set focus to first control
if ( firstControl && control != null ) {
Composite composite = createComposite( parent, new GridLayout( 2, false ), new GridData( GridData.FILL_BOTH ) );
createLabel( composite, new GridData( GridData.HORIZONTAL_ALIGN_END ), field.getMessage(), field.canModify() );
- Text text = createText( composite, new GridData( GridData.FILL_BOTH ), field.getValue(), field.canModify(), field.getValidator() );
- text.addModifyListener( new ModifyListener() {
+ final Text text = createText( composite, new GridData( GridData.FILL_BOTH ), field.getValue(), field.canModify(), field.getValidator() );
+ final ModifyListener modifyListener = new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
Text modifiedText = ((Text) e.widget);
field.setValue( modifiedText.getText() ); // synchronize model
}
+ };
+ text.addModifyListener( modifyListener );
+ text.addDisposeListener( new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ text.removeModifyListener( modifyListener );
+ text.removeDisposeListener( this );
+ }
} );
this.controlMap.put( field.getId(), text );
Composite composite = createComposite( parent, new GridLayout( 2, false ), new GridData( GridData.FILL_BOTH ) );
createLabel( composite, new GridData( GridData.HORIZONTAL_ALIGN_END ), field.getMessage(), field.canModify() );
- Text text = createPasswordText( composite, new GridData( GridData.FILL_BOTH ), field.getValue(), field.canModify(), field.getValidator() );
- text.addModifyListener( new ModifyListener() {
+ final Text text = createPasswordText( composite, new GridData( GridData.FILL_BOTH ), field.getValue(), field.canModify(), field.getValidator() );
+
+ final ModifyListener modifyListener = new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
Text modifiedText = ((Text) e.widget);
field.setValue( modifiedText.getText().toCharArray() ); // synchronize model
}
+ };
+ text.addModifyListener( modifyListener );
+ text.addDisposeListener( new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ text.removeModifyListener( modifyListener );
+ text.removeDisposeListener( this );
+ }
} );
this.controlMap.put( field.getId(), text );
}
protected Button createBooleanTypeControl(Composite parent, final UserField field) {
- Button button = createCheckButton( parent, new GridData( GridData.CENTER ), field.getId(), field.getMessage(), field.getValue(), field.canModify() );
- button.addSelectionListener( new SelectionAdapter() {
+ final Button button = createCheckButton( parent, new GridData( GridData.CENTER ), field.getId(), field.getMessage(), field.getValue(), field.canModify() );
+ final SelectionAdapter selectionAdapter = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Button modifiedButton = ((Button) e.widget);
field.setValue( modifiedButton.getSelection() ); // synchronize model
}
+ };
+ button.addSelectionListener( selectionAdapter );
+ button.addDisposeListener( new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ button.removeSelectionListener( selectionAdapter );
+ button.removeDisposeListener( this );
+ }
} );
this.controlMap.put( field.getId(), button );
}
private Text createText(Composite parent, Object layoutData, Object defaultText, boolean enabled, final InputValidator validator) {
- Text text = new Text( parent, getTextStyle() );
+ final Text text = new Text( parent, getTextStyle() );
text.setLayoutData( layoutData );
+
+ final ModifyListener textModifyListener = new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validateInput();
+ }
+ };
+ text.addModifyListener( textModifyListener );
+ text.addDisposeListener( new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ text.removeModifyListener( textModifyListener );
+ text.removeDisposeListener( this );
+ }
+ } );
+
if ( defaultText instanceof String ) {
text.setText( (String) defaultText );
+ } else {
+ text.setText( StringUtil.EMPTY_STRING );
}
text.setEnabled( enabled );
- // TODO : add validation logic
return text;
}
private Text createPasswordText(Composite parent, Object layoutData, Object defaultText, boolean enabled, final InputValidator validator) {
- Text text = new Text( parent, getPasswordTextStyle() );
+ final Text text = new Text( parent, getPasswordTextStyle() );
text.setLayoutData( layoutData );
+
+ final ModifyListener textModifyListener = new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validateInput();
+ }
+ };
+ text.addModifyListener( textModifyListener );
+ text.addDisposeListener( new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ text.removeModifyListener( textModifyListener );
+ text.removeDisposeListener( this );
+ }
+ } );
+
if ( defaultText instanceof char[] ) {
text.setText( new String( (char[]) defaultText ) );
} else if ( defaultText instanceof Character[] ) {
text.setText( ((Character[]) defaultText).toString() );
+ } else {
+ text.setText( StringUtil.EMPTY_STRING );
}
+
text.setEnabled( enabled );
- // TODO : add validation logic
return text;
}
private Button createCheckButton(Composite parent, Object layoutData, final String id, String msg, Object value, boolean enabled) {
- Button button = new Button( parent, getCheckButtonStyle() );
+ final Button button = new Button( parent, getCheckButtonStyle() );
button.setLayoutData( layoutData );
- button.setText( msg );
- button.setEnabled( enabled );
- button.addSelectionListener( new SelectionAdapter() {
+
+ final SelectionAdapter selectionAdapter = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
enableChildControls( id, ((Button) e.widget).getSelection() );
}
- });
+ };
+ button.addSelectionListener( selectionAdapter );
+ button.addDisposeListener( new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ button.removeSelectionListener( selectionAdapter );
+ button.removeDisposeListener( this );
+ }
+ } );
+
+ button.setText( msg );
+ button.setEnabled( enabled );
+
button.setSelection( getBoolean( value ) );
return button;