/*******************************************************************************
* Copyright (c) 2008, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.runtime.ui.widgets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.eef.runtime.ui.utils.EditingUtils;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* A viewer composed of button to handles EEnum as Radio. It will display a radio for each element of the
* enum.
*
* @author <a href="mailto:stephane.bouchet@obeo.fr">Stephane Bouchet</a>
*/
public class RadioViewer extends Composite implements ISelectionProvider {
/**
* Listeners for selection changes
*/
private List<ISelectionChangedListener> listeners;
private RadioSelectionChangedListener radioSelectionChangedListener;
/**
* the map of buttons used.
*/
private Map<Object, Button> buttons;
public RadioViewer(Composite parent, int style) {
super(parent, style);
buttons = new HashMap<Object, Button>();
this.setLayout(new GridLayout());
listeners = new ArrayList<ISelectionChangedListener>();
EditingUtils.setEEFtype(this, "eef::RadioViewer");
radioSelectionChangedListener = new RadioSelectionChangedListener();
}
/**
* Clear all the graphical elements of the view
*/
private void clear() {
while (this.getChildren().length > 0) {
Control next = this.getChildren()[0];
next.dispose();
}
}
private void createButton(Object value) {
Button b = new Button(this, SWT.RADIO);
if (value instanceof Enumerator) {
b.setText(((Enumerator)value).getLiteral());
}
GridData data = new GridData(GridData.FILL_BOTH);
b.setLayoutData(data);
b.addSelectionListener(radioSelectionChangedListener);
buttons.put(value, b);
EditingUtils.setEEFtype(b, "eef::RadioViewer::radio");
if (EditingUtils.getID(this) != null)
EditingUtils.setID(b, EditingUtils.getID(this));
}
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
*/
@Override
public void setEnabled(boolean enabled) {
for (Button button : buttons.values()) {
button.setEnabled(enabled);
}
super.setEnabled(enabled);
}
/**
* @param newValue
*/
public void setSelection(ISelection selection) {
if (selection instanceof StructuredSelection) {
StructuredSelection sSelection = (StructuredSelection)selection;
Object newValue = sSelection.getFirstElement();
for (Object value : buttons.keySet()) {
buttons.get(value).setSelection(false);
if (value instanceof Enumerator && newValue instanceof Enumerator) {
if (((Enumerator)value).getValue() == ((Enumerator)newValue).getValue()) {
buttons.get(value).setSelection(true);
}
}
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
public ISelection getSelection() {
for (Object value : buttons.keySet()) {
if (buttons.get(value).getSelection())
return new StructuredSelection(value);
}
return null;
}
public void setInput(Object input) {
clear();
if (input instanceof Collection) {
for (Object value : (Collection<?>)input) {
createButton(value);
}
}
// refresh Layout
GridLayout l = (GridLayout)this.getLayout();
l.numColumns = buttons.size() == 0 ? 1 : buttons.size();
this.setLayout(l);
layout();
}
/**
* Sets the given ID to the EObjectFlatComboViewer
*
* @param id
* the id of the widget
*/
public void setID(Object id) {
EditingUtils.setID(this, id);
for (Control control : getChildren()) {
EditingUtils.setID(control, id);
}
}
/**
* @return the ID of the EObjectFlatComboViewer
*/
public Object getID() {
return EditingUtils.getID(this);
}
/**
* Sets the tooltip text for the viewer
*
* @param tooltip
* the tooltip text
*/
public void setToolTipText(String tooltip) {
for (Button button : buttons.values()) {
button.setToolTipText(tooltip);
}
}
/**
* Add a new SelectionChangedListener
*
* @param listener
* the listener to add
*/
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
/**
* remove a SelectionChanged listener
*
* @param listener
* the listener to remove
*/
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
listeners.remove(listener);
}
private class RadioSelectionChangedListener extends SelectionAdapter {
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
Object value = null;
for (Object tmp : buttons.keySet()) {
if (buttons.get(tmp).getSelection())
value = tmp;
}
if (value != null) {
for (ISelectionChangedListener listener : listeners) {
listener.selectionChanged(new SelectionChangedEvent(RadioViewer.this,
new StructuredSelection(value)));
}
}
}
}
}