/* * 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 javax.swing.AbstractButton; import org.lateralgm.util.PropertyLink; import org.lateralgm.util.PropertyMap; public class ButtonIncrementLink<K extends Enum<K>, V extends Number & Comparable<V>> extends PropertyLink<K,V> implements ActionListener { public final AbstractButton button; public final Incrementor<V> incrementor; public final V min, max; private V value; public ButtonIncrementLink(AbstractButton ab, Incrementor<V> i, V min, V max, PropertyMap<K> m, K k) { super(m,k); button = ab; incrementor = i; this.min = min; this.max = max; reset(); ab.addActionListener(this); } @Override protected void setComponent(V v) { value = min.compareTo(v) > 0 ? min : max.compareTo(v) < 0 ? max : v; V n = incrementor.increment(value); button.setEnabled(min.compareTo(n) <= 0 && max.compareTo(n) >= 0); } @Override public void remove() { super.remove(); button.removeActionListener(this); } public void actionPerformed(ActionEvent e) { V n = incrementor.increment(value); editProperty(n); } public static <K extends Enum<K>>ButtonIncrementLink<K,Integer> make(AbstractButton ab, int i, int l, PropertyMap<K> m, K k) { return new ButtonIncrementLink<K,Integer>(ab,new IntegerIncrementor(i),i < 0 ? l : Integer.MIN_VALUE,i > 0 ? l : Integer.MAX_VALUE,m,k); } public static interface Incrementor<V extends Number & Comparable<V>> { V increment(V v); } public static class IntegerIncrementor implements Incrementor<Integer> { public final int increment; public IntegerIncrementor(int i) { increment = i; } public Integer increment(Integer i) { return i + increment; } } }