/* * Copyright 2003-2016 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.idea.core.usages; import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.usages.PsiElementUsageTarget; import com.intellij.usages.UsageTarget; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.idea.core.psi.impl.MPSPsiProvider; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import jetbrains.mps.workbench.choose.NodePointerNavigationItem; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeReference; import org.jetbrains.mps.openapi.module.SRepository; public class NodeUsageTarget extends NodeNavigatable implements UsageTarget, PsiElementUsageTarget { public NodeUsageTarget(@NotNull SNodeReference node, @NotNull Project project) { super(node, project); } @Override public PsiElement getElement() { return new ModelAccessHelper(ProjectHelper.getModelAccess(getProject())).runReadAction(new Computable<PsiElement>() { @Override public PsiElement compute() { return MPSPsiProvider.getInstance(myProject).getPsi(myNode); } }); } @Override public void findUsages() { // apparently never called at all } @Override public void findUsagesInEditor(@NotNull FileEditor fileEditor) { } @Override public void highlightUsages(PsiFile psiFile, Editor editor, boolean b) { } @Override public boolean isReadOnly() { return false; } @Override public boolean isValid() { SRepository repository = ProjectHelper.getProjectRepository(myProject); return new ModelAccessHelper(repository.getModelAccess()).runReadAction(new Computable<Boolean>() { @Override public Boolean compute() { SNode node = myNode.resolve(repository); return node != null && !(node.getModel() == null); } }); } @Override public VirtualFile[] getFiles() { return new VirtualFile[]{getFile()}; } @Override public void update() { final SRepository repository = ProjectHelper.getProjectRepository(myProject); repository.getModelAccess().runReadAction(new Runnable() { @Override public void run() { SNode resolved = myNode.resolve(repository); if (resolved == null) { myItemPresentation = new NodePointerNavigationItem(myNode, "failed to resolve node", null); } else { myItemPresentation = new NodePointerNavigationItem(resolved); } myTextPresentation = myItemPresentation.getPresentableText(); } }); } @Override public String getName() { return myTextPresentation; } public ItemPresentation getPresentation() { return myItemPresentation; } public void showSettings() { } }