/* * Copyright 2003-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.nodeEditor.cellActions; import jetbrains.mps.baseLanguage.tuples.runtime.Tuples._4; import jetbrains.mps.ide.datatransfer.CopyPasteUtil; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.openapi.editor.EditorContext; import org.jetbrains.mps.openapi.model.SNode; import java.util.List; import java.util.Map; import java.util.Set; public class CellAction_CutNode extends CellAction_CopyNode { @Override public boolean canExecute(EditorContext context) { if (!super.canExecute(context)) { return false; } List<SNode> selectedNodes = context.getSelectionManager().getSelection().getSelectedNodes(); if (selectedNodes.isEmpty()) { return false; } SNode node = selectedNodes.get(0); if (SNodeOperations.getParent(node) == null || context.getEditorComponent().getEditedNode() == node) { return false; } return true; // todo: what about read-only models? } @Override public void execute(EditorContext context) { _4<List<SNode>, List<SNode>, Map<SNode, Set<SNode>>, String> tuple = extractSelection(context); if (tuple == null) return; final List<SNode> sNodes = tuple._1(); CopyPasteUtil.copyNodesAndTextToClipboard(tuple._0(), tuple._2(), tuple._3()); SNode nodeToSelect = null; for (SNode node : sNodes) { nodeToSelect = findNodeToSelect(node); node.delete(); } if(nodeToSelect!=null) { context.selectWRTFocusPolicy(nodeToSelect); } } private SNode findNodeToSelect(SNode node) { SNode candidate = node.getNextSibling(); if(candidate==null) { candidate = node.getParent(); } return candidate; } }