package jetbrains.mps.ide.actions; /*Generated by MPS */ import com.intellij.openapi.project.Project; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.ide.findusages.view.optionseditor.FindUsagesOptions; import jetbrains.mps.ide.findusages.model.SearchQuery; import jetbrains.mps.project.MPSProject; import jetbrains.mps.ide.findusages.view.optionseditor.DefaultOptionsContainer; import jetbrains.mps.ide.findusages.view.optionseditor.DefaultSearchOptionsComponent; import jetbrains.mps.ide.findusages.view.UsagesViewTool; import jetbrains.mps.openapi.editor.cells.EditorCell; import jetbrains.mps.nodeEditor.cells.APICellAdapter; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.ide.findusages.view.optionseditor.options.FindersOptions; import jetbrains.mps.ide.findusages.view.optionseditor.FindUsagesDialog; import jetbrains.mps.ide.findusages.model.IResultProvider; import jetbrains.mps.ide.findusages.view.optionseditor.options.ViewOptions; import jetbrains.mps.ide.findusages.view.UsageToolOptions; /*package*/ class FindUsagesHelper { private final Project myIdeaProject; private final jetbrains.mps.project.Project myProject; private SNode myOperationNode; private FindUsagesOptions myUsageOptions; private SearchQuery mySearchQuery; /*package*/ FindUsagesHelper(MPSProject project) { myIdeaProject = project.getProject(); myProject = project; } protected DefaultOptionsContainer getDefaultOptions() { return myIdeaProject.getComponent(DefaultSearchOptionsComponent.class).getDefaultOptions(); } private UsagesViewTool getTool() { return myIdeaProject.getComponent(UsagesViewTool.class); } /*package*/ boolean isApplicable() { return getTool() != null && getDefaultOptions() != null; } /*package*/ FindUsagesHelper prepareOptions(EditorCell cell, SNode node) { // needs model read myOperationNode = (cell == null ? node : APICellAdapter.getSNodeWRTReference(cell)); String concept = SNodeOperations.getConcept(myOperationNode).getQualifiedName(); FindUsagesOptions preset = getDefaultOptions().getDefaultSearchOptions(concept); FindersOptions findersOptions = preset.getFindersOptions().cloneWithDefaultForNode(myOperationNode); myUsageOptions = new FindUsagesOptions(findersOptions, preset.getScopeOptions(), preset.getViewOptions()); return this; } /*package*/ FindUsagesHelper showDialog() { // this method is optional. Since it deals with UI, shall not get invoked inside model read/command // that's the reason why FindSpecificNodeUsages_Action does that. // However, FinderOptions inside FindUsageDialog need model access for the node supplied, would be nice to deal with that in a proper way FindUsagesDialog dialog = new FindUsagesDialog(myUsageOptions, myOperationNode, myIdeaProject); dialog.show(); if (dialog.isCancelled()) { myOperationNode = null; myUsageOptions = null; // indicate we shall cancel } else { myUsageOptions = dialog.getResult(); } return this; } /*package*/ void invoke() { // this one requires model read as well, due to scopeOptions.getScope() and SearchQuery(SNode) if (myUsageOptions == null) { // no-op, dialog was cancelled return; } IResultProvider provider = myUsageOptions.getFindersOptions().getResult(); SearchQuery query = new SearchQuery(myOperationNode, myUsageOptions.getScopeOptions().getScope(myProject)); ViewOptions viewOptions = myUsageOptions.getViewOptions(); UsageToolOptions opt = new UsageToolOptions().allowRunAgain(true).navigateIfSingle(!(viewOptions.myShowOneResult)).forceNewTab(viewOptions.myNewTab).notFoundMessage("No usages for that node"); UsagesViewTool.showUsages(myIdeaProject, provider, query, opt); } }