/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.ui.filters.plugin.attribute; import java.text.DecimalFormat; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.gephi.filters.plugin.attribute.AttributeEqualBuilder.EqualNumberFilter; import org.gephi.filters.spi.FilterProperty; import org.openide.util.WeakListeners; /** * * @author Mathieu Bastian */ public class EqualNumberPanel extends javax.swing.JPanel implements ChangeListener { private EqualNumberFilter filter; public EqualNumberPanel() { initComponents(); } public void stateChanged(ChangeEvent evt) { FilterProperty match = filter.getProperties()[1]; try { match.setValue((Number) valueSpinner.getValue()); } catch (Exception e) { e.printStackTrace(); } } public void setup(EqualNumberFilter f) { this.filter = f; new Thread(new Runnable() { public void run() { setToolTipText(filter.getName() + " '" + filter.getColumn().getTitle() + "'"); Number match = filter.getMatch(); Number stepSize = null; final Comparable min = (Comparable) filter.getMinimun(); final Comparable max = (Comparable) filter.getMaximum(); switch (filter.getColumn().getType()) { case DOUBLE: match = (match != null ? match : new Double((Double) min)); stepSize = new Double(.1); break; case FLOAT: match = (match != null ? match : new Float((Float) min)); stepSize = new Float(.1f); break; case LONG: match = (match != null ? match : new Long((Long) min)); stepSize = new Long(1l); break; case INT: match = (match != null ? match : new Integer((Integer) min)); stepSize = 1; break; default: throw new IllegalArgumentException("Column must be number"); } Number minNumber = (Number) min; Number maxNumber = (Number) max; if (match.doubleValue() < minNumber.doubleValue()) { match = minNumber; filter.getProperties()[1].setValue(minNumber); } else if (match.doubleValue() > maxNumber.doubleValue()) { match = maxNumber; filter.getProperties()[1].setValue(maxNumber); } final SpinnerNumberModel model = new SpinnerNumberModel(match, min, max, stepSize); SwingUtilities.invokeLater(new Runnable() { public void run() { if (min.equals(Double.NEGATIVE_INFINITY) || min.equals(Integer.MIN_VALUE)) { minLabel.setText(""); maxLabel.setText(""); } else { DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(5); minLabel.setText(df.format(min)); maxLabel.setText(df.format(max)); } valueSpinner.setModel(model); model.addChangeListener(WeakListeners.change(EqualNumberPanel.this, model)); } }); } }).start(); } /** 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() { java.awt.GridBagConstraints gridBagConstraints; labelValue = new javax.swing.JLabel(); valueSpinner = new javax.swing.JSpinner(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); minLabel = new javax.swing.JLabel(); maxLabel = new javax.swing.JLabel(); setLayout(new java.awt.GridBagLayout()); labelValue.setText(org.openide.util.NbBundle.getMessage(EqualNumberPanel.class, "EqualNumberPanel.labelValue.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5); add(labelValue, gridBagConstraints); valueSpinner.setPreferredSize(new java.awt.Dimension(75, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; add(valueSpinner, gridBagConstraints); jLabel1.setFont(new java.awt.Font("Tahoma", 0, 10)); jLabel1.setText(org.openide.util.NbBundle.getMessage(EqualNumberPanel.class, "EqualNumberPanel.jLabel1.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); add(jLabel1, gridBagConstraints); jLabel2.setFont(new java.awt.Font("Tahoma", 0, 10)); jLabel2.setText(org.openide.util.NbBundle.getMessage(EqualNumberPanel.class, "EqualNumberPanel.jLabel2.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); add(jLabel2, gridBagConstraints); minLabel.setFont(new java.awt.Font("Tahoma", 0, 10)); minLabel.setText(org.openide.util.NbBundle.getMessage(EqualNumberPanel.class, "EqualNumberPanel.minLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); add(minLabel, gridBagConstraints); maxLabel.setFont(new java.awt.Font("Tahoma", 0, 10)); maxLabel.setText(org.openide.util.NbBundle.getMessage(EqualNumberPanel.class, "EqualNumberPanel.maxLabel.text")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); add(maxLabel, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel labelValue; private javax.swing.JLabel maxLabel; private javax.swing.JLabel minLabel; private javax.swing.JSpinner valueSpinner; // End of variables declaration//GEN-END:variables }