/*
* 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.JaBox;
/** A panel to change the parameters of a box object. */
public class JaxoBoxOptionsPanel extends JPanel implements ActionListener {
private ResourceBundle language =
ResourceBundle.getBundle(JaxoPrefs.getPref(JaxoPrefs.PREF_LANGUAGE));
private Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
private JaBox 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 JaxoBoxOptionsPanel(JaBox box) {
this.theBox = box;
sBox = language.getString("Box_parameters");
theIcon =
new ImageIcon(JaxoBoxOptionsPanel.class.getClassLoader()
.getResource("japlot/jaxodraw/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) Math.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 + Math.abs(relw);
newYfin = y + Math.abs(relh);
}
if (((relw >= 0) && (relh < 0)) || ((relw <= 0) && (relh > 0))) {
newXin = x;
newYin = y + Math.abs(relh);
newXfin = x + Math.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 = Math.abs(xfin - xin);
newHeight = Math.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.