From 8103baffae662037615f65cdc969e3342cc4273e Mon Sep 17 00:00:00 2001 From: Bob Jacobsen Date: Thu, 5 Sep 2024 18:44:18 -0400 Subject: [PATCH 1/4] add hex input support --- src/org/openlcb/swing/MemorySpaceSelector.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/org/openlcb/swing/MemorySpaceSelector.java b/src/org/openlcb/swing/MemorySpaceSelector.java index d933c13d..00db7e09 100644 --- a/src/org/openlcb/swing/MemorySpaceSelector.java +++ b/src/org/openlcb/swing/MemorySpaceSelector.java @@ -24,7 +24,7 @@ public class MemorySpaceSelector extends JTextField { */ public MemorySpaceSelector(int initialValue) { super(); - setText(""+initialValue); + setText("0x"+Integer.toHexString(initialValue).toUpperCase()); } /** @@ -39,7 +39,15 @@ public MemorySpaceSelector() { * */ public int getMemorySpace() { - int value = Integer.parseInt(getText()); + int value = 0; + String input = getText().trim().toLowerCase(); + if (input.startsWith("0x")) { + // hexadecimal case + value = Integer.parseInt(input.substring(2), 16); + } else { + // decimal case + value = Integer.parseInt(input); + } if (value < 0 ) { value = 0; setText(""+value); From 660e0ac9b33080642e078313a6092aa88a729de2 Mon Sep 17 00:00:00 2001 From: Bob Jacobsen Date: Thu, 5 Sep 2024 18:44:55 -0400 Subject: [PATCH 2/4] make it clearer that input is hex --- src/org/openlcb/swing/memconfig/MemConfigReadWritePane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/openlcb/swing/memconfig/MemConfigReadWritePane.java b/src/org/openlcb/swing/memconfig/MemConfigReadWritePane.java index d75e0ada..69c69094 100644 --- a/src/org/openlcb/swing/memconfig/MemConfigReadWritePane.java +++ b/src/org/openlcb/swing/memconfig/MemConfigReadWritePane.java @@ -52,7 +52,7 @@ void addLine(JComponent j, String name) { JTextField writeDataField = new JTextField(80); JTextField configNumberField = new JTextField("40"); JTextField configAddressField = new JTextField("000000"); - MemorySpaceSelector addrSpace = new MemorySpaceSelector(255); + MemorySpaceSelector addrSpace = new MemorySpaceSelector(0xfF); /** * To be invoked after Swing component installation is complete, From 9e058fce570f355c269c757c99fb7fbcab887ef1 Mon Sep 17 00:00:00 2001 From: Bob Jacobsen Date: Thu, 5 Sep 2024 18:45:40 -0400 Subject: [PATCH 3/4] add immediate mode to CDI slider --- sample.xml | 10 ++++++++++ src/org/openlcb/cdi/CdiRep.java | 2 ++ src/org/openlcb/cdi/jdom/JdomCdiRep.java | 12 ++++++++++++ src/org/openlcb/cdi/swing/CdiPanel.java | 10 ++++++++++ 4 files changed, 34 insertions(+) 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..272fb8af 100644 --- a/src/org/openlcb/cdi/swing/CdiPanel.java +++ b/src/org/openlcb/cdi/swing/CdiPanel.java @@ -2397,6 +2397,16 @@ public java.awt.Dimension getMaximumSize() { 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()) { + writeDisplayTextToNode(); + } + } + }); + } } textComponent = slider; if (entry.rep.getMin() < 0) { From b94e1685e2f75e25be09f0749772ce610c60e59e Mon Sep 17 00:00:00 2001 From: Bob Jacobsen Date: Wed, 11 Sep 2024 09:13:06 +0200 Subject: [PATCH 4/4] drop 1st write from slider, when default set --- src/org/openlcb/cdi/swing/CdiPanel.java | 57 ++++++++++++++++++------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/src/org/openlcb/cdi/swing/CdiPanel.java b/src/org/openlcb/cdi/swing/CdiPanel.java index 272fb8af..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,26 +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()) { - writeDisplayTextToNode(); - } + } + + // (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() @@ -2453,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); @@ -2471,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