package jetbrains.mps.vcs.diff.ui.common;
/*Generated by MPS */
import jetbrains.mps.openapi.editor.message.EditorMessageOwner;
import javax.swing.JPanel;
import jetbrains.mps.nodeEditor.inspector.InspectorEditorComponent;
import java.util.Map;
import jetbrains.mps.vcs.diff.changes.ModelChange;
import java.util.List;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.util.HashMap;
import jetbrains.mps.project.IProject;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.nodeEditor.configuration.EditorConfigurationBuilder;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.openapi.editor.extensions.EditorExtensionUtil;
import java.awt.Dimension;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.model.SNodeId;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import javax.swing.JComponent;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.nodeEditor.commands.CommandContextWithVF;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.nodeEditor.cells.EditorCell_Constant;
import org.jetbrains.annotations.NonNls;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import jetbrains.mps.nodeEditor.commands.CommandContextImpl;
import jetbrains.mps.nodefs.MPSNodeVirtualFile;
public class DiffEditor implements EditorMessageOwner {
private DiffEditor.MainEditorComponent myMainEditorComponent;
private JPanel myTopComponent;
private InspectorEditorComponent myInspector;
private Map<ModelChange, List<ChangeEditorMessage>> myChangeToMessages = MapSequence.fromMap(new HashMap<ModelChange, List<ChangeEditorMessage>>());
public DiffEditor(final IProject project, SNode node, String contentTitle, boolean isLeftEditor) {
myMainEditorComponent = new DiffEditor.MainEditorComponent(project.getRepository(), true, isLeftEditor);
myInspector = new InspectorEditorComponent(project.getRepository(), new EditorConfigurationBuilder().rightToLeft(isLeftEditor).build());
Sequence.fromIterable(getEditorComponents()).visitAll(new IVisitor<EditorComponent>() {
public void visit(EditorComponent ec) {
EditorExtensionUtil.extendUsingProject(ec, project);
}
});
myMainEditorComponent.editNode(node);
myInspector.getExternalComponent().setPreferredSize(new Dimension());
Sequence.fromIterable(getEditorComponents()).visitAll(new IVisitor<EditorComponent>() {
public void visit(EditorComponent ec) {
ec.getLeftEditorHighlighter().setDefaultFoldingAreaPaintersEnabled(false);
}
});
myTopComponent = new JPanel(new BorderLayout());
JLabel title = new JLabel(contentTitle);
title.setToolTipText(contentTitle);
myTopComponent.add(title, BorderLayout.NORTH);
myTopComponent.add(myMainEditorComponent.getExternalComponent(), BorderLayout.CENTER);
myTopComponent.setPreferredSize(new Dimension());
}
public SNode getEditedNode() {
return getMainEditor().getEditedNode();
}
public void editRoot(@Nullable SNodeId rootId, @NotNull SModel model) {
SNode root = (rootId == null ? null : model.getNode(rootId));
if (SNodeOperations.getParent(root) == null) {
getMainEditor().editNode(root);
}
}
public void editNode(@NotNull SNodeId nodeId, @NotNull SModel model) {
SNode node = model.getNode(nodeId);
assert node != null;
getMainEditor().editNode(node);
}
public void inspect(SNode node) {
String[] initialEditorHints = myMainEditorComponent.getEditorHintsForNode(node);
boolean needToEdit = myInspector.getUpdater().setInitialEditorHints(initialEditorHints);
if (needToEdit || myInspector.getEditedNode() != node) {
myInspector.editNode(node);
myInspector.getHighlightManager().repaintAndRebuildEditorMessages();
}
}
public JComponent getTopComponent() {
return myTopComponent;
}
public DiffEditor.MainEditorComponent getMainEditor() {
return myMainEditorComponent;
}
public InspectorEditorComponent getInspector() {
return myInspector;
}
public EditorComponent getEditorComponent(boolean inspector) {
return (inspector ? myInspector : myMainEditorComponent);
}
public void highlightChange(SModel model, ModelChange change, boolean isOldEditor, ChangeEditorMessage.ConflictChecker conflictChecker) {
final List<ChangeEditorMessage> messages = ChangeEditorMessageFactory.createMessages(model, isOldEditor, change, this, conflictChecker);
if (ListSequence.fromList(messages).isEmpty()) {
return;
}
MapSequence.fromMap(myChangeToMessages).put(change, messages);
Sequence.fromIterable(getEditorComponents()).visitAll(new IVisitor<EditorComponent>() {
public void visit(final EditorComponent ec) {
ListSequence.fromList(messages).visitAll(new IVisitor<ChangeEditorMessage>() {
public void visit(ChangeEditorMessage m) {
ec.getHighlightManager().mark(m);
}
});
}
});
}
public void repaintAndRebuildEditorMessages() {
Sequence.fromIterable(getEditorComponents()).visitAll(new IVisitor<EditorComponent>() {
public void visit(EditorComponent ec) {
ec.getHighlightManager().repaintAndRebuildEditorMessages();
}
});
}
public List<ChangeEditorMessage> getMessagesForChange(ModelChange change) {
return MapSequence.fromMap(myChangeToMessages).get(change);
}
public void unhighlightAllChanges() {
Sequence.fromIterable(getEditorComponents()).visitAll(new IVisitor<EditorComponent>() {
public void visit(EditorComponent ec) {
ec.getHighlightManager().clearForOwner(DiffEditor.this);
}
});
MapSequence.fromMap(myChangeToMessages).clear();
}
public void dispose() {
myMainEditorComponent.dispose();
myInspector.dispose();
}
private Iterable<EditorComponent> getEditorComponents() {
return Sequence.fromArray(new EditorComponent[]{myMainEditorComponent, myInspector});
}
public class MainEditorComponent extends EditorComponent {
private DiffFileEditor myDiffFileEditor;
private CommandContextWithVF myCommandContext;
public MainEditorComponent(SRepository repository, boolean showGutter, boolean rightToLeft) {
super(repository, new EditorConfigurationBuilder().showErrorsGutter(showGutter).rightToLeft(rightToLeft).build());
myDiffFileEditor = new DiffFileEditor(this);
setDefaultPopupGroupId(((String) BHReflection.invoke(SNodeOperations.getNode("r:c29f530b-f74d-4627-9da2-61138cfa6722(jetbrains.mps.vcs.platform.actions)", "426251916200108583"), SMethodTrimmedId.create("getGeneratedClassFQName", MetaAdapterFactory.getConcept(0x28f9e4973b424291L, 0xaeba0a1039153ab1L, 0x1181da058d2L, "jetbrains.mps.lang.plugin.structure.ActionGroupDeclaration"), "hEwJa8g"))));
}
@Deprecated
public MainEditorComponent(SRepository repository, boolean rightToLeft) {
this(repository, false, rightToLeft);
}
@Override
public EditorCell createEmptyCell() {
return new EditorCell_Constant(getEditorContext(), getEditedNode(), "");
}
@Override
public Object getData(@NonNls String dataId) {
if (dataId.equals(PlatformDataKeys.FILE_EDITOR.getName())) {
return myDiffFileEditor;
}
return super.getData(dataId);
}
@Override
protected CommandContextImpl createCommandContext() {
return myCommandContext = new CommandContextWithVF(this, getRepository());
}
public MPSNodeVirtualFile getVirtualFile() {
return myCommandContext.getContextVirtualFile();
}
}
}