001: /*******************************************************************************
002: * Copyright (c) 2005, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: * Brad Reynolds - bug 160000
011: *******************************************************************************/package org.eclipse.jface.tests.databinding.scenarios;
012:
013: import java.util.Arrays;
014: import java.util.List;
015:
016: import org.eclipse.core.databinding.beans.BeansObservables;
017: import org.eclipse.core.databinding.observable.Realm;
018: import org.eclipse.core.databinding.observable.list.IObservableList;
019: import org.eclipse.core.databinding.observable.map.IObservableMap;
020: import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
021: import org.eclipse.core.databinding.observable.value.ComputedValue;
022: import org.eclipse.core.databinding.observable.value.IObservableValue;
023: import org.eclipse.jface.databinding.swt.SWTObservables;
024: import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
025: import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
026: import org.eclipse.jface.databinding.viewers.ViewersObservables;
027: import org.eclipse.jface.examples.databinding.model.Adventure;
028: import org.eclipse.jface.examples.databinding.model.Catalog;
029: import org.eclipse.jface.examples.databinding.model.Category;
030: import org.eclipse.jface.examples.databinding.model.Lodging;
031: import org.eclipse.jface.examples.databinding.model.SampleData;
032: import org.eclipse.jface.viewers.ContentViewer;
033: import org.eclipse.jface.viewers.IStructuredContentProvider;
034: import org.eclipse.jface.viewers.IStructuredSelection;
035: import org.eclipse.jface.viewers.ListViewer;
036: import org.eclipse.jface.viewers.StructuredSelection;
037: import org.eclipse.swt.SWT;
038: import org.eclipse.swt.events.SelectionEvent;
039: import org.eclipse.swt.events.SelectionListener;
040: import org.eclipse.swt.layout.GridData;
041: import org.eclipse.swt.widgets.Button;
042: import org.eclipse.swt.widgets.Text;
043:
044: /**
045: * To run the tests in this class, right-click and select "Run As JUnit Plug-in
046: * Test". This will also start an Eclipse instance. To clean up the launch
047: * configuration, open up its "Main" tab and select "[No Application] - Headless
048: * Mode" as the application to run.
049: */
050:
051: public class MasterDetailScenarios extends ScenariosTestCase {
052:
053: protected Object getViewerSelection(ContentViewer contentViewer) {
054: return ((IStructuredSelection) contentViewer.getSelection())
055: .getFirstElement();
056: }
057:
058: /**
059: * @return the ComboViewer's domain object list
060: */
061: protected List getViewerContent(ContentViewer contentViewer) {
062: Object[] elements = ((IStructuredContentProvider) contentViewer
063: .getContentProvider()).getElements(null);
064: if (elements != null)
065: return Arrays.asList(elements);
066: return null;
067: }
068:
069: public void testScenario01() {
070: // Displaying the catalog's list of Lodging objects in a list viewer,
071: // using their names. The name of the currently selected Lodging can
072: // be edited in a text widget. There is always a selected Lodging
073: // object.
074: ListViewer listViewer = new ListViewer(getComposite(),
075: SWT.BORDER);
076: Realm realm = SWTObservables.getRealm(listViewer.getControl()
077: .getDisplay());
078: listViewer.getList().setLayoutData(
079: new GridData(SWT.FILL, SWT.FILL, false, false));
080: Catalog catalog = SampleData.CATALOG_2005;
081:
082: IObservableList lodgings = BeansObservables.observeList(realm,
083: catalog, "lodgings");
084: ObservableListContentProvider contentProvider = new ObservableListContentProvider();
085: IObservableMap[] attributeMaps = BeansObservables.observeMaps(
086: contentProvider.getKnownElements(), Lodging.class,
087: new String[] { "name" });
088: listViewer.setContentProvider(contentProvider);
089: listViewer.setLabelProvider(new ObservableMapLabelProvider(
090: attributeMaps));
091: listViewer.setInput(lodgings);
092:
093: assertArrayEquals(catalog.getLodgings(), getViewerContent(
094: listViewer).toArray());
095:
096: IObservableValue selectedLodging = ViewersObservables
097: .observeSingleSelection(listViewer);
098:
099: selectedLodging.setValue(SampleData.CAMP_GROUND);
100:
101: assertEquals(SampleData.CAMP_GROUND,
102: getViewerSelection(listViewer));
103: Text txtName = new Text(getComposite(), SWT.BORDER);
104:
105: getDbc().bindValue(
106: SWTObservables.observeText(txtName, SWT.Modify),
107: BeansObservables.observeDetailValue(realm,
108: selectedLodging, "name", String.class), null,
109: null);
110:
111: assertEquals(txtName.getText(), SampleData.CAMP_GROUND
112: .getName());
113: enterText(txtName, "foobar");
114: assertEquals("foobar", SampleData.CAMP_GROUND.getName());
115: listViewer.setSelection(new StructuredSelection(
116: SampleData.FIVE_STAR_HOTEL));
117: assertEquals(SampleData.FIVE_STAR_HOTEL, selectedLodging
118: .getValue());
119: assertEquals(SampleData.FIVE_STAR_HOTEL.getName(), txtName
120: .getText());
121: SampleData.FIVE_STAR_HOTEL.setName("barfoo");
122: assertEquals("barfoo", txtName.getText());
123:
124: // Now make sure that the event listeners get removed on dispose()
125: // Values should no longer be updated
126: selectedLodging.dispose();
127:
128: // selectedLodging.setValue(SampleData.CAMP_GROUND);
129: // assertNotSame(SampleData.CAMP_GROUND,
130: // getViewerSelection(listViewer));
131: // assertNotSame(txtName.getText(), SampleData.CAMP_GROUND.getName());
132: // enterText(txtName, "foobar");
133: // assertNotSame("foobar", SampleData.CAMP_GROUND.getName());
134: // listViewer.setSelection(new StructuredSelection(
135: // SampleData.FIVE_STAR_HOTEL));
136: // assertNotSame(SampleData.FIVE_STAR_HOTEL,
137: // selectedLodging.getValue());
138: // assertNotSame(SampleData.FIVE_STAR_HOTEL.getName(),
139: // txtName.getText());
140: // SampleData.FIVE_STAR_HOTEL.setName("barfoo");
141: // assertNotSame("barfoo", txtName.getText());
142: }
143:
144: public void testScenario02() {
145: // Selecting from the list of lodgings for an adventure and editing the
146: // properties of the selected lodging in text widgets. If no lodging is
147: // selected the input controls for name and adventure are disabled.
148: // There are two buttons "Add" and "Remove"; clicking on "Add" creates a
149: // new lodging and selects it so it can be edited, clicking on "Remove"
150: // removes the currently selected lodging from the list.
151: final ListViewer listViewer = new ListViewer(getComposite(),
152: SWT.BORDER);
153: listViewer.getList().setLayoutData(
154: new GridData(SWT.FILL, SWT.FILL, false, false));
155: final Catalog catalog = SampleData.CATALOG_2005;
156:
157: IObservableList lodgings = BeansObservables.observeList(realm,
158: catalog, "lodgings");
159: ObservableListContentProvider contentProvider = new ObservableListContentProvider();
160: IObservableMap[] attributeMaps = BeansObservables.observeMaps(
161: contentProvider.getKnownElements(), Lodging.class,
162: new String[] { "name" });
163: listViewer.setContentProvider(contentProvider);
164: listViewer.setLabelProvider(new ObservableMapLabelProvider(
165: attributeMaps));
166: listViewer.setInput(lodgings);
167:
168: assertArrayEquals(catalog.getLodgings(), getViewerContent(
169: listViewer).toArray());
170:
171: final IObservableValue selectedLodgingObservable = ViewersObservables
172: .observeSingleSelection(listViewer);
173:
174: selectedLodgingObservable.setValue(null);
175: assertTrue(listViewer.getSelection().isEmpty());
176:
177: ComputedValue selectionExistsObservable = new ComputedValue(
178: boolean.class) {
179: protected Object calculate() {
180: return new Boolean(
181: selectedLodgingObservable.getValue() != null);
182: }
183: };
184:
185: assertFalse(((Boolean) selectionExistsObservable.getValue())
186: .booleanValue());
187:
188: final Text txtName = new Text(getComposite(), SWT.BORDER);
189:
190: getDbc().bindValue(SWTObservables.observeEnabled(txtName),
191: selectionExistsObservable, null, null);
192: getDbc().bindValue(
193: SWTObservables.observeText(txtName, SWT.Modify),
194: BeansObservables
195: .observeDetailValue(realm,
196: selectedLodgingObservable, "name",
197: String.class), null, null);
198:
199: assertEquals(txtName.getText(), "");
200: assertFalse(txtName.getEnabled());
201:
202: final Text txtDescription = new Text(getComposite(), SWT.BORDER);
203:
204: getDbc().bindValue(
205: SWTObservables.observeEnabled(txtDescription),
206: selectionExistsObservable, null, null);
207: getDbc().bindValue(
208: SWTObservables.observeText(txtDescription, SWT.Modify),
209: MasterDetailObservables.detailValue(
210: selectedLodgingObservable, BeansObservables
211: .valueFactory(realm, "description"),
212: String.class), null, null);
213:
214: assertEquals(txtDescription.getText(), "");
215: assertFalse(txtDescription.getEnabled());
216:
217: Button addButton = new Button(getComposite(), SWT.PUSH);
218: addButton.addSelectionListener(new SelectionListener() {
219: public void widgetSelected(SelectionEvent e) {
220: Lodging selectedLodging = (Lodging) selectedLodgingObservable
221: .getValue();
222: int insertionIndex = 0;
223: if (selectedLodging != null) {
224: insertionIndex = Arrays.asList(
225: catalog.getLodgings()).indexOf(
226: selectedLodging);
227: assertTrue(insertionIndex >= 0);
228: }
229: Lodging newLodging = SampleData.FACTORY.createLodging();
230: int itemCount = listViewer.getList().getItemCount();
231: newLodging.setName("new lodging name " + itemCount);
232: newLodging.setDescription("new lodging description "
233: + itemCount);
234: catalog.addLodging(newLodging);
235: assertEquals(itemCount + 1, listViewer.getList()
236: .getItemCount());
237: listViewer.setSelection(new StructuredSelection(
238: newLodging));
239: assertSame(newLodging, selectedLodgingObservable
240: .getValue());
241: assertTrue(txtName.getEnabled());
242: assertTrue(txtDescription.getEnabled());
243: assertEquals(newLodging.getName(), txtName.getText());
244: assertEquals(newLodging.getDescription(),
245: txtDescription.getText());
246: }
247:
248: public void widgetDefaultSelected(SelectionEvent e) {
249: widgetSelected(e);
250: }
251: });
252:
253: Button removeButton = new Button(getComposite(), SWT.PUSH);
254: removeButton.addSelectionListener(new SelectionListener() {
255: public void widgetSelected(SelectionEvent e) {
256: Lodging selectedLodging = (Lodging) selectedLodgingObservable
257: .getValue();
258: assertNotNull(selectedLodging);
259: int deletionIndex = Arrays
260: .asList(catalog.getLodgings()).indexOf(
261: selectedLodging);
262: assertTrue(deletionIndex >= 0);
263: int itemCount = listViewer.getList().getItemCount();
264: catalog.removeLodging(selectedLodging);
265: assertEquals(itemCount - 1, listViewer.getList()
266: .getItemCount());
267: assertNull(selectedLodgingObservable.getValue());
268: }
269:
270: public void widgetDefaultSelected(SelectionEvent e) {
271: widgetSelected(e);
272: }
273: });
274:
275: pushButtonWithEvents(addButton);
276: pushButtonWithEvents(removeButton);
277: pushButtonWithEvents(addButton);
278: pushButtonWithEvents(addButton);
279: pushButtonWithEvents(removeButton);
280: }
281:
282: public void testScenario03() {
283: // List adventures and for the selected adventure allow its default
284: // lodging�s name and description to be changed in text controls. If
285: // there is no selected adventure or the default lodging is null the
286: // text controls are disabled. This is a nested property. The default
287: // lodging can be changed elsewhere, and the list
288: final Catalog catalog = SampleData.CATALOG_2005;
289:
290: final ListViewer categoryListViewer = new ListViewer(
291: getComposite(), SWT.BORDER);
292: categoryListViewer.getList().setLayoutData(
293: new GridData(SWT.FILL, SWT.FILL, false, false));
294:
295: IObservableList categories = BeansObservables.observeList(
296: realm, catalog, "categories");
297: ObservableListContentProvider contentProvider = new ObservableListContentProvider();
298: IObservableMap[] attributeMaps = BeansObservables.observeMaps(
299: contentProvider.getKnownElements(), Category.class,
300: new String[] { "name" });
301: categoryListViewer.setContentProvider(contentProvider);
302: categoryListViewer
303: .setLabelProvider(new ObservableMapLabelProvider(
304: attributeMaps));
305: categoryListViewer.setInput(categories);
306:
307: assertArrayEquals(catalog.getCategories(), getViewerContent(
308: categoryListViewer).toArray());
309:
310: final IObservableValue selectedCategoryObservable = ViewersObservables
311: .observeSingleSelection(categoryListViewer);
312:
313: final ListViewer adventureListViewer = new ListViewer(
314: getComposite(), SWT.BORDER);
315: adventureListViewer.getList().setLayoutData(
316: new GridData(SWT.FILL, SWT.FILL, false, false));
317:
318: IObservableList adventures = BeansObservables
319: .observeDetailList(realm, selectedCategoryObservable,
320: "adventures", Adventure.class);
321: contentProvider = new ObservableListContentProvider();
322: attributeMaps = BeansObservables.observeMaps(contentProvider
323: .getKnownElements(), Adventure.class,
324: new String[] { "name" });
325: adventureListViewer.setContentProvider(contentProvider);
326: adventureListViewer
327: .setLabelProvider(new ObservableMapLabelProvider(
328: attributeMaps));
329: adventureListViewer.setInput(adventures);
330:
331: ComputedValue categorySelectionExistsObservable = new ComputedValue() {
332: protected Object calculate() {
333: return new Boolean(selectedCategoryObservable
334: .getValue() != null);
335: }
336: };
337:
338: getDbc().bindValue(
339: SWTObservables.observeEnabled(adventureListViewer
340: .getList()), categorySelectionExistsObservable,
341: null, null);
342:
343: final IObservableValue selectedAdventureObservable = ViewersObservables
344: .observeSingleSelection(adventureListViewer);
345:
346: ComputedValue adventureSelectionExistsObservable = new ComputedValue() {
347: protected Object calculate() {
348: return new Boolean(selectedAdventureObservable
349: .getValue() != null);
350: }
351: };
352:
353: final Text txtName = new Text(getComposite(), SWT.BORDER);
354:
355: getDbc().bindValue(SWTObservables.observeEnabled(txtName),
356: adventureSelectionExistsObservable, null, null);
357: getDbc().bindValue(
358: SWTObservables.observeText(txtName, SWT.Modify),
359: BeansObservables.observeDetailValue(realm,
360: selectedAdventureObservable, "name",
361: String.class), null, null);
362:
363: assertEquals(txtName.getText(), "");
364: assertFalse(txtName.getEnabled());
365:
366: final Text txtDescription = new Text(getComposite(), SWT.BORDER);
367:
368: getDbc().bindValue(
369: SWTObservables.observeEnabled(txtDescription),
370: adventureSelectionExistsObservable, null, null);
371: getDbc().bindValue(
372: SWTObservables.observeText(txtDescription, SWT.Modify),
373: BeansObservables.observeDetailValue(realm,
374: selectedAdventureObservable, "description",
375: String.class), null, null);
376:
377: assertFalse(adventureListViewer.getList().isEnabled());
378: categoryListViewer.setSelection(new StructuredSelection(
379: SampleData.SUMMER_CATEGORY));
380: assertTrue(adventureListViewer.getList().isEnabled());
381: assertFalse(txtName.getEnabled());
382: adventureListViewer.setSelection(new StructuredSelection(
383: SampleData.RAFTING_HOLIDAY));
384: assertEquals(Boolean.TRUE, adventureSelectionExistsObservable
385: .getValue());
386: assertTrue(txtName.getEnabled());
387: assertEquals(SampleData.RAFTING_HOLIDAY.getName(), txtName
388: .getText());
389: categoryListViewer.setSelection(new StructuredSelection(
390: SampleData.WINTER_CATEGORY));
391: assertTrue(adventureListViewer.getList().isEnabled());
392: assertFalse(txtName.getEnabled());
393: }
394: }
|