package com.mattc.autotyper.gui.fx;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup;
import com.google.common.collect.Maps;
import com.mattc.autotyper.meta.FXCompatible;
import java.util.Map;
import java.util.Map.Entry;
@FXCompatible
public class MetaToggleGroup extends ToggleGroup {
private static final String DEFAULT_PROPERTY = "_DEF_PROPERTY_";
private final Map<Toggle, Map<String, Object>> metaMap = Maps.newHashMap();
public void add(Toggle button, Object meta) {
final Map<String, Object> property = Maps.newHashMap();
property.put(DEFAULT_PROPERTY, meta);
this.add(button, property);
}
public void add(Toggle button, Object... metaValues) {
this.add(button, toMap(metaValues));
}
public void add(Toggle button, Map<String, Object> metaValues) {
this.metaMap.put(button, metaValues);
super.getToggles().add(button);
}
public void putProperty(Toggle button, String key, Object val) {
if (!this.metaMap.containsKey(button)) throw new IllegalArgumentException("Button Never Registered!");
this.metaMap.get(button).put(key, val);
}
public <T> T getMeta(Toggle button, Class<T> clazz) {
return getMeta(button, DEFAULT_PROPERTY, clazz);
}
public <T> T getMeta(Toggle button, String property, Class<T> clazz) {
return clazz.cast(this.metaMap.get(button).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(getSelectedToggle()).get(property));
}
public String getMetaString(Toggle button) {
return getMetaString(button, DEFAULT_PROPERTY);
}
public String getMetaString(Toggle 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) {
for (final Toggle b : getToggles()) {
if (this.metaMap.get(b).get(key).equals(val)) {
selectToggle(b);
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;
}
private Map<Toggle, Object> toToggleMap(Object... values) {
final Map<Toggle, Object> map = Maps.newHashMap();
for (int i = 0; i < values.length; i += 2) {
map.put((Toggle) values[i], values[i + 1]);
}
return map;
}
public static void addTogglesToGroup(MetaToggleGroup group, Map<Toggle, Object> defaultProps) {
for (final Entry<Toggle, Object> tProp : defaultProps.entrySet()) {
group.add(tProp.getKey(), tProp.getValue());
}
}
public static void addTogglesToGroup(MetaToggleGroup group, Object... defaultProps) {
addTogglesToGroup(group, group.toToggleMap(defaultProps));
}
}