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); } } }