diff --git a/src/org/openlcb/cdi/CdiRep.java b/src/org/openlcb/cdi/CdiRep.java index 735658dc..896803ef 100644 --- a/src/org/openlcb/cdi/CdiRep.java +++ b/src/org/openlcb/cdi/CdiRep.java @@ -97,10 +97,13 @@ public static interface IntegerRep extends Item { public int getSize(); + // Did the CDI content hint that this value should be presented as a slider? public boolean isSliderHint(); - // Does the slider itself immediately write its value on change? + // Should the slider itself immediately write its value on change? public boolean isSliderImmediate(); - public int getSliderDivisions(); + // Optionally specifies the 'distance' between tick marks on the slider. + // If 0 (default value), don't show tick marks. + public int getSliderTickSpacing(); } public static interface BitRep extends Item { diff --git a/src/org/openlcb/cdi/jdom/JdomCdiRep.java b/src/org/openlcb/cdi/jdom/JdomCdiRep.java index c6e261b3..fe61c449 100644 --- a/src/org/openlcb/cdi/jdom/JdomCdiRep.java +++ b/src/org/openlcb/cdi/jdom/JdomCdiRep.java @@ -456,16 +456,16 @@ public boolean isSliderImmediate() { } @Override - public int getSliderDivisions() { + public int getSliderTickSpacing() { Element hints = e.getChild("hints"); - if (hints == null) return 1; + if (hints == null) return 0; Element slider = hints.getChild("slider"); - if (slider == null) return 1; - Attribute divisions = slider.getAttribute("divisions"); - if (divisions == null) return 1; + if (slider == null) return 0; + Attribute tickSpacing = slider.getAttribute("tickSpacing"); + if (tickSpacing == null) return 0; try { - return divisions.getIntValue(); - } catch (org.jdom2.DataConversionException e) { return 1; } + return tickSpacing.getIntValue(); + } catch (org.jdom2.DataConversionException e) { return 0; } } } diff --git a/src/org/openlcb/cdi/swing/CdiPanel.java b/src/org/openlcb/cdi/swing/CdiPanel.java index 53786bb2..001b77d7 100644 --- a/src/org/openlcb/cdi/swing/CdiPanel.java +++ b/src/org/openlcb/cdi/swing/CdiPanel.java @@ -2374,7 +2374,8 @@ 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 + boolean suppressExternal = false; // used to suppress slider output when changed from read + boolean suppressInternal = false; // used to suppress slider output when changed internally IntPane(ConfigRepresentation.IntegerEntry e) { @@ -2398,15 +2399,10 @@ public java.awt.Dimension getMaximumSize() { // 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) { + if (entry.rep.getSliderTickSpacing() > 1) { // display divisions on the slider - int divisionSpacing = - (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.setMajorTickSpacing(entry.rep.getSliderTickSpacing()); + slider.setLabelTable(slider.createStandardLabels(entry.rep.getSliderTickSpacing())); slider.setPaintTicks(true); slider.setPaintLabels(true); } @@ -2416,9 +2412,12 @@ public java.awt.Dimension getMaximumSize() { slider.addChangeListener(new javax.swing.event.ChangeListener(){ public void stateChanged(javax.swing.event.ChangeEvent e) { if (!slider.getValueIsAdjusting()) { - if (!first) writeDisplayTextToNode(); - first = false; + if (!suppressInternal && !suppressExternal) { + writeDisplayTextToNode(); + } } + suppressExternal = false; + suppressInternal = false; } }); } @@ -2466,6 +2465,7 @@ protected void writeDisplayTextToNode() { value = Long.parseLong(textField.getText()); } else if (slider != null) { // get value from current slider position + suppressInternal = true; // will be set false once change works through value = slider.getValue(); } else { // have to get key from stored map value @@ -2473,6 +2473,7 @@ protected void writeDisplayTextToNode() { String key = map.getKey(entry); value = Long.parseLong(key); } + suppressExternal = true; // will be reset when the change returns entry.setValue(value); _changeMade = true; notifyTabColorRefresh(); @@ -2481,7 +2482,10 @@ protected void writeDisplayTextToNode() { @Override protected void updateDisplayText(@NonNull String value) { if (textField != null) textField.setText(value); - if (slider != null) slider.setValue(Integer.parseInt(value)); + if (slider != null) { + suppressInternal = true; + slider.setValue(Integer.parseInt(value)); + } if (box != null) { // check to see if item exists box.setSelectedItem(value); @@ -2576,7 +2580,7 @@ void updateWriteButton() { } static final int MAX_SINGLE_LINE_ENTRY = 64; // somewhat arbitrary max length of single-line entry - private class StringPane extends EntryPane { + private class StringPane extends EntryPane { JTextComponent textField; private final ConfigRepresentation.StringEntry entry; diff --git a/src/org/openlcb/implementations/DatagramService.java b/src/org/openlcb/implementations/DatagramService.java index 17661598..caf3bb94 100644 --- a/src/org/openlcb/implementations/DatagramService.java +++ b/src/org/openlcb/implementations/DatagramService.java @@ -67,7 +67,7 @@ public DatagramService(NodeID here, Connection downstream) { */ public void sendData(DatagramServiceTransmitMemo memo) { if (xmtMemo != null) { - logger.log(Level.SEVERE, "Overriding datagram transmit memo. old {0} new {1}", new Object[]{xmtMemo, memo}); //log + logger.log(Level.SEVERE, "Overriding datagram transmit memo. old {0} new {1}", new Object[]{xmtMemo, memo}); } xmtMemo = memo; Message m = new DatagramMessage(here, memo.dest, memo.data);