/* 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.tools.plugin; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.DefaultComboBoxModel; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; import org.gephi.ui.components.gradientslider.GradientSlider; import org.gephi.utils.PaletteUtils; import org.gephi.utils.PaletteUtils.Palette; /** * * @author Mathieu Bastian */ public class HeatMapPanel extends javax.swing.JPanel { private PaletteComboBox paletteComboBox; private GradientSlider slider; private JCheckBox dontPaintUnreachableCheckbox; private JCheckBox invertPaletteCheckbox; private boolean usePalette = false; /** Creates new form HeatMapPanel */ public HeatMapPanel(Color[] gradientColors, float[] gradientPositions, boolean dontPaintUnreachable) { initComponents(); //Slider slider = new GradientSlider(GradientSlider.HORIZONTAL, gradientPositions, gradientColors); slider.putClientProperty("GradientSlider.includeOpacity", "false"); gradientPanel.add(slider); //Paint dontPaintUnreachableCheckbox = new JCheckBox(); dontPaintUnreachableCheckbox.setSelected(dontPaintUnreachable); dontPaintUnreachableCheckbox.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N dontPaintUnreachableCheckbox.setText(org.openide.util.NbBundle.getMessage(HeatMapPanel.class, "HeatMapPanel.dontPaintUnreachableCheckbox.text")); // NOI18N dontPaintUnreachableCheckbox.setPreferredSize(new java.awt.Dimension(139, 28)); gradientPanel.add(dontPaintUnreachableCheckbox); //Invert invertPaletteCheckbox = new JCheckBox(); invertPaletteCheckbox.setSelected(dontPaintUnreachable); invertPaletteCheckbox.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N invertPaletteCheckbox.setText(org.openide.util.NbBundle.getMessage(HeatMapPanel.class, "HeatMapPanel.invertPalette.text")); // NOI18N invertPaletteCheckbox.setPreferredSize(new java.awt.Dimension(139, 28)); invertPaletteCheckbox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { paletteComboBox.initReverse(); } }); //Palette combo paletteComboBox = new PaletteComboBox(PaletteUtils.getSequencialPalettes()); palettePanel.add(paletteComboBox); palettePanel.add(invertPaletteCheckbox); //Init events modeComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (modeComboBox.getSelectedIndex() == 0) { usePalette = false; initMode(); } else { usePalette = true; initMode(); } } }); initMode(); } private void initMode() { if (usePalette) { gradientPanel.setVisible(false); palettePanel.setVisible(true); } else { gradientPanel.setVisible(true); palettePanel.setVisible(false); } } public boolean isUsePalette() { return usePalette; } public void setStatus(String status) { statusLabel.setText(status); } public Color[] getGradientColors() { return (Color[]) slider.getColors(); } public float[] getGradientPositions() { return slider.getThumbPositions(); } public boolean isDontPaintUnreachable() { return dontPaintUnreachableCheckbox.isSelected(); } public Palette getSelectedPalette() { return (Palette) paletteComboBox.getSelectedItem(); } /** 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() { statusLabel = new javax.swing.JLabel(); labelMode = new javax.swing.JLabel(); modeComboBox = new javax.swing.JComboBox(); gradientPanel = new javax.swing.JPanel(); labelGradient = new javax.swing.JLabel(); palettePanel = new javax.swing.JPanel(); labelPalette = new javax.swing.JLabel(); setPreferredSize(new java.awt.Dimension(654, 28)); statusLabel.setFont(new java.awt.Font("Tahoma", 0, 10)); statusLabel.setText(org.openide.util.NbBundle.getMessage(HeatMapPanel.class, "HeatMapPanel.statusLabel.text")); // NOI18N labelMode.setFont(new java.awt.Font("Tahoma", 0, 10)); labelMode.setText(org.openide.util.NbBundle.getMessage(HeatMapPanel.class, "HeatMapPanel.labelMode.text")); // NOI18N modeComboBox.setFont(new java.awt.Font("Tahoma", 0, 10)); modeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Gradient", "Palette" })); gradientPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 5, 0)); labelGradient.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N labelGradient.setText(org.openide.util.NbBundle.getMessage(HeatMapPanel.class, "HeatMapPanel.labelGradient.text")); // NOI18N labelGradient.setPreferredSize(new java.awt.Dimension(45, 28)); gradientPanel.add(labelGradient); palettePanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 5, 0)); labelPalette.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N labelPalette.setText(org.openide.util.NbBundle.getMessage(HeatMapPanel.class, "HeatMapPanel.labelPalette.text")); // NOI18N labelPalette.setPreferredSize(new java.awt.Dimension(45, 28)); palettePanel.add(labelPalette); 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(statusLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(labelMode) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(modeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(gradientPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 399, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(palettePanel, javax.swing.GroupLayout.PREFERRED_SIZE, 363, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(23, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(statusLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(labelMode, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(modeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(gradientPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(palettePanel, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) ); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel gradientPanel; private javax.swing.JLabel labelGradient; private javax.swing.JLabel labelMode; private javax.swing.JLabel labelPalette; private javax.swing.JComboBox modeComboBox; private javax.swing.JPanel palettePanel; private javax.swing.JLabel statusLabel; // End of variables declaration//GEN-END:variables private class PaletteComboBox extends JComboBox { private Palette[] palettes; public PaletteComboBox(Palette[] pallettes) { super(pallettes); this.palettes = pallettes; PaletteListCellRenderer r = new PaletteListCellRenderer(); r.setPreferredSize(new Dimension(70, 18)); r.setOpaque(true); setRenderer(r); initReverse(); } public void initReverse() { if (invertPaletteCheckbox.isSelected()) { int selectedIndex = getSelectedIndex(); DefaultComboBoxModel newModel = new DefaultComboBoxModel(); for (int i = 0; i < getModel().getSize(); i++) { newModel.addElement(PaletteUtils.reversePalette((Palette) getModel().getElementAt(i))); } setModel(newModel); setSelectedIndex(selectedIndex); } else { int selectedIndex = getSelectedIndex(); setModel(new DefaultComboBoxModel(palettes)); setSelectedIndex(selectedIndex); } } //Renderer private class PaletteListCellRenderer extends JLabel implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { //int selectedIndex = ((Integer) value).intValue(); if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } //Set icon Palette p = (Palette) value; PaletteIcon icon = new PaletteIcon(p.getColors()); setIcon(icon); return this; } } } private static class PaletteIcon implements Icon { private static int COLOR_WIDTH = 13; private static int COLOR_HEIGHT = 13; private static Color BORDER_COLOR = new Color(0x444444); private Color[] colors; public PaletteIcon(Color[] colors) { this.colors = colors; } public int getIconWidth() { return COLOR_WIDTH * colors.length; } public int getIconHeight() { return COLOR_HEIGHT + 2; } public void paintIcon(Component c, Graphics g, int x, int y) { for (int i = 0; i < colors.length; i++) { g.setColor(BORDER_COLOR); g.drawRect(x + 2 + i * COLOR_WIDTH, y, COLOR_WIDTH, COLOR_HEIGHT); g.setColor(colors[i]); g.fillRect(x + 2 + i * COLOR_WIDTH + 1, y + 1, COLOR_WIDTH - 1, COLOR_HEIGHT - 1); } } } }