package com.onaro.sanscreen.client.view.selection; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.event.EventListenerList; import org.eclipse.core.runtime.IAdaptable; /** * Represents the current state of the selection for any object Models a selection * of objects of different types. Selection mode may be single or multiple selection. * Whenever the selection changes, an event is issued to all interested listeners. *

Objects are identified only by their id. */ public class ObjectSelectionModel { /** * The set of selected objects, indexed by the object's ID. */ protected List selectedAdaptables = Collections.emptyList(); protected final EventListenerList listeners = new EventListenerList(); protected void fireListChanged() { ObjectSelectionListener[] listenerList = listeners.getListeners(ObjectSelectionListener.class); if (listenerList.length == 0) return; ObjectSelectionEvent objectSelectionEvent = new ObjectSelectionEvent(this); for (ObjectSelectionListener listener : listenerList) { listener.selectionChanged(objectSelectionEvent); } } /** * Change the selection to the empty set. */ public void clearSelection() { if (!selectedAdaptables.isEmpty()) { selectedAdaptables.clear(); fireListChanged(); } } /** * @see #setSelectedAdaptables(Iterable) */ public void setSelectedAdaptable(IAdaptable adaptable) { if (adaptable == null) { clearSelection(); } else { setSelectedAdaptables(Collections.singletonList(adaptable)); } } /** * Sets the selected objects removing any previous selection. The selection is * always considered as changed. * * @param newSelection a list of SelectedObjects */ public void setSelectedAdaptables(Iterable newSelection) { selectedAdaptables = new ArrayList(); for (IAdaptable adaptable : newSelection) { if (adaptable != null) { selectedAdaptables.add(adaptable); } } fireListChanged(); } // public void setSelectedAdaptables(Iterable newSelection) { // selectedAdaptables = new ArrayList(); // // for (IAdaptable adaptable : newSelection) { // if (adaptable != null) { // selectedAdaptables.add(adaptable); // } // } // // fireListChanged(); // } /** * Tests if there is any selected object. * @return true of no objects are selected */ public boolean isSelectionEmpty() { return selectedAdaptables.isEmpty(); } public List getSelectedAdaptables() { return new ArrayList(selectedAdaptables); } /** * * Gets a list of the current selected objects. * Returns a mutable copy of the selected object list. * @return a list of {@link SelectedObject} instances */ @Deprecated public List getSelectedObjects() { List selectedAdaptables = getSelectedAdaptables(); List selectedObjects = SelectedObjectUtils.getSelectedObjects(selectedAdaptables); return selectedObjects; } public IAdaptable getFirstSelectedAdaptable() { if (selectedAdaptables.isEmpty()) return null; return selectedAdaptables.get(0); } /** * Gets the first selected object. * @return the first selected object or null if none are selected * */ @Deprecated public SelectedObject first() { for (IAdaptable adaptable : selectedAdaptables) { if (adaptable instanceof SelectedObject) { return (SelectedObject)adaptable; } SelectedObject selectedObject = SelectedObjectUtils.getSelectedObject(adaptable); if (selectedObject != null) return selectedObject; } return null; } /** * Registers a listener for this job's state changes. * * @param listener the listener */ public void addObjectSelectionListener(ObjectSelectionListener listener) { listeners.add(ObjectSelectionListener.class, listener); } /** * Removes a listener of this job's state changes. * * @param listener the listener */ public void removeObjectSelectionListener(ObjectSelectionListener listener) { listeners.remove(ObjectSelectionListener.class, listener); } /** * Gets the number of selected objects. * @return the number of objects selected */ public int size() { return selectedAdaptables.size(); } }