spring patterns: hibernate + datasource
[fedora-idea.git] / codeInsight / impl / com / intellij / codeInsight / template / macro / DescendantClassesEnumMacro.java
bloba08d2e69bd944f26987c5f7f21c7350d14b07ed6
1 package com.intellij.codeInsight.template.macro;
3 import com.intellij.codeInsight.CodeInsightBundle;
4 import com.intellij.codeInsight.lookup.LookupItem;
5 import com.intellij.codeInsight.lookup.LookupItemUtil;
6 import com.intellij.codeInsight.template.*;
7 import com.intellij.psi.PsiClass;
8 import com.intellij.psi.PsiManager;
9 import com.intellij.psi.PsiModifier;
10 import com.intellij.psi.PsiModifierList;
11 import com.intellij.psi.search.GlobalSearchScope;
12 import com.intellij.psi.search.PsiElementProcessor;
13 import com.intellij.psi.search.PsiSearchHelper;
15 import java.util.ArrayList;
16 import java.util.LinkedHashSet;
17 import java.util.List;
18 import java.util.Set;
20 public class DescendantClassesEnumMacro implements Macro {
21 public String getName() {
22 return "descendantClassesEnum";
25 public String getDescription() {
26 return CodeInsightBundle.message("macro.descendant.classes.enum");
29 public String getDefaultValue() {
30 return "";
33 public Result calculateResult(Expression[] params, ExpressionContext context) {
34 final List<PsiClass> classes = findDescendants(context, params);
35 if (classes == null || classes.size() == 0) return null;
36 Result[] results = calculateResults(classes);
38 return results[0];
41 private static Result[] calculateResults(final List<PsiClass> classes) {
42 Result[] results = new Result[classes.size()];
43 int i = 0;
45 for (final PsiClass aClass : classes) {
46 results[i++] = new PsiElementResult(aClass);
48 return results;
51 private static List<PsiClass> findDescendants(ExpressionContext context, Expression[] params) {
52 if (params == null || params.length == 0) return null;
53 PsiManager instance = PsiManager.getInstance(context.getProject());
55 final String paramResult = params[0].calculateResult(context).toString();
56 if (paramResult == null) return null;
58 final boolean isAllowAbstract = isAllowAbstract(context, params);
59 final PsiClass myBaseClass = instance.findClass(paramResult, GlobalSearchScope.allScope(context.getProject()));
61 if (myBaseClass != null) {
62 PsiSearchHelper helper = instance.getSearchHelper();
64 final List<PsiClass> classes = new ArrayList<PsiClass>();
66 helper.processInheritors(new PsiElementProcessor<PsiClass>() {
67 public boolean execute(PsiClass element) {
68 if (isAllowAbstract || !isAbstractOrInterface(element)) {
69 classes.add(element);
71 return true;
74 }, myBaseClass, myBaseClass.getUseScope(), true);
76 return classes;
79 return null;
82 public Result calculateQuickResult(Expression[] params, ExpressionContext context) {
83 final List<PsiClass> classes = findDescendants(context, params);
84 if (classes == null || classes.size() == 0) return null;
85 Result[] results = calculateResults(classes);
87 return results[0];
90 public LookupItem[] calculateLookupItems(Expression[] params, ExpressionContext context) {
91 final List<PsiClass> classes = findDescendants(context, params);
92 if (classes == null || classes.size() == 0) return null;
94 Set<LookupItem> set = new LinkedHashSet<LookupItem>();
95 boolean isShortName = params.length > 1 && !Boolean.valueOf(params[1].calculateResult(context).toString());
97 for (PsiClass object : classes) {
98 final String name = isShortName ? object.getName() : object.getQualifiedName();
99 if (name != null && name.length() > 0) LookupItemUtil.addLookupItem(set, name, "");
102 return set.toArray(new LookupItem[set.size()]);
105 private static boolean isAbstractOrInterface(final PsiClass psiClass) {
106 final PsiModifierList modifierList = psiClass.getModifierList();
108 return psiClass.isInterface() || (modifierList != null && modifierList.hasModifierProperty(PsiModifier.ABSTRACT));
111 private static boolean isAllowAbstract(final ExpressionContext context, final Expression[] params) {
112 return params.length > 2 ? Boolean.valueOf(params[2].calculateResult(context).toString()) : true;