Skip to content

Commit

Permalink
Merge pull request #9624 from icklesteve/BeanEditAction-tabs
Browse files Browse the repository at this point in the history
Bean edit action tabs - add persistence
  • Loading branch information
danielb987 committed Apr 1, 2021
2 parents 32bbd84 + 4869abf commit 3aea100
Show file tree
Hide file tree
Showing 11 changed files with 61 additions and 83 deletions.
1 change: 1 addition & 0 deletions java/src/jmri/jmrit/beantable/BeanTableBundle.properties
Expand Up @@ -398,6 +398,7 @@ SensorInActiveDebounce = Delay to Inactive
SensorPullUp = Pull-Up/Down
SensorPullUpCheckBox = Show Pull-Up/Down Information
SensorPullUpToolTip = Show extra columns for configuring sensor pull-up or pull-down.
SensorGlobalActiveInactiveDelays = Global Active Delay: {0}ms. Global Inactive Delay: {1}ms.

#These are used in the Signal Mast Logic
Destination = Destination
Expand Down
46 changes: 31 additions & 15 deletions java/src/jmri/jmrit/beantable/beanedit/BeanEditAction.java
Expand Up @@ -8,13 +8,15 @@
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.annotation.OverridingMethodsMustInvokeSuper;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.table.AbstractTableModel;

import jmri.*;
Expand Down Expand Up @@ -232,7 +234,7 @@ public void actionPerformed(ActionEvent e) {
return;
}
if (f == null) {
f = new JmriJFrame(Bundle.getMessage("EditBean", getBeanType(), bean.getDisplayName()), false, false);
f = new JmriJFrame(Bundle.getMessage("EditBean", bean.getBeanType(), bean.getDisplayName()), false, false);
f.addHelpMenu(helpTarget(), true);
applyBut = new JButton(Bundle.getMessage("ButtonApply")); // create before initPanels()
java.awt.Container containerPanel = f.getContentPane();
Expand Down Expand Up @@ -279,6 +281,7 @@ public void actionPerformed(ActionEvent e) {
for (BeanItemPanel bi : bei) {
bi.resetField();
}
persistSelectedTab(); // use persistence unless specified by overriding class
if (selectedTab != null) {
detailsTab.setSelectedComponent(selectedTab);
}
Expand All @@ -292,6 +295,25 @@ public void windowClosing(java.awt.event.WindowEvent e) {
f.setVisible(true);
}

/**
* Selects previously selected Tab Index for override class name.
* Adds listener when Tab changed update UI preference.
*/
private void persistSelectedTab(){
String TAB_SELECT_STRING = "selectedTabIndex"; // NOI18N
Object obj = InstanceManager.getDefault(UserPreferencesManager.class)
.getProperty(getClass().getName(), TAB_SELECT_STRING);
int previoustab = (obj!=null ? (Integer) obj : 0);
// make sure that valid index selected in case a tab is removed in future.
detailsTab.setSelectedIndex(Math.max(Math.min(detailsTab.getTabCount()-1, previoustab),0));
// add listener
detailsTab.getModel().addChangeListener((ChangeEvent evt) -> {
InstanceManager.getDefault(UserPreferencesManager.class)
.setProperty(getClass().getName(), TAB_SELECT_STRING, detailsTab.getSelectedIndex());
});

}

protected void applyButtonAction(ActionEvent e) {
save();
}
Expand Down Expand Up @@ -384,7 +406,7 @@ void formatTextAreaAsLabel(JTextPane pane) {
}

public void save() {
String feedback = Bundle.getMessage("ItemUpdateFeedback", getBeanType())
String feedback = Bundle.getMessage("ItemUpdateFeedback", bean.getBeanType())
+ " " + bean.getDisplayName(DisplayOptions.USERNAME_SYSTEMNAME);
// provide feedback to user, can be overwritten by save action error handler
statusBar.setText(feedback);
Expand All @@ -407,12 +429,6 @@ static boolean validateNumericalInput(String text) {

NamedBeanHandleManager nbMan = InstanceManager.getDefault(NamedBeanHandleManager.class);

/**
* Get Human Readable form of Bean Type.
* @return localised single Bean type String.
*/
abstract protected String getBeanType();

abstract protected B getByUserName(String name);

/**
Expand All @@ -437,7 +453,7 @@ public void renameBean(String _newName) {
String msg;
msg = java.text.MessageFormat.format(Bundle.getMessage("WarningUserName"),
new Object[]{("" + value)});
JOptionPane.showMessageDialog(null, msg,
JOptionPane.showMessageDialog(f, msg,
Bundle.getMessage("WarningTitle"),
JOptionPane.ERROR_MESSAGE);
return;
Expand All @@ -451,8 +467,8 @@ public void renameBean(String _newName) {
return;
}
String msg = Bundle.getMessage("UpdateToUserName",
new Object[]{getBeanType(), value, nBean.getSystemName()});
int optionPane = JOptionPane.showConfirmDialog(null,
new Object[]{nBean.getBeanType(), value, nBean.getSystemName()});
int optionPane = JOptionPane.showConfirmDialog(f,
msg, Bundle.getMessage("UpdateToUserNameTitle"),
JOptionPane.YES_NO_OPTION);
if (optionPane == JOptionPane.YES_OPTION) {
Expand Down Expand Up @@ -480,8 +496,8 @@ public void renameBean(String _newName) {
public void removeName() {
if (!allowBlockNameChange("Remove", "")) return; // NOI18N
String msg = java.text.MessageFormat.format(Bundle.getMessage("UpdateToSystemName"),
new Object[]{getBeanType()});
int optionPane = JOptionPane.showConfirmDialog(null,
new Object[]{bean.getBeanType()});
int optionPane = JOptionPane.showConfirmDialog(f,
msg, Bundle.getMessage("UpdateToSystemNameTitle"),
JOptionPane.YES_NO_OPTION);
if (optionPane == JOptionPane.YES_OPTION) {
Expand Down Expand Up @@ -510,15 +526,15 @@ boolean allowBlockNameChange(String changeType, String newName) {
// Remove is not allowed if there is a layout block
if (changeType.equals("Remove")) {
log.warn("Cannot remove user name for block {}", oldName); // NOI18N
JOptionPane.showMessageDialog(null,
JOptionPane.showMessageDialog(f,
Bundle.getMessage("BlockRemoveUserNameWarning", oldName), // NOI18N
Bundle.getMessage("WarningTitle"), // NOI18N
JOptionPane.WARNING_MESSAGE);
return false;
}

// Confirmation dialog
int optionPane = JOptionPane.showConfirmDialog(null,
int optionPane = JOptionPane.showConfirmDialog(f,
Bundle.getMessage("BlockChangeUserName", oldName, newName), // NOI18N
Bundle.getMessage("QuestionTitle"), // NOI18N
JOptionPane.YES_NO_OPTION);
Expand Down
6 changes: 0 additions & 6 deletions java/src/jmri/jmrit/beantable/beanedit/BlockEditAction.java
@@ -1,7 +1,6 @@
package jmri.jmrit.beantable.beanedit;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

Expand Down Expand Up @@ -39,11 +38,6 @@ protected void initPanels() {
physicalDetails();
}

@Override
public String getBeanType() {
return Bundle.getMessage("BeanNameBlock");
}

@Override
public Block getByUserName(String name) {
return InstanceManager.getDefault(BlockManager.class).getByUserName(name);
Expand Down
5 changes: 0 additions & 5 deletions java/src/jmri/jmrit/beantable/beanedit/LightEditAction.java
Expand Up @@ -32,11 +32,6 @@ protected void initPanels() {
applyBut.setToolTipText(Bundle.getMessage("LightUpdateButtonHint"));
}

@Override
public String getBeanType() {
return Bundle.getMessage("BeanNameLight");
}

@Override
public String helpTarget() {
return "package.jmri.jmrit.beantable.LightAddEdit";
Expand Down
5 changes: 0 additions & 5 deletions java/src/jmri/jmrit/beantable/beanedit/OBlockEditAction.java
Expand Up @@ -55,11 +55,6 @@ protected void initPanels() {
physicalDetails();
}

@Override
public String getBeanType() {
return Bundle.getMessage("BeanNameOBlock");
}

@Override
public OBlock getByUserName(String name) {
return InstanceManager.getDefault(OBlockManager.class).getByUserName(name);
Expand Down
@@ -1,14 +1,15 @@
package jmri.jmrit.beantable.beanedit;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JCheckBox;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

import jmri.InstanceManager;
import jmri.Sensor;
import jmri.SensorManager;

/**
* Provides an edit panel for a sensor debounce object.
Expand All @@ -26,19 +27,14 @@ public String helpTarget() {
return "package.jmri.jmrit.beantable.SensorAddEdit";
} // NOI18N

@Override
public String getBeanType() {
return Bundle.getMessage("BeanNameSensor");
}

@Override
public Sensor getByUserName(String name) {
return InstanceManager.sensorManagerInstance().getByUserName(name);
}

JCheckBox sensorDebounceGlobalCheck = new JCheckBox();
JSpinner sensorDebounceInactiveSpinner = new JSpinner();
JSpinner sensorDebounceActiveSpinner = new JSpinner();
private final JCheckBox sensorDebounceGlobalCheck = new JCheckBox();
private final JSpinner sensorDebounceInactiveSpinner = new JSpinner();
private final JSpinner sensorDebounceActiveSpinner = new JSpinner();

@Override
protected void initPanels() {
Expand All @@ -61,31 +57,24 @@ public BeanItemPanel sensorDebounce(BeanItemPanel basic) {
basic.setName(Bundle.getMessage("SensorDebounce"));
}

sensorDebounceGlobalCheck.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (sensorDebounceGlobalCheck.isSelected()) {
sensorDebounceInactiveSpinner.setEnabled(false);
sensorDebounceActiveSpinner.setEnabled(false);
} else {
sensorDebounceInactiveSpinner.setEnabled(true);
sensorDebounceActiveSpinner.setEnabled(true);
}
}
sensorDebounceGlobalCheck.addActionListener((ActionEvent e) -> {
sensorDebounceInactiveSpinner.setEnabled(!sensorDebounceGlobalCheck.isSelected());
sensorDebounceActiveSpinner.setEnabled(!sensorDebounceGlobalCheck.isSelected());
});

basic.addItem(new BeanEditItem(null, null, Bundle.getMessage("SensorDebounceText")));
basic.addItem(new BeanEditItem(sensorDebounceGlobalCheck, Bundle.getMessage("SensorDebounceUseGlobalText"), null));
sensorDebounceInactiveSpinner.setModel(
new SpinnerNumberModel((Long)0L, (Long)0L, Sensor.MAX_DEBOUNCE, (Long)1L)); // MAX_DEBOUNCE is a Long; casts are to force needed signature
// sensorDebounceInactiveSpinner.setValue(0); // reset from possible previous use
sensorDebounceInactiveSpinner.setPreferredSize(new JTextField(Long.toString(Sensor.MAX_DEBOUNCE).length()+1).getPreferredSize());
basic.addItem(new BeanEditItem(sensorDebounceInactiveSpinner, Bundle.getMessage("SensorInActiveDebounce"), Bundle.getMessage("SensorInActiveDebounceText")));
sensorDebounceActiveSpinner.setModel(
new SpinnerNumberModel((Long)0L, (Long)0L, Sensor.MAX_DEBOUNCE, (Long)1L)); // MAX_DEBOUNCE is a Long; casts are to force needed signature
// sensorDebounceActiveSpinner.setValue(0); // reset from possible previous use
sensorDebounceActiveSpinner.setPreferredSize(new JTextField(Long.toString(Sensor.MAX_DEBOUNCE).length()+1).getPreferredSize());

basic.addItem(new BeanEditItem(null, null, Bundle.getMessage("SensorDebounceText")));
basic.addItem(new BeanEditItem(sensorDebounceGlobalCheck, Bundle.getMessage("SensorDebounceUseGlobalText"), Bundle.getMessage("SensorGlobalActiveInactiveDelays",
InstanceManager.getDefault(SensorManager.class).getDefaultSensorDebounceGoingActive(),
InstanceManager.getDefault(SensorManager.class).getDefaultSensorDebounceGoingInActive())));
basic.addItem(new BeanEditItem(sensorDebounceActiveSpinner, Bundle.getMessage("SensorActiveDebounce"), Bundle.getMessage("SensorActiveDebounceText")));
basic.addItem(new BeanEditItem(sensorDebounceInactiveSpinner, Bundle.getMessage("SensorInActiveDebounce"), Bundle.getMessage("SensorInActiveDebounceText")));

basic.setSaveItem(new AbstractAction() {
@Override
Expand Down Expand Up @@ -123,15 +112,12 @@ protected void resetDebounceItems(ActionEvent e) {
}
enabled(true);
sensorDebounceGlobalCheck.setSelected(bean.getUseDefaultTimerSettings());
if (bean.getUseDefaultTimerSettings()) {
sensorDebounceActiveSpinner.setEnabled(false);
sensorDebounceInactiveSpinner.setEnabled(false);
} else {
sensorDebounceActiveSpinner.setEnabled(true);
sensorDebounceInactiveSpinner.setEnabled(true);
}
sensorDebounceActiveSpinner.setValue(Long.valueOf(bean.getSensorDebounceGoingActiveTimer())); // as long
sensorDebounceInactiveSpinner.setValue(Long.valueOf(bean.getSensorDebounceGoingInActiveTimer()));

sensorDebounceActiveSpinner.setEnabled(!bean.getUseDefaultTimerSettings());
sensorDebounceInactiveSpinner.setEnabled(!bean.getUseDefaultTimerSettings());

sensorDebounceActiveSpinner.setValue(bean.getSensorDebounceGoingActiveTimer()); // as long
sensorDebounceInactiveSpinner.setValue(bean.getSensorDebounceGoingInActiveTimer());
}

public void enabled(Boolean boo) {
Expand Down
5 changes: 0 additions & 5 deletions java/src/jmri/jmrit/beantable/beanedit/SensorEditAction.java
Expand Up @@ -31,11 +31,6 @@ protected void initPanels() {
bei.add(pullup.sensorPullUp(null));
}

@Override
public String getBeanType() {
return Bundle.getMessage("BeanNameSensor");
}

@Override
public Sensor getByUserName(String name) {
return InstanceManager.sensorManagerInstance().getByUserName(name);
Expand Down
Expand Up @@ -21,17 +21,12 @@ public String helpTarget() {
return "package.jmri.jmrit.beantable.SensorAddEdit";
} // NOI18N

@Override
public String getBeanType() {
return Bundle.getMessage("BeanNameSensor");
}

@Override
public Sensor getByUserName(String name) {
return InstanceManager.sensorManagerInstance().getByUserName(name);
}

JComboBox<Sensor.PullResistance> sensorPullUpComboBox = new JComboBox<Sensor.PullResistance>(Sensor.PullResistance.values());
JComboBox<Sensor.PullResistance> sensorPullUpComboBox = new JComboBox<>(Sensor.PullResistance.values());

@Override
protected void initPanels() {
Expand Down
5 changes: 0 additions & 5 deletions java/src/jmri/jmrit/beantable/beanedit/TurnoutEditAction.java
Expand Up @@ -45,11 +45,6 @@ protected void initPanels() {
speed();
}

@Override
public String getBeanType() {
return Bundle.getMessage("BeanNameTurnout");
}

@Override
public Turnout getByUserName(String name) {
return InstanceManager.turnoutManagerInstance().getByUserName(name);
Expand Down
Expand Up @@ -51,13 +51,16 @@ public void testServiceCalls() {
SensorDebounceEditAction t = new SensorDebounceEditAction();

Assert.assertEquals("package.jmri.jmrit.beantable.SensorAddEdit", t.helpTarget());
Assert.assertEquals("Sensor", t.getBeanType());

t.initPanels();

Sensor is1 = InstanceManager.sensorManagerInstance().newSensor("IS1", "user1");
Assert.assertEquals(is1, t.getByUserName("user1"));

// to ensure t.bean.getBeanType() equals removed method t.getBeanType()
t.setBean(is1);
Assert.assertEquals("Sensor", t.bean.getBeanType());

}

@BeforeEach
Expand Down
Expand Up @@ -52,13 +52,16 @@ public void testServiceCalls() {
SensorPullUpEditAction t = new SensorPullUpEditAction();

Assert.assertEquals("package.jmri.jmrit.beantable.SensorAddEdit", t.helpTarget());
Assert.assertEquals("Sensor", t.getBeanType());

t.initPanels();

Sensor is1 = InstanceManager.sensorManagerInstance().newSensor("IS1", "user1");
Assert.assertEquals(is1, t.getByUserName("user1"));

// to ensure t.bean.getBeanType() equals removed method t.getBeanType()
t.setBean(is1);
Assert.assertEquals("Sensor", t.bean.getBeanType());

}

@BeforeEach
Expand Down

0 comments on commit 3aea100

Please sign in to comment.