package jetbrains.mps.debugger.java.runtime.ui.breakpoints; /*Generated by MPS */ import com.intellij.ide.util.gotoByName.ChooseByNameModel; import java.util.Map; import java.util.List; import org.jetbrains.mps.openapi.persistence.NavigationParticipant; import java.util.LinkedHashMap; import jetbrains.mps.project.Project; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.smodel.SModelStereotype; import jetbrains.mps.workbench.goTo.navigation.GotoNavigationUtil; import jetbrains.mps.ide.findusages.model.scopes.ModelsScope; import jetbrains.mps.progress.EmptyProgressMonitor; import java.util.ArrayList; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import org.jetbrains.mps.openapi.model.SModelReference; import javax.swing.ListCellRenderer; import com.intellij.ui.ListCellRendererWrapper; import javax.swing.JList; import org.jetbrains.annotations.NotNull; /*package*/ abstract class ChooseFromStubsByNameModel implements ChooseByNameModel { private final Map<String, List<NavigationParticipant.NavigationTarget>> myPossibleNodes = new LinkedHashMap<String, List<NavigationParticipant.NavigationTarget>>(); private final Project myProject; /*package*/ ChooseFromStubsByNameModel(final Project mpsProject) { myProject = mpsProject; mpsProject.getModelAccess().runReadAction(new Runnable() { public void run() { Iterable<SModel> mds = mpsProject.getProjectModels(); Iterable<SModel> stubModels = Sequence.fromIterable(mds).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return SModelStereotype.isStubModelStereotype(SModelStereotype.getStereotype(it)); } }); Iterable<NavigationParticipant.NavigationTarget> descr = GotoNavigationUtil.getNavigationTargets(NavigationParticipant.TargetKind.ROOT, new ModelsScope(stubModels), new EmptyProgressMonitor()); for (NavigationParticipant.NavigationTarget descriptor : descr) { String name = getName(descriptor); List<NavigationParticipant.NavigationTarget> descriptorList = myPossibleNodes.get(name); if (descriptorList == null) { descriptorList = new ArrayList<NavigationParticipant.NavigationTarget>(4); myPossibleNodes.put(name, descriptorList); } descriptorList.add(descriptor); } } }); } protected abstract boolean isValid(SNode node); private boolean isValidClassifier(final NavigationParticipant.NavigationTarget descriptor) { return new ModelAccessHelper(myProject.getModelAccess()).runReadAction(new Computable<Boolean>() { public Boolean compute() { SNode classifier = descriptor.getNodeReference().resolve(myProject.getRepository()); return (classifier != null) && isValid(classifier); } }); } private String getName(NavigationParticipant.NavigationTarget descriptor) { return descriptor.getPresentation(); } private String getNamespace(NavigationParticipant.NavigationTarget descriptor) { SModelReference modelReference = descriptor.getNodeReference().getModelReference(); if (modelReference != null) { return modelReference.getName().getLongName(); } return null; } @Override public String getPromptText() { return null; } @Override public String getNotInMessage() { return null; } @Override public String getNotFoundMessage() { return null; } @Override public String getCheckBoxName() { return null; } @Override public char getCheckBoxMnemonic() { return (char) 0; } @Override public boolean loadInitialCheckBoxState() { return false; } @Override public void saveInitialCheckBoxState(boolean state) { } @Override public ListCellRenderer getListCellRenderer() { ListCellRendererWrapper wrapper = new ListCellRendererWrapper<Object>() { @Override public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) { if (value != null && value instanceof NavigationParticipant.NavigationTarget) { String fullName = getFullName(value); if (fullName != null) { setText(fullName); } } } }; return wrapper; } @Override public String[] getNames(boolean checkBoxState) { return myPossibleNodes.keySet().toArray(new String[myPossibleNodes.size()]); } @Override public Object[] getElementsByName(String name, boolean checkBoxState, String pattern) { List<NavigationParticipant.NavigationTarget> descriptors = new ArrayList<NavigationParticipant.NavigationTarget>(); for (NavigationParticipant.NavigationTarget descriptor : myPossibleNodes.get(name)) { String descriptorName = getElementName(descriptor); if (descriptorName != null && descriptorName.equals(name) && isValidClassifier(descriptor)) { descriptors.add(descriptor); } } return descriptors.toArray(new NavigationParticipant.NavigationTarget[descriptors.size()]); } @Override public String getElementName(Object element) { return getName((NavigationParticipant.NavigationTarget) element); } @NotNull @Override public String[] getSeparators() { return new String[]{"."}; } @Override public String getFullName(Object element) { NavigationParticipant.NavigationTarget navTarget = (NavigationParticipant.NavigationTarget) element; String name = getName(navTarget); String namespace = getNamespace(navTarget); if (namespace == null) { return name; } return namespace + "." + name; } @Override public String getHelpId() { return null; } @Override public boolean useMiddleMatching() { return true; } }