/* * Copyright (C) 2009 Quadduc <quadduc@gmail.com> * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.ui.swing.propertylink; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EnumMap; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.swing.AbstractButton; import javax.swing.ButtonGroup; import javax.swing.ButtonModel; import org.lateralgm.util.PropertyLink; import org.lateralgm.util.PropertyMap; import org.lateralgm.util.PropertyMap.PropertyUpdateEvent; public class ButtonGroupLink<K extends Enum<K>, V extends Enum<V>> extends PropertyLink<K,V> implements ActionListener { public final ButtonGroup group; public final V[] values; private final EnumMap<V,AbstractButton> buttons; private final Map<ButtonModel,V> buttonValues; public ButtonGroupLink(ButtonGroup g, Class<V> vt, PropertyMap<K> m, K k) { super(m,k); values = vt.getEnumConstants(); if (g.getButtonCount() != values.length) throw new IllegalArgumentException(); group = g; buttons = new EnumMap<V,AbstractButton>(vt); buttonValues = new HashMap<ButtonModel,V>(values.length); Enumeration<AbstractButton> e = g.getElements(); for (V v : values) { AbstractButton b = e.nextElement(); buttonValues.put(b.getModel(),v); buttons.put(v,b); } reset(); for (AbstractButton b : buttons.values()) b.addActionListener(this); } @Override protected void setComponent(V v) { if (v == null) group.clearSelection(); else group.setSelected(buttons.get(v).getModel(),true); } @Override public void remove() { super.remove(); for (AbstractButton b : buttons.values()) b.removeActionListener(this); } @Override public void updated(PropertyUpdateEvent<K> e) { V v = map.get(key); if (buttons.get(v).getModel() == group.getSelection()) return; editComponent(v); } public void actionPerformed(ActionEvent e) { V v = buttonValues.get(group.getSelection()); if (v == map.get(key)) return; editProperty(v); } }