package jetbrains.mps.vcs.diff.ui.common; /*Generated by MPS */ import java.util.List; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.vcs.diff.changes.ModelChange; import jetbrains.mps.openapi.editor.message.EditorMessageOwner; import jetbrains.mps.vcs.diff.changes.AddRootChange; import jetbrains.mps.vcs.diff.changes.DeleteRootChange; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.LinkedList; import jetbrains.mps.errors.messageTargets.NodeMessageTarget; import jetbrains.mps.vcs.diff.changes.SetPropertyChange; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.errors.messageTargets.PropertyMessageTarget; import jetbrains.mps.vcs.diff.changes.SetReferenceChange; import jetbrains.mps.errors.messageTargets.ReferenceMessageTarget; import jetbrains.mps.vcs.diff.changes.NodeGroupChange; import org.jetbrains.mps.openapi.language.SContainmentLink; import org.jetbrains.mps.openapi.model.SNodeId; import jetbrains.mps.util.IterableUtil; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.errors.messageTargets.DeletedNodeMessageTarget; public class ChangeEditorMessageFactory { private ChangeEditorMessageFactory() { } public static List<ChangeEditorMessage> createMessages(SModel editedModel, boolean isOldEditor, ModelChange change, EditorMessageOwner owner, ChangeEditorMessage.ConflictChecker conflictChecker, boolean highlighted) { if (change instanceof AddRootChange || change instanceof DeleteRootChange) { return ListSequence.fromListAndArray(new LinkedList<ChangeEditorMessage>(), new ChangeEditorMessage(editedModel.getNode(change.getRootId()), new NodeMessageTarget(), owner, change, conflictChecker, highlighted)); } else if (change instanceof SetPropertyChange) { SetPropertyChange chng = (SetPropertyChange) change; SNode node = editedModel.getNode(chng.getAffectedNodeId(!(isOldEditor))); PropertyMessageTarget target = new PropertyMessageTarget(chng.getPropertyName()); return ListSequence.fromListAndArray(new LinkedList<ChangeEditorMessage>(), new ChangeEditorMessage(node, target, owner, change, conflictChecker, highlighted)); } else if (change instanceof SetReferenceChange) { SetReferenceChange chng = (SetReferenceChange) change; SNode node = editedModel.getNode(chng.getAffectedNodeId(!(isOldEditor))); ReferenceMessageTarget target = new ReferenceMessageTarget(chng.getRole()); return ListSequence.fromListAndArray(new LinkedList<ChangeEditorMessage>(), new ChangeEditorMessage(node, target, owner, change, conflictChecker, highlighted)); } else if (change instanceof NodeGroupChange) { NodeGroupChange chng = (NodeGroupChange) change; SModel changeModel = (isOldEditor ? change.getChangeSet().getOldModel() : change.getChangeSet().getNewModel()); SContainmentLink roleLink = chng.getRoleLink(); SNodeId parentId = chng.getParentNodeId(!(isOldEditor)); SNode parentNode = changeModel.getNode(parentId); if (parentNode == null) { return null; } List<SNode> changeChildren = IterableUtil.asList(parentNode.getChildren(roleLink)); int changeBegin = (isOldEditor ? chng.getBegin() : chng.getResultBegin()); int changeEnd = (isOldEditor ? chng.getEnd() : chng.getResultEnd()); // We need to check change models because current edited model can have different indices // (for instance, when some changes are already applied) SNodeId beginId = (changeBegin < ListSequence.fromList(changeChildren).count() ? ListSequence.fromList(changeChildren).getElement(changeBegin).getNodeId() : null); SNodeId endId = (changeEnd < ListSequence.fromList(changeChildren).count() ? ListSequence.fromList(changeChildren).getElement(changeEnd).getNodeId() : null); int currentChildrenSize = ListSequence.fromList(changeChildren).count(); int beginIndex = (beginId == null ? currentChildrenSize : SNodeOperations.getIndexInParent(((SNode) editedModel.getNode(beginId)))); int endIndex = (endId == null ? currentChildrenSize : SNodeOperations.getIndexInParent(((SNode) editedModel.getNode(endId)))); if (!((0 <= beginIndex && beginIndex <= endIndex && endIndex <= currentChildrenSize))) { return null; } if (beginIndex == endIndex) { // delete nodes return ListSequence.fromListAndArray(new LinkedList<ChangeEditorMessage>(), new ChangeEditorMessage(editedModel.getNode(parentId), new DeletedNodeMessageTarget(roleLink.getName(), beginIndex), owner, change, conflictChecker, highlighted)); } else { List<? extends SNode> editedChildren = IterableUtil.asList(editedModel.getNode(parentId).getChildren(roleLink)); List<ChangeEditorMessage> msgs = ListSequence.fromList(new LinkedList<ChangeEditorMessage>()); for (int i = beginIndex; i < endIndex; i++) { ListSequence.fromList(msgs).addElement(new ChangeEditorMessage(editedChildren.get(i), new NodeMessageTarget(), owner, change, conflictChecker, highlighted)); } return msgs; } } return null; } public static List<ChangeEditorMessage> createMessages(SModel editedModel, boolean isOldEditor, ModelChange change, EditorMessageOwner owner, ChangeEditorMessage.ConflictChecker conflictChecker) { return ChangeEditorMessageFactory.createMessages(editedModel, isOldEditor, change, owner, conflictChecker, true); } }