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 SelectedObject
s
*/
public void setSelectedAdaptables(Iterable extends IAdaptable> newSelection) {
selectedAdaptables = new ArrayList();
for (IAdaptable adaptable : newSelection) {
if (adaptable != null) {
selectedAdaptables.add(adaptable);
}
}
fireListChanged();
}
// public void setSelectedAdaptables(Iterable extends IAdaptable> 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();
}
}