/*
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 .
*/
package eric.macros;
import eric.GUI.themes;
import eric.JGeneralMenuBar;
import eric.JZirkelCanvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JMenu;
import eric.JEricPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import rene.gui.Global;
import rene.gui.MyMenu;
import rene.zirkel.ZirkelFrame;
import rene.zirkel.macro.Macro;
import rene.zirkel.macro.MacroItem;
// Toute ce qui touche à l'arbre de macros et à sa gestion :
public class MacrosList extends JEricPanel {
private final int CONTROLHEIGHT=25;
private final ImageIcon JTreefoldclosed;
private final ImageIcon JTreefoldopened;
private final ImageIcon[] JTreeleaf;
private CTree MacrosTree;
private JDefaultMutableTreeNode MacroTreeTopNode=new JDefaultMutableTreeNode("Macros");
private ZirkelFrame ZF;
private JScrollPane jscrolls;
private JControls controls;
// private Jcreatemacro createmacropanel;
public MacrosList(ZirkelFrame zf) {
ZF=zf;
JTreefoldclosed=themes.getIcon("JTreefoldclosed.gif");
JTreefoldopened=themes.getIcon("JTreefoldopened.gif");
JTreeleaf=new ImageIcon[4];
JTreeleaf[0]=themes.getIcon("JTreeleaf_0.gif");
JTreeleaf[1]=themes.getIcon("JTreeleaf_1.gif");
JTreeleaf[2]=themes.getIcon("JTreeleaf_2.gif");
JTreeleaf[3]=themes.getIcon("JTreeleaf_3.gif");
this.setLayout(new javax.swing.BoxLayout(this,
javax.swing.BoxLayout.Y_AXIS));
// uncomment this line to obtain gray conection lines between leaves :
// UIManager.put("Tree.hash",new ColorUIResource(Color.lightGray));
MacroTreeTopNode=new JDefaultMutableTreeNode("Macros");
MacrosTree=new CTree(this) {
/**
*
*/
@Override
public void paint(final Graphics g) {
final ImageIcon backimage=themes.getIcon("macrospanelback.gif");
g.drawImage(backimage.getImage(), 0, 0, this.getSize().width,
backimage.getIconHeight(), this);
super.paint(g);
}
};
MacrosTree.setFocusable(false);
MacrosTree.setModel(new MyTreeModel(MacroTreeTopNode));
MacrosTree.getSelectionModel().setSelectionMode(
TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
final MyCellRenderer renderer=new MyCellRenderer();
MacrosTree.setCellRenderer(renderer);
MacrosTree.setCellEditor(new MyDefaultCellEditor());
MacrosTree.setOpaque(false);
MacrosTree.setFont(new Font(Global.GlobalFont, 0, 12));
MacrosTree.setForeground(new Color(70, 70, 70));
MacrosTree.setDragEnabled(false);
MacrosTree.setEditable(false);
jscrolls=new JScrollPane(MacrosTree);
jscrolls.setAlignmentX(0F);
jscrolls.setBorder(BorderFactory.createEmptyBorder());
this.add(jscrolls);
controls=new JControls(this);
this.add(controls);
// createmacropanel=new Jcreatemacro(this);
// this.add(createmacropanel);
}
public JDefaultMutableTreeNode getTopNode() {
return MacroTreeTopNode;
}
public CTree getMacrosTree() {
return MacrosTree;
}
// Utilise le Vector de macros pour initialiser l'arbre :
public void initTreeFromZCMacros() {
Vector mc;
// JMacrosTools.setDefaultMacros();
MacroTreeTopNode.removeAllChildren();
// removeAll();
// MacroTreeTopNode=new JDefaultMutableTreeNode("Macros");
mc=ZF.ZC.getMacros();
for (int i=0; i0) {
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
ParseMacroTree(pm, jm, MacroTreeTopNode, "root");
ZF.ZC.PM.removeAll();
JGeneralMenuBar.s_InitMacrosMenu();
final JMenu jmroot=(JMenu) jm.getItem(0);
final MyMenu pmroot=(MyMenu) pm.getItem(0);
while (pmroot.getItemCount()>0) {
ZF.ZC.PM.add(pmroot.getItem(0));
JGeneralMenuBar.addMacrosMenu(jmroot.getItem(0));
// if (ZF.ZC.isLibraryMacrosVisible()) {
// ZF.ZC.PM.add(pmroot.getItem(0));
// JGeneralMenuBar.addMacrosMenu(jmroot.getItem(0));
// } else {
// pmroot.remove(0);
// jmroot.remove(0);
//
// }
}
} else {
ZF.ZC.PM.removeAll();
JGeneralMenuBar.s_InitMacrosMenu();
}
MacroTools.updateLibraryMacros();
}
// Procédure recursive appelée uniquement par ActualiseMacroPopupMenu.
// Parcours de l'arbre de macros :
private void ParseMacroTree(final MyMenu PMmenu, final JMenu JMmenu,
final JDefaultMutableTreeNode node, final String path) {
final String mypath=path;
if (!(node.isLeaf())) {
final MyMenu mymenu=new MyMenu((String) node.getUserObject());
final JMenu myjmenu=new JMenu((String) node.getUserObject());
myjmenu.setFont(new java.awt.Font("System", 0, 13));
for (int i=0; i1) {
((DefaultTreeModel) MacrosTree.getModel()).removeNodeFromParent(node);
}
}
}
}
// Les noeuds de l'arbre sont considérés comme des JLabels
// Cette classe se charge de leurs look :
class MyCellRenderer extends JLabel implements TreeCellRenderer {
/**
*
*/
public MyCellRenderer() {
setOpaque(false);
setBackground(null);
}
public Component getTreeCellRendererComponent(final JTree tree,
final Object value, final boolean sel, final boolean expanded,
final boolean leaf, final int row, final boolean hasFocus) {
final String stringValue=tree.convertValueToText(value, sel,
expanded, leaf, row, hasFocus);
setText(stringValue);
setEnabled(tree.isEnabled());
setFont(tree.getFont());
setForeground(Color.black);
setOpaque(sel);
// Couleur de sélection :
setBackground(Color.lightGray);
final JDefaultMutableTreeNode mynode=(JDefaultMutableTreeNode) value;
if (leaf) {
setIcon((stringValue.startsWith(("-- ")))?null
:JTreeleaf[mynode.macrotype]);
if (mynode.macrotype==0) {
setForeground(new Color(68, 84, 131));
}
} else {
setIcon((expanded)?JTreefoldopened:JTreefoldclosed);
}
return this;
}
}
// Le modèle sur lequel est basé l'arbre
// Se charge de l'édition des noeuds et contient les TreeModelListeners :
class MyTreeModel extends DefaultTreeModel implements TreeModelListener {
/**
*
*/
public MyTreeModel(final TreeNode node) {
super(node);
this.addTreeModelListener(this);
}
@Override
public void valueForPathChanged(final TreePath path,
final Object newValue) {
final JDefaultMutableTreeNode tn=(JDefaultMutableTreeNode) path.getLastPathComponent();
super.valueForPathChanged(path, newValue);
tn.ActualisePath();
}
public void treeNodesChanged(final TreeModelEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ActualiseMacroPopupMenu();
}
});
}
public void treeNodesInserted(final TreeModelEvent e) {
// System.out.println("treeNodesInserted");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ActualiseMacroPopupMenu();
}
});
}
public void treeNodesRemoved(final TreeModelEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ActualiseMacroPopupMenu();
}
});
}
public void treeStructureChanged(final TreeModelEvent e) {
// System.out.println("treeStructureChanged");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ActualiseMacroPopupMenu();
}
});
}
}
/**************************************************************************************
*** N'oublions pas que JMacrosList est un JPanel qui contient d'autres
* JPanels La class Jcontrols contient les boutons d'édition de l'arbre et
* leurs listeners
***************************************************************************************/
class JControls extends JEricPanel {
/**
*
*/
private JButton addbtn;
private JButton delbtn;
private JButton renbtn;
private JButton createbtn;
private String message="";
private MacrosList MI;
@Override
public void paintComponent(final java.awt.Graphics g) {
super.paintComponent(g);
final java.awt.Dimension d=this.getSize();
g.drawImage(themes.getImage("tab_bottom.gif"), 0, 0, d.width,
d.height, this);
}
public void setButtonsIcons() {
addbtn.setIcon(themes.getIcon("addmacrofolder.png"));
addbtn.setRolloverIcon(themes.getIcon("addmacrofoldersel.png"));
delbtn.setIcon(themes.getIcon("delmacro.png"));
delbtn.setToolTipText(Global.Loc("macros.deleteselected"));
renbtn.setIcon(themes.getIcon("renamemacro.png"));
renbtn.setRolloverIcon(themes.getIcon("renamemacrosel.png"));
createbtn.setIcon(themes.getIcon("createmacro.png"));
createbtn.setRolloverIcon(themes.getIcon("createmacroover.png"));
}
public JControls(MacrosList mi) {
MI=mi;
this.setLayout(new javax.swing.BoxLayout(this,
javax.swing.BoxLayout.X_AXIS));
this.setAlignmentX(0F);
addbtn=new JButton();
addbtn.setToolTipText(Global.Loc("macros.addfolder"));
addbtn.setOpaque(false);
addbtn.setContentAreaFilled(false);
addbtn.setBorder(BorderFactory.createEmptyBorder());
addbtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
MacrosTree.nodepopup.addfolder();
}
});
delbtn=new JButton();
delbtn.setOpaque(false);
delbtn.setContentAreaFilled(false);
delbtn.setBorder(BorderFactory.createEmptyBorder());
delbtn.setRolloverIcon(themes.getIcon("delmacrosel.png"));
delbtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
// MacrosTree.nodepopup.deletenodes();
System.out.println("size="+JZirkelCanvas.getCurrentZC().getMacros().size());
}
});
renbtn=new JButton();
renbtn.setToolTipText(Global.Loc("macros.renamemacro"));
renbtn.setOpaque(false);
renbtn.setContentAreaFilled(false);
renbtn.setBorder(BorderFactory.createEmptyBorder());
renbtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
MacrosTree.nodepopup.renamenode();
}
});
createbtn=new JButton();
createbtn.setToolTipText(Global.Loc("macros.recordmacro"));
createbtn.setSelectedIcon(themes.getIcon("createmacrosel.png"));
createbtn.setBorder(BorderFactory.createEmptyBorder());
createbtn.setOpaque(false);
createbtn.setContentAreaFilled(false);
createbtn.setSelected(false);
setButtonsIcons();
createbtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(final MouseEvent e) {
// if (createbtn.isSelected()) {
// message=createmacropanel.getComment().getText();
// createmacropanel.getComment().setText(Global.Loc("macros.cancel"));
// }
}
@Override
public void mouseExited(final MouseEvent e) {
// if (createbtn.isSelected()) {
// if (message!="") {
// createmacropanel.getComment().setText(message);
// }
// }
}
@Override
public void mousePressed(final MouseEvent e) {
if (createbtn.isSelected()) {
createbtn.setSelected(false);
// createmacropanel.disappeargently();
// PaletteManager.setSelected("point", true);
} else {
createbtn.setSelected(true);
new CreateMacroDialog(MI);
// createmacropanel.appeargently();
// PaletteManager.deselectgeomgroup();
}
}
});
final JEricPanel spacer=new JEricPanel();
spacer.setOpaque(false);
this.add(addbtn);
this.add(delbtn);
this.add(renbtn);
this.add(spacer);
this.add(createbtn);
}
}
}