/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * LegendPanel.java * Copyright (C) 2000 University of Waikato, Hamilton, New Zealand * */ package weka.gui.visualize; import weka.core.FastVector; import weka.core.Instances; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JColorChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; /** * This panel displays legends for a list of plots. If a given plot * has a custom colour defined then this panel allows the colour to * be changed. * * @author Mark Hall (mhall@cs.waikato.ac.nz) * @version $Revision: 4752 $ */ public class LegendPanel extends JScrollPane { /** for serialization */ private static final long serialVersionUID = -1262384440543001505L; /** the list of plot elements */ protected FastVector m_plots; /** the panel that contains the legend entries */ protected JPanel m_span=null; /** a list of components that need to be repainted when a colour is changed */ protected FastVector m_Repainters = new FastVector(); /** * Inner class for handling legend entries */ protected class LegendEntry extends JPanel { /** for serialization */ private static final long serialVersionUID = 3879990289042935670L; /** the data for this legend entry */ private PlotData2D m_plotData=null; /** the index (in the list of plots) of the data for this legend--- used to draw the correct shape for this data */ private int m_dataIndex; /** the text part of this legend */ private JLabel m_legendText; /** displays the point shape associated with this legend entry */ private JPanel m_pointShape; public LegendEntry(PlotData2D data, int dataIndex) { javax.swing.ToolTipManager.sharedInstance().setDismissDelay(5000); m_plotData = data; m_dataIndex = dataIndex; // this.setBackground(Color.black); /* this.setPreferredSize(new Dimension(0, 20)); this.setMinimumSize(new Dimension(0, 20)); */ if (m_plotData.m_useCustomColour) { this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if ((e.getModifiers() & e.BUTTON1_MASK) == e.BUTTON1_MASK) { Color tmp = JColorChooser.showDialog (LegendPanel.this, "Select new Color", m_plotData.m_customColour); if (tmp != null) { m_plotData.m_customColour = tmp; m_legendText.setForeground(tmp); if (m_Repainters.size() > 0) { for (int i=0;i<m_Repainters.size();i++) { ((Component)(m_Repainters.elementAt(i))).repaint(); } } LegendPanel.this.repaint(); } } } }); } m_legendText = new JLabel(m_plotData.m_plotName); m_legendText.setToolTipText(m_plotData.getPlotNameHTML()); if (m_plotData.m_useCustomColour) { m_legendText.setForeground(m_plotData.m_customColour); } this.setLayout(new BorderLayout()); this.add(m_legendText, BorderLayout.CENTER); /* GridBagLayout gb = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.gridx=0;constraints.gridy=0;constraints.weightx=5; */ m_pointShape = new JPanel() { private static final long serialVersionUID = -7048435221580488238L; public void paintComponent(Graphics gx) { super.paintComponent(gx); if (!m_plotData.m_useCustomColour) { gx.setColor(Color.black); } else { gx.setColor(m_plotData.m_customColour); } Plot2D.drawDataPoint(10,10,3,m_dataIndex,gx); } }; // m_pointShape.setBackground(Color.black); m_pointShape.setPreferredSize(new Dimension(20, 20)); m_pointShape.setMinimumSize(new Dimension(20, 20)); this.add(m_pointShape, BorderLayout.WEST); } } /** * Constructor */ public LegendPanel() { this.setBackground(Color.blue); setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS); } /** * Set the list of plots to generate legend entries for * @param pl a list of plots */ public void setPlotList(FastVector pl) { m_plots = pl; updateLegends(); } /** * Adds a component that will need to be repainted if the user * changes the colour of a label. * @param c the component to be repainted */ public void addRepaintNotify(Component c) { m_Repainters.addElement(c); } /** * Redraw the panel with the legend entries */ private void updateLegends() { if (m_span == null) { m_span = new JPanel(); } JPanel padder = new JPanel(); JPanel padd2 = new JPanel(); m_span.setPreferredSize(new Dimension(m_span.getPreferredSize().width, (m_plots.size() + 1) * 20)); m_span.setMaximumSize(new Dimension(m_span.getPreferredSize().width, (m_plots.size() + 1) * 20)); LegendEntry tmp; GridBagLayout gb = new GridBagLayout(); GridBagLayout gb2 = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); m_span.removeAll(); padder.setLayout(gb); m_span.setLayout(gb2); constraints.anchor = GridBagConstraints.CENTER; constraints.gridx=0;constraints.gridy=0;constraints.weightx=5; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.gridwidth=1;constraints.gridheight=1; constraints.insets = new Insets(0, 0, 0, 0); padder.add(m_span, constraints); constraints.gridx=0;constraints.gridy=1;constraints.weightx=5; constraints.fill = GridBagConstraints.BOTH; constraints.gridwidth=1;constraints.gridheight=1;constraints.weighty=5; constraints.insets = new Insets(0, 0, 0, 0); padder.add(padd2, constraints); constraints.weighty=0; setViewportView(padder); constraints.anchor = GridBagConstraints.CENTER; constraints.gridx=0;constraints.gridy=0;constraints.weightx=5; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.gridwidth=1;constraints.gridheight=1;constraints.weighty=5; constraints.insets = new Insets(2,4,2,4); //int numLines = ((PlotData2D)m_plots.elementAt(0)).getPlotName().split("<br>").length; for (int i=0;i<m_plots.size();i++) { tmp = new LegendEntry((PlotData2D)m_plots.elementAt(i),i); constraints.gridy = i; /* constraints.gridheight = 1; if (numLines > 0) { constraints.gridheight = (numLines + 2); } */ m_span.add(tmp, constraints); } } /** * Main method for testing this class * @param args a list of arff files */ public static void main(String [] args) { try { if (args.length < 1) { System.err.println("Usage : weka.gui.visualize.LegendPanel " +"<dataset> [dataset2], [dataset3],..."); System.exit(1); } final javax.swing.JFrame jf = new javax.swing.JFrame("Weka Explorer: Legend"); jf.setSize(100,100); jf.getContentPane().setLayout(new BorderLayout()); final LegendPanel p2 = new LegendPanel(); jf.getContentPane().add(p2, BorderLayout.CENTER); jf.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { jf.dispose(); System.exit(0); } }); FastVector plotList = new FastVector(); for (int j=0;j<args.length;j++) { System.err.println("Loading instances from " + args[j]); java.io.Reader r = new java.io.BufferedReader( new java.io.FileReader(args[j])); Instances i = new Instances(r); PlotData2D tmp = new PlotData2D(i); if (j != 1) { tmp.m_useCustomColour = true; tmp.m_customColour = Color.red; } tmp.setPlotName(i.relationName()); plotList.addElement(tmp); } p2.setPlotList(plotList); jf.setVisible(true); } catch (Exception ex) { System.err.println(ex.getMessage()); ex.printStackTrace(); } } }