/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.FeatureModellingTool.GraphicalEditor;
import de.FeatureModellingTool.FeatureModel.CFRModifier;
import de.FeatureModellingTool.FeatureModel.CFRelation;
import de.FeatureModellingTool.FeatureModel.ConstraintModel;
import de.FeatureModellingTool.FeatureModel.ConstraintModelEditor;
import de.FeatureModellingTool.FeatureModel.Feature;
import de.FeatureModellingTool.FeatureModel.FeatureEditor;
import de.FeatureModellingTool.FeatureModel.FeatureModel;
import de.FeatureModellingTool.FeatureModel.FeatureModelEditor;
import de.FeatureModellingTool.FeatureModel.FeatureRelation;
import de.FeatureModellingTool.FeatureModel.VPConstraint;
import de.FeatureModellingTool.FeatureModel.VPConstraintEditor;
import de.reuse.GroupMap;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import research.ConnectionFigure;
import research.Figure;
import research.figure.TextFigure;
import research.tool.Tool;
/**
*
* @author Administrator
*/
class RefinementCreationTool extends Tool implements ConstantDefinition {
static enum Refinement {
Decompose, Attribute, Specialize
};
//
protected final Refinement refineType;
//
protected int childCount;
//
private FeatureModel featureModel = null;
private FeatureEditor featureEditor = null;
private FeatureModelEditor featureModelEditor = null;
private ConstraintModel constraintModel = null;
private ConstraintModelEditor constraintModelEditor = null;
private VPConstraintEditor vpConstraintEditor = null;
private GroupMap idToFigureMap = null;
/**
* the anchor point of the interaction
*/
private Point anchor = null;
public RefinementCreationTool(Refinement refineType, int childCount) {
this.refineType = refineType;
this.childCount = childCount;
}
public RefinementCreationTool(Refinement refineType) {
this(refineType, 3);
}
public void setChildCount(int childCount){
this.childCount = childCount;
}
public int getChildCount(){
return childCount;
}
@Override
protected void contextChange(PropertyChangeEvent e) {
super.contextChange(e);
String propertyName = e.getPropertyName();
if (FEATURE_MODEL.equals(propertyName)) {
end();
featureModel = (FeatureModel) e.getNewValue();
} else if (FEATURE_EDITOR.equals(propertyName)) {
end();
featureEditor = (FeatureEditor) e.getNewValue();
} else if (FEATURE_MODEL_EDITOR.equals(propertyName)) {
end();
featureModelEditor = (FeatureModelEditor) e.getNewValue();
} else if (CONSTRAINT_MODEL.equals(propertyName)) {
end();
constraintModel = (ConstraintModel) e.getNewValue();
} else if (CONSTRAINT_MODEL_EDITOR.equals(propertyName)) {
end();
constraintModelEditor = (ConstraintModelEditor) e.getNewValue();
} else if (VP_CONSTRAINT_EDITOR.equals(propertyName)) {
end();
vpConstraintEditor = (VPConstraintEditor) e.getNewValue();
} else if (ID_TO_FIGURE_MAP.equals(propertyName)) {
idToFigureMap = (GroupMap) e.getNewValue();
}
}
@Override
public boolean isEnabled() {
if (!super.isEnabled()) {
return false;
}
switch (refineType) {
case Specialize:
if (constraintModel == null || constraintModelEditor == null || vpConstraintEditor == null) {
return false;
}
case Decompose:
case Attribute:
if (featureModel == null || featureModelEditor == null) {
return false;
}
}
return true;
}
@Override
public void mouseClicked(MouseEvent e, int x, int y) {
if (!isEnabled()) {
return;
}
double scale = drawingView.getScale();
int realX = (int) (e.getX() / scale + 0.5);
int realY = (int) (e.getY() / scale + 0.5);
anchor = new Point(realX, realY);
FeatureFigure parent = null;
Feature parentFeature = null;
Figure pressedFigure = drawingView.getDrawing().findFigureInside(realX, realY);
if (pressedFigure != null && FeatureFigure.class.isInstance(pressedFigure) && pressedFigure.getAttribute("id") != null && featureModel.containsFeature((String) pressedFigure.getAttribute("id"))) {
parent = (FeatureFigure) pressedFigure;
parentFeature = featureModel.getFeature((String) parent.getAttribute("id"));
anchor = parent.getDisplayBox().getLocation();
} else {
parent = new FeatureFigure();
drawingView.add(parent);
parent.setDisplayBox(anchor, anchor);
parentFeature = featureModelEditor.addFeature((String) parent.getAttribute(FeatureFigure.TEXT));
parent.setAttribute("id", parentFeature.getID());
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(parentFeature.getID(), parent);
}
featureEditor.setName(parentFeature, "Parent");
}
if (refineType == Refinement.Decompose || refineType == Refinement.Attribute) {
FeatureFigure child[] = new FeatureFigure[childCount];
Feature childFeature[] = new Feature[childCount];
ConnectionFigure relation[] = new ConnectionFigure[childCount];
FeatureRelation fr[] = new FeatureRelation[childCount];
int xDis, yDis;
xDis = 80;
yDis = 85;
anchor.translate(-(childCount - 1) * xDis / 2 - xDis, yDis);
for (int i = 0; i < child.length; i++) {
anchor.translate(xDis, 0);
child[i] = (FeatureFigure) parent.clone();
child[i].setAttribute("id", "null");
drawingView.add(child[i]);
child[i].setDisplayBox(anchor, anchor);
childFeature[i] = featureModelEditor.addFeature((String) child[i].getAttribute(FeatureFigure.TEXT));
child[i].setAttribute("id", childFeature[i].getID());
switch (refineType) {
case Decompose:
relation[i] = new DecomposeConnection();
break;
case Attribute:
relation[i] = new AttributeConnection();
break;
case Specialize:
break;
}
relation[i].startPoint(anchor.x, anchor.y);
relation[i].endPoint(anchor.x, anchor.y);
drawingView.add(relation[i]);
relation[i].connectStart(parent.getConnectors()[TextFigure.SOUTH]);
relation[i].connectEnd(child[i].getConnectors()[TextFigure.NORTH]);
relation[i].updateConnection();
switch (refineType) {
case Decompose:
fr[i] = featureModelEditor.addRelation(FeatureRelation.DECOMPOSE, parentFeature, childFeature[i]);
break;
case Attribute:
fr[i] = featureModelEditor.addRelation(FeatureRelation.ATTRIBUTE, parentFeature, childFeature[i]);
break;
}
relation[i].setAttribute("id", fr[i].getID());
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(childFeature[i].getID(), child[i]);
idToFigureMap.add(fr[i].getID(), relation[i]);
}
}
for (int i = 0; i < child.length; i++) {
featureEditor.setName(childFeature[i], "Child " + i);
}
} else if (refineType == Refinement.Specialize) {
PLConnection topRelation = new PLConnection();
CFRelation topCFRelation = null;
VPConstraintFigure vp = new VPConstraintFigure();
VPConstraint vpConstraint = null;
int xDis, yDis;
xDis = 80;
yDis = 60;
anchor.translate(0, yDis);
Rectangle parentBounds = parent.getDisplayBox();
Rectangle bounds = vp.getDisplayBox();
vp.moveBy(anchor.x + parentBounds.width / 2 - (bounds.x + bounds.width) / 2, anchor.y - (bounds.y + bounds.height) / 2);
vpConstraint = constraintModelEditor.addVPConstraint();
vp.setAttribute("id", vpConstraint.getID());
drawingView.add(vp);
topRelation.startPoint(anchor.x, anchor.y);
topRelation.endPoint(anchor.x, anchor.y);
drawingView.add(topRelation);
topRelation.connectStart(vp.getStartConnector());
topRelation.connectEnd(parent.getConnectors()[TextFigure.SOUTH]);
topRelation.setAttribute(PLConnection.DISPLAY_MODE, PLConnection.H_V_MODE);
topRelation.updateConnection();
topCFRelation = constraintModelEditor.addCFRelation(parentFeature, vpConstraint, true, CFRModifier.Affirmation);
topRelation.setAttribute("id", topCFRelation.getID());
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(vpConstraint.getID(), vp);
idToFigureMap.add(topCFRelation.getID(), topRelation);
}
PLConnection relation[] = new PLConnection[childCount];
CFRelation childCFRelation[] = new CFRelation[childCount];
FeatureFigure child[] = new FeatureFigure[childCount];
Feature childFeature[] = new Feature[childCount];
yDis = 25;
anchor.translate(-(childCount - 1) * xDis / 2 - xDis, yDis);
for (int i = 0; i < child.length; i++) {
anchor.translate(xDis, 0);
child[i] = (FeatureFigure) parent.clone();
child[i].setAttribute("id", "null");
drawingView.add(child[i]);
child[i].setDisplayBox(anchor, anchor);
childFeature[i] = featureModelEditor.addFeature((String) child[i].getAttribute(FeatureFigure.TEXT));
child[i].setAttribute("id", childFeature[i].getID());
relation[i] = new PLConnection();
relation[i].startPoint(anchor.x, anchor.y);
relation[i].endPoint(anchor.x, anchor.y);
drawingView.add(relation[i]);
relation[i].connectStart(vp.getEndConnector());
relation[i].connectEnd(child[i].getConnectors()[TextFigure.NORTH]);
relation[i].setAttribute(PLConnection.DISPLAY_MODE, PLConnection.H_V_MODE);
relation[i].updateConnection();
childCFRelation[i] = constraintModelEditor.addCFRelation(childFeature[i], vpConstraint, false, CFRModifier.Affirmation);
relation[i].setAttribute("id", childCFRelation[i].getID());
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(childFeature[i].getID(), child[i]);
idToFigureMap.add(childCFRelation[i].getID(), relation[i]);
}
}
for (int i = 0; i < child.length; i++) {
featureEditor.setName(childFeature[i], "Child " + i);
}
}
drawingView.checkDamage();
getPropertyChangeSupport().firePropertyChange(Tool.TOOL_DONE, false, true);
}
}