package com.mattc.autotyper.gui; import com.google.common.collect.Maps; import com.mattc.autotyper.meta.SwingCompatible; import javax.swing.*; import java.util.Enumeration; import java.util.Map; // TODO Rewrite and Deprecate. Delegate this role to a more effective design. /** * A ButtonGroup designed to hold arbitrary Metadata on Button's. The data is put and * received in a similar way to Properties. In a series of Key-Value Pairs. To ensure * casting, any non-string Value must be given the Class to cast to. * * @author Matthew */ @SwingCompatible public class MetaButtonGroup extends ButtonGroup { private static final long serialVersionUID = 748697940184112105L; private static final String DEFAULT_PROPERTY = "_DEF_PROPERTY_"; private final Map<ButtonModel, Map<String, Object>> metaMap = Maps.newHashMap(); public MetaButtonGroup() { super(); } public void add(AbstractButton button, String meta) { final Map<String, Object> property = Maps.newHashMap(); property.put(DEFAULT_PROPERTY, meta); add(button, property); } public void add(AbstractButton button, Object... metaValues) { add(button, toMap(metaValues)); } public void add(AbstractButton button, Map<String, Object> metaValues) { this.metaMap.put(button.getModel(), metaValues); add(button); } public void putProperty(AbstractButton button, String key, Object val) { if (!this.metaMap.containsKey(button.getModel())) throw new IllegalArgumentException("Button Never Registered!"); this.metaMap.get(button.getModel()).put(key, val); } public <T> T getMeta(AbstractButton button, Class<T> clazz) { return getMeta(button, DEFAULT_PROPERTY, clazz); } public <T> T getMeta(AbstractButton button, String property, Class<T> clazz) { return clazz.cast(this.metaMap.get(button.getModel()).get(property)); } public <T> T getMetaForSelected(Class<T> clazz) { return getMetaForSelected(DEFAULT_PROPERTY, clazz); } public <T> T getMetaForSelected(String property, Class<T> clazz) { return clazz.cast(this.metaMap.get(getSelection()).get(property)); } public String getMetaString(AbstractButton button) { return getMetaString(button, DEFAULT_PROPERTY); } public String getMetaString(AbstractButton button, String property) { return getMeta(button, property, String.class); } public String getMetaStringForSelected() { return getMetaStringForSelected(DEFAULT_PROPERTY); } public String getMetaStringForSelected(String property) { return getMetaForSelected(property, String.class); } public void setSelectedForProperty(String key, Object val) { final Enumeration<AbstractButton> buttons = getElements(); while (buttons.hasMoreElements()) { final AbstractButton b = buttons.nextElement(); if (this.metaMap.get(b.getModel()).get(key).equals(val)) { b.setSelected(true); return; } } } private Map<String, Object> toMap(Object... values) { final Map<String, Object> map = Maps.newHashMap(); for (int i = 0; i < values.length; i += 2) { map.put((String) values[i], values[i + 1]); } return map; } }