Package de.FeatureModellingTool.GraphicalEditor

Source Code of de.FeatureModellingTool.GraphicalEditor.RefinementCreationTool

/*
* 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);
    }
}
TOP

Related Classes of de.FeatureModellingTool.GraphicalEditor.RefinementCreationTool

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.