/* 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.desktop.ranking; import org.gephi.ranking.api.TransformerUI; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.gephi.ranking.api.Ranking; import org.gephi.ranking.api.RankingController; import org.gephi.ranking.api.RankingModel; import org.gephi.ranking.api.RankingUIModel; import org.gephi.ranking.api.Transformer; import org.gephi.ui.components.SplineEditor.SplineEditor; import org.openide.util.Lookup; import org.openide.util.NbBundle; /** * * @author Mathieu Bastian */ public class RankingChooser extends javax.swing.JPanel { private final String NO_SELECTION; private RankingUIModel modelUI; private RankingModel model; private JPanel centerPanel; private Ranking selectedRanking; private TransformerUI[] transformerUIs; //Spline private SplineEditor splineEditor; private org.jdesktop.animation.timing.interpolation.Interpolator interpolator; public RankingChooser(RankingUIModel modelUI, RankingModel rankingModel) { this.modelUI = modelUI; this.model = rankingModel; NO_SELECTION = NbBundle.getMessage(RankingChooser.class, "RankingChooser.choose.text"); initComponents(); initRanking(); initApply(); } private void initRanking() { final DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(); comboBoxModel.addElement(NO_SELECTION); comboBoxModel.setSelectedItem(NO_SELECTION); SwingUtilities.invokeLater(new Runnable() { public void run() { rankingComboBox.setModel(comboBoxModel); } }); rankingComboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (!rankingComboBox.getSelectedItem().equals(getSelectedRanking())) { resetTransformers(); if (!rankingComboBox.getSelectedItem().equals(NO_SELECTION)) { setSelectedRanking((String) rankingComboBox.getSelectedItem()); } else { setSelectedRanking(null); } //refreshModel(); } } }); model.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { refreshModel(); } }); modelUI.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("ranking") || evt.getPropertyName().equals("nodeTransformer") || evt.getPropertyName().equals("edgeTransformer") || evt.getPropertyName().equals("selectedNodeRanking") || evt.getPropertyName().equals("selectedEdgeRanking")) { refreshModel(); } } }); transformerUIs = Lookup.getDefault().lookupAll(TransformerUI.class).toArray(new TransformerUI[0]); } private void initApply() { applyButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Transformer transformer = getSelectedTransformer(); if (transformer != null) { RankingController rankingController = Lookup.getDefault().lookup(RankingController.class); if (interpolator != null) { transformer.setInterpolator(new org.gephi.ranking.api.Interpolator() { public float interpolate(float x) { return interpolator.interpolate(x); } }); } rankingController.transform(transformer); } } }); splineButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (splineEditor == null) { splineEditor = new SplineEditor(NbBundle.getMessage(RankingChooser.class, "RankingChooser.splineEditor.title")); } splineEditor.setVisible(true); interpolator = splineEditor.getCurrentInterpolator(); } }); } public synchronized void refreshModel() { refreshSelectedRankings(); Ranking[] rankings = new Ranking[0]; if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { rankings = model.getNodeRanking(); } else { rankings = model.getEdgeRanking(); } //Ranking list final DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(); comboBoxModel.addElement(NO_SELECTION); comboBoxModel.setSelectedItem(NO_SELECTION); for (Ranking r : rankings) { String elem = r.toString(); comboBoxModel.addElement(elem); if (selectedRanking != null && selectedRanking.toString().equals(r.toString())) { comboBoxModel.setSelectedItem(elem); } } SwingUtilities.invokeLater(new Runnable() { public void run() { rankingComboBox.setModel(comboBoxModel); } }); //CenterPanel if (centerPanel != null) { remove(centerPanel); } applyButton.setVisible(false); splineButton.setVisible(false); if (selectedRanking != null) { Transformer transformer = getSelectedTransformer(); TransformerUI transformerUI; if (transformer != null) { //Saved Transformer in the model transformerUI = getUIForTransformer(transformer); } else { transformerUI = getUIForTransformer(); if (transformerUI != null) { transformer = transformerUI.buildTransformer(selectedRanking); //Create transformer addTransformer(transformer); } } centerPanel = transformerUI.getPanel(transformer, selectedRanking); centerPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5), BorderFactory.createEtchedBorder())); centerPanel.setOpaque(false); add(centerPanel, BorderLayout.CENTER); applyButton.setVisible(true); splineButton.setVisible(true); } revalidate(); repaint(); } private void refreshSelectedRankings() { selectedRanking = null; if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { if (modelUI.getSelectedNodeRanking() != null) { for (Ranking r : model.getNodeRanking()) { String elem = r.toString(); if (elem.equals(modelUI.getSelectedNodeRanking())) { selectedRanking = r; break; } } } if (selectedRanking != null) { modelUI.setSelectedNodeRanking(selectedRanking.toString()); } else { modelUI.setSelectedNodeRanking(null); } } else { if (modelUI.getSelectedEdgeRanking() != null) { for (Ranking r : model.getEdgeRanking()) { String elem = r.toString(); if (elem.equals(modelUI.getSelectedEdgeRanking())) { selectedRanking = r; break; } } } if (selectedRanking != null) { modelUI.setSelectedEdgeRanking(selectedRanking.toString()); } else { modelUI.setSelectedEdgeRanking(null); } } } private String getSelectedRanking() { if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { return modelUI.getSelectedNodeRanking(); } else { return modelUI.getSelectedEdgeRanking(); } } private void setSelectedRanking(String selectedRanking) { if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { modelUI.setSelectedNodeRanking(selectedRanking); } else { modelUI.setSelectedEdgeRanking(selectedRanking); } } private void resetTransformers() { if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { modelUI.resetNodeTransformers(); } else { modelUI.resetEdgeTransformers(); } } private Transformer getSelectedTransformer() { if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { return modelUI.getSelectedNodeTransformer(); } else { return modelUI.getSelectedEdgeTransformer(); } } private TransformerUI getUIForTransformer(Transformer transformer) { if (transformer != null) { for (TransformerUI u : transformerUIs) { if (u.getTransformerClass().isAssignableFrom(transformer.getClass())) { return u; } } } return null; } private TransformerUI getUIForTransformer() { Class classTransformer; if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { classTransformer = modelUI.getNodeTransformer(); } else { classTransformer = modelUI.getEdgeTransformer(); } for (TransformerUI u : transformerUIs) { if (u.getTransformerClass().equals(classTransformer)) { return u; } } return null; } private void addTransformer(Transformer transformer) { if (modelUI.getRanking() == RankingUIModel.NODE_RANKING) { modelUI.addNodeTransformer(transformer); } else { modelUI.addEdgeTransformer(transformer); } } @Override public void setEnabled(boolean enabled) { applyButton.setEnabled(enabled); rankingComboBox.setEnabled(enabled); splineButton.setEnabled(enabled); } /** 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; chooserPanel = new javax.swing.JPanel(); rankingComboBox = new javax.swing.JComboBox(); controlPanel = new javax.swing.JPanel(); applyButton = new javax.swing.JButton(); splineButton = new org.jdesktop.swingx.JXHyperlink(); setOpaque(false); setLayout(new java.awt.BorderLayout()); chooserPanel.setOpaque(false); chooserPanel.setLayout(new java.awt.GridBagLayout()); rankingComboBox.setToolTipText(org.openide.util.NbBundle.getMessage(RankingChooser.class, "RankingChooser.rankingComboBox.toolTipText")); // NOI18N rankingComboBox.setPreferredSize(new java.awt.Dimension(56, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); chooserPanel.add(rankingComboBox, gridBagConstraints); add(chooserPanel, java.awt.BorderLayout.PAGE_START); controlPanel.setOpaque(false); controlPanel.setLayout(new java.awt.GridBagLayout()); applyButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/gephi/desktop/ranking/resources/apply.gif"))); // NOI18N applyButton.setText(org.openide.util.NbBundle.getMessage(RankingChooser.class, "RankingChooser.applyButton.text")); // NOI18N applyButton.setToolTipText(org.openide.util.NbBundle.getMessage(RankingChooser.class, "RankingChooser.applyButton.toolTipText")); // NOI18N applyButton.setMargin(new java.awt.Insets(0, 14, 0, 14)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 0, 3, 5); controlPanel.add(applyButton, gridBagConstraints); splineButton.setClickedColor(new java.awt.Color(0, 51, 255)); splineButton.setText(org.openide.util.NbBundle.getMessage(RankingChooser.class, "RankingChooser.splineButton.text")); // NOI18N splineButton.setToolTipText(org.openide.util.NbBundle.getMessage(RankingChooser.class, "RankingChooser.splineButton.toolTipText")); // NOI18N splineButton.setFocusPainted(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); controlPanel.add(splineButton, gridBagConstraints); add(controlPanel, java.awt.BorderLayout.PAGE_END); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton applyButton; private javax.swing.JPanel chooserPanel; private javax.swing.JPanel controlPanel; private javax.swing.JComboBox rankingComboBox; private org.jdesktop.swingx.JXHyperlink splineButton; // End of variables declaration//GEN-END:variables }