/*

 * 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;

import 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 org.apache.commons.math3.util.FastMath;


import jhplot.jadraw.JaTextBox;


/** A panel to change the parameters of a box object. */
public class JaTextOptionsPanel extends JPanel implements ActionListener {
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ResourceBundle language =
        ResourceBundle.getBundle(JaxoPrefs.getPref(JaxoPrefs.PREF_LANGUAGE));
    private Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    private JaTextBox theBox;
    private String sBox;
    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 newXfin;
    private int newYfin;
    private int newWidth;
    private int newHeight;
    private int newRelWidth;
    private int newRelHeight;
    private int newXin;
    private int newYin;
    private float newStroke;
    private boolean changed = false;

    /** Constructor: pops up a panel that allows to change all the parameters
     *  of the box object.
     * @param box The arc object that is edited.
     */
    public JaTextOptionsPanel(JaTextBox box) {
        this.theBox = box;

        sBox = language.getString("Box_parameters");
        theIcon =
            new ImageIcon(JaTextOptionsPanel.class.getClassLoader()
                                                   .getResource("icons/box.png"));

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

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

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

        newWidth = theBox.getSize().width;
        newHeight = theBox.getSize().height;
        newRelWidth = theBox.getRelSize().width;
        newRelHeight = theBox.getRelSize().height;

        getXYCoord(theBox.getX(), theBox.getY(), newRelWidth, newRelHeight);

        newStroke = theBox.getStroke();

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

        SpinnerNumberModel modelXin =
            new SpinnerNumberModel(newXin, 0, d.width, 1);
        JLabel xin = new JLabel("Xmin: ", JLabel.RIGHT);
        pxin.add(xin);

        JSpinner spxin = new JSpinner(modelXin);
        pxin.add(spxin);

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

        SpinnerNumberModel modelYin =
            new SpinnerNumberModel(newYin, 0, d.height, 1);
        JLabel yin = new JLabel("Ymin: ", JLabel.RIGHT);
        pyin.add(yin);

        JSpinner spyin = new JSpinner(modelYin);
        pyin.add(spyin);

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

        SpinnerNumberModel modelXfin =
            new SpinnerNumberModel(newXfin, 0, d.width, 1);
        JLabel xfin = new JLabel("Xmax: ", JLabel.RIGHT);
        pxfin.add(xfin);

        JSpinner spxfin = new JSpinner(modelXfin);
        pxfin.add(spxfin);

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

        SpinnerNumberModel modelYfin =
            new SpinnerNumberModel(newYfin, 0, d.height, 1);
        JLabel yfin = new JLabel("Ymax: ", JLabel.RIGHT);
        pyfin.add(yfin);

        JSpinner spyfin = new JSpinner(modelYfin);
        pyfin.add(spyfin);

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

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

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

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

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

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

        TitledBorder dimSTitle =
            BorderFactory.createTitledBorder(language.getString(
                    "Position/Size"));
        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, sBox,
                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;
                }
                theBox.setColor(newColor);
                theBox.setFillColor(newFillColor);
            }

            newXin = (int) modelXin.getNumber().intValue();
            newYin = (int) modelYin.getNumber().intValue();
            newXfin = (int) modelXfin.getNumber().intValue();
            newYfin = (int) modelYfin.getNumber().intValue();

            newStroke = (float) FastMath.abs(modelstin.getNumber().floatValue());

            theBox.setStroke(newStroke);

            setNewBox(newXin, newYin, newXfin, newYfin);

            theBox.setX(newXin);
            theBox.setY(newYin);

            if (((newRelWidth >= 0) && (newRelHeight >= 0))
                    || ((newRelWidth < 0) && (newRelHeight < 0))) {
                theBox.setRelWAndH(newWidth, newHeight);
            } else if (((newRelWidth >= 0) && (newRelHeight < 0))
                    || ((newRelWidth < 0) && (newRelHeight >= 0))) {
                theBox.setRelWAndH(newWidth, -newHeight);
            }

            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 void getXYCoord(int x, int y, int relw, int relh) {
        if (((relw > 0) && (relh >= 0)) || ((relw < 0) && (relh <= 0))) {
            newXin = x;
            newYin = y;
            newXfin = x + FastMath.abs(relw);
            newYfin = y + FastMath.abs(relh);
        }

        if (((relw >= 0) && (relh < 0)) || ((relw <= 0) && (relh > 0))) {
            newXin = x;
            newYin = y + FastMath.abs(relh);
            newXfin = x + FastMath.abs(relw);
            newYfin = y;
        }
    }

    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;
    }

    private void setNewBox(int xin, int yin, int xfin, int yfin) {
        newWidth = FastMath.abs(xfin - xin);
        newHeight = FastMath.abs(yfin - yin);
        newRelWidth = xfin - xin;
        newRelHeight = yfin - yin;

        if ((newRelWidth > 0) && (newRelHeight >= 0)) {
            newXin = xin;
            newYin = yin;
        }

        if ((newRelWidth < 0) && (newRelHeight <= 0)) {
            newXin = xfin;
            newYin = yfin;
        }

        if ((newRelWidth >= 0) && (newRelHeight < 0)) {
            newXin = xin;
            newYin = yin + newRelHeight;
        }

        if ((newRelWidth <= 0) && (newRelHeight > 0)) {
            newXin = xin + newRelWidth;
            newYin = yin;
        }
    }
}

 

Ads help maintain this website.