MessageHandler
.error("Can only remove refinements from states.");
return;
}
State state = (State) target;
// Check that all these containers exist.
CompositeEntity immediateContainer = (CompositeEntity) state
.getContainer();
if (immediateContainer == null) {
MessageHandler.error("State has no container!");
return;
}
final CompositeEntity container = (CompositeEntity) immediateContainer
.getContainer();
if (container == null) {
MessageHandler.error("State container has no container!");
return;
}
TypedActor[] refinements;
try {
refinements = state.getRefinement();
} catch (Exception ex) {
MessageHandler.error("Invalid refinements.", ex);
return;
}
if ((refinements == null) || (refinements.length < 1)) {
MessageHandler.error("No refinements to remove.");
return;
}
String[] choices = new String[refinements.length];
for (int i = 0; i < refinements.length; i++) {
choices[i] = ((Nameable) refinements[i]).getName();
}
// Open a dialog to get the refinement name and class.
Query query = new Query();
query.addChoice("Refinement", "Refinement", choices, choices[0],
false);
// FIXME: Need a frame owner for first arg.
// Perhaps calling getController(), which returns a GraphController
// will be a good start.
ComponentDialog dialog = new ComponentDialog(null,
"Specify Refinement", query);
if (!dialog.buttonPressed().equals("OK")) {
return;
}
String refinementName = query.getStringValue("Refinement");
StringBuffer newRefinements = new StringBuffer();
String currentRefinements = state.refinementName.getExpression();
StringTokenizer tokenizer = new StringTokenizer(currentRefinements,
",");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (!token.trim().equals(refinementName)) {
if (newRefinements.length() > 0) {
newRefinements.append(", ");
}
newRefinements.append(token.trim());
}
}
// Check to see whether any other state or transition has
// this refinment, and if not, remove it from its container.
Iterator states = immediateContainer.entityList().iterator();
boolean foundOne = false;
while (states.hasNext()) {
NamedObj other = (NamedObj) states.next();
if ((other != state) && other instanceof State) {
String refinementList = ((State) other).refinementName
.getExpression();
if (refinementList == null) {
continue;
}
tokenizer = new StringTokenizer(refinementList, ",");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (token.equals(refinementName)) {
foundOne = true;
break;
}
}
if (foundOne) {
break;
}
}
}
if (!foundOne) {
Iterator transitions = immediateContainer.relationList()
.iterator();
while (transitions.hasNext()) {
NamedObj other = (NamedObj) transitions.next();
if (other instanceof Transition) {
String refinementList = ((Transition) other).refinementName
.getExpression();
if (refinementList == null) {
continue;
}
tokenizer = new StringTokenizer(refinementList, ",");
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (token.equals(refinementName)) {
foundOne = true;
break;
}
}
if (foundOne) {
break;
}
}
}
}
String removal = "";
if (!foundOne) {
removal = "<deleteEntity name=\"" + refinementName + "\"/>";
}
String moml = "<group><entity name=\"" + state.getName(container)
+ "\"><property name=\"refinementName\" value=\""
+ newRefinements.toString() + "\"/></entity>" + removal
+ "</group>";
MoMLChangeRequest change = new MoMLChangeRequest(this, container,
moml);