Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 27979 Details for
Bug 102081
Abandon the combo box of preferenceDialog
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
apply patch to org.eclipse.ui.workbench
oeuw-102081-v4.txt (text/plain), 41.70 KB, created by
Karice McIntyre
on 2005-10-06 16:31:43 EDT
(
hide
)
Description:
apply patch to org.eclipse.ui.workbench
Filename:
MIME Type:
Creator:
Karice McIntyre
Created:
2005-10-06 16:31:43 EDT
Size:
41.70 KB
patch
obsolete
>Index: Eclipse UI/org/eclipse/ui/internal/dialogs/ShowViewDialog.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/ShowViewDialog.java,v >retrieving revision 1.27 >diff -u -r1.27 ShowViewDialog.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/ShowViewDialog.java 15 Mar 2005 21:09:35 -0000 1.27 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/ShowViewDialog.java 6 Oct 2005 20:21:32 -0000 >@@ -18,12 +18,15 @@ > import org.eclipse.jface.dialogs.IDialogSettings; > import org.eclipse.jface.viewers.DoubleClickEvent; > import org.eclipse.jface.viewers.IDoubleClickListener; >+import org.eclipse.jface.viewers.IFontProvider; > import org.eclipse.jface.viewers.ISelectionChangedListener; > import org.eclipse.jface.viewers.IStructuredSelection; >+import org.eclipse.jface.viewers.ITreeContentProvider; > import org.eclipse.jface.viewers.SelectionChangedEvent; > import org.eclipse.jface.viewers.StructuredSelection; > import org.eclipse.jface.viewers.TreeViewer; > import org.eclipse.swt.SWT; >+import org.eclipse.swt.graphics.Font; > import org.eclipse.swt.layout.GridData; > import org.eclipse.swt.widgets.Button; > import org.eclipse.swt.widgets.Composite; >@@ -56,7 +59,7 @@ > private static final String STORE_SELECTED_VIEW_ID = DIALOG_SETTING_SECTION_NAME > + ".STORE_SELECTED_VIEW_ID"; //$NON-NLS-1$ > >- private TreeViewer tree; >+ private FilteredTree filteredTree; > > private Button okButton; > >@@ -64,6 +67,22 @@ > > private IViewRegistry viewReg; > >+ private class ViewBoldLabelProvider extends ViewLabelProvider implements IFontProvider { >+ private FilteredTree filterTree; >+ >+ ViewBoldLabelProvider(FilteredTree filterTree) { >+ this.filterTree = filterTree; >+ } >+ /** >+ * Using "false" to construct the filter so that this filter can filter >+ * supernodes of a matching node >+ */ >+ PatternItemFilter filterForBoldElements = new ViewPatternFilter(false); >+ >+ public Font getFont(Object element) { >+ return FilteredTree.getElementFont(element, filterTree, filterForBoldElements); >+ } >+ } > /** > * Constructs a new ShowViewDialog. > * >@@ -135,9 +154,9 @@ > Composite composite = (Composite) super.createDialogArea(parent); > composite.setFont(parent.getFont()); > >- createViewer(composite); >+ createFilteredTreeViewer(composite); > >- layoutTopControl(tree.getControl()); >+ layoutTopControl(filteredTree.getViewer().getControl()); > > // Restore the last state > restoreWidgetValues(); >@@ -147,21 +166,51 @@ > } > > /** >- * Create a new viewer in the parent. >+ * Create a new filtered tree viewer in the parent. > * > * @param parent the parent <code>Composite</code>. > */ >- private void createViewer(Composite parent) { >- tree = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL >- | SWT.BORDER); >- tree.setLabelProvider(new ViewLabelProvider()); >- tree.setContentProvider(new ViewContentProvider()); >- tree.setSorter(new ViewSorter((ViewRegistry) viewReg)); >- tree.setInput(viewReg); >- tree.addSelectionChangedListener(this); >- tree.addDoubleClickListener(this); >- tree.getTree().setFont(parent.getFont()); >- } >+ private void createFilteredTreeViewer(Composite parent) { >+ PatternItemFilter filter = new ViewPatternFilter(true); >+ int styleBits = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER; >+ filteredTree = new FilteredTree(parent, styleBits, filter); >+ TreeViewer treeViewer = filteredTree.getViewer(); >+ treeViewer.setLabelProvider(new ViewBoldLabelProvider(filteredTree)); >+ treeViewer.setContentProvider(new ViewContentProvider()); >+ treeViewer.setSorter(new ViewSorter((ViewRegistry) viewReg)); >+ treeViewer.setInput(viewReg); >+ treeViewer.addSelectionChangedListener(this); >+ treeViewer.addDoubleClickListener(this); >+ treeViewer.addFilter(new CapabilityFilter()); >+ >+ filteredTree.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); >+ filteredTree.setInitialText(WorkbenchMessages.WorkbenchPreferenceDialog_FilterMessage); >+ >+ //if the tree has only one or zero views, make the combo area disable >+ if(hasAtMostOneView(filteredTree.getViewer())){ >+ filteredTree.getFilterControl().setEnabled(false); >+ } >+ >+ applyDialogFont(filteredTree); >+ } >+ >+ /** >+ * Return whether or not there are less than two views in the list. >+ * @param tree >+ * @return <code>true</code> if there are less than two >+ * views in the list. >+ */ >+ private boolean hasAtMostOneView(TreeViewer tree){ >+ ITreeContentProvider contentProvider = (ITreeContentProvider ) tree.getContentProvider(); >+ Object[] children= contentProvider.getElements(tree.getInput()); >+ >+ if(children.length <= 1){ >+ if(children.length == 0) >+ return true; >+ return !contentProvider.hasChildren(children[0]); >+ } >+ return false; >+ } > > /* > * (non-Javadoc) >@@ -171,8 +220,8 @@ > public void doubleClick(DoubleClickEvent event) { > IStructuredSelection s = (IStructuredSelection) event.getSelection(); > Object element = s.getFirstElement(); >- if (tree.isExpandable(element)) { >- tree.setExpandedState(element, !tree.getExpandedState(element)); >+ if (filteredTree.getViewer().isExpandable(element)) { >+ filteredTree.getViewer().setExpandedState(element, !filteredTree.getViewer().getExpandedState(element)); > } else if (viewDescs.length > 0) { > saveWidgetValues(); > setReturnCode(OK); >@@ -236,13 +285,13 @@ > } > > if (!categoriesToExpand.isEmpty()) >- tree.setExpandedElements(categoriesToExpand.toArray()); >+ filteredTree.getViewer().setExpandedElements(categoriesToExpand.toArray()); > > String selectedViewId = settings.get(STORE_SELECTED_VIEW_ID); > if (selectedViewId != null) { > IViewDescriptor viewDesc = reg.find(selectedViewId); > if (viewDesc != null) { >- tree.setSelection(new StructuredSelection(viewDesc), true); >+ filteredTree.getViewer().setSelection(new StructuredSelection(viewDesc), true); > } > } > } >@@ -255,7 +304,7 @@ > IDialogSettings settings = getDialogSettings(); > > // Collect the ids of the all expanded categories >- Object[] expandedElements = tree.getExpandedElements(); >+ Object[] expandedElements = filteredTree.getViewer().getExpandedElements(); > String[] expandedCategoryIds = new String[expandedElements.length]; > for (int i = 0; i < expandedElements.length; ++i) > expandedCategoryIds[i] = ((IViewCategory) expandedElements[i]).getId(); >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/PatternItemFilter.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/PatternItemFilter.java,v >retrieving revision 1.3 >diff -u -r1.3 PatternItemFilter.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/PatternItemFilter.java 18 May 2005 20:04:06 -0000 1.3 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/PatternItemFilter.java 6 Oct 2005 20:21:32 -0000 >@@ -11,33 +11,15 @@ > package org.eclipse.ui.internal.dialogs; > > import java.text.BreakIterator; >-import java.util.Collection; >-import java.util.HashMap; >-import java.util.Iterator; >-import java.util.Map; >- >-import org.eclipse.jface.preference.IPreferenceNode; >-import org.eclipse.jface.viewers.ITreeContentProvider; >-import org.eclipse.jface.viewers.TreeViewer; >-import org.eclipse.jface.viewers.Viewer; >-import org.eclipse.ui.internal.preferences.WorkbenchPreferenceExtensionNode; > > /** >- * A class which handles filtering preferences nodes based on a supplied >+ * Abstract class that handles filtering items based on a supplied > * matching string. > * > * @since 3.1 > * > */ >-public class PatternItemFilter extends PatternFilter { >- >- /** >- * this cache is needed because >- * WorkbenchPreferenceExtensionNode.getKeywordLabels() is expensive. When it >- * tracks keyword changes effectivly than this cache can be removed. >- */ >- private Map keywordCache = new HashMap(); >- >+public abstract class PatternItemFilter extends PatternFilter { > protected boolean matchItem; > > /** >@@ -49,52 +31,7 @@ > super(); > matchItem = isMatchItem; > } >- >- /* >- * (non-Javadoc) >- * >- * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, >- * java.lang.Object, java.lang.Object) >- */ >- public boolean select(Viewer viewer, Object parentElement, Object element) { >- >- ITreeContentProvider contentProvider = (ITreeContentProvider) ((TreeViewer) viewer) >- .getContentProvider(); >- >- IPreferenceNode node = (IPreferenceNode) element; >- Object[] children = contentProvider.getChildren(node); >- String text = node.getLabelText(); >- >- if(wordMatches(text)) >- return true; >- >- if (matchItem) { >- >- // Will return true if any subnode of the element matches the search >- if (filter(viewer, element, children).length > 0) >- return true; >- } >- >- if (node instanceof WorkbenchPreferenceExtensionNode) { >- WorkbenchPreferenceExtensionNode workbenchNode = (WorkbenchPreferenceExtensionNode) node; >- >- Collection keywordCollection = (Collection) keywordCache.get(node); >- if (keywordCollection == null) { >- keywordCollection = workbenchNode.getKeywordLabels(); >- keywordCache.put(node, keywordCollection); >- } >- if (keywordCollection.isEmpty()) >- return false; >- Iterator keywords = keywordCollection.iterator(); >- while (keywords.hasNext()) { >- if (wordMatches((String) keywords.next())) >- return true; >- } >- } >- return false; >- >- } >- >+ > /** > * Return whether or not if any of the words in text satisfy the > * match critera. >@@ -102,7 +39,7 @@ > * @return boolean <code>true</code> if one of the words in text > * satisifes the match criteria. > */ >- private boolean wordMatches(String text) { >+ protected boolean wordMatches(String text) { > > //If the whole text matches we are all set > if(match(text)) >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java,v >retrieving revision 1.68 >diff -u -r1.68 FilteredPreferenceDialog.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java 8 Aug 2005 15:56:56 -0000 1.68 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java 6 Oct 2005 20:21:32 -0000 >@@ -34,7 +34,6 @@ > import org.eclipse.jface.viewers.TreeViewer; > import org.eclipse.swt.SWT; > import org.eclipse.swt.graphics.Font; >-import org.eclipse.swt.graphics.Point; > import org.eclipse.swt.layout.GridData; > import org.eclipse.swt.layout.GridLayout; > import org.eclipse.swt.widgets.Composite; >@@ -57,7 +56,7 @@ > */ > public abstract class FilteredPreferenceDialog extends PreferenceDialog implements IWorkbenchPreferenceContainer{ > >- protected FilteredComboTree filteredTree; >+ protected FilteredTree filteredTree; > > private Object pageData; > >@@ -108,9 +107,9 @@ > * @see org.eclipse.jface.preference.PreferenceDialog#createTreeViewer(org.eclipse.swt.widgets.Composite) > */ > protected TreeViewer createTreeViewer(Composite parent) { >- PatternItemFilter filter = new PatternItemFilter(true); >+ PatternFilter filter = new PreferencePatternFilter(true); > int styleBits = SWT.SINGLE | SWT.H_SCROLL; >- filteredTree = new FilteredComboTree(parent, styleBits, filter); >+ filteredTree = new FilteredTree(parent, styleBits, filter); > GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); > gd.horizontalIndent = IDialogConstants.HORIZONTAL_MARGIN; > filteredTree.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); >@@ -123,10 +122,8 @@ > > //if the tree has only one or zero pages, make the combo area disable > if(hasAtMostOnePage(tree)){ >- filteredTree.getFilterCombo().setEnabled(false); >- filteredTree.getFilterCombo().setSelection(new Point(0,0)); >- } >- >+ filteredTree.getFilterControl().setEnabled(false); >+ } > > tree.addFilter(new CapabilityFilter()); > >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/PatternFilter.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/PatternFilter.java,v >retrieving revision 1.9 >diff -u -r1.9 PatternFilter.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/PatternFilter.java 5 Aug 2005 17:02:35 -0000 1.9 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/PatternFilter.java 6 Oct 2005 20:21:32 -0000 >@@ -61,16 +61,7 @@ > * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) > */ > public boolean select(Viewer viewer, Object parentElement, Object element) { >- Object[] children = ((ITreeContentProvider) ((AbstractTreeViewer) viewer) >- .getContentProvider()).getChildren(element); >- if ((children != null) && (children.length > 0)) >- return filter(viewer, element, children).length > 0; >- >- String labelText = ((ILabelProvider) ((StructuredViewer) viewer) >- .getLabelProvider()).getText(element); >- if(labelText == null) >- return false; >- return match(labelText); >+ return isElementMatch(viewer, element); > } > > /** >@@ -111,4 +102,36 @@ > protected boolean match(String string) { > return matcher.match(string); > } >+ >+ /** >+ * Answers whether the given Object should be selected in >+ * the filtered control. >+ * >+ * @param element >+ * @return true if this element should be auto selected >+ */ >+ protected boolean isElementSelectable(Object element){ >+ return element != null; >+ } >+ >+ /** >+ * Answers whether the given element in the given viewer matches >+ * the filter pattern. >+ * >+ * @param viewer >+ * @param element >+ * @return true if the element matches the filter pattern >+ */ >+ protected boolean isElementMatch(Viewer viewer, Object element){ >+ Object[] children = ((ITreeContentProvider) ((AbstractTreeViewer) viewer) >+ .getContentProvider()).getChildren(element); >+ if ((children != null) && (children.length > 0)) >+ return filter(viewer, element, children).length > 0; >+ >+ String labelText = ((ILabelProvider) ((StructuredViewer) viewer) >+ .getLabelProvider()).getText(element); >+ if(labelText == null) >+ return false; >+ return match(labelText); >+ } > } >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/PreferenceBoldLabelProvider.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/PreferenceBoldLabelProvider.java,v >retrieving revision 1.4 >diff -u -r1.4 PreferenceBoldLabelProvider.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/PreferenceBoldLabelProvider.java 8 Aug 2005 15:56:56 -0000 1.4 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/PreferenceBoldLabelProvider.java 6 Oct 2005 20:21:32 -0000 >@@ -1,9 +1,7 @@ > package org.eclipse.ui.internal.dialogs; > > import org.eclipse.jface.preference.PreferenceLabelProvider; >-import org.eclipse.jface.resource.JFaceResources; > import org.eclipse.jface.viewers.IFontProvider; >-import org.eclipse.jface.viewers.ITreeContentProvider; > import org.eclipse.swt.graphics.Font; > > /** >@@ -14,41 +12,19 @@ > implements IFontProvider { > > >- private FilteredComboTree comboTree; >+ private FilteredTree filterTree; > >- PreferenceBoldLabelProvider(FilteredComboTree comboTree) { >- this.comboTree = comboTree; >+ PreferenceBoldLabelProvider(FilteredTree filterTree) { >+ this.filterTree = filterTree; > } > /** > * Using "false" to construct the filter so that this filter can filter > * supernodes of a matching node > */ >- PatternItemFilter filterForBoldElements = new PatternItemFilter(false); >+ PatternFilter filterForBoldElements = new PreferencePatternFilter(false); > > public Font getFont(Object element) { >- >- String filterText = comboTree.getFilterControlText(); >- >- // Do nothing if it's empty string >- if (!(filterText.equals("") || filterText.equals(comboTree.getInitialText()))) {//$NON-NLS-1$ >- >- boolean initial = comboTree.getInitialText() != null >- && filterText.equals(comboTree.getInitialText()); >- if (initial) { >- filterForBoldElements.setPattern(null); >- } else { >- filterForBoldElements.setPattern(filterText); >- } >- >- ITreeContentProvider contentProvider = (ITreeContentProvider) comboTree.getViewer() >- .getContentProvider(); >- Object parent = contentProvider.getParent(element); >- >- if (filterForBoldElements.select(comboTree.getViewer(), parent, element)) { >- return JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT); >- } >- } >- return null; >+ return FilteredTree.getElementFont(element, filterTree, filterForBoldElements); > } > > } >\ No newline at end of file >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredTree.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredTree.java,v >retrieving revision 1.32 >diff -u -r1.32 FilteredTree.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredTree.java 8 Aug 2005 15:56:55 -0000 1.32 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredTree.java 6 Oct 2005 20:21:32 -0000 >@@ -19,7 +19,10 @@ > import org.eclipse.jface.action.ToolBarManager; > import org.eclipse.jface.resource.ImageDescriptor; > import org.eclipse.jface.resource.JFaceResources; >+import org.eclipse.jface.viewers.ISelection; >+import org.eclipse.jface.viewers.ITreeContentProvider; > import org.eclipse.jface.viewers.TreeViewer; >+import org.eclipse.jface.viewers.ViewerFilter; > import org.eclipse.osgi.util.NLS; > import org.eclipse.swt.SWT; > import org.eclipse.swt.accessibility.AccessibleAdapter; >@@ -30,14 +33,17 @@ > import org.eclipse.swt.events.FocusListener; > import org.eclipse.swt.events.KeyAdapter; > import org.eclipse.swt.events.KeyEvent; >+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.layout.GridData; > import org.eclipse.swt.layout.GridLayout; >-import org.eclipse.swt.widgets.Combo; > import org.eclipse.swt.widgets.Composite; >-import org.eclipse.swt.widgets.Control; >+import org.eclipse.swt.widgets.Display; > import org.eclipse.swt.widgets.Text; > import org.eclipse.swt.widgets.ToolBar; >+import org.eclipse.swt.widgets.TreeItem; > import org.eclipse.ui.PlatformUI; > import org.eclipse.ui.internal.WorkbenchMessages; > import org.eclipse.ui.plugin.AbstractUIPlugin; >@@ -62,7 +68,7 @@ > > private PatternFilter patternFilter; > >- private PreferenceNodeFilter preferenceFilter; >+ private ViewerFilter viewerFilter; > > private FocusListener listener; > >@@ -133,24 +139,45 @@ > | GridData.GRAB_HORIZONTAL)); > > createFilterControl(filterParent); >- getFilterControl().addKeyListener(new KeyAdapter() { >- >- /* >- * (non-Javadoc) >- * >- * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent) >- */ >- public void keyReleased(KeyEvent e) { >- // on a CR we want to transfer focus to the list >- if(e.keyCode == SWT.ARROW_DOWN){ >- >- if (!(getFilterControl() instanceof Combo)) { >- treeViewer.getTree().setFocus(); >- } >- } else >- textChanged(); >- } >- }); >+ getFilterControl().addKeyListener(new KeyAdapter() { >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent) >+ */ >+ public void keyReleased(KeyEvent e) { >+ // on a CR we want to transfer focus to the list >+ if(e.keyCode == SWT.ARROW_DOWN){ >+ treeViewer.getTree().setFocus(); >+ } else if (e.character == SWT.CR) >+ return; >+ >+ textChanged(); >+ } >+ }); >+ >+ // enter key set focus to tree >+ getFilterControl().addTraverseListener( new TraverseListener () { >+ public void keyTraversed(TraverseEvent e) { >+ if (e.detail == SWT.TRAVERSE_RETURN) { >+ e.doit = false; >+ if (getViewer().getTree().getItemCount() == 0) { >+ Display.getCurrent().beep(); >+ setFilterText(""); //$NON-NLS-1$ >+ } else { >+ boolean hasFocus = getViewer().getTree().setFocus(); >+ if (hasFocus){ >+ TreeItem item = getFirstHighlightedItem(getViewer().getTree().getItems()); >+ if (item != null){ >+ getViewer().getTree().setSelection(new TreeItem[] {item}); >+ ISelection sel = getViewer().getSelection(); >+ getViewer().setSelection(sel, true); >+ } >+ } >+ } >+ } >+ } >+ }); > > GridData data = new GridData(GridData.FILL_HORIZONTAL > | GridData.GRAB_HORIZONTAL); >@@ -182,6 +209,15 @@ > createRefreshJob(); > } > >+ private TreeItem getFirstHighlightedItem(TreeItem[] items){ >+ for (int i = 0; i < items.length; i++){ >+ if (patternFilter.isElementMatch(treeViewer, items[i].getData()) && patternFilter.isElementSelectable(items[i].getData())){ >+ return items[i]; >+ } >+ return getFirstHighlightedItem(items[i].getItems()); >+ } >+ return null; >+ } > /** > * Create the refresh job for the receiver. > * >@@ -195,12 +231,12 @@ > if(treeViewer.getControl().isDisposed()) > return Status.CANCEL_STATUS; > >- String filterText = getFilterControlText(); >+ String filterText = getFilterControl().getText(); > boolean initial = initialText != null && filterText.equals(initialText); > if (initial) { > patternFilter.setPattern(null); > } else { >- patternFilter.setPattern(getFilterControlText()); >+ patternFilter.setPattern(filterText); > } > treeViewer.getControl().setRedraw(false); > treeViewer.refresh(true); >@@ -208,13 +244,16 @@ > > if (filterText.length() > 0 && !initial) { > treeViewer.expandAll(); >+ TreeItem[] items = getViewer().getTree().getItems(); >+ if (items.length > 0) >+ treeViewer.getTree().showItem(items[0]); // to prevent scrolling > // enabled toolbar is a hint that there is text to clear > // and the list is currently being filtered > filterToolBar.getControl().setVisible(true); > } else { > // disabled toolbar is a hint that there is no text to clear > // and the list is currently not filtered >- filterToolBar.getControl().setVisible(preferenceFilter != null); >+ filterToolBar.getControl().setVisible(viewerFilter != null); > } > return Status.OK_STATUS; > } >@@ -228,48 +267,29 @@ > */ > protected void createFilterControl(Composite parent) { > filterText = new Text(parent, SWT.SINGLE | SWT.BORDER); >- filterText.getAccessible().addAccessibleListener(getAccessibleListener()); >- } >- >- protected AccessibleAdapter getAccessibleListener() { >- return new AccessibleAdapter(){ >- /* (non-Javadoc) >- * @see org.eclipse.swt.accessibility.AccessibleListener#getName(org.eclipse.swt.accessibility.AccessibleEvent) >- */ >- public void getName(AccessibleEvent e) { >- String filterTextString = getFilterText(); >- if(filterTextString.length() == 0){ >- e.result = initialText; >- } >- else >- e.result = filterTextString; >- } >- >- }; >+ filterText.getAccessible().addAccessibleListener( >+ new AccessibleAdapter(){ >+ /* (non-Javadoc) >+ * @see org.eclipse.swt.accessibility.AccessibleListener#getName(org.eclipse.swt.accessibility.AccessibleEvent) >+ */ >+ public void getName(AccessibleEvent e) { >+ String filterTextString = getFilterControl().getText(); >+ if(filterTextString.length() == 0){ >+ e.result = initialText; >+ } >+ else >+ e.result = filterTextString; >+ } >+ }); > } > > /** >- * Get the text from the filter widget. >- * @return String >- */ >- protected String getFilterText() { >- return filterText.getText(); >- } >- /** > * update the receiver after the text has changed > */ > protected void textChanged() { > refreshJob.schedule(200); > } > >- /** >- * Get the text from the filter control. >- * @return Text >- */ >- protected String getFilterControlText() { >- return filterText.getText(); >- } >- > /** > * Set the background for the widgets that support the filter text area > * >@@ -278,7 +298,6 @@ > public void setBackground(Color background) { > super.setBackground(background); > filterParent.setBackground(background); >- getFilterControl().setBackground(background); > filterToolBar.getControl().setBackground(background); > } > >@@ -315,9 +334,9 @@ > protected void clearText() { > setFilterText(""); //$NON-NLS-1$ > >- if(preferenceFilter != null){ >- getViewer().removeFilter(preferenceFilter); >- preferenceFilter = null; >+ if(viewerFilter != null){ >+ getViewer().removeFilter(viewerFilter); >+ viewerFilter = null; > getShell().setText(cachedTitle); > } > >@@ -347,7 +366,7 @@ > * > * @return the text field > */ >- public Control getFilterControl() { >+ public Text getFilterControl() { > return filterText; > } > >@@ -394,8 +413,8 @@ > * Add the filter to the viewer. > * @param filter > */ >- public void addFilter(PreferenceNodeFilter filter) { >- preferenceFilter = filter; >+ public void addFilter(ViewerFilter filter) { >+ viewerFilter = filter; > getViewer().addFilter(filter); > setInitialText(WorkbenchMessages.FilteredTree_FilteredMessage); > >@@ -412,5 +431,39 @@ > > } > >+ /** >+ * Return bold font if the given element matches the given pattern. >+ * >+ * @param element >+ * @param tree >+ * @param filter >+ * @return bold font >+ */ >+ protected static Font getElementFont(Object element, FilteredTree tree, PatternFilter filter){ >+ String filterText = tree.getFilterControl().getText(); >+ >+ // Do nothing if it's empty string >+ String initialText = tree.getInitialText(); >+ if (!(filterText.equals("") || filterText.equals(initialText))) {//$NON-NLS-1$ >+ >+ boolean initial = initialText != null >+ && filterText.equals(initialText); >+ if (initial) { >+ filter.setPattern(null); >+ } else { >+ filter.setPattern(filterText); >+ } >+ >+ ITreeContentProvider contentProvider = (ITreeContentProvider) tree.getViewer() >+ .getContentProvider(); >+ Object parent = contentProvider.getParent(element); >+ >+ if (filter.select(tree.getViewer(), parent, element)) { >+ return JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT); >+ } >+ } >+ return null; >+ >+ } > > } >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredComboTree.java >=================================================================== >RCS file: Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredComboTree.java >diff -N Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredComboTree.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredComboTree.java 8 Aug 2005 15:56:56 -0000 1.14 >+++ /dev/null 1 Jan 1970 00:00:00 -0000 >@@ -1,210 +0,0 @@ >-/******************************************************************************* >- * Copyright (c) 2005 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 >- * http://www.eclipse.org/legal/epl-v10.html >- * >- * Contributors: >- * IBM Corporation - initial API and implementation >- *******************************************************************************/ >-package org.eclipse.ui.internal.dialogs; >- >-import org.eclipse.jface.dialogs.IDialogSettings; >-import org.eclipse.swt.SWT; >-import org.eclipse.swt.events.DisposeEvent; >-import org.eclipse.swt.events.DisposeListener; >-import org.eclipse.swt.events.FocusAdapter; >-import org.eclipse.swt.events.FocusEvent; >-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.Point; >-import org.eclipse.swt.widgets.Combo; >-import org.eclipse.swt.widgets.Composite; >-import org.eclipse.swt.widgets.Control; >-import org.eclipse.swt.widgets.Display; >-import org.eclipse.ui.internal.WorkbenchPlugin; >- >-/** >- * The FilteredComboTree is a filtered tree that uses an >- * editable combo rather than just a text. >- */ >-public class FilteredComboTree extends FilteredTree { >- >- private Combo filterCombo; >- >- private static final String SEARCHHISTORY = "search"; //$NON-NLS-1$ >- >- //Set a number limitation of items to be saved in combo >- private static final int maxNumItems = 20; >- /** >- * Create a new instance of the receiver. >- * @param parent >- * @param treeStyle >- */ >- public FilteredComboTree(Composite parent, int treeStyle) { >- super(parent, treeStyle); >- } >- >- /** >- * Create a new instance of the receiver with a supplied filter. >- * @param parent >- * @param treeStyle >- * @param filter >- */ >- public FilteredComboTree(Composite parent, int treeStyle, PatternItemFilter filter) { >- super(parent, treeStyle, filter); >- } >- >- /* (non-Javadoc) >- * @see org.eclipse.ui.internal.dialogs.FilteredTree#createFilterControl(org.eclipse.swt.widgets.Composite) >- */ >- protected void createFilterControl(Composite parent) { >- filterCombo = new Combo(parent, SWT.DROP_DOWN | SWT.BORDER); >- filterCombo.setFont(parent.getFont()); >- getPreferenceSearchHistory(); >- filterCombo.addTraverseListener( new TraverseListener () { >- public void keyTraversed(TraverseEvent e) { >- if (e.detail == SWT.TRAVERSE_RETURN) { >- e.doit = false; >- if (getViewer().getTree().getItemCount() == 0) { >- Display.getCurrent().beep(); >- setFilterText(""); //$NON-NLS-1$ >- } else { >- getViewer().getTree().setFocus(); >- } >- } >- } >- }); >- filterCombo.addFocusListener(new FocusAdapter(){ >- /* (non-Javadoc) >- * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent) >- */ >- public void focusLost(FocusEvent e) { >- String [] textValues = filterCombo.getItems(); >- String newText = filterCombo.getText(); >- >- if((newText.equals(""))||(newText .equals(initialText)))//$NON-NLS-1$ >- return; >- >- for (int i = 0; i < textValues.length; i++) { >- if(textValues[i].equals(newText)) >- return; >- } >- >- if(textValues.length >= maxNumItems) >- //Discard the oldest search to get space for new search >- filterCombo.remove(maxNumItems-1); >- >- filterCombo.add(newText,0); >- } >- }); >- filterCombo.addSelectionListener(new SelectionAdapter(){ >- /* (non-Javadoc) >- * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) >- */ >- public void widgetSelected(SelectionEvent e) { >- textChanged(); >- } >- }); >- >- filterCombo.addDisposeListener(new DisposeListener() { >- >- /* (non-Javadoc) >- * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent) >- */ >- public void widgetDisposed(DisposeEvent e) { >- saveDialogSettings(); >- } >- }); >- >- filterCombo.getAccessible().addAccessibleListener(getAccessibleListener()); >- >- } >- >- /* (non-Javadoc) >- * @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterControl() >- */ >- public Control getFilterControl() { >- return filterCombo; >- } >- >- /* (non-Javadoc) >- * @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterControlText() >- */ >- protected String getFilterControlText() { >- return filterCombo.getText(); >- } >- >- /* (non-Javadoc) >- * @see org.eclipse.ui.internal.dialogs.FilteredTree#setFilterText(java.lang.String) >- */ >- protected void setFilterText(String string) { >- filterCombo.setText(string); >- selectAll(); >- } >- >- protected void selectAll() { >- filterCombo.setSelection(new Point(0,filterCombo.getText().length())); >- } >- >- /** >- * Get the combo box used by the receiver. >- * @return Combo >- */ >- public Combo getFilterCombo() { >- return filterCombo; >- } >- >- /* (non-Javadoc) >- * @see org.eclipse.ui.internal.dialogs.FilteredTree#getFilterText() >- */ >- protected String getFilterText() { >- return filterCombo.getText(); >- } >- >- /** >- * Return a dialog setting section for this dialog >- */ >- private IDialogSettings getDialogSettings() { >- IDialogSettings settings = WorkbenchPlugin.getDefault() >- .getDialogSettings(); >- IDialogSettings thisSettings = settings >- .getSection(getClass().getName()); >- if (thisSettings == null) >- thisSettings = settings.addNewSection(getClass().getName()); >- return thisSettings; >- } >- >- >- /** >- * Get the preferences search history for this eclipse's start, >- * Note that this history will not be cleared until this eclipse closes >- * >- */ >- public void getPreferenceSearchHistory(){ >- IDialogSettings settings = getDialogSettings(); >- String[] search = settings.getArray(SEARCHHISTORY); >- >- if(search == null) >- return; >- >- for(int i = 0; i < search.length;i++){ >- filterCombo.add(search[i]); >- } >- >- } >- >- /** >- * Saves the search history. >- */ >- private void saveDialogSettings() { >- IDialogSettings settings =getDialogSettings(); >- >- //If the settings contains the same key, the previous value will be replaced by new one >- settings.put(SEARCHHISTORY,filterCombo.getItems()); >- >- } >-} >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/ViewPatternFilter.java >=================================================================== >RCS file: Eclipse UI/org/eclipse/ui/internal/dialogs/ViewPatternFilter.java >diff -N Eclipse UI/org/eclipse/ui/internal/dialogs/ViewPatternFilter.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/ViewPatternFilter.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,89 @@ >+package org.eclipse.ui.internal.dialogs; >+ >+import org.eclipse.jface.viewers.ITreeContentProvider; >+import org.eclipse.jface.viewers.TreeViewer; >+import org.eclipse.jface.viewers.Viewer; >+import org.eclipse.ui.views.IViewCategory; >+import org.eclipse.ui.views.IViewDescriptor; >+ >+/** >+ * A class that handles filtering view node items based on a supplied >+ * matching string. >+ * >+ * @since 3.2 >+ * >+ */ >+public class ViewPatternFilter extends PatternItemFilter { >+ >+ /** >+ * Create a new instance of a ViewPatternFilter >+ * @param isMatchItem >+ */ >+ public ViewPatternFilter(boolean isMatchItem) { >+ super(isMatchItem); >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, >+ * java.lang.Object, java.lang.Object) >+ */ >+ public boolean select(Viewer viewer, Object parentElement, Object element) { >+ ITreeContentProvider contentProvider = (ITreeContentProvider) ((TreeViewer) viewer) >+ .getContentProvider(); >+ >+ String text = null; >+ Object[] children = null; >+ if (element instanceof IViewCategory){ >+ IViewCategory desc = (IViewCategory) element; >+ children = contentProvider.getChildren(desc); >+ text = desc.getLabel(); >+ } >+ else if (element instanceof IViewDescriptor){ >+ IViewDescriptor desc = (IViewDescriptor) element; >+ children = contentProvider.getChildren(desc); >+ text = desc.getLabel(); >+ } >+ >+ if(text != null && wordMatches(text)) >+ return true; >+ >+ if (matchItem && children != null) { >+ // Will return true if any subnode of the element matches the search >+ if (filter(viewer, element, children).length > 0) >+ return true; >+ } >+ >+ return false; >+ } >+ >+ /* >+ * (non-Javadoc) >+ * @see org.eclipse.ui.internal.dialogs.PatternFilter#isElementSelectable(java.lang.Object) >+ */ >+ protected boolean isElementSelectable(Object element){ >+ return element instanceof IViewDescriptor; >+ } >+ >+ /* >+ * (non-Javadoc) >+ * @see org.eclipse.ui.internal.dialogs.PatternFilter#isElementMatch(org.eclipse.jface.viewers.Viewer, java.lang.Object) >+ */ >+ protected boolean isElementMatch(Viewer viewer, Object element){ >+ String text = null; >+ if (element instanceof IViewCategory){ >+ IViewCategory desc = (IViewCategory) element; >+ text = desc.getLabel(); >+ } >+ else if (element instanceof IViewDescriptor){ >+ IViewDescriptor desc = (IViewDescriptor) element; >+ text = desc.getLabel(); >+ } >+ >+ if(text != null && wordMatches(text)) >+ return true; >+ >+ return false; >+ } >+} >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/PreferencePatternFilter.java >=================================================================== >RCS file: Eclipse UI/org/eclipse/ui/internal/dialogs/PreferencePatternFilter.java >diff -N Eclipse UI/org/eclipse/ui/internal/dialogs/PreferencePatternFilter.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/PreferencePatternFilter.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,111 @@ >+package org.eclipse.ui.internal.dialogs; >+ >+import java.util.Collection; >+import java.util.HashMap; >+import java.util.Iterator; >+import java.util.Map; >+ >+import org.eclipse.jface.preference.IPreferenceNode; >+import org.eclipse.jface.viewers.ITreeContentProvider; >+import org.eclipse.jface.viewers.TreeViewer; >+import org.eclipse.jface.viewers.Viewer; >+import org.eclipse.ui.internal.preferences.WorkbenchPreferenceExtensionNode; >+ >+/** >+ * A class that handles filtering preference node items based on a supplied >+ * matching string. >+ * >+ * @since 3.2 >+ * >+ */ >+public class PreferencePatternFilter extends PatternItemFilter { >+ >+ /** >+ * this cache is needed because >+ * WorkbenchPreferenceExtensionNode.getKeywordLabels() is expensive. When it >+ * tracks keyword changes effectivly than this cache can be removed. >+ */ >+ private Map keywordCache = new HashMap(); >+ >+ >+ /** >+ * Create a new instance of a PreferencePatternFilter >+ * >+ * @param isMatchItem >+ */ >+ public PreferencePatternFilter(boolean isMatchItem) { >+ super(isMatchItem); >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, >+ * java.lang.Object, java.lang.Object) >+ */ >+ public boolean select(Viewer viewer, Object parentElement, Object element) { >+ ITreeContentProvider contentProvider = (ITreeContentProvider) ((TreeViewer) viewer) >+ .getContentProvider(); >+ >+ IPreferenceNode node = (IPreferenceNode) element; >+ Object[] children = contentProvider.getChildren(node); >+ String text = node.getLabelText(); >+ >+ if(wordMatches(text)) >+ return true; >+ >+ if (matchItem) { >+ // Will return true if any subnode of the element matches the search >+ if (filter(viewer, element, children).length > 0) >+ return true; >+ } >+ return keywordMatches(node); >+ } >+ >+ /* >+ * Return true if the given Object matches with any possible keywords >+ * that have been provided. Currently this is only applicable for >+ * preference and property pages. >+ */ >+ private boolean keywordMatches(Object element){ >+ if (element instanceof WorkbenchPreferenceExtensionNode) { >+ WorkbenchPreferenceExtensionNode workbenchNode = (WorkbenchPreferenceExtensionNode) element; >+ >+ Collection keywordCollection = (Collection) keywordCache.get(element); >+ if (keywordCollection == null) { >+ keywordCollection = workbenchNode.getKeywordLabels(); >+ keywordCache.put(element, keywordCollection); >+ } >+ if (keywordCollection.isEmpty()) >+ return false; >+ Iterator keywords = keywordCollection.iterator(); >+ while (keywords.hasNext()) { >+ if (wordMatches((String) keywords.next())) >+ return true; >+ } >+ } >+ return false; >+ } >+ >+ /* >+ * (non-Javadoc) >+ * @see org.eclipse.ui.internal.dialogs.PatternFilter#isElementSelectable(java.lang.Object) >+ */ >+ protected boolean isElementSelectable(Object element){ >+ return element instanceof WorkbenchPreferenceExtensionNode; >+ } >+ >+ /* >+ * (non-Javadoc) >+ * @see org.eclipse.ui.internal.dialogs.PatternFilter#isElementMatch(org.eclipse.jface.viewers.Viewer, java.lang.Object) >+ */ >+ protected boolean isElementMatch(Viewer viewer, Object element){ >+ IPreferenceNode node = (IPreferenceNode) element; >+ String text = node.getLabelText(); >+ >+ if(text != null && wordMatches(text)) >+ return true; >+ >+ return keywordMatches(node); >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 102081
:
24326
|
24383
|
24783
|
25296
|
25430
|
25584
|
27648
|
27653
|
27838
|
27868
|
27957
|
27967
|
27979
|
28401
|
28603