443 lines
15 KiB
Java
443 lines
15 KiB
Java
/*
|
|
|
|
Copyright 2006 Rene Grothmann, modified by 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 rene.zirkel.construction;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Dimension;
|
|
import java.awt.Graphics;
|
|
import java.awt.PopupMenu;
|
|
import java.awt.datatransfer.Clipboard;
|
|
import java.awt.datatransfer.ClipboardOwner;
|
|
import java.awt.datatransfer.StringSelection;
|
|
import java.awt.datatransfer.Transferable;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.OutputStreamWriter;
|
|
import java.io.PrintWriter;
|
|
import java.util.Enumeration;
|
|
import java.util.Vector;
|
|
import javax.swing.BoxLayout;
|
|
import javax.swing.JButton;
|
|
import javax.swing.JComboBox;
|
|
import javax.swing.JComponent;
|
|
|
|
import eric.JEricPanel;
|
|
|
|
import rene.gui.ButtonAction;
|
|
import rene.gui.CheckboxMenuItemAction;
|
|
import rene.gui.ChoiceAction;
|
|
import rene.gui.DoActionListener;
|
|
import rene.gui.Global;
|
|
import rene.gui.MenuItemAction;
|
|
import rene.lister.Lister;
|
|
import rene.lister.ListerMouseEvent;
|
|
import rene.zirkel.ZirkelCanvas;
|
|
import rene.zirkel.objects.AngleObject;
|
|
import rene.zirkel.objects.ConstructionObject;
|
|
import rene.zirkel.objects.ExpressionObject;
|
|
import rene.zirkel.objects.FixedAngleObject;
|
|
import rene.zirkel.objects.FunctionObject;
|
|
import rene.zirkel.objects.PointObject;
|
|
import rene.zirkel.objects.PrimitiveCircleObject;
|
|
import rene.zirkel.objects.PrimitiveLineObject;
|
|
|
|
public class ConstructionDisplayPanel extends JEricPanel implements
|
|
DoActionListener, ActionListener, ClipboardOwner {
|
|
|
|
private static final long serialVersionUID=1L;
|
|
private static int control_height=25;
|
|
private JEricPanel controls;
|
|
public Lister V;
|
|
public Vector W;
|
|
Construction C;
|
|
ZirkelCanvas ZC;
|
|
JComboBox Ch;
|
|
CheckboxMenuItemAction Visible;
|
|
boolean ShowVisible=true;
|
|
CheckboxMenuItemAction Sort, Description, Size, Formula;
|
|
public static String Choices[]={"all", "points", "lines", "circles",
|
|
"angles", "expressions", "other"};
|
|
public int State=0;
|
|
PopupMenu PM;
|
|
JButton Menu;
|
|
|
|
@Override
|
|
public void paintComponent(Graphics g) {
|
|
Dimension d=getSize();
|
|
g.setColor(Color.white);
|
|
g.fillRect(0, 0, d.width, d.height);
|
|
super.paintComponent(g);
|
|
}
|
|
|
|
public ConstructionDisplayPanel(final ZirkelCanvas zc) {
|
|
ZC=zc;
|
|
C=ZC.getConstruction();
|
|
V=new Lister();
|
|
V.setMode(true, false, true, true);
|
|
V.addActionListener(this);
|
|
State=Global.getParameter("constructiondisplay.state", 0);
|
|
|
|
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
|
|
setOpaque(false);
|
|
|
|
controls=new JEricPanel();
|
|
controls.setLayout(new BoxLayout(controls, BoxLayout.X_AXIS));
|
|
controls.setOpaque(false);
|
|
Ch=new ChoiceAction(this, "choices");
|
|
for (final String choice : Choices) {
|
|
Ch.addItem(Global.name("constructiondisplay."+choice));
|
|
|
|
}
|
|
controls.add(Ch);
|
|
Menu=new ButtonAction(this, "?", "Menu");
|
|
controls.add(Menu);
|
|
add(controls);
|
|
setListerState();
|
|
makePopup();
|
|
add(V);
|
|
}
|
|
|
|
// Only called by LeftPanelContent init method :
|
|
public void fixPanelSize(int w, int h) {
|
|
fixsize(this, w, h);
|
|
fixsize(V, w, h-control_height);
|
|
fixsize(controls, w, control_height);
|
|
controls.revalidate();
|
|
}
|
|
|
|
private static 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 void reload() {
|
|
V.clear();
|
|
C=ZC.getConstruction();
|
|
Enumeration e=null;
|
|
if (Global.getParameter("constructiondisplay.sort", true)) {
|
|
e=C.getSortedElements();
|
|
} else {
|
|
e=C.elements();
|
|
}
|
|
W=new Vector();
|
|
outer:
|
|
while (e.hasMoreElements()) {
|
|
final ConstructionObject o=(ConstructionObject) e.nextElement();
|
|
// if ((eric.JMacrosTools.CurrentJZF.restrictedSession)
|
|
// && (o.isSuperHidden()))
|
|
// continue outer;
|
|
if (ShowVisible&&o.mustHide(ZC)) {
|
|
continue outer;
|
|
}
|
|
if (ZC.job_isTargets()&&o.isSuperHidden()) {
|
|
continue outer;
|
|
}
|
|
if (ZC.isRestricted()&&o.isSuperHidden()) {
|
|
continue outer;
|
|
}
|
|
switch (State) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
if (!(o instanceof PointObject)) {
|
|
continue outer;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!(o instanceof PrimitiveLineObject)
|
|
||(o instanceof FixedAngleObject)) {
|
|
continue outer;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!(o instanceof PrimitiveCircleObject)) {
|
|
continue outer;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!(o instanceof AngleObject||o instanceof FixedAngleObject)) {
|
|
continue outer;
|
|
}
|
|
break;
|
|
case 5:
|
|
if (!(o instanceof ExpressionObject||o instanceof FunctionObject)) {
|
|
continue outer;
|
|
}
|
|
break;
|
|
case 6:
|
|
if (o instanceof PointObject
|
|
||o instanceof PrimitiveLineObject
|
|
||o instanceof PrimitiveCircleObject
|
|
||o instanceof AngleObject
|
|
||o instanceof ExpressionObject
|
|
||o instanceof FunctionObject) {
|
|
continue outer;
|
|
}
|
|
break;
|
|
}
|
|
V.addElement(o);
|
|
W.addElement(o);
|
|
}
|
|
//V.showLast();
|
|
updateDisplay();
|
|
}
|
|
|
|
public void updateDisplay() {
|
|
V.updateDisplay();
|
|
}
|
|
|
|
@Override
|
|
public void doAction(final String o) {
|
|
if (o.equals("Edit")) {
|
|
final int selected[]=V.getSelectedIndices();
|
|
if (selected.length==0) {
|
|
return;
|
|
}
|
|
if (selected.length==1) {
|
|
((ConstructionObject) W.elementAt(selected[0])).edit(ZC, true, false);
|
|
} else {
|
|
final Vector v=new Vector();
|
|
for (final int element : selected) {
|
|
v.addElement(W.elementAt(element));
|
|
}
|
|
ZC.validate();
|
|
}
|
|
ZC.repaint();
|
|
} else if (o.equals("Copy")) {
|
|
try {
|
|
final ByteArrayOutputStream ba=new ByteArrayOutputStream(
|
|
50000);
|
|
final PrintWriter po=new PrintWriter(new OutputStreamWriter(
|
|
ba), true);
|
|
V.save(po);
|
|
po.close();
|
|
final String S=ba.toString();
|
|
final Clipboard clip=getToolkit().getSystemClipboard();
|
|
final StringSelection sel=new StringSelection(S);
|
|
clip.setContents(sel, this);
|
|
} catch (final Exception e) {
|
|
}
|
|
} else if (o.equals("Delete")) {
|
|
final int selected[]=V.getSelectedIndices();
|
|
if (selected.length==0) {
|
|
return;
|
|
}
|
|
final Vector v=new Vector();
|
|
for (final int element : selected) {
|
|
v.addElement(W.elementAt(element));
|
|
}
|
|
ZC.delete(v);
|
|
ZC.repaint();
|
|
ZC.reset();
|
|
reload();
|
|
} else if (o.equals("Hide")) {
|
|
final int selected[]=V.getSelectedIndices();
|
|
if (selected.length==0) {
|
|
return;
|
|
}
|
|
for (final int element : selected) {
|
|
final ConstructionObject oc=(ConstructionObject) W.elementAt(element);
|
|
oc.setHidden(!oc.isHidden());
|
|
}
|
|
ZC.repaint();
|
|
updateDisplay();
|
|
} else if (o.equals("SuperHide")) {
|
|
final int selected[]=V.getSelectedIndices();
|
|
if (selected.length==0) {
|
|
return;
|
|
}
|
|
for (final int element : selected) {
|
|
final ConstructionObject oc=(ConstructionObject) W.elementAt(element);
|
|
oc.setSuperHidden(true);
|
|
}
|
|
ZC.repaint();
|
|
updateDisplay();
|
|
} else if (o.equals("HighLight")) {
|
|
final int selected[]=V.getSelectedIndices();
|
|
if (selected.length==0) {
|
|
return;
|
|
}
|
|
for (final int element : selected) {
|
|
final ConstructionObject oc=(ConstructionObject) W.elementAt(element);
|
|
oc.setStrongSelected(true);
|
|
}
|
|
final Graphics g=ZC.getGraphics();
|
|
if (g!=null) {
|
|
ZC.paint(g);
|
|
g.dispose();
|
|
try {
|
|
Thread.sleep(200);
|
|
} catch (final Exception e) {
|
|
}
|
|
}
|
|
for (final int element : selected) {
|
|
final ConstructionObject oc=(ConstructionObject) W.elementAt(element);
|
|
oc.setStrongSelected(false);
|
|
}
|
|
ZC.repaint();
|
|
if (selected.length==1) {
|
|
final ConstructionObject oc=(ConstructionObject) W.elementAt(selected[0]);
|
|
ZC.setConstructionObject(oc);
|
|
}
|
|
|
|
} else if (o.equals("Menu")) {
|
|
displayPopup(V.L, 10, 10);
|
|
}
|
|
ZC.requestFocus();
|
|
}
|
|
|
|
public void itemToggleAction(final String o) {
|
|
if (o.equals("Sort")) {
|
|
Sort.setState(!Sort.getState());
|
|
itemAction("Sort", Sort.getState());
|
|
} else if (o.equals("Visible")) {
|
|
Visible.setState(!Visible.getState());
|
|
itemAction("Visible", Visible.getState());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void itemAction(final String o, final boolean flag) {
|
|
if (o.equals("Sort")) {
|
|
Global.setParameter("constructiondisplay.sort", Sort.getState());
|
|
reload();
|
|
} else if (o.equals("Visible")) {
|
|
ShowVisible=Visible.getState();
|
|
reload();
|
|
} else if (o.equals("Description")) {
|
|
Global.setParameter("constructiondisplay.listerstate",
|
|
ConstructionObject.DescriptionState);
|
|
setListerState();
|
|
updateDisplay();
|
|
} else if (o.equals("Size")) {
|
|
Global.setParameter("constructiondisplay.listerstate",
|
|
ConstructionObject.SizeState);
|
|
setListerState();
|
|
updateDisplay();
|
|
} else if (o.equals("Formula")) {
|
|
Global.setParameter("constructiondisplay.listerstate",
|
|
ConstructionObject.FormulaState);
|
|
setListerState();
|
|
updateDisplay();
|
|
} else if (flag) {
|
|
State=Ch.getSelectedIndex();
|
|
Global.setParameter("constructiondisplay.state", State);
|
|
reload();
|
|
}
|
|
}
|
|
|
|
public void setListerState() {
|
|
final int state=Global.getParameter("constructiondisplay.listerstate",
|
|
ConstructionObject.SizeState);
|
|
V.setState(state);
|
|
if (PM!=null) {
|
|
Description.setState(state==ConstructionObject.DescriptionState);
|
|
Size.setState(state==ConstructionObject.SizeState);
|
|
Formula.setState(state==ConstructionObject.FormulaState);
|
|
}
|
|
}
|
|
|
|
// @Override
|
|
// public Dimension getPreferredSize() {
|
|
// return new Dimension(Global.getParameter(
|
|
// "options.constructiondisplay.width", 200), 400);
|
|
// }
|
|
/**
|
|
* React on click events for the construction list
|
|
*/
|
|
@Override
|
|
public void actionPerformed(final ActionEvent e) {
|
|
if (e.getSource()==V&&(e instanceof ListerMouseEvent)) {
|
|
final ListerMouseEvent em=(ListerMouseEvent) e;
|
|
if (em.rightMouse()) {
|
|
displayPopup(em.getEvent().getComponent(),
|
|
em.getEvent().getX(), em.getEvent().getY());
|
|
} else {
|
|
if (em.clickCount()>=2) {
|
|
doAction("Edit");
|
|
} else {
|
|
doAction("HighLight");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display the popup menu. Create it, if necessary.
|
|
*
|
|
* @param e
|
|
* mouse event
|
|
*/
|
|
public void displayPopup(final Component c, final int x, final int y) {
|
|
PM.show(c, x, y);
|
|
}
|
|
|
|
public void makePopup() {
|
|
PM=new PopupMenu();
|
|
PM.add(new MenuItemAction(this,
|
|
Global.name("constructiondisplay.edit"), "Edit"));
|
|
PM.addSeparator();
|
|
PM.add(new MenuItemAction(this,
|
|
Global.name("constructiondisplay.hide"), "Hide"));
|
|
PM.add(new MenuItemAction(this, Global.name("constructiondisplay.superhide"), "SuperHide"));
|
|
PM.addSeparator();
|
|
PM.add(new MenuItemAction(this, Global.name("constructiondisplay.delete"), "Delete"));
|
|
PM.addSeparator();
|
|
Description=new CheckboxMenuItemAction(this, Global.name("constructiondisplay.description"), "Description");
|
|
Description.setState(Global.getParameter(
|
|
"constructiondisplay.description", false));
|
|
PM.add(Description);
|
|
Size=new CheckboxMenuItemAction(this, Global.name("constructiondisplay.size"), "Size");
|
|
Description.setState(Global.getParameter("constructiondisplay.size",
|
|
true));
|
|
PM.add(Size);
|
|
Formula=new CheckboxMenuItemAction(this, Global.name("constructiondisplay.formula"), "Formula");
|
|
Description.setState(Global.getParameter("constructiondisplay.formula",
|
|
false));
|
|
PM.add(Formula);
|
|
PM.addSeparator();
|
|
PM.add(new MenuItemAction(this,
|
|
Global.name("constructiondisplay.copy"), "Copy"));
|
|
V.L.add(PM);
|
|
PM.addSeparator();
|
|
Visible=new CheckboxMenuItemAction(this, Global.name("constructiondisplay.visible"), "Visible");
|
|
Visible.setState(true);
|
|
PM.add(Visible);
|
|
Sort=new CheckboxMenuItemAction(this, Global.name("constructiondisplay.sorted"), "Sort");
|
|
Sort.setState(Global.getParameter("constructiondisplay.sort", true));
|
|
PM.add(Sort);
|
|
setListerState();
|
|
}
|
|
|
|
@Override
|
|
public void lostOwnership(final Clipboard clipboard,
|
|
final Transferable contents) {
|
|
}
|
|
|
|
public void setListingBackground(final Color c) {
|
|
V.setListingBackground(c);
|
|
}
|
|
}
|