/******************************************************************************* * Copyright (c) 2007, 2014 compeople AG 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: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.internal.ui.ridgets.swt; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Arrays; import java.util.Comparator; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.List; import org.eclipse.riena.beans.common.Person; import org.eclipse.riena.beans.common.PersonManager; import org.eclipse.riena.beans.common.StringPojo; import org.eclipse.riena.beans.common.TypedComparator; import org.eclipse.riena.core.util.ReflectionUtils; import org.eclipse.riena.internal.ui.swt.test.UITestHelper; import org.eclipse.riena.ui.common.ISortableByColumn; import org.eclipse.riena.ui.ridgets.IListRidget; import org.eclipse.riena.ui.ridgets.ISelectableRidget; import org.eclipse.riena.ui.ridgets.ISelectableRidget.SelectionType; import org.eclipse.riena.ui.ridgets.ITableRidget; import org.eclipse.riena.ui.ridgets.listener.ClickEvent; import org.eclipse.riena.ui.ridgets.listener.SelectionEvent; import org.eclipse.riena.ui.ridgets.swt.MarkerSupport; import org.eclipse.riena.ui.ridgets.swt.uibinding.SwtControlRidgetMapper; /** * Tests of the class {@link ListRidget}. */ public class ListRidgetTest extends AbstractTableListRidgetTest { @Override protected List createWidget(final Composite parent) { return new List(parent, SWT.MULTI); } @Override protected IListRidget createRidget() { return new ListRidget(); } @Override protected List getWidget() { return (List) super.getWidget(); } @Override protected IListRidget getRidget() { return (IListRidget) super.getRidget(); } @Override protected void bindRidgetToModel() { getRidget().bindToModel(manager, "persons", Person.class, "firstname"); } // test methods // ///////////// public void testRidgetMapping() { final SwtControlRidgetMapper mapper = SwtControlRidgetMapper.getInstance(); assertSame(ListRidget.class, mapper.getRidgetClass(getWidget())); } public void testUpdateFromModel() { final List control = getWidget(); final ITableRidget ridget = getRidget(); final int oldCount = manager.getPersons().size(); assertEquals(oldCount, ridget.getObservableList().size()); assertEquals(oldCount, control.getItemCount()); manager.getPersons().remove(person1); final int newCount = oldCount - 1; assertEquals(newCount, manager.getPersons().size()); assertEquals(oldCount, ridget.getObservableList().size()); assertEquals(oldCount, control.getItemCount()); ridget.updateFromModel(); assertEquals(newCount, manager.getPersons().size()); assertEquals(newCount, ridget.getObservableList().size()); assertEquals(newCount, control.getItemCount()); } public void testUpdateFromModelPreservesSelection() { final ITableRidget ridget = getRidget(); ridget.setSelection(person2); assertSame(person2, ridget.getSelection().get(0)); manager.getPersons().remove(person1); ridget.updateFromModel(); assertSame(person2, ridget.getSelection().get(0)); } public void testContainsOption() { final ITableRidget ridget = getRidget(); assertTrue(ridget.containsOption(person1)); assertTrue(ridget.containsOption(person2)); assertTrue(ridget.containsOption(person3)); assertFalse(ridget.containsOption(null)); assertFalse(ridget.containsOption(new Person("", ""))); final java.util.List<Person> persons = Arrays.asList(new Person[] { person3 }); final PersonManager manager = new PersonManager(persons); ridget.bindToModel(manager, "persons", Person.class, new String[] { "firstname" }, new String[] { "" }); ridget.updateFromModel(); assertFalse(ridget.containsOption(person1)); assertTrue(ridget.containsOption(person3)); } public void testSetSelectionType() { final ITableRidget ridget = getRidget(); final List control = getWidget(); assertEquals(SelectionType.SINGLE, ridget.getSelectionType()); assertTrue((control.getStyle() & SWT.MULTI) != 0); ridget.setSelection(new int[] { 0, 1 }); // single selection is enforced assertEquals(1, ridget.getSelectionIndices().length); assertEquals(1, control.getSelectionCount()); // multiple selection is now allowed ridget.setSelectionType(SelectionType.MULTI); ridget.setSelection(new int[] { 0, 1 }); assertEquals(2, ridget.getSelectionIndices().length); assertEquals(2, control.getSelectionCount()); } @Override public void testAddClickListener() { final IListRidget ridget = getRidget(); ridget.updateFromModel(); final List control = getWidget(); try { ridget.addClickListener(null); fail(); } catch (final RuntimeException npe) { ok(); } final FTClickListener listener1 = new FTClickListener(); ridget.addClickListener(listener1); final FTClickListener listener2 = new FTClickListener(); ridget.addClickListener(listener2); ridget.addClickListener(listener2); final int clickedRow = 2; // 3rd row control.setSelection(clickedRow); final Event mdEvent = new Event(); mdEvent.widget = control; mdEvent.button = 2; mdEvent.type = SWT.MouseDown; control.notifyListeners(SWT.MouseDown, mdEvent); mdEvent.type = SWT.MouseUp; control.notifyListeners(SWT.MouseUp, mdEvent); assertEquals(1, listener1.getCount()); assertEquals(1, listener2.getCount()); ClickEvent event = listener2.getEvent(); assertEquals(getRidget(), event.getSource()); assertEquals(2, event.getButton()); assertEquals(0, event.getColumnIndex()); assertSame(person3, event.getRow()); ridget.removeClickListener(listener1); mdEvent.type = SWT.MouseDown; control.notifyListeners(SWT.MouseDown, mdEvent); mdEvent.type = SWT.MouseUp; control.notifyListeners(SWT.MouseUp, mdEvent); assertEquals(1, listener1.getCount()); assertEquals(2, listener2.getCount()); control.deselectAll(); mdEvent.type = SWT.MouseDown; control.notifyListeners(SWT.MouseDown, mdEvent); mdEvent.type = SWT.MouseUp; control.notifyListeners(SWT.MouseUp, mdEvent); event = listener2.getEvent(); assertEquals(3, listener2.getCount()); assertEquals(2, event.getButton()); assertEquals(0, event.getColumnIndex()); assertEquals(null, event.getRow()); } public void testAddDoubleClickListener() { final IListRidget ridget = getRidget(); final List control = getWidget(); try { ridget.addDoubleClickListener(null); fail(); } catch (final RuntimeException rex) { ok(); } final FTActionListener listener1 = new FTActionListener(); ridget.addDoubleClickListener(listener1); final FTActionListener listener2 = new FTActionListener(); ridget.addDoubleClickListener(listener2); ridget.addDoubleClickListener(listener2); final Event doubleClick = new Event(); doubleClick.widget = control; doubleClick.type = SWT.MouseDoubleClick; control.notifyListeners(SWT.MouseDoubleClick, doubleClick); assertEquals(1, listener1.getCount()); assertEquals(1, listener2.getCount()); ridget.removeDoubleClickListener(listener1); control.notifyListeners(SWT.MouseDoubleClick, doubleClick); assertEquals(1, listener1.getCount()); } public void testSetComparator() { final IListRidget ridget = getRidget(); final List control = getWidget(); // sorts from a to z final Comparator<Object> comparator = new TypedComparator<String>(); try { ridget.setComparator(-1, comparator); fail(); } catch (final RuntimeException rex) { ok(); } try { ridget.setComparator(1, comparator); fail(); } catch (final RuntimeException rex) { ok(); } final int lastItemIndex = control.getItemCount() - 1; assertEquals("John", control.getItem(0)); assertEquals("Frank", control.getItem(lastItemIndex)); ridget.setComparator(0, comparator); ridget.setSortedColumn(0); assertEquals("Frank", control.getItem(0)); assertEquals("John", control.getItem(lastItemIndex)); ridget.setComparator(0, null); assertEquals("John", control.getItem(0)); assertEquals("Frank", control.getItem(lastItemIndex)); } public void testGetSortedColumn() { final IListRidget ridget = getRidget(); try { ridget.setSortedColumn(1); fail(); } catch (final RuntimeException rex) { ok(); } try { ridget.setSortedColumn(-2); fail(); } catch (final RuntimeException rex) { ok(); } assertEquals(-1, ridget.getSortedColumn()); ridget.setComparator(0, new TypedComparator<String>()); assertEquals(-1, ridget.getSortedColumn()); ridget.setSortedColumn(0); assertEquals(0, ridget.getSortedColumn()); ridget.setComparator(0, null); assertEquals(-1, ridget.getSortedColumn()); ridget.setSortedColumn(-1); assertEquals(-1, ridget.getSortedColumn()); // no comparator in column 0 ridget.setSortedColumn(0); assertEquals(-1, ridget.getSortedColumn()); } public void testIsColumnSortable() { final IListRidget ridget = getRidget(); try { assertFalse(ridget.isColumnSortable(-1)); fail(); } catch (final RuntimeException rex) { ok(); } try { assertFalse(ridget.isColumnSortable(1)); fail(); } catch (final RuntimeException rex) { ok(); } assertFalse(ridget.isColumnSortable(0)); ridget.setComparator(0, new TypedComparator<String>()); assertTrue(ridget.isColumnSortable(0)); ridget.setComparator(0, null); assertFalse(ridget.isColumnSortable(0)); } public void testSetColumnSortable() { final IListRidget ridget = getRidget(); try { // TODO warning suppression: Ignore FindBugs warning about the // UnsupportedOperationException being thrown since this is // what the test is all about. ridget.setColumnSortable(0, true); fail(); } catch (final UnsupportedOperationException uoe) { ok(); } } public void testSetSortedAscending() { final IListRidget ridget = getRidget(); final List control = getWidget(); ridget.bindToModel(manager, "persons", Person.class, new String[] { "lastname" }, new String[] { "" }); ridget.updateFromModel(); final int lastItemIndex = control.getItemCount() - 1; assertEquals(-1, ridget.getSortedColumn()); assertTrue(ridget.isSortedAscending()); ridget.setSortedAscending(false); assertFalse(ridget.isSortedAscending()); ridget.setComparator(0, new TypedComparator<String>()); ridget.setSortedColumn(0); assertFalse(ridget.isSortedAscending()); assertEquals("Zappa", control.getItem(0)); assertEquals("Doe", control.getItem(lastItemIndex)); ridget.setSortedAscending(true); assertTrue(ridget.isSortedAscending()); assertEquals("Doe", control.getItem(0)); assertEquals("Zappa", control.getItem(lastItemIndex)); ridget.setComparator(0, null); assertEquals(-1, ridget.getSortedColumn()); assertTrue(ridget.isSortedAscending()); } public void testSetSortedAscendingFiresEvents() { final IListRidget ridget = getRidget(); assertTrue(ridget.isSortedAscending()); expectPropertyChangeEvents(new PropertyChangeEvent(ridget, ISortableByColumn.PROPERTY_SORT_ASCENDING, Boolean.TRUE, Boolean.FALSE)); ridget.setSortedAscending(false); verifyPropertyChangeEvents(); expectNoPropertyChangeEvent(); ridget.setSortedAscending(false); verifyPropertyChangeEvents(); expectPropertyChangeEvents(new PropertyChangeEvent(ridget, ISortableByColumn.PROPERTY_SORT_ASCENDING, Boolean.FALSE, Boolean.TRUE)); ridget.setSortedAscending(true); verifyPropertyChangeEvents(); expectNoPropertyChangeEvent(); ridget.setSortedAscending(true); verifyPropertyChangeEvents(); } public void testSetSortedColumnFiresEvents() { final IListRidget ridget = getRidget(); assertEquals(-1, ridget.getSortedColumn()); expectPropertyChangeEvents(new PropertyChangeEvent(ridget, ISortableByColumn.PROPERTY_SORTED_COLUMN, Integer.valueOf(-1), Integer.valueOf(0))); ridget.setSortedColumn(0); verifyPropertyChangeEvents(); expectNoPropertyChangeEvent(); ridget.setSortedColumn(0); verifyPropertyChangeEvents(); expectPropertyChangeEvents(new PropertyChangeEvent(ridget, ISortableByColumn.PROPERTY_SORTED_COLUMN, Integer.valueOf(0), Integer.valueOf(-1))); ridget.setSortedColumn(-1); verifyPropertyChangeEvents(); } public void testHasMoveableColumns() { final IListRidget ridget = getRidget(); assertFalse(ridget.hasMoveableColumns()); // TODO warning suppression: Ignore FindBugs warning about the // UnsupportedOperationException being thrown since this is // what the test is all about. try { ridget.setMoveableColumns(true); fail(); } catch (final UnsupportedOperationException ex) { ok(); } } /** * Tests that for single selection, the ridget selection state and the ui * selection state cannot be changed by the user when ridget is set to * "output only". */ public void testOutputSingleSelectionCannotBeChangedFromUI() { final IListRidget ridget = getRidget(); final List control = getWidget(); ridget.setSelectionType(SelectionType.SINGLE); assertEquals(0, ridget.getSelection().size()); assertEquals(0, control.getSelectionCount()); ridget.setOutputOnly(true); control.setFocus(); // press space to select row 0 UITestHelper.sendString(control.getDisplay(), " "); assertEquals(0, ridget.getSelection().size()); assertEquals(0, control.getSelectionCount()); ridget.setOutputOnly(false); control.setFocus(); // press space to select row 0 UITestHelper.sendString(control.getDisplay(), " "); assertEquals(1, ridget.getSelection().size()); assertEquals(1, control.getSelectionCount()); } /** * Tests that for multiple selection, the ridget selection state and the ui * selection state cannot be changed by the user when ridget is set to * "output only". */ public void testOutputMultipleSelectionCannotBeChangedFromUI() { final IListRidget ridget = getRidget(); final List control = getWidget(); ridget.setSelectionType(SelectionType.MULTI); assertEquals(0, ridget.getSelection().size()); assertEquals(0, control.getSelectionCount()); ridget.setOutputOnly(true); control.setFocus(); // press space to select row 0 UITestHelper.sendString(control.getDisplay(), " "); assertEquals(0, ridget.getSelection().size()); assertEquals(0, control.getSelectionCount()); ridget.setOutputOnly(false); control.setFocus(); // press space to select row 0 UITestHelper.sendString(control.getDisplay(), " "); assertEquals(1, ridget.getSelection().size()); assertEquals(1, control.getSelectionCount()); } /** * Tests that toggling output state on/off does not change the selection. */ public void testTogglingOutputDoesNotChangeSelection() { final IListRidget ridget = getRidget(); ridget.setSelection(0); assertEquals(0, ridget.getSelectionIndex()); ridget.setOutputOnly(true); assertEquals(0, ridget.getSelectionIndex()); ridget.setSelection((Object) null); assertEquals(-1, ridget.getSelectionIndex()); ridget.setOutputOnly(false); assertEquals(-1, ridget.getSelectionIndex()); } /** * Tests that changing the selection in ridget works as expected, even when * the ridget is disabled. */ public void testDisabledListIsEmptyFromRidget() { if (!MarkerSupport.isHideDisabledRidgetContent()) { System.out.println("Skipping ListRidgetTest.testDisabledListIsEmptyFromRidget()"); return; } final IListRidget ridget = getRidget(); final List control = getWidget(); // the single selection is bound to another object in the parent class getRidget().bindSingleSelectionToModel(manager, "selectedPerson"); ridget.setSelection(person1); assertEquals(person1.getFirstname(), control.getItem(control.getSelectionIndex())); assertEquals(person1, ridget.getSelection().get(0)); assertEquals(person1, manager.getSelectedPerson()); ridget.setEnabled(false); assertEquals(-1, control.getSelectionIndex()); assertEquals(person1, ridget.getSelection().get(0)); assertEquals(person1, manager.getSelectedPerson()); ridget.setSelection(person2); assertEquals(-1, control.getSelectionIndex()); assertEquals(person2, ridget.getSelection().get(0)); assertEquals(person2, manager.getSelectedPerson()); ridget.setEnabled(true); assertEquals(person2.getFirstname(), control.getItem(control.getSelectionIndex())); assertEquals(person2, ridget.getSelection().get(0)); assertEquals(person2, manager.getSelectedPerson()); } /** * Tests that changing the selection in a bound model works as expected, * even when the ridget is disabled. */ public void testDisabledListIsEmptyFromModel() { if (!MarkerSupport.isHideDisabledRidgetContent()) { System.out.println("Skipping ListRidgetTest.testDisabledListIsEmptyFromModel()"); return; } final IListRidget ridget = getRidget(); final List control = getWidget(); // the single selection is bound to another object in the parent class getRidget().bindSingleSelectionToModel(manager, "selectedPerson"); manager.setSelectedPerson(person1); ridget.updateSingleSelectionFromModel(); assertEquals(person1.getFirstname(), control.getItem(control.getSelectionIndex())); assertEquals(person1, ridget.getSelection().get(0)); assertEquals(person1, manager.getSelectedPerson()); ridget.setEnabled(false); assertEquals(-1, control.getSelectionIndex()); assertEquals(person1, ridget.getSelection().get(0)); assertEquals(person1, manager.getSelectedPerson()); manager.setSelectedPerson(person2); ridget.updateSingleSelectionFromModel(); assertEquals(-1, control.getSelectionIndex()); assertEquals(person2, ridget.getSelection().get(0)); assertEquals(person2, manager.getSelectedPerson()); ridget.setEnabled(true); assertEquals(person2.getFirstname(), control.getItem(control.getSelectionIndex())); assertEquals(person2, ridget.getSelection().get(0)); assertEquals(person2, manager.getSelectedPerson()); } /** * Tests that disabling / enabling the ridget does not fire selection events * (because the list is modified internally). */ public void testDisabledDoesNotFireSelection() { final IListRidget ridget = getRidget(); final FTPropertyChangeListener listener = new FTPropertyChangeListener(); ridget.addPropertyChangeListener(ISelectableRidget.PROPERTY_SELECTION, listener); ridget.setSelection(person1); int count = listener.getCount(); ridget.setEnabled(false); assertEquals(count, listener.getCount()); ridget.setSelection(person2); count = listener.getCount(); ridget.setEnabled(true); assertTrue(count < listener.getCount()); } /** * Tests that disabling / enabling works as intended, even when no model is * bound to the ridget. */ public void testDisableWithoutBoundModel() { final ListRidget ridget = (ListRidget) createRidget(); final List control = getWidget(); ridget.setUIControl(control); assertNull(ridget.getObservableList()); ridget.setEnabled(false); assertFalse(ridget.isEnabled()); assertFalse(control.isEnabled()); ridget.setEnabled(true); assertTrue(ridget.isEnabled()); assertTrue(control.isEnabled()); } /** * Tests that the disabled state is applied to a new control when set into * the ridget. */ public void testDisableAndClearOnBind() { if (!MarkerSupport.isHideDisabledRidgetContent()) { System.out.println("Skipping ListRidgetTest.testDisableAndClearOnBind()"); return; } final IListRidget ridget = getRidget(); final List control = getWidget(); // the single selection is bound to another object in the parent class getRidget().bindSingleSelectionToModel(manager, "selectedPerson"); ridget.setUIControl(null); ridget.setEnabled(false); manager.setSelectedPerson(person1); ridget.updateSingleSelectionFromModel(); ridget.setUIControl(control); assertFalse(control.isEnabled()); assertEquals("", control.getItem(0)); // items 'hidden' == "" assertEquals(-1, control.getSelectionIndex()); // no selection assertEquals(person1, ridget.getSelection().get(0)); ridget.setEnabled(true); assertTrue(control.isEnabled()); assertTrue(control.getItem(0).length() > 0); // ! "" assertTrue(control.getSelectionIndex() > -1); // selection was restored assertEquals(manager.getPersons().size(), control.getItemCount()); assertEquals(person1, ridget.getSelection().get(0)); } public void testAddSelectionListener() { final IListRidget ridget = getRidget(); final List control = getWidget(); try { ridget.addSelectionListener(null); fail(); } catch (final RuntimeException npe) { ok(); } final TestSelectionListener selectionListener = new TestSelectionListener(); ridget.addSelectionListener(selectionListener); ridget.setSelection(person1); assertEquals(1, selectionListener.getCount()); ridget.removeSelectionListener(selectionListener); ridget.setSelection(person2); assertEquals(1, selectionListener.getCount()); ridget.clearSelection(); ridget.addSelectionListener(selectionListener); ridget.setSelectionType(SelectionType.SINGLE); assertEquals(0, ridget.getSelection().size()); assertEquals(0, control.getSelectionCount()); control.setFocus(); UITestHelper.sendKeyAction(control.getDisplay(), UITestHelper.KC_ARROW_DOWN); assertEquals(1, ridget.getSelection().size()); assertEquals(1, control.getSelectionCount()); assertEquals(2, selectionListener.getCount()); final SelectionEvent selectionEvent = selectionListener.getSelectionEvent(); assertEquals(ridget, selectionEvent.getSource()); assertTrue(selectionEvent.getOldSelection().isEmpty()); assertEquals(ridget.getSelection(), selectionEvent.getNewSelection()); // System.out.println("SelectionEvent: " + selectionListener.getSelectionEvent()); UITestHelper.sendKeyAction(control.getDisplay(), UITestHelper.KC_ARROW_DOWN); assertEquals(1, ridget.getSelection().size()); assertEquals(1, control.getSelectionCount()); assertEquals(3, selectionListener.getCount()); final SelectionEvent selectionEvent2 = selectionListener.getSelectionEvent(); assertEquals(ridget, selectionEvent.getSource()); assertEquals(selectionEvent.getNewSelection(), selectionEvent2.getOldSelection()); assertEquals(ridget.getSelection(), selectionEvent2.getNewSelection()); // System.out.println("SelectionEvent: " + selectionListener.getSelectionEvent()); ridget.removeSelectionListener(selectionListener); } public void testSimplifiedBinding() { final List control = new List(getShell(), SWT.NONE); final IListRidget ridget = createRidget(); ridget.setUIControl(control); final SimplifiedModel model = new SimplifiedModel(); ridget.bindToModel(model, "values"); assertEquals(null, ridget.getObservableList()); ridget.updateFromModel(); assertEquals(3, ridget.getObservableList().size()); assertEquals(model.getValues().size(), control.getItemCount()); assertEquals(SimplifiedModel.NAME_ONE, control.getItem(0)); assertEquals(SimplifiedModel.NAME_TWO, control.getItem(1)); assertEquals(SimplifiedModel.NAME_THREE, control.getItem(2)); } public void testRebindToSimpleModel() { final IListRidget ridget = getRidget(); final List control = getWidget(); // already bound to Persons assertTrue(ridget.getObservableList().get(0) instanceof Person); // rebind to different model final SimplifiedModel model = new SimplifiedModel(); ridget.bindToModel(model, "values"); ridget.updateFromModel(); assertTrue(ridget.getObservableList().get(0) instanceof String); assertEquals(SimplifiedModel.NAME_ONE, control.getItem(0)); assertEquals(SimplifiedModel.NAME_TWO, control.getItem(1)); assertEquals(SimplifiedModel.NAME_THREE, control.getItem(2)); } /** * As per bug 301182 */ public void testRefreshNull() { final IListRidget ridget = createRidget(); final List control = createWidget(getShell()); ridget.setUIControl(control); final StringPojo word1 = new StringPojo("eclipse"); final StringPojo word2 = new StringPojo("riena"); final WritableList values = new WritableList(Arrays.asList(word1, word2), StringPojo.class); final String[] columns = { "value" }; ridget.bindToModel(values, StringPojo.class, columns, null); ridget.updateFromModel(); assertEquals("eclipse", control.getItem(0)); assertEquals("riena", control.getItem(1)); word1.setValue("alpha"); word2.setValue("beta"); assertEquals("eclipse", control.getItem(0)); assertEquals("riena", control.getItem(1)); ridget.refresh(null); assertEquals("alpha", control.getItem(0)); assertEquals("beta", control.getItem(1)); } /** * As per bug 301182 */ public void testRefresh() { final IListRidget ridget = createRidget(); final List control = createWidget(getShell()); ridget.setUIControl(control); final StringPojo word1 = new StringPojo("eclipse"); final StringPojo word2 = new StringPojo("riena"); final WritableList values = new WritableList(Arrays.asList(word1, word2), StringPojo.class); final String[] columns = { "value" }; ridget.bindToModel(values, StringPojo.class, columns, null); ridget.updateFromModel(); assertEquals("eclipse", control.getItem(0)); assertEquals("riena", control.getItem(1)); word1.setValue("alpha"); word2.setValue("beta"); assertEquals("eclipse", control.getItem(0)); assertEquals("riena", control.getItem(1)); ridget.refresh(word1); assertEquals("alpha", control.getItem(0)); assertEquals("riena", control.getItem(1)); } public void testGetOptionWithSorting() { final IListRidget ridget = getRidget(); ridget.bindToModel(manager, "persons", Person.class, "lastname"); ridget.updateFromModel(); assertEquals(0, ridget.indexOfOption(person1)); assertEquals(person1, ridget.getOption(0)); ridget.setComparator(0, new StringComparator()); ridget.setSortedColumn(0); // sort by last name ridget.setSortedAscending(false); final int last = ridget.getOptionCount() - 1; assertEquals(last, ridget.indexOfOption(person1)); assertEquals(person1, ridget.getOption(last)); ridget.setSortedAscending(true); assertEquals(0, ridget.indexOfOption(person1)); assertEquals(person1, ridget.getOption(0)); } public void testSetSelectionWithSorting() { final IListRidget ridget = getRidget(); ridget.bindToModel(manager, "persons", Person.class, "lastname"); ridget.updateFromModel(); assertEquals(-1, ridget.getSelectionIndex()); assertTrue(ridget.getSelection().isEmpty()); ridget.setSelection(0); assertEquals(0, ridget.getSelectionIndex()); assertEquals(person1, ridget.getSelection().get(0)); ridget.setComparator(0, new StringComparator()); ridget.setSortedColumn(0); // sort by last name ridget.setSortedAscending(false); final int last = ridget.getOptionCount() - 1; assertEquals(last, ridget.getSelectionIndex()); assertEquals(person1, ridget.getSelection().get(0)); ridget.setSortedAscending(true); assertEquals(0, ridget.getSelectionIndex()); assertEquals(person1, ridget.getSelection().get(0)); } // helping methods // //////////////// @Override protected void clearUIControlRowSelection() { getWidget().deselectAll(); fireSelectionEvent(); } @Override protected int getUIControlSelectedRowCount() { return getWidget().getSelectionCount(); } @Override protected int getUIControlSelectedRow() { return getWidget().getSelectionIndex(); } @Override protected Object getRowValue(final int i) { // return getRidget().getRowObservables().get(i); final IObservableList rowObservables = ReflectionUtils.invokeHidden(getRidget(), "getRowObservables"); return rowObservables.get(i); } @Override protected int[] getSelectedRows() { // IObservableList rowObservables = getRidget().getRowObservables(); final IObservableList rowObservables = ReflectionUtils.invokeHidden(getRidget(), "getRowObservables"); final Object[] elements = getRidget().getMultiSelectionObservable().toArray(); final int[] result = new int[elements.length]; for (int i = 0; i < elements.length; i++) { final Object element = elements[i]; result[i] = rowObservables.indexOf(element); } return result; } @Override protected int[] getUIControlSelectedRows() { return getWidget().getSelectionIndices(); } @Override protected void setUIControlRowSelection(final int[] indices) { getWidget().setSelection(indices); fireSelectionEvent(); } @Override protected void setUIControlRowSelectionInterval(final int start, final int end) { getWidget().setSelection(start, end); fireSelectionEvent(); } @Override protected boolean supportsMulti() { return true; } // helping classes // //////////////// /** * PropertyChangeListener that counts how often it is invoked. */ private static final class FTPropertyChangeListener implements PropertyChangeListener { private int count; public int getCount() { return count; } public void propertyChange(final PropertyChangeEvent evt) { count++; // System.out.println(count + "\t" + evt.getOldValue() + " -> " + evt.getNewValue()); } } private static final class SimplifiedModel { private final java.util.List<String> values; private final static String NAME_ONE = "Janet"; private final static String NAME_TWO = "Jermaine"; private final static String NAME_THREE = "John"; public SimplifiedModel() { values = Arrays.asList(new String[] { NAME_ONE, NAME_TWO, NAME_THREE }); } public java.util.List<String> getValues() { return values; } } private static final class StringComparator implements Comparator<Object> { public int compare(final Object o1, final Object o2) { final String s1 = (String) o1; final String s2 = (String) o2; return s1.compareTo(s2); } } }