/* * ErrorBarPainterEditPanel.java of project jchart2d, a panel for configuration of a single ErrorBarConfigurable. Copyright (c) 2007 - 2011 * Achim Westermann, created on 09:50:20. * * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. * * This library 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * If you modify or optimize the code in a useful way please let me know. Achim.Westermann@gmx.de */ package info.monitorenter.gui.chart.controls.errorbarwizard; import info.monitorenter.gui.chart.IErrorBarPainter; import info.monitorenter.gui.chart.IPointPainterConfigurableUI; import info.monitorenter.gui.chart.events.ErrorBarPainterActionSetSegmentColor; import info.monitorenter.gui.chart.events.ErrorBarPainterActionSetSegmentPainter; import info.monitorenter.gui.chart.pointpainters.PointPainterDisc; import info.monitorenter.gui.chart.pointpainters.PointPainterLine; import info.monitorenter.gui.util.ColorIcon; import info.monitorenter.util.FileUtil; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.border.TitledBorder; /** * A panel for selection of {@link info.monitorenter.gui.chart.IErrorBarPainter#setStartPointPainter(IPointPainterConfigurableUI)} * {@link info.monitorenter.gui.chart.IErrorBarPainter#setEndPointPainter(info.monitorenter.gui.chart.IPointPainterConfigurableUI)} and * {@link info.monitorenter.gui.chart.IErrorBarPainter#setConnectionPainter(info.monitorenter.gui.chart.IPointPainterConfigurableUI)} . * <p> * * @author <a href="mailto:Achim.Westermann@gmx.de">Achim Westermann </a> * @version $Revision: 1.16 $ */ public class ErrorBarPainterEditPanel extends JPanel { /** * Base implementation that allows selection of an <code>{@link info.monitorenter.gui.chart.IPointPainter}</code> and it's * <code>{@link java.awt.Color}</code> and holds the parental <code>{@link IErrorBarPainter}</code> to assign the painter to (as a * segment: start, end or connetion). * <p> * * Implementations have to add the action listeners that defines to which segment of the <code>{@link IErrorBarPainter}</code>. the * configured painter will set to. * <p> * * @author <a href="mailto:Achim.Westermann@gmx.de">Achim Westermann</a> * * * @version $Revision: 1.16 $ */ private class SegmentChooserPanel extends JPanel { /** * An adaptor that registers itself as a <code>{@link PropertyChangeListener}</code> on an * <code>{@link IErrorBarPainter.ISegment}</code> and sets the color to the constructor given <code>{@link ColorIcon}</code>. * <p> * * @author <a href="mailto:Achim.Westermann@gmx.de">Achim Westermann</a> * * * @version $Revision: 1.16 $ */ final class ColorIconUpdater implements PropertyChangeListener { /** The color icon to adapt to the color of the segment. */ private ColorIcon m_adaptee; /** * Constructor with the adaptee which will stick to the color of the given segment. * <p> * * @param adaptee * the color icon to adapt the color property of the segment to. */ protected ColorIconUpdater(final ColorIcon adaptee) { this.m_adaptee = adaptee; } /** * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(final PropertyChangeEvent evt) { String property = evt.getPropertyName(); if (ErrorBarPainterEditPanel.SegmentChooserPanel.this.m_segment.getPropertySegmentColor().equals(property)) { this.m_adaptee.setColor((Color) evt.getNewValue()); } } } /** Generated <code>serialVersionUID</code>. */ private static final long serialVersionUID = 6645527616687209066L; /** The error bar painter segment to configure. */ protected IErrorBarPainter.ISegment m_segment; /** * Creates a panel that offers configuration of the given error bar painter. * <p> * * @param errorBarPainterSegement * the error bar painter segment to configure. */ public SegmentChooserPanel(final IErrorBarPainter.ISegment errorBarPainterSegement) { super(); this.m_segment = errorBarPainterSegement; this.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), errorBarPainterSegement.getName(), TitledBorder.LEFT, TitledBorder.DEFAULT_POSITION)); // complex layout needed for ensuring that // both labes are displayed vertically stacked but // with the same distance to their text fields regardless // of their label width: this.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.gridy = 0; gbc.insets = new Insets(2, 2, 2, 2); gbc.gridx = 0; // Obtaining model values and required data: // Color selector: final AbstractAction colorAction = new ErrorBarPainterActionSetSegmentColor(errorBarPainterSegement, this, "color"); // The select box for segment painters: // TODO: maybe check not to allow point painters that connect start and // end (e.g. line) to use in start and end segment. JComboBox painterSelector = new JComboBox(); IPointPainterConfigurableUI<?> pointPainter; IPointPainterConfigurableUI<?> usedPainter = errorBarPainterSegement.getPointPainter(); Action action; pointPainter = null; boolean painterSelected = false; action = new ErrorBarPainterActionSetSegmentPainter(errorBarPainterSegement, pointPainter, "Empty"); painterSelector.addItem(action); if (usedPainter == null) { painterSelector.setSelectedItem(action); } pointPainter = new PointPainterLine(); action = new ErrorBarPainterActionSetSegmentPainter(errorBarPainterSegement, pointPainter, FileUtil.cutExtension( pointPainter.getClass().getName()).getValue()); painterSelector.addItem(action); if (usedPainter != null && pointPainter.getClass().equals(usedPainter.getClass())) { painterSelector.setSelectedItem(action); painterSelected = true; } pointPainter = new PointPainterDisc(); action = new ErrorBarPainterActionSetSegmentPainter(errorBarPainterSegement, pointPainter, FileUtil.cutExtension( pointPainter.getClass().getName()).getValue()); painterSelector.addItem(action); if (usedPainter != null && pointPainter.getClass().equals(usedPainter.getClass())) { painterSelector.setSelectedItem(action); painterSelected = true; } // handling events of the combo box: painterSelector.addActionListener(new ActionListener() { /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(final ActionEvent e) { JComboBox source = (JComboBox) e.getSource(); Action currentAction = (Action) source.getSelectedItem(); currentAction.actionPerformed(e); if(currentAction.getValue(Action.NAME).equals("Empty")) { colorAction.setEnabled(false); } else { colorAction.setEnabled(true); } } }); this.add(painterSelector, gbc); // Color selector config: ColorIcon colorIcon = new ColorIcon(errorBarPainterSegement.getColor()); colorAction.putValue(Action.SMALL_ICON, colorIcon); colorAction.setEnabled(painterSelected); JButton colorChooserButton = new JButton(colorAction); gbc.gridy = 1; // allow the color icon to update itself when the segment color changes: errorBarPainterSegement.addPropertyChangeListener(errorBarPainterSegement.getPropertySegmentColor(), new ColorIconUpdater( colorIcon)); this.add(colorChooserButton, gbc); } } /** Generated <code>serialVersionUID</code>. */ private static final long serialVersionUID = -6564631494967160532L; /** The error bar painter to configure with segments. */ private IErrorBarPainter m_errorBarPainter; /** * Creates a panel that offers configuration of the given error bar painter. * <p> * * @param errorBarPainter * the error bar painter to configure. */ public ErrorBarPainterEditPanel(final IErrorBarPainter errorBarPainter) { super(); this.m_errorBarPainter = errorBarPainter; // complex layout needed for ensuring that // both labels are displayed vertically stacked but // with the same distance to their text fields regardless // of their label width: this.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 0; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.gridy = 0; gbc.insets = new Insets(2, 2, 2, 2); // start segment: this.add(new SegmentChooserPanel(this.m_errorBarPainter.getSegmentStart()), gbc); // connection segment: gbc.gridy = 1; this.add(new SegmentChooserPanel(this.m_errorBarPainter.getSegmentConnection()), gbc); // end segment: gbc.gridy = 2; this.add(new SegmentChooserPanel(this.m_errorBarPainter.getSegmentEnd()), gbc); } }