/*

 * Title: japlot.jaxodraw
 * Description: Graphical user interface for drawing Feynman diagrams
 * @author Daniele Binosi 
 * @author Lukas Theussl  

 Copyright (C) 2003-2006,  Daniele Binosi and Lukas Theussl

 See the file LICENSE in the source distribution home directory
 for a full copy of the GPL (GNU General Public License).

    This file is part of japlot.jaxodraw.

    japlot.jaxodraw 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.

    japlot.jaxodraw 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


 */
package japlot.jaxodraw;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.MemoryImageSource;

import java.util.ResourceBundle;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.TitledBorder;

import jhplot.jadraw.JaVertexT5;


/** A panel to change the parameters of a vertex type 2 object
 * (a cross with a circle).
 */
public class JaxoVertexT5OptionsPanel extends JPanel implements ActionListener {
    private ResourceBundle language =
        ResourceBundle.getBundle(JaxoPrefs.getPref(JaxoPrefs.PREF_LANGUAGE));
    private JaVertexT5 theVertexT5;
    private Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    private String sVertex;
    private Icon theIcon;
    private ImageIcon colorPreviewIcon;
    private ImageIcon colorFillPreviewIcon;
    private JButton colorbt;
    private JButton colorFillbt;
    private JPanel colorPanel;
    private JPanel colorFillPanel;
    private TitledBorder colorPanelTitle;
    private TitledBorder colorFillPanelTitle;
    private Color newColor;
    private Color newFillColor;
    private Image colorPreview;
    private Image colorFillPreview;
    private int nx1;
    private int nx2;
    private int nx3;
    private int ny1;
    private int ny2;
    private int ny3;
    private float newStroke;
    private boolean changed = false;

    /** Constructor: pops up a panel that allows to change all the parameters
     *  of the vertexT5 object.
     * @param vertexT5 The vertexT5 object that is edited.
     */
    public JaxoVertexT5OptionsPanel(JaVertexT5 vertexT5) {
        this.theVertexT5 = vertexT5;

        sVertex = language.getString("Vertex_parameters");
        theIcon =
            new ImageIcon(JaxoVertexT5OptionsPanel.class.getClassLoader()
                                                        .getResource("japlot/jaxodraw/icons/vertexT5.png"));

        newColor = theVertexT5.getColor();
        newFillColor = theVertexT5.getFillColor();

        colorPreview = getChooserImage(newColor);
        colorFillPreview = getChooserImage(newFillColor);

        colorPreviewIcon = new ImageIcon(colorPreview);
        colorFillPreviewIcon = new ImageIcon(colorFillPreview);

        nx1 = (int) Math.round(theVertexT5.getX1());
        ny1 = (int) Math.round(theVertexT5.getY1());
        nx2 = (int) Math.round(theVertexT5.getX2());
        ny2 = (int) Math.round(theVertexT5.getY2());
        nx3 = (int) Math.round(theVertexT5.getX3());
        ny3 = (int) Math.round(theVertexT5.getY3());

        newStroke = theVertexT5.getStroke();

        // Dimension options
        JPanel px1 = new JPanel();
        px1.setLayout(new GridLayout(0, 2));

        SpinnerNumberModel modelX1 =
            new SpinnerNumberModel(nx1, 0, d.width, 1);
        JLabel lx1 = new JLabel("X1: ", JLabel.RIGHT);
        px1.add(lx1);

        JSpinner spx1 = new JSpinner(modelX1);
        px1.add(spx1);

        JPanel px2 = new JPanel();
        px2.setLayout(new GridLayout(0, 2));

        SpinnerNumberModel modelX2 =
            new SpinnerNumberModel(nx2, 0, d.width, 1);
        JLabel lx2 = new JLabel("X2: ", JLabel.RIGHT);
        px2.add(lx2);

        JSpinner spx2 = new JSpinner(modelX2);
        px2.add(spx2);

        JPanel px3 = new JPanel();
        px3.setLayout(new GridLayout(0, 2));

        SpinnerNumberModel modelX3 =
            new SpinnerNumberModel(nx3, 0, d.width, 1);
        JLabel lx3 = new JLabel("X3: ", JLabel.RIGHT);
        px3.add(lx3);

        JSpinner spx3 = new JSpinner(modelX3);
        px3.add(spx3);

        JPanel py1 = new JPanel();
        py1.setLayout(new GridLayout(0, 2));

        SpinnerNumberModel modelY1 =
            new SpinnerNumberModel(ny1, 0, d.height, 1);
        JLabel ly1 = new JLabel("Y1: ", JLabel.RIGHT);
        py1.add(ly1);

        JSpinner spy1 = new JSpinner(modelY1);
        py1.add(spy1);

        JPanel py2 = new JPanel();
        py2.setLayout(new GridLayout(0, 2));

        SpinnerNumberModel modelY2 =
            new SpinnerNumberModel(ny2, 0, d.height, 1);
        JLabel ly2 = new JLabel("Y2: ", JLabel.RIGHT);
        py2.add(ly2);

        JSpinner spy2 = new JSpinner(modelY2);
        py2.add(spy2);

        JPanel py3 = new JPanel();
        py3.setLayout(new GridLayout(0, 2));

        SpinnerNumberModel modelY3 =
            new SpinnerNumberModel(ny3, 0, d.height, 1);
        JLabel ly3 = new JLabel("Y3: ", JLabel.RIGHT);
        py3.add(ly3);

        JSpinner spy3 = new JSpinner(modelY3);
        py3.add(spy3);

        JPanel dimSPanel = new JPanel();
        GridBagLayout gb = new GridBagLayout();
        GridBagConstraints sc = new GridBagConstraints();
        dimSPanel.setLayout(gb);

        sc.gridx = 0;
        sc.gridy = 0;
        px1.setPreferredSize(new Dimension(120, 20));
        gb.setConstraints(px1, sc);
        dimSPanel.add(px1, sc);

        sc.gridx = 0;
        sc.gridy = 1;
        sc.insets = new Insets(3, 0, 3, 0);
        py1.setPreferredSize(new Dimension(120, 20));
        gb.setConstraints(py1, sc);
        dimSPanel.add(py1, sc);

        sc.gridx = 1;
        sc.gridy = 0;
        px2.setPreferredSize(new Dimension(120, 20));
        gb.setConstraints(px2, sc);
        dimSPanel.add(px2, sc);

        sc.gridx = 1;
        sc.gridy = 1;
        sc.insets = new Insets(3, 0, 3, 0);
        py2.setPreferredSize(new Dimension(120, 20));
        gb.setConstraints(py2, sc);
        dimSPanel.add(py2, sc);

        sc.gridx = 2;
        sc.gridy = 0;
        px3.setPreferredSize(new Dimension(120, 20));
        gb.setConstraints(px3, sc);
        dimSPanel.add(px3, sc);

        sc.gridx = 2;
        sc.gridy = 1;
        sc.insets = new Insets(3, 0, 3, 0);
        py3.setPreferredSize(new Dimension(120, 20));
        gb.setConstraints(py3, sc);
        dimSPanel.add(py3, sc);

        JPanel finalDimSPanel = new JPanel();
        finalDimSPanel.setLayout(new BoxLayout(finalDimSPanel, BoxLayout.X_AXIS));

        TitledBorder dimSTitle =
            BorderFactory.createTitledBorder("Points coordinates"); //intern!

        finalDimSPanel.setBorder(dimSTitle);
        finalDimSPanel.add(dimSPanel);

        // Stroke options
        JPanel pstin = new JPanel();
        GridBagLayout subgb = new GridBagLayout();
        GridBagConstraints subc = new GridBagConstraints();
        pstin.setLayout(subgb);

        SpinnerNumberModel modelstin =
            new SpinnerNumberModel(newStroke, 0.0, 100.0, 0.2);
        JLabel stin =
            new JLabel(language.getString("Line_Width"), JLabel.RIGHT);
        JSpinner spstin = new JSpinner(modelstin);

        subc.gridx = 0;
        subc.gridy = 0;
        subc.insets = new Insets(0, 5, 5, 5);
        subgb.setConstraints(stin, subc);
        pstin.add(stin, subc);

        subc.gridx = 1;
        subc.gridy = 0;
        spstin.setPreferredSize(new Dimension(50, 20));
        subgb.setConstraints(spstin, subc);
        pstin.add(spstin, subc);

        JPanel strSPanel = new JPanel();
        GridBagLayout gb1 = new GridBagLayout();
        GridBagConstraints sc1 = new GridBagConstraints();
        strSPanel.setLayout(gb1);

        sc1.gridx = 0;
        sc1.gridy = 0;
        gb1.setConstraints(pstin, sc1);
        strSPanel.add(pstin, sc1);

        JPanel finalStrSPanel = new JPanel();
        finalStrSPanel.setLayout(new BoxLayout(finalStrSPanel, BoxLayout.X_AXIS));

        TitledBorder strSTitle =
            BorderFactory.createTitledBorder(language.getString("Width"));
        finalStrSPanel.setBorder(strSTitle);
        finalStrSPanel.add(strSPanel);

        // Color options
        colorbt = new JButton(colorPreviewIcon);
        colorbt.addActionListener(this);
        colorPanel = new JPanel();
        colorPanelTitle =
            BorderFactory.createTitledBorder(language.getString("Line_color"));
        colorPanel.add(colorbt);

        if (JaxoColor.isGrayScale(newFillColor)) {
            colorPanelTitle.setTitleColor(JaxoColor.GRAYSCALE165);
            colorbt.setEnabled(false);
        }
        colorPanel.setBorder(colorPanelTitle);

        colorFillbt = new JButton(colorFillPreviewIcon);
        colorFillbt.addActionListener(this);
        colorFillPanel = new JPanel();
        colorFillPanelTitle =
            BorderFactory.createTitledBorder(language.getString("Fill_color"));
        colorFillPanel.setBorder(colorFillPanelTitle);
        colorFillPanel.add(colorFillbt);

        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();

        setLayout(gridbag);
        c.gridx = 0;
        c.gridy = 0;
        c.insets = new Insets(0, 0, 5, 5);
        gridbag.setConstraints(finalDimSPanel, c);
        add(finalDimSPanel, c);

        c.gridx = 0;
        c.gridy = 1;
        c.insets = new Insets(5, 0, 0, 5);
        gridbag.setConstraints(finalStrSPanel, c);
        add(finalStrSPanel, c);

        c.gridx = 1;
        c.gridy = 0;
        c.insets = new Insets(0, 5, 5, 0);
        colorPanel.setPreferredSize(new Dimension(100, 70));
        gridbag.setConstraints(colorPanel, c);
        add(colorPanel, c);

        c.gridx = 1;
        c.gridy = 1;
        c.insets = new Insets(5, 5, 0, 0);
        colorFillPanel.setPreferredSize(new Dimension(100, 70));
        gridbag.setConstraints(colorFillPanel, c);
        add(colorFillPanel, c);

        String[] optionButtonNames =
        {language.getString("Accept"), language.getString("Cancel")};
        int n =
            JOptionPane.showOptionDialog(this, this, sVertex,
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE,
                theIcon, optionButtonNames, optionButtonNames[0]);

        if (n == JOptionPane.OK_OPTION) {
            if ((newColor != null) && (newFillColor != null)) {
                if (JaxoColor.isGrayScale(newFillColor)) {
                    newColor = JaxoColor.BLACK;
                }
                theVertexT5.setColor(newColor);
                theVertexT5.setFillColor(newFillColor);
            }

            newStroke = (float) Math.abs(modelstin.getNumber().floatValue());
            theVertexT5.setStroke(newStroke);

            double x1 = modelX1.getNumber().doubleValue();
            double y1 = modelY1.getNumber().doubleValue();
            double x2 = modelX2.getNumber().doubleValue();
            double y2 = modelY2.getNumber().doubleValue();
            double x3 = modelX3.getNumber().doubleValue();
            double y3 = modelY3.getNumber().doubleValue();

            theVertexT5.setVertexPts(x1, y1, x2, y2, x3, y3);

            changed = true;
        }
    }

    /** Indicates whether the user actually changed any of the parameters.
     * @return True if any of the properties have been changed.
     */
    public final boolean hasChanged() {
        return changed;
    }

    /** Checks for ActionEvents that have ocurred on the panel,
     *  presently only whether one of the color buttons has been pressed
     *  in which case a new color chooser panel is popped up.
     * @param evt The ActionEvent that has ocurred.
     */
    public final void actionPerformed(ActionEvent evt) {
        if (evt.getSource() == colorbt) {
            JaxoColorChooser colorChooser = new JaxoColorChooser();
            newColor = colorChooser.color(newColor, false);

            if (newColor != null) {
                colorPreviewIcon = new ImageIcon(getChooserImage(newColor));
                colorbt.setIcon(colorPreviewIcon);
            }
        }

        if (evt.getSource() == colorFillbt) {
            JaxoColorChooser colorChooser = new JaxoColorChooser();
            newFillColor = colorChooser.color(newFillColor, true);

            if (newFillColor != null) {
                colorFillPreviewIcon =
                    new ImageIcon(getChooserImage(newFillColor));
                colorFillbt.setIcon(colorFillPreviewIcon);
                colorPanelTitle =
                    BorderFactory.createTitledBorder(language.getString(
                            "Line_color"));
                colorbt.setEnabled(true);
                if (JaxoColor.isGrayScale(newFillColor)) {
                    colorPanelTitle.setTitleColor(JaxoColor.GRAYSCALE165);
                    colorbt.setEnabled(false);
                }
                colorPanel.setBorder(colorPanelTitle);
            }
        }
    }

    /////////////////////////////////////////////////////////////////////////
    //
    //   private auxiliary methods  //
    //
    /////////////////////////////////////////////////////////////////////////
    private Image getChooserImage(Color iconColor) {
        MemoryImageSource source;
        int[] pixels;
        int width = 40;
        int height = 15;
        int size = width * height;
        pixels = new int[size];

        for (int i = 0; i < size; i++) {
            pixels[i] = iconColor.getRGB();
        }

        source = new MemoryImageSource(width, height, pixels, 0, width);

        Image jaxColorBox = createImage(source);

        return jaxColorBox;
    }
}

 

Ads help maintain this website.