/* * Copyright 2010-2015 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.kotlin.idea.findUsages.dialogs; import com.intellij.find.FindBundle; import com.intellij.find.findUsages.FindClassUsagesDialog; import com.intellij.find.findUsages.FindUsagesHandler; import com.intellij.find.findUsages.FindUsagesOptions; import com.intellij.find.findUsages.JavaClassFindUsagesOptions; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiModifier; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.StateRestoringCheckBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.asJava.LightClassUtilsKt; import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions; import org.jetbrains.kotlin.idea.refactoring.RenderingUtilsKt; import org.jetbrains.kotlin.psi.KtClass; import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt; import javax.swing.*; import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass; public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog { private StateRestoringCheckBox constructorUsages; private StateRestoringCheckBox derivedClasses; private StateRestoringCheckBox derivedTraits; public KotlinFindClassUsagesDialog( KtClassOrObject classOrObject, Project project, FindUsagesOptions findUsagesOptions, boolean toShowInNewTab, boolean mustOpenInNewTab, boolean isSingleFile, FindUsagesHandler handler ) { super(getRepresentingPsiClass(classOrObject), project, findUsagesOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, handler); } private static final Key<KtClassOrObject> ORIGINAL_CLASS = Key.create("ORIGINAL_CLASS"); @NotNull private static PsiClass getRepresentingPsiClass(@NotNull KtClassOrObject classOrObject) { PsiClass lightClass = toLightClass(classOrObject); if (lightClass != null) return lightClass; // TODO: Remove this code when light classes are generated for builtins PsiElementFactory factory = PsiElementFactory.SERVICE.getInstance(classOrObject.getProject()); String name = classOrObject.getName(); if (name == null || name.isEmpty()) { name = "Anonymous"; } PsiClass javaClass; if (classOrObject instanceof KtClass) { KtClass klass = (KtClass) classOrObject; javaClass = !klass.isInterface() ? factory.createClass(name) : klass.isAnnotation() ? factory.createAnnotationType(name) : factory.createInterface(name); } else { javaClass = factory.createClass(name); } //noinspection ConstantConditions javaClass.getModifierList().setModifierProperty( PsiModifier.FINAL, !(classOrObject instanceof KtClass && KtPsiUtilKt.isInheritable((KtClass) classOrObject)) ); javaClass.putUserData(ORIGINAL_CLASS, classOrObject); return javaClass; } @Override protected JPanel createFindWhatPanel() { JPanel findWhatPanel = super.createFindWhatPanel(); assert findWhatPanel != null; Utils.renameCheckbox( findWhatPanel, FindBundle.message("find.what.methods.usages.checkbox"), KotlinBundle.message("find.what.functions.usages.checkbox") ); Utils.renameCheckbox( findWhatPanel, FindBundle.message("find.what.fields.usages.checkbox"), KotlinBundle.message("find.what.properties.usages.checkbox") ); Utils.removeCheckbox(findWhatPanel, FindBundle.message("find.what.implementing.classes.checkbox")); Utils.removeCheckbox(findWhatPanel, FindBundle.message("find.what.derived.interfaces.checkbox")); Utils.removeCheckbox(findWhatPanel, FindBundle.message("find.what.derived.classes.checkbox")); derivedClasses = addCheckboxToPanel( KotlinBundle.message("find.what.derived.classes.checkbox"), getFindUsagesOptions().isDerivedClasses, findWhatPanel, true ); derivedTraits = addCheckboxToPanel( KotlinBundle.message("find.what.derived.interfaces.checkbox"), getFindUsagesOptions().isDerivedInterfaces, findWhatPanel, true ); constructorUsages = addCheckboxToPanel( KotlinBundle.message("find.what.constructor.usages.checkbox"), getFindUsagesOptions().getSearchConstructorUsages(), findWhatPanel, true ); return findWhatPanel; } @NotNull @Override protected KotlinClassFindUsagesOptions getFindUsagesOptions() { return (KotlinClassFindUsagesOptions) super.getFindUsagesOptions(); } @Override public void configureLabelComponent(@NotNull SimpleColoredComponent coloredComponent) { PsiElement klass = LightClassUtilsKt.getUnwrapped(getPsiElement()); //noinspection ConstantConditions KtClassOrObject originalClass = klass instanceof KtClassOrObject ? (KtClassOrObject) klass : klass.getUserData(ORIGINAL_CLASS); if (originalClass != null) { coloredComponent.append(RenderingUtilsKt.formatClass(originalClass)); } } @Override protected void update() { super.update(); if (!isOKActionEnabled() && (constructorUsages.isSelected() || derivedTraits.isSelected() || derivedClasses.isSelected())) { setOKActionEnabled(true); } } @Override public void calcFindUsagesOptions(JavaClassFindUsagesOptions options) { super.calcFindUsagesOptions(options); KotlinClassFindUsagesOptions kotlinOptions = (KotlinClassFindUsagesOptions) options; kotlinOptions.setSearchConstructorUsages(constructorUsages.isSelected()); kotlinOptions.isDerivedClasses = derivedClasses.isSelected(); kotlinOptions.isDerivedInterfaces = derivedTraits.isSelected(); } }