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);
}
}