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