| /******************************************************************************* |
| * Copyright (c) 2005 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 |
| *******************************************************************************/ |
| package org.eclipse.jface.tests.databinding.scenarios; |
| |
| import java.beans.IntrospectionException; |
| import java.beans.PropertyDescriptor; |
| import java.util.Random; |
| |
| import org.eclipse.jface.databinding.IReadableSet; |
| import org.eclipse.jface.databinding.IUpdatableCellProvider; |
| import org.eclipse.jface.databinding.IUpdatableTable; |
| import org.eclipse.jface.databinding.Property; |
| import org.eclipse.jface.databinding.beans.JavaBeans; |
| import org.eclipse.jface.databinding.converter.IConverter; |
| import org.eclipse.jface.databinding.viewers.TableViewerDescription; |
| import org.eclipse.jface.databinding.viewers.TableViewerUpdatableTable; |
| import org.eclipse.jface.examples.databinding.model.Account; |
| import org.eclipse.jface.examples.databinding.model.Catalog; |
| import org.eclipse.jface.examples.databinding.model.Category; |
| import org.eclipse.jface.examples.databinding.model.PhoneConverter; |
| import org.eclipse.jface.examples.databinding.model.SampleData; |
| import org.eclipse.jface.examples.databinding.model.Signon; |
| import org.eclipse.jface.examples.databinding.model.StateConverter; |
| import org.eclipse.jface.examples.databinding.model.Transportation; |
| import org.eclipse.jface.viewers.CellEditor; |
| import org.eclipse.jface.viewers.ITableLabelProvider; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.TextCellEditor; |
| import org.eclipse.jface.viewers.ViewerLabel; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.swt.widgets.TableItem; |
| import org.eclipse.swt.widgets.Text; |
| |
| /** |
| * To run the tests in this class, right-click and select "Run As JUnit Plug-in |
| * Test". This will also start an Eclipse instance. To clean up the launch |
| * configuration, open up its "Main" tab and select "[No Application] - Headless |
| * Mode" as the application to run. |
| */ |
| |
| public class NewTableScenarios extends ScenariosTestCase { |
| |
| private TableViewer tableViewer; |
| |
| private Catalog catalog; |
| |
| private Category category; |
| |
| private TableColumn firstNameColumn; |
| |
| private TableColumn lastNameColumn; |
| |
| private TableColumn stateColumn; |
| |
| private Image[] images; |
| |
| private TableColumn fancyColumn; |
| |
| protected void setUp() throws Exception { |
| super.setUp(); |
| getComposite().setLayout(new FillLayout()); |
| tableViewer = new TableViewer(getComposite()); |
| tableViewer.getTable().setLinesVisible(true); |
| tableViewer.getTable().setHeaderVisible(true); |
| firstNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE); |
| firstNameColumn.setWidth(50); |
| lastNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE); |
| lastNameColumn.setWidth(50); |
| stateColumn = new TableColumn(tableViewer.getTable(), SWT.NONE); |
| stateColumn.setWidth(50); |
| fancyColumn = new TableColumn(tableViewer.getTable(), SWT.NONE); |
| fancyColumn.setWidth(250); |
| |
| catalog = SampleData.CATALOG_2005; // Lodging source |
| category = SampleData.WINTER_CATEGORY; |
| |
| images = new Image[] { |
| getShell().getDisplay().getSystemImage(SWT.ICON_ERROR), |
| getShell().getDisplay().getSystemImage(SWT.ICON_WARNING), |
| getShell().getDisplay().getSystemImage(SWT.ICON_INFORMATION), }; |
| } |
| |
| protected void tearDown() throws Exception { |
| // do any teardown work here |
| super.tearDown(); |
| tableViewer.getTable().dispose(); |
| tableViewer = null; |
| firstNameColumn = null; |
| lastNameColumn = null; |
| stateColumn = null; |
| } |
| |
| private String getValue(String text) { |
| if (text == null) |
| return ""; |
| return text; |
| } |
| |
| public void testScenario01() throws IntrospectionException { |
| // Factory for directly creating IUpdatables for beans |
| JavaBeans javaBeans = new JavaBeans(); |
| |
| // Wrap the TableViewer in an IUpdatableTable |
| IUpdatableTable accountTable = new TableViewerUpdatableTable( |
| tableViewer); |
| |
| // Create a readable set to track the catalog's accounts |
| IReadableSet accountSet = javaBeans.createReadableSet(catalog, |
| new PropertyDescriptor("accounts", Catalog.class, "getAccounts", null), |
| Account.class); |
| |
| // Create an updatable cell provider to track the given accounts' properties. |
| IUpdatableCellProvider accountCellProvider = javaBeans.createUpdatableCellProvider( |
| accountSet, new String[] { "firstName", "lastName", "state" }); |
| |
| // bind |
| getDbc().bind(accountTable, accountCellProvider, null); |
| |
| // uncomment next line to see result interactively |
| // interact(); |
| |
| // Verify the data in the table columns matches the accounts |
| Account[] accounts = catalog.getAccounts(); |
| for (int i = 0; i < accounts.length; i++) { |
| Account account = accounts[i]; |
| String col_0 = ((ITableLabelProvider) tableViewer |
| .getLabelProvider()).getColumnText(account, 0); |
| assertEquals(getValue(account.getFirstName()), col_0); |
| String col_1 = ((ITableLabelProvider) tableViewer |
| .getLabelProvider()).getColumnText(account, 1); |
| assertEquals(getValue(account.getLastName()), col_1); |
| String col_2 = ((ITableLabelProvider) tableViewer |
| .getLabelProvider()).getColumnText(account, 2); |
| assertEquals(getValue(account.getState()), col_2); |
| |
| } |
| } |
| |
| public void testScenario02() throws SecurityException, |
| IllegalArgumentException { |
| // Show that a TableViewer with three columns can be used to update |
| // columns |
| Account[] accounts = catalog.getAccounts(); |
| |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addEditableColumn("firstName"); |
| tableViewerDescription.addEditableColumn("lastName", null, null, |
| new PhoneConverter()); |
| tableViewerDescription.addEditableColumn("state", null, null, |
| new StateConverter()); |
| getDbc().bind(tableViewerDescription, |
| new Property(catalog, "accounts"), null); |
| |
| Account account = accounts[0]; |
| // Select the first item in the table |
| tableViewer.editElement(account, 0); |
| // Set the text property of the cell editor which is now active over the |
| // "firstName" column |
| CellEditor[] cellEditors = tableViewer.getCellEditors(); |
| TextCellEditor firstNameEditor = (TextCellEditor) cellEditors[0]; |
| // Change the firstName and test it goes to the model |
| enterText((Text) firstNameEditor.getControl(), "Bill"); |
| // Check whether the model has changed |
| assertEquals("Bill", account.getFirstName()); |
| } |
| |
| public void testScenario04() { |
| // Show that when an item is added to a collection the table gets an |
| // extra item |
| Account[] accounts = catalog.getAccounts(); |
| |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addColumn("firstName"); |
| tableViewerDescription.addColumn("lastName"); |
| tableViewerDescription.addColumn("state"); |
| tableViewerDescription.addColumn(null, new IConverter() { |
| |
| public Class getModelType() { |
| return Account.class; |
| } |
| |
| public Class getTargetType() { |
| return ViewerLabel.class; |
| } |
| |
| public Object convertTargetToModel(Object targetObject) { |
| return null; |
| } |
| |
| public Object convertModelToTarget(Object modelObject) { |
| Account account = (Account) modelObject; |
| return new ViewerLabel(account.toString(), images[new Random() |
| .nextInt(images.length)]); |
| } |
| }); |
| getDbc().bind(tableViewerDescription, |
| new Property(catalog, "accounts"), null); |
| |
| // interact(); |
| |
| // Verify the number of accounts matches the number of items in the |
| // table |
| assertEquals(tableViewer.getTable().getItemCount(), accounts.length); |
| // Add a new account and verify that the number of items in the table |
| // increases |
| Account newAccount = new Account(); |
| newAccount.setFirstName("Finbar"); |
| newAccount.setLastName("McGoo"); |
| newAccount.setLastName("NC"); |
| catalog.addAccount(newAccount); |
| // The number of items should have gone up by one |
| assertEquals(tableViewer.getTable().getItemCount(), accounts.length + 1); |
| // The number of items should still match the number of accounts (i.e. |
| // test the model) |
| assertEquals(tableViewer.getTable().getItemCount(), catalog |
| .getAccounts().length); |
| // Remove the account that was just added |
| catalog.removeAccount(newAccount); |
| // The number of items should match the original |
| assertEquals(tableViewer.getTable().getItemCount(), accounts.length); |
| // The number of items should still match the number of accounts (i.e. |
| // test the model is reset) |
| assertEquals(tableViewer.getTable().getItemCount(), catalog |
| .getAccounts().length); |
| |
| // Test adding and removing to the model on a non UI thread |
| int numberOfAccounts = catalog.getAccounts().length; |
| final Account barney = new Account(); |
| barney.setFirstName("Barney"); |
| barney.setLastName("Smith"); |
| barney.setLastName("CA"); |
| invokeNonUI(new Runnable() { |
| public void run() { |
| catalog.addAccount(barney); |
| } |
| }); |
| spinEventLoop(0); |
| // The number of items should have gone up by one |
| assertEquals(tableViewer.getTable().getItemCount(), |
| numberOfAccounts + 1); |
| |
| invokeNonUI(new Runnable() { |
| public void run() { |
| catalog.removeAccount(barney); |
| } |
| }); |
| spinEventLoop(0); |
| // The number of items should have reverted to the original number |
| // before barney was added and removed |
| assertEquals(tableViewer.getTable().getItemCount(), numberOfAccounts); |
| |
| } |
| |
| public void testScenario03() { |
| // Show that converters work for table columns |
| Account[] accounts = catalog.getAccounts(); |
| |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addEditableColumn("lastName"); |
| tableViewerDescription.addEditableColumn("phone", null, null, |
| new PhoneConverter()); |
| tableViewerDescription.addEditableColumn("state", null, null, |
| new StateConverter()); |
| getDbc().bind(tableViewerDescription, |
| new Property(catalog, "accounts"), null); |
| |
| // Verify that the data in the the table columns matches the expected |
| // What we are looking for is that the phone numbers are converterted to |
| // nnn-nnn-nnnn and that |
| // the state letters are converted to state names |
| // Verify the data in the table columns matches the accounts |
| PhoneConverter phoneConverter = new PhoneConverter(); |
| StateConverter stateConverter = new StateConverter(); |
| for (int i = 0; i < accounts.length; i++) { |
| Account account = catalog.getAccounts()[i]; |
| // Check the phone number |
| String col_phone = ((ITableLabelProvider) tableViewer |
| .getLabelProvider()).getColumnText(account, 1); |
| assertEquals(getValue((String) phoneConverter |
| .convertModelToTarget(account.getPhone())), col_phone); |
| String col_state = ((ITableLabelProvider) tableViewer |
| .getLabelProvider()).getColumnText(account, 2); |
| assertEquals(getValue((String) stateConverter |
| .convertModelToTarget(account.getState())), col_state); |
| } |
| } |
| |
| public void testScenario05() { |
| // Show that when the model changes then the UI refreshes to reflect |
| // this |
| |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addColumn("lastName"); |
| tableViewerDescription.addColumn("phone", new PhoneConverter()); |
| tableViewerDescription.addColumn("state", new StateConverter()); |
| getDbc().bind(tableViewerDescription, |
| new Property(catalog, "accounts"), null); |
| |
| final Account account = catalog.getAccounts()[0]; |
| String lastName = tableViewer.getTable().getItem(0).getText(0); |
| // Check the firstName in the TableItem is the same as the model |
| assertEquals(lastName, account.getLastName()); |
| // Now change the model and check again |
| account.setLastName("Gershwin"); |
| lastName = tableViewer.getTable().getItem(0).getText(0); |
| assertEquals(lastName, account.getLastName()); |
| |
| // Test the model update on a non UI thread |
| invokeNonUI(new Runnable() { |
| public void run() { |
| account.setLastName("Mozart"); |
| } |
| }); |
| spinEventLoop(0); |
| lastName = tableViewer.getTable().getItem(0).getText(0); |
| assertEquals(lastName, account.getLastName()); |
| |
| } |
| |
| public void testScenario06() { |
| // Check that explicit type means that defaulting of converters works |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addEditableColumn("price"); |
| tableViewerDescription.getColumn(0).setPropertyType(Double.TYPE); |
| getDbc().bind(tableViewerDescription, |
| new Property(catalog, "transporations"), null); |
| Transportation transporation = catalog.getTransporations()[0]; |
| tableViewer.editElement(transporation, 0); |
| // Set the text property of the cell editor which is now active over the |
| // "firstName" column |
| CellEditor[] cellEditors = tableViewer.getCellEditors(); |
| TextCellEditor priceEditor = (TextCellEditor) cellEditors[0]; |
| // Change the firstName and test it goes to the model |
| enterText((Text) priceEditor.getControl(), "123.45"); |
| // Verify the model is updated |
| assertEquals(transporation.getPrice(), 123.45, 0); |
| |
| } |
| |
| public void testScenario07() { |
| // Verify that even when a column's property type is not set, that it is |
| // worked out lazily from the target type |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addEditableColumn("price"); |
| // The column's type is not set to be Double.TYPE. This will be inferred |
| // once the first Transportation object is set |
| // into the UpdatableCollection |
| getDbc().bind(tableViewerDescription, |
| new Property(catalog, "transporations"), null); |
| Transportation transporation = catalog.getTransporations()[0]; |
| tableViewer.editElement(transporation, 0); |
| // Set the text property of the cell editor which is now active over the |
| // "firstName" column |
| CellEditor[] cellEditors = tableViewer.getCellEditors(); |
| TextCellEditor priceEditor = (TextCellEditor) cellEditors[0]; |
| // Change the firstName and test it goes to the model |
| enterText((Text) priceEditor.getControl(), "123.45"); |
| // Verify the model is updated |
| assertEquals(transporation.getPrice(), 123.45, 0); |
| |
| } |
| |
| public void testScenario08_00() { |
| // Verify that binding to a Collection property (rather than an array) |
| // works when specifying data type |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addEditableColumn("userId"); |
| tableViewerDescription.addEditableColumn("password"); |
| getDbc().bind(tableViewerDescription, |
| new Property(catalog, "signons", Signon.class, null), null); |
| Signon firstSignon = (Signon) catalog.getSignons().get(0); |
| // Verify the UI matches the model |
| TableItem firstTableItem = tableViewer.getTable().getItem(0); |
| assertEquals(firstTableItem.getText(1), firstSignon.getPassword()); |
| // Change the model and ensure the UI refreshes |
| firstSignon.setPassword("Eclipse123Rocks"); |
| assertEquals("Eclipse123Rocks", firstSignon.getPassword()); |
| assertEquals(firstTableItem.getText(1), firstSignon.getPassword()); |
| // Change the GUI and ensure the model refreshes |
| tableViewer.editElement(firstSignon, 1); |
| CellEditor[] cellEditors = tableViewer.getCellEditors(); |
| TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1]; |
| enterText((Text) passwordEditor.getControl(), "Cricket11Players"); |
| assertEquals("Cricket11Players", firstSignon.getPassword()); |
| |
| } |
| |
| public void testScenario08_01() { |
| // Verify that binding to a Collection property (rather than an array) |
| // works without specifying data type |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addEditableColumn("userId"); |
| tableViewerDescription.addEditableColumn("password"); |
| getDbc().bind(tableViewerDescription, new Property(catalog, "signons"), |
| null); |
| Signon firstSignon = (Signon) catalog.getSignons().get(0); |
| // Verify the UI matches the model |
| TableItem firstTableItem = tableViewer.getTable().getItem(0); |
| assertEquals(firstTableItem.getText(1), firstSignon.getPassword()); |
| // Change the model and ensure the UI refreshes |
| firstSignon.setPassword("Eclipse123Rocks"); |
| assertEquals("Eclipse123Rocks", firstSignon.getPassword()); |
| assertEquals(firstTableItem.getText(1), firstSignon.getPassword()); |
| // Change the GUI and ensure the model refreshes |
| tableViewer.editElement(firstSignon, 1); |
| CellEditor[] cellEditors = tableViewer.getCellEditors(); |
| TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1]; |
| enterText((Text) passwordEditor.getControl(), "Cricket11Players"); |
| assertEquals("Cricket11Players", firstSignon.getPassword()); |
| |
| } |
| |
| public void testScenario09() { |
| // Verify that nested properties work. Catalog has adventures. Adventure |
| // has defaultLodging. Loding has name. |
| TableViewerDescription tableViewerDescription = new TableViewerDescription( |
| tableViewer); |
| tableViewerDescription.addColumn("name"); |
| tableViewerDescription.addColumn("defaultLodging.name"); |
| getDbc().bind(tableViewerDescription, |
| new Property(category, "adventures"), null); |
| |
| } |
| /** |
| * public void testScenario10(){ // Verify that for TIME_EARLY updating |
| * occurs on a per key basic for a TextCellEditor // Show that converters |
| * work for table columns Account[] accounts = catalog.getAccounts(); |
| * Account firstAccount = accounts[0]; |
| * SampleData.getSWTUpdatableFactory().setUpdateTime(IDataBindingContext.TIME_EARLY); |
| * TableViewerDescription tableViewerDescription = new |
| * TableViewerDescription(tableViewer); |
| * tableViewerDescription.addEditableColumn("lastName"); |
| * tableViewerDescription.addColumn("lastName"); |
| * getDbc().bind(tableViewerDescription,new Property(catalog, "accounts"), |
| * null); // Verify that the first account is shown in the first row with |
| * the last name correctly |
| * assertEquals(tableViewer.getTable().getItem(0).getData(),firstAccount); |
| * assertEquals(tableViewer.getTable().getItem(0).getText(0),firstAccount.getLastName()); |
| * assertEquals(tableViewer.getTable().getItem(0).getText(1),firstAccount.getLastName()); // |
| * Create a cell editor over the first column |
| * tableViewer.editElement(firstAccount, 0); // Set the text property of the |
| * cell editor which is now active over the "firstName" column CellEditor[] |
| * cellEditors = tableViewer.getCellEditors(); TextCellEditor |
| * lastNameCellEditor = (TextCellEditor) cellEditors[0]; |
| * ((Text)lastNameCellEditor.getControl()).setText("E"); // Verify that the |
| * key press goes to the model assertEquals(firstAccount.getLastName(),"E"); } |
| */ |
| } |