Skip to content
Snippets Groups Projects
Commit e68323d2 authored by Raphael GIRARDOT's avatar Raphael GIRARDOT
Browse files

- Use grouped refreshing stategy to avoid undesired curves blinking (CONTROLGUI-390)

- Sort attributes in tree for better readability
parent 6cf6bc89
Branches
Tags
No related merge requests found
......@@ -25,7 +25,9 @@ import fr.soleil.comete.definition.widget.properties.ChartProperties;
import fr.soleil.comete.definition.widget.properties.PlotProperties;
import fr.soleil.comete.tango.data.service.TangoKey;
import fr.soleil.comete.tango.data.service.TangoKeyTool;
import fr.soleil.data.listener.IRefreshingGroupListener;
import fr.soleil.data.service.DataSourceProducerProvider;
import fr.soleil.data.service.GroupRefreshingStrategy;
import fr.soleil.data.service.HistoryKey;
import fr.soleil.data.service.IKey;
import fr.soleil.data.service.PolledRefreshingStrategy;
......@@ -36,10 +38,16 @@ import fr.soleil.lib.project.awt.ColorUtils;
public class CometeTrendController {
public static final boolean GROUPED_REFRESHING;
static {
DataSourceProducerProvider.pushNewProducer(HistoryDataSourceProducer.class);
String trueStr = "true";
String prop = System.getProperty("GroupedRefreshing", trueStr);
GROUPED_REFRESHING = trueStr.equalsIgnoreCase(prop);
}
public static final String REFESHING_GROUP = "AttributeTrend";
private TrendFile trendFile;
private final HistoryDataSourceProducer historyProducer;
private final TrendFile defaultTrendFile;
......@@ -172,27 +180,31 @@ public class CometeTrendController {
}
}
protected void applyRefreshingPeriodNoCheck(IKey key, PolledRefreshingStrategy polledRefreshingStrategy) {
historyProducer.setRefreshingStrategy(key, polledRefreshingStrategy);
protected void applyRefreshingPeriodNoCheck(IKey key, PolledRefreshingStrategy strategy) {
historyProducer.setRefreshingStrategy(key, strategy);
}
protected PolledRefreshingStrategy getRefreshingStrategy() {
Integer period = Integer.valueOf(refreshingPeriod);
PolledRefreshingStrategy polledRefreshingStrategy = refreshingMap.get(period);
if (polledRefreshingStrategy == null) {
polledRefreshingStrategy = new PolledRefreshingStrategy(period);
refreshingMap.put(period, polledRefreshingStrategy);
PolledRefreshingStrategy strategy = refreshingMap.get(period);
if (strategy == null) {
if (GROUPED_REFRESHING) {
strategy = new GroupRefreshingStrategy(REFESHING_GROUP, period);
} else {
strategy = new PolledRefreshingStrategy(period);
}
return polledRefreshingStrategy;
refreshingMap.put(period, strategy);
}
return strategy;
}
protected void applyRefreshingPeriod() {
if (historyProducer != null) {
PolledRefreshingStrategy polledRefreshingStrategy = getRefreshingStrategy();
historyProducer.setDefaultRefreshingStrategy(polledRefreshingStrategy);
PolledRefreshingStrategy strategy = getRefreshingStrategy();
historyProducer.setDefaultRefreshingStrategy(strategy);
Collection<IKey> keys = keyMap.values();
for (IKey key : keys) {
applyRefreshingPeriodNoCheck(key, polledRefreshingStrategy);
applyRefreshingPeriodNoCheck(key, strategy);
applyHistoryDepthNoCheck(key);
}
started = true;
......@@ -211,6 +223,10 @@ public class CometeTrendController {
setRefreshingPeriod(period, started);
}
public boolean isStarted() {
return started;
}
public void setHistoryDepth(long historyDepth) {
long depth = historyDepth > 0 ? historyDepth : AbstractHistoryDataSource.DEFAULT_HISTORY_DEPTH;
if (this.historyDepth != depth) {
......@@ -219,6 +235,18 @@ public class CometeTrendController {
}
}
public void registerGroupListener(IRefreshingGroupListener groupListener) {
if (historyProducer != null) {
historyProducer.addRefreshingGroupListener(groupListener);
}
}
public void unregisterGroupListener(IRefreshingGroupListener groupListener) {
if (historyProducer != null) {
historyProducer.removeRefreshingGroupListener(groupListener);
}
}
public int getRefreshingPeriod() {
return refreshingPeriod;
}
......
......@@ -5,11 +5,12 @@ import java.util.Map;
import java.util.TreeMap;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import fr.soleil.comete.bean.trend.comparator.TreeNodeStringComparator;
import fr.soleil.comete.bean.trend.view.ResourcesUtil;
import fr.soleil.lib.project.swing.model.SortTreeModel;
public class TrendTreeModel extends DefaultTreeModel {
public class TrendTreeModel extends SortTreeModel {
private static final long serialVersionUID = 1202131585639383209L;
......@@ -18,15 +19,16 @@ public class TrendTreeModel extends DefaultTreeModel {
public TrendTreeModel() {
super(new DefaultMutableTreeNode(ResourcesUtil.ROOT_NODE));
nodeMap = new TreeMap<>(Collator.getInstance());
setComparator(new TreeNodeStringComparator());
}
public void reset() {
deepRemoveNode((DefaultMutableTreeNode) getRoot());
deepRemoveNode(getRoot());
}
public void addAttibutes(String... attributes) {
if (attributes != null) {
DefaultMutableTreeNode root = (DefaultMutableTreeNode) getRoot();
DefaultMutableTreeNode root = getRoot();
for (String attribute : attributes) {
if (attribute != null) {
DefaultMutableTreeNode attributeNode = nodeMap.get(attribute);
......
......@@ -9,8 +9,11 @@ import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.swing.Box;
import javax.swing.JButton;
......@@ -189,7 +192,7 @@ public class AttributeSelectionPanel extends JPanel {
}
public Collection<String> getSelectedAttributes() {
Collection<String> attributes = new ArrayList<>();
List<String> attributes = new ArrayList<>();
TreePath[] paths = tangoTree.getSelectionPaths();
if (paths != null) {
for (TreePath path : paths) {
......@@ -212,6 +215,7 @@ public class AttributeSelectionPanel extends JPanel {
}
}
}
Collections.sort(attributes, Collator.getInstance());
return attributes;
}
......
......@@ -2,7 +2,11 @@ package fr.soleil.comete.bean.trend.view;
import java.awt.BorderLayout;
import java.awt.Window;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
......@@ -13,6 +17,7 @@ import fr.soleil.comete.bean.trend.controller.TrendEvent;
import fr.soleil.comete.bean.trend.controller.TrendEvent.EventType;
import fr.soleil.comete.bean.trend.model.TrendFile;
import fr.soleil.comete.box.complexbox.ChartViewerBox;
import fr.soleil.comete.definition.data.target.complex.IDataArrayTarget;
import fr.soleil.comete.definition.event.ChartViewerEvent;
import fr.soleil.comete.definition.event.ChartViewerEvent.Reason;
import fr.soleil.comete.definition.listener.IChartViewerListener;
......@@ -25,6 +30,9 @@ import fr.soleil.comete.swing.chart.axis.model.AxisAttributes;
import fr.soleil.comete.swing.chart.data.DataView;
import fr.soleil.comete.swing.util.CfFileReader;
import fr.soleil.comete.swing.util.EDTManager;
import fr.soleil.data.event.GroupEvent;
import fr.soleil.data.listener.IRefreshingGroupListener;
import fr.soleil.data.mediator.Mediator;
import fr.soleil.data.service.HistoryKey;
import fr.soleil.data.service.IKey;
import fr.soleil.lib.project.ObjectUtils;
......@@ -32,27 +40,44 @@ import fr.soleil.lib.project.swing.WindowSwingUtils;
public class ChartPanel extends JPanel implements ITrendFileListener, IChartViewerListener {
private static final long serialVersionUID = 3658165519273434269L;
private static final long serialVersionUID = -8184675129148333990L;
private static final Object DEFAULT_DATA = new double[0];
private final CometeTrendController controller;
private final TrendChart chart;
private final ChartViewerBox chartBox;
private CfFileReader configurationReader;
private boolean cometeTrendSettings;
private final DataAccumulator dataAccumulator;
private final AttributeGroupListener groupListener;
public ChartPanel(CometeTrendController controller) {
super(new BorderLayout());
this.controller = controller;
controller.addTrendFileListener(this);
dataAccumulator = new DataAccumulator();
groupListener = new AttributeGroupListener();
controller.registerGroupListener(groupListener);
chart = new TrendChart();
chart.setAutoHighlightOnLegend(true);
chart.addChartViewerListener(this);
chartBox = new ChartViewerBox();
if (CometeTrendController.GROUPED_REFRESHING) {
chartBox.setSynchronTransmission(dataAccumulator, true);
}
setLayout(new BorderLayout());
add(chart, BorderLayout.CENTER);
}
public void setupDisplayDuration() {
chart.removeChartViewerListener(this);
chart.setDisplayDuration(controller.getHistoryDepth(Double.NaN));
chart.addChartViewerListener(this);
}
@Override
public void trendFileEvent(TrendEvent event) {
if (event != null) {
......@@ -160,11 +185,27 @@ public class ChartPanel extends JPanel implements ITrendFileListener, IChartView
}
private void disconnectWidget(IKey key) {
if (CometeTrendController.GROUPED_REFRESHING) {
chartBox.disconnectWidget(dataAccumulator, key);
} else {
chartBox.disconnectWidget(chart, key);
}
}
private void connectWidget(IKey key) {
String id = key.getInformationKey();
if (CometeTrendController.GROUPED_REFRESHING) {
chartBox.connectWidget(dataAccumulator, key);
// add curve after connection
Map<String, Object> tmp = new HashMap<>();
tmp.put(id, DEFAULT_DATA);
if (!chart.hasData(id)) {
chart.addData(tmp);
}
tmp.clear();
} else {
chartBox.connectWidget(chart, key);
}
if (controller != null) {
controller.applyHistoryDepth(key);
}
......@@ -215,7 +256,12 @@ public class ChartPanel extends JPanel implements ITrendFileListener, IChartView
}
private void reconnectAttributes() {
if (CometeTrendController.GROUPED_REFRESHING) {
chartBox.disconnectWidgetFromAll(dataAccumulator);
dataAccumulator.clearData();
} else {
chartBox.disconnectWidgetFromAll(chart);
}
chart.resetAll(true);
connectAttributes();
}
......@@ -226,12 +272,16 @@ public class ChartPanel extends JPanel implements ITrendFileListener, IChartView
protected class TrendChart extends Chart {
private static final long serialVersionUID = 2288351164385662330L;
private static final long serialVersionUID = -2073770697258573124L;
public TrendChart() {
super();
}
public boolean hasData(String id) {
return (id != null) && data.containsKey(id);
}
public boolean isSamplingEnabled() {
return getSamplingProperties().isEnabled();
}
......@@ -362,4 +412,74 @@ public class ChartPanel extends JPanel implements ITrendFileListener, IChartView
}
// ///////////// //
// Inner classes //
// ///////////// //
protected static class DataAccumulator implements IDataArrayTarget {
private final Map<String, Object> dataMap;
public DataAccumulator() {
dataMap = new ConcurrentHashMap<>();
}
@Override
public void addMediator(Mediator<?> mediator) {
// not managed
}
@Override
public void removeMediator(Mediator<?> mediator) {
// not managed
}
@Override
public Map<String, Object> getData() {
return dataMap;
}
@Override
public void setData(Map<String, Object> data) {
dataMap.clear();
if (data != null) {
dataMap.putAll(data);
}
}
@Override
public void addData(Map<String, Object> dataToAdd) {
if (dataToAdd != null) {
dataMap.putAll(dataToAdd);
}
}
@Override
public void removeData(Collection<String> idsToRemove) {
if (idsToRemove != null) {
for (String id : idsToRemove) {
if (id != null) {
dataMap.remove(id);
}
}
}
}
public void clearData() {
dataMap.clear();
}
}
private class AttributeGroupListener implements IRefreshingGroupListener {
@Override
public void groupRefreshed(GroupEvent event) {
if (event != null && CometeTrendController.REFESHING_GROUP.equals(event.getGroupName())) {
chart.setData(dataAccumulator.getData());
}
}
}
}
......@@ -28,6 +28,7 @@ import fr.soleil.comete.bean.trend.controller.TrendEvent.EventType;
import fr.soleil.comete.bean.trend.model.TrendFile;
import fr.soleil.comete.swing.chart.util.ChartUtils;
import fr.soleil.comete.swing.util.CfFileReader;
import fr.soleil.comete.swing.util.CometeConstants;
import fr.soleil.comete.swing.util.EDTManager;
import fr.soleil.lib.project.ObjectUtils;
import fr.soleil.lib.project.SystemUtils;
......@@ -90,9 +91,10 @@ public class CometeTrend extends JFrame implements ITrendFileListener {
setSize(1000, 800);
version = ResourcesUtil.getFileJarVersion(CometeTrend.class);
// String frameTitle = FRAME_TITLE + CometeConstants.SPACE + (CometeTrendController.GROUPED_REFRESHING ? "(grouped)" : "(classic)");
String frameTitle = FRAME_TITLE;
if ((version != null) && !version.isEmpty()) {
frameTitle = frameTitle + " " + version;
frameTitle = frameTitle + CometeConstants.SPACE + version;
}
setTitle(frameTitle);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
......@@ -125,7 +127,7 @@ public class CometeTrend extends JFrame implements ITrendFileListener {
private void initConsole() {
String frameTitle = TREND_FILER_TITLE;
if ((version != null) && !version.isEmpty()) {
frameTitle = frameTitle + " " + version;
frameTitle = frameTitle + CometeConstants.SPACE + version;
}
setTitle(frameTitle);
console = new JTextArea();
......@@ -152,7 +154,7 @@ public class CometeTrend extends JFrame implements ITrendFileListener {
}
// CometeTrend default panel
private void initCometeTrend(boolean samplingEnabled) {
private void initAttributeTrend(boolean samplingEnabled) {
initChartPanel(controller, samplingEnabled);
// CONTROLGUI-380: redirect settings
chartPanel.setCometeTrendSettings(true);
......@@ -187,7 +189,7 @@ public class CometeTrend extends JFrame implements ITrendFileListener {
private void initChartLoader(boolean samplingEnabled) {
String frameTitle = CHART_LOADER_TITLE;
if ((version != null) && !version.isEmpty()) {
frameTitle = frameTitle + " " + version;
frameTitle = frameTitle + CometeConstants.SPACE + version;
}
setTitle(frameTitle);
SPLASH.progress(70);
......@@ -489,7 +491,7 @@ public class CometeTrend extends JFrame implements ITrendFileListener {
final CometeTrend cometeTrend = new CometeTrend(cometeTrendController);
// Setup CometeTrend according to arguments
if ((arguments == null) || (arguments.length == 0)) {
cometeTrend.initCometeTrend(samplingEnabled);
cometeTrend.initAttributeTrend(samplingEnabled);
SwingUtilities.invokeLater(() -> {
SPLASH.progress(100);
SPLASH.setVisible(false);
......@@ -502,7 +504,7 @@ public class CometeTrend extends JFrame implements ITrendFileListener {
} else if (chartLoader) {
cometeTrend.initChartLoader(samplingEnabled);
} else {
cometeTrend.initCometeTrend(samplingEnabled);
cometeTrend.initAttributeTrend(samplingEnabled);
}
SwingUtilities.invokeLater(() -> {
SPLASH.progress(100);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment