package jetbrains.mps.vcs.diff.ui; /*Generated by MPS */ import jetbrains.mps.vcs.diff.ui.common.ButtonsPainter; import jetbrains.mps.nodeEditor.EditorComponent; import jetbrains.mps.vcs.diff.ui.common.ChangeGroupLayout; import jetbrains.mps.vcs.diff.ui.common.FoldingAreaButton; import jetbrains.mps.vcs.diff.ui.common.ChangeGroup; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.vcs.diff.changes.ModelChange; import jetbrains.mps.vcs.diff.changes.ChangeType; import java.util.List; import java.util.ArrayList; import jetbrains.mps.ide.icons.IdeIcons; import jetbrains.mps.vcs.diff.ui.common.DiffEditor; import javax.swing.Icon; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.vcs.diff.changes.NodeCopier; import jetbrains.mps.vcs.diff.changes.NodeGroupChange; import jetbrains.mps.internal.collections.runtime.IVisitor; public class StructDiffButtonsPainter extends ButtonsPainter { private StructDiffButtonsPainter(EditorComponent editorComponent, ChangeGroupLayout changeGroupLayout) { super(2, editorComponent, changeGroupLayout); } @Override protected Iterable<FoldingAreaButton> createButtonsForChangeGroup(ChangeGroup changeGroup, int y) { boolean allInsert = ListSequence.fromList(changeGroup.getChanges()).all(new IWhereFilter<ModelChange>() { public boolean accept(ModelChange c) { return c.getType() == ChangeType.ADD; } }); boolean allDelete = ListSequence.fromList(changeGroup.getChanges()).all(new IWhereFilter<ModelChange>() { public boolean accept(ModelChange c) { return c.getType() == ChangeType.DELETE; } }); List<FoldingAreaButton> result = ListSequence.fromList(new ArrayList<FoldingAreaButton>()); if (isHighlightLeft()) { if (!(allInsert)) { ListSequence.fromList(result).addElement(new StructDiffButtonsPainter.MyButtonRevert(changeGroup, getX(0), y, "Replace", MIRRORED_APPLY_ICON)); } if (allDelete) { ListSequence.fromList(result).addElement(new StructDiffButtonsPainter.MyButtonApply(changeGroup, getX(1), y, "Remove", IdeIcons.EXCLUDE)); } } else { if (allInsert) { ListSequence.fromList(result).addElement(new StructDiffButtonsPainter.MyButtonRevert(changeGroup, getX(0), y, "Remove", IdeIcons.EXCLUDE)); } if (!(allDelete)) { ListSequence.fromList(result).addElement(new StructDiffButtonsPainter.MyButtonApply(changeGroup, getX(1), y, "Replace", IdeIcons.APPLY)); } } return result; } public static StructDiffButtonsPainter addTo(DiffEditor diffEditor, ChangeGroupLayout changeGroupLayout, boolean inspector) { EditorComponent editorComponent = diffEditor.getEditorComponent(inspector); StructDiffButtonsPainter painter = new StructDiffButtonsPainter(editorComponent, changeGroupLayout); editorComponent.getLeftEditorHighlighter().addFoldingAreaPainter(painter); return painter; } private class MyButtonRevert extends FoldingAreaButton { private MyButtonRevert(ChangeGroup changeGroup, int x, int y, String name, Icon icon) { super(changeGroup, x, y, name, icon); } @Override public void performAction() { getEditorComponent().getEditorContext().getRepository().getModelAccess().executeCommand(new Runnable() { public void run() { ModelChange.rollbackChanges(getChangeGroup().getChanges()); } }); } } private class MyButtonApply extends FoldingAreaButton { private MyButtonApply(ChangeGroup changeGroup, int x, int y, String name, Icon icon) { super(changeGroup, x, y, name, icon); } @Override public void performAction() { getEditorComponent().getEditorContext().getRepository().getModelAccess().executeCommand(new Runnable() { public void run() { List<ModelChange> changes = getChangeGroup().getChanges(); final SModel model = ListSequence.fromList(changes).first().getChangeSet().getOldModel(); final NodeCopier nc = new NodeCopier(model); ListSequence.fromList(changes).ofType(NodeGroupChange.class).visitAll(new IVisitor<NodeGroupChange>() { public void visit(NodeGroupChange ch) { ch.prepare(); } }); ListSequence.fromList(changes).visitAll(new IVisitor<ModelChange>() { public void visit(ModelChange ch) { ch.apply(model, nc); } }); nc.restoreIds(true); } }); } } }