package de.FeatureModellingTool.GraphicalEditor;
import research.*;
import research.figure.TextFigure;
import research.util.GlobalFunction;
import javax.swing.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.util.*;
import de.FeatureModellingTool.FeatureModel.*;
import de.reuse.Clipboard;
import de.reuse.GroupMap;
/**
* Created by IntelliJ IDEA.
* User: saturn
* Date: 2003-7-30
* Time: 23:20:01
* To change this template use Options | File Templates.
*/
abstract class FigureTransferAction extends AbstractAction implements ConstantDefinition {
protected DrawingView drawingView = null;
protected FeatureModel featureModel = null;
protected FeatureEditor featureEditor = null;
protected FeatureModelEditor featureModelEditor = null;
private ConstraintModel constraintModel = null;
private ConstraintModelEditor constraintModelEditor = null;
private CompositeConstraintEditor plConstraintEditor = null;
private GroupConstraintEditor gConstraintEditor = null;
private VPConstraintEditor vpConstraintEditor = null;
private InteractionModel interactionModel = null;
private InteractionModelEditor interactionModelEditor = null;
private ResourceComponentEditor resourceComponentEditor = null;
private GroupMap idToFigureMap = null;
public FigureTransferAction() {
this.addPropertyChangeListener(new ContextChangeListener());
}
protected class ContextChangeListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent e) {
contextChange(e);
}
}
protected void contextChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if (DRAWING_VIEW.equals(propertyName)) {
drawingView = (DrawingView) e.getNewValue();
} else if (FEATURE_MODEL.equals(propertyName)) {
featureModel = (FeatureModel) e.getNewValue();
} else if (FEATURE_EDITOR.equals(propertyName)) {
featureEditor = (FeatureEditor) e.getNewValue();
} else if (FEATURE_MODEL_EDITOR.equals(propertyName)) {
featureModelEditor = (FeatureModelEditor) e.getNewValue();
} else if (ID_TO_FIGURE_MAP.equals(propertyName)) {
idToFigureMap = (GroupMap) e.getNewValue();
} else if (CONSTRAINT_MODEL.equals(propertyName)) {
constraintModel = (ConstraintModel) e.getNewValue();
} else if (CONSTRAINT_MODEL_EDITOR.equals(propertyName)) {
constraintModelEditor = (ConstraintModelEditor) e.getNewValue();
} else if (PL_CONSTRAINT_EDITOR.equals(propertyName)) {
plConstraintEditor = (CompositeConstraintEditor) e.getNewValue();
} else if (GROUP_CONSTRAINT_EDITOR.equals(propertyName)) {
gConstraintEditor = (GroupConstraintEditor) e.getNewValue();
} else if (VP_CONSTRAINT_EDITOR.equals(propertyName)) {
vpConstraintEditor = (VPConstraintEditor) e.getNewValue();
} else if (INTERACTION_MODEL.equals(propertyName)) {
interactionModel = (InteractionModel) e.getNewValue();
} else if (INTERACTION_MODEL_EDITOR.equals(propertyName)) {
interactionModelEditor = (InteractionModelEditor) e.getNewValue();
} else if (RESOURCE_COMPONENT_EDITOR.equals(propertyName)) {
resourceComponentEditor = (ResourceComponentEditor) e.getNewValue();
}
}
public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
super.firePropertyChange(propertyName, oldValue, newValue);
}
protected void deleteFigures() {
Vector selection = drawingView.getSelection();
Iterator iterator = selection.iterator();
ArrayList figureList = new ArrayList(selection.size());
//ɾ����ǰ��ѡ��Ĺ�ϵͼԪ�������Ӧ��ģ��Ԫ��
while (iterator.hasNext()) {
Figure figure = (Figure) iterator.next();
if (figure instanceof ConnectionFigure) {
String id = (String) figure.getAttribute("id");
drawingView.removeFromSelection(figure);
drawingView.remove(figure);
if (id != null) {
if (featureModel.containsFeatureRelation(id)) {
featureModelEditor.removeRelation(id);
} else if (constraintModel.containsCFRelation(id)) {
constraintModelEditor.removeCFRelation(id);
} else if (interactionModel.containsInteraction(id)) {
interactionModelEditor.removeInteraction(id);
}
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.remove(id, figure);
}
}
} else {
String type = (String) figure.getAttribute("type");
if ((type == null) || (!type.equals("interactionTitle"))) {
figureList.add(figure);
}
}
}
//ɾ����ǰ��ѡ��ʵ��ͼԪ��ͬʱɾ�����ͼԪ��صĹ�ϵͼԪ���������Ӧ��ģ��Ԫ��
for (int i = 0; i < figureList.size(); i++) {
Figure fig = (Figure) figureList.get(i);
Figure[] figures = GlobalFunction.getObservingFigures(fig, ConnectionFigure.class);
for (int j = 0; j < figures.length; j++) {
String id = (String) figures[j].getAttribute("id");
drawingView.removeFromSelection(figures[j]);
drawingView.remove(figures[j]);
if (featureModel.containsFeatureRelation(id)) {
featureModelEditor.removeRelation(id);
} else if (constraintModel.containsCFRelation(id)) {
constraintModelEditor.removeCFRelation(id);
} else if (interactionModel.containsInteraction(id)) {
interactionModelEditor.removeInteraction(id);
}
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.remove(id, figures[j]);
}
}
String id = (String) fig.getAttribute("id");
Boolean isALink = (Boolean) fig.getAttribute(FeatureFigure.IS_A_LINK);
//ɾ����ǰ(�����Ӹ���)ͼԪ���������Ӹ���
if (idToFigureMap != null) {
Set set = idToFigureMap.get(id);
if (((isALink == null) || (!isALink.booleanValue())) && (set != null)) {
Iterator linkIterator = set.iterator();
while (linkIterator.hasNext()) {
Figure f = (Figure) linkIterator.next();
if (f == fig) continue;
Figure[] fs = GlobalFunction.getObservingFigures(f, ConnectionFigure.class);
for (int j = 0; j < fs.length; j++) {
String id_tmp = (String) fs[j].getAttribute("id");
drawingView.removeFromSelection(fs[j]);
drawingView.remove(fs[j]);
//
if (featureModel.containsFeatureRelation(id_tmp)) {
featureModelEditor.removeRelation(id_tmp);
} else if (constraintModel.containsCFRelation(id_tmp)) {
constraintModelEditor.removeCFRelation(id_tmp);
} else if (interactionModel.containsInteraction(id)) {
interactionModelEditor.removeInteraction(id);
}
//
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.remove(id_tmp, fs[j]);
}
}
drawingView.removeFromSelection(f);
drawingView.remove(f);
}
}
}
drawingView.removeFromSelection(fig);
drawingView.remove(fig);
if ((isALink == null) || (!isALink.booleanValue())) {
//
if (featureModel.containsFeature(id)) {
featureModelEditor.removeFeature(id);
} else if (constraintModel.containsConstraint(id)) {
constraintModelEditor.removeConstraint(id);
} else if (interactionModel.containsResourceComponent(id)){
interactionModelEditor.removeResourceComponent(id);
}
//
}
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.remove(id, fig);
}
}
drawingView.repairDamage();
}
protected void copyFigures() {
ArrayList figureList = new ArrayList();
ArrayList connectionList = new ArrayList();
Vector selection = drawingView.getSelection();
Iterator iterator = selection.iterator();
//�ѵ�ǰ��ѡ���ͼԪ����ʵ��ͼԪ��ϵͼԪ�ı���Ϊ����
figureList.clear();
connectionList.clear();
while (iterator.hasNext()) {
Figure figure = (Figure) iterator.next();
if (figure instanceof ConnectionFigure) {
connectionList.add(figure);
} else {
String type = (String) figure.getAttribute("type");
if ((type == null) || (!type.equals("interactionTitle"))) {
figureList.add(figure);
}
}
}
//��connectionList������ͼԪ����figureList�е�Ԫ�ش�connectionList��
for (int i = 0; i < connectionList.size();) {
ConnectionFigure cf = (ConnectionFigure) connectionList.get(i);
Figure sf = cf.startFigure();
Figure ef = cf.endFigure();
if (figureList.contains(sf) && figureList.contains(ef)) {
i++;
} else {
connectionList.remove(i);
}
}
//ArrayList infoEntityList = new ArrayList(figureList.size() + connectionList.size());
TreeMap infoEntityMap = new TreeMap();
//���ͼԪ��Ϣ
//.1���ʵ��ͼԪ��Ϣ
Vector figureInfo = new Vector(figureList.size() + connectionList.size());
for (int i = 0; i < figureList.size(); i++) {
figureInfo.add(figureList.get(i));
}
//.2�����ϵͼԪ��Ϣ
for (int i = 0; i < connectionList.size(); i++) {
figureInfo.add(connectionList.get(i));
}
FigureEnumerator fe = new FigureEnumerator(figureInfo);
StandardFigureSelection sfe = new StandardFigureSelection(fe, figureInfo.size());
//���ģ����Ϣ
for (int i = 0; i < connectionList.size(); i++) {
Figure f = (Figure) connectionList.get(i);
String id = (String) f.getAttribute("id");
if (featureModel.containsFeatureRelation(id)) {
//��¼������ϵ��Ϣ
Map featureRelationInfo = new TreeMap();
FeatureRelation fr = featureModel.getFeatureRelation(id);
featureRelationInfo.put(FeatureRelationProperties.ID, fr.getID());
featureRelationInfo.put(FeatureRelationProperties.NAME, fr.getName());
featureRelationInfo.put(FeatureRelationProperties.START_FEATURE, fr.getStartFeature().getID());
featureRelationInfo.put(FeatureRelationProperties.END_FEATURE, fr.getEndFeature().getID());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "featureRelation");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, featureRelationInfo);
infoEntityMap.put(id, infoEntity);
} else if (constraintModel.containsCFRelation(id)) {
//��¼Լ����ϵ��Ϣ
Map plRelationInfo = new TreeMap();
CFRelation plr = constraintModel.getCFRelation(id);
plRelationInfo.put(CFRelationProperties.ID, plr.getID());
plRelationInfo.put(CFRelationProperties.NAME, plr.getName());
plRelationInfo.put(CFRelationProperties.FEATURE, plr.getFeature().getID());
plRelationInfo.put(CFRelationProperties.CONSTRAINT, plr.getConstraint().getID());
plRelationInfo.put(CFRelationProperties.IS_SOURCE, Boolean.valueOf(plr.isSource()));
plRelationInfo.put(CFRelationProperties.MODIFIER, plr.getModifier().getName());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "plRelation");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, plRelationInfo);
infoEntityMap.put(id, infoEntity);
} else if (interactionModel.containsInteraction(id)) {
//��¼������ϵ��Ϣ
Map interactionInfo = new TreeMap();
Interaction interaction = interactionModel.getInteraction(id);
interactionInfo.put(InteractionProperties.ID, interaction.getID());
interactionInfo.put(InteractionProperties.NAME, interaction.getName());
interactionInfo.put(InteractionProperties.TYPE, interaction.getType());
interactionInfo.put(InteractionProperties.ACTIVER, interaction.getActiver().getID());
interactionInfo.put(InteractionProperties.PASSIVER, interaction.getPassiver().getID());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "interaction");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, interactionInfo);
infoEntityMap.put(id, infoEntity);
}
}
for (int i = 0; i < figureList.size(); i++) {
Figure fig = (Figure) figureList.get(i);
String id = (String) fig.getAttribute("id");
if (id == null) continue;
if (featureModel.containsFeature(id)) {
//��¼��������Ϣ
Map featureInfo = new TreeMap();
Feature feature = featureModel.getFeature(id);
featureInfo.put(FeatureProperties.ID, feature.getID());
featureInfo.put(FeatureProperties.NAME, feature.getName());
featureInfo.put(FeatureProperties.DESCRIPTION, feature.getDescription());
featureInfo.put(FeatureProperties.SOURCE, feature.getSource());
featureInfo.put(FeatureProperties.ISSUE_AND_DECISION, feature.getIssueAndDecision());
featureInfo.put(FeatureProperties.NOTE, feature.getNote());
featureInfo.put(FeatureProperties.CATEGORY, feature.getCategory());
featureInfo.put(FeatureProperties.VARIABILITY, feature.getVariability());
featureInfo.put(FeatureProperties.BINDINGTIME, feature.getBindingTime());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "feature");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, featureInfo);
infoEntityMap.put(id, infoEntity);
} else if (constraintModel.containsCompositeConstraint(id)) {
//��¼Լ����Ϣ
Map plcInfo = new TreeMap();
CompositeConstraint plc = constraintModel.getCompositeConstraint(id);
plcInfo.put(CompositeConstraintProperties.ID, plc.getID());
plcInfo.put(CompositeConstraintProperties.PL_TYPE, plc.getPLType());
plcInfo.put(CompositeConstraintProperties.SOURCE_TYPE, plc.getSourceType());
plcInfo.put(CompositeConstraintProperties.SINK_TYPE, plc.getSinkType());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "plConstraint");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, plcInfo);
infoEntityMap.put(id, infoEntity);
} else if (constraintModel.containsGroupConstraint(id)) {
//��¼Լ����Ϣ
Map gcInfo = new TreeMap();
GroupConstraint gc = constraintModel.getGroupConstraint(id);
gcInfo.put(GroupConstraintProperties.ID, gc.getID());
gcInfo.put(GroupConstraintProperties.TYPE, gc.getType());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "groupConstraint");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, gcInfo);
infoEntityMap.put(id, infoEntity);
} else if (constraintModel.containsVPConstraint(id)) {
//��¼Լ����Ϣ
Map gcInfo = new TreeMap();
VPConstraint vpc = constraintModel.getVPConstraint(id);
gcInfo.put(VPConstraintProperties.ID, vpc.getID());
gcInfo.put(VPConstraintProperties.TYPE, vpc.getType());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "vpConstraint");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, gcInfo);
infoEntityMap.put(id, infoEntity);
} else if (interactionModel.containsResourceComponent(id)) {
Map rcInfo = new TreeMap();
ResourceComponent rc = interactionModel.getResourceComponent(id);
rcInfo.put(EntityProperties.ID, rc.getID());
rcInfo.put(EntityProperties.NAME, rc.getName());
rcInfo.put(EntityProperties.DESCRIPTION, rc.getDescription());
rcInfo.put(EntityProperties.VARIABILITY, rc.getVariability());
rcInfo.put(EntityProperties.BINDINGTIME, rc.getBindingTime());
//infoEntity
Map infoEntity = new TreeMap();
infoEntity.put(ConstantDefinition.TYPE, "resource-component");
infoEntity.put(ConstantDefinition.TARGET_MODEL_ELEMENT, rcInfo);
infoEntityMap.put(id, infoEntity);
}
}
TreeMap clipboradContent = new TreeMap();
clipboradContent.put("graphInfo", sfe);
clipboradContent.put("modelInfo", infoEntityMap);
Clipboard.getInstance().setContent(clipboradContent);
}
protected void cutFigures() {
copyFigures();
deleteFigures();
}
protected void pasteFigures() {
Map clipboardContent = Clipboard.getInstance().getContent();
FigureSelection graphInfo = (FigureSelection) clipboardContent.get("graphInfo");
Map modelInfo = (Map) clipboardContent.get("modelInfo");
FigureEnumeration fe = (FigureEnumeration) graphInfo.getData(graphInfo.getType());
ArrayList figureList = new ArrayList(modelInfo.size());
while (fe.hasMoreElements()) {
Figure fig = fe.nextFigure();
if (fig instanceof ConnectionFigure) {
figureList.add(0, fig);
} else {
figureList.add(fig);
}
}
int breakPoint = 0;
//���ʵ��ͼԪ���ϵͼԪ�ķֽ��
for (int i = figureList.size() - 1; i >= 0; i--) {
Figure fig = (Figure) figureList.get(i);
if (fig instanceof ConnectionFigure) {
breakPoint = i + 1;
break;
}
}
//�����µ�ID
/**
* ���ȼ��ģ�����Ƿ������ͬ��id,��������������µ�id
*/
ArrayList oldIDList = new ArrayList(figureList.size());
ArrayList newIDList = new ArrayList(oldIDList.size());
for (int i = 0; i < breakPoint; i++) {
Figure fig = (Figure) figureList.get(i);
String id = (String) fig.getAttribute("id");
oldIDList.add(i, id);
if (featureModel.containsFeatureRelation(id)
|| constraintModel.containsCFRelation(id)
|| interactionModel.containsInteraction(id)) {
Map infoEntity = (Map) modelInfo.get(oldIDList.get(i));
String infoType = (String) infoEntity.get(ConstantDefinition.TYPE);
Map relationInfo = (Map) infoEntity.get(ConstantDefinition.TARGET_MODEL_ELEMENT);
if (infoType.equals("featureRelation")) {
String name = (String) relationInfo.get(FeatureRelationProperties.NAME);
newIDList.add(i, GIDGenerator.getInstance().createRelationID(name));
} else if (infoType.equals("plRelation")) {
newIDList.add(i, GIDGenerator.getInstance().createRelationID(CFRelation.PL_Relation));
} else if (infoType.equals("interaction")) {
newIDList.add(i, GIDGenerator.getInstance().createGID("interaction"));
}
} else {
newIDList.add(i, id);
}
}
for (int i = breakPoint; i < figureList.size(); i++) {
Figure fig = (Figure) figureList.get(i);
String id = (String) fig.getAttribute("id");
oldIDList.add(i, id);
Boolean isALink = (Boolean) fig.getAttribute(FeatureFigure.IS_A_LINK);
if ((isALink != null) && (isALink.booleanValue() == true)) {
newIDList.add(i, id);
} else {
if (featureModel.containsFeature(id)
|| constraintModel.containsConstraint(id)
|| interactionModel.containsResourceComponent(id)) {
Map infoEntity = (Map) modelInfo.get(oldIDList.get(i));
String infoType = (String) infoEntity.get(ConstantDefinition.TYPE);
if (infoType.equals("feature")) {
newIDList.add(i, GIDGenerator.getInstance().createFeatureID());
} else if (infoType.equals("plConstraint")) {
newIDList.add(i, GIDGenerator.getInstance().createPLConstraintID());
} else if (infoType.equals("groupConstraint")) {
newIDList.add(i, GIDGenerator.getInstance().createGroupConstraintID());
} else if (infoType.equals("vpConstraint")) {
newIDList.add(i, GIDGenerator.getInstance().createVPConstraintID());
} else if (infoType.equals("resource-component")) {
newIDList.add(i, GIDGenerator.getInstance().createResourceComponentID());
}
} else {
newIDList.add(i, id);
}
}
}
//�ָ�ģ����Ϣ
//.1�ָ�ʵ��Ԫ����Ϣ
for (int i = breakPoint; i < figureList.size(); i++) {
Figure fig = (Figure) figureList.get(i);
Boolean isALink = (Boolean) fig.getAttribute(FeatureFigure.IS_A_LINK);
if ((isALink != null) && (isALink.booleanValue() == true)) {
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add((String) oldIDList.get(i), fig);
}
continue;
}
Map infoEntity = (Map) modelInfo.get(oldIDList.get(i));
String infoType = (String) infoEntity.get(ConstantDefinition.TYPE);
Map info = (Map) infoEntity.get(ConstantDefinition.TARGET_MODEL_ELEMENT);
if (infoType.equals("feature")) {
String id = (String) newIDList.get(i);
String name = (String) info.get(FeatureProperties.NAME);
String description = (String) info.get(FeatureProperties.DESCRIPTION);
String source = (String) info.get(FeatureProperties.SOURCE);
String iad = (String) info.get(FeatureProperties.ISSUE_AND_DECISION);
String note = (String) info.get(FeatureProperties.NOTE);
FeatureCategory category = (FeatureCategory) info.get(FeatureProperties.CATEGORY);
Variability variability = (Variability) info.get(FeatureProperties.VARIABILITY);
BindingTime bindingTime = (BindingTime) info.get(FeatureProperties.BINDINGTIME);
Feature feature = featureModelEditor.addFeature(name, id);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
featureEditor.setDescription(feature, description);
featureEditor.setSource(feature, source);
featureEditor.setIssueAndDecision(feature, iad);
featureEditor.setNote(feature, note);
featureEditor.setCategory(feature, category);
featureEditor.setVariability(feature, variability);
featureEditor.setBindingTime(feature, bindingTime);
} else if (infoType.equals("plConstraint")) {
String id = (String) newIDList.get(i);
CompositeConstraintType plType = (CompositeConstraintType) info.get(CompositeConstraintProperties.PL_TYPE);
CompositeConstraintPortType sourceType = (CompositeConstraintPortType) info.get(CompositeConstraintProperties.SOURCE_TYPE);
CompositeConstraintPortType sinkType = (CompositeConstraintPortType) info.get(CompositeConstraintProperties.SINK_TYPE);
CompositeConstraint plc = constraintModelEditor.addCompositeConstraint(id);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
plConstraintEditor.setPLType(plc, plType);
plConstraintEditor.setSourceType(plc, sourceType);
plConstraintEditor.setSinkType(plc, sinkType);
} else if(infoType.equals("groupConstraint")){
String id = (String) newIDList.get(i);
GroupConstraintType gType = (GroupConstraintType) info.get(GroupConstraintProperties.TYPE);
GroupConstraint gc = constraintModelEditor.addGroupConstraint(id);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
gConstraintEditor.setType(gc, gType);
} else if (infoType.equals("vpConstraint")) {
String id = (String) newIDList.get(i);
VPConstraintType vpType = (VPConstraintType) info.get(VPConstraintProperties.TYPE);
VPConstraint vpc = constraintModelEditor.addVPConstraint(id);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
vpConstraintEditor.setType(vpc, vpType);
} else if (infoType.equals("resource-component")){
String id = (String) newIDList.get(i);
String name = (String) info.get(EntityProperties.NAME);
String description = (String) info.get(EntityProperties.DESCRIPTION);
Variability variability = (Variability) info.get(EntityProperties.VARIABILITY);
BindingTime bindingTime = (BindingTime) info.get(EntityProperties.BINDINGTIME);
ResourceComponent rc = interactionModelEditor.addResourceComponent(name, id);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
resourceComponentEditor.setDescription(rc, description);
resourceComponentEditor.setVariability(rc, variability);
resourceComponentEditor.setBindingTime(rc, bindingTime);
}
}
//.1�ָ���ϵԪ����Ϣ
ArrayList redundancyIndex = new ArrayList();
TreeMap interactionMap = new TreeMap();
for (int i = 0; i < breakPoint; i++) {
Map relationEntity = (Map) modelInfo.get(oldIDList.get(i));
String relationType = (String) relationEntity.get(ConstantDefinition.TYPE);
Map relationInfo = (Map) relationEntity.get(ConstantDefinition.TARGET_MODEL_ELEMENT);
if (relationType.equals("featureRelation")) {
String id = (String) newIDList.get(i);
String name = (String) relationInfo.get(FeatureRelationProperties.NAME);
String sID = (String) relationInfo.get(FeatureRelationProperties.START_FEATURE);
String eID = (String) relationInfo.get(FeatureRelationProperties.END_FEATURE);
int sIndex = oldIDList.indexOf(sID);
int eIndex = oldIDList.indexOf(eID);
sID = (String) newIDList.get(sIndex);
eID = (String) newIDList.get(eIndex);
if (!featureModel.contains(name, sID, eID)) {
featureModelEditor.addRelation(name, id, sID, eID);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
} else {
redundancyIndex.add(new Integer(i));
}
} else if (relationType.equals("plRelation")) {
String id = (String) newIDList.get(i);
String name = (String) relationInfo.get(CFRelationProperties.NAME);
String fID = (String) relationInfo.get(CFRelationProperties.FEATURE);
String plcID = (String) relationInfo.get(CFRelationProperties.CONSTRAINT);
Boolean isSource = (Boolean) relationInfo.get(CFRelationProperties.IS_SOURCE);
String modifier = (String) relationInfo.get(CFRelationProperties.MODIFIER);
int fIndex = oldIDList.indexOf(fID);
int plcIndex = oldIDList.indexOf(plcID);
fID = (String) newIDList.get(fIndex);
plcID = (String) newIDList.get(plcIndex);
constraintModelEditor.addCFRelation(id, featureModel.getFeature(fID),
constraintModel.getConstraint(plcID), isSource.booleanValue(), CFRModifier.getInstance(modifier));
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
} else if (relationType.equals("interaction")) {
String id = (String) newIDList.get(i);
String type = (String) relationInfo.get(InteractionProperties.TYPE);
String name = (String) relationInfo.get(InteractionProperties.NAME);
String activerID = (String) relationInfo.get(InteractionProperties.ACTIVER);
String passiverID = (String) relationInfo.get(InteractionProperties.PASSIVER);
int aIndex = oldIDList.indexOf(activerID);
int pIndex = oldIDList.indexOf(passiverID);
activerID = (String) newIDList.get(aIndex);
passiverID = (String) newIDList.get(pIndex);
if (!interactionModel.containsInteraction(type, name, activerID, passiverID)) {
Interaction ita = interactionModelEditor.addInteraction(id, type, name, activerID, passiverID);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, figureList.get(i));
}
interactionMap.put(new Integer(i), ita);
} else {
redundancyIndex.add(new Integer(i));
}
}
}
//�ָ�ͼԪ��Ϣ
drawingView.clearSelection();
for (int i = figureList.size() - 1; i >= 0; i--) {
Figure fig = (Figure) figureList.get(i);
fig.setAttribute("id", newIDList.get(i));
//if (!redundancyIndex.contains(Integer.valueOf(i))) {
if (!redundancyIndex.contains(new Integer(i))) {
drawingView.add(fig);
drawingView.addToSelection(fig);
} else {
drawingView.add(fig);
drawingView.remove(fig);
}
}
//.����ƫ��
for (int i = figureList.size() - 1; i >= breakPoint; i--) {
//if (!redundancyIndex.contains(Integer.valueOf(i))) {
if (!redundancyIndex.contains(new Integer(i))) {
Figure fig = (Figure) figureList.get(i);
fig.moveBy(20, 20);
}
}
//.�ָ�interaction��titleͼԪ
Iterator iterator = interactionMap.keySet().iterator();
while (iterator.hasNext()) {
Integer integer = (Integer) iterator.next();
Interaction ita = (Interaction) interactionMap.get(integer);
Figure fig = (Figure) figureList.get(integer.intValue());
TextFigure title = new TextFigure();
title.setText(ita.getType() + ":" + ita.getName());
title.setAttribute("id", ita.getID());
title.setAttribute("type", "interactionTitle");
title.setAttribute("isALink", Boolean.TRUE);
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(ita.getID(), title);
}
drawingView.add(title);
title.connect(fig);
}
drawingView.repairDamage();
}
protected void pasteFiguresAsLink() {
Map clipboardContent = Clipboard.getInstance().getContent();
FigureSelection graphInfo = (FigureSelection) clipboardContent.get("graphInfo");
Map modelInfo = (Map) clipboardContent.get("modelInfo");
FigureEnumeration fe = (FigureEnumeration) graphInfo.getData(graphInfo.getType());
//��ü������������ͼԪ�б�
ArrayList figureList = new ArrayList(modelInfo.size());
while (fe.hasMoreElements()) {
Figure fig = fe.nextFigure();
if ((fig instanceof FeatureFigure) || (fig instanceof ResourceComponentFigure)) {
figureList.add(fig);
}
}
//�������ͼԪ��Ӧ������id��Ϣ
ArrayList idList = new ArrayList(figureList.size());
for (int i = 0; i < figureList.size(); i++) {
Figure fig = (Figure) figureList.get(i);
String id = (String) fig.getAttribute("id");
idList.add(i, fig.getAttribute("id"));
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(id, fig);
}
}
//�ָ�ͼԪ��Ϣ
drawingView.clearSelection();
for (int i = figureList.size() - 1; i >= 0; i--) {
Figure fig = (Figure) figureList.get(i);
Figure[] observers = GlobalFunction.getObservingFigures(fig, ConnectionFigure.class);
for (int k = 0; k < observers.length; k++) {
if (observers[k] instanceof FigureChangeListener) {
fig.removeFigureChangeListener((FigureChangeListener) observers[k]);
}
}
fig.setAttribute(FeatureFigure.IS_A_LINK, Boolean.TRUE);
drawingView.add(fig);
drawingView.addToSelection(fig);
}
//.����ƫ��
for (int i = figureList.size() - 1; i >= 0; i--) {
Figure fig = (Figure) figureList.get(i);
fig.moveBy(20, 20);
}
drawingView.repairDamage();
}
}