// $Id: NestedACPopupMenu.java,v 1.7 2010/09/23 08:21:33 olga Exp $
package agg.gui.popupmenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import agg.attribute.AttrContext;
import agg.editor.impl.EdNAC;
import agg.editor.impl.EdNestedApplCond;
import agg.editor.impl.EdPAC;
import agg.editor.impl.EdRule;
import agg.gui.AGGAppl;
import agg.gui.treeview.GraGraTreeView;
import agg.gui.treeview.dialog.FormulaGraphGUI;
import agg.gui.treeview.nodedata.ApplFormulaTreeNodeData;
import agg.gui.treeview.nodedata.GraGraTreeNodeData;
import agg.gui.treeview.path.GrammarTreeNode;
import agg.xt_basis.BaseFactory;
import agg.xt_basis.GraphKind;
import agg.xt_basis.GraphObject;
import agg.xt_basis.NestedApplCond;
import agg.xt_basis.OrdinaryMorphism;
@SuppressWarnings("serial")
public class NestedACPopupMenu extends JPopupMenu {
public NestedACPopupMenu(GraGraTreeView tree) {
super("General Application Condition");
this.treeView = tree;
miRHS = add(new JMenuItem("Make due to RHS"));
miRHS.setEnabled(false);
miRHS.setActionCommand("makeFromRHS");
// miRHS.addActionListener(this.treeView.getActionAdapter());
miRHS.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
makeCopyFromRHS();
}
});
addSeparator();
JMenuItem mi = add(new JMenuItem("New GAC"));
mi.setActionCommand("newNestedAC");
mi.addActionListener(this.treeView.getActionAdapter());
mi = new JMenuItem("Set Formula above GACs");
this.add(mi);
mi.setActionCommand("setFormulaAboveACs");
mi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setFormula();
}
});
addSeparator();
mi = add(new JMenuItem("Copy "));
mi.setActionCommand("copyGAC");
// mi.addActionListener(this.treeView.getActionAdapter());
mi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
copy();
}
});
addSeparator();
mi = add(new JMenuItem("Convert to NAC"));
mi.setActionCommand("convertToNAC");
// mi.addActionListener(this.treeView.getActionAdapter());
mi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
convertToNAC();
}
});
mi = add(new JMenuItem("Convert to PAC"));
mi.setActionCommand("convertToPAC");
// mi.addActionListener(this.treeView.getActionAdapter());
mi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
convertToPAC();
}
});
addSeparator();
mi = add(new JMenuItem("Delete Delete"));
mi.setActionCommand("deleteNestedAC");
mi.addActionListener(this.treeView.getActionAdapter());
addSeparator();
this.miDisable = add(new JCheckBoxMenuItem("disabled"));
this.miDisable.setActionCommand("disableNestedAC");
this.miDisable.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (((JCheckBoxMenuItem)e.getSource()).isSelected()) {
NestedACPopupMenu.this.cond.getMorphism().setEnabled(false);
if (NestedACPopupMenu.this.rule != null
&& !((NestedApplCond)NestedACPopupMenu.this.cond.getMorphism()).getVarTagInFormula().isEmpty()) {
((NestedApplCond)NestedACPopupMenu.this.cond.getMorphism()).setVarTagInFormula("");
NestedACPopupMenu.this.rule.getBasisRule().setFormula("");
if (NestedACPopupMenu.this.formula != null) {
NestedACPopupMenu.this.treeView.getTreeModel().removeNodeFromParent(NestedACPopupMenu.this.formula.getTreeNode());
NestedACPopupMenu.this.formula = null;
}
} else if (NestedACPopupMenu.this.parCond != null
&& !((NestedApplCond)NestedACPopupMenu.this.cond.getMorphism()).getVarTagInFormula().isEmpty()) {
((NestedApplCond)NestedACPopupMenu.this.cond.getMorphism()).setVarTagInFormula("");
((NestedApplCond)NestedACPopupMenu.this.parCond.getMorphism()).setFormula("");
if (NestedACPopupMenu.this.formula != null) {
NestedACPopupMenu.this.treeView.getTreeModel().removeNodeFromParent(NestedACPopupMenu.this.formula.getTreeNode());
NestedACPopupMenu.this.formula = null;
}
}
NestedACPopupMenu.this.data.update();
} else {
NestedACPopupMenu.this.cond.getMorphism().setEnabled(true);
NestedACPopupMenu.this.data.update();
}
NestedACPopupMenu.this.treeView.getTree().treeDidChange();
}
});
addSeparator();
mi = add(new JMenuItem("Textual Comments"));
mi.setActionCommand("commentNestedAC");
mi.addActionListener(this.treeView.getActionAdapter());
pack();
setBorderPainted(true);
}
public boolean invoked(int x, int y) {
if (this.treeView == null) {
return false;
}
if (this.treeView.getTree().getRowForLocation(x, y) != -1) {
this.path = this.treeView.getTree().getPathForLocation(x, y);
this.node = (DefaultMutableTreeNode) this.path.getLastPathComponent();
this.data = (GraGraTreeNodeData) this.node.getUserObject();
if (this.data != null && this.data.isNestedAC()) {
GrammarTreeNode.expand(this.treeView, this.node, this.path);
this.parData = (GraGraTreeNodeData)
((DefaultMutableTreeNode)this.node.getParent()).getUserObject();
if (this.parData.isRule()) {
this.rule = this.parData.getRule();
this.miRHS.setEnabled(true);
}
else if (this.parData.isNestedAC()) {
this.parCond = this.parData.getNestedAC();
this.miRHS.setEnabled(false);
}
GraGraTreeNodeData firstChildData = (GraGraTreeNodeData)
((DefaultMutableTreeNode)((DefaultMutableTreeNode)this.node.getParent())
.getFirstChild()).getUserObject();
if (firstChildData.isApplFormula())
this.formula = firstChildData;
this.posX = x; this.posY = y;
this.cond = this.data.getNestedAC();
if (!this.cond.getMorphism().isEnabled())
this.miDisable.setSelected(true);
else
this.miDisable.setSelected(false);
return true;
}
}
return false;
}
void setFormula() {
String ownerName = "application condition : "+this.cond.getMorphism().getName();
FormulaGraphGUI d = new FormulaGraphGUI(this.treeView.getFrame(), ownerName,
" Graph editor of Formula above General Application Conditions ",
" An empty graph is the case where all nodes are connected by AND.",
true);
d.setExportJPEG(this.treeView.getGraphicsExportJPEG());
String oldformula = ((NestedApplCond)this.cond.getMorphism()).getFormulaText();
// List<String> allVars = ((NestedApplCond)this.cond.getMorphism()).getNameOfEnabledACs();
List<EdNestedApplCond> allNestedACs = this.cond.getEnabledACs();
List<NestedApplCond> list = makeFrom(allNestedACs);
d.setVarsAsObjs(allNestedACs, oldformula);
d.setLocation(this.posX+20, this.posY+20);
while (true) {
d.setVisible(true);
if (!d.isCanceled()) {
boolean formulaChanged = d.isChanged();
String f = d.getFormula();
if (!this.cond.getNestedMorphism().setFormula(f, list)) {
JOptionPane
.showMessageDialog(
this.treeView.getFrame(),
"The formula definition failed. Please correct.",
" Formula failed ", JOptionPane.WARNING_MESSAGE);
}
else if (formulaChanged) {
insertFormulaIntoACTreeNode(f, allNestedACs);
this.cond.getGraGra().setChanged(true);
break;
} else
break;
} else break;
}
}
void insertFormulaIntoACTreeNode(
final String f,
final List<EdNestedApplCond> allVarsObj) {
if (f.length() > 0) {
Object child = (this.node.getChildCount() > 0)? this.treeView.getTreeModel().getChild(this.node, 0): null;
if (child != null) {
// remove existing formula from rule subtree
if (((GraGraTreeNodeData) ((DefaultMutableTreeNode) child)
.getUserObject()).isApplFormula()) {
this.treeView.getTreeModel().removeNodeFromParent((DefaultMutableTreeNode)child);
}
}
// add formula tree node into nestedAC subtree
if (!"true".equals(f)) {
final GraGraTreeNodeData conddata = new ApplFormulaTreeNodeData(
f, true, this.cond);
conddata.setString(f);
final DefaultMutableTreeNode condnode = new DefaultMutableTreeNode(
conddata);
conddata.setTreeNode(condnode);
this.treeView.getTreeModel().insertNodeInto(condnode, this.node, 0);
}
}
}
private List<NestedApplCond> makeFrom(
List<EdNestedApplCond> list) {
final List<NestedApplCond> result = new Vector<NestedApplCond>(list.size(), 0);
for (int i=0; i<list.size(); i++) {
result.add(list.get(i).getNestedMorphism());
}
return result;
}
void copy() {
if (cond != null) {
AttrContext attrContxt = cond.getRule().getBasisRule().getRight().getAttrContext();
if (cond.getParent() != null)
attrContxt = cond.getMorphism().getImage().getAttrContext();
NestedApplCond ac = new NestedApplCond(
cond.getMorphism().getSource(),
BaseFactory.theFactory().createGraph(cond.getMorphism().getSource().getTypeSet()),
attrContxt);
ac.getImage().setAttrContext(attrContxt);
Hashtable<GraphObject, GraphObject> table = new Hashtable<GraphObject, GraphObject>();
Enumeration<GraphObject> gos = cond.getMorphism().getSource().getElements();
while (gos.hasMoreElements()) {
GraphObject go = gos.nextElement();
table.put(go, go);
}
BaseFactory.theFactory().copyGraph(cond.getBasisGraph(), ac.getImage(), table);
BaseFactory.theFactory().copyMorph(cond.getMorphism(), ac, table);
BaseFactory.theFactory().copyNestedAC(cond.getNestedMorphism(), ac, table);
ac.setName(cond.getName()+"_clone");
if (cond.getParent() == null) {
EdNestedApplCond cp = (EdNestedApplCond) cond.getRule().createNestedAC(ac);
cond.getRule().getNestedACs().remove(cp);
int indx = cond.getRule().getNestedACs().indexOf(cond) +1;
if (indx >= 0) {
cond.getRule().getBasisRule().addNestedAC(indx, ac);
cond.getRule().getNestedACs().add(indx, cp);
cp.setLayoutByIndex(cond, true);
treeView.putNestedACIntoTree(cp, (DefaultMutableTreeNode) node.getParent(),
((DefaultMutableTreeNode) node.getParent()).getIndex(node) + 1);
}
}
else {
EdNestedApplCond parAC = cond.getParent();
EdNestedApplCond cp = (EdNestedApplCond) parAC.createNestedAC(ac);
parAC.getNestedACs().remove(cp);
int indx = parAC.getNestedACs().indexOf(cond) +1;
if (indx >= 0) {
parAC.getNestedMorphism().addNestedAC(indx, ac);
parAC.getNestedACs().add(indx, cp);
cp.setLayoutByIndex(cond, true);
treeView.putNestedACIntoTree(cp, (DefaultMutableTreeNode) node.getParent(),
((DefaultMutableTreeNode) node.getParent()).getIndex(node) + 1);
}
}
}
}
void convertToNAC() {
if (cond != null) {
OrdinaryMorphism iso = cond.getMorphism().getTarget().isoCopy();
OrdinaryMorphism ac = new OrdinaryMorphism(
cond.getMorphism().getSource(),
iso.getTarget(),
cond.getRule().getBasisRule().getRight().getAttrContext());
if (ac.completeDiagram3(cond.getMorphism(), iso)) {
ac.setName(cond.getName());
ac.getImage().setAttrContext(ac.getAttrContext());
ac.getImage().setKind(GraphKind.NAC);
cond.getRule().getBasisRule().addNAC(ac);
EdNAC cn = cond.getRule().createNAC(ac);
cn.setLayoutByIndex(cond, true);
DefaultMutableTreeNode rn = this.treeView.getTreeNodeOfGrammarElement(
cond.getRule());
int indx = cond.getRule().getNestedACs().size()
+ cond.getRule().getNACs().size()-1;
if (rn.getChildCount() > 0) {
DefaultMutableTreeNode child = (DefaultMutableTreeNode)rn.getFirstChild();
if (child != null
&& ((GraGraTreeNodeData) child.getUserObject()).isApplFormula()) {
indx++;
}
}
treeView.putNACIntoTree(cn, rn, indx);
}
}
}
void convertToPAC() {
if (cond != null) {
OrdinaryMorphism iso = cond.getMorphism().getTarget().isoCopy();
OrdinaryMorphism ac = new OrdinaryMorphism(
cond.getMorphism().getSource(),
iso.getTarget(),
cond.getRule().getBasisRule().getRight().getAttrContext());
if (ac.completeDiagram3(cond.getMorphism(), iso)) {
ac.setName(cond.getName());
ac.getImage().setAttrContext(ac.getAttrContext());
ac.getImage().setKind(GraphKind.PAC);
cond.getRule().getBasisRule().addPAC(ac);
EdPAC cn = cond.getRule().createPAC(ac);
cn.setLayoutByIndex(cond, true);
DefaultMutableTreeNode rn = this.treeView.getTreeNodeOfGrammarElement(
cond.getRule());
int indx = cond.getRule().getNestedACs().size()
+ cond.getRule().getNACs().size()
+ cond.getRule().getPACs().size()-1;
if (rn.getChildCount() > 0) {
DefaultMutableTreeNode child = (DefaultMutableTreeNode)rn.getFirstChild();
if (child != null
&& ((GraGraTreeNodeData) child.getUserObject()).isApplFormula()) {
indx++;
}
}
treeView.putPACIntoTree(cn, rn, indx);
}
}
}
void makeCopyFromRHS() {
if (this.parCond == null) {
if (treeView.getFrame() instanceof AGGAppl) {
((AGGAppl)treeView.getFrame()).getGraGraEditor().getRuleEditor().doGACDuetoRHS();
}
}
}
GraGraTreeView treeView;
TreePath path;
DefaultMutableTreeNode node;
GraGraTreeNodeData data, parData, formula;
EdNestedApplCond cond, parCond;
EdRule rule;
int posX, posY;
private JMenuItem miDisable, miRHS;
}