### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.search Index: src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.search/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java,v retrieving revision 1.2 diff -u -r1.2 RepositorySearchResultView.java --- src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java 8 Jun 2010 23:06:48 -0000 1.2 +++ src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java 10 Jul 2010 19:27:52 -0000 @@ -25,7 +25,6 @@ import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.util.LocalSelectionTransfer; -import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TableViewer; @@ -151,6 +150,8 @@ private SearchResultSortAction sortByDialogAction; + private RepositorySearchStyledLabelProvider styledLabelProvider; + private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() { public String[] getShowInTargetIds() { return SHOW_IN_TARGETS; @@ -219,9 +220,10 @@ searchResultProvider = new SearchResultTreeContentProvider(); viewer.setContentProvider(searchResultProvider); - DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(new SearchResultsLabelProvider( - searchResultProvider, viewer), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()); - viewer.setLabelProvider(labelProvider); + styledLabelProvider = new RepositorySearchStyledLabelProvider(new SearchResultsLabelProvider( + searchResultProvider, viewer), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), + null); + viewer.setLabelProvider(styledLabelProvider); viewer.setSorter(searchResultSorter); Transfer[] dragTypes = new Transfer[] { LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance() }; @@ -248,7 +250,15 @@ } FilteredTree searchTree = new EnhancedFilteredTree(treeComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, - new SubstringPatternFilter(), true); + new SubstringPatternFilter() { + + @Override + public void setPattern(String patternString) { + styledLabelProvider.setPattern(patternString); + super.setPattern(patternString); + } + + }, true); return searchTree.getViewer(); } Index: src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchStyledLabelProvider.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchStyledLabelProvider.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchStyledLabelProvider.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchStyledLabelProvider.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,228 @@ +/******************************************************************************* + * Copyright (c) 2010 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.tasks.ui.search; + +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.jface.viewers.ColumnViewer; +import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider; +import org.eclipse.jface.viewers.IDecorationContext; +import org.eclipse.jface.viewers.ILabelDecorator; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.StyledCellLabelProvider; +import org.eclipse.jface.viewers.StyledString; +import org.eclipse.jface.viewers.ViewerColumn; +import org.eclipse.search.internal.ui.text.DecoratingFileSearchLabelProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyleRange; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.IWorkbenchPreferenceConstants; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.internal.misc.StringMatcher; +import org.eclipse.ui.internal.misc.StringMatcher.Position; + +/** + * Repository search styled label provider + * + * @author Kevin Sawicki + */ +public class RepositorySearchStyledLabelProvider extends DecoratingStyledCellLabelProvider implements + IPropertyChangeListener, ILabelProvider { + + /** + * Color to use to decorate matches. Copied from {@link DecoratingFileSearchLabelProvider}. + */ + public static final String HIGHLIGHT_BG_COLOR_NAME = "org.eclipse.jdt.ui.ColoredLabels.match_highlight"; //$NON-NLS-1$ + + private static class PatternStyledLabelProvider extends StyledCellLabelProvider implements IStyledLabelProvider { + + private final ILabelProvider labelProvider; + + private StringMatcher matcher = null; + + public PatternStyledLabelProvider(ILabelProvider provider) { + this.labelProvider = provider; + } + + /** + * Set the pattern to highlight + * + * @param pattern + */ + public void setPattern(String pattern) { + if (pattern != null && pattern.length() > 0) { + this.matcher = new StringMatcher(pattern, true, false); + } else { + this.matcher = null; + } + } + + /** + * Get styled text + * + * @param element + * @return style dstring + */ + public StyledString getStyledText(Object element) { + StyledString styled = null; + String label = this.labelProvider.getText(element); + if (matcher == null || label.length() == 0) { + styled = new StyledString(label); + } else { + styled = new StyledString(); + int start = 0; + int end = 0; + int length = label.length(); + Position position = matcher.find(label, start, length); + while (position != null) { + end = position.getStart(); + styled.append(label.substring(start, end)); + start = position.getEnd(); + styled.append(label.substring(end, start), DecoratingFileSearchLabelProvider.HIGHLIGHT_STYLE); + position = matcher.find(label, start, length); + } + if (start > 0 && start < length) { + styled.append(label.substring(start)); + } + } + return styled; + } + + public Image getImage(Object element) { + return labelProvider.getImage(element); + } + + } + + private final ILabelProvider labelProvider; + + /** + * Create a new repository search styled label provider that wraps an {@link ILabelProvider} + * + * @param labelProvider + * @param decorator + * @param decorationContext + */ + public RepositorySearchStyledLabelProvider(ILabelProvider labelProvider, ILabelDecorator decorator, + IDecorationContext decorationContext) { + super(new PatternStyledLabelProvider(labelProvider), decorator, decorationContext); + this.labelProvider = labelProvider; + } + + /** + * @see org.eclipse.jface.viewers.StyledCellLabelProvider#initialize(org.eclipse.jface.viewers.ColumnViewer, + * org.eclipse.jface.viewers.ViewerColumn) + */ + @Override + public void initialize(ColumnViewer viewer, ViewerColumn column) { + PlatformUI.getPreferenceStore().addPropertyChangeListener(this); + JFaceResources.getColorRegistry().addListener(this); + + setOwnerDrawEnabled(PlatformUI.getPreferenceStore() + .getBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS)); + + super.initialize(viewer, column); + } + + /** + * Get underyling label provider + * + * @return label provider + */ + public ILabelProvider getLabelProvider() { + return this.labelProvider; + } + + /** + * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#dispose() + */ + @Override + public void dispose() { + PlatformUI.getPreferenceStore().removePropertyChangeListener(this); + JFaceResources.getColorRegistry().removeListener(this); + this.labelProvider.dispose(); + super.dispose(); + } + + /** + * Set the pattern to highlight + * + * @param pattern + */ + public void setPattern(String pattern) { + ((PatternStyledLabelProvider) getStyledStringProvider()).setPattern(pattern); + } + + /** + * Refresh the labels on viewer associated with this label provider. This method must be called on the UI-thread. + */ + protected void refresh() { + ColumnViewer viewer = getViewer(); + if (viewer != null) { + boolean coloredLabels = PlatformUI.getPreferenceStore().getBoolean( + IWorkbenchPreferenceConstants.USE_COLORED_LABELS); + if (coloredLabels || coloredLabels != isOwnerDrawEnabled()) { + setOwnerDrawEnabled(coloredLabels); + viewer.refresh(); + } + } + } + + /** + * Schedule a refresh of this label provider. This method can be called from any thread. + */ + protected void scheduleRefresh() { + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + public void run() { + refresh(); + } + }); + } + + /** + * @param event + */ + public void propertyChange(PropertyChangeEvent event) { + String property = event.getProperty(); + if (IWorkbenchPreferenceConstants.USE_COLORED_LABELS.equals(property) + || HIGHLIGHT_BG_COLOR_NAME.equals(property)) { + scheduleRefresh(); + } + } + + /** + * Get text of element from underyling label provider + * + * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) + */ + public String getText(Object element) { + return this.labelProvider.getText(element); + } + + /** + * Override preparation of style range to add border dot about highlight regions that don't have colors applied + * + * @see org.eclipse.jface.viewers.StyledCellLabelProvider#prepareStyleRange(org.eclipse.swt.custom.StyleRange, + * boolean) + */ + @Override + protected StyleRange prepareStyleRange(StyleRange styleRange, boolean applyColors) { + boolean addBorder = !applyColors && styleRange.background != null; + styleRange = super.prepareStyleRange(styleRange, applyColors); + if (addBorder) { + styleRange.borderStyle = SWT.BORDER_DOT; + } + return styleRange; + } + +}