package agg.gui.trafo;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import agg.editor.impl.EdGraGra;
import agg.editor.impl.EdRule;
import agg.gui.event.EditEvent;
import agg.gui.event.EditEventListener;
import agg.gui.event.TransformEvent;
import agg.gui.treeview.dialog.GraGraLayerDialog;
import agg.xt_basis.GraTra;
import agg.xt_basis.GraTraEvent;
import agg.xt_basis.GraTraEventListener;
import agg.xt_basis.GraTraOptions;
import agg.xt_basis.LayeredGraTraImpl;
import agg.xt_basis.Match;
import agg.xt_basis.MorphCompletionStrategy;
import agg.xt_basis.Rule;
import agg.xt_basis.RuleLayer;
/**
* The class TransformLayered implements an interpreting transformation of a
* layered gragra. It will be used by the GraGraTransform class.
*
* @author $Author: olga $
* @version $ID: TransformLayered.java,v 1.31 2000/07/31 09:46:16 shultzke Exp $
*/
public class TransformLayered extends Thread
implements GraTraEventListener,
EditEventListener {
public static int MAX_LAYERED_RUNS = 5;
/** Creates a new instance */
public TransformLayered(GraGraTransform transform) {
this.gragraTransform = transform;
this.gratra = new LayeredGraTraImpl();
this.gratra.enableWriteLogFile(true);
this.gratra.addGraTraListener(this);
}
public void dispose() {
this.gratra.removeGraTraListener(this);
this.gratra.dispose();
this.rl.dispose();
this.currentMatch = null;
this.currentRule = null;
this.gragra = null;
this.event = null;
}
public GraTra getGraTra() {
return this.gratra;
}
/** Sets a gragra to transform */
public void setGraGra(EdGraGra gra) {
this.gragra = gra;
this.gratra.setGraGra(this.gragra.getBasisGraGra());
this.gratra.setHostGraph(this.gragra.getBasisGraGra().getGraph());
// this.inheritanceWarningSent = false;
}
/** Sets the current completion strategy */
public void setCompletionStrategy(MorphCompletionStrategy strat) {
this.gratra.setCompletionStrategy(strat);
}
public void setParentFrame(JFrame f) {
this.parent = f;
}
/**
* If setting show is TRUE, the graph will be updated after each
* transformation step and shown newly
*/
public void setShowGraphAfterStep(boolean show) {
this.showGraphAfterStep = show;
}
/** Implements the Thread.run method */
public void run() {
this.gragraAnimated = false;
this.steps = 0;
this.cancelled = false;
this.stopped = false;
if (this.gratra.getHostGraph() != this.gragra.getBasisGraGra().getGraph()) {
this.gratra.setHostGraph(this.gragra.getBasisGraGra().getGraph());
}
this.gratra.setLayerToStop(this.gragraTransform.getLayerToStop());
this.consistencyCheckNotNeeded = !this.gragra.hasEnabledConstraints();
this.consistencyWhenCheckAfterGraphTrafo = this.gragraTransform.consistencyCheckAfterGraphTrafoEnabled();
this.gragraAnimated = this.gragra.isAnimated();
layeredTransform();
}
/** Stops the transformation */
public void stopping() {
if (this.gragraTransform.breakAllLayerEnabled()) {
this.stopped = true;
}
this.gratra.stop();
}
public void nextLayer() {
this.gratra.nextLayer();
}
private void layeredTransform() {
this.gratra.setGraTraOptions(this.gragraTransform.getGraTraOptions());
GraTraOptions gratraOptions = this.gratra.getGraTraOptions();
gratraOptions.addOption("layered");
this.gragra.getBasisGraGra().setGraTraOptions(
this.gragraTransform.getGraTraOptionsList());
this.rl = new RuleLayer(this.gragra.getBasisGraGra().getEnabledRules()); //getListOfRules());
if (this.gragraTransform.showLayerEnabled()) {
GraGraLayerDialog lg = new GraGraLayerDialog(this.parent, this.rl);
// lg.setGraGra(gragra);
lg.showGUI();
if (lg.isCancelled()) {
// rl = new RuleLayer(gragra.getBasisGraGra().getEnabledRules()); //getListOfRules());
} else {
this.gragra.getBasisGraGra().setRuleLayer(this.rl);
}
}
this.gratra.transform();
}
/** Implements GraTraEventListener.graTraEventOccurred
*/
public void graTraEventOccurred(GraTraEvent e) {
String ruleName = "";
this.event = e;
this.msgGraTra = e.getMessage();
if (this.msgGraTra == GraTraEvent.MATCH_VALID) {
// if (e.getMatch().getRule() != null)
ruleName = e.getMatch().getRule().getName();
if (this.gragraTransform.selectMatchObjectsEnabled()) {
this.gragra.getGraph().updateAlongMorph(e.getMatch());
}
this.gragra.getGraph().unsetNodeNumberChanged();
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.MATCH_VALID,
this.event.getMatch(),
" match of <" + ruleName + "> is valid"));
} else if (this.msgGraTra == GraTraEvent.STEP_COMPLETED) {
this.steps++;
this.currentMatch = this.event.getMatch();
this.currentRule = this.currentMatch.getRule();
ruleName = this.currentRule.getName();
if (this.showGraphAfterStep) {
this.gragra.getGraph().setXYofNewNode(this.gragra.getRule(this.currentRule), this.currentMatch, this.currentMatch.getCoMorphism());
if (this.gragra.isRuleAnimated(this.currentRule)) {
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.ANIMATED_NODE, this.currentMatch));
} else if (!this.gragraAnimated) {
this.gragraTransform.getEditor().doStepLayoutProc();
if (this.gragraTransform.selectNewAfterStepEnabled()) {
this.gragra.getGraph().updateAlongMorph(this.event.getCoMatch(), this.currentRule);
}
}
disposeMatch();
}
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.STEP_COMPLETED, " <" + ruleName
+ "> is applied"));
} else if (this.msgGraTra == GraTraEvent.LAYER_FINISHED) {
if (this.gratra.getCurrentLayer() >= 0) {
if (!this.showGraphAfterStep) {
this.gragraTransform.getEditor().doStandardLayoutProc();
}
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.LAYER_FINISHED, " Layer "
+ e.getMessageText() + " done. "));
} else if (this.gragraTransform.layeredLoopEnabled()) {
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.LAYER_FINISHED, " Loop over layer. First layer will start. "));
}
} else if (this.msgGraTra == GraTraEvent.TRANSFORM_FINISHED) {
// System.out.println("GraTraEvent.TRANSFORM_FINISHED");
this.gratra.stop();
this.gragra.getGraph().clearMarks();
if (!this.showGraphAfterStep) {
this.gragraTransform.getEditor().doStandardLayoutProc();
}
if (!this.cancelled) {
if (this.steps == 0) {
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.CANNOT_TRANSFORM, e.getMessageText()));
}
}
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.STOP, " finished. "));
System.out.println("*** Layered transformation - finished. ");
if (this.gragraTransform.layeredLoopEnabled()
&& this.gragraTransform.resetGraphEnabled()) {
if (!this.consistencyWhenCheckAfterGraphTrafo
|| this.consistencyCheckNotNeeded)
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.RESET_GRAPH));
}
}
else if ((this.msgGraTra == GraTraEvent.INPUT_PARAMETER_NOT_SET)) {
this.inputParameterOK = false;
String rulename = "";
if (this.event.getMatch() != null)
rulename = this.event.getMatch().getRule().getName();
else if (this.event.getRule() != null)
rulename = this.event.getRule().getName();
int answer = parameterWarning(rulename);
if (answer == JOptionPane.YES_OPTION) {
if (this.event.getMatch() != null) {
this.currentMatch = this.event.getMatch();
this.currentRule = this.currentMatch.getRule();
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.INPUT_PARAMETER_NOT_SET, this.currentMatch));
}
else if (this.event.getRule() != null) {
this.currentRule = this.event.getRule();
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.INPUT_PARAMETER_NOT_SET, this.currentRule));
}
while (!this.inputParameterOK) {
// wait for INPUT_PARAMETER_OK
// inside of editEventOccurred(EditEvent e)
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {}
}
} else if (answer == 1) { // Continue
this.gratra.stopRule();
} else if (answer == 2) { // Cancel
this.gratra.stop();
this.cancelled = true;
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.CANCEL));
}
} else if (this.msgGraTra == GraTraEvent.NOT_READY_TO_TRANSFORM) {
ruleName = this.event.getMessageText();
String s = "Please check variables of the rule: " + ruleName; // e.getMessageText();
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.NOT_READY_TO_TRANSFORM, s));
} else if ((this.msgGraTra == GraTraEvent.ATTR_TYPE_FAILED)
|| (this.msgGraTra == GraTraEvent.RULE_FAILED)
|| (this.msgGraTra == GraTraEvent.ATOMIC_GC_FAILED)
|| (this.msgGraTra == GraTraEvent.GRAPH_FAILED)) {
String s = e.getMessageText();
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.NOT_READY_TO_TRANSFORM, s));
} else if (this.msgGraTra == GraTraEvent.NEW_MATCH) {
// currentMatch = event.getMatch();
// currentRule = currentMatch.getRule();
// ruleName = currentRule.getName();
// gragraTransform.fireTransform(new TransformEvent(this,
// TransformEvent.NEW_MATCH, " new match of <"+ruleName+"> is
// created"));
} else if (this.msgGraTra == GraTraEvent.NO_COMPLETION) {
// if (this.showGraphAfterStep) {
// this.currentRule = this.event.getMatch().getRule();
// disposeMatch();
// }
} else if (this.msgGraTra == GraTraEvent.INCONSISTENT) {
// ruleName = currentRule.getName();
// String msg = "Graph inconsistency after applying rule <
// "+ruleName+"> !";
if (this.gragraTransform.consistencyCheckAfterGraphTrafoEnabled()) {
this.consistencyWhenCheckAfterGraphTrafo = false;
this.gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.INCONSISTENT, this.event.getMessageText()));
}
} else if (this.msgGraTra == GraTraEvent.MATCH_FAILED) {
}
}
/** Implements EditEventListener.editEventOccurred */
public void editEventOccurred(EditEvent e) {
if (e.getMsg() == EditEvent.INPUT_PARAMETER_OK) {
this.inputParameterOK = true;
}
}
/** Returns TRUE if there is at least one step was possible */
public boolean isSuccessful() {
if (this.steps == 0)
return false;
return true;
}
/** Returns TRUE if the transformation was stopped */
public boolean isStopped() {
return this.stopped;
}
private void disposeMatch() {
EdRule r = this.gragra.getRule(this.currentRule);
if (r != null)
r.updateRule();
}
private int parameterWarning(String ruleName) {
Object[] options = { "Set", "Continue", "Cancel" };
int answer = JOptionPane.showOptionDialog(null,
"Input parameter of the rule \" " + ruleName
+ " \" not set!\nDo you want to set parameter?",
"Warning", JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE, null, options, options[0]);
return answer;
}
/*
private void inheritanceWarning() {
if (gratra.getGraGra().getConstraints().hasMoreElements()
&& gratra.getGraGra().getTypeSet().usesInheritance()) {
if (!inheritanceWarningSent) {
gragraTransform.fireTransform(new TransformEvent(this,
TransformEvent.INHERITANCE));
inheritanceWarningSent = true;
}
} else
inheritanceWarningSent = false;
}
*/
private JFrame parent;
private GraGraTransform gragraTransform;
private LayeredGraTraImpl gratra;
private boolean consistencyWhenCheckAfterGraphTrafo = true;
private int msgGraTra;
private GraTraEvent event;
private EdGraGra gragra;
private Rule currentRule;
private Match currentMatch;
private boolean inputParameterOK = false;
private int steps;
private boolean cancelled = false;
private boolean stopped = false;
private RuleLayer rl;
// private int extraRuns = 10;
private boolean showGraphAfterStep;
// private boolean inheritanceWarningSent = false;
private boolean gragraAnimated;
private boolean consistencyCheckNotNeeded = false;
}