package jetbrains.mps.ide.embeddableEditor; /*Generated by MPS */ import javax.swing.JPanel; import com.intellij.openapi.actionSystem.DataProvider; import jetbrains.mps.project.Project; import org.jetbrains.mps.openapi.module.SRepository; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.ide.editor.MPSFileNodeEditor; import java.awt.BorderLayout; import jetbrains.mps.smodel.tempmodel.TemporaryModels; import jetbrains.mps.smodel.tempmodel.TempModuleOptions; import org.jetbrains.annotations.NotNull; import java.awt.Color; import jetbrains.mps.ide.editor.NodeEditor; import jetbrains.mps.openapi.editor.Editor; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.NonNls; import jetbrains.mps.workbench.MPSDataKeys; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.project.MPSProject; import jetbrains.mps.nodefs.NodeVirtualFileSystem; import javax.swing.JComponent; public class EmbeddableEditor extends JPanel implements DataProvider { private final Project project; private final SRepository repository; private final boolean editable; private final SModel temporaryModel; private SNode node; private MPSFileNodeEditor nodeEditor; public EmbeddableEditor(Project project, boolean editable) { // todo: merge with UIEditorComponent ? super(new BorderLayout()); this.project = project; this.repository = project.getRepository(); this.editable = editable; this.temporaryModel = TemporaryModels.getInstance().create(true, TempModuleOptions.forDefaultModule()); } public void editNode(@NotNull final SNode node) { MPSFileNodeEditor oldEditor = nodeEditor; this.node = node; nodeEditor = createEditorForNode(node); removeAll(); add(nodeEditor.getComponent(), BorderLayout.CENTER); if (oldEditor != null) { oldEditor.dispose(); } } public void selectNode(SNode node) { nodeEditor.getNodeEditor().showNode(node, true); } public SNode getNode() { return node; } public void setBackground(Color color) { if (nodeEditor != null && nodeEditor.getNodeEditor() instanceof NodeEditor) { ((NodeEditor) nodeEditor.getNodeEditor()).getCurrentEditorComponent().setBackground(color); } } public Editor getEditor() { return nodeEditor.getNodeEditor(); } @Nullable @Override public Object getData(@NonNls String dataId) { if (dataId.equals(MPSDataKeys.FILE_EDITOR.getName())) { return nodeEditor; } return null; } private MPSFileNodeEditor createEditorForNode(SNode node) { SModel nodeModel; if (SNodeOperations.getModel(node) == null) { // node is not in repository if (!(editable)) { nodeModel = TemporaryModels.getInstance().create(true, TempModuleOptions.forDefaultModule()); SModelOperations.addRootNode(nodeModel, node); TemporaryModels.getInstance().addMissingImports(nodeModel); } else { throw new IllegalStateException("For nodes not from repository edit mode is disabled"); } } return new MPSFileNodeEditor((MPSProject) project, NodeVirtualFileSystem.getInstance().getFileFor(repository, node)); } public void disposeEditor() { repository.getModelAccess().runWriteAction(new Runnable() { public void run() { TemporaryModels.getInstance().dispose(temporaryModel); } }); if (nodeEditor != null) { nodeEditor.dispose(); } } public JComponent getPreferredFocusedComponent() { return nodeEditor.getPreferredFocusedComponent(); } }