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
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.search;
13 import java.util.HashSet;
14 import java.util.Iterator;
17 import org.eclipse.core.runtime.IAdaptable;
19 import org.eclipse.core.resources.IResource;
20 import org.eclipse.core.resources.IResourceDelta;
22 import org.eclipse.search.ui.IQueryListener;
23 import org.eclipse.search.ui.ISearchQuery;
24 import org.eclipse.search.ui.NewSearchUI;
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;
32 public class SearchResultUpdater implements IElementChangedListener, IQueryListener {
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;
40 public SearchResultUpdater(JavaSearchResult result) {
42 NewSearchUI.addQueryListener(this);
43 JavaCore.addElementChangedListener(this);
44 // TODO make this work with resources
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));
60 private void handleRemoved(Set<IAdaptable> removedElements) {
61 fResult.generated_7618141346032928123(this, removedElements);
64 boolean isContainedInRemoved(Set<IAdaptable> removedElements, Object object) {
65 for (Iterator<IAdaptable> elements= removedElements.iterator(); elements.hasNext();) {
66 if (isParentOf(elements.next(), object))
72 private boolean isParentOf(Object ancestor, Object descendant) {
73 while (descendant != null && !ancestor.equals(descendant))
74 descendant= getParent(descendant);
75 return descendant != null;
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();
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());
94 IJavaElementDelta[] childDeltas= delta.getAffectedChildren();
95 for (int i= 0; i < childDeltas.length; i++) {
96 collectRemoved(potentiallyRemovedSet, removedElements, childDeltas[i]);
100 IResourceDelta[] resourceDeltas= delta.getResourceDeltas();
101 if (resourceDeltas != null) {
102 for (int i= 0; i < resourceDeltas.length; i++) {
103 collectRemovals(removedElements, resourceDeltas[i]);
108 public void queryAdded(ISearchQuery query) {
112 public void queryRemoved(ISearchQuery query) {
113 if (fResult.equals(query.getSearchResult())) {
114 JavaCore.removeElementChangedListener(this);
115 NewSearchUI.removeQueryListener(this);
119 private void collectRemovals(Set<IAdaptable> removals, IResourceDelta delta) {
120 if (delta.getKind() == IResourceDelta.REMOVED)
121 removals.add(delta.getResource());
123 IResourceDelta[] children= delta.getAffectedChildren();
124 for (int i= 0; i < children.length; i++) {
125 collectRemovals(removals, children[i]);
130 public void queryStarting(ISearchQuery query) {
134 public void queryFinished(ISearchQuery query) {