CaRMtl/eric/controls/JControlsManager.java

451 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 java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import rene.util.xml.XmlTag;
import rene.util.xml.XmlWriter;
import rene.zirkel.ZirkelCanvas;
import rene.zirkel.objects.ExpressionObject;
import rene.zirkel.objects.TextObject;
import eric.GUI.palette.PaletteManager;
import eric.JZirkelCanvas;
import eric.bar.JPropertiesBar;
import rene.gui.Global;
import rene.zirkel.objects.ConstructionObject;
/**
*
* @author erichake
*/
public class JControlsManager {
static Color bordercolor1=new Color(80, 80, 80);
static Color bordercolor2=new Color(180, 180, 250);
static Color bordercolor3=new Color(255, 25, 25);
static int MAGNET=10;
ZirkelCanvas ZC;
public ArrayList<JCanvasPanel> CPs=new ArrayList();
Rectangle r=new Rectangle();
Rectangle r2=new Rectangle();
ArrayList<XmlTag> XmlTags=new ArrayList();
public JControlsManager(final ZirkelCanvas zc) {
ZC=zc;
}
public void addControl(final JCanvasPanel jcp, final boolean editme,
final int x, final int y, final int w, final int h) {
jcp.setDims(x, y, w, h);
CPs.add(jcp);
ZC.add(jcp);
showHandles(jcp);
ZC.revalidate();
if (editme) {
JPropertiesBar.EditObject(jcp);
}
}
public JCanvasCheckBox addChkBox(final ExpressionObject o, final int x,
final int y, final int w, final int h) {
final JCanvasCheckBox jcb=new JCanvasCheckBox(ZC, o);
addControl(jcb, o==null, x, y, w, h);
return jcb;
}
public JCanvasButton addButton(final ExpressionObject o, final int x,
final int y, final int w, final int h) {
final JCanvasButton jcb=new JCanvasButton(ZC, o);
addControl(jcb, o==null, x, y, w, h);
return jcb;
}
public JCanvasTxtfield addTxtField(final ExpressionObject o, final int x,
final int y, final int w, final int h) {
final JCanvasTxtfield jcb=new JCanvasTxtfield(ZC, o);
addControl(jcb, o==null, x, y, w, h);
return jcb;
}
public JCanvasSlider addSlider(final ExpressionObject o, final int x,
final int y, final int w, final int h) {
final JCanvasSlider jcs=new JCanvasSlider(ZC, o, -5, 5, -2);
addControl(jcs, o==null, x, y, w, h);
return jcs;
}
public JCanvasPopup addPopup(final ExpressionObject o, final int x,
final int y, final int w, final int h) {
final JCanvasPopup jcp=new JCanvasPopup(ZC, o);
addControl(jcp, o==null, x, y, w, h);
return jcp;
}
public void analyseResize(final JCanvasPanel jp) {
r=jp.getBounds(r);
for (int i=0; i<CPs.size(); i++) {
final JCanvasPanel jp2=(JCanvasPanel) CPs.get(i);
if (!jp2.equals(jp)) {
r2=jp2.getBounds(r2);
if (Math.abs(r2.x+r2.width-r.x-r.width)<MAGNET) {
jp.grow(r2.x+r2.width-r.x-r.width, 0);
showBordersRight(jp);
return;
}
}
}
showBordersRight(jp);
}
public void analyseXY(final JCanvasPanel jp) {
r=jp.getBounds(r);
for (int i=0; i<CPs.size(); i++) {
final JCanvasPanel jp2=(JCanvasPanel) CPs.get(i);
if (!jp2.equals(jp)) {
r2=jp2.getBounds(r2);
// LEFT
if (Math.abs(r2.x-r.x)<MAGNET) {
jp.setLocation(r2.x, r.y);
r=jp.getBounds(r);
}
// RIGHT
if (Math.abs(r2.x+r2.width-r.x-r.width)<MAGNET) {
jp.setLocation(r2.x+r2.width-r.width, r.y);
r=jp.getBounds(r);
}
// //HCENTER
// if (Math.abs(r2.x+r2.width/2-r.x-r.width/2)<MAGNET) {
// jp.setLocation(r2.x+r2.width/2-r.width/2, r.y);
// r=jp.getBounds(r);
// }
// //TOP
// if (Math.abs(r2.y-r.y)<MAGNET) {
// jp.setLocation(r.x, r2.y);
// r=jp.getBounds(r);
// }
// //BOTTOM
// if (Math.abs(r2.y+r2.height-r.y-r.height)<MAGNET) {
// jp.setLocation(r.x, r2.y+r2.height-r.height);
// r=jp.getBounds(r);
// }
// VCENTER
if (Math.abs(r2.y+r2.height/2-r.y-r.height/2)<MAGNET) {
jp.setLocation(r.x, r2.y+r2.height/2-r.height/2);
r=jp.getBounds(r);
}
}
}
showBorders(jp);
}
public void showBordersRight(final JCanvasPanel jp) {
r=jp.getBounds(r);
for (int i=0; i<CPs.size(); i++) {
final JCanvasPanel jp2=(JCanvasPanel) CPs.get(i);
if (!jp2.equals(jp)) {
r2=jp2.getBounds(r2);
jp2.hideBorder();
// RIGHT
if ((r2.x+r2.width-r.x-r.width)==0) {
jp2.showBorder();
}
}
}
}
public void showBorders(final JCanvasPanel jp) {
r=jp.getBounds(r);
for (int i=0; i<CPs.size(); i++) {
final JCanvasPanel jp2=(JCanvasPanel) CPs.get(i);
if (!jp2.equals(jp)) {
r2=jp2.getBounds(r2);
jp2.hideBorder();
// LEFT
if (r2.x==r.x) {
jp2.showBorder();
}
// RIGHT
if ((r2.x+r2.width-r.x-r.width)==0) {
jp2.showBorder();
}
// //CENTER
// if ((r2.x+r2.width/2-r.x-r.width/2)==0) {
// jp2.showBorder();
//
// }
// //TOP
// if (r2.y==r.y) {
// jp2.showBorder();
// }
// //BOTTOM
// if ((r2.y+r2.height-r.y-r.height)==0) {
// jp2.showBorder();
//
// }
if ((r2.y+r2.height/2-r.y-r.height/2)==0) {
jp2.showBorder();
}
}
}
}
public void updateDigits() {
for (int i=0; i<CPs.size(); i++) {
final JCanvasPanel jp2=(JCanvasPanel) CPs.get(i);
jp2.setVal(jp2.getVal());
}
}
public void hideBorders(final JCanvasPanel jp) {
for (int i=0; i<CPs.size(); i++) {
final JCanvasPanel jp2=(JCanvasPanel) CPs.get(i);
if (!jp2.equals(jp)) {
jp2.hideBorder();
}
}
}
public void hideHandles(final JCanvasPanel jp) {
for (int i=0; i<CPs.size(); i++) {
final JCanvasPanel jp2=(JCanvasPanel) CPs.get(i);
if (!jp2.equals(jp)) {
jp2.hideHandle();
}
}
}
public void showHandles(final JCanvasPanel jp) {
hideHandles(jp);
jp.showHandle();
}
public static boolean createControl(final ZirkelCanvas zc,
final MouseEvent e) {
if (JZirkelCanvas.getCurrentJZF()==null) {
return false;
}
if (JZirkelCanvas.isRestrictedSession()) {
return false;
}
if (e.isPopupTrigger()) {
return false;
}
final int x=e.getX();
final int y=e.getY();
final JControlsManager myJCM=zc.JCM;
if (PaletteManager.isSelected("ctrl_slider")) {
myJCM.addSlider(null, x, y, 200, 29);
return true;
} else if (PaletteManager.isSelected("ctrl_popup")) {
myJCM.addPopup(null, x, y, 120, 22);
return true;
} else if (PaletteManager.isSelected("ctrl_chkbox")) {
myJCM.addChkBox(null, x, y, 30, 22);
return true;
} else if (PaletteManager.isSelected("ctrl_txtfield")) {
myJCM.addTxtField(null, x, y, 120, 22);
return true;
} else if (PaletteManager.isSelected("ctrl_button")) {
myJCM.addButton(null, x, y, 100, 22);
return true;
}
return false;
}
public void removeAllControls() {
while (CPs.size()!=0) {
final JCanvasPanel jp=(JCanvasPanel) CPs.get(0);
CPs.remove(jp);
ZC.delete(jp.O);
ZC.remove(jp);
}
ZC.revalidate();
}
public static void removeOwnerControl(ZirkelCanvas zc,ConstructionObject o){
if (!(o instanceof ExpressionObject)) return;
for (int i=0; i<zc.JCM.CPs.size(); i++) {
JCanvasPanel jp=zc.JCM.CPs.get(i);
if (o==jp.O) {
zc.JCM.removeControl(jp);
}
}
}
public void removeControl(final JCanvasPanel jp) {
CPs.remove(jp);
ZC.delete(jp.O);
ZC.remove(jp);
ZC.revalidate();
}
public static void PrintXmlTags(final ZirkelCanvas zc, final XmlWriter xml) {
for (int i=0; i<zc.JCM.CPs.size(); i++) {
((JCanvasPanel) zc.JCM.CPs.get(i)).PrintXmlTags(xml);
}
}
public void addSlider(final XmlTag tag) {
final ExpressionObject o=(ExpressionObject) ZC.getConstruction().find(tag.getValue("Ename"));
final JCanvasSlider jcs=addSlider(o, Integer.parseInt(tag.getValue("x")), Integer.parseInt(tag.getValue("y")), Integer.parseInt(tag.getValue("w")), Integer.parseInt(tag.getValue("h")));
jcs.hidden=Boolean.valueOf(tag.getValue("hidden")).booleanValue();
jcs.showcom=Boolean.valueOf(tag.getValue("showC")).booleanValue();
jcs.showunit=Boolean.valueOf(tag.getValue("showU")).booleanValue();
jcs.showval=Boolean.valueOf(tag.getValue("showV")).booleanValue();
jcs.lbl_com=tag.getValue("C");
jcs.lbl_unit=tag.getValue("U");
// jcs.lbl_val=tag.getValue("V");
jcs.xTICKS=Double.valueOf(tag.getValue("T")).doubleValue();
jcs.xMIN=Double.valueOf(tag.getValue("min")).doubleValue();
jcs.xMAX=Double.valueOf(tag.getValue("max")).doubleValue();
jcs.setVal(Double.valueOf(tag.getValue("V")).doubleValue());
jcs.setTicks(jcs.xTICKS);
jcs.JCS.setSnapToTicks(Boolean.valueOf(tag.getValue("fixT")).booleanValue());
jcs.JCS.setPaintTicks(Boolean.valueOf(tag.getValue("showT")).booleanValue());
jcs.setGoodKnobPos(Double.valueOf(tag.getValue("V")).doubleValue());
}
public void addTxtField(final XmlTag tag) {
final ExpressionObject o=(ExpressionObject) ZC.getConstruction().find(tag.getValue("Ename"));
final JCanvasTxtfield jcs=addTxtField(o, Integer.parseInt(tag.getValue("x")), Integer.parseInt(tag.getValue("y")), Integer.parseInt(tag.getValue("w")), Integer.parseInt(tag.getValue("h")));
jcs.hidden=Boolean.valueOf(tag.getValue("hidden")).booleanValue();
jcs.showcom=Boolean.valueOf(tag.getValue("showC")).booleanValue();
jcs.showunit=Boolean.valueOf(tag.getValue("showU")).booleanValue();
jcs.showval=Boolean.valueOf(tag.getValue("showV")).booleanValue();
jcs.lbl_com=tag.getValue("C");
jcs.lbl_unit=tag.getValue("U");
jcs.setVal(tag.getValue("txt"));
jcs.JCB.setText(tag.getValue("txt"));
}
public void addChkBox(final XmlTag tag) {
final ExpressionObject o=(ExpressionObject) ZC.getConstruction().find(tag.getValue("Ename"));
final JCanvasCheckBox jcs=addChkBox(o, Integer.parseInt(tag.getValue("x")), Integer.parseInt(tag.getValue("y")), Integer.parseInt(tag.getValue("w")), Integer.parseInt(tag.getValue("h")));
jcs.hidden=Boolean.valueOf(tag.getValue("hidden")).booleanValue();
jcs.showcom=Boolean.valueOf(tag.getValue("showC")).booleanValue();
jcs.showunit=Boolean.valueOf(tag.getValue("showU")).booleanValue();
jcs.showval=Boolean.valueOf(tag.getValue("showV")).booleanValue();
jcs.lbl_com=tag.getValue("C");
jcs.lbl_unit=tag.getValue("U");
final double chked=Double.valueOf(tag.getValue("V")).doubleValue();
jcs.setVal(chked);
jcs.JCB.setSelected(chked==1);
}
public void addButton(final XmlTag tag) {
final ExpressionObject o=(ExpressionObject) ZC.getConstruction().find(tag.getValue("Ename"));
final JCanvasButton jcs=addButton(o, Integer.parseInt(tag.getValue("x")), Integer.parseInt(tag.getValue("y")), Integer.parseInt(tag.getValue("w")), Integer.parseInt(tag.getValue("h")));
jcs.hidden=Boolean.valueOf(tag.getValue("hidden")).booleanValue();
jcs.showcom=Boolean.valueOf(tag.getValue("showC")).booleanValue();
jcs.showunit=Boolean.valueOf(tag.getValue("showU")).booleanValue();
jcs.showval=Boolean.valueOf(tag.getValue("showV")).booleanValue();
jcs.lbl_com=tag.getValue("C");
jcs.lbl_unit=tag.getValue("U");
jcs.setVal(Double.valueOf(tag.getValue("V")).doubleValue());
// try {
// // jcs.setVal(Double.valueOf(tag.getValue("V")).doubleValue());
// jcs.setVal(o.getValue());
// } catch (Exception ex) {
//
// }
jcs.setComment(jcs.lbl_com);
}
public void addPopup(final XmlTag tag) {
final ExpressionObject o=(ExpressionObject) ZC.getConstruction().find(tag.getValue("Ename"));
final JCanvasPopup jcs=addPopup(o, Integer.parseInt(tag.getValue("x")), Integer.parseInt(tag.getValue("y")), Integer.parseInt(tag.getValue("w")), Integer.parseInt(tag.getValue("h")));
jcs.hidden=Boolean.valueOf(tag.getValue("hidden")).booleanValue();
jcs.showcom=Boolean.valueOf(tag.getValue("showC")).booleanValue();
jcs.showunit=Boolean.valueOf(tag.getValue("showU")).booleanValue();
jcs.showval=Boolean.valueOf(tag.getValue("showV")).booleanValue();
jcs.lbl_com=tag.getValue("C");
jcs.lbl_unit=tag.getValue("U");
jcs.setItems(tag.getValue("Items").replace("@@@", "\n"));
final double v=Double.valueOf(tag.getValue("V")).doubleValue();
jcs.setVal(Math.round(v));
jcs.JCB.setSelectedIndex((int) Math.round(v-1));
// jcs.JCB.setSelected(chked==1);
}
/**
* Called by new3Dwindow : localize all strings that you can find in a new
* 3D window (floor,coordinate system...).
*/
public void fix3Dcomments() {
if (CPs.size()>1) {
JCanvasPanel jp=(JCanvasPanel) CPs.get(0);
jp.setComment(Global.Loc("canvas.3D.floor"));
jp=(JCanvasPanel) CPs.get(1);
jp.setComment(Global.Loc("canvas.3D.system"));
final TextObject t=(TextObject) ZC.getConstruction().find("Text2");
if (t!=null) {
t.setLines(Global.Loc("canvas.3D.rightclic"));
}
}
}
public void collectXmlTag(final XmlTag tag) {
XmlTags.add(tag);
}
public void readXmlTags() {
for (int i=0; i<XmlTags.size(); i++) {
final XmlTag tag=(XmlTag) XmlTags.get(i);
if (tag.name().equals("CTRLslider")) {
addSlider(tag);
} else if (tag.name().equals("CTRLcheckbox")) {
addChkBox(tag);
} else if (tag.name().equals("CTRLbutton")) {
addButton(tag);
} else if (tag.name().equals("CTRLpopup")) {
addPopup(tag);
} else if (tag.name().equals("CTRLtxtfield")) {
addTxtField(tag);
}
}
if (XmlTags.size()>0) {
XmlTags.clear();
hideHandles(null);
}
}
}