//$Id: GraGraTreeModel.java,v 1.9 2010/08/25 00:34:40 olga Exp $
package agg.gui.treeview;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import agg.editor.impl.EdGraGra;
import agg.editor.impl.EdNAC;
import agg.editor.impl.EdNestedApplCond;
import agg.editor.impl.EdPAC;
import agg.editor.impl.EdRule;
import agg.editor.impl.EdRuleScheme;
import agg.gui.treeview.nodedata.GraGraTreeNodeData;
/**
* The class GraGraTreeModel extends JTreeModel to define valueForPathChanged.
* This method is called as a result of the user editing a value in the tree. If
* you allow editing in your tree, are using TreeNodes and the user object of
* the TreeNodes is of the class GraGraTreeNodeData.
*
* @author $Author: olga $
* @version $Id: GraGraTreeModel.java,v 1.9 2010/08/25 00:34:40 olga Exp $
*/
@SuppressWarnings("serial")
public class GraGraTreeModel extends DefaultTreeModel {
/**
* Creates a new instance of GraGraTreeModel with root specified by the
* TreeNode newRoot.
*/
public GraGraTreeModel(TreeNode newRoot) {
super(newRoot);
}
public GraGraTreeModel(JFrame frame, TreeNode newRoot) {
super(newRoot);
this.applFrame = frame;
}
/**
* Calls the super class method setString() if the path item would be
* changed.
*/
public void valueForPathChanged(TreePath path, Object newValue) {
/* Update the user object. */
DefaultMutableTreeNode aNode = (DefaultMutableTreeNode) path
.getLastPathComponent();
GraGraTreeNodeData data = (GraGraTreeNodeData) aNode.getUserObject();
// String oldValue = data.toString();
if (checkNewValue(aNode, data, (String) newValue)) {
data.setString((String) newValue);
/*
* Since we've changed how the data is to be displayed, message
* nodeChanged.
*/
nodeChanged(aNode);
}
}
private boolean checkNewValue(DefaultMutableTreeNode aNode,
GraGraTreeNodeData sd, String name) {
if (sd.isGraGra()) {
if (!isValid(getGraGraNames(), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
return true;
} else if (sd.isGraph()) {
EdGraGra egra = getGraGra(aNode);
if (!isValid(getGraGraChildrenNames(egra), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
return true;
}
else if (sd.isRuleScheme()) {
EdGraGra egra = getGraGra(aNode);
if (!isValid(getGraGraChildrenNames(egra), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
return true;
}
else if (sd.isRule()) {
if (sd.isKernelRule() || sd.isMultiRule() || sd.isAmalgamatedRule()) {
EdRuleScheme ruleScheme = getRuleScheme(aNode);
if (!isValid(getRuleSchemeChildrenNames(ruleScheme), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
return true;
}
EdGraGra egra = getGraGra(aNode);
if (!isValid(getGraGraChildrenNames(egra), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
return true;
} else if (sd.isNAC()) {
EdRule erule = getRule(aNode);
if (!isValid(getRuleChildrenNames(erule), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
return true;
} else if (sd.isPAC()) {
EdRule erule = getRule(aNode);
if (!isValid(getRuleChildrenNames(erule), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
return true;
} else if (sd.isNestedAC()) {
EdRule erule = getRule(aNode);
if (erule == null) {
EdNestedApplCond ac = getParentCond(aNode);
if (!isValid(this.getNestedChildrenNames(ac), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
}
else {
if (!isValid(getRuleChildrenNames(erule), name, sd.toString())) {
warning(this.applFrame, name);
return false;
}
}
return true;
} else
return true;
}
public DefaultMutableTreeNode getTreeNodeOfGraGraRule(
DefaultMutableTreeNode gragraNode, Object searchedObj) {
if (!(searchedObj instanceof EdRule))
return null;
for (int j = 0; j < gragraNode.getChildCount(); j++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) gragraNode
.getChildAt(j); // graph|rule
GraGraTreeNodeData sd = (GraGraTreeNodeData) node.getUserObject();
// if (sd.isTypeGraph() && (searchedObj instanceof EdGraph)
// && sd.getGraph().equals(searchedObj)) {
// return node;
// } else if (sd.isGraph() && (searchedObj instanceof EdGraph)
// && sd.getGraph().equals(searchedObj)) {
// return node;
// } else
if (sd.isRule()) {
if (sd.isRuleScheme() || sd.isKernelRule()
|| sd.isMultiRule() || sd.isAmalgamatedRule()) {
return null;
}
else
if ((searchedObj instanceof EdRule)
&& sd.getRule().equals(searchedObj)) {
return node;
}
}
// else if (sd.isAtomic() && (searchedObj instanceof EdAtomic)
// && sd.getAtomic().equals(searchedObj)) {
// return node;
// } else if (sd.isConstraint() && (searchedObj instanceof EdConstraint)
// && sd.getConstraint().equals(searchedObj)) {
// return node;
// }
}
return null;
}
public boolean isValid(Vector<String> names, String newName, String oldName) {
String testold = oldName;
String testnew = newName;
int ind = testold.lastIndexOf(']');
testold = testold.substring(ind+1);
ind = testnew.lastIndexOf(']');
testnew = testnew.substring(ind+1);
for (int i = 0; i < names.size(); i++) {
if (!names.elementAt(i).equals(testold)) {
if (names.elementAt(i).equals(testnew))
return false;
}
}
return true;
}
public String makeNewName(EdGraGra gragra, String name) {
String result = name;
if (!this.isValid(this.getGraGraChildrenNames(gragra), name, ""))
result = name.concat("_");
return result;
}
public String makeNewName(EdRule rule, String name) {
String result = name;
if (!this.isValid(this.getRuleChildrenNames(rule), name, ""))
result = name.concat("_");
return result;
}
public String makeNewName(EdNestedApplCond ac, String name) {
String result = name;
if (!this.isValid(this.getNestedChildrenNames(ac), name, ""))
result = name.concat("_");
return result;
}
public void ruleNameChanged(EdGraGra gragra, boolean layered) {
for (int i = 0; i < this.root.getChildCount(); i++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) this.root
.getChildAt(i); // GraGra
GraGraTreeNodeData sdGra = (GraGraTreeNodeData) node
.getUserObject();
if (sdGra.getGraGra().equals(gragra)) {
for (int j = 0; j < node.getChildCount(); j++) {
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode) node
.getChildAt(j); // graph|rule name
GraGraTreeNodeData sd = (GraGraTreeNodeData) node1
.getUserObject();
if (sd.isRule()) {
String tag = "";
String tag1 = "";
if (!sd.getRule().getBasisRule().isEnabled())
tag = "[D]";
if (layered)
tag1 = "[" + sd.getRule().getBasisRule().getLayer()
+ "]";
sd.setString(tag, tag1, sd.getRule().getBasisRule()
.getName());
nodeChanged(node1);
}
}
break;
}
}
}
public void ruleNameChanged(EdGraGra gragra, boolean layered, boolean priority) {
for (int i = 0; i < this.root.getChildCount(); i++) {
// child is EdGraGra
DefaultMutableTreeNode
node = (DefaultMutableTreeNode) this.root.getChildAt(i);
GraGraTreeNodeData sdGra = (GraGraTreeNodeData) node
.getUserObject();
if (sdGra.getGraGra().equals(gragra)) {
for (int j = 0; j < node.getChildCount(); j++) {
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode) node
.getChildAt(j); // graph|rule name
GraGraTreeNodeData sd = (GraGraTreeNodeData) node1
.getUserObject();
if (sd.isRule() && sd.getRule() != null) {
String tag = "";
String tag1 = "";
if (!sd.getRule().getBasisRule().isEnabled())
tag = "[D]";
if (layered)
tag1 = "[" + sd.getRule().getBasisRule().getLayer()
+ "]";
else if (priority)
tag1 = "["
+ sd.getRule().getBasisRule().getPriority()
+ "]";
sd.setString(tag, tag1, sd.getRule().getBasisRule()
.getName());
nodeChanged(node1);
}
}
break;
}
}
}
public void ruleNameChanged(DefaultMutableTreeNode ruleNode, boolean layered) {
GraGraTreeNodeData sd = (GraGraTreeNodeData) ruleNode.getUserObject();
if (sd.isRule()) {
String tag = "";
String tag1 = "";
if (!sd.getRule().getBasisRule().isEnabled())
tag = "[D]";
if (layered)
tag1 = "[" + sd.getRule().getBasisRule().getLayer() + "]";
sd.setString(tag, tag1, sd.getRule().getBasisRule().getName());
nodeChanged(ruleNode);
}
}
public void ruleNameChanged(DefaultMutableTreeNode ruleNode,
boolean layered, boolean priority) {
GraGraTreeNodeData sd = (GraGraTreeNodeData) ruleNode.getUserObject();
if (sd.isRule()) {
String tag = "";
String tag1 = "";
if (!sd.getRule().getBasisRule().isEnabled())
tag = "[D]";
if (layered)
tag1 = "[" + sd.getRule().getBasisRule().getLayer() + "]";
else if (priority)
tag1 = "[" + sd.getRule().getBasisRule().getPriority() + "]";
sd.setString(tag, tag1, sd.getRule().getBasisRule().getName());
nodeChanged(ruleNode);
}
}
public void constraintNameChanged(EdGraGra gragra, boolean layered) {
for (int i = 0; i < this.root.getChildCount(); i++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) this.root
.getChildAt(i); // GraGra
GraGraTreeNodeData sdGra = (GraGraTreeNodeData) node
.getUserObject();
if (sdGra.getGraGra().equals(gragra)) {
for (int j = 0; j < node.getChildCount(); j++) {
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode) node
.getChildAt(j);
GraGraTreeNodeData sd = (GraGraTreeNodeData) node1
.getUserObject();
if (sd.isConstraint()) {// constraint name
String tagD = "";
if (!sd.getConstraint().getBasisConstraint()
.isEnabled())
tagD = "[D]";
String tag = "";
Vector<Integer> layer = sd.getConstraint().getBasisConstraint()
.getLayer();
if (layered && !layer.isEmpty()) {
tag = "["
+ sd.getConstraint().getBasisConstraint()
.getLayerAsString() + "]";
}
sd.setString(tagD, tag, sd.getConstraint()
.getBasisConstraint().getName());
nodeChanged(node1);
}
}
break;
}
}
}
public void constraintNameChanged(EdGraGra gragra, boolean layered,
boolean priority) {
for (int i = 0; i < this.root.getChildCount(); i++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) this.root
.getChildAt(i); // GraGra
GraGraTreeNodeData sdGra = (GraGraTreeNodeData) node
.getUserObject();
if (sdGra.getGraGra().equals(gragra)) {
for (int j = 0; j < node.getChildCount(); j++) {
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode) node
.getChildAt(j);
GraGraTreeNodeData sd = (GraGraTreeNodeData) node1
.getUserObject();
if (sd.isConstraint()) {
String tagD = "";
if (!sd.getConstraint().getBasisConstraint()
.isEnabled())
tagD = "[D]";
String tag = "";
Vector<Integer> layer = sd.getConstraint().getBasisConstraint()
.getLayer();
Vector<Integer> prior = sd.getConstraint().getBasisConstraint()
.getPriority();
if (layered && !layer.isEmpty()) {
tag = "["
+ sd.getConstraint().getBasisConstraint()
.getLayerAsString() + "]";
} else if (priority && !prior.isEmpty()) {
tag = "["
+ sd.getConstraint().getBasisConstraint()
.getPriorityAsString() + "]";
}
sd.setString(tagD, tag, sd.getConstraint()
.getBasisConstraint().getName());
nodeChanged(node1);
}
}
break;
}
}
}
public void constraintNameChanged(DefaultMutableTreeNode node,
boolean layered) {
GraGraTreeNodeData sd = (GraGraTreeNodeData) node.getUserObject();
if (sd.isConstraint()) {
String tagD = "";
if (!sd.getConstraint().getBasisConstraint().isEnabled())
tagD = "[D]";
String tag = "";
Vector<Integer> layer = sd.getConstraint().getBasisConstraint().getLayer();
if (layered && !layer.isEmpty()) {
tag = "["
+ sd.getConstraint().getBasisConstraint()
.getLayerAsString() + "]";
}
sd.setString(tagD, tag, sd.getConstraint().getBasisConstraint()
.getName());
nodeChanged(node);
}
}
public void constraintNameChanged(DefaultMutableTreeNode node,
boolean layered, boolean priority) {
GraGraTreeNodeData sd = (GraGraTreeNodeData) node.getUserObject();
if (sd.isConstraint()) {
String tagD = "";
if (!sd.getConstraint().getBasisConstraint().isEnabled())
tagD = "[D]";
String tag = "";
Vector<Integer> layer = sd.getConstraint().getBasisConstraint().getLayer();
Vector<Integer> prior = sd.getConstraint().getBasisConstraint()
.getPriority();
if (layered && !layer.isEmpty()) {
tag = "["
+ sd.getConstraint().getBasisConstraint()
.getLayerAsString() + "]";
} else if (priority && !prior.isEmpty()) {
tag = "["
+ sd.getConstraint().getBasisConstraint()
.getPriorityAsString() + "]";
}
sd.setString(tagD, tag, sd.getConstraint().getBasisConstraint()
.getName());
nodeChanged(node);
}
}
private void warning(JFrame fr, String str) {
String test = str;
int ind = test.indexOf("]");
while (ind > 0) {
test = test.substring(ind+1);
ind = test.indexOf("]");
}
JOptionPane.showMessageDialog(fr, "Name \"" + test + "\" exists.",
"Warning", JOptionPane.ERROR_MESSAGE);
}
public Vector<String> getGraGraNames() {
Vector<String> gragraNames = new Vector<String>();
for (int i = 0; i < this.root.getChildCount(); i++) {
gragraNames
.addElement(((DefaultMutableTreeNode) this.root.getChildAt(i))
.toString());
}
return gragraNames;
}
public Vector<String> getGraGraChildrenNames(EdGraGra eGra) {
Vector<String> childrenNames = new Vector<String>();
for (int i = 0; i < eGra.getGraphs().size(); i++) {
childrenNames.add(eGra.getGraphs().get(i)
.getBasisGraph().getName());
}
for (int i = 0; i < eGra.getRules().size(); i++) {
if (eGra.getRules().elementAt(i) != null) {
EdRule er = eGra.getRules().elementAt(i);
childrenNames.add(er.getBasisRule().getName());
for (int j = 0; j < er.getNACs().size(); j++) {
EdNAC enac = er.getNACs().elementAt(j);
childrenNames.add(enac.getBasisGraph()
.getName());
}
for (int j = 0; j < er.getPACs().size(); j++) {
EdPAC epac = er.getPACs().elementAt(j);
childrenNames.add(epac.getBasisGraph()
.getName());
}
for (int j = 0; j < er.getNestedACs().size(); j++) {
EdPAC epac = er.getNestedACs().elementAt(j);
childrenNames.add(epac.getBasisGraph()
.getName());
}
}
}
return childrenNames;
}
private Vector<String> getRuleChildrenNames(EdRule eRule) {
Vector<String> childrenNames = new Vector<String>();
// childrenNames.add(eRule.getName());
for (int i = 0; i < eRule.getNACs().size(); i++) {
childrenNames.add(eRule.getNACs().elementAt(i)
.getBasisGraph().getName());
}
for (int i = 0; i < eRule.getPACs().size(); i++) {
childrenNames.add(eRule.getPACs().elementAt(i)
.getBasisGraph().getName());
}
for (int i = 0; i < eRule.getNestedACs().size(); i++) {
childrenNames.add(eRule.getNestedACs().elementAt(i)
.getBasisGraph().getName());
}
return childrenNames;
}
private Vector<String> getNestedChildrenNames(EdNestedApplCond ac) {
Vector<String> childrenNames = new Vector<String>();
for (int i = 0; i < ac.getNestedACs().size(); i++) {
childrenNames.add(ac.getNestedACs().get(i)
.getBasisGraph().getName());
}
return childrenNames;
}
private Vector<String> getRuleSchemeChildrenNames(EdRuleScheme eRuleScheme) {
Vector<String> ruleSchemeChildrenNames = new Vector<String>();
ruleSchemeChildrenNames.add(eRuleScheme.getBasisRuleScheme().getSchemeName());
ruleSchemeChildrenNames.add(eRuleScheme.getBasisRuleScheme().getKernelRule().getName());
for (int i = 0; i < eRuleScheme.getMultiRules().size(); i++) {
ruleSchemeChildrenNames.add(eRuleScheme.getMultiRules().get(i)
.getBasisRule().getName());
}
if (eRuleScheme.getAmalgamatedRule() != null)
ruleSchemeChildrenNames.add(eRuleScheme.getAmalgamatedRule().getName());
return ruleSchemeChildrenNames;
}
/*
private Vector<String> getAllNames() {
Vector<String> allNames = new Vector<String>();
allNames.addElement(((DefaultMutableTreeNode) root).toString());
for (int i = 0; i < root.getChildCount(); i++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) root
.getChildAt(i);
allNames.add(node.toString()); // GraGra name
for (int j = 0; j < node.getChildCount(); j++) {
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode) node
.getChildAt(j);
allNames.addElement(node1.toString()); // graph / rule name
if (!node1.isLeaf()) {
for (int k = 0; j < node1.getChildCount(); k++) {
DefaultMutableTreeNode node2 = (DefaultMutableTreeNode) node1
.getChildAt(k);
allNames.addElement(node2.toString()); // NAC / PAC
// name
}
}
}
}
// System.out.println(">>> allNames.size = "+ allNames.size());
return allNames;
}
*/
private EdGraGra getGraGra(DefaultMutableTreeNode aNode) {
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) aNode
.getParent();
GraGraTreeNodeData data = (GraGraTreeNodeData) parent.getUserObject();
// System.out.println(data.toString());
if (data.isGraGra())
return data.getGraGra();
return null;
}
private EdRule getRule(DefaultMutableTreeNode aNode) {
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) aNode
.getParent();
GraGraTreeNodeData data = (GraGraTreeNodeData) parent.getUserObject();
if (data.isRule())
return data.getRule();
return null;
}
private EdRuleScheme getRuleScheme(DefaultMutableTreeNode aNode) {
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) aNode
.getParent();
GraGraTreeNodeData data = (GraGraTreeNodeData) parent.getUserObject();
if (data.isRuleScheme())
return data.getRuleScheme();
return null;
}
private EdNestedApplCond getParentCond(DefaultMutableTreeNode aNode) {
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) aNode
.getParent();
GraGraTreeNodeData data = (GraGraTreeNodeData) parent.getUserObject();
if (data.isNestedAC())
return data.getNestedAC();
return null;
}
private JFrame applFrame;
}