]> git.uio.no Git - ifi-stolz-refaktor.git/blame - case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/search/SearchResultUpdater.java
Some talks, mostly identical.
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui / org / eclipse / jdt / internal / ui / search / SearchResultUpdater.java
CommitLineData
1b2798f6
EK
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 *******************************************************************************/
11package org.eclipse.jdt.internal.ui.search;
12
13import java.util.HashSet;
14import java.util.Iterator;
15import java.util.Set;
16
17import org.eclipse.core.runtime.IAdaptable;
18
19import org.eclipse.core.resources.IResource;
20import org.eclipse.core.resources.IResourceDelta;
21
22import org.eclipse.search.ui.IQueryListener;
23import org.eclipse.search.ui.ISearchQuery;
24import org.eclipse.search.ui.NewSearchUI;
25
26import org.eclipse.jdt.core.ElementChangedEvent;
27import org.eclipse.jdt.core.IElementChangedListener;
28import org.eclipse.jdt.core.IJavaElement;
29import org.eclipse.jdt.core.IJavaElementDelta;
30import org.eclipse.jdt.core.JavaCore;
31
32public 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}