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);
}
});
}
}
}