| /******************************************************************************* |
| * Copyright (c) 2006 Brad Reynolds 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: |
| * Brad Reynolds - initial API and implementation |
| ******************************************************************************/ |
| |
| package org.eclipse.jface.examples.databinding.snippets; |
| |
| import org.eclipse.core.databinding.DataBindingContext; |
| import org.eclipse.core.databinding.UpdateValueStrategy; |
| import org.eclipse.core.databinding.observable.ObservableTracker; |
| import org.eclipse.core.databinding.observable.Realm; |
| import org.eclipse.core.databinding.observable.value.ComputedValue; |
| import org.eclipse.core.databinding.observable.value.IObservableValue; |
| import org.eclipse.core.databinding.observable.value.WritableValue; |
| import org.eclipse.jface.databinding.swt.SWTObservables; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.layout.GridLayoutFactory; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Text; |
| |
| /** |
| * Snippet that demostrates a simple use case using ComputedValue to format a |
| * name as the user enters first and last name. |
| * |
| * @since 3.2 |
| */ |
| public class Snippet008ComputedValue { |
| /** |
| * @param args |
| */ |
| public static void main(String[] args) { |
| final Display display = new Display(); |
| Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { |
| public void run() { |
| Shell shell = new Shell(display); |
| shell.setLayout(new FillLayout()); |
| |
| final UI ui = new UI(shell); |
| final Data data = new Data(); |
| |
| // Bind the UI to the Data. |
| DataBindingContext dbc = new DataBindingContext(); |
| dbc.bindValue(SWTObservables.observeText(ui.firstName, |
| SWT.Modify), data.firstName, null, null); |
| dbc.bindValue(SWTObservables.observeText(ui.lastName, |
| SWT.Modify), data.lastName, null, null); |
| |
| // Construct the formatted name observable. |
| FormattedName formattedName = new FormattedName(data.firstName, |
| data.lastName); |
| |
| // Bind the formatted name Text to the formatted name |
| // observable. |
| dbc.bindValue(SWTObservables.observeText(ui.formattedName, |
| SWT.None), formattedName, new UpdateValueStrategy(false, UpdateValueStrategy.POLICY_NEVER), null); |
| |
| shell.pack(); |
| shell.open(); |
| while (!shell.isDisposed()) { |
| if (!display.readAndDispatch()) |
| display.sleep(); |
| } |
| } |
| }); |
| display.dispose(); |
| } |
| |
| /** |
| * Creates the formatted name on change of the first or last name |
| * observables. |
| * <p> |
| * The key to understanding ComputedValue is understanding that it knows of |
| * the observables that are queried without being told. This is done with |
| * {@link ObservableTracker} voodoo. When calculate() is invoked |
| * <code>ObservableTracker</code> records the observables that are |
| * queried. It then exposes those observables and <code>ComputedValue</code> |
| * can listen to changes in those objects and react accordingly. |
| * </p> |
| * |
| * @since 3.2 |
| */ |
| static class FormattedName extends ComputedValue { |
| private IObservableValue firstName; |
| |
| private IObservableValue lastName; |
| |
| FormattedName(IObservableValue firstName, IObservableValue lastName) { |
| this.firstName = firstName; |
| this.lastName = lastName; |
| } |
| |
| protected Object calculate() { |
| String lastName = (String) this.lastName.getValue(); |
| String firstName = (String) this.firstName.getValue(); |
| lastName = (lastName != null && lastName.length() > 0) ? lastName |
| : "[Last Name]"; |
| firstName = (firstName != null && firstName.length() > 0) ? firstName |
| : "[First Name]"; |
| |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append(lastName).append(", ").append(firstName); |
| |
| return buffer.toString(); |
| } |
| } |
| |
| static class Data { |
| final WritableValue firstName; |
| |
| final WritableValue lastName; |
| |
| Data() { |
| firstName = new WritableValue("", String.class); |
| lastName = new WritableValue("", String.class); |
| } |
| } |
| |
| /** |
| * Composite that creates the UI. |
| * |
| * @since 3.2 |
| */ |
| static class UI extends Composite { |
| final Text firstName; |
| |
| final Text lastName; |
| |
| final Text formattedName; |
| |
| UI(Composite parent) { |
| super(parent, SWT.NONE); |
| |
| GridLayoutFactory.swtDefaults().numColumns(2).applyTo(this); |
| |
| new Label(this, SWT.NONE).setText("First Name:"); |
| new Label(this, SWT.NONE).setText("Last Name"); |
| |
| GridDataFactory gdf = GridDataFactory.swtDefaults().align(SWT.FILL, |
| SWT.FILL).grab(true, false); |
| firstName = new Text(this, SWT.BORDER); |
| gdf.applyTo(firstName); |
| |
| lastName = new Text(this, SWT.BORDER); |
| gdf.applyTo(lastName); |
| |
| gdf = GridDataFactory.swtDefaults().span(2, 1).grab(true, false) |
| .align(SWT.FILL, SWT.BEGINNING); |
| Label label = new Label(this, SWT.NONE); |
| label.setText("Formatted Name:"); |
| gdf.applyTo(label); |
| |
| formattedName = new Text(this, SWT.BORDER); |
| formattedName.setEditable(false); |
| gdf.applyTo(formattedName); |
| } |
| } |
| } |