Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDani Megert2002-09-03 09:12:14 +0000
committerDani Megert2002-09-03 09:12:14 +0000
commitdeb5b8d76b163ff1692e41b5a01fab918666063a (patch)
treec978e61368ad11b0aa05830c550b1ce2adf2b040 /org.eclipse.search
parent62bf04654f8b009d4d5ac47e55b2e0541015ffdb (diff)
downloadeclipse.platform.text-deb5b8d76b163ff1692e41b5a01fab918666063a.tar.gz
eclipse.platform.text-deb5b8d76b163ff1692e41b5a01fab918666063a.tar.xz
eclipse.platform.text-deb5b8d76b163ff1692e41b5a01fab918666063a.zip
Added feature 4263: Error ticks should also cover search resultsv20020903
Diffstat (limited to 'org.eclipse.search')
-rw-r--r--org.eclipse.search/search/org/eclipse/search/internal/ui/ResourceToItemsMapper.java161
-rw-r--r--org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java61
2 files changed, 222 insertions, 0 deletions
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/ResourceToItemsMapper.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/ResourceToItemsMapper.java
new file mode 100644
index 00000000000..d8911296b90
--- /dev/null
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/ResourceToItemsMapper.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2002 International Business Machines Corp. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.search.internal.ui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Stack;
+
+import org.eclipse.core.resources.IResource;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Item;
+
+import org.eclipse.jface.viewers.ContentViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+
+import org.eclipse.search.ui.ISearchResultViewEntry;
+
+/**
+ * Helper class for updating error markers and other decorators that work on resources.
+ * Items are mapped to their element's underlying resource.
+ * Method <code>resourceChanged</code> updates all items that are affected from the changed
+ * elements.
+ */
+class ResourceToItemsMapper {
+
+ private static final int NUMBER_LIST_REUSE= 10;
+
+ // map from resource to item
+ private HashMap fResourceToItem;
+ private Stack fReuseLists;
+
+ private ContentViewer fContentViewer;
+
+ public ResourceToItemsMapper(ContentViewer viewer) {
+ fResourceToItem= new HashMap();
+ fReuseLists= new Stack();
+
+ fContentViewer= viewer;
+ }
+
+ /**
+ * Must be called from the UI thread.
+ */
+ public void resourceChanged(IResource changedResource) {
+ Object obj= fResourceToItem.get(changedResource);
+ if (obj == null) {
+ // not mapped
+ } else if (obj instanceof Item) {
+ updateItem((Item) obj);
+ } else { // List of Items
+ List list= (List) obj;
+ for (int k= 0; k < list.size(); k++) {
+ updateItem((Item) list.get(k));
+ }
+ }
+ }
+
+ private void updateItem(Item item) {
+ if (!item.isDisposed()) { // defensive code
+ ILabelProvider lprovider= (ILabelProvider) fContentViewer.getLabelProvider();
+
+ Object data= item.getData();
+ Image oldImage= item.getImage();
+ Image image= lprovider.getImage(data);
+ if (image != null && !image.equals(oldImage)) {
+ item.setImage(image);
+ }
+ String oldText= item.getText();
+ String text= lprovider.getText(data);
+ if (text != null && !text.equals(oldText)) {
+ item.setText(text);
+ }
+ }
+ }
+
+ /**
+ * Adds a new item to the map.
+ * @param element Element to map
+ * @param item The item used for the element
+ */
+ public void addToMap(Object element, Item item) {
+ IResource resource= ((ISearchResultViewEntry)element).getResource();
+ if (resource != null) {
+ Object existingMapping= fResourceToItem.get(resource);
+ if (existingMapping == null) {
+ fResourceToItem.put(resource, item);
+ } else if (existingMapping instanceof Item) {
+ if (existingMapping != item) {
+ List list= getNewList();
+ list.add(existingMapping);
+ list.add(item);
+ fResourceToItem.put(resource, list);
+ }
+ } else { // List
+ List list= (List) existingMapping;
+ if (!list.contains(item)) {
+ list.add(item);
+ }
+ }
+ }
+ }
+
+ /**
+ * Removes an element from the map.
+ */
+ public void removeFromMap(Object element, Item item) {
+ IResource resource= ((ISearchResultViewEntry)element).getResource();
+ if (resource != null) {
+ Object existingMapping= fResourceToItem.get(resource);
+ if (existingMapping == null) {
+ return;
+ } else if (existingMapping instanceof Item) {
+ fResourceToItem.remove(resource);
+ } else { // List
+ List list= (List) existingMapping;
+ list.remove(item);
+ if (list.isEmpty()) {
+ fResourceToItem.remove(list);
+ releaseList(list);
+ }
+ }
+ }
+ }
+
+ private List getNewList() {
+ if (!fReuseLists.isEmpty()) {
+ return (List) fReuseLists.pop();
+ }
+ return new ArrayList(2);
+ }
+
+ private void releaseList(List list) {
+ if (fReuseLists.size() < NUMBER_LIST_REUSE) {
+ fReuseLists.push(list);
+ }
+ }
+
+ /**
+ * Clears the map.
+ */
+ public void clearMap() {
+ fResourceToItem.clear();
+ }
+
+ /**
+ * Clears the map.
+ */
+ public boolean isEmpty() {
+ return fResourceToItem.isEmpty();
+ }
+}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java
index ef89b8a8bc9..38d70b99f4a 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java
@@ -5,7 +5,10 @@
package org.eclipse.search.internal.ui;
+import java.util.ArrayList;
+
import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.SWT;
@@ -14,6 +17,7 @@ import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
@@ -27,12 +31,14 @@ import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.Assert;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
@@ -83,8 +89,12 @@ public class SearchResultViewer extends TableViewer {
private IActionGroupFactory fActionGroupFactory;
private IAction fGotoMarkerAction;
+ private ResourceToItemsMapper fResourceToItemsMapper;
+
public SearchResultViewer(SearchResultView outerPart, Composite parent) {
super(new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
+
+ fResourceToItemsMapper= new ResourceToItemsMapper(this);
fOuterPart= outerPart;
Assert.isNotNull(fOuterPart);
@@ -614,4 +624,55 @@ public class SearchResultViewer extends TableViewer {
void saveState(IMemento memento) {
fSortDropDownAction.saveState(memento);
}
+
+ /*
+ * @see ContentViewer#handleLabelProviderChanged(LabelProviderChangedEvent)
+ */
+ protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
+ Object[] changed= event.getElements();
+ if (changed != null && !fResourceToItemsMapper.isEmpty()) {
+ ArrayList others= new ArrayList(changed.length);
+ for (int i= 0; i < changed.length; i++) {
+ Object curr= changed[i];
+ if (curr instanceof IResource) {
+ fResourceToItemsMapper.resourceChanged((IResource) curr);
+ } else {
+ others.add(curr);
+ }
+ }
+ if (others.isEmpty()) {
+ return;
+ }
+ event= new LabelProviderChangedEvent((IBaseLabelProvider) event.getSource(), others.toArray());
+ }
+ super.handleLabelProviderChanged(event);
+ }
+
+ /*
+ * @see StructuredViewer#mapElement(Object, Widget)
+ */
+ protected void mapElement(Object element, Widget item) {
+ super.mapElement(element, item);
+ if (item instanceof Item) {
+ fResourceToItemsMapper.addToMap(element, (Item)item);
+ }
+ }
+
+ /*
+ * @see StructuredViewer#unmapElement(Object, Widget)
+ */
+ protected void unmapElement(Object element, Widget item) {
+ if (item instanceof Item) {
+ fResourceToItemsMapper.removeFromMap(element, (Item)item);
+ }
+ super.unmapElement(element, item);
+ }
+
+ /*
+ * @see StructuredViewer#unmapAllElements()
+ */
+ protected void unmapAllElements() {
+ fResourceToItemsMapper.clearMap();
+ super.unmapAllElements();
+ }
}

Back to the top