From 6ffc807803cdef663021351765f16203351ae39d Mon Sep 17 00:00:00 2001 From: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com> Date: Fri, 24 Jun 2022 11:28:48 +0100 Subject: [PATCH] Improve scroller logging Additional options to only log outer scroller (data load) movement, not the very fine stuff. --- src/effortmonitor/EffortControl.java | 82 +++++++++++++++- src/effortmonitor/EffortDataUnit.java | 10 ++ src/effortmonitor/EffortParams.java | 5 + src/effortmonitor/swing/EffortDialog.java | 18 ++++ src/effortmonitor/swing/EffortSidePanel.java | 99 ++++++++++++++++++++ src/pamScrollSystem/PamScrollerData.java | 2 +- 6 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 src/effortmonitor/swing/EffortSidePanel.java diff --git a/src/effortmonitor/EffortControl.java b/src/effortmonitor/EffortControl.java index 318a6bab..a15b1cf2 100644 --- a/src/effortmonitor/EffortControl.java +++ b/src/effortmonitor/EffortControl.java @@ -5,6 +5,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.Serializable; import java.util.ArrayList; +import java.util.HashMap; import java.util.Vector; import javax.swing.JCheckBoxMenuItem; @@ -18,14 +19,18 @@ import PamController.PamController; import PamController.PamSettingManager; import PamController.PamSettings; import PamUtils.PamCalendar; +import PamView.PamSidePanel; import PamguardMVC.PamDataBlock; import PamguardMVC.PamProcess; import PamguardMVC.debug.Debug; import effortmonitor.swing.EffortDataMapGraph; import effortmonitor.swing.EffortDialog; import effortmonitor.swing.EffortDisplayProvider; +import effortmonitor.swing.EffortSidePanel; import pamScrollSystem.AbstractPamScroller; import pamScrollSystem.AbstractScrollManager; +import pamScrollSystem.PamScroller; +import pamScrollSystem.PamScrollerData; import userDisplay.UserDisplayControl; public class EffortControl extends PamControlledUnit implements PamSettings{ @@ -42,6 +47,10 @@ public class EffortControl extends PamControlledUnit implements PamSettings{ private EffortDataMapGraph dataMapGraph; + private HashMap lastOuterStarts = new HashMap<>(); + + private EffortSidePanel effortSidePanel; + public EffortControl(String unitName) { super("unitType", unitName); EffortProcess effortProc = new EffortProcess(); @@ -50,12 +59,22 @@ public class EffortControl extends PamControlledUnit implements PamSettings{ effortProc.addOutputDataBlock(effortDataBlock); effortDataBlock.SetLogging(new EffortLogging(this, effortDataBlock)); dataMapGraph = new EffortDataMapGraph(this); + +// PamScroller UserDisplayControl.addUserDisplayProvider(new EffortDisplayProvider(this)); PamSettingManager.getInstance().registerSettings(this); } + @Override + public PamSidePanel getSidePanel() { + if (effortSidePanel == null) { + effortSidePanel = new EffortSidePanel(this); + } + return effortSidePanel; + } + @Override public void notifyModelChanged(int changeType) { super.notifyModelChanged(changeType); @@ -65,6 +84,10 @@ public class EffortControl extends PamControlledUnit implements PamSettings{ break; case PamController.NEW_SCROLL_TIME: updateScrollerInfo(); + break; + case PamController.DATA_LOAD_COMPLETE: + updateScrollerInfo(); + break; } } @@ -102,7 +125,25 @@ public class EffortControl extends PamControlledUnit implements PamSettings{ */ return; } + + boolean newOuter = isNewOuter(scroller); + if (effortParams.outserScrollOnly) { + if (newOuter) { + logOuterScroll(scroller); + } + } + else { + logInnerScroll(scroller); + } + } + + private void logOuterScroll(AbstractPamScroller scroller) { + EffortDataUnit effortData = new EffortDataUnit(scroller, effortParams.getObserver(), effortParams.getObjective()); + effortData.setOuterLimits(); + effortDataBlock.addPamData(effortData); + } + private void logInnerScroll(AbstractPamScroller scroller) { // checkObserverName(); EffortDataUnit effortData = effortDataBlock.findActiveUnit(scroller); @@ -129,6 +170,38 @@ public class EffortControl extends PamControlledUnit implements PamSettings{ } } + /** + * Has the outer scroll moved. + * @param scroller + * @return true if the outer has moved. + */ + private boolean isNewOuter(AbstractPamScroller scroller) { + PamScrollerData lastData = lastOuterStarts.get(scroller); + PamScrollerData nowVal = scroller.getScrollerData(); + if (nowVal == null) { + return false; // shouldn't happen ! + } + boolean changed = isChanged(lastData, nowVal); + if (changed) { + lastOuterStarts.put(scroller, nowVal.clone()); + } + return changed; + } + + private boolean isChanged(PamScrollerData lastData, PamScrollerData nowVal) { + if (lastData == null || nowVal == null) { + return true; + } + if (lastData.getMinimumMillis() != nowVal.getMinimumMillis()) { + return true; + } + if (lastData.getMaximumMillis() != nowVal.getMaximumMillis()) { + return true; + } + + return false; + } + /** * Quick and dirty to get observer name. */ @@ -203,9 +276,11 @@ public class EffortControl extends PamControlledUnit implements PamSettings{ existingUnit.setObserver(newParams.getObserver()); existingUnit.setObjective(newParams.getObjective()); } - return true; } - return false; + if (effortSidePanel != null) { + effortSidePanel.updateSettings(); + } + return newParams!=null; } public void goToTime(AbstractPamScroller scroller, long timeInMilliseconds) { @@ -235,6 +310,9 @@ public class EffortControl extends PamControlledUnit implements PamSettings{ @Override public boolean restoreSettings(PamControlledUnitSettings pamControlledUnitSettings) { effortParams = ((EffortParams) pamControlledUnitSettings.getSettings()); + if (effortSidePanel != null) { + effortSidePanel.updateSettings(); + } return true; } diff --git a/src/effortmonitor/EffortDataUnit.java b/src/effortmonitor/EffortDataUnit.java index d4e802c8..99c8eb7f 100644 --- a/src/effortmonitor/EffortDataUnit.java +++ b/src/effortmonitor/EffortDataUnit.java @@ -42,6 +42,7 @@ public class EffortDataUnit extends PamDataUnit { getBasicData().setEndTime(scroller.getValueMillis()+scroller.getVisibleAmount()); } + /** * Constructor to use when reloading from database. * @param databaseIndex @@ -210,4 +211,13 @@ public class EffortDataUnit extends PamDataUnit { return runMode; } + + /** + * Set the limits as the outer limits of the scroller. + */ + public void setOuterLimits() { + setTimeMilliseconds(scroller.getMinimumMillis()); + getBasicData().setEndTime(scroller.getMaximumMillis()); + } + } diff --git a/src/effortmonitor/EffortParams.java b/src/effortmonitor/EffortParams.java index beb35249..fcd5bcb5 100644 --- a/src/effortmonitor/EffortParams.java +++ b/src/effortmonitor/EffortParams.java @@ -16,6 +16,11 @@ public class EffortParams implements Cloneable, Serializable, ManagedParameters public transient boolean isSet; + /** + * Only log outer scroll events when paging forwards, not every little movement. + */ + public boolean outserScrollOnly = false; + private static final int MAX_OBSERVERS = 10; private static final int MAX_OBJECTIVES = 10; diff --git a/src/effortmonitor/swing/EffortDialog.java b/src/effortmonitor/swing/EffortDialog.java index 3c8b6cdf..4f4d8b7f 100644 --- a/src/effortmonitor/swing/EffortDialog.java +++ b/src/effortmonitor/swing/EffortDialog.java @@ -8,9 +8,11 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedList; +import javax.swing.ButtonGroup; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JRadioButton; import javax.swing.border.TitledBorder; import PamView.DBTextArea; @@ -29,6 +31,7 @@ public class EffortDialog extends PamDialog { private JComboBox observer; private JComboBox oldObjectives; private DBTextArea objective; + private JRadioButton outerOnly, allActions; private EffortDialog(Window parentFrame, EffortControl effortControl) { super(parentFrame, effortControl.getUnitName(), false); @@ -40,6 +43,18 @@ public class EffortDialog extends PamDialog { mainPanel.add(new JLabel("Observer name or initials"), c); c.gridx++; mainPanel.add(observer = new JComboBox(), c); + outerOnly = new JRadioButton("Log uter scroll only"); + allActions = new JRadioButton("Log all scroll actions"); + ButtonGroup bg = new ButtonGroup(); + bg.add(allActions); + bg.add(outerOnly); + c.gridx = 0; + c.gridy++; + c.gridwidth = 1; + mainPanel.add(allActions, c); + c.gridx+=c.gridwidth; + mainPanel.add(outerOnly, c); + c.gridx = 0; c.gridy++; c.gridwidth = 2; @@ -80,6 +95,8 @@ public class EffortDialog extends PamDialog { for (String obs : oldObs) { observer.addItem(obs); } + allActions.setSelected(effortParams.outserScrollOnly == false); + outerOnly.setSelected(effortParams.outserScrollOnly); oldObjectives.removeAllItems(); oldObjectives.addItem(""); for (String obj : effortParams.getRecentObjectives()) { @@ -100,6 +117,7 @@ public class EffortDialog extends PamDialog { if (obs == null || obs.length() == 0) { return showWarning("You must give your name or initials to contine"); } + effortParams.outserScrollOnly = outerOnly.isSelected(); effortParams.setObserver(obs); effortParams.setObjective(objective.getText()); return true; diff --git a/src/effortmonitor/swing/EffortSidePanel.java b/src/effortmonitor/swing/EffortSidePanel.java new file mode 100644 index 00000000..d10ab983 --- /dev/null +++ b/src/effortmonitor/swing/EffortSidePanel.java @@ -0,0 +1,99 @@ +package effortmonitor.swing; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JTextField; +import javax.swing.border.TitledBorder; + +import PamView.PamSidePanel; +import PamView.component.PamSettingsIconButton; +import PamView.dialog.PamCheckBox; +import PamView.dialog.PamGridBagContraints; +import PamView.dialog.PamLabel; +import PamView.dialog.PamTextField; +import PamView.panel.PamPanel; +import effortmonitor.EffortControl; +import effortmonitor.EffortObserver; +import effortmonitor.EffortParams; + +public class EffortSidePanel implements PamSidePanel, EffortObserver { + + private PamPanel mainPanel; + + private PamTextField person; + + private PamCheckBox logging; + + private PamSettingsIconButton settingsButton; + + private EffortControl effortControl; + + public EffortSidePanel(EffortControl effortControl) { + this.effortControl = effortControl; + + mainPanel = new PamPanel(new GridBagLayout()); + mainPanel.setBorder(new TitledBorder(effortControl.getUnitName())); + GridBagConstraints c = new PamGridBagContraints(); + mainPanel.add(new PamLabel("Person ", JLabel.RIGHT), c); + c.gridx++; + mainPanel.add(person = new PamTextField(6), c); + person.setEditable(false); + c.gridx = 0; + c.gridy++; + c.gridwidth = 1; + mainPanel.add(logging = new PamCheckBox("Log effort"), c); + c.gridx += c.gridwidth; + mainPanel.add(settingsButton = new PamSettingsIconButton(), c); + settingsButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + settings(); + } + }); + effortControl.addObserver(this); + logging.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + loggingButton(); + } + }); + + updateSettings(); + } + + protected void loggingButton() { + effortControl.setOnEffort(logging.isSelected()); + } + + protected void settings() { + effortControl.showSettingsDialog(effortControl.getGuiFrame(), null); + } + + public void updateSettings() { + EffortParams params = effortControl.getEffortParams(); + person.setText(params.getObserver()); + logging.setSelected(params.isSet); + } + + @Override + public JComponent getPanel() { + return mainPanel; + } + + @Override + public void rename(String newName) { + mainPanel.setBorder(new TitledBorder(newName)); + } + + @Override + public void statusChange() { + updateSettings(); + } + +} diff --git a/src/pamScrollSystem/PamScrollerData.java b/src/pamScrollSystem/PamScrollerData.java index 133dde58..11cc7265 100644 --- a/src/pamScrollSystem/PamScrollerData.java +++ b/src/pamScrollSystem/PamScrollerData.java @@ -58,7 +58,7 @@ public class PamScrollerData implements Serializable, Cloneable { @Override - protected PamScrollerData clone() { + public PamScrollerData clone() { try { return (PamScrollerData) super.clone(); } catch (CloneNotSupportedException e) {