2
* $Id: JXListTest.java 3650 2010-04-08 15:16:11Z kleopatra $
4
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
5
* Santa Clara, California 95054, U.S.A. All rights reserved.
7
package org.jdesktop.swingx;
10
import java.awt.Dimension;
11
import java.awt.GraphicsEnvironment;
12
import java.beans.PropertyChangeListener;
13
import java.lang.reflect.InvocationTargetException;
14
import java.net.MalformedURLException;
16
import java.text.Collator;
17
import java.util.Arrays;
18
import java.util.Vector;
19
import java.util.logging.Logger;
20
import java.util.regex.Pattern;
22
import javax.swing.DefaultComboBoxModel;
23
import javax.swing.DefaultListCellRenderer;
24
import javax.swing.DefaultListModel;
25
import javax.swing.ListCellRenderer;
26
import javax.swing.ListModel;
27
import javax.swing.RowFilter;
28
import javax.swing.SortOrder;
29
import javax.swing.SwingUtilities;
30
import javax.swing.text.Position.Bias;
32
import org.jdesktop.swingx.JXList.DelegatingRenderer;
33
import org.jdesktop.swingx.decorator.ColorHighlighter;
34
import org.jdesktop.swingx.decorator.ComponentAdapter;
35
import org.jdesktop.swingx.decorator.Highlighter;
36
import org.jdesktop.swingx.decorator.SearchPredicate;
37
import org.jdesktop.swingx.decorator.ComponentAdapterTest.JXListT;
38
import org.jdesktop.swingx.hyperlink.LinkModel;
39
import org.jdesktop.swingx.renderer.DefaultListRenderer;
40
import org.jdesktop.swingx.renderer.StringValue;
41
import org.jdesktop.swingx.renderer.StringValues;
42
import org.jdesktop.swingx.rollover.ListRolloverController;
43
import org.jdesktop.swingx.rollover.RolloverProducer;
44
import org.jdesktop.swingx.sort.DefaultSortController;
45
import org.jdesktop.swingx.sort.ListSortController;
46
import org.jdesktop.swingx.sort.RowFilters;
47
import org.jdesktop.swingx.sort.StringValueRegistry;
48
import org.jdesktop.swingx.sort.TableSortController;
49
import org.jdesktop.test.AncientSwingTeam;
50
import org.jdesktop.test.PropertyChangeReport;
51
import org.jdesktop.test.TestUtils;
52
import org.junit.After;
53
import org.junit.Before;
54
import org.junit.Test;
55
import org.junit.runner.RunWith;
56
import org.junit.runners.JUnit4;
62
* Note: all tests related to the disabled sorting/filtering support are moved to
63
* JXListSortRevamp and forced to fail.
65
* @author Jeanette Winzenburg
67
@RunWith(JUnit4.class)
68
public class JXListTest extends InteractiveTestCase {
70
@SuppressWarnings("unused")
71
private static final Logger LOG = Logger.getLogger(JXListTest.class
74
protected ListModel listModel;
75
protected DefaultListModel ascendingListModel;
76
/** empty default list */
78
private StringValue sv;
81
* Issue #1263-swingx: JXList selectedValues must convert index to model.
84
public void testGetSelectedValue() {
85
DefaultListModel model = new DefaultListModel();
86
model.addElement("One");
87
model.addElement("Two");
88
model.addElement("Three");
89
model.addElement("Four");
90
model.addElement("Five");
91
model.addElement("Six");
92
model.addElement("Seven");
93
JXList list = new JXList();
94
list.setAutoCreateRowSorter(true);
96
list.setSelectedIndex(2);
97
assertEquals("Three", list.getSelectedValue());
98
list.setRowFilter(new RowFilter<ListModel, Integer>() {
101
public boolean include(Entry<? extends ListModel, ? extends Integer> entry) {
102
return entry.getStringValue(entry.getIdentifier()).contains("e");
106
assertEquals("Three", list.getSelectedValue());
110
* Issue #1263-swingx: JXList selectedValues must convert index to model.
113
public void testGetSelectedValues() {
114
DefaultListModel model = new DefaultListModel();
115
model.addElement("One");
116
model.addElement("Two");
117
model.addElement("Three");
118
model.addElement("Four");
119
model.addElement("Five");
120
model.addElement("Six");
121
model.addElement("Seven");
122
JXList list = new JXList();
123
list.setAutoCreateRowSorter(true);
124
list.setModel(model);
125
list.setSelectedIndex(2);
126
list.addSelectionInterval(0, 2);
127
assertTrue(Arrays.deepEquals(new Object[] {"One", "Two", "Three"}, list.getSelectedValues()));
128
list.setRowFilter(new RowFilter<ListModel, Integer>() {
131
public boolean include(Entry<? extends ListModel, ? extends Integer> entry) {
132
return entry.getStringValue(entry.getIdentifier()).contains("e");
136
assertTrue(Arrays.deepEquals(new Object[] {"One", "Three"}, list.getSelectedValues()));
137
list.clearSelection();
138
list.addSelectionInterval(0, 2);
139
assertTrue(Arrays.deepEquals(new Object[] {"One", "Three", "Five"}, list.getSelectedValues()));
143
* Issue #1263-swingx: JXList selectedValues must convert index to model.
146
public void testSetSelectedValue() {
147
DefaultListModel model = new DefaultListModel();
148
model.addElement("One");
149
model.addElement("Two");
150
model.addElement("Three");
151
model.addElement("Four");
152
model.addElement("Five");
153
model.addElement("Six");
154
model.addElement("Seven");
155
JXList list = new JXList();
156
list.setAutoCreateRowSorter(true);
157
list.setModel(model);
158
list.setSelectedValue("Three", false);
159
assertEquals(2, list.getSelectedIndex());
160
list.setRowFilter(new RowFilter<ListModel, Integer>() {
163
public boolean include(Entry<? extends ListModel, ? extends Integer> entry) {
164
return entry.getStringValue(entry.getIdentifier()).contains("e");
168
assertEquals(1, list.getSelectedIndex());
169
list.setSelectedValue("Five", false);
170
assertEquals(2, list.getSelectedIndex());
175
* Issue #1232-swingx: JXList must fire property change on setCellRenderer.
179
public void testRendererNotification() {
180
JXList list = new JXList();
181
assertNotNull("sanity: ", list.getCellRenderer());
182
// very first setting: fires twice ... a bit annoying but ... waiting for complaints ;-)
183
list.setCellRenderer(new DefaultListRenderer());
184
PropertyChangeReport report = new PropertyChangeReport(list);
185
list.setCellRenderer(new DefaultListRenderer());
186
TestUtils.assertPropertyChangeEvent(report, "cellRenderer", null, list.getCellRenderer());
189
* Issue #1162-swingx: getNextMatch incorrect if sorted.
192
public void testNextMatch() {
193
JXList list = new JXList(AncientSwingTeam.createNamedColorListModel(), true);
194
int index = list.getNextMatch("b", 0, Bias.Forward);
195
assertEquals(1, index);
196
list.toggleSortOrder();
197
assertEquals(0, list.getNextMatch("b", 0, Bias.Forward));
201
* Issue #1162-swingx: getNextMatch incorrect for non-standard stringValue
204
public void testNextMatchUseString() {
205
JXList list = new JXList(AncientSwingTeam.createNamedColorListModel(), true);
206
list.setCellRenderer(new DefaultListRenderer(sv));
207
assertEquals("must not find a match for 'b', all start with 'r'",
208
-1, list.getNextMatch("b", 0, Bias.Forward));
211
* Issue 1161-swingx: JXList not completely updated on setRowFilter
214
public void testRevalidateOnSetRowFilter() throws InterruptedException, InvocationTargetException {
215
// This test will not work in a headless configuration.
216
if (GraphicsEnvironment.isHeadless()) {
217
LOG.fine("cannot run ui test - headless environment");
221
final JXList list = new JXList(AncientSwingTeam.createNamedColorListModel(), true);
222
showWithScrollingInFrame(list, "");
223
final Dimension size = list.getSize();
224
SwingUtilities.invokeAndWait(new Runnable() {
226
RowFilter<? super ListModel, ? super Integer> filter = RowFilters.regexFilter(Pattern.CASE_INSENSITIVE, "^b");
227
list.setRowFilter(filter);
230
SwingUtilities.invokeAndWait(new Runnable() {
232
// subtraction arbitrary number, don't want to depend on single pixels
233
assertTrue("height must be adjusted to reduced number of rows, " +
234
"but was (old/current): " + size.height + "/" + list.getSize().height,
235
size.height - 50 > list.getSize().height);
240
//--------------- string rep
242
* Issue #1152-swingx: re-enable filtering with single-string-representation.
243
* was: Issue #767-swingx: consistent string representation.
245
* Here: test Pattern filtering uses string rep
248
public void testListGetStringUsedInPatternFilter() {
249
JXList list = new JXList(AncientSwingTeam.createNamedColorListModel(), true);
250
list.setCellRenderer(new DefaultListRenderer(sv));
251
RowFilter<Object, Integer> filter = RowFilter.regexFilter("R/G/B: -2.*", 0);
252
list.setRowFilter(filter);
253
assertTrue(list.getElementCount() > 0);
254
assertEquals(sv.getString(list.getElementAt(0)), list.getStringAt(0));
258
* Issue #1152-swingx: re-enable filtering with single-string-representation.
259
* was: Issue #767-swingx: consistent string representation.
261
* Here: test list has stringValueProvider and configures the sortController with it
264
public void testStringValueRegistry() {
265
JXList list = new JXList(AncientSwingTeam.createNamedColorListModel(), true);
266
assertSame(list.getStringValueRegistry(), getSortController(list).getStringValueProvider());
270
* Issue #1152-swingx: re-enable filtering with single-string-representation.
271
* was: Issue #767-swingx: consistent string representation.
273
* Here: test updates the sortController on renderer change.
276
public void testStringValueRegistryFromRendererChange() {
277
JXList list = new JXList(AncientSwingTeam.createNamedColorListModel(), true);
278
StringValueRegistry provider = list.getStringValueRegistry();
279
list.setCellRenderer(new DefaultListRenderer(sv));
280
assertEquals(list.getWrappedCellRenderer(), provider.getStringValue(0, 0));
284
* Issue #1152-swingx: re-enable filtering with single-string-representation.
285
* was: Issue #767-swingx: consistent string representation.
287
* Here: test getStringAt use provider (sanity, trying to pull the rag failed
291
public void testStringAtUseProvider() {
292
JXList list = new JXList(AncientSwingTeam.createNamedColorListModel(), true);
293
list.setCellRenderer(new DefaultListRenderer(sv));
294
list.getStringValueRegistry().setStringValue(StringValues.TO_STRING, 0);
295
assertEquals(StringValues.TO_STRING.getString(list.getElementAt(0)),
296
list.getStringAt(0));
300
* Issue #1152-swingx: re-enable filtering with single-string-representation.
301
* was: Issue #767-swingx: consistent string representation.
303
* Here: test getStringAt of ComponentAdapter use provider
304
* (sanity, trying to pull the rag failed during re-enable)
307
public void testStringAtComponentAdapterUseProvider() {
308
JXListT list = new JXListT(AncientSwingTeam.createNamedColorListModel(), true);
309
list.setCellRenderer(new DefaultListRenderer(sv));
310
list.getStringValueRegistry().setStringValue(StringValues.TO_STRING, 0);
311
ComponentAdapter adapter = list.getComponentAdapter();
312
assertEquals(StringValues.TO_STRING.getString(list.getElementAt(0)),
313
adapter.getStringAt(0, 0));
317
//----------------- sorter api on JXList
320
* JXList has responsibility to guarantee usage of
324
public void testSetComparatorToSortController() {
325
JXList list = new JXList(listModel, true);
326
list.setComparator(Collator.getInstance());
327
assertSame(list.getComparator(), getSortController(list).getComparator(0));
331
* added xtable.setSortOrder(int, SortOrder)
335
public void testSetSortOrder() {
336
JXList list = new JXList(ascendingListModel, true);
337
list.setSortOrder(SortOrder.ASCENDING);
338
assertSame("column must be sorted after setting sortOrder on ", SortOrder.ASCENDING, list.getSortOrder());
339
assertSame(SortOrder.ASCENDING, getSortController(list).getSortOrder(0));
345
* testing new sorter api:
346
* getSortOrder(), toggleSortOrder(), resetSortOrder().
350
public void testToggleSortOrder() {
351
JXList list = new JXList(ascendingListModel, true);
352
assertSame(SortOrder.UNSORTED, list.getSortOrder());
353
list.toggleSortOrder();
354
assertSame(SortOrder.ASCENDING, list.getSortOrder());
355
list.toggleSortOrder();
356
assertSame(SortOrder.DESCENDING, list.getSortOrder());
357
list.resetSortOrder();
358
assertSame(SortOrder.UNSORTED, list.getSortOrder());
362
* prepare sort testing: internal probs with SortController?
365
public void testSortController() {
366
JXList list = new JXList(ascendingListModel, true);
367
assertNotNull("sortController must be initialized", list.getRowSorter());
371
//----------------- data api on JXList
373
* testing that rowSorter's model is updated
376
public void testSetModel() {
377
JXList list = new JXList(true);
378
list.setModel(listModel);
379
assertEquals(listModel.getSize(), list.getElementCount());
380
assertSame(listModel, list.getRowSorter().getModel());
385
@Test(expected = IndexOutOfBoundsException.class)
386
public void testConvertToModelPreconditions() {
387
final JXList list = new JXList(ascendingListModel, true);
388
assertEquals(20, list.getElementCount());
389
RowFilter<ListModel, Integer> filter = RowFilters.regexFilter("0", 0);
390
list.setRowFilter(filter);
391
assertEquals(2, list.getElementCount());
392
list.convertIndexToModel(list.getElementCount());
396
@Test(expected = IndexOutOfBoundsException.class)
397
public void testElementAtPreconditions() {
398
final JXList list = new JXList(ascendingListModel, true);
399
assertEquals(20, list.getElementCount());
400
RowFilter<ListModel, Integer> filter = RowFilters.regexFilter("0", 0);
401
list.setRowFilter(filter);
402
assertEquals(2, list.getElementCount());
403
list.getElementAt(list.getElementCount());
409
@Test(expected = IndexOutOfBoundsException.class)
410
public void testConvertToViewPreconditions() {
411
final JXList list = new JXList(ascendingListModel);
412
list.setAutoCreateRowSorter(true);
413
assertEquals(20, list.getElementCount());
414
RowFilter<ListModel, Integer> filter = RowFilters.regexFilter("0", 0);
415
list.setRowFilter(filter);
416
assertEquals(2, list.getElementCount());
417
list.convertIndexToView(ascendingListModel.getSize());
421
public void testNoSorter() {
422
JXList list = new JXList(ascendingListModel);
423
assertEquals(ascendingListModel.getSize(), list.getElementCount());
424
assertEquals(ascendingListModel.getElementAt(0), list.getElementAt(0));
428
public void testSorterNotSorted() {
429
JXList list = new JXList(ascendingListModel, true);
430
assertEquals(ascendingListModel.getSize(), list.getElementCount());
431
assertEquals(ascendingListModel.getElementAt(0), list.getElementAt(0));
435
public void testSorterSorted() {
436
JXList list = new JXList(ascendingListModel, true);
437
list.setSortOrder(SortOrder.DESCENDING);
438
assertEquals(ascendingListModel.getSize(), list.getElementCount());
439
assertEquals(ascendingListModel.getElementAt(0), list.getElementAt(list.getElementCount() - 1));
443
//------------- sort properties
446
public void testPropertiesToSorterOnSetRowsorter() {
447
list.setAutoCreateRowSorter(true);
448
list.setSortsOnUpdates(false);
449
list.setSortable(false);
450
Collator comparator = Collator.getInstance();
451
list.setComparator(comparator);
452
ListSortController<?> controller = new ListSortController<ListModel>(list.getModel());
453
list.setRowSorter(controller);
454
assertEquals("sortable propagated", false, controller.isSortable(0));
455
assertSame("comparator propagated", comparator, controller.getComparator(0));
456
assertEquals("sortsOnUpdates propagated", false, controller.getSortsOnUpdates());
460
public void testSortsOnUpdate() {
461
PropertyChangeReport report = new PropertyChangeReport(list);
462
list.setSortsOnUpdates(false);
463
TestUtils.assertPropertyChangeEvent(report, "sortsOnUpdates", true, false);
464
assertFalse(list.getSortsOnUpdates());
469
public void testSortable() {
470
PropertyChangeReport report = new PropertyChangeReport(list);
471
list.setSortable(false);
472
TestUtils.assertPropertyChangeEvent(report, "sortable", true, false);
473
assertFalse(list.isSortable());
477
* Setting table's sortable property updates controller.
480
public void testTableRowFilterSynchedToController() {
481
JXList list = new JXList(true);
482
RowFilter<Object, Object> filter = RowFilters.regexFilter(".*");
483
list.setRowFilter(filter);
484
assertEquals(filter, getSortController(list).getRowFilter());
485
assertEquals(filter, list.getRowFilter());
489
* Setting table's sortable property updates controller.
492
public void testSortOrderCycle() {
493
JXList list = new JXList(true);
494
SortOrder[] cycle = new SortOrder[] {SortOrder.DESCENDING, SortOrder.UNSORTED};
495
PropertyChangeReport report = new PropertyChangeReport(list);
496
list.setSortOrderCycle(cycle);
497
TestUtils.assertPropertyChangeEvent(report, "sortOrderCycle",
498
DefaultSortController.getDefaultSortOrderCycle(), list.getSortOrderCycle());
503
* Convenience: type cast of default rowSorter.
507
private ListSortController<? extends ListModel> getSortController(JXList list) {
508
return (ListSortController<? extends ListModel>) list.getRowSorter();
511
//------------ rowSorter api
514
* test filterEnabled property on initialization.
518
public void testConstructorAutoCreateSorter() {
519
assertAutoCreateRowSorter(new JXList(), false);
520
assertAutoCreateRowSorter(new JXList(new DefaultListModel()), false);
521
assertAutoCreateRowSorter(new JXList(new Vector<Object>()), false);
522
assertAutoCreateRowSorter(new JXList(new Object[] { }), false);
524
assertAutoCreateRowSorter(new JXList(false), false);
525
assertAutoCreateRowSorter(new JXList(new DefaultListModel(), false), false);
526
assertAutoCreateRowSorter(new JXList(new Vector<Object>(), false), false);
527
assertAutoCreateRowSorter(new JXList(new Object[] { }, false), false);
529
assertAutoCreateRowSorter(new JXList(true), true);
530
assertAutoCreateRowSorter(new JXList(new DefaultListModel(), true), true);
531
assertAutoCreateRowSorter(new JXList(new Vector<Object>(), true), true);
532
assertAutoCreateRowSorter(new JXList(new Object[] { }, true), true);
535
private void assertAutoCreateRowSorter(JXList list, boolean b) {
536
assertEquals(b, list.getAutoCreateRowSorter());
541
public void testRowSorterSet() {
542
assertNull(list.getRowSorter());
543
ListSortController<ListModel> controller = new ListSortController<ListModel>(list.getModel());
544
PropertyChangeReport report = new PropertyChangeReport(list);
545
list.setRowSorter(controller);
546
TestUtils.assertPropertyChangeEvent(report, list, "rowSorter", null, controller);
547
assertSame(controller, list.getRowSorter());
551
public void testAutoCreateRowSorterSet() {
552
PropertyChangeReport report = new PropertyChangeReport(list);
553
list.setAutoCreateRowSorter(true);
554
assertTrue(list.getAutoCreateRowSorter());
555
TestUtils.assertPropertyChangeEvent(report, "autoCreateRowSorter", false, true, false);
556
assertNotNull(list.getRowSorter());
561
* Test assumptions of accessing list model/view values through
562
* the list's componentAdapter.
565
public void testComponentAdapterCoordinates() {
566
JXList list = new JXList(ascendingListModel, true);
567
list.setComparator(TableSortController.COMPARABLE_COMPARATOR);
568
Object originalFirstRowValue = list.getElementAt(0);
569
Object originalLastRowValue = list.getElementAt(list.getElementCount() - 1);
570
assertEquals("view row coordinate equals model row coordinate",
571
list.getModel().getElementAt(0), originalFirstRowValue);
572
// sort first column - actually does not change anything order
573
list.toggleSortOrder();
575
assertEquals("view order must be unchanged ",
576
list.getElementAt(0), originalFirstRowValue);
578
list.toggleSortOrder();
580
assertEquals("view order must be reversed changed ",
581
list.getElementAt(0), originalLastRowValue);
582
ComponentAdapter adapter = list.getComponentAdapter();
583
assertEquals("adapter filteredValue expects row view coordinates",
584
list.getElementAt(0), adapter.getFilteredValueAt(0, 0));
585
// adapter coordinates are view coordinates
588
assertEquals("adapter.getValue must return value at adapter coordinates",
589
list.getElementAt(0), adapter.getValue());
590
assertEquals("adapter.getValue must return value at adapter coordinates",
591
list.getElementAt(0), adapter.getValue(0));
595
//------------------------end of re-enable sort/filter
597
* Issue #816-swingx: Delegating renderer must create list's default.
598
* Consistent api: expose wrappedRenderer the same way as wrappedModel
601
public void testWrappedRendererDefault() {
602
JXList list = new JXList();
603
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
604
assertSame("wrapping renderer must use list's default on null",
605
renderer.getDelegateRenderer(), list.getWrappedCellRenderer());
609
* Issue #816-swingx: Delegating renderer must create list's default.
610
* Consistent api: expose wrappedRenderer the same way as wrappedModel
613
public void testWrappedRendererCustom() {
614
JXList list = new JXList();
615
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
616
ListCellRenderer custom = new DefaultListRenderer();
617
list.setCellRenderer(custom);
618
assertSame("wrapping renderer must use list's default on null",
619
renderer.getDelegateRenderer(), list.getWrappedCellRenderer());
623
* Issue #816-swingx: Delegating renderer must create list's default.
624
* Delegating uses default on null, here: default default.
627
public void testDelegatingRendererUseDefaultSetNull() {
628
JXList list = new JXList();
629
ListCellRenderer defaultRenderer = list.createDefaultCellRenderer();
630
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
631
list.setCellRenderer(null);
632
assertEquals("wrapping renderer must use list's default on null",
633
defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
637
* Issue #816-swingx: Delegating renderer must create list's default.
638
* Delegating has default from list initially, here: default default.
641
public void testDelegatingRendererUseDefault() {
642
JXList list = new JXList();
643
ListCellRenderer defaultRenderer = list.createDefaultCellRenderer();
644
assertEquals("sanity: creates default", DefaultListRenderer.class,
645
defaultRenderer.getClass());
646
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
647
assertEquals(defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
651
* Issue #816-swingx: Delegating renderer must create list's default.
652
* Delegating has default from list initially, here: custom default.
655
public void testDelegatingRendererUseCustomDefaultSetNull() {
656
JXList list = new JXList() {
659
protected ListCellRenderer createDefaultCellRenderer() {
660
return new CustomDefaultRenderer();
664
ListCellRenderer defaultRenderer = list.createDefaultCellRenderer();
665
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
666
list.setCellRenderer(null);
667
assertEquals("wrapping renderer must use list's default on null",
668
defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
672
* Issue #816-swingx: Delegating renderer must create list's default.
673
* Delegating has default from list initially, here: custom default.
676
public void testDelegatingRendererUseCustomDefault() {
677
JXList list = new JXList() {
680
protected ListCellRenderer createDefaultCellRenderer() {
681
return new CustomDefaultRenderer();
685
ListCellRenderer defaultRenderer = list.createDefaultCellRenderer();
686
assertEquals("sanity: creates custom", CustomDefaultRenderer.class,
687
defaultRenderer.getClass());
688
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
689
assertEquals(defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
692
* Dummy extension for testing - does nothing more as super.
694
public static class CustomDefaultRenderer extends DefaultListCellRenderer {
698
* Issue #767-swingx: consistent string representation.
700
* Here: test api on JXTable.
703
public void testGetString() {
704
JXList list = new JXList(AncientSwingTeam.createNamedColorListModel());
705
StringValue sv = new StringValue() {
707
public String getString(Object value) {
708
if (value instanceof Color) {
709
Color color = (Color) value;
710
return "R/G/B: " + color.getRGB();
712
return StringValues.TO_STRING.getString(value);
716
list.setCellRenderer(new DefaultListRenderer(sv));
717
String text = list.getStringAt(0);
718
assertEquals(sv.getString(list.getElementAt(0)), text);
723
* test that swingx renderer is used by default.
727
public void testDefaultListRenderer() {
728
JXList list = new JXList();
729
ListCellRenderer renderer = ((DelegatingRenderer) list.getCellRenderer()).getDelegateRenderer();
730
assertTrue("default renderer expected to be DefaultListRenderer " +
731
"\n but is " + renderer.getClass(),
732
renderer instanceof DefaultListRenderer);
736
* Issue #473-swingx: NPE in list with highlighter. <p>
738
* Renderers are doc'ed to cope with invalid input values.
739
* Highlighters can rely on valid ComponentAdapter state.
740
* JXList delegatingRenderer is the culprit which does set
741
* invalid ComponentAdapter state. Negative invalid index.
745
public void testIllegalNegativeListRowIndex() {
746
JXList list = new JXList(new Object[] {1, 2, 3});
747
ListCellRenderer renderer = list.getCellRenderer();
748
renderer.getListCellRendererComponent(list, "dummy", -1, false, false);
749
SearchPredicate predicate = new SearchPredicate("\\QNode\\E");
750
Highlighter searchHighlighter = new ColorHighlighter(predicate, null, Color.RED);
751
list.addHighlighter(searchHighlighter);
752
renderer.getListCellRendererComponent(list, "dummy", -1, false, false);
756
* Issue #473-swingx: NPE in list with highlighter. <p>
758
* Renderers are doc'ed to cope with invalid input values.
759
* Highlighters can rely on valid ComponentAdapter state.
760
* JXList delegatingRenderer is the culprit which does set
761
* invalid ComponentAdapter state. Invalid index > valid range.
765
public void testIllegalExceedingListRowIndex() {
766
JXList list = new JXList(new Object[] {1, 2, 3});
767
ListCellRenderer renderer = list.getCellRenderer();
768
renderer.getListCellRendererComponent(list, "dummy", list.getElementCount(), false, false);
769
SearchPredicate predicate = new SearchPredicate("\\QNode\\E");
770
Highlighter searchHighlighter = new ColorHighlighter(predicate, null, Color.RED);
771
list.addHighlighter(searchHighlighter);
772
renderer.getListCellRendererComponent(list, "dummy", list.getElementCount(), false, false);
776
* test convenience method accessing the configured adapter.
780
public void testConfiguredComponentAdapter() {
781
JXList list = new JXList(new Object[] {1, 2, 3});
782
ComponentAdapter adapter = list.getComponentAdapter();
783
assertEquals(0, adapter.column);
784
assertEquals(0, adapter.row);
788
adapter = list.getComponentAdapter(0);
789
assertEquals(0, adapter.column);
790
assertEquals(0, adapter.row);
795
* test exceptions on null data(model, vector, array).
799
public void testNullData() {
801
new JXList((ListModel) null);
802
fail("JXList contructor must throw on null data");
803
} catch (IllegalArgumentException e) {
805
} catch (Exception e) {
806
fail("unexpected exception type " + e);
810
new JXList((Vector<?>) null);
811
fail("JXList contructor must throw on null data");
812
} catch (IllegalArgumentException e) {
814
} catch (Exception e) {
815
fail("unexpected exception type " + e);
819
new JXList((Object[]) null);
820
fail("JXList contructor must throw on null data");
821
} catch (IllegalArgumentException e) {
823
} catch (Exception e) {
824
fail("unexpected exception type " + e);
830
* add and test comparator property.
834
public void testComparator() {
835
JXList list = new JXList();
836
assertNull(list.getComparator());
837
Collator comparator = Collator.getInstance();
838
PropertyChangeReport report = new PropertyChangeReport();
839
list.addPropertyChangeListener(report);
840
list.setComparator(comparator);
841
assertEquals(comparator, list.getComparator());
842
assertEquals(1, report.getEventCount());
843
assertEquals(1, report.getEventCount("comparator"));
848
* test if LinkController/executeButtonAction is properly registered/unregistered on
849
* setRolloverEnabled.
853
public void testLinkControllerListening() {
854
JXList table = new JXList();
855
table.setRolloverEnabled(true);
856
assertNotNull("LinkController must be listening", getLinkControllerAsPropertyChangeListener(table, RolloverProducer.CLICKED_KEY));
857
assertNotNull("LinkController must be listening", getLinkControllerAsPropertyChangeListener(table, RolloverProducer.ROLLOVER_KEY));
858
assertNotNull("execute button action must be registered", table.getActionMap().get(JXList.EXECUTE_BUTTON_ACTIONCOMMAND));
859
table.setRolloverEnabled(false);
860
assertNull("LinkController must not be listening", getLinkControllerAsPropertyChangeListener(table, RolloverProducer.CLICKED_KEY ));
861
assertNull("LinkController must be listening", getLinkControllerAsPropertyChangeListener(table, RolloverProducer.ROLLOVER_KEY));
862
assertNull("execute button action must be de-registered", table.getActionMap().get(JXList.EXECUTE_BUTTON_ACTIONCOMMAND));
865
private PropertyChangeListener getLinkControllerAsPropertyChangeListener(JXList table, String propertyName) {
866
PropertyChangeListener[] listeners = table.getPropertyChangeListeners(propertyName);
867
for (int i = 0; i < listeners.length; i++) {
868
if (listeners[i] instanceof ListRolloverController<?>) {
869
return (ListRolloverController<?>) listeners[i];
876
protected ListModel createListModel() {
877
JXList list = new JXList();
878
return new DefaultComboBoxModel(list.getActionMap().allKeys());
881
protected DefaultListModel createAscendingListModel(int startRow, int count) {
882
DefaultListModel l = new DefaultListModel();
883
for (int row = startRow; row < startRow + count; row++) {
884
l.addElement(new Integer(row));
888
protected DefaultListModel createListModelWithLinks() {
889
DefaultListModel model = new DefaultListModel();
890
for (int i = 0; i < 20; i++) {
892
LinkModel link = new LinkModel("a link text " + i, null, new URL("http://some.dummy.url" + i));
894
URL url = JXEditorPaneTest.class.getResource("resources/test.html");
896
link = new LinkModel("a resource", null, url);
898
model.addElement(link);
899
} catch (MalformedURLException e) {
900
// TODO Auto-generated catch block
909
* Creates and returns a StringValue which maps a Color to it's R/G/B rep,
910
* prepending "R/G/B: "
912
* @return the StringValue for color.
914
private StringValue createColorStringValue() {
915
StringValue sv = new StringValue() {
917
public String getString(Object value) {
918
if (value instanceof Color) {
919
Color color = (Color) value;
920
return "R/G/B: " + color.getRGB();
922
return StringValues.TO_STRING.getString(value);
931
* Creates and returns a number filter, passing values which are numbers and
932
* have int values inside or outside of the bounds (included), depending on the given
940
// protected Filter createNumberFilter(final int lowerBound, final int upperBound, final boolean inside) {
941
// PatternFilter f = new PatternFilter() {
944
// public boolean test(int row) {
945
// Object value = getInputValue(row, getColumnIndex());
946
// if (!(value instanceof Number)) return false;
947
// boolean isInside = ((Number) value).intValue() >= lowerBound
948
// && ((Number) value).intValue() <= upperBound;
949
// return inside ? isInside : !isInside;
957
protected void setUp() throws Exception {
960
listModel = createListModel();
961
ascendingListModel = createAscendingListModel(0, 20);
962
sv = createColorStringValue();
964
public JXListTest() {
965
super("JXList Tests");
970
public void setUpJ4() throws Exception {
975
public void tearDownJ4() throws Exception {