/******************************************************************************* * Copyright (c) 2006, 2007 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation * Brad Reynolds - bug 116920 * Samy Abou-Shama (NOMAD business software GmbH) Adapted as view for RAP ******************************************************************************/ package org.eclipse.rap.demo.databinding.nestedselection; import org.eclipse.core.databinding.*; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.databinding.conversion.IConverter; import org.eclipse.core.databinding.observable.IObserving; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.validation.IValidator; import org.eclipse.core.databinding.validation.ValidationStatus; import org.eclipse.core.internal.databinding.conversion.ObjectToStringConverter; 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.jface.databinding.viewers.*; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.rap.demo.databinding.DatabindingSnippetsView; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.ui.part.ViewPart; /** * @since 1.0 */ public class TestMasterDetailView extends ViewPart { private Group bindingGroup; private Table personsTable = null; private Label label1 = null; private Text name = null; private Label label2 = null; private Text address = null; private Label label3 = null; private Text city = null; private Label label4 = null; private Text state = null; private Table ordersTable = null; private Text validationStatus; private final SimpleModel model = new SimpleModel(); /** * @since 1.0 */ private static final class CustomUpdateValueStrategy extends UpdateValueStrategy { protected IStatus doSet( final IObservableValue observableValue, final Object value ) { IStatus result = super.doSet( observableValue, value ); if( result.isOK() ) { Object changed = observableValue; if( changed instanceof IObserving ) { changed = ( ( IObserving )changed ).getObserved(); } } return result; } } /** * This method initializes table */ private void createTable() { personsTable = new Table( bindingGroup, SWT.NONE ); personsTable.setHeaderVisible( true ); personsTable.setLinesVisible( true ); TableColumn tableColumn = new TableColumn( personsTable, SWT.NONE ); tableColumn.setWidth( 60 ); tableColumn.setText( "Name" ); TableColumn tableColumn1 = new TableColumn( personsTable, SWT.NONE ); tableColumn1.setWidth( 60 ); tableColumn1.setText( "State" ); FormData data = new FormData( DatabindingSnippetsView.STD_TEXT_WIDTH_LARGE, 100 ); data.top = new FormAttachment( 0, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( 0, 0 ); personsTable.setLayoutData( data ); } /** * This method initializes table1 */ private void createTable1() { ordersTable = new Table( bindingGroup, SWT.NONE ); ordersTable.setHeaderVisible( true ); ordersTable.setLinesVisible( true ); TableColumn tableColumn2 = new TableColumn( ordersTable, SWT.NONE ); tableColumn2.setWidth( 60 ); tableColumn2.setText( "Order No" ); TableColumn tableColumn3 = new TableColumn( ordersTable, SWT.NONE ); tableColumn3.setWidth( 60 ); tableColumn3.setText( "Date" ); FormData data = new FormData( DatabindingSnippetsView.STD_TEXT_WIDTH_LARGE, 100 ); data.top = new FormAttachment( label4, DatabindingSnippetsView.TOP_MARGIN * 3 ); data.left = new FormAttachment( 0, 0 ); ordersTable.setLayoutData( data ); } private void bind( final Control parent ) { Realm realm = SWTObservables.getRealm( parent.getDisplay() ); TableViewer peopleViewer = new TableViewer( personsTable ); ObservableListContentProvider peopleViewerContent = new ObservableListContentProvider(); peopleViewer.setContentProvider( peopleViewerContent ); String[] attrSimplePerson = new String[]{ "name", "state" }; IObservableMap[] attributeMaps = BeansObservables.observeMaps( peopleViewerContent.getKnownElements(), SimplePerson.class, attrSimplePerson ); ObservableMapLabelProvider omlProvider = new ObservableMapLabelProvider( attributeMaps ); peopleViewer.setLabelProvider( omlProvider ); peopleViewer.setInput( new WritableList( realm, model.getPersonList(), SimpleModel.class ) ); IObservableValue selectedPerson = ViewersObservables.observeSingleSelection( peopleViewer ); DataBindingContext dbc = new DataBindingContext( realm ) { protected UpdateValueStrategy createTargetToModelUpdateValueStrategy( IObservableValue fromValue, IObservableValue toValue ) { return new CustomUpdateValueStrategy(); } }; IConverter upperCaseConverter = new IConverter() { public Object convert( Object fromObject ) { return ( ( String )fromObject ).toUpperCase(); } public Object getFromType() { return String.class; } public Object getToType() { return String.class; } }; IValidator vowelValidator = new IValidator() { public IStatus validate( Object value ) { String s = ( String )value; if( !s.matches( "[aeiouAEIOU]*" ) ) { return ValidationStatus.error( "only vowels allowed" ); } return Status.OK_STATUS; } }; IObservableValue modelObservableValue = BeansObservables.observeDetailValue( realm, selectedPerson, "name", String.class ); ISWTObservableValue targetObservableValue = SWTObservables.observeText( name, SWT.Modify ); CustomUpdateValueStrategy customUpdateValueStrategy = new CustomUpdateValueStrategy(); customUpdateValueStrategy.setConverter( upperCaseConverter ); UpdateValueStrategy targetToModel = customUpdateValueStrategy.setAfterGetValidator( vowelValidator ); Binding binding = dbc.bindValue( targetObservableValue, modelObservableValue, targetToModel, null ); UpdateValueStrategy updateValueStrategy = new UpdateValueStrategy(); updateValueStrategy.setConverter( new ObjectToStringConverter() ); dbc.bindValue( SWTObservables.observeText( validationStatus, SWT.NONE ), binding.getValidationStatus(), null, updateValueStrategy ); dbc.bindValue( SWTObservables.observeText( address, SWT.Modify ), BeansObservables.observeDetailValue( realm, selectedPerson, "address", String.class ), null, null ); dbc.bindValue( SWTObservables.observeText( city, SWT.Modify ), BeansObservables.observeDetailValue( realm, selectedPerson, "city", String.class ), null, null ); dbc.bindValue( SWTObservables.observeText( state, SWT.Modify ), BeansObservables.observeDetailValue( realm, selectedPerson, "state", String.class ), null, null ); TableViewer ordersViewer = new TableViewer( ordersTable ); ObservableListContentProvider ordersViewerContent = new ObservableListContentProvider(); ordersViewer.setContentProvider( ordersViewerContent ); String[] propertyNames = new String[]{ "orderNumber", "date" }; IObservableMap[] observeMaps = BeansObservables.observeMaps( ordersViewerContent.getKnownElements(), SimpleOrder.class, propertyNames ); ObservableMapLabelProvider observableMapLabelProvider = new ObservableMapLabelProvider( observeMaps ); ordersViewer.setLabelProvider( observableMapLabelProvider ); IObservableList orders = BeansObservables.observeDetailList( realm, selectedPerson, "orders", SimpleOrder.class ); ordersViewer.setInput( orders ); } public void createPartControl( final Composite parent ) { FormLayout formLayout = new FormLayout(); formLayout.marginHeight = DatabindingSnippetsView.GROUP_MARGIN_HEIGHT; formLayout.marginWidth = DatabindingSnippetsView.GROUP_MARGIN_WIDTH; parent.setLayout( new FormLayout() ); bindingGroup = new Group( parent, SWT.NONE ); bindingGroup.setText( "Adaptation of the Databinding " + "TestMasterDetailView Example" ); FormData data = new FormData( DatabindingSnippetsView.GROUP_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( 0, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( 0, DatabindingSnippetsView.GROUP_MARGIN_WIDTH ); bindingGroup.setLayoutData( data ); FormLayout formLayoutGroup = new FormLayout(); formLayoutGroup.marginHeight = DatabindingSnippetsView.GROUP_MARGIN_HEIGHT; formLayoutGroup.marginWidth = DatabindingSnippetsView.GROUP_MARGIN_WIDTH; bindingGroup.setLayout( formLayoutGroup ); createTable(); label1 = new Label( bindingGroup, SWT.NONE ); label1.setText( "Name" ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( personsTable, DatabindingSnippetsView.TOP_MARGIN * 3 ); data.left = new FormAttachment( 0, 0 ); label1.setLayoutData( data ); name = new Text( bindingGroup, SWT.BORDER ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( personsTable, DatabindingSnippetsView.TOP_MARGIN * 3 ); data.left = new FormAttachment( label1, 0 ); name.setLayoutData( data ); label2 = new Label( bindingGroup, SWT.NONE ); label2.setText( "Address" ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( name, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( 0, 0 ); label2.setLayoutData( data ); address = new Text( bindingGroup, SWT.BORDER ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( name, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( label2, 0 ); address.setLayoutData( data ); label3 = new Label( bindingGroup, SWT.NONE ); label3.setText( "City" ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( address, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( 0, 0 ); label3.setLayoutData( data ); city = new Text( bindingGroup, SWT.BORDER ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( address, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( label3, 0 ); city.setLayoutData( data ); label4 = new Label( bindingGroup, SWT.NONE ); label4.setText( "State" ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( city, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( 0, 0 ); label4.setLayoutData( data ); state = new Text( bindingGroup, SWT.BORDER ); data = new FormData( DatabindingSnippetsView.STD_LABEL_WIDTH, SWT.DEFAULT ); data.top = new FormAttachment( city, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( label4, 0 ); state.setLayoutData( data ); createTable1(); validationStatus = new Text( bindingGroup, SWT.READ_ONLY | SWT.BORDER ); data = new FormData( 400, SWT.DEFAULT ); data.top = new FormAttachment( ordersTable, DatabindingSnippetsView.TOP_MARGIN ); data.left = new FormAttachment( 0, 0 ); validationStatus.setLayoutData( data ); bind( parent ); } public void setFocus() { } }