/******************************************************************************* * Copyright (c) 2004, 2006 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; /** * Represents a group of radio buttons in a menu. Each menu item * is mapped onto a particular value. The RadioMenu reports its state * using the attached Model object. That is, Model.getState() will * return the value of the currently selected radio button and Model.setState(value) * will select the radio button associated with the given value. */ public class RadioMenu implements IChangeListener { private Model data; private Menu parent; private List items = new ArrayList(); SelectionAdapter selectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Object newState = e.widget.getData(); data.setState(newState, RadioMenu.this); } }; /** * Creates a set of radio menu items on the given menu. * * @param parent menu that will contain the menu items * @param newData the model that will store the value of the currently selected item */ public RadioMenu(Menu parent, Model newData) { this.parent = parent; this.data = newData; newData.addChangeListener(this); } /** * Returns true iff the given values are considered equal. * * @param value1 * @param value2 * @return */ private static boolean isEqual(Object value1, Object value2) { if (value1 == null) { return value2 == null; } else if (value2 == null) { return false; } return value1.equals(value2); } /** * Creates a new menu item with the given text and value. When * the item is selected, the state of the model will change to * match the given value. * * @param text * @param value */ public void addMenuItem(String text, Object value) { MenuItem newItem = new MenuItem(parent, SWT.RADIO); newItem.setSelection(isEqual(data.getState(), value)); newItem.setText(text); newItem.setData(value); items.add(newItem); newItem.addSelectionListener(selectionAdapter); } /** * Disposes all menu items */ public void dispose() { Iterator iter = items.iterator(); while (iter.hasNext()) { MenuItem next = (MenuItem) iter.next(); if (!next.isDisposed()) { next.removeSelectionListener(selectionAdapter); next.dispose(); } } items.clear(); } /** * Refreshes the selected menu items to match the current state of the model. */ private void refreshSelection() { Iterator iter = items.iterator(); while (iter.hasNext()) { MenuItem next = (MenuItem) iter.next(); if (!next.isDisposed()) { next.setSelection(isEqual(data.getState(), next.getData())); } } } /* (non-Javadoc) * @see org.eclipse.ui.internal.controls.IView#changed() */ public void update(boolean changed) { refreshSelection(); } }