package jetbrains.mps.ide.actions;
/*Generated by MPS */
import jetbrains.mps.workbench.action.BaseAction;
import javax.swing.Icon;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.AnActionEvent;
import java.util.Map;
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import org.jetbrains.mps.openapi.module.ModelAccess;
import jetbrains.mps.project.MPSProject;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.EditableSModel;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.ide.editor.MPSEditorDataKeys;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.List;
import jetbrains.mps.util.Pair;
import jetbrains.mps.workbench.MPSDataKeys;
import jetbrains.mps.datatransfer.PasteNodeData;
import jetbrains.mps.ide.datatransfer.CopyPasteUtil;
import java.util.Set;
import org.jetbrains.mps.openapi.model.SReference;
import jetbrains.mps.util.SNodeOperations;
import jetbrains.mps.nodeEditor.datatransfer.NodePaster;
import jetbrains.mps.datatransfer.PasteEnv;
import jetbrains.mps.resolve.ResolverComponent;
import jetbrains.mps.openapi.navigation.NavigationSupport;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
public class PasteNode_Action extends BaseAction {
private static final Icon ICON = AllIcons.Actions.Menu_paste;
public PasteNode_Action() {
super("Paste", "", ICON);
this.setIsAlwaysVisible(true);
this.setExecuteOutsideCommand(true);
}
@Override
public boolean isDumbAware() {
return true;
}
@Override
public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) {
boolean searchPanelInactive = ((EditorComponent) MapSequence.fromMap(_params).get("editorComponent")) == null || !(((EditorComponent) MapSequence.fromMap(_params).get("editorComponent")).isSearchPanelVisible());
ModelAccess modelAccess = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository().getModelAccess();
return searchPanelInactive && ((SModel) MapSequence.fromMap(_params).get("contextModel")) instanceof EditableSModel && PasteNode_Action.this.canPasteNodes(modelAccess, _params);
}
@Override
public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) {
this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params));
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!(super.collectActionData(event, _params))) {
return false;
}
{
MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT);
MapSequence.fromMap(_params).put("project", p);
if (p == null) {
return false;
}
}
{
EditorComponent editorComponent = event.getData(MPSEditorDataKeys.EDITOR_COMPONENT);
if (editorComponent != null && editorComponent.isInvalid()) {
editorComponent = null;
}
MapSequence.fromMap(_params).put("editorComponent", editorComponent);
}
{
SModel p = event.getData(MPSCommonDataKeys.CONTEXT_MODEL);
MapSequence.fromMap(_params).put("contextModel", p);
if (p == null) {
return false;
}
if (!(p instanceof EditableSModel) || p.isReadOnly()) {
return false;
}
}
{
SNode p = event.getData(MPSCommonDataKeys.NODE);
MapSequence.fromMap(_params).put("node", p);
}
{
List<Pair<SModel, String>> p = event.getData(MPSDataKeys.VIRTUAL_PACKAGES);
MapSequence.fromMap(_params).put("packs", p);
if (p == null) {
return false;
}
}
return true;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
ModelAccess modelAccess = ((MPSProject) MapSequence.fromMap(_params).get("project")).getModelAccess();
PasteNodeData pasteNodeData = PasteNode_Action.this.getPasteData(modelAccess, _params);
final Runnable addImportsRunnable = CopyPasteUtil.addImportsWithDialog(pasteNodeData, ((SModel) MapSequence.fromMap(_params).get("contextModel")), ((MPSProject) MapSequence.fromMap(_params).get("project")));
final List<SNode> pasteNodes = pasteNodeData.getNodes();
final Set<SReference> refsToResolve = pasteNodeData.getRequireResolveReferences();
if (pasteNodes == null || pasteNodes.size() == 0) {
return;
}
modelAccess.executeCommandInEDT(new Runnable() {
public void run() {
if (SNodeOperations.isModelDisposed(((SModel) MapSequence.fromMap(_params).get("contextModel")))) {
return;
}
if (addImportsRunnable != null) {
addImportsRunnable.run();
}
if (((SNode) MapSequence.fromMap(_params).get("node")) == null) {
NodePaster paster = new NodePaster(pasteNodes);
if (!(paster.canPasteAsRoots())) {
return;
}
paster.pasteAsRoots(((SModel) MapSequence.fromMap(_params).get("contextModel")), PasteNode_Action.this.getContextPackage(_params));
} else {
NodePaster paster = new NodePaster(pasteNodes);
if (!(paster.canPaste(((SNode) MapSequence.fromMap(_params).get("node")), PasteEnv.PROJECT_TREE))) {
return;
}
paster.paste(((SNode) MapSequence.fromMap(_params).get("node")), PasteEnv.PROJECT_TREE, PasteNode_Action.this.getContextPackage(_params));
}
ResolverComponent.getInstance().resolveScopesOnly(refsToResolve, ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository());
// make sure editor will be open
if (((EditorComponent) MapSequence.fromMap(_params).get("editorComponent")) == null) {
final SNode root = pasteNodes.get(0).getContainingRoot();
assert root != null;
((MPSProject) MapSequence.fromMap(_params).get("project")).getModelAccess().runWriteInEDT(new Runnable() {
public void run() {
NavigationSupport.getInstance().openNode(((MPSProject) MapSequence.fromMap(_params).get("project")), root, true, true);
NavigationSupport.getInstance().selectInTree(((MPSProject) MapSequence.fromMap(_params).get("project")), root, false);
}
});
}
}
});
}
private PasteNodeData getPasteData(ModelAccess modelAccess, final Map<String, Object> _params) {
final Wrappers._T<PasteNodeData> result = new Wrappers._T<PasteNodeData>();
modelAccess.runReadAction(new Runnable() {
public void run() {
result.value = CopyPasteUtil.getPasteNodeDataFromClipboard(((SModel) MapSequence.fromMap(_params).get("contextModel")));
}
});
return result.value;
}
private boolean canPasteNodes(ModelAccess modelAccess, final Map<String, Object> _params) {
return PasteNode_Action.this.getPasteData(modelAccess, _params) != null;
}
private String getContextPackage(final Map<String, Object> _params) {
if (((SNode) MapSequence.fromMap(_params).get("node")) != null) {
return SPropertyOperations.getString(((SNode) ((SNode) MapSequence.fromMap(_params).get("node"))), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, 0x115eca8579fL, "virtualPackage"));
}
if (((List<Pair<SModel, String>>) MapSequence.fromMap(_params).get("packs")) != null && ((List<Pair<SModel, String>>) MapSequence.fromMap(_params).get("packs")).size() == 1 && ((List<Pair<SModel, String>>) MapSequence.fromMap(_params).get("packs")).get(0).o1 == ((SModel) MapSequence.fromMap(_params).get("contextModel"))) {
return ((List<Pair<SModel, String>>) MapSequence.fromMap(_params).get("packs")).get(0).o2;
}
return null;
}
}