Author: sletellier Date: 2012-07-04 11:44:48 +0200 (Wed, 04 Jul 2012) New Revision: 2378 Url: http://nuiton.org/repositories/revision/jaxx/2378 Log: fixes #2159 : Create GenericListSelectionModel extracted from GenericListModel Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListSelectionModel.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListModel.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListModel.java 2012-07-03 13:39:06 UTC (rev 2377) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListModel.java 2012-07-04 09:44:48 UTC (rev 2378) @@ -24,32 +24,19 @@ package jaxx.runtime.swing.model; import com.google.common.collect.Lists; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; import java.util.Collection; import java.util.List; import javax.swing.ComboBoxModel; import javax.swing.DefaultListModel; -import javax.swing.DefaultListSelectionModel; -import javax.swing.event.EventListenerList; import javax.swing.event.ListDataListener; /** * @author sletellier <letellier@codelutin.com> */ -public class GenericListModel<B> extends DefaultListSelectionModel implements ComboBoxModel { +public class GenericListModel<B> extends GenericListSelectionModel<B> implements ComboBoxModel { - protected EventListenerList listenerList = new EventListenerList(); - protected final PropertyChangeSupport pcs = new PropertyChangeSupport(this); - - public static final String PROPERTY_SELECTED_VALUE = "selectedValues"; - - protected DefaultListModel delegate = new DefaultListModel(); - - protected List<B> selectedValues; - public GenericListModel() { - this.selectedValues = Lists.newArrayList(); + super(new DefaultListModel()); } public GenericListModel(Collection<B> values) { @@ -67,7 +54,7 @@ fireValuesRemoved(oldValues); for (B value : values) { - delegate.addElement(value); + getListModel().addElement(value); } fireSelectionAdded(values); @@ -75,184 +62,64 @@ public void clearElements() { Collection<B> elements = getElements(); - delegate.clear(); + getListModel().clear(); fireValuesRemoved(elements); } public Collection<B> getElements() { - int size = delegate.getSize(); + int size = getListModel().getSize(); Collection<B> result = Lists.newArrayList(); for (int i=0;i<size;i++) { - result.add((B) delegate.get(i)); + result.add((B) getListModel().get(i)); } return result; } public void addElement(int index, B valueToAdd) { - delegate.add(index, valueToAdd); + getListModel().add(index, valueToAdd); fireValuesAdded(Lists.newArrayList(valueToAdd)); } public void addElement(B valueToAdd) { - delegate.addElement(valueToAdd); + getListModel().addElement(valueToAdd); fireValuesAdded(Lists.newArrayList(valueToAdd)); } public void addElements(Collection<B> valuesToAdd) { for (B value : valuesToAdd) { - delegate.addElement(value); + getListModel().addElement(value); } fireValuesAdded(valuesToAdd); } - public B getSelectedValue() { - return selectedValues.get(0); - } - - public Collection<B> getSelectedValues() { - return Lists.newArrayList(selectedValues); - } - public void removeElements(Collection<B> values) { for (B value : values) { - delegate.removeElement(value); + getListModel().removeElement(value); } unSelectItems(values); fireValuesRemoved(values); } - protected void unSelectItems(Collection<B> values) { - Collection<B> oldValue = Lists.newArrayList(selectedValues); - for (B value : values) { - int index = selectedValues.indexOf(value); - removeSelectionIntervalWithoutFire(index, index); - } - fireSelectionRemoved(values); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); - } - - protected void unSelectItem(B value) { - Collection<B> oldValue = Lists.newArrayList(selectedValues); - int index = selectedValues.indexOf(value); - removeSelectionIntervalWithoutFire(index, index); - - fireSelectionRemoved(Lists.newArrayList(value)); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); - } - - public void addSelectedItem(B toSelect) { - Collection<B> oldValue = Lists.newArrayList(selectedValues); - selectedValues.add(toSelect); - int index = selectedValues.indexOf(toSelect); - super.addSelectionInterval(index, index); - - fireSelectionAdded(Lists.newArrayList(toSelect)); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); - } - - public boolean hasSelectedIndex() { - return !selectedValues.isEmpty(); - } - @Override - public void addSelectionInterval(int index0, int index1) { - Collection<B> oldValue = Lists.newArrayList(selectedValues); - - addSelectionIntervalWithFire(index0, index1); - super.addSelectionInterval(index0, index1); - - Collection<B> newValue = Lists.newArrayList(selectedValues); - newValue.removeAll(oldValue); - fireSelectionAdded(newValue); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); - } - - @Override - public void setSelectionInterval(int index0, int index1) { - Collection<B> oldValue = Lists.newArrayList(selectedValues); - selectedValues.clear(); - addSelectionIntervalWithFire(index0, index1); - super.setSelectionInterval(index0, index1); - - Collection<B> newValue = Lists.newArrayList(selectedValues); - newValue.removeAll(oldValue); - fireSelectionAdded(newValue); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); - } - - @Override - public void removeSelectionInterval(int index0, int index1) { - Collection<B> oldValue = Lists.newArrayList(selectedValues); - removeSelectionIntervalWithoutFire(index0, index1); - - Collection<B> newValue = Lists.newArrayList(selectedValues); - newValue.removeAll(oldValue); - fireSelectionRemoved(newValue); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); - } - - protected void removeSelectionIntervalWithoutFire(int index0, int index1) { - if (index0 > index1) { - int tmp = index1; - index1 = index0; - index0 = tmp; - } - for (int i=index0;i<=index1;i++) { - if (selectedValues.size() > i && i != -1) { - selectedValues.remove(i); - } - } - super.removeSelectionInterval(index0, index1); - } - - protected void addSelectionIntervalWithFire(int index0, int index1) { - if (index0 > index1) { - int tmp = index1; - index1 = index0; - index0 = tmp; - } - for (int i=index0;i<=index1;i++) { - - if (delegate.size() > i && i != -1) { - B value = (B)delegate.getElementAt(i); - selectedValues.add(value); - } - } - } - - @Override - public void clearSelection() { - Collection<B> oldValue = Lists.newArrayList(selectedValues); - selectedValues.clear(); - super.clearSelection(); - + public void setSelectedItem(Object anItem) { + List<B> oldValue = getSelectedValues(); fireSelectionRemoved(oldValue); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); - } - @Override - public int getSelectionMode() { - return MULTIPLE_INTERVAL_SELECTION; - } + setSelectedValues(Lists.newArrayList((B) anItem)); - @Override - public void setSelectedItem(Object anItem) { - Collection<B> oldValue = this.selectedValues; - fireSelectionRemoved(selectedValues); - - selectedValues = Lists.newArrayList((B)anItem); - - fireSelectionAdded(selectedValues); - firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + List<B> newValues = getSelectedValues(); + fireSelectionAdded(newValues); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, newValues); } @Override public Object getSelectedItem() { + List<B> selectedValues = getSelectedValues(); if (selectedValues.isEmpty()) { return null; } @@ -261,117 +128,22 @@ @Override public int getSize() { - return delegate.size(); + return getListModel().size(); } @Override public Object getElementAt(int index) { - return delegate.get(index); + return getListModel().get(index); } @Override public void addListDataListener(ListDataListener l) { - delegate.addListDataListener(l); + getListModel().addListDataListener(l); } @Override public void removeListDataListener(ListDataListener l) { - delegate.removeListDataListener(l); + getListModel().removeListDataListener(l); } - public void addGenericListListener(GenericListListener l) { - listenerList.add(GenericListListener.class, l); - } - - public void removeGenericListListener(GenericListListener l) { - listenerList.remove(GenericListListener.class, l); - } - - public void addPropertyChangeListener(PropertyChangeListener listener) { - pcs.addPropertyChangeListener(listener); - } - - public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.addPropertyChangeListener(propertyName, listener); - } - - public void removePropertyChangeListener(PropertyChangeListener listener) { - pcs.removePropertyChangeListener(listener); - } - - public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.removePropertyChangeListener(propertyName, listener); - } - - protected void fireValuesAdded(Collection<B> values) { - if (values.isEmpty()) { - return; - } - Object[] listeners = listenerList.getListenerList(); - GenericListEvent<B> e = null; - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == GenericListListener.class) { - if (e == null) { - e = new GenericListEvent<B>(this, values); - } - ((GenericListListener)listeners[i+1]).valuesAdded(e); - } - } - } - - protected void fireValuesRemoved(Collection<B> values) { - if (values.isEmpty()) { - return; - } - Object[] listeners = listenerList.getListenerList(); - GenericListEvent<B> e = null; - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == GenericListListener.class) { - if (e == null) { - e = new GenericListEvent<B>(this, values); - } - ((GenericListListener)listeners[i+1]).valuesRemoved(e); - } - } - } - - protected void fireSelectionAdded(Collection<B> selectedValues) { - if (selectedValues.isEmpty()) { - return; - } - Object[] listeners = listenerList.getListenerList(); - GenericListEvent<B> e = null; - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == GenericListListener.class) { - if (e == null) { - e = new GenericListEvent<B>(this, selectedValues); - } - ((GenericListListener)listeners[i+1]).selectionAdded(e); - } - } - } - - protected void fireSelectionRemoved(Collection<B> selectedValues) { - if (selectedValues.isEmpty()) { - return; - } - Object[] listeners = listenerList.getListenerList(); - GenericListEvent<B> e = null; - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == GenericListListener.class) { - if (e == null) { - e = new GenericListEvent<B>(this, selectedValues); - } - ((GenericListListener)listeners[i+1]).selectionAdded(e); - } - } - } - - protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { - pcs.firePropertyChange(propertyName, oldValue, newValue); - } } \ No newline at end of file Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListSelectionModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListSelectionModel.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/GenericListSelectionModel.java 2012-07-04 09:44:48 UTC (rev 2378) @@ -0,0 +1,255 @@ +package jaxx.runtime.swing.model; + +import com.google.common.collect.Lists; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.Collection; +import java.util.List; +import javax.swing.DefaultListModel; +import javax.swing.DefaultListSelectionModel; +import javax.swing.event.EventListenerList; + +/** + * @author sletellier <letellier@codelutin.com> + */ +public class GenericListSelectionModel<B> extends DefaultListSelectionModel { + + public static final String PROPERTY_SELECTED_VALUE = "selectedValues"; + + protected EventListenerList listenerList = new EventListenerList(); + protected final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + + protected List<B> selectedValues; + protected DefaultListModel listModel; + + public GenericListSelectionModel(DefaultListModel listModel) { + this.selectedValues = Lists.newArrayList(); + this.listModel = listModel; + } + + public DefaultListModel getListModel() { + return listModel; + } + + public B getSelectedValue() { + return selectedValues.get(0); + } + + public List<B> getSelectedValues() { + return Lists.newArrayList(selectedValues); + } + + public void setSelectedValues(List<B> selectedValues) { + this.selectedValues = selectedValues; + } + + protected void unSelectItems(Collection<B> values) { + Collection<B> oldValue = Lists.newArrayList(selectedValues); + for (B value : values) { + int index = selectedValues.indexOf(value); + removeSelectionIntervalWithoutFire(index, index); + } + fireSelectionRemoved(values); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + } + + protected void unSelectItem(B value) { + Collection<B> oldValue = Lists.newArrayList(selectedValues); + int index = selectedValues.indexOf(value); + removeSelectionIntervalWithoutFire(index, index); + + fireSelectionRemoved(Lists.newArrayList(value)); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + } + + public void addSelectedItem(B toSelect) { + Collection<B> oldValue = Lists.newArrayList(selectedValues); + selectedValues.add(toSelect); + int index = selectedValues.indexOf(toSelect); + super.addSelectionInterval(index, index); + + fireSelectionAdded(Lists.newArrayList(toSelect)); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + } + + public boolean hasSelectedIndex() { + return !selectedValues.isEmpty(); + } + + @Override + public void addSelectionInterval(int index0, int index1) { + Collection<B> oldValue = Lists.newArrayList(selectedValues); + + addSelectionIntervalWithFire(index0, index1); + super.addSelectionInterval(index0, index1); + + Collection<B> newValue = Lists.newArrayList(selectedValues); + newValue.removeAll(oldValue); + fireSelectionAdded(newValue); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + } + + @Override + public void setSelectionInterval(int index0, int index1) { + Collection<B> oldValue = Lists.newArrayList(selectedValues); + selectedValues.clear(); + addSelectionIntervalWithFire(index0, index1); + super.setSelectionInterval(index0, index1); + + Collection<B> newValue = Lists.newArrayList(selectedValues); + newValue.removeAll(oldValue); + fireSelectionAdded(newValue); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + } + + @Override + public void removeSelectionInterval(int index0, int index1) { + Collection<B> oldValue = Lists.newArrayList(selectedValues); + removeSelectionIntervalWithoutFire(index0, index1); + + Collection<B> newValue = Lists.newArrayList(selectedValues); + newValue.removeAll(oldValue); + fireSelectionRemoved(newValue); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + } + + protected void removeSelectionIntervalWithoutFire(int index0, int index1) { + if (index0 > index1) { + int tmp = index1; + index1 = index0; + index0 = tmp; + } + for (int i=index0;i<=index1;i++) { + if (selectedValues.size() > i && i != -1) { + selectedValues.remove(i); + } + } + super.removeSelectionInterval(index0, index1); + } + + protected void addSelectionIntervalWithFire(int index0, int index1) { + if (index0 > index1) { + int tmp = index1; + index1 = index0; + index0 = tmp; + } + for (int i=index0;i<=index1;i++) { + + if (listModel.size() > i && i != -1) { + B value = (B)listModel.getElementAt(i); + selectedValues.add(value); + } + } + } + + @Override + public void clearSelection() { + Collection<B> oldValue = Lists.newArrayList(selectedValues); + selectedValues.clear(); + super.clearSelection(); + + fireSelectionRemoved(oldValue); + firePropertyChange(PROPERTY_SELECTED_VALUE, oldValue, selectedValues); + } + + @Override + public int getSelectionMode() { + return MULTIPLE_INTERVAL_SELECTION; + } + + protected void fireValuesAdded(Collection<B> values) { + if (values.isEmpty()) { + return; + } + Object[] listeners = listenerList.getListenerList(); + GenericListEvent<B> e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == GenericListListener.class) { + if (e == null) { + e = new GenericListEvent<B>(this, values); + } + ((GenericListListener)listeners[i+1]).valuesAdded(e); + } + } + } + + protected void fireValuesRemoved(Collection<B> values) { + if (values.isEmpty()) { + return; + } + Object[] listeners = listenerList.getListenerList(); + GenericListEvent<B> e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == GenericListListener.class) { + if (e == null) { + e = new GenericListEvent<B>(this, values); + } + ((GenericListListener)listeners[i+1]).valuesRemoved(e); + } + } + } + + protected void fireSelectionAdded(Collection<B> selectedValues) { + if (selectedValues.isEmpty()) { + return; + } + Object[] listeners = listenerList.getListenerList(); + GenericListEvent<B> e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == GenericListListener.class) { + if (e == null) { + e = new GenericListEvent<B>(this, selectedValues); + } + ((GenericListListener)listeners[i+1]).selectionAdded(e); + } + } + } + + protected void fireSelectionRemoved(Collection<B> selectedValues) { + if (selectedValues.isEmpty()) { + return; + } + Object[] listeners = listenerList.getListenerList(); + GenericListEvent<B> e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == GenericListListener.class) { + if (e == null) { + e = new GenericListEvent<B>(this, selectedValues); + } + ((GenericListListener)listeners[i+1]).selectionAdded(e); + } + } + } + + public void addGenericListListener(GenericListListener l) { + listenerList.add(GenericListListener.class, l); + } + + public void removeGenericListListener(GenericListListener l) { + listenerList.remove(GenericListListener.class, l); + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.addPropertyChangeListener(propertyName, listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + + public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { + pcs.removePropertyChangeListener(propertyName, listener); + } + + protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { + pcs.firePropertyChange(propertyName, oldValue, newValue); + } +}