package com.onaro.sanscreen.client.view.selection;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.eclipse.core.runtime.IAdaptable;
/**
* A ObjectSelectionModel
backed by a ListSelectionModel
.
*/
public class ListObjectSelectionModel extends ObjectSelectionModel {
/**
* The backing list selection model.
*/
final ListSelectionModel listSelectionModel;
/**
* Translates list indices to objects.
*/
final ListToObjectTranslator translator;
/**
* Construct an object selection model from the given list selection model. The selection mode is set to match the
* list's mode and the current selection is copied into the object selection model.
*
* @param listSelectionModel
* the list selection model
*/
public ListObjectSelectionModel(ListSelectionModel listSelectionModel, ListToObjectTranslator translator) {
if (listSelectionModel == null) throw new IllegalArgumentException("listSelectionModel"); //$NON-NLS-1$
if (translator == null) throw new IllegalArgumentException("translator"); //$NON-NLS-1$
this.listSelectionModel = listSelectionModel;
this.translator = translator;
this.listSelectionModel.addListSelectionListener(new MyListSelectionListener());
}
public static abstract class ListToObjectTranslator {
protected ListToObjectTranslator() {
//do nothing
}
public abstract IAdaptable getAdaptable(int index);
public abstract SelectedObject getSelectedObject(int index);
}
class MyListSelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event) {
List newSelection = new ArrayList();
if (event.getValueIsAdjusting()) return;
int minSelectionIndex = listSelectionModel.getMinSelectionIndex();
int maxSelectionIndex = listSelectionModel.getMaxSelectionIndex();
if (minSelectionIndex >= 0 && maxSelectionIndex >= 0) {
for (int index = minSelectionIndex; index <= maxSelectionIndex; index++) {
if (listSelectionModel.isSelectedIndex(index)) {
SelectedObject selectedObject = translator.getSelectedObject(index);
if (selectedObject != null) {
newSelection.add(selectedObject);
}
}
}
}
setSelectedAdaptables(newSelection);
}
}
}