// Copyright 2011 Palantir Technologies // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.palantir.ptoss.cinch; import java.util.Arrays; import java.util.List; import javax.swing.JList; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.palantir.ptoss.cinch.core.Bindings; import com.palantir.ptoss.cinch.core.DefaultBindableModel; import com.palantir.ptoss.cinch.core.ModelUpdate; import com.palantir.ptoss.cinch.swing.Bound; import com.palantir.ptoss.cinch.swing.BoundSelection; import junit.framework.TestCase; public class BoundJListTest extends TestCase { public static class Model extends DefaultBindableModel { public enum Update implements ModelUpdate { NO_TRIGGER, SPECIFIC; } private List<String> values = Lists.newArrayList(); private List<String> selectedValues = Lists.newArrayList(); public List<String> getValues() { return values; } public void setValues(List<String> values) { this.values = values; update(); } public void setValuesSpecific(List<String> values) { this.values = values; modelUpdated(Update.SPECIFIC); } public void setValuesNoTrigger(List<String> values) { this.values = values; modelUpdated(Update.NO_TRIGGER); } public List<String> getSelectedValues() { return selectedValues; } public void setSelectedValues(List<String> selectedValues) { if (selectedValues == null) { this.selectedValues = Lists.newArrayList(); } else { this.selectedValues = Lists.newArrayList(selectedValues); } update(); } public String getSelectedValue() { if (selectedValues == null || selectedValues.isEmpty()) { return null; } return selectedValues.get(0); } public void setSelectedValue(String value) { selectedValues.clear(); if (value != null) { selectedValues.add(value); } update(); } } private final Model model = new Model(); @Bound(to = "model.values") @BoundSelection(to = "model.selectedValue") private final JList list = new JList(); private final Model multiModel = new Model(); @Bound(to = "multiModel.values") @BoundSelection(to = "multiModel.selectedValues", multi = true) private final JList multiList = new JList(); @Bound(to = "model.values", on = "SPECIFIC") private final JList specificList = new JList(); private final Bindings bindings = Bindings.standard(); @Override protected void setUp() throws Exception { bindings.bind(this); list.setName("standard"); specificList.setName("specific"); } public void testInitial() { assertEquals(0, list.getModel().getSize()); } public void testSimple() { model.setValues(ImmutableList.of("one", "two", "three")); assertEquals("one", list.getModel().getElementAt(0)); assertEquals("two", list.getModel().getElementAt(1)); assertEquals("three", list.getModel().getElementAt(2)); } public void testNullList() { model.setValues(ImmutableList.of("one", "two", "three")); assertEquals(3, list.getModel().getSize()); model.setValues(null); assertEquals(0, list.getModel().getSize()); } public void testMaintainSelection() { model.setValues(ImmutableList.of("one", "two", "three")); assertEquals(3, list.getModel().getSize()); assertNull(list.getSelectedValue()); list.setSelectedIndex(1); assertEquals(1, list.getSelectedIndex()); assertEquals("two", list.getSelectedValue()); model.setValues(ImmutableList.of("two", "three", "four")); assertEquals(0, list.getSelectedIndex()); assertEquals("two", list.getSelectedValue()); model.setValues(ImmutableList.of("three", "four", "five")); assertEquals(-1, list.getSelectedIndex()); assertNull(list.getSelectedValue()); list.setSelectedIndices(new int[] {0, 2}); model.setValues(ImmutableList.of("one", "two", "three", "four", "five")); assertTrue(Arrays.equals(new int[] {2, 4}, list.getSelectedIndices())); model.setValues(ImmutableList.of("six", "five")); assertTrue(Arrays.equals(new int[] {1}, list.getSelectedIndices())); } public void testSpecific() { assertEquals(0, specificList.getModel().getSize()); model.setValuesNoTrigger(ImmutableList.of("one", "two", "three")); assertEquals(0, specificList.getModel().getSize()); model.setValuesSpecific(ImmutableList.of("one", "two", "three")); assertEquals(3, specificList.getModel().getSize()); } public void testSimpleSelection() { simpleSelectionTest(model, list); } public void simpleSelectionTest(Model model, JList list) { model.setValues(ImmutableList.of("one", "two", "three")); assertEquals(null, model.getSelectedValue()); model.setSelectedValue("one"); assertEquals("one", model.getSelectedValue()); assertEquals("one", list.getSelectedValue()); list.setSelectedIndex(1); assertEquals("two", model.getSelectedValue()); assertEquals("two", list.getSelectedValue()); model.setSelectedValue(null); assertNull(model.getSelectedValue()); assertNull(list.getSelectedValue()); model.setSelectedValue("one"); assertEquals("one", model.getSelectedValue()); assertEquals("one", list.getSelectedValue()); list.clearSelection(); assertNull(model.getSelectedValue()); assertNull(list.getSelectedValue()); } public void testMultiSelection() { simpleSelectionTest(multiModel, multiList); multiModel.setSelectedValues(ImmutableList.of("one", "three")); assertEquals(ImmutableList.of("one", "three"), multiModel.getSelectedValues()); assertTrue(Arrays.equals(new String[] {"one", "three"}, multiList.getSelectedValues())); multiList.setSelectedIndices(new int[] {1, 2}); assertEquals(ImmutableList.of("two", "three"), multiModel.getSelectedValues()); assertTrue(Arrays.equals(new String[] {"two", "three"}, multiList.getSelectedValues())); multiModel.setSelectedValue(null); assertTrue(multiModel.getSelectedValues().isEmpty()); assertTrue(multiList.getSelectedValues().length == 0); multiModel.setSelectedValues(ImmutableList.of("one", "three")); assertEquals(ImmutableList.of("one", "three"), multiModel.getSelectedValues()); assertTrue(Arrays.equals(new String[] {"one", "three"}, multiList.getSelectedValues())); multiList.clearSelection(); assertTrue(multiModel.getSelectedValues().isEmpty()); assertTrue(multiList.getSelectedValues().length == 0); } }