view org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet001NestedSelectionWithCombo.d @ 99:5d5bd660917f

build some databind snippets
author Frank Benoit <benoit@tionex.de>
date Wed, 22 Apr 2009 18:59:26 +0200
parents 18a80add24ac
children 6373fd739945
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2006 The Pampered Chef, Inc. 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:
 *     The Pampered Chef, Inc. - initial API and implementation
 *     Brad Reynolds - bug 116920
 *     Matthew Hall - bug 260329
 ******************************************************************************/

module org.eclipse.jface.examples.databinding.snippets.Snippet001NestedSelectionWithCombo;

import java.lang.all;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.HashSet;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import org.eclipse.jface.viewers.Viewer;
/**
 * Demonstrates nested selection.<br>
 * At the first level, user may select a person.<br>
 * At the second level, user may select a city to associate with the selected<br>
 * person or edit the person's name.
 */
public class Snippet001NestedSelectionWithCombo {
    public static void main(String[] args) {
        ViewModel viewModel = new ViewModel();
        Shell shell = (new View(viewModel)).createShell();

        // The SWT event loop
        Display display = Display.getCurrent();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    // Minimal JavaBeans support
    public static abstract class AbstractModelObject {
        private PropertyChangeSupport propertyChangeSupport;
        this(){
            propertyChangeSupport = new PropertyChangeSupport(
                this);
        }

        public void addPropertyChangeListener(PropertyChangeListener listener) {
            propertyChangeSupport.addPropertyChangeListener(listener);
        }

        public void addPropertyChangeListener(String propertyName,
                PropertyChangeListener listener) {
            propertyChangeSupport.addPropertyChangeListener(propertyName,
                    listener);
        }

        public void removePropertyChangeListener(PropertyChangeListener listener) {
            propertyChangeSupport.removePropertyChangeListener(listener);
        }

        public void removePropertyChangeListener(String propertyName,
                PropertyChangeListener listener) {
            propertyChangeSupport.removePropertyChangeListener(propertyName,
                    listener);
        }

        protected void firePropertyChange(String propertyName, Object oldValue,
                Object newValue) {
            propertyChangeSupport.firePropertyChange(propertyName, oldValue,
                    newValue);
        }
    }

    // The data model class. This is normally a persistent class of some sort.
    // 
    // This example implements full JavaBeans bound properties so that changes
    // to instances of this class will automatically be propogated to the UI.
    public static class Person : AbstractModelObject {
        // Constructor
        public this(String name, String city) {
            this.name = name;
            this.city = city;
        }

        // Some JavaBean bound properties...
        String name;

        String city;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            String oldValue = this.name;
            this.name = name;
            firePropertyChange("name", stringcast(oldValue), stringcast(name));
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            String oldValue = this.city;
            this.city = city;
            firePropertyChange("city", stringcast(oldValue), stringcast(city));
        }
    }

    // The View's model--the root of our GUI's Model graph
    //
    // Typically each View class has a corresponding ViewModel class.
    // The ViewModel is responsible for getting the objects to edit from the
    // DAO. Since this snippet doesn't have any persistent objects to
    // retrieve, this ViewModel just instantiates some objects to edit.
    // 
    // This ViewModel also implements JavaBean bound properties.
    static class ViewModel : AbstractModelObject {
        // The model to bind
        private ArrayList people;
        private void initPeople(){
            people = new ArrayList();
            people.add(new Person("Wile E. Coyote", "Tucson"));
            people.add(new Person("Road Runner", "Lost Horse"));
            people.add(new Person("Bugs Bunny", "Forrest"));
        }

        // Choice of cities for the Combo
        private ArrayList cities;
        private void initCities(){
            cities = new ArrayList();
            cities.add("Tucson");
            cities.add("AcmeTown");
            cities.add("Lost Horse");
            cities.add("Forrest");
            cities.add("Lost Mine");
        }
        this(){
            initPeople();
            initCities();
        }

        public ArrayList getPeople() {
            return people;
        }

        public ArrayList getCities() {
            return cities;
        }
    }

    // The GUI view
    static class View {
        private ViewModel viewModel;

        public this(ViewModel viewModel) {
            this.viewModel = viewModel;
        }

        public Shell createShell() {
            // Build a UI
            Shell shell = new Shell(Display.getCurrent());
            Realm realm = SWTObservables.getRealm(shell.getDisplay());

            List peopleList = new List(shell, SWT.BORDER);
            Text name = new Text(shell, SWT.BORDER);
            Combo city = new Combo(shell, SWT.BORDER | SWT.READ_ONLY);

            ListViewer peopleListViewer = new ListViewer(peopleList);
            IObservableMap attributeMap = BeansObservables.observeMap(
                    Observables.staticObservableSet(realm, new HashSet(
                            viewModel.getPeople())), Class.fromType!(Person), "name");
            peopleListViewer.setLabelProvider(new ObservableMapLabelProvider(
                    attributeMap));
            peopleListViewer.setContentProvider(new ArrayContentProvider!(Object)());
            peopleListViewer.setInput(viewModel.getPeople());

            DataBindingContext dbc = new DataBindingContext(realm);
            IObservableValue selectedPerson = ViewersObservables
                    .observeSingleSelection(cast(Viewer)peopleListViewer);
            dbc.bindValue(SWTObservables.observeText(name, SWT.Modify),
                    BeansObservables.observeDetailValue(realm, selectedPerson,
                            "name", Class.fromType!(String)), null, null);

            ComboViewer cityViewer = new ComboViewer(city);
            cityViewer.setContentProvider(new ArrayContentProvider!(Object)());
            cityViewer.setInput(viewModel.getCities());

            IObservableValue citySelection = ViewersObservables
                    .observeSingleSelection(cast(Viewer)cityViewer);
            dbc.bindValue( citySelection, BeansObservables.observeDetailValue( realm,
                    selectedPerson, "city", Class.fromType!(String)), null, null);

            GridLayoutFactory.swtDefaults().applyTo(shell);
            // Open and return the Shell
            shell.pack();
            shell.open();
            return shell;
        }
    }

}
void main( String[] args ){
    Snippet001NestedSelectionWithCombo.main( args );
}