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 74158 Details for
Bug 29692
[find/replace] Highlight all matches in editor
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Correct approach (works but still needs work to be completely right)
findreplace-highlightall.diff (text/plain), 17.31 KB, created by
Cagatay Calli
on 2007-07-19 10:46:26 EDT
(
hide
)
Description:
Correct approach (works but still needs work to be completely right)
Filename:
MIME Type:
Creator:
Cagatay Calli
Created:
2007-07-19 10:46:26 EDT
Size:
17.31 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jface.text >Index: src/org/eclipse/jface/text/TextViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewer.java,v >retrieving revision 1.180 >diff -u -r1.180 TextViewer.java >--- src/org/eclipse/jface/text/TextViewer.java 20 Jun 2007 14:30:54 -0000 1.180 >+++ src/org/eclipse/jface/text/TextViewer.java 19 Jul 2007 14:41:21 -0000 >@@ -7,6 +7,7 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Cagatay Calli - https://bugs.eclipse.org/bugs/show_bug.cgi?id=29692 > *******************************************************************************/ > package org.eclipse.jface.text; > >@@ -74,6 +75,10 @@ > import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter; > import org.eclipse.jface.text.projection.ChildDocument; > import org.eclipse.jface.text.projection.ChildDocumentManager; >+import org.eclipse.jface.text.source.Annotation; >+import org.eclipse.jface.text.source.AnnotationModel; >+import org.eclipse.jface.text.source.ISourceViewer; >+import org.eclipse.jface.text.source.SourceViewer; > > > /** >@@ -754,7 +759,7 @@ > /** > * This viewer's find/replace target. > */ >- class FindReplaceTarget implements IFindReplaceTarget, IFindReplaceTargetExtension, IFindReplaceTargetExtension3 { >+ class FindReplaceTarget implements IFindReplaceTarget, IFindReplaceTargetExtension, IFindReplaceTargetExtension3, IFindReplaceTargetExtension4 { > > /** The range for this target. */ > private FindReplaceRange fRange; >@@ -997,7 +1002,47 @@ > } > } > } >+ >+ /* >+ * @see IFindReplaceTargetExtension4#highlightAll(String, boolean, boolean, boolean) >+ * @since 3.4 >+ */ >+ public int highlightAll(String findString, boolean caseSensitive, >+ boolean wholeWord, boolean regExSearch) { >+ int matchCount; >+ >+ if (fRange != null) { >+ IRegion range= fRange.getRange(); >+ matchCount = TextViewer.this.highlightAllInRange(findString, caseSensitive, wholeWord, range.getOffset(), range.getLength(), regExSearch); >+ } else { >+ matchCount = TextViewer.this.highlightAll(findString, caseSensitive, wholeWord, regExSearch); >+ } >+ >+ return matchCount; >+ } >+ >+ /* >+ * @see IFindReplaceTargetExtension4#clearHighlights() >+ * @since 3.4 >+ */ >+ public void clearHighlights() { >+ // TODO This removes annotations if target supports it. Remove highlights from non-supporting targets. >+ if(TextViewer.this instanceof SourceViewer){ >+ AnnotationModel model = (AnnotationModel) ((SourceViewer) TextViewer.this).getAnnotationModel(); >+ Iterator iter = model.getAnnotationIterator(); >+ while(iter.hasNext()){ >+ Annotation currentAnnotation = (Annotation) iter.next(); >+ if(currentAnnotation.getType().equals("org.eclipse.search.results")){ //$NON-NLS-1$ >+ model.removeAnnotation(currentAnnotation); >+ } >+ } >+ } >+ } >+ > } >+ >+ >+ > > > /** >@@ -5331,5 +5376,145 @@ > public void setTabsToSpacesConverter(IAutoEditStrategy converter) { > fTabsToSpacesConverter= converter; > } >+ >+ /** >+ * Returns whether this TextViewer is annotatible. >+ * @return whether this TextViewer is annotatible >+ * @since 3.4 >+ */ >+ public boolean isAnnotatible(){ >+ return (this instanceof ISourceViewer); >+ } >+ >+ /** >+ * Adheres to the contract of {@link org.eclipse.jface.text.IFindReplaceTargetExtension4#highlightAll(String, boolean, boolean, boolean)}. >+ * >+ * @param findString the find string specification >+ * @param caseSensitive <code>true</code> if case sensitive, <code>false</code> otherwise >+ * @param wholeWord <code>true</code> if matches must be whole words, <code>false</code> otherwise >+ * @param regExSearch <code>true</code> if <code>findString</code> is a regular expression, <code>false</code> otherwise >+ * @return number of occurrences in range >+ * @since 3.4 >+ */ >+ protected int highlightAll(String findString, boolean caseSensitive, >+ boolean wholeWord, boolean regExSearch) { >+ int matchCounter = 0; >+ >+ try { >+ >+ int widgetOffset= 0; >+ int firstMatch = -1; >+ IRegion matchRegion; >+ FindReplaceDocumentAdapter adapter= getFindReplaceDocumentAdapter(); >+ >+ while((matchRegion= adapter.find(widgetOffset, findString, true, caseSensitive, wholeWord, regExSearch))!=null){ >+ int widgetPos= matchRegion.getOffset(); >+ int length= matchRegion.getLength(); >+ >+ if(matchCounter == 0) firstMatch = widgetPos; >+ else { >+ if(firstMatch == widgetPos) >+ return matchCounter; >+ } >+ >+ if(isAnnotatible()){ >+ AnnotationModel model = (AnnotationModel) ((ISourceViewer) TextViewer.this).getAnnotationModel(); >+ Annotation findAnnotation = new Annotation("org.eclipse.search.results",true,adapter.subSequence(widgetPos, widgetPos+length-1).toString()); //$NON-NLS-1$ >+ Position position = new Position(widgetPos,length); >+ model.addAnnotation(findAnnotation, position); >+ } >+ else { >+ // TODO Add raw highlighing for targets that don't support annotations >+// Color highlight = new Color(getTextWidget().getDisplay(),255,0,0); >+// setTextColor(highlight, widgetPos, length, false); >+ return 0; >+ } >+ >+ matchCounter++; >+ widgetOffset = widgetPos + length; >+ } >+ >+ } catch (BadLocationException x) { >+ if (TRACE_ERRORS) >+ System.out.println(JFaceTextMessages.getString("TextViewer.error.bad_location.findAndSelect")); //$NON-NLS-1$ >+ } >+ >+ return matchCounter; >+ >+ } >+ >+ /** >+ * Adheres to the contract of {@link org.eclipse.jface.text.IFindReplaceTargetExtension4#highlightAll(String, boolean, boolean, boolean)}. >+ * >+ * @param findString the find string specification >+ * @param caseSensitive <code>true</code> if case sensitive, <code>false</code> otherwise >+ * @param wholeWord <code>true</code> if matches must be whole words, <code>false</code> otherwise >+ * @param rangeOffset the search scope offset >+ * @param rangeLength the search scope length >+ * @param regExSearch <code>true</code> if <code>findString</code> is a regular expression, <code>false</code> otherwise >+ * @return number of occurrences in range >+ * @since 3.4 >+ */ >+ protected int highlightAllInRange(String findString, boolean caseSensitive, >+ boolean wholeWord, int rangeOffset, int rangeLength, boolean regExSearch){ >+ int matchCounter = 0; >+ >+ try { >+ >+ int firstMatch = -1; >+ int widgetOffset= modelOffset2WidgetOffset(rangeOffset); >+ if (widgetOffset == -1) >+ return -1; >+ >+ FindReplaceDocumentAdapter adapter= getFindReplaceDocumentAdapter(); >+ IRegion matchRegion; >+ int widgetPos= -1; >+ int length= 0; >+ while((matchRegion= adapter.find(widgetOffset, findString, true, caseSensitive, wholeWord, regExSearch)) != null) { >+ widgetPos= matchRegion.getOffset(); >+ length= matchRegion.getLength(); >+ >+ if(matchCounter == 0) firstMatch = widgetPos; >+ else { >+ if(firstMatch == widgetPos) >+ return matchCounter; >+ } >+ >+ int modelPos= widgetPos == -1 ? -1 : widgetOffset2ModelOffset(widgetPos); >+ >+ if (widgetPos != -1 && (modelPos < rangeOffset || modelPos + length > rangeOffset + rangeLength)) >+ widgetPos= -1; >+ >+ if (widgetPos > -1) { >+ >+ if(isAnnotatible()){ >+ AnnotationModel model = (AnnotationModel) ((ISourceViewer) TextViewer.this).getAnnotationModel(); >+ Annotation findAnnotation = new Annotation("org.eclipse.search.results",true,adapter.subSequence(widgetPos, widgetPos+length-1).toString()); //$NON-NLS-1$ >+ Position position = new Position(widgetPos,length); >+ model.addAnnotation(findAnnotation, position); >+ } >+ else { >+ // TODO Add raw highlighing for targets that don't support annotations >+// Color highlight = new Color(getTextWidget().getDisplay(),255,0,0); >+// setTextColor(highlight, widgetPos, length, false); >+ return 0; >+ } >+ >+ matchCounter++; >+ >+ widgetOffset = widgetPos + length; >+ } >+ >+ else break; >+ } >+ >+ >+ } catch (BadLocationException x) { >+ if (TRACE_ERRORS) >+ System.out.println(JFaceTextMessages.getString("TextViewer.error.bad_location.findAndSelect")); //$NON-NLS-1$ >+ } >+ >+ return matchCounter; >+ } > > } >Index: src/org/eclipse/jface/text/IFindReplaceTargetExtension4.java >=================================================================== >RCS file: src/org/eclipse/jface/text/IFindReplaceTargetExtension4.java >diff -N src/org/eclipse/jface/text/IFindReplaceTargetExtension4.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/jface/text/IFindReplaceTargetExtension4.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,42 @@ >+/******************************************************************************* >+ * Copyright (c) 2000, 2007 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: >+ * Cagatay Calli - initial API and implementation (https://bugs.eclipse.org/bugs/show_bug.cgi?id=29692) >+ *******************************************************************************/ >+ >+package org.eclipse.jface.text; >+ >+/** >+ * Extension interface for {@link org.eclipse.jface.text.IFindReplaceTarget}. >+ * <p> >+ * Extends the find replace target to add "highlight all" functionality. >+ * >+ * @since 3.4 >+ */ >+public interface IFindReplaceTargetExtension4 { >+ /** >+ * Finds and highlights all occurrences of the user's findString. >+ * Returns the number of all occurrences. >+ * >+ * @param findString the string to search for >+ * @param caseSensitive should the search be case sensitive >+ * @param wholeWord does the search string represent a complete word >+ * @param regExSearch if <code>true</code> findString represents a regular expression >+ * @return number of occurrences >+ * >+ * @since 3.4 >+ */ >+ int highlightAll(String findString, boolean caseSensitive, boolean wholeWord, boolean regExSearch); >+ >+ /** >+ * Clears all highlights and corresponding annotations. >+ * >+ * @since 3.4 >+ */ >+ void clearHighlights(); >+} >#P org.eclipse.ui.workbench.texteditor >Index: src/org/eclipse/ui/texteditor/FindReplaceDialog.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceDialog.java,v >retrieving revision 1.71 >diff -u -r1.71 FindReplaceDialog.java >--- src/org/eclipse/ui/texteditor/FindReplaceDialog.java 15 Jul 2007 14:32:09 -0000 1.71 >+++ src/org/eclipse/ui/texteditor/FindReplaceDialog.java 19 Jul 2007 14:41:26 -0000 >@@ -7,6 +7,7 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Cagatay Calli - https://bugs.eclipse.org/bugs/show_bug.cgi?id=29692 > *******************************************************************************/ > package org.eclipse.ui.texteditor; > >@@ -16,6 +17,19 @@ > import java.util.Set; > import java.util.regex.PatternSyntaxException; > >+import org.eclipse.jface.dialogs.Dialog; >+import org.eclipse.jface.dialogs.IDialogSettings; >+import org.eclipse.jface.fieldassist.ComboContentAdapter; >+import org.eclipse.jface.fieldassist.FieldDecoration; >+import org.eclipse.jface.fieldassist.FieldDecorationRegistry; >+import org.eclipse.jface.resource.JFaceColors; >+import org.eclipse.jface.text.IFindReplaceTarget; >+import org.eclipse.jface.text.IFindReplaceTargetExtension; >+import org.eclipse.jface.text.IFindReplaceTargetExtension3; >+import org.eclipse.jface.text.IFindReplaceTargetExtension4; >+import org.eclipse.jface.text.IRegion; >+import org.eclipse.jface.text.Region; >+import org.eclipse.jface.text.TextUtilities; > import org.eclipse.swt.SWT; > import org.eclipse.swt.custom.BusyIndicator; > import org.eclipse.swt.events.ModifyEvent; >@@ -36,21 +50,6 @@ > import org.eclipse.swt.widgets.Group; > import org.eclipse.swt.widgets.Label; > import org.eclipse.swt.widgets.Shell; >- >-import org.eclipse.jface.dialogs.Dialog; >-import org.eclipse.jface.dialogs.IDialogSettings; >-import org.eclipse.jface.fieldassist.ComboContentAdapter; >-import org.eclipse.jface.fieldassist.FieldDecoration; >-import org.eclipse.jface.fieldassist.FieldDecorationRegistry; >-import org.eclipse.jface.resource.JFaceColors; >- >-import org.eclipse.jface.text.IFindReplaceTarget; >-import org.eclipse.jface.text.IFindReplaceTargetExtension; >-import org.eclipse.jface.text.IFindReplaceTargetExtension3; >-import org.eclipse.jface.text.IRegion; >-import org.eclipse.jface.text.Region; >-import org.eclipse.jface.text.TextUtilities; >- > import org.eclipse.ui.IEditorPart; > import org.eclipse.ui.IWorkbenchPage; > import org.eclipse.ui.IWorkbenchWindow; >@@ -203,6 +202,12 @@ > */ > private boolean fGiveFocusToFindField= true; > >+ /** >+ * "Highlight All" toggle button >+ * @since 3.4 >+ */ >+ private Button fHighlightAllButton; >+ > > /** > * Creates a new dialog with the given shell as parent. >@@ -341,11 +346,38 @@ > > // Make the all the buttons the same size as the Remove Selection button. > fReplaceAllButton.setEnabled(isEditable()); >+ >+ fHighlightAllButton = new Button(panel,SWT.TOGGLE); >+ fHighlightAllButton.setText("Highlight All"); //$NON-NLS-1$ >+ fHighlightAllButton.setSelection(false); >+ fHighlightAllButton.addSelectionListener(new SelectionAdapter(){ >+ public void widgetSelected(SelectionEvent e){ >+ if(fHighlightAllButton.getSelection()){ >+ performHighlightAll(); >+ updateFindHistory(); >+ } >+ else { >+ clearHighlights(); >+ } >+ } >+ }); >+ setGridData(fHighlightAllButton, SWT.FILL, true, SWT.FILL, false); > > return panel; > } > > /** >+ * Clears all highlights and corresponding annotations. >+ * >+ * @since 3.4 >+ */ >+ private void clearHighlights() { >+ if(fTarget instanceof IFindReplaceTargetExtension4){ >+ ((IFindReplaceTargetExtension4) fTarget).clearHighlights(); >+ } >+ } >+ >+ /** > * Creates the options configuration section of the find replace dialog. > * > * @param parent the parent composite >@@ -947,7 +979,9 @@ > * Removes focus changed listener from browser and stores settings for re-open. > */ > private void handleDialogClose() { >- >+ // clear highlights >+ clearHighlights(); >+ > // remove listeners > if (okToUse(fFindField)) { > fFindField.removeModifyListener(fFindModifyListener); >@@ -1827,4 +1861,38 @@ > settings.put(sectionName, names); > > } >+ >+ /** >+ * Highlights all occurrences of the user's findString >+ * in the text of the target. >+ * >+ * @since 3.4 >+ */ >+ private void performHighlightAll() { >+ >+ String findString= getFindString(); >+ int matchCount; >+ >+ if(!(fTarget instanceof IFindReplaceTargetExtension4)) return; >+ >+ if (findString != null && findString.length() > 0) { >+ >+ try { >+ matchCount= ((IFindReplaceTargetExtension4) fTarget).highlightAll(findString, isCaseSensitiveSearch(), isWholeWordSearch(), isRegExSearchAvailableAndChecked()); >+ >+ if (matchCount != 0) { >+ String msg= " match(es) are highlighted"; //$NON-NLS-1$ >+ msg= String.valueOf(matchCount) + msg; >+ statusMessage(msg); >+ } else { >+ statusMessage(EditorMessages.FindReplace_Status_noMatch_label); >+ } >+ } catch (PatternSyntaxException ex) { >+ statusError(ex.getLocalizedMessage()); >+ } catch (IllegalStateException ex) { >+ // we don't keep state in this dialog >+ } >+ } >+ writeSelection(); >+ } > } >Index: src/org/eclipse/ui/texteditor/FindReplaceTarget.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceTarget.java,v >retrieving revision 1.12 >diff -u -r1.12 FindReplaceTarget.java >--- src/org/eclipse/ui/texteditor/FindReplaceTarget.java 20 Jun 2007 14:30:51 -0000 1.12 >+++ src/org/eclipse/ui/texteditor/FindReplaceTarget.java 19 Jul 2007 14:41:26 -0000 >@@ -7,6 +7,7 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Cagatay Calli - https://bugs.eclipse.org/bugs/show_bug.cgi?id=29692 > *******************************************************************************/ > package org.eclipse.ui.texteditor; > >@@ -16,6 +17,7 @@ > import org.eclipse.jface.text.IFindReplaceTarget; > import org.eclipse.jface.text.IFindReplaceTargetExtension; > import org.eclipse.jface.text.IFindReplaceTargetExtension3; >+import org.eclipse.jface.text.IFindReplaceTargetExtension4; > import org.eclipse.jface.text.IRegion; > > >@@ -23,7 +25,7 @@ > * Internal find/replace target wrapping the editor's source viewer. > * @since 2.1 > */ >-class FindReplaceTarget implements IFindReplaceTarget, IFindReplaceTargetExtension, IFindReplaceTargetExtension2, IFindReplaceTargetExtension3 { >+class FindReplaceTarget implements IFindReplaceTarget, IFindReplaceTargetExtension, IFindReplaceTargetExtension2, IFindReplaceTargetExtension3, IFindReplaceTargetExtension4 { > > /** The editor */ > private AbstractTextEditor fEditor; >@@ -219,4 +221,19 @@ > public boolean validateTargetState() { > return fEditor.validateEditorInputState(); > } >+ >+ /* >+ * @see org.eclipse.jface.text.IFindReplaceTargetExtension4#highlightAll(String, boolean, boolean, boolean) >+ */ >+ public int highlightAll(String findString, boolean caseSensitive, >+ boolean wholeWord, boolean regExSearch) { >+ return ((IFindReplaceTargetExtension4) fTarget).highlightAll(findString, caseSensitive, wholeWord, regExSearch); >+ } >+ >+ /* >+ * @see org.eclipse.jface.text.IFindReplaceTargetExtension4#clearHighlights() >+ */ >+ public void clearHighlights() { >+ ((IFindReplaceTargetExtension4) fTarget).clearHighlights(); >+ } > }
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 29692
:
33046
|
74001
|
74158
|
74197
|
74294
|
74295
|
74445
|
74447
|
74449
|
74801
|
264257