/* 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.statistics; import java.awt.BorderLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JCheckBox; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; import org.gephi.statistics.api.StatisticsController; import org.gephi.statistics.api.StatisticsModel; import org.gephi.statistics.spi.StatisticsUI; import org.gephi.ui.components.JSqueezeBoxPanel; import org.openide.util.Lookup; /** * * @author Mathieu Bastian */ public class AvailableStatisticsChooser extends javax.swing.JPanel { private final JSqueezeBoxPanel squeezeBoxPanel = new JSqueezeBoxPanel(); private final Map<JCheckBox, StatisticsUI> uiMap = new HashMap<JCheckBox, StatisticsUI>(); public AvailableStatisticsChooser() { initComponents(); metricsPanel.add(squeezeBoxPanel, BorderLayout.CENTER); } public void setup(StatisticsModel model, StatisticsCategory[] categories) { //Sort categories by position Arrays.sort(categories, new Comparator() { public int compare(Object o1, Object o2) { Integer p1 = ((StatisticsCategory) o1).getPosition(); Integer p2 = ((StatisticsCategory) o2).getPosition(); return p1.compareTo(p2); } }); //Get UI StatisticsUI[] statisticsUIs = Lookup.getDefault().lookupAll(StatisticsUI.class).toArray(new StatisticsUI[0]); for (StatisticsCategory category : categories ) { MigLayout migLayout = new MigLayout("insets 0 0 0 0"); migLayout.setColumnConstraints("[grow,fill]"); migLayout.setRowConstraints("[min!]"); JPanel innerPanel = new JPanel(migLayout); //Find uis in this category List<StatisticsUI> uis = new ArrayList<StatisticsUI>(); for(StatisticsUI sui : statisticsUIs) { if(sui.getCategory().equals(category.getName())) { uis.add(sui); } } //Sort it by position Collections.sort(uis, new Comparator() { public int compare(Object o1, Object o2) { Integer p1 = ((StatisticsUI) o1).getPosition(); Integer p2 = ((StatisticsUI) o2).getPosition(); return p1.compareTo(p2); }}); for(StatisticsUI sui : uis) { JCheckBox checkBox = new JCheckBox(sui.getDisplayName()); checkBox.setOpaque(false); checkBox.setSelected(model.isStatisticsUIVisible(sui)); uiMap.put(checkBox, sui); innerPanel.add(checkBox, "wrap"); } if(uis.size()>0) { squeezeBoxPanel.addPanel(innerPanel, category.getName()); } } } public void unsetup() { //Only called when OK StatisticsController controller = Lookup.getDefault().lookup(StatisticsController.class); for(Map.Entry<JCheckBox, StatisticsUI> entry : uiMap.entrySet()) { controller.setStatisticsUIVisible(entry.getValue(), entry.getKey().isSelected()); } } /** 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() { metricsPanel = new javax.swing.JPanel(); metricsPanel.setLayout(new java.awt.BorderLayout()); metricsPanel.setLayout(new java.awt.BorderLayout()); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(metricsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(metricsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE) .addContainerGap()) ); add(metricsPanel, java.awt.BorderLayout.CENTER); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel metricsPanel; // End of variables declaration//GEN-END:variables }