CaRMtl/eric/controls/JCanvasPanel.java

533 lines
16 KiB
Java

/*
Copyright 2006 Eric Hakenholz
This file is part of C.a.R. software.
C.a.R. is a 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, version 3 of the License.
C.a.R. 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, see <http://www.gnu.org/licenses/>.
*/
package eric.controls;
import eric.GUI.palette.PaletteManager;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import eric.JEricPanel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import rene.gui.Global;
import rene.util.xml.XmlWriter;
import rene.zirkel.ZirkelCanvas;
import rene.zirkel.objects.ExpressionObject;
import eric.JPointName;
import eric.JZirkelCanvas;
import eric.bar.JPropertiesBar;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import javax.swing.GrayFilter;
import rene.zirkel.tools.JSmacroTool;
import rene.zirkel.tools.Scripts_SetMouseDrag;
/**
*
* @author erichake
*/
public class JCanvasPanel extends JEricPanel implements MouseListener,
MouseMotionListener, ChangeListener {
/**
*
*/
private static final long serialVersionUID=1L;
ImageIcon ctrlresizeicon=new ImageIcon(getClass().getResource(
"/eric/GUI/icons/palette/ctrl_resize.png"));
static int COMFONTSIZE=14;
static int COMSIZE=50;
static Color COMCOLOR=new Color(80, 80, 80);
JComponent JSL;
String lbl_com="", lbl_val="", lbl_unit="°";
boolean showcom=true, showval=true, showunit=false;
JLabel JCPlabel=new JLabel();
JButton JCPresize=new JButton();
// int W, H;
ZirkelCanvas ZC;
public ExpressionObject O;
boolean hidden=false;
private boolean showborder1=false;
private boolean showborder2=false;
private boolean showhandle=false;
private MouseEvent pressed;
private Point location;
private final DecimalFormat decFormat;
public boolean hidden(){
return hidden;
}
public void paint(Graphics g) {
Graphics2D g2D=null;
BufferedImage sprite=null;
if ((!isHidden())||(ZC.getShowHidden())) {
sprite=new BufferedImage(getSize().width,
getSize().height, BufferedImage.TYPE_INT_ARGB);
g2D=sprite.createGraphics();
// super.paintChildren(g2D);
super.paint(g2D);
}
if ((isHidden())&&(ZC.getShowHidden())) {
final ImageFilter filter=new GrayFilter(true, 60);
final Image disImage=this.createImage(new FilteredImageSource(
sprite.getSource(), filter));
final ImageIcon myicn=new ImageIcon(disImage);
g2D.drawImage(myicn.getImage(), 0, 0, getSize().width, getSize().height, this);
}
if (sprite!=null) {
ZC.I.getGraphics().drawImage(sprite, getLocation().x,
getLocation().y, this);
}
// when mouseentered :
final Dimension d=getSize();
if (O.selected()) {
g.setColor(JControlsManager.bordercolor3);
g.drawRect(0, 0, d.width-8, d.height-1);
}
else if(showhandle) {
final Graphics2D g2d=(Graphics2D) g;
final Rectangle2D rectangle=new Rectangle2D.Double(0, 0,
d.width-8, d.height-1);
g2d.setColor(new Color(119, 136, 153));
g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_BEVEL, 1f, new float[]{2f}, 0f));
g2d.draw(rectangle);
g.drawImage(ctrlresizeicon.getImage(), d.width-12,
d.height/2-4, this);
} else {
if (showborder1) {
g.setColor(JControlsManager.bordercolor1);
g.drawRect(0, 0, d.width-8, d.height-1);
} else if (showborder2) {
g.setColor(JControlsManager.bordercolor2);
g.drawRect(0, 0, d.width-8, d.height-1);
}
}
}
@Override
public void paintComponent(final Graphics g) {
}
// withoutExpr unused, just to make another constructor :
public JCanvasPanel(final ZirkelCanvas zc, final ExpressionObject o) {
super();
ZC=zc;
O=(o==null)?createExpression():o;
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
this.setOpaque(false);
this.addMouseListener(this);
this.addMouseMotionListener(this);
JCPlabel.setHorizontalAlignment(SwingConstants.LEFT);
JCPlabel.setFont(new Font(Global.GlobalFont, 0, COMFONTSIZE));
JCPlabel.setForeground(COMCOLOR);
// JCPresize.setIcon(ctrlresizeicon);
JCPresize.setOpaque(false);
JCPresize.setContentAreaFilled(false);
JCPresize.setBorder(BorderFactory.createEmptyBorder());
JCPresize.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
JCPresize.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent me) {
pressed=me;
}
@Override
public void mouseReleased(final MouseEvent me) {
ZC.JCM.hideBorders((JCanvasPanel) ((JComponent) me.getSource()).getParent());
}
});
JCPresize.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(final MouseEvent me) {
final int w=JSL.getSize().width+me.getX();
setDims(w-pressed.getX(), getSize().height);
ZC.JCM.analyseResize((JCanvasPanel) ((JComponent) me.getSource()).getParent());
}
});
decFormat=new DecimalFormat();
final DecimalFormatSymbols dfs=new DecimalFormatSymbols();
dfs.setDecimalSeparator('.');
decFormat.setDecimalFormatSymbols(dfs);
}
private ExpressionObject createExpression() {
final ExpressionObject o=new ExpressionObject(ZC.getConstruction(),
0, 0);
o.setDefaults();
o.setSuperHidden(true);
o.setOwnedByControl(true);
ZC.getConstruction().add(o);
if (JZirkelCanvas.getCurrentJZF()!=null) {
final int i=JZirkelCanvas.getCurrentJZF().getPointLabel().getCurrentLetterSetCode();
final boolean b=Global.getParameter("options.point.shownames",
false);
Global.setParameter("options.point.shownames", true);
final String s=JZirkelCanvas.getCurrentJZF().getPointLabel().setLetterSet(JPointName.minLettersSetCode);
Global.setParameter("options.point.shownames", b);
JZirkelCanvas.getCurrentJZF().getPointLabel().setLetterSet(i);
o.setName(s);
}
return o;
}
public int StringwWidth(final String s) {
// FontMetrics fm = getFontMetrics(getFont());
final FontMetrics fm=getFontMetrics(new Font(Global.GlobalFont, 0,
COMFONTSIZE));
return fm.stringWidth(s);
}
// MUST BE OVERRIDE :
public double getVal() {
return 0.0;
}
public void setOnlyValue(final double x) {
decFormat.setMaximumFractionDigits(Global.getParameter("digits.edit", 5));
lbl_val=String.valueOf(decFormat.format(x));
}
public void setVal(final double x) {
setOnlyValue(x);
setVal(String.valueOf(x));
}
public void setVal(final String s) {
JCPlabel.setText(goodLabel());
try {
O.setExpression(s, ZC.getConstruction());
ZC.recompute();
setDims();
// ZC.validate();
// ZC.repaint();
} catch (final Exception ex) {
}
}
public void setDims(final int x, final int y, final int w, final int h) {
final int W=w+StringwWidth(JCPlabel.getText())+15;
fixsize(JCPlabel, StringwWidth(JCPlabel.getText()), h);
fixsize(JCPresize, 15, h);
fixsize(JSL, w, h);
revalidate();
setBounds(x, y, W, h);
ZC.validate();
ZC.repaint();
}
public void setDims(final int w, final int h) {
final int x=getLocation().x;
final int y=getLocation().y;
setDims(x, y, w, h);
}
public void setDims() {
setDims(JSL.getSize().width, JSL.getSize().height);
}
public void grow(final int w, final int h) {
setDims(JSL.getSize().width+w, JSL.getSize().height+h);
}
public String getComment() {
return lbl_com;
}
public void setComment(final String s) {
lbl_com=s;
JCPlabel.setText(goodLabel());
setDims();
}
public String getUnit() {
return lbl_unit;
}
public void setUnit(final String s) {
lbl_unit=s;
JCPlabel.setText(goodLabel());
setDims();
}
public void setShowComment(final boolean b) {
showcom=b;
JCPlabel.setText(goodLabel());
setDims();
}
public void setShowVal(final boolean b) {
showval=b;
JCPlabel.setText(goodLabel());
setDims();
}
public void setShowUnit(final boolean b) {
showunit=b;
JCPlabel.setText(goodLabel());
setDims();
}
public boolean getShowComment() {
return showcom;
}
public boolean getShowVal() {
return showval;
}
public boolean getShowUnit() {
return showunit;
}
public String goodLabel() {
String lbl="";
if (showcom) {
lbl+=lbl_com;
}
if (showval) {
lbl+=lbl_val;
}
if (showunit) {
lbl+=lbl_unit;
}
return lbl;
}
static public void fixsize(final JComponent cp, final int w, final int h) {
final Dimension d=new Dimension(w, h);
cp.setMaximumSize(d);
cp.setMinimumSize(d);
cp.setPreferredSize(d);
cp.setSize(d);
}
public boolean isTargetMode(){
return ((ZC.getTool() instanceof Scripts_SetMouseDrag)&&(this instanceof JCanvasButton));
}
public boolean isEditMode() {
if (JZirkelCanvas.getCurrentJZF()==null) {
return false;
}
boolean bool=(PaletteManager.isSelected("edit"))
||(PaletteManager.isSelected("ctrl_edit"));
bool=(bool||(PaletteManager.isSelected("ctrl_slider")));
bool=(bool||(PaletteManager.isSelected("ctrl_popup")));
bool=(bool||(PaletteManager.isSelected("ctrl_chkbox")));
bool=(bool||(PaletteManager.isSelected("ctrl_txtfield")));
bool=(bool||(PaletteManager.isSelected("ctrl_button")));
bool=(bool||(PaletteManager.isSelected("delete")));
bool=(bool||(PaletteManager.isSelected("hide")));
return bool;
}
public boolean isDeleteMode() {
if (JZirkelCanvas.getCurrentJZF()==null) {
return false;
}
return (PaletteManager.isSelected("delete"));
}
public boolean isHideToolSelected() {
if (JZirkelCanvas.getCurrentJZF()==null) {
return false;
}
return (PaletteManager.isSelected("hide"));
}
public boolean isHidden() {
return (hidden||O.testConditional("hidden"));
}
public void setHidden(final boolean b) {
hidden=b;
}
public void showBorder() {
showborder2=true;
repaint();
}
public void hideBorder() {
showborder2=false;
repaint();
}
public void showHandle() {
showhandle=true;
setDims();
}
public void hideHandle() {
showhandle=false;
setDims();
}
public void mouseClicked(final MouseEvent arg0) {
}
public void mousePressed(final MouseEvent e) {
pressed=e;
if (e.isPopupTrigger()) {
return;
}
ZC.JCM.hideHandles(null);
}
public void mouseReleased(final MouseEvent e) {
if (e.isPopupTrigger()) {
return;
}
if ((!ZC.getShowHidden())&&(isHidden())) {
return;
}
if (isHideToolSelected()) {
setHidden(!isHidden());
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
showborder1=false;
repaint();
}
if (isDeleteMode()) {
ZC.JCM.removeControl(this);
}
ZC.JCM.hideBorders(this);
if ((isEditMode())&&(!isHidden())) {
showHandle();
JPropertiesBar.EditObject(this);
}
if (isTargetMode()) {
Scripts_SetMouseDrag tool=(Scripts_SetMouseDrag) ZC.getTool();
tool.addFromControl(O, ZC);
repaint();
}
}
public void mouseEntered(final MouseEvent arg0) {
if (isHidden()) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
showborder1=false;
// repaint();
return;
}
if (isTargetMode()||isEditMode()) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
showborder1=true;
repaint();
}
}
public void mouseExited(final MouseEvent arg0) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
showborder1=false;
repaint();
}
public void mouseDragged(final MouseEvent me) {
if (!isEditMode()) {
return;
}
location=getLocation(location);
int x=location.x-pressed.getX()+me.getX();
int y=location.y-pressed.getY()+me.getY();
if (x<0) {
x=0;
} else if (x+getSize().width>ZC.getSize().width) {
x=ZC.getSize().width-getSize().width;
}
if (y<0) {
y=0;
} else if (y+getSize().height>ZC.getSize().height) {
y=ZC.getSize().height-getSize().height;
}
setLocation(x, y);
Toolkit.getDefaultToolkit().sync();
ZC.JCM.analyseXY(this);
}
public void mouseMoved(final MouseEvent arg0) {
}
// Change event from JSlider :
public void stateChanged(final ChangeEvent arg0) {
}
public void PrintXmlTags(final XmlWriter xml) {
xml.printArg("Ename", ""+O.getName());
xml.printArg("x", ""+getLocation().x);
xml.printArg("y", ""+getLocation().y);
xml.printArg("w", ""+JSL.getSize().width);
xml.printArg("h", ""+JSL.getSize().height);
xml.printArg("showC", ""+showcom);
xml.printArg("showU", ""+showunit);
xml.printArg("showV", ""+showval);
xml.printArg("hidden", ""+hidden);
xml.printArg("C", ""+lbl_com);
xml.printArg("U", ""+lbl_unit);
xml.printArg("V", ""+lbl_val);
}
}