/* $Id: RadioButtonPanel.java 18783 2010-09-26 17:13:14Z bobtarling $ ******************************************************************************* * Copyright (c) 2009 Contributors - see below * 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: * Bob Tarling - Original implementation ******************************************************************************* */ package org.argouml.core.propertypanels.ui; import java.awt.Component; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collection; import java.util.Enumeration; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.border.TitledBorder; import org.argouml.model.Model; import org.argouml.core.propertypanels.model.GetterSetterManager; import org.argouml.i18n.Translator; import org.argouml.ui.LookAndFeelMgr; import org.argouml.ui.UndoableAction; import org.tigris.swidgets.FlexiGridLayout; /** * A collection of radio buttons representing the state of some UML property * on a UML element. * @author Bob Tarling */ public class RadioButtonPanel extends JPanel implements PropertyChangeListener { /** * The class uid */ private static final long serialVersionUID = -3786246432442765208L; /** * The UML element this panel represents */ private final Object umlElement; /** * The UML property this panel represents */ private final String propertyName; /** * The group of buttons */ private final ButtonGroup buttonGroup = new ButtonGroup(); /** * The getter/setter facade for accessing the model subsystem */ private final GetterSetterManager getterSetterManager; /** * Constructor for RadioButtonPanel. * @param umlElement the UML element this radio panel represents and is * listening to * @param propertyName the property name of the UML element this radio * panel represents and is listening to * @param horizontal determines the orientation * @param getterSetterManager the manager for getting and setting model * element values */ public RadioButtonPanel( final Object umlElement, final String propertyName, final boolean horizontal, final GetterSetterManager getterSetterManager) { super(true); setDoubleBuffered(true); final Collection options = getterSetterManager.getOptions(umlElement, propertyName, null); setLayout(horizontal ? new BoxLayout(this, BoxLayout.X_AXIS) : new FlexiGridLayout(0, options.size())); this.propertyName = propertyName; this.getterSetterManager = getterSetterManager; this.umlElement = umlElement; final Font font = LookAndFeelMgr.getInstance().getStandardFont(); final String label = Translator.localize("label." + propertyName); if (label != null) { TitledBorder border = new TitledBorder(label); border.setTitleFont(font); setBorder(border); } Action action = new SetAction(getterSetterManager, umlElement, propertyName); buttonGroup.add(new JRadioButton()); for (Object option : options) { final String optionLabel = Translator.localize("label." + propertyName + "-" + option); final JRadioButton button = new JRadioButton(optionLabel); button.addActionListener(action); button.setActionCommand((String) option); button.setFont(font); button.setName((String) option); buttonGroup.add(button); add(button); } build(); Model.getPump().addModelEventListener( this, umlElement, propertyName); } /** * Remove listeners when this component is removed */ public void removeNotify() { Model.getPump().removeModelEventListener( this, umlElement, propertyName); final Enumeration<AbstractButton> en = buttonGroup.getElements(); en.nextElement(); while (en.hasMoreElements()) { JRadioButton b = (JRadioButton) en.nextElement(); b.removeActionListener(b.getAction()); } } private GetterSetterManager getGetterSetter() { return getterSetterManager; } public void setEnabled(boolean enabled) { for (final Component component : getComponents()) { component.setEnabled(enabled); } } /* * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals(propertyName)) { build(); } } private void build() { final String value = (String) getGetterSetter().get(umlElement, propertyName, null); final Enumeration<AbstractButton> en = buttonGroup.getElements(); if (value == null) { en.nextElement().setSelected(true); return; } while (en.hasMoreElements()) { AbstractButton b = en.nextElement(); if (value.equals(b.getActionCommand())) { b.setSelected(true); break; } } } /** * This action sets the Visibility of a ModelElement. * Next to a ModelElement, this also works for an * ElementResidence and ElementImport. * * @author jaap.branderhorst@xs4all.nl * @since Jan 4, 2003 */ private static class SetAction extends UndoableAction { private final GetterSetterManager getterSetter; private final String propertyName; private Object modelElement; /** * Constructor for ActionSetElementOwnershipSpecification. */ protected SetAction( final GetterSetterManager getterSetter, final Object modelElement, final String propertyName) { this.modelElement = modelElement; this.getterSetter = getterSetter; this.propertyName = propertyName; } /* * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { super.actionPerformed(e); JRadioButton source = (JRadioButton) e.getSource(); getterSetter.set( modelElement, source.getActionCommand(), propertyName); } } }