### Eclipse Workspace Patch 1.0 #P org.eclipse.ui.ide Index: extensions/org/eclipse/ui/dialogs/FilteredResourcesSelectionDialog.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/FilteredResourcesSelectionDialog.java,v retrieving revision 1.19 diff -u -r1.19 FilteredResourcesSelectionDialog.java --- extensions/org/eclipse/ui/dialogs/FilteredResourcesSelectionDialog.java 8 May 2008 21:15:22 -0000 1.19 +++ extensions/org/eclipse/ui/dialogs/FilteredResourcesSelectionDialog.java 13 Feb 2009 14:53:44 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation 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 @@ -18,24 +18,36 @@ import java.util.Comparator; import java.util.List; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceProxy; -import org.eclipse.core.resources.IResourceProxyVisitor; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.ResourcesPlugin; +import com.ibm.icu.text.Collator; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.TextStyle; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; + import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.Status; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceProxy; +import org.eclipse.core.resources.IResourceProxyVisitor; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; + import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ILabelProviderListener; @@ -46,10 +58,10 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; +import org.eclipse.jface.viewers.StyledString.Styler; + +import org.eclipse.jface.text.ITextSelection; + import org.eclipse.ui.IMemento; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; @@ -68,8 +80,6 @@ import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.statushandlers.StatusManager; -import com.ibm.icu.text.Collator; - /** * Shows a list of resources to the user with a text entry field for a string * pattern used to filter the list of resources. @@ -103,6 +113,8 @@ private boolean isDerived; + private SearchPattern searchPattern; + /** * Creates a new instance of the class * @@ -377,7 +389,9 @@ * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createFilter() */ protected ItemsFilter createFilter() { - return new ResourceFilter(container, isDerived, typeMask); + ItemsFilter filter= new ResourceFilter(container, isDerived, typeMask); + searchPattern= filter.getPatternMatcher(); + return filter; } /* (non-Javadoc) @@ -478,12 +492,21 @@ WorkbenchLabelProvider provider = new WorkbenchLabelProvider(); + private Font fBoldFont; + + private Styler boldStyler; + + private Styler boldQualifierStyler; + + /** * Creates a new instance of the class */ public ResourceItemLabelProvider() { super(); provider.addListener(this); + boldStyler= createBoldStyler(); + boldQualifierStyler= createBoldQualifierStyler(); } /* @@ -533,16 +556,64 @@ IResource res = (IResource) element; + String name= res.getName(); StyledString str = new StyledString(res.getName()); + markMatchingRegions(str, 0, searchPattern.getMatchingRegions(name), boldStyler); // extra info for duplicates if (isDuplicateElement(element)) { str.append(" - ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$ - str.append(res.getParent().getFullPath().makeRelative().toString(), StyledString.QUALIFIER_STYLER); + final String fullPath= res.getParent().getFullPath().makeRelative().toString(); + int index= str.length(); + str.append(fullPath, StyledString.QUALIFIER_STYLER); + markMatchingRegions(str, index, searchPattern.getMatchingRegions(fullPath), boldQualifierStyler); } return str; } + private void markMatchingRegions(StyledString string, int index, int[] matchingRegions, Styler styler) { + if (matchingRegions != null) { + for (int i= 0; i + 1 < matchingRegions.length; i= i + 2) + string.setStyle(index + matchingRegions[i], matchingRegions[i + 1], styler); + } + } + + private Styler createBoldStyler() { + return new Styler() { + public void applyStyles(TextStyle textStyle) { + textStyle.font= getBoldFont(); + } + }; + } + + private Styler createBoldQualifierStyler() { + return new Styler() { + public void applyStyles(TextStyle textStyle) { + StyledString.QUALIFIER_STYLER.applyStyles(textStyle); + textStyle.font= getBoldFont(); + } + }; + } + + + /** + * Create the bold variant of the currently used font. + * + * @return the bold font + * @since 3.5 + */ + private Font getBoldFont() { + if (fBoldFont == null) { + Font font= getDialogArea().getFont(); + FontData[] data= font.getFontData(); + for (int i= 0; i < data.length; i++) { + data[i].setStyle(SWT.BOLD); + } + fBoldFont= new Font(font.getDevice(), data); + } + return fBoldFont; + } + /* * (non-Javadoc) * #P org.eclipse.ui.workbench Index: Eclipse UI/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java,v retrieving revision 1.72 diff -u -r1.72 FilteredItemsSelectionDialog.java --- Eclipse UI/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java 13 Feb 2009 07:25:02 -0000 1.72 +++ Eclipse UI/org/eclipse/ui/dialogs/FilteredItemsSelectionDialog.java 13 Feb 2009 14:53:47 -0000 @@ -28,6 +28,43 @@ import java.util.List; import java.util.Set; +import org.eclipse.osgi.util.NLS; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.accessibility.AccessibleAdapter; +import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.custom.ViewForm; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.TraverseEvent; +import org.eclipse.swt.events.TraverseListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.IHandler; @@ -74,41 +111,7 @@ import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.accessibility.AccessibleAdapter; -import org.eclipse.swt.accessibility.AccessibleEvent; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.custom.ViewForm; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; + import org.eclipse.ui.ActiveShellExpression; import org.eclipse.ui.IMemento; import org.eclipse.ui.IWorkbenchPreferenceConstants; @@ -2543,6 +2546,16 @@ */ public abstract boolean isConsistentItem(Object item); + /** + * Returns the search pattern patcher. + * + * @return the search pattern matcher + * @since 3.5 + */ + public SearchPattern getPatternMatcher() { + return patternMatcher; + } + } /** Index: Eclipse UI/org/eclipse/ui/dialogs/SearchPattern.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/dialogs/SearchPattern.java,v retrieving revision 1.20 diff -u -r1.20 SearchPattern.java --- Eclipse UI/org/eclipse/ui/dialogs/SearchPattern.java 21 Oct 2008 13:16:56 -0000 1.20 +++ Eclipse UI/org/eclipse/ui/dialogs/SearchPattern.java 13 Feb 2009 14:53:47 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation 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 @@ -183,6 +183,37 @@ } } + /** + * Answers all the regions in a given name matching a given pattern using a specified match + * rule. + * + * !!! FIXME: more Javadoc needed !!! + * + * @param string the string for which to compute the match regions + * @return an array of int having two slots per returned regions (the first one is + * the region starting index and the second one is the region length or + * null if the given name does not match the given pattern). + *

+ * The returned regions may be empty (new int[0]) if the pattern is + * null (whatever the match rule is). The returned regions will also be + * empty if the pattern is only made of '?' and/or '*' + * character(s) (e.g. '*', '?*', '???', etc.) when using a pattern match + * rule. + *

+ * @since 3.5 + */ + public int[] getMatchingRegions(String string) { + + // !!! FIXME: to be implemented correctly !!! + + if (string == null || stringPattern == null) + return null; + int i= string.toLowerCase().indexOf(stringPattern.toLowerCase()); + if (i == -1) + return null; + return new int[] { i, stringPattern.length() }; + } + private void initializePatternAndMatchRule(String pattern) { int length = pattern.length(); if (length == 0) {