/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2009 Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.gui.swing.propertyedit.styleproperty;
import java.awt.Color;
import java.awt.Component;
import java.text.NumberFormat;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import org.geotoolkit.gui.swing.resource.MessageBundle;
import org.geotoolkit.style.interval.IntervalStyleBuilder;
import org.geotoolkit.style.interval.IntervalStyleBuilder.METHOD;
import org.jdesktop.swingx.combobox.EnumComboBoxModel;
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.decorator.HighlighterFactory;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
/**
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class JAnalizePanel extends javax.swing.JPanel {
private static NumberFormat FORMAT = NumberFormat.getNumberInstance();
private final IntervalStyleBuilder analyze;
/** Creates new form JAnalizePanel */
public JAnalizePanel(final IntervalStyleBuilder analyze) {
this.analyze = analyze;
initComponents();
guiMethod.setModel(new EnumComboBoxModel(IntervalStyleBuilder.METHOD.class));
guiMethod.setRenderer(new MethodRenderer());
refresh();
}
private void refresh(){
guiCount.setText(String.valueOf(analyze.getCount()));
guiSum.setText(FORMAT.format(analyze.getSum()));
guiMinimum.setText(FORMAT.format(analyze.getMinimum()));
guiMaximum.setText(FORMAT.format(analyze.getMaximum()));
guiMean.setText(FORMAT.format(analyze.getMean()));
guiMedian.setText(FORMAT.format(analyze.getMedian()));
guiChart.removeAll();
guiChart.add(new ChartPanel(getChart((Integer)guiDivision.getModel().getValue())));
double[] values = analyze.getValues();
Double[][] vals = new Double[values.length][1];
for(int i=0; i<values.length; i++){
vals[i][0] = values[i];
}
guiTable.setTableHeader(null);
guiTable.setModel(new DefaultTableModel(vals, new String[]{""}){
@Override
public Class<?> getColumnClass(int columnIndex) {
return Double.class;
}
});
guiTable.setShowGrid(false, false);
guiTable.setHighlighters(new Highlighter[]{HighlighterFactory.createAlternateStriping(Color.white, HighlighterFactory.QUICKSILVER, 1)});
guiTable.revalidate();
guiTable.repaint();
guiTable.setEditable(analyze.getMethod() == METHOD.MANUAL);
guiTable.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
double[] values = new double[guiTable.getModel().getRowCount()];
for(int i=0;i<values.length;i++){
values[i] = Double.valueOf(guiTable.getModel().getValueAt(i, 0).toString());
}
analyze.setValues(values);
}
});
guiMethod.setSelectedItem(analyze.getMethod());
}
public JFreeChart getChart(final int nbDivision){
XYSeries series = new XYSeries( "Data" ) ;
double before = analyze.getMinimum();
for(float i=1;i<=nbDivision;i++){
final double localmin = before;
final double localmax = analyze.getMinimum() + (i/nbDivision)*(analyze.getMaximum()-analyze.getMinimum());
before = localmax;
long localsum = 0;
for(Double d : analyze.getAllValues()){
if(i == 100){
//last element
if(d>=localmin && d<=localmax){
localsum++;
}
}else{
if(d>=localmin && d<localmax){
localsum++;
}
}
}
series.add( analyze.getMinimum()+(localmin+localmax)/2, localsum) ;
}
XYSeriesCollection dataset = new XYSeriesCollection(series);
JFreeChart chart = ChartFactory.createXYBarChart(
"",
"",
false,
"",
dataset,
PlotOrientation.VERTICAL,
false,
false,
false
);
XYPlot plot = chart.getXYPlot();
((XYBarRenderer)plot.getRenderer()).setShadowVisible(false);
((XYBarRenderer)plot.getRenderer()).setUseYInterval(false);
((XYBarRenderer)plot.getRenderer()).setMargin(0);
chart.getPlot().setBackgroundAlpha(0);
chart.setBackgroundPaint(new Color(0f,0f,0f,0f));
return chart ;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel2 = new javax.swing.JPanel();
guiLblCount = new javax.swing.JLabel();
guiLblMinimum = new javax.swing.JLabel();
guiLblMaximum = new javax.swing.JLabel();
guiLblSum = new javax.swing.JLabel();
guiCount = new javax.swing.JLabel();
guiMinimum = new javax.swing.JLabel();
guiMaximum = new javax.swing.JLabel();
guiSum = new javax.swing.JLabel();
jSeparator2 = new javax.swing.JSeparator();
guiLblMean = new javax.swing.JLabel();
guiLblMedian = new javax.swing.JLabel();
guiMean = new javax.swing.JLabel();
guiMedian = new javax.swing.JLabel();
jSeparator3 = new javax.swing.JSeparator();
guiLblMethod = new javax.swing.JLabel();
guiLblClasses = new javax.swing.JLabel();
guiMethod = new javax.swing.JComboBox();
guiClasses = new javax.swing.JSpinner();
jSplitPane1 = new javax.swing.JSplitPane();
jPanel1 = new javax.swing.JPanel();
jPanel3 = new javax.swing.JPanel();
guiLblDivision = new javax.swing.JLabel();
guiDivision = new javax.swing.JSpinner();
guiChart = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
guiTable = new org.jdesktop.swingx.JXTable();
jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
guiLblCount.setText(MessageBundle.format("count")); // NOI18N
guiLblMinimum.setText(MessageBundle.format("minimum")); // NOI18N
guiLblMaximum.setText(MessageBundle.format("maximum")); // NOI18N
guiLblSum.setText(MessageBundle.format("sum")); // NOI18N
guiCount.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
guiCount.setText("0");
guiCount.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
guiMinimum.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
guiMinimum.setText("0");
guiMinimum.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
guiMaximum.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
guiMaximum.setText("0");
guiMaximum.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
guiSum.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
guiSum.setText("0");
guiSum.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);
guiLblMean.setText(MessageBundle.format("mean")); // NOI18N
guiLblMedian.setText(MessageBundle.format("median")); // NOI18N
guiMean.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
guiMean.setText("0");
guiMedian.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
guiMedian.setText("0");
jSeparator3.setOrientation(javax.swing.SwingConstants.VERTICAL);
guiLblMethod.setText(MessageBundle.format("method")); // NOI18N
guiLblClasses.setText(MessageBundle.format("classes")); // NOI18N
guiMethod.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
guiMethodActionPerformed(evt);
}
});
guiClasses.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(5), Integer.valueOf(1), null, Integer.valueOf(1)));
guiClasses.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
guiClassesStateChanged(evt);
}
});
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblMethod)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiMethod, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblClasses)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiClasses, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiCount))
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblMean)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiMean))
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblMedian)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiMedian)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblMinimum)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiMinimum))
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblMaximum)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiMaximum))
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(guiLblSum)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiSum)))
.addContainerGap(103, Short.MAX_VALUE))
);
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiClasses, guiMethod});
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiLblClasses, guiLblMethod});
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiLblCount, guiLblMean, guiLblMedian});
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiLblMaximum, guiLblMinimum, guiLblSum});
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiMaximum, guiMinimum, guiSum});
jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiCount, guiMean, guiMedian});
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblMethod)
.addComponent(guiMethod, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblClasses)
.addComponent(guiClasses, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblCount)
.addComponent(guiCount))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblMean)
.addComponent(guiMean))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblMedian)
.addComponent(guiMedian)))
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblMinimum)
.addComponent(guiMinimum))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblMaximum)
.addComponent(guiMaximum))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblSum)
.addComponent(guiSum))))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(jSeparator3, javax.swing.GroupLayout.DEFAULT_SIZE, 89, Short.MAX_VALUE)
.addComponent(jSeparator2, javax.swing.GroupLayout.DEFAULT_SIZE, 89, Short.MAX_VALUE)
);
jSplitPane1.setBorder(null);
jSplitPane1.setDividerLocation(225);
jSplitPane1.setDividerSize(3);
jPanel1.setLayout(new java.awt.BorderLayout());
guiLblDivision.setText(MessageBundle.format("division")); // NOI18N
guiDivision.setModel(new javax.swing.SpinnerNumberModel(50, 1, 100, 1));
guiDivision.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
guiDivisionStateChanged(evt);
}
});
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(guiLblDivision)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(guiDivision, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(138, Short.MAX_VALUE))
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblDivision)
.addComponent(guiDivision, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);
jPanel1.add(jPanel3, java.awt.BorderLayout.NORTH);
guiChart.setLayout(new java.awt.BorderLayout());
jPanel1.add(guiChart, java.awt.BorderLayout.CENTER);
jSplitPane1.setRightComponent(jPanel1);
guiTable.setBorder(null);
guiTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
jScrollPane1.setViewportView(guiTable);
jSplitPane1.setLeftComponent(jScrollPane1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 531, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void guiMethodActionPerformed(final java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guiMethodActionPerformed
analyze.setMethod((METHOD) guiMethod.getSelectedItem());
refresh();
}//GEN-LAST:event_guiMethodActionPerformed
private void guiClassesStateChanged(final javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_guiClassesStateChanged
analyze.setNbClasses((Integer)guiClasses.getModel().getValue());
refresh();
}//GEN-LAST:event_guiClassesStateChanged
private void guiDivisionStateChanged(final javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_guiDivisionStateChanged
guiChart.removeAll();
guiChart.add(new ChartPanel(getChart((Integer)guiDivision.getModel().getValue())));
guiChart.revalidate();
guiChart.repaint();
}//GEN-LAST:event_guiDivisionStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel guiChart;
private javax.swing.JSpinner guiClasses;
private javax.swing.JLabel guiCount;
private javax.swing.JSpinner guiDivision;
private javax.swing.JLabel guiLblClasses;
private javax.swing.JLabel guiLblCount;
private javax.swing.JLabel guiLblDivision;
private javax.swing.JLabel guiLblMaximum;
private javax.swing.JLabel guiLblMean;
private javax.swing.JLabel guiLblMedian;
private javax.swing.JLabel guiLblMethod;
private javax.swing.JLabel guiLblMinimum;
private javax.swing.JLabel guiLblSum;
private javax.swing.JLabel guiMaximum;
private javax.swing.JLabel guiMean;
private javax.swing.JLabel guiMedian;
private javax.swing.JComboBox guiMethod;
private javax.swing.JLabel guiMinimum;
private javax.swing.JLabel guiSum;
private org.jdesktop.swingx.JXTable guiTable;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator2;
private javax.swing.JSeparator jSeparator3;
private javax.swing.JSplitPane jSplitPane1;
// End of variables declaration//GEN-END:variables
private class MethodRenderer extends DefaultListCellRenderer{
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
MethodRenderer.this.setText(" ");
if(value instanceof IntervalStyleBuilder.METHOD){
METHOD mt = (METHOD) value;
final String txt;
switch(mt){
case EL : txt = MessageBundle.format("el"); break;
case MANUAL : txt = MessageBundle.format("manual"); break;
default : txt = MessageBundle.format("qantile"); break;
}
MethodRenderer.this.setText(txt);
}
return MethodRenderer.this;
}
}
}