// Created on 30.09.2007 package org.eclipse.rap.rms.ui.internal.datamodel; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.regex.Pattern; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.databinding.conversion.IConverter; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.validation.IValidator; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.databinding.swt.ISWTObservableValue; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.rap.rms.data.IEntity; import org.eclipse.rap.rms.ui.internal.Activator; import org.eclipse.rap.rms.ui.internal.RMSMessages; import org.eclipse.rwt.RWT; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; 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.DateTime; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.ColumnLayout; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; class PageUtil { // static final IConverter STRING_TO_DATE_CONVERTER // = new StringToDateConverter(); static final IConverter DATE_TO_STRING_CONVERTER = new DateToStringConverter(); private static final Status VALIDATION_SUCCESS = new Status( IStatus.OK, "org.eclipse.rap.rms.ui", "" ); //$NON-NLS-1$ //$NON-NLS-2$ private static final Status VALIDATION_FAIL = new Status( IStatus.CANCEL, "org.eclipse.rap.rms.ui", "" ); //$NON-NLS-1$ //$NON-NLS-2$ private static final Color COLOR_FG_SUCCESS = Display.getCurrent().getSystemColor( SWT.COLOR_BLACK ); private static final Color COLOR_FG_FAIL = Display.getCurrent().getSystemColor( SWT.COLOR_WHITE ); private static final Color COLOR_BG_FAIL = Display.getCurrent().getSystemColor( SWT.COLOR_DARK_RED ); private static final Color COLOR_BG_SUCCESS = Display.getCurrent().getSystemColor( SWT.COLOR_WHITE ); private static final class DateToStringConverter implements IConverter { public Object convert( final Object fromObject ) { Object result = null; if( fromObject != null ) { Date from = ( Date )fromObject; SimpleDateFormat dateFormat = new SimpleDateFormat( "MMM d yyyy", RWT.getLocale() ); result = dateFormat.format( from ); } return result; } public Object getFromType() { return Date.class; } public Object getToType() { return String.class; } } static class Container { final FormToolkit toolkit; final Composite client; Container( final FormToolkit toolkit, final Composite client ) { this.toolkit = toolkit; this.client = client; } } static abstract class Validator implements IValidator { final Text text; Validator( final Text text ) { this.text = text; } public IStatus validate( final Object value ) { IStatus result = doValidate( value ); if( result.isOK() ) { text.setBackground( COLOR_BG_SUCCESS ); text.setForeground( COLOR_FG_SUCCESS ); } else { text.setBackground( COLOR_BG_FAIL ); text.setForeground( COLOR_FG_FAIL ); } return result; } abstract IStatus doValidate( final Object value ); } final static class EMailValidator extends Validator { private final static Pattern PATTERN = Pattern.compile( "\\w[-._\\w]*\\w@\\w[-._\\w]*\\w\\.\\w{2,4}" ); //$NON-NLS-1$ EMailValidator( final Text text ) { super( text); } @Override public IStatus doValidate( final Object value ) { IStatus result = VALIDATION_FAIL; if( value == null || "".equals( value ) //$NON-NLS-1$ || PATTERN.matcher( ( String )value ).matches() ) { result = VALIDATION_SUCCESS; } return result; } } final static class PhoneNumberValidator extends Validator { PhoneNumberValidator( final Text text ) { super( text ); } @Override IStatus doValidate( final Object value ) { IStatus result; try { String number = ( String )value; if( !"".equals( number ) ) { //$NON-NLS-1$ if( number.startsWith( "+" ) ) { //$NON-NLS-1$ number = number.substring( 1 ); } Integer.parseInt( number ); } result = VALIDATION_SUCCESS; } catch( final NumberFormatException e ) { result = VALIDATION_FAIL; } return result; } } private PageUtil() { // prevent instance creation } static Date getDate( final DateTime widget ) { Calendar calendar = Calendar.getInstance(); calendar.set( widget.getYear(), widget.getMonth(), widget.getDay() ); return calendar.getTime(); } static Composite createBody( final ScrolledForm scrolledForm, final String headImage ) { final Composite parentBody = scrolledForm.getBody(); final Composite header = new Composite( parentBody, SWT.NONE ); header.setBackground( parentBody.getBackground() ); final Label lblHeaderImage = new Label( header, SWT.NONE ); final Image imgHeader = Activator.getDefault().getImage( headImage ); lblHeaderImage.setImage( imgHeader ); final Composite result = new Composite( parentBody, SWT.NONE ); result.setBackground( parentBody.getBackground() ); scrolledForm.addControlListener( new ControlAdapter() { @Override public void controlResized( final ControlEvent evt ) { Rectangle bounds = scrolledForm.getBounds(); int headerHeight = imgHeader.getBounds().height; int width = bounds.width - 16; lblHeaderImage.setBounds( 0, 0, width, headerHeight ); header.setBounds( 0, 0, width, headerHeight ); int bodyHeight = bounds.height - headerHeight; Point size = result.getSize(); bodyHeight = size.y > bodyHeight ? size.x : bodyHeight; result.setBounds( 0, headerHeight, width, bodyHeight ); } } ); ColumnLayout layout = new ColumnLayout(); layout.topMargin = 0; layout.bottomMargin = 5; layout.leftMargin = 10; layout.rightMargin = 10; layout.horizontalSpacing = 10; layout.verticalSpacing = 10; layout.maxNumColumns = 4; layout.minNumColumns = 1; result.setLayout( layout ); return result; } static Composite createGeneralInfoSection( final ScrolledForm form, final FormToolkit toolkit, final Composite body, final String entityName ) { String sectionTitle = RMSMessages.get().PageUtil_GeneralInfo + entityName; String sectionDesc = RMSMessages.get().PageUtil_UsedToEditData; return createSection( form, toolkit, body, sectionTitle, sectionDesc, 3, true ); } static Composite createSection( final ScrolledForm form, final FormToolkit toolkit, final Composite body, final String title, final String desc, final int numColumns, final boolean expanded ) { int style = ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR | Section.DESCRIPTION | ExpandableComposite.EXPANDED; Section section = toolkit.createSection( body, style ); section.setExpanded( expanded ); section.setText( title ); section.setDescription( desc ); Composite result = toolkit.createComposite( section ); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; layout.numColumns = numColumns; result.setLayout( layout ); section.setClient( result ); section.addExpansionListener( new ExpansionAdapter() { @Override public void expansionStateChanged( final ExpansionEvent e ) { form.reflow( false ); } } ); return result; } static Text createLabelText( final Container container, final String labelContent, final String value, final boolean readOnly ) { Composite client = container.client; FormToolkit toolkit = container.toolkit; Label label = toolkit.createLabel( client, labelContent ); GridData gdLabel = new GridData(); gdLabel.widthHint = 100; label.setLayoutData( gdLabel ); int style = SWT.SINGLE | ( readOnly ? SWT.READ_ONLY : SWT.NONE ); Text result = toolkit.createText( client, value, style ); GridData gdResult = new GridData(); gdResult.widthHint = 300; gdResult.horizontalSpan = 2; result.setLayoutData( gdResult ); return result; } static CCombo createLabelCombo( final Container container, final String labelContent, final String value, final String[] items ) { Composite client = container.client; FormToolkit toolkit = container.toolkit; Label label = toolkit.createLabel( client, labelContent ); GridData gdLabel = new GridData(); gdLabel.widthHint = 100; label.setLayoutData( gdLabel ); CCombo result = new CCombo( client, SWT.READ_ONLY | SWT.BORDER ); result.setItems( items ); if( value != null ) { result.setText( value ); } GridData gdResult = new GridData(); gdResult.widthHint = 300; gdResult.horizontalSpan = 2; result.setLayoutData( gdResult ); return result; } static Text createLabelMultiText( final Container container, final String labelContent, final String value ) { Composite client = container.client; FormToolkit toolkit = container.toolkit; Label label = toolkit.createLabel( client, labelContent ); GridData gdLabel = new GridData(); gdLabel.widthHint = 100; label.setLayoutData( gdLabel ); Text result = toolkit.createText( client, value, SWT.MULTI ); GridData gdResult = new GridData(); gdResult.widthHint = 300; gdResult.heightHint = 100; gdResult.horizontalSpan = 2; result.setLayoutData( gdResult ); return result; } static Text createLabelTextButton( final Container container, final String labelContent, final String value, final String imageName, final SelectionListener listener ) { final Composite client = container.client; final FormToolkit toolkit = container.toolkit; Label label = toolkit.createLabel( client, labelContent ); GridData gdLabel = new GridData(); gdLabel.widthHint = 100; label.setLayoutData( gdLabel ); int style = SWT.SINGLE | SWT.READ_ONLY; Text result = toolkit.createText( client, value, style ); GridData gdResult = new GridData(); result.setLayoutData( gdResult ); Button button = toolkit.createButton( client, "", SWT.PUSH | SWT.FLAT ); //$NON-NLS-1$ Image imgDatePicker = Activator.getDefault().getImage( imageName ); button.setImage( imgDatePicker ); Point size = button.computeSize( SWT.DEFAULT, SWT.DEFAULT ); gdResult.widthHint = 295 - size.x; button.addSelectionListener( listener ); return result; } static DateTime createLabelDate( final Container container, final String labelContent, final Date date ) { Composite client = container.client; FormToolkit toolkit = container.toolkit; Label label = toolkit.createLabel( client, labelContent ); GridData gdLabel = new GridData(); gdLabel.widthHint = 100; label.setLayoutData( gdLabel ); int style = SWT.BORDER | SWT.DATE | SWT.DROP_DOWN; DateTime result = new DateTime( client, style ); if( date != null ) { Calendar calendar = Calendar.getInstance(); calendar.setTime( date ); result.setDate( calendar.get( Calendar.YEAR ), calendar.get( Calendar.MONTH ), calendar.get( Calendar.DAY_OF_MONTH ) ); } GridData gdResult = new GridData(); gdResult.horizontalSpan = 2; result.setLayoutData( gdResult ); return result; } static void bindCombo( final DataBindingContext bindingContext, final IEntity entity, final CCombo combo, final String property ) { ISWTObservableValue observeCombo = SWTObservables.observeSelection( combo ); IObservableValue observeValue = BeansObservables.observeValue( entity, property ); bind( bindingContext, observeCombo, observeValue, null, null ); } static void bindText( final DataBindingContext bindingContext, final IEntity entity, final Text text, final String property ) { bindText( bindingContext, entity, text, property, null ); } static void bindText( final DataBindingContext bindingContext, final IEntity entity, final Text text, final String property, final IValidator validator ) { ISWTObservableValue observeText = SWTObservables.observeText( text, SWT.Modify ); IObservableValue observeValue = BeansObservables.observeValue( entity, property ); UpdateValueStrategy targetToModel = new UpdateValueStrategy(); targetToModel.setBeforeSetValidator( validator ); UpdateValueStrategy modelToTarget = new UpdateValueStrategy(); bind( bindingContext, observeText, observeValue, targetToModel, modelToTarget ); } static void bindDate( final DataBindingContext bindingContext, final IEntity entity, final DateTime dateTime, final String property ) { ISWTObservableValue observeSelection = SWTObservables.observeSelection( dateTime ); IObservableValue observeValue = BeansObservables.observeValue( entity, property ); UpdateValueStrategy targetToModel = new UpdateValueStrategy(); UpdateValueStrategy modelToTarget = new UpdateValueStrategy(); bind( bindingContext, observeSelection, observeValue, targetToModel, modelToTarget ); } private static void bind( final DataBindingContext bindingContext, final ISWTObservableValue observeText, final IObservableValue observeValue, final UpdateValueStrategy targetToModel, final UpdateValueStrategy modelToTarget ) { bindingContext.bindValue( observeText, observeValue, targetToModel, modelToTarget ); } static DataBindingContext createBindingContext() { if( Realm.getDefault() == null ) { SWTObservables.getRealm( Display.getCurrent() ); } return new DataBindingContext(); } }