package jetbrains.mps.vcs.changesmanager.editor;
/*Generated by MPS */
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.openapi.editor.message.EditorMessageOwner;
import javax.swing.JScrollPane;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.vcs.diff.ui.common.ChangeGroup;
import org.jetbrains.mps.openapi.module.ModelAccess;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.extapi.model.SModelBase;
import jetbrains.mps.vcs.diff.merge.MergeTemporaryModel;
import jetbrains.mps.smodel.CopyUtil;
import jetbrains.mps.vcs.diff.ui.common.DiffModelUtil;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import jetbrains.mps.vcs.diff.ui.common.Bounds;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.nodeEditor.EditorSettings;
import jetbrains.mps.vcs.diff.ui.common.ChangeEditorMessage;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import jetbrains.mps.vcs.diff.changes.ModelChange;
import jetbrains.mps.vcs.diff.ui.common.ChangeEditorMessageFactory;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.internal.collections.runtime.ILeftCombinator;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.openapi.editor.cells.CellTraversalUtil;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import java.awt.Color;
import jetbrains.mps.nodeEditor.cells.EditorCell_Constant;
public class BaseVersionEditorComponent extends EditorComponent implements EditorMessageOwner {
private JScrollPane myScrollPane;
private SModel myBaseModel;
public BaseVersionEditorComponent(SRepository repository, final ChangeGroup changeGroup) {
super(repository);
final ModelAccess modelAccess = repository.getModelAccess();
modelAccess.runReadAction(new Runnable() {
public void run() {
final jetbrains.mps.smodel.SModel baseModel = as_i3w5ys_a0a0a0a0a0a0c0c(ListSequence.fromList(changeGroup.getChanges()).first().getChangeSet().getOldModel(), SModelBase.class).getSModelInternal();
myBaseModel = new MergeTemporaryModel(CopyUtil.copyModel(baseModel), true);
}
});
modelAccess.runWriteAction(new Runnable() {
public void run() {
DiffModelUtil.renameModelAndRegister(myBaseModel, null);
}
});
final Wrappers._T<Bounds> verticalBounds = new Wrappers._T<Bounds>();
modelAccess.runReadAction(new Runnable() {
public void run() {
SNode baseRooot = myBaseModel.getNode(ListSequence.fromList(changeGroup.getChanges()).first().getRootId());
editNode(baseRooot);
setBackground(EditorSettings.getInstance().getCaretRowColor());
Iterable<ChangeEditorMessage> messages = ListSequence.fromList(changeGroup.getChanges()).translate(new ITranslator2<ModelChange, ChangeEditorMessage>() {
public Iterable<ChangeEditorMessage> translate(ModelChange ch) {
return ChangeEditorMessageFactory.createMessages(myBaseModel, true, ch, BaseVersionEditorComponent.this, null);
}
});
verticalBounds.value = Sequence.fromIterable(messages).select(new ISelector<ChangeEditorMessage, Bounds>() {
public Bounds select(ChangeEditorMessage m) {
return m.getBounds(BaseVersionEditorComponent.this);
}
}).reduceLeft(new ILeftCombinator<Bounds, Bounds>() {
public Bounds combine(Bounds a, Bounds b) {
return a.merge(b);
}
});
}
});
int rightMost = 0;
for (EditorCell leafCell = CellTraversalUtil.getFirstLeaf(getRootCell()); leafCell != null; leafCell = CellTraversalUtil.getNextLeaf(leafCell)) {
if (verticalBounds.value.contains(leafCell.getY()) || verticalBounds.value.contains(leafCell.getBottom()) || verticalBounds.value.contains(leafCell.getY() + leafCell.getHeight() / 2)) {
if (leafCell.getRight() > rightMost) {
rightMost = leafCell.getRight();
}
}
}
Rectangle viewRect = new Rectangle(0, (int) verticalBounds.value.start(), rightMost, verticalBounds.value.length());
viewRect.y -= 1;
viewRect.width += 5;
viewRect.height += 4;
myScrollPane = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
myScrollPane.setBorder(BorderFactory.createLineBorder(Color.BLACK));
myScrollPane.setPreferredSize(viewRect.getSize());
myScrollPane.getViewport().setViewPosition(viewRect.getLocation());
}
@Override
public EditorCell createEmptyCell() {
return new EditorCell_Constant(getEditorContext(), getEditedNode(), "");
}
@Override
public void dispose() {
getRepository().getModelAccess().runWriteAction(new Runnable() {
public void run() {
DiffModelUtil.unregisterModel(myBaseModel);
}
});
super.dispose();
}
public JScrollPane getScrollPane() {
return myScrollPane;
}
private static <T> T as_i3w5ys_a0a0a0a0a0a0c0c(Object o, Class<T> type) {
return (type.isInstance(o) ? (T) o : null);
}
}