| /******************************************************************************* |
| * Copyright (c) 2008-2011 Chair for Applied Software Engineering, |
| * Technische Universitaet Muenchen. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| ******************************************************************************/ |
| package org.eclipse.emf.ecp.common.utilities; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.List; |
| |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.widgets.Combo; |
| import org.eclipse.swt.widgets.Composite; |
| |
| /** |
| * A combo view is a wrapper around a graphical SWT combo element. It provides type-safe retrieval of the selected |
| * element and allows to easily track selection changes. While a combo only allows String values, this view allows |
| * arbitrary values in the model. The combo view is a wrapper for combo, comparable to JFace wrappers (like TreeView |
| * wrapping Tree). It supports LabelProviders but no ContentProviders. Only the text, not the image, is taken from the |
| * label provider, since the combo object does not support images. |
| * |
| * @author jfinis |
| * @param <T> the type of elements in the combo. |
| */ |
| public class ComboView<T> { |
| |
| /** |
| * Listener to track selection changed events. |
| * |
| * @author helming |
| * @param <T> |
| */ |
| public interface IComboChangeListener<T> { |
| /** |
| * called if the selection of the combobox is changed. |
| * |
| * @param newSelection the new selection |
| */ |
| void selectionChanged(T newSelection); |
| } |
| |
| /** |
| * The SWT Combo element wrapped by this class. |
| */ |
| private final Combo combo; |
| |
| /** |
| * The index map, that associates indices with the objects behind them. |
| */ |
| private HashMap<Integer, T> map = new HashMap<Integer, T>(); |
| |
| /** |
| * The element that was selected last. |
| */ |
| private T lastSelection; |
| |
| /** |
| * Selection listener for convenient selection change listening. |
| */ |
| private SelectionListener listener; |
| |
| /** |
| * The currently used label Provider. |
| */ |
| private ILabelProvider labelProvider; |
| |
| /** |
| * The list of listeners. |
| */ |
| private List<IComboChangeListener<? super T>> changeListeners = new ArrayList<IComboChangeListener<? super T>>(); |
| |
| /** |
| * Default constructor creating a combo box set from a SWT combo element. |
| * |
| * @param combo the combo element wrapped by this combo box set |
| */ |
| public ComboView(Combo combo) { |
| this.combo = combo; |
| listener = new SelectionAdapter() { |
| |
| /** |
| * saves the selection and fires an onSelectionChange event. |
| */ |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| T newSelection = map.get(ComboView.this.combo.getSelectionIndex()); |
| if (newSelection != lastSelection) { |
| lastSelection = newSelection; |
| for (IComboChangeListener<? super T> listener : changeListeners) { |
| listener.selectionChanged(newSelection); |
| } |
| } |
| } |
| }; |
| combo.addSelectionListener(listener); |
| } |
| |
| /** |
| * Creates a new combo box set and the wrapped combo element. |
| * |
| * @param parent the paren composite |
| * @param style the SWT style |
| */ |
| public ComboView(Composite parent, int style) { |
| this(new Combo(parent, style)); |
| } |
| |
| /** |
| * Sets the input of this combo box. Will have the first element selected by default. and will not fire a selection |
| * changed event. |
| * |
| * @param entries the entries shown in the combobox |
| */ |
| public void setInput(Collection<? extends T> entries) { |
| setInput(entries, null, false); |
| } |
| |
| /** |
| * Sets the input for this combo box You can set which of the entries is selected by choosing one as default entry. |
| * |
| * @param entries entries in the box |
| * @param defaultEntry the default selected entry |
| * @param fireSelectionChangeEvents if a selection change event should be fired |
| */ |
| public void setInput(Collection<? extends T> entries, T defaultEntry, boolean fireSelectionChangeEvents) { |
| String[] labels = new String[entries.size()]; |
| int selection = 0; |
| int i = 0; |
| for (T e : entries) { |
| String label; |
| if (labelProvider == null) { |
| label = String.valueOf(e); |
| } else { |
| label = labelProvider.getText(e); |
| } |
| map.put(i, e); |
| labels[i] = label; |
| if (e.equals(defaultEntry)) { |
| selection = i; |
| } |
| i++; |
| } |
| |
| // If we do not want to fire selection change events, we make sure that the |
| // selection does not change by setting it to the new value |
| // Since the selection function checks for a changing selection, this will |
| // suppress any change event. |
| if (!fireSelectionChangeEvents) { |
| lastSelection = map.get(selection); |
| } |
| combo.setItems(labels); |
| combo.select(selection); |
| listener.widgetSelected(null); // fire selection events |
| |
| } |
| |
| /** |
| * Returns the currently selected element. |
| * |
| * @return the current selection |
| */ |
| public T getSelection() { |
| // If the combo element is already disposed we return the last selection |
| if (combo.isDisposed()) { |
| return lastSelection; |
| } |
| int index = combo.getSelectionIndex(); |
| if (index == -1) { |
| return null; |
| } |
| return map.get(index); |
| } |
| |
| /** |
| * Sets the label provider to be used to display elements. |
| * |
| * @param labelProvider label provider to be used. |
| */ |
| public void setLabelProvider(ILabelProvider labelProvider) { |
| this.labelProvider = labelProvider; |
| } |
| |
| /** |
| * . |
| * |
| * @return the currently used label provider. |
| */ |
| public ILabelProvider getLabelProvider() { |
| return labelProvider; |
| } |
| |
| /** |
| * Returns the combo element wrapped by this object. |
| * |
| * @return the wrapped combo element |
| */ |
| public Combo getControl() { |
| return combo; |
| } |
| |
| /** |
| * Adds a listener that is notified whenever the selection changes. |
| * |
| * @param listener the listener. |
| */ |
| public void addSelectionChangedListener(IComboChangeListener<? super T> listener) { |
| changeListeners.add(listener); |
| } |
| |
| /** |
| * Adds a listener that is notified whenever the selection changes. |
| * |
| * @param listener the listener. |
| */ |
| public void removeSelectionChangedListener(IComboChangeListener<? super T> listener) { |
| changeListeners.remove(listener); |
| } |
| |
| } |