/* * Copyright 2003-2015 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.smodel.action; import jetbrains.mps.lang.editor.menus.substitute.DefaultSubstituteMenuLookup; import jetbrains.mps.lang.editor.menus.transformation.DefaultSubstituteMenuItemAsActionItem; import jetbrains.mps.lang.editor.menus.transformation.DefaultTransformationMenuLookup; import jetbrains.mps.lang.editor.menus.transformation.SubstituteActionsCollector; import jetbrains.mps.lang.editor.menus.transformation.SubstituteItemsCollector; import jetbrains.mps.nodeEditor.CellSide; import jetbrains.mps.nodeEditor.cellActions.SideTransformSubstituteInfo; import jetbrains.mps.nodeEditor.cellActions.SideTransformSubstituteInfo.Side; import jetbrains.mps.nodeEditor.menus.MenuUtil; import jetbrains.mps.openapi.editor.EditorContext; import jetbrains.mps.openapi.editor.cells.EditorCell; import jetbrains.mps.openapi.editor.cells.SubstituteAction; import jetbrains.mps.openapi.editor.menus.substitute.SubstituteMenuContext; import jetbrains.mps.openapi.editor.menus.substitute.SubstituteMenuItem; import jetbrains.mps.openapi.editor.menus.substitute.SubstituteMenuLookup; import jetbrains.mps.openapi.editor.menus.transformation.TransformationMenuItem; import jetbrains.mps.openapi.editor.menus.transformation.TransformationMenuLookup; import jetbrains.mps.smodel.IOperationContext; import jetbrains.mps.smodel.language.LanguageRegistry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.language.SAbstractConcept; import org.jetbrains.mps.openapi.language.SContainmentLink; import org.jetbrains.mps.openapi.model.SNode; import java.util.Collections; import java.util.List; public class ModelActions { //------------------- // child substitute //------------------- public static List<SubstituteAction> createChildNodeSubstituteActions(@NotNull SNode parentNode, @Nullable SNode currentChild, @Nullable SContainmentLink link, @Nullable SAbstractConcept targetConcept, @NotNull IChildNodeSetter setter, @NotNull EditorContext editorContext) { if (targetConcept == null) { if (link != null) { targetConcept = link.getTargetConcept(); } else { return Collections.emptyList(); } } SubstituteMenuLookup lookup = new DefaultSubstituteMenuLookup(LanguageRegistry.getInstance(editorContext.getRepository()), targetConcept); List<TransformationMenuItem> transformationItems = new SubstituteItemsCollector(parentNode, currentChild, link, targetConcept, editorContext, lookup) { @Override protected TransformationMenuItem convert(SubstituteMenuItem item, SubstituteMenuContext context) { return new DefaultSubstituteMenuItemAsActionItem(item, context) { @Override protected SNode doSubstitute(SNode newChild) { return setter.execute(context.getParentNode(), context.getCurrentTargetNode(), newChild, context.getEditorContext()); } }; } }.collect(); return new SubstituteActionsCollector(parentNode, transformationItems, editorContext.getRepository()).collect(); } //------------------- // referent substitute //------------------- public static List<SubstituteAction> createReferentSubstituteActions(SNode referenceNode, SNode currentReferent, SNode linkDeclaration, IOperationContext context) { IReferentPresentationProvider matchingTextProvider = IReferentPresentationProvider.getDefaultMatchingText(linkDeclaration); IReferentPresentationProvider visibleMatchingTextProvider = IReferentPresentationProvider.getDefaultVisibleMatchingText(linkDeclaration); return ReferentSubstituteActionsHelper.createActions(referenceNode, currentReferent, linkDeclaration, matchingTextProvider, visibleMatchingTextProvider); } public static List<SubstituteAction> createReferentSubstituteActions(SNode referenceNode, SNode currentReferent, SNode linkDeclaration, @NotNull IReferentPresentationProvider matchingTextProvider, @NotNull IReferentPresentationProvider visibleMatchingTextProvider, IOperationContext context) { return ReferentSubstituteActionsHelper.createActions(referenceNode, currentReferent, linkDeclaration, matchingTextProvider, visibleMatchingTextProvider); } //------------------- // right-transform hint substitute //------------------- public static boolean canCreateSideTransformHintSubstituteActions(SNode sourceNode, CellSide side, String transformTag, IOperationContext context) { return new SideTransformHintSubstituteActionsHelper(sourceNode, side, transformTag, context).canCreateActions(); } /** * @deprecated use {@link #createSideTransformSubstituteActions(EditorCell, Side)} */ @Deprecated public static List<SubstituteAction> createSideTransformHintSubstituteActions(SNode sourceNode, CellSide side, String transformTag, IOperationContext context) { return new SideTransformHintSubstituteActionsHelper(sourceNode, side, transformTag, context).createActions(); } public static List<SubstituteAction> createSideTransformSubstituteActions(@NotNull EditorCell cell, @NotNull SideTransformSubstituteInfo.Side side) { final SNode sourceNode = cell.getSNode(); final EditorContext editorContext = cell.getContext(); if (sourceNode == null || editorContext == null) { return Collections.emptyList(); } TransformationMenuLookup lookup = new DefaultTransformationMenuLookup(LanguageRegistry.getInstance(editorContext.getRepository()), sourceNode.getConcept()); final List<TransformationMenuItem> items = MenuUtil.createMenu(lookup, side.myMenuLocation, cell); return new SubstituteActionsCollector(sourceNode, items, editorContext.getRepository()).collect(); } }