diff options
author | Dani Megert | 2002-09-03 09:12:14 +0000 |
---|---|---|
committer | Dani Megert | 2002-09-03 09:12:14 +0000 |
commit | deb5b8d76b163ff1692e41b5a01fab918666063a (patch) | |
tree | c978e61368ad11b0aa05830c550b1ce2adf2b040 /org.eclipse.search | |
parent | 62bf04654f8b009d4d5ac47e55b2e0541015ffdb (diff) | |
download | eclipse.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.java | 161 | ||||
-rw-r--r-- | org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java | 61 |
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(); + } } |