CaRMtl/eric/macros/NodePopupMenu.java
2018-09-04 22:51:42 -04:00

429 lines
15 KiB
Java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package eric.macros;
import eric.FileTools;
import eric.GUI.palette.PaletteManager;
import eric.JZirkelCanvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Vector;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import javax.swing.plaf.SeparatorUI;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import rene.gui.Global;
import rene.zirkel.ZirkelCanvas;
import rene.zirkel.macro.Macro;
import rene.zirkel.macro.MacroItem;
/**
*
* @author erichake
*/
public class NodePopupMenu extends JPopupMenu {
private final CTree macrostree;
private JDefaultMutableTreeNode SelectedNode;
private TreePath[] SelectedPath;
private JMenuItem runitem, renitem, delitem, tolibitem, tofileitem, saveitem, updtitem, propitem, dupitem;
public NodePopupMenu(CTree mytree) {
macrostree=mytree;
dupitem=new JMenuItem(Global.Loc("macros.popup.duplicate"));
dupitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
duplicatenodes();
}
});
propitem=new JMenuItem(Global.Loc("macros.popup.properties"));
propitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
showproperties();
}
});
runitem=new JMenuItem(Global.Loc("macros.popup.run"));
runitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
// runmacro();
}
});
renitem=new JMenuItem(Global.Loc("macros.popup.rename"));
renitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
renamenode();
}
});
delitem=new JMenuItem(Global.Loc("macros.popup.delete"));
delitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
deletenodes();
}
});
tolibitem=new JMenuItem(Global.Loc("macros.popup.addtolibrary"));
tolibitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
changeMacroType(0);
}
});
tofileitem=new JMenuItem(Global.Loc("macros.popup.removefromlibrary"));
tofileitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
changeMacroType(2);
}
});
saveitem=new JMenuItem(Global.Loc("macros.popup.saveas"));
saveitem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent event) {
saveMacros();
}
});
}
public void handleMouseClick(final MouseEvent e) {
final TreePath path=macrostree.getPathForLocation(e.getX(), e.getY());
if (path!=null) {
SelectedNode=(JDefaultMutableTreeNode) path.getLastPathComponent();
SelectedPath=macrostree.getSelectionPaths();
if ((SelectedPath.length==1)&&(SelectedNode.isLeaf())) {
if (JMacrosInspector.isDialogVisible()) {
JMacrosInspector.changemacro(SelectedNode);
} else {
PaletteManager.deselectgeomgroup();
SelectedNode.runZmacro();
}
}
}
}
void actualiseproperties() {
// throw new UnsupportedOperationException("Not yet implemented");
}
private void showproperties() {
JMacrosInspector.openInspector(SelectedNode);
// new JMacrosInspector(SelectedNode);
}
public void handlePopup(final MouseEvent e) {
if (e.isPopupTrigger()) {
final TreePath path=macrostree.getPathForLocation(e.getX(), e.getY());
if (path!=null) {
macrostree.addSelectionPath(path);
SelectedNode=(JDefaultMutableTreeNode) path.getLastPathComponent();
SelectedPath=macrostree.getSelectionPaths();
// initSelectedPath();
this.removeAll();
if (SelectedPath.length>1) {
this.add(delitem);
if (!JZirkelCanvas.isRestrictedSession()) {
this.add(createSeparator());
this.add(tolibitem);
this.add(tofileitem);
this.add(createSeparator());
this.add(saveitem);
}
} else {
if (SelectedNode.isLeaf()) {
this.add(renitem);
if (!JZirkelCanvas.isRestrictedSession()) {
this.add(delitem);
this.add(dupitem);
}
this.add(createSeparator());
if (!JZirkelCanvas.isRestrictedSession()) {
this.add(tolibitem);
this.add(tofileitem);
this.add(createSeparator());
this.add(saveitem);
this.add(createSeparator());
}
this.add(runitem);
this.add(createSeparator());
this.add(propitem);
} else {
this.add(renitem);
this.add(delitem);
this.add(createSeparator());
if (!JZirkelCanvas.isRestrictedSession()) {
this.add(tolibitem);
this.add(tofileitem);
this.add(createSeparator());
this.add(saveitem);
}
}
}
this.show(e.getComponent(), e.getX(), e.getY());
}
}
}
public void addfolder() {
JDefaultMutableTreeNode root;
final JDefaultMutableTreeNode node=new JDefaultMutableTreeNode(Global.Loc("macros.untitledfolder"));
node.add(new JDefaultMutableTreeNode(Global.Loc("macros.emptynode")));
final TreePath[] paths=macrostree.getSelectionPaths();
if ((paths)!=null) {
root=(JDefaultMutableTreeNode) paths[0].getLastPathComponent();
if (root.isLeaf()) {
// if the first selected node is a leaf :
final DefaultMutableTreeNode father=(DefaultMutableTreeNode) root.getParent();
final int i=father.getIndex(root)+1;
((DefaultTreeModel) macrostree.getModel()).insertNodeInto(node,
father, i);
} else {
// if the first selected node is a folder :
((DefaultTreeModel) macrostree.getModel()).insertNodeInto(node,
root, root.getChildCount());
}
} else {
// There is no selected node :
((DefaultTreeModel) macrostree.getModel()).insertNodeInto(node,
macrostree.JML.getTopNode(),
macrostree.JML.getTopNode().getChildCount());
}
// Transformation d'un noeud en TreePath :
final TreePath tp=new TreePath(node.getPath());
macrostree.setEditable(true);
macrostree.startEditingAtPath(tp);
}
private void updateMacrosVector(JDefaultMutableTreeNode node) {
if (node.m==null) {
return;
}
String name=node.m.Name;
if (node.m.isProtected()) {
int ZCsSize=JZirkelCanvas.getZCsSize();
// delete the macro from all the ZirkelCanvas (in different tabs) :
for (int size=0; size<ZCsSize; size++) {
Vector V=JZirkelCanvas.getZC(size).getMacros();
for (int i=0; i<V.size(); i++) {
MacroItem mi=(MacroItem) V.get(i);
if (name.equals(mi.M.Name)) {
V.remove(mi);
continue;
}
}
}
// delete the macro from the library :
Vector W=MacroTools.getLibraryMacros();
for (int i=0; i<W.size(); i++) {
MacroItem mi=(MacroItem) W.get(i);
if (name.equals(mi.M.Name)) {
W.remove(mi);
continue;
}
}
} else {
// remove macro from the current ZirkelCanvas :
Vector V=JZirkelCanvas.getCurrentZC().getMacros();
for (int i=0; i<V.size(); i++) {
MacroItem mi=(MacroItem) V.get(i);
if (name.equals(mi.M.Name)) {
V.remove(mi);
return;
}
}
}
}
private void parse_deletenodes(JDefaultMutableTreeNode node) {
if (!(node.isLeaf())) {
for (int i=0; i<node.getChildCount(); i++) {
parse_deletenodes((JDefaultMutableTreeNode) node.getChildAt(i));
}
} else {
updateMacrosVector(node);
}
}
public void deletenodes() {
final TreePath[] paths=macrostree.getSelectionPaths();
if ((paths)!=null) {
final Object[] options={"Ok", "Cancel"};
final int rep=JOptionPane.showOptionDialog(null, Global.Loc("macros.question.delete"), "Warning",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
if (rep==0) {
for (final TreePath path : paths) {
final JDefaultMutableTreeNode node=(JDefaultMutableTreeNode) path.getLastPathComponent();
parse_deletenodes(node);
JDefaultMutableTreeNode father=(JDefaultMutableTreeNode) node.getParent();
((DefaultTreeModel) macrostree.getModel()).removeNodeFromParent(node);
while (father.getChildCount()==0) {
final JDefaultMutableTreeNode grandfather=(JDefaultMutableTreeNode) father.getParent();
((DefaultTreeModel) macrostree.getModel()).removeNodeFromParent(father);
father=grandfather;
}
}
}
}
}
public static String uniqueMacroName(String base) {
ZirkelCanvas zc=JZirkelCanvas.getCurrentZC();
if (zc==null) {
return base;
}
base=base.replaceAll("[\\s0-9]+$", "");
Vector V=zc.getMacros();
int num=0;
loop:
for (int i=0; i<V.size(); i++) {
MacroItem mi=(MacroItem) V.get(i);
if (base.equals(mi.M.Name)) {
num++;
base=base.replaceAll("[\\s0-9]+$", "")+" "+num;
continue loop;
}
}
return base;
}
public void duplicatenodes() {
try {
ZirkelCanvas zc=JZirkelCanvas.getCurrentZC();
// this is a very dirty way to clone a macro :
MacroItem mi=new MacroItem((Macro) SelectedNode.m.clone(), null);
final String[] mytab=mi.M.Name.split("/");
mi.M.setName(uniqueMacroName(mytab[mytab.length-1]));
final Vector ZFMacros=new Vector();
ZFMacros.add(mi);
final ByteArrayOutputStream out=new ByteArrayOutputStream();
zc.save(out, false, true, true, false, ZFMacros, "");
zc.load(new ByteArrayInputStream(out.toByteArray()), false, true);
JZirkelCanvas.ActualiseMacroPanel();
} catch (Exception e) {
}
}
public void renamenode() {
final TreePath[] paths=macrostree.getSelectionPaths();
if ((paths)!=null) {
macrostree.setEditable(true);
macrostree.startEditingAtPath(paths[0]);
}
}
private void changeMacroType(final int newtype) {
for (final TreePath element : SelectedPath) {
SelectedNode=(JDefaultMutableTreeNode) element.getLastPathComponent();
parse_changeMacroType(SelectedNode, newtype);
}
macrostree.repaint();
MacroTools.updateLibraryMacros();
MacroTools.populateMacrosTypeChanges();
}
private void parse_changeMacroType(final JDefaultMutableTreeNode node, final int newtype) {
if (node.isLeaf()) {
node.setType(newtype);
} else {
for (int i=0; i<node.getChildCount(); i++) {
parse_changeMacroType((JDefaultMutableTreeNode) node.getChildAt(i), newtype);
}
}
}
private void saveMacros() {
Vector ZFMacros;
ZFMacros=new Vector();
for (final TreePath element : SelectedPath) {
SelectedNode=(JDefaultMutableTreeNode) element.getLastPathComponent();
parse_saveMacros(SelectedNode, ZFMacros);
}
String filename=FileTools.getSaveFile(false);
if (filename!=null) {
final String ext=(filename.endsWith(".mcr"))?"":".mcr";
JZirkelCanvas.getCurrentZF().dosave(filename+ext, false, true, true, false, ZFMacros);
}
}
private void parse_saveMacros(final JDefaultMutableTreeNode node,
final Vector ZFMacros) {
if (node.isLeaf()) {
final MacroItem mi=new MacroItem(node.m, null);
ZFMacros.add(mi);
} else {
for (int i=0; i<node.getChildCount(); i++) {
parse_saveMacros((JDefaultMutableTreeNode) node.getChildAt(i),
ZFMacros);
}
}
}
private static final JSeparator createSeparator() {
final JSeparator jsep=new JSeparator(JSeparator.HORIZONTAL);
final Dimension d=new Dimension(200, 12);
jsep.setMaximumSize(d);
jsep.setMinimumSize(d);
jsep.setPreferredSize(d);
jsep.setSize(d);
jsep.setUI(new MiddleSeparatorUI());
return jsep;
}
private static final class MiddleSeparatorUI extends SeparatorUI {
@Override
public void paint(final Graphics g, final JComponent c) {
final Dimension s=c.getSize();
final int middleHeight=(s.height-1)/2;
g.setColor(Color.lightGray);
g.drawLine(0, middleHeight, s.width, middleHeight);
g.setColor(Color.white);
g.drawLine(0, middleHeight+1, s.width, middleHeight+1);
}
}
}