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