comment added
[fedora-idea.git] / refactoring / impl / com / intellij / refactoring / util / classMembers / UsesMemberDependencyGraph.java
blob1b43d7d17a3819aa9f72345dcf21f2c873f8112b
1 /*
2 * Created by IntelliJ IDEA.
3 * User: dsl
4 * Date: 08.07.2002
5 * Time: 18:22:48
6 * To change template for new class use
7 * Code Style | Class Templates options (Tools | IDE Options).
8 */
9 package com.intellij.refactoring.util.classMembers;
11 import com.intellij.openapi.diagnostic.Logger;
12 import com.intellij.openapi.util.text.StringUtil;
13 import com.intellij.psi.PsiClass;
14 import com.intellij.psi.PsiMember;
15 import com.intellij.refactoring.RefactoringBundle;
16 import com.intellij.util.containers.HashMap;
18 import java.util.ArrayList;
19 import java.util.HashSet;
20 import java.util.Set;
22 public class UsesMemberDependencyGraph implements MemberDependencyGraph {
23 private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.util.classMembers.UsesMemberDependencyGraph");
24 protected HashSet<PsiMember> mySelectedNormal;
25 protected HashSet<PsiMember> mySelectedAbstract;
26 protected HashSet<PsiMember> myDependencies = null;
27 protected HashMap<PsiMember,HashSet<PsiMember>> myDependenciesToDependentMap = null;
28 private final boolean myRecursive;
29 private final MemberDependenciesStorage myMemberDependenciesStorage;
31 public UsesMemberDependencyGraph(PsiClass aClass, PsiClass superClass, boolean recursive) {
32 myRecursive = recursive;
33 mySelectedNormal = new HashSet<PsiMember>();
34 mySelectedAbstract = new HashSet<PsiMember>();
35 myMemberDependenciesStorage = new MemberDependenciesStorage(aClass, superClass);
39 public Set<? extends PsiMember> getDependent() {
40 if (myDependencies == null) {
41 myDependencies = new HashSet<PsiMember>();
42 myDependenciesToDependentMap = new HashMap<PsiMember, HashSet<PsiMember>>();
43 buildDeps(null, mySelectedNormal);
45 return myDependencies;
48 public Set<? extends PsiMember> getDependenciesOf(PsiMember member) {
49 final Set dependent = getDependent();
50 if(!dependent.contains(member)) return null;
51 return myDependenciesToDependentMap.get(member);
54 public String getElementTooltip(PsiMember element) {
55 final Set<? extends PsiMember> dependencies = getDependenciesOf(element);
56 if(dependencies == null || dependencies.size() == 0) return null;
58 ArrayList<String> strings = new ArrayList<String>();
59 for (PsiMember dep : dependencies) {
60 strings.add(dep.getName());
63 if(strings.isEmpty()) return null;
64 return RefactoringBundle.message("used.by.0", StringUtil.join(strings, ", "));
68 private void buildDeps(PsiMember sourceElement, Set<PsiMember> members) {
69 if (myRecursive) {
70 buildDepsRecursively(sourceElement, members);
72 else {
73 for (final PsiMember member : members) {
74 for (final PsiMember dependency : myMemberDependenciesStorage.getMemberDependencies(member)) {
75 addDependency(dependency, member);
81 private void buildDepsRecursively(final PsiMember sourceElement, final Set<PsiMember> members) {
82 for (PsiMember member : members) {
83 if (!myDependencies.contains(member)) {
84 addDependency(member, sourceElement);
85 if (!mySelectedAbstract.contains(member)) {
86 buildDepsRecursively(member, myMemberDependenciesStorage.getMemberDependencies(member));
92 private void addDependency(final PsiMember member, final PsiMember sourceElement) {
93 if (LOG.isDebugEnabled()) {
94 LOG.debug(member.toString());
96 myDependencies.add(member);
97 if (sourceElement != null) {
98 HashSet<PsiMember> relations = myDependenciesToDependentMap.get(member);
99 if (relations == null) {
100 relations = new HashSet<PsiMember>();
101 myDependenciesToDependentMap.put(member, relations);
103 relations.add(sourceElement);
107 public void memberChanged(MemberInfo memberInfo) {
108 if (ClassMembersUtil.isProperMember(memberInfo)) {
109 myDependencies = null;
110 myDependenciesToDependentMap = null;
111 PsiMember member = memberInfo.getMember();
112 if (!memberInfo.isChecked()) {
113 mySelectedNormal.remove(member);
114 mySelectedAbstract.remove(member);
115 } else {
116 if (memberInfo.isToAbstract()) {
117 mySelectedNormal.remove(member);
118 mySelectedAbstract.add(member);
119 } else {
120 mySelectedNormal.add(member);
121 mySelectedAbstract.remove(member);