]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/search/SearchResultUpdater.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui / org / eclipse / jdt / internal / ui / search / SearchResultUpdater.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2011 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.search;
12
13 import java.util.HashSet;
14 import java.util.Iterator;
15 import java.util.Set;
16
17 import org.eclipse.core.runtime.IAdaptable;
18
19 import org.eclipse.core.resources.IResource;
20 import org.eclipse.core.resources.IResourceDelta;
21
22 import org.eclipse.search.ui.IQueryListener;
23 import org.eclipse.search.ui.ISearchQuery;
24 import org.eclipse.search.ui.NewSearchUI;
25
26 import org.eclipse.jdt.core.ElementChangedEvent;
27 import org.eclipse.jdt.core.IElementChangedListener;
28 import org.eclipse.jdt.core.IJavaElement;
29 import org.eclipse.jdt.core.IJavaElementDelta;
30 import org.eclipse.jdt.core.JavaCore;
31
32 public class SearchResultUpdater implements IElementChangedListener, IQueryListener {
33
34         JavaSearchResult fResult;
35         private static final int REMOVED_FLAGS= IJavaElementDelta.F_MOVED_TO |
36                                                                         IJavaElementDelta.F_REMOVED_FROM_CLASSPATH |
37                                                                         IJavaElementDelta.F_CLOSED |
38                                                                         IJavaElementDelta.F_CONTENT;
39
40         public SearchResultUpdater(JavaSearchResult result) {
41                 fResult= result;
42                 NewSearchUI.addQueryListener(this);
43                 JavaCore.addElementChangedListener(this);
44                 // TODO make this work with resources
45         }
46
47         public void elementChanged(ElementChangedEvent event) {
48                 //long t0= System.currentTimeMillis();
49                 IJavaElementDelta delta= event.getDelta();
50                 Set<IAdaptable> removedElements= new HashSet<IAdaptable>();
51                 Set<IAdaptable> potentiallyRemovedElements= new HashSet<IAdaptable>();
52                 collectRemoved(potentiallyRemovedElements, removedElements, delta);
53                 if (removedElements.size() > 0)
54                         handleRemoved(removedElements);
55                 if (potentiallyRemovedElements.size() > 0)
56                         handleRemoved(potentiallyRemovedElements);
57                 //System.out.println(this+"handled delta in: "+(System.currentTimeMillis()-t0));
58         }
59
60         private void handleRemoved(Set<IAdaptable> removedElements) {
61                 fResult.generated_7618141346032928123(this, removedElements);
62         }
63
64         boolean isContainedInRemoved(Set<IAdaptable> removedElements, Object object) {
65                 for (Iterator<IAdaptable> elements= removedElements.iterator(); elements.hasNext();) {
66                         if (isParentOf(elements.next(), object))
67                                 return true;
68                 }
69                 return false;
70         }
71
72         private boolean isParentOf(Object ancestor, Object descendant) {
73                 while (descendant != null && !ancestor.equals(descendant))
74                         descendant= getParent(descendant);
75                 return descendant != null;
76         }
77
78         private Object getParent(Object object) {
79                 if (object instanceof IJavaElement)
80                         return ((IJavaElement)object).getParent();
81                 else if (object instanceof IResource)
82                         return ((IResource)object).getParent();
83                 return null;
84         }
85
86         private void collectRemoved(Set<IAdaptable> potentiallyRemovedSet, Set<IAdaptable> removedElements, IJavaElementDelta delta) {
87                 if (delta.getKind() == IJavaElementDelta.REMOVED)
88                         removedElements.add(delta.getElement());
89                 else if (delta.getKind() == IJavaElementDelta.CHANGED) {
90                         int flags= delta.getFlags();
91                         if ((flags & REMOVED_FLAGS) != 0) {
92                                 potentiallyRemovedSet.add(delta.getElement());
93                         } else {
94                                 IJavaElementDelta[] childDeltas= delta.getAffectedChildren();
95                                 for (int i= 0; i < childDeltas.length; i++) {
96                                         collectRemoved(potentiallyRemovedSet, removedElements, childDeltas[i]);
97                                 }
98                         }
99                 }
100                 IResourceDelta[] resourceDeltas= delta.getResourceDeltas();
101                 if (resourceDeltas != null) {
102                         for (int i= 0; i < resourceDeltas.length; i++) {
103                                 collectRemovals(removedElements, resourceDeltas[i]);
104                         }
105                 }
106         }
107
108         public void queryAdded(ISearchQuery query) {
109                 // don't care
110         }
111
112         public void queryRemoved(ISearchQuery query) {
113                 if (fResult.equals(query.getSearchResult())) {
114                         JavaCore.removeElementChangedListener(this);
115                         NewSearchUI.removeQueryListener(this);
116                 }
117         }
118
119         private void collectRemovals(Set<IAdaptable> removals, IResourceDelta delta) {
120                 if (delta.getKind() == IResourceDelta.REMOVED)
121                         removals.add(delta.getResource());
122                 else {
123                         IResourceDelta[] children= delta.getAffectedChildren();
124                         for (int i= 0; i < children.length; i++) {
125                                 collectRemovals(removals, children[i]);
126                         }
127                 }
128         }
129
130         public void queryStarting(ISearchQuery query) {
131                 // not interested
132         }
133
134         public void queryFinished(ISearchQuery query) {
135                 // not interested
136         }
137
138 }