From c43a4d3b4c75812aa579832596cabef2d476fd2c Mon Sep 17 00:00:00 2001 From: Bob Jacobsen Date: Mon, 16 Sep 2024 14:48:20 -0400 Subject: [PATCH 1/3] fix immediate slider; switch to ticks attribute --- src/org/openlcb/cdi/CdiRep.java | 2 +- src/org/openlcb/cdi/jdom/JdomCdiRep.java | 14 ++++----- src/org/openlcb/cdi/swing/CdiPanel.java | 30 +++++++++++-------- .../implementations/DatagramService.java | 2 +- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/org/openlcb/cdi/CdiRep.java b/src/org/openlcb/cdi/CdiRep.java index 735658dc..af1a3a72 100644 --- a/src/org/openlcb/cdi/CdiRep.java +++ b/src/org/openlcb/cdi/CdiRep.java @@ -100,7 +100,7 @@ public static interface IntegerRep extends Item { public boolean isSliderHint(); // Does the slider itself immediately write its value on change? public boolean isSliderImmediate(); - public int getSliderDivisions(); + 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..1f86638b 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,8 +2412,11 @@ 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(); + } + if (suppressExternal) suppressExternal = false; + if (suppressInternal) 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); From e5b6b6a7d4a537b85a3e85d7ba0cc1d3fe1dcb78 Mon Sep 17 00:00:00 2001 From: Bob Jacobsen Date: Thu, 24 Oct 2024 16:52:56 -0400 Subject: [PATCH 2/3] Fix immediate slider write after reload --- src/org/openlcb/cdi/swing/CdiPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/openlcb/cdi/swing/CdiPanel.java b/src/org/openlcb/cdi/swing/CdiPanel.java index 1f86638b..001b77d7 100644 --- a/src/org/openlcb/cdi/swing/CdiPanel.java +++ b/src/org/openlcb/cdi/swing/CdiPanel.java @@ -2415,9 +2415,9 @@ public void stateChanged(javax.swing.event.ChangeEvent e) { if (!suppressInternal && !suppressExternal) { writeDisplayTextToNode(); } - if (suppressExternal) suppressExternal = false; - if (suppressInternal) suppressInternal = false; } + suppressExternal = false; + suppressInternal = false; } }); } From e2a71b6e8be15517ee8c6d5224db093d4c41b69e Mon Sep 17 00:00:00 2001 From: Bob Jacobsen Date: Tue, 5 Nov 2024 16:34:55 -0500 Subject: [PATCH 3/3] Improve commenting --- src/org/openlcb/cdi/CdiRep.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/org/openlcb/cdi/CdiRep.java b/src/org/openlcb/cdi/CdiRep.java index af1a3a72..896803ef 100644 --- a/src/org/openlcb/cdi/CdiRep.java +++ b/src/org/openlcb/cdi/CdiRep.java @@ -97,9 +97,12 @@ 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(); + // Optionally specifies the 'distance' between tick marks on the slider. + // If 0 (default value), don't show tick marks. public int getSliderTickSpacing(); }