View Javadoc
1   package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency;
2   
3   /*
4    * #%L
5    * Tutti :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2016 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU General Public License as
13   * published by the Free Software Foundation, either version 3 of the
14   * License, or (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU General Public
22   * License along with this program.  If not, see
23   * <http://www.gnu.org/licenses/gpl-3.0.html>.
24   * #L%
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   * To manage the average weights histogram.
49   *
50   * Created on 14/04/16.
51   *
52   * @author Tony Chemit - chemit@codelutin.com
53   */
54  public class AverageWeightsHistogramHandler implements Closeable {
55  
56      /** Logger. */
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         // when step has changed in model, update chart
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         // when lengthStepCaracteristicUnit changed, let's updates the label of some fields
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         // Show graphic in popup when fires button action
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 }