]>
Commit | Line | Data |
---|---|---|
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 | *******************************************************************************/ | |
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 | } |