diff --git a/sample.xml b/sample.xml
index a64a989d..dc327a8f 100644
--- a/sample.xml
+++ b/sample.xml
@@ -52,6 +52,16 @@
+
+ Immediate-write integer slider
+ Doesn't do anything either
+ 0
+ 1000
+ 12
+
+
+
+
diff --git a/src/org/openlcb/cdi/CdiRep.java b/src/org/openlcb/cdi/CdiRep.java
index 59540475..735658dc 100644
--- a/src/org/openlcb/cdi/CdiRep.java
+++ b/src/org/openlcb/cdi/CdiRep.java
@@ -98,6 +98,8 @@ public static interface IntegerRep extends Item {
public int getSize();
public boolean isSliderHint();
+ // Does the slider itself immediately write its value on change?
+ public boolean isSliderImmediate();
public int getSliderDivisions();
}
diff --git a/src/org/openlcb/cdi/jdom/JdomCdiRep.java b/src/org/openlcb/cdi/jdom/JdomCdiRep.java
index 1c69b9cc..c6e261b3 100644
--- a/src/org/openlcb/cdi/jdom/JdomCdiRep.java
+++ b/src/org/openlcb/cdi/jdom/JdomCdiRep.java
@@ -443,6 +443,18 @@ public boolean isSliderHint() {
return true;
}
+ @Override
+ public boolean isSliderImmediate() {
+ Element hints = e.getChild("hints");
+ if (hints == null) return false;
+ Element slider = hints.getChild("slider");
+ if (slider == null) return false;
+ Attribute immediate = slider.getAttribute("immediate");
+ if (immediate == null) return false;
+ if (! immediate.getValue().toLowerCase().equals("yes")) return false;
+ return true;
+ }
+
@Override
public int getSliderDivisions() {
Element hints = e.getChild("hints");
diff --git a/src/org/openlcb/cdi/swing/CdiPanel.java b/src/org/openlcb/cdi/swing/CdiPanel.java
index 4205f5f9..53786bb2 100644
--- a/src/org/openlcb/cdi/swing/CdiPanel.java
+++ b/src/org/openlcb/cdi/swing/CdiPanel.java
@@ -65,6 +65,7 @@
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
+import javax.swing.ComboBoxModel;
import javax.swing.InputVerifier;
import javax.swing.JButton;
import javax.swing.JComboBox;
@@ -1971,6 +1972,12 @@ public void actionPerformed(ActionEvent actionEvent) {
updateColor();
}
});
+ } else if (textComponent instanceof JSlider) {
+ ((JSlider) textComponent).addChangeListener(new javax.swing.event.ChangeListener(){
+ public void stateChanged(javax.swing.event.ChangeEvent e) {
+ updateColor();
+ }
+ });
}
entryListener = new PropertyChangeListener() {
@Override
@@ -2367,6 +2374,7 @@ private class IntPane extends EntryPane {
JSlider slider = null;
CdiRep.Map map = null;
private final ConfigRepresentation.IntegerEntry entry;
+ boolean first = true; // used to suppress slider output on initial change
IntPane(ConfigRepresentation.IntegerEntry e) {
@@ -2389,16 +2397,35 @@ public java.awt.Dimension getMaximumSize() {
if (entry.rep.isSliderHint()) {
// display a slider
slider = new JSlider((int)entry.rep.getMin(), (int)entry.rep.getMax());
+ slider.setOpaque(true); // so you can color it
if (entry.rep.getSliderDivisions() > 1) {
// display divisions on the slider
int divisionSpacing =
- ((int)(entry.rep.getMax()-entry.rep.getMin()))/entry.rep.getSliderDivisions();
+ (int)Math.round(
+ (entry.rep.getMax()-entry.rep.getMin()+0.0) // force float calculation
+ /entry.rep.getSliderDivisions()
+ );
slider.setMajorTickSpacing(divisionSpacing);
slider.setLabelTable(slider.createStandardLabels(divisionSpacing));
slider.setPaintTicks(true);
slider.setPaintLabels(true);
}
+
+ // (optionally) listen for changes and immediately write
+ if (entry.rep.isSliderImmediate()) {
+ slider.addChangeListener(new javax.swing.event.ChangeListener(){
+ public void stateChanged(javax.swing.event.ChangeEvent e) {
+ if (!slider.getValueIsAdjusting()) {
+ if (!first) writeDisplayTextToNode();
+ first = false;
+ }
+ }
+ });
+ }
+
textComponent = slider;
+
+ // set the tooltip to min and max values
if (entry.rep.getMin() < 0) {
slider.setToolTipText("Signed integer from "
+entry.rep.getMin()+" to "+entry.rep.getMax()
@@ -2443,7 +2470,7 @@ protected void writeDisplayTextToNode() {
} else {
// have to get key from stored map value
String entry = (String) box.getSelectedItem();
- String key = map.getKey(entry);
+ String key = map.getKey(entry);
value = Long.parseLong(key);
}
entry.setValue(value);
@@ -2461,12 +2488,21 @@ protected void updateDisplayText(@NonNull String value) {
if (! box.getSelectedItem().equals(value)) {
// not present per-se, see if need to add as reserved?
String newValue = "Reserved value: "+value;
- box.setSelectedItem(newValue);
- if ( ! box.getSelectedItem().equals(newValue)) {
+
+ ComboBoxModel model = box.getModel();
+ int size = model.getSize();
+ boolean absent = true;
+ for(int i=0;i