/*
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and above are dual-licensed
* under the Eclipse Public License (EPL), which is available at
* http://www.eclipse.org/legal/epl-v10.html and the GNU Lesser General Public
* License (LGPL), which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors: XMind Ltd. - initial API and implementation
*/
package net.xmind.share.dialog;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
public class RadioInfoFieldGroup implements ISelectionProvider {
private Group group;
private List<Button> buttons = new ArrayList<Button>();
private boolean grabVerticalSpace;
private ISelectionChangedListener listener;
public RadioInfoFieldGroup(boolean grabVerticalSpace) {
this.grabVerticalSpace = grabVerticalSpace;
}
public void fill(Composite parent) {
group = new Group(parent, SWT.NONE);
group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
grabVerticalSpace));
GridLayout layout = new GridLayout();
layout.marginWidth = 5;
layout.marginHeight = 5;
layout.verticalSpacing = 3;
layout.horizontalSpacing = 0;
group.setLayout(layout);
}
public void setName(String name) {
group.setText(name == null ? "" : name); //$NON-NLS-1$
}
public String getName() {
if (group == null || group.isDisposed())
return ""; //$NON-NLS-1$
return group.getText();
}
public Group getNameWidget() {
return group;
}
public boolean isDisposed() {
return group.isDisposed();
}
public void setFocus() {
if (!group.setFocus()) {
if (!buttons.isEmpty()) {
buttons.get(0).setFocus();
}
}
}
public Button addOption(final Object value, String label) {
final Button button = new Button(group, SWT.RADIO | SWT.WRAP);
button.setText(label);
button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
button.setData(value);
if (buttons.isEmpty())
button.setSelection(true);
buttons.add(button);
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (button.getSelection()) {
fireSelectionChanged(value);
}
}
});
return button;
}
protected void fireSelectionChanged(Object value) {
if (listener != null) {
listener.selectionChanged(new SelectionChangedEvent(this,
getSelection()));
}
}
public Object getSelectedValue() {
for (Button button : buttons) {
if (button.getSelection())
return button.getData();
}
return null;
}
public void setSelectedValue(Object value) {
for (Button button : buttons) {
button.setSelection(equals(value, button.getData()));
}
}
private static boolean equals(Object o1, Object o2) {
return o1 == o2 || (o1 != null && o1.equals(o2));
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
this.listener = listener;
}
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
if (listener == this.listener)
this.listener = null;
}
public void setSelection(ISelection selection) {
setSelectedValue(((IStructuredSelection) selection).getFirstElement());
}
public ISelection getSelection() {
return new StructuredSelection(getSelectedValue());
}
}