| /* |
| * Copyright 2000-2013 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 org.jetbrains.android.uipreview; |
| |
| import com.intellij.ide.util.DefaultPsiElementCellRenderer; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.ui.DialogWrapper; |
| import com.intellij.psi.JavaPsiFacade; |
| import com.intellij.psi.PsiClass; |
| import com.intellij.psi.search.GlobalSearchScope; |
| import com.intellij.psi.search.searches.ClassInheritorsSearch; |
| import com.intellij.ui.DoubleClickListener; |
| import com.intellij.ui.ListSpeedSearch; |
| import com.intellij.ui.ScrollPaneFactory; |
| import com.intellij.ui.components.JBList; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import javax.swing.event.ListSelectionEvent; |
| import javax.swing.event.ListSelectionListener; |
| import java.awt.*; |
| import java.awt.event.MouseEvent; |
| import java.util.Collection; |
| import java.util.Collections; |
| |
| /** |
| * @author Alexander Lobas |
| */ |
| public class ChooseClassDialog extends DialogWrapper implements ListSelectionListener { |
| private final JList myList = new JBList(); |
| private final JScrollPane myComponent = ScrollPaneFactory.createScrollPane(myList); |
| private String myResultClassName; |
| |
| public ChooseClassDialog(Module module, String title, boolean includeAll, String... classes) { |
| super(module.getProject()); |
| |
| new DoubleClickListener() { |
| @Override |
| protected boolean onDoubleClick(MouseEvent e) { |
| if (myList.getSelectedValue() != null) { |
| close(OK_EXIT_CODE); |
| return true; |
| } |
| return false; |
| } |
| }.installOn(myList); |
| |
| DefaultListModel model = new DefaultListModel(); |
| findClasses(module, includeAll, model, classes); |
| myList.setModel(model); |
| myList.setCellRenderer(new DefaultPsiElementCellRenderer()); |
| |
| ListSelectionModel selectionModel = myList.getSelectionModel(); |
| selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
| selectionModel.addListSelectionListener(this); |
| |
| new ListSpeedSearch(myList) { |
| @Override |
| protected boolean isMatchingElement(Object element, String pattern) { |
| PsiClass psiClass = (PsiClass)element; |
| return compare(psiClass.getName(), pattern) || compare(psiClass.getQualifiedName(), pattern); |
| } |
| }; |
| |
| setTitle(title); |
| setOKActionEnabled(false); |
| |
| init(); |
| |
| Dimension size = myComponent.getPreferredSize(); |
| size.height = myList.getPreferredSize().height + 20; |
| myComponent.setPreferredSize(size); |
| } |
| |
| protected void findClasses(Module module, boolean includeAll, DefaultListModel model, String[] classes) { |
| for (String className : classes) { |
| for (PsiClass psiClass : findInheritors(module, className, includeAll)) { |
| model.addElement(psiClass); |
| } |
| } |
| } |
| |
| public static Collection<PsiClass> findInheritors(Module module, String name, boolean includeAll) { |
| PsiClass base = findClass(module, name); |
| if (base != null) { |
| GlobalSearchScope scope = includeAll ? |
| GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, false) : |
| GlobalSearchScope.moduleScope(module); |
| return ClassInheritorsSearch.search(base, scope, true).findAll(); |
| } |
| return Collections.emptyList(); |
| } |
| |
| @Nullable |
| public static PsiClass findClass(Module module, @Nullable String name) { |
| if (name == null) { |
| return null; |
| } |
| Project project = module.getProject(); |
| return JavaPsiFacade.getInstance(project).findClass(name, GlobalSearchScope.allScope(project)); |
| } |
| |
| @Override |
| public JComponent getPreferredFocusedComponent() { |
| return myList; |
| } |
| |
| @Override |
| protected JComponent createCenterPanel() { |
| return myComponent; |
| } |
| |
| public String getClassName() { |
| return myResultClassName; |
| } |
| |
| @Override |
| public void valueChanged(ListSelectionEvent e) { |
| PsiClass psiClass = (PsiClass)myList.getSelectedValue(); |
| setOKActionEnabled(psiClass != null); |
| myResultClassName = psiClass == null ? null : psiClass.getQualifiedName(); |
| } |
| } |