1 package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import fr.ifremer.tutti.ui.swing.util.TuttiNumberTickUnitSource;
28 import fr.ifremer.tutti.util.Units;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.jfree.chart.ChartFactory;
32 import org.jfree.chart.ChartPanel;
33 import org.jfree.chart.JFreeChart;
34 import org.jfree.chart.axis.NumberTickUnitSource;
35 import org.jfree.chart.axis.ValueAxis;
36 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
37
38 import javax.swing.JFrame;
39 import java.awt.event.ActionEvent;
40 import java.awt.event.ActionListener;
41 import java.beans.PropertyChangeEvent;
42 import java.beans.PropertyChangeListener;
43 import java.io.Closeable;
44
45 import static org.nuiton.i18n.I18n.t;
46
47
48
49
50
51
52
53
54 public class AverageWeightsHistogramHandler implements Closeable {
55
56
57 private static final Log log = LogFactory.getLog(AverageWeightsHistogramHandler.class);
58
59 private final AverageWeightsHistogramModel model;
60
61 private final JFreeChart chart;
62 private final JFrame popup;
63
64 public AverageWeightsHistogramHandler(SpeciesFrequencyUI ui) {
65
66 SpeciesFrequencyUIHandler uiHandler = ui.getHandler();
67 SpeciesFrequencyUIModel uiModel = ui.getModel();
68
69 model = uiModel.getAverageWeightsHistogramModel();
70
71 chart = ChartFactory.createXYLineChart(null,
72 t("tutti.editSpeciesFrequencies.table.header.lengthStep"),
73 model.getFrequencyWeightUnit().decorateLabel(t("tutti.editSpeciesFrequencies.averageWeight.label")),
74 model.getDataset());
75 chart.clearSubtitles();
76
77 ValueAxis rangeAxis = chart.getXYPlot().getRangeAxis();
78 rangeAxis.setAutoRange(true);
79 rangeAxis.setStandardTickUnits(new NumberTickUnitSource());
80 rangeAxis.setMinorTickMarksVisible(true);
81
82 ValueAxis domainAxis = chart.getXYPlot().getDomainAxis();
83 domainAxis.setAutoRange(true);
84 domainAxis.setStandardTickUnits(new TuttiNumberTickUnitSource(true));
85 domainAxis.setMinorTickMarksVisible(true);
86
87 XYLineAndShapeRenderer plotRenderer = (XYLineAndShapeRenderer) chart.getXYPlot().getRenderer();
88 plotRenderer.setSeriesPaint(0, uiHandler.getConfig().getColorComputedWeights());
89 plotRenderer.setBaseShapesVisible(true);
90
91 ChartPanel chartPanel = new ChartPanel(chart);
92 chartPanel.setDomainZoomable(false);
93 chartPanel.setMouseZoomable(false);
94 chartPanel.setPopupMenu(null);
95
96 popup = new JFrame();
97 popup.getContentPane().add(chartPanel);
98 popup.pack();
99
100
101 uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_STEP, new PropertyChangeListener() {
102 @Override
103 public void propertyChange(PropertyChangeEvent evt) {
104
105 Float step1 = (Float) evt.getNewValue();
106 model.setStep(step1);
107
108 }
109 });
110
111
112 uiModel.addPropertyChangeListener(SpeciesFrequencyUIModel.PROPERTY_LENGTH_STEP_CARACTERISTIC_UNIT, new PropertyChangeListener() {
113 @Override
114 public void propertyChange(PropertyChangeEvent evt) {
115
116 String unit = (String) evt.getNewValue();
117
118 if (unit == null) {
119
120 unit = t("tutti.editSpeciesFrequencies.unkownStepUnit");
121 }
122
123 String lengthStepLabelWithUnit = Units.getLabelWithUnit(t("tutti.editSpeciesFrequencies.table.header.lengthStep"), unit);
124 model.setLengthStepLabelWithUnit(lengthStepLabelWithUnit);
125
126 }
127 });
128
129 model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_TITLE, new PropertyChangeListener() {
130 @Override
131 public void propertyChange(PropertyChangeEvent evt) {
132 String title = (String) evt.getNewValue();
133 if (log.isInfoEnabled()) {
134 log.info("Average weights graph title changed to: " + title);
135 }
136 popup.setTitle(title);
137 }
138 });
139
140 model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_LENGTH_STEP_LABEL_WITH_UNIT, new PropertyChangeListener() {
141 @Override
142 public void propertyChange(PropertyChangeEvent evt) {
143 String lengthStepLabelWithUnit = (String) evt.getNewValue();
144 if (log.isInfoEnabled()) {
145 log.info("Average weights graph lengthStepLabelWithUnit changed to: " + lengthStepLabelWithUnit);
146 }
147 chart.getXYPlot().getDomainAxis().setLabel(lengthStepLabelWithUnit);
148 }
149 });
150
151 model.addPropertyChangeListener(AverageWeightsHistogramModel.PROPERTY_STEP, new PropertyChangeListener() {
152 @Override
153 public void propertyChange(PropertyChangeEvent evt) {
154
155 Float step = (Float) evt.getNewValue();
156 if (log.isInfoEnabled()) {
157 log.info("Average weights graph step changed to: " + step);
158 }
159 chart.getXYPlot().getDomainAxis().setStandardTickUnits(new TuttiNumberTickUnitSource(step == 1f));
160 model.getDataset().setIntervalWidth(step);
161
162 }
163 });
164
165
166 ui.getGraphAverageWeightButton().addActionListener(new ActionListener() {
167 @Override
168 public void actionPerformed(ActionEvent e) {
169 popup.setVisible(true);
170 }
171 });
172
173 }
174
175 @Override
176 public void close() {
177 popup.dispose();
178 }
179
180 }