[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [cdt-patch] Open Declarations UI/Responsiveness improvement
|
Bogdan Gheorghe <gheorghe@xxxxxxxxxx> said:
>
> Thomas -
>
> Can you update and resend this? I tried applying this to both 1.2 and
> head (after updating both) and got a bunch of "no matches".
I've re-attached the patch. Let me know if it makes it this time.
Thanks,
Thomas
> "Thomas Fletcher" <thomasf@xxxxxxx>
> Sent by: cdt-patch-admin@xxxxxxxxxxx
>
>
> 02/03/2004 11:08 AM
>
>
> Please respond to
> cdt-patch@xxxxxxxxxxx
>
>
> To
> <cdt-patch@xxxxxxxxxxx>
>
> cc
>
> Subject
> [cdt-patch] Open Declarations UI/Responsiveness improvement
>
>
>
>
>
>
>
>
> Folks,
>
> This patch addresses two issues with the Open Declarations action
> accessible from the editor right click menu.
>
> The first issue concerns the lack of user feedback when the action is
> kicked off. It is often possible with large projects that this action
> could take a long time during which the user is provided with no
> feedback.
> This patch moves the search into a runnable object which can be
> displayed
> with a progress monitor. This requires that the
> BasicSearchResultCollector()
> class be patched to have an additional constructor which takes an
> IProgressMonitor object. The upside of this is that the user can also
> now cancel the action if it is taking too long.
>
> The second issue is also that this action should only enable itself when
> it is truly able to run. This is a small enhancement compared to the
> above change.
>
> This patch looks nasty ... but really it isn't. There ended up just
> being a bunch of code moving around internally in the class =;-) The
> patches were taken against the 1.2 stream, but should be applicable to
> both the head and the 1.2 stream.
>
> Thanks,
> Thomas
>
> ChangeLogs
> - Allow construction of the BasicSearchResultCollector using an
> IProgressMonitor object.
>
> - Update the OpenDeclarations action to be enable/disable based on the
> situation and present the user with a dialog when the action is taking
> place.
>
> --- PATCH START - BasicSearchResultCollector ---
> Index:
> search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> ===================================================================
> RCS
> file:
> /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/Bas
> icSearchResultCollector.java,v
> retrieving revision 1.8
> diff -u -r1.8 BasicSearchResultCollector.java
> --- search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> 23
> Sep 2003 13:54:21 -0000 1.8
> +++ search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> 3
> Feb 2004 15:01:00 -0000
> @@ -53,6 +53,14 @@
> * Window>Preferences>Java>Code Generation>Code and Comments
> */
> public class BasicSearchResultCollector implements
> ICSearchResultCollector {
> + IProgressMonitor fProgressMonitor = null;
> +
> + public BasicSearchResultCollector() {
> + }
> +
> + public BasicSearchResultCollector(IProgressMonitor
> monitor) {
> + fProgressMonitor = monitor;
> + }
>
> public void aboutToStart() {
> results = new HashSet();
> @@ -62,7 +70,7 @@
> }
>
> public IProgressMonitor getProgressMonitor() {
> - return null;
> + return fProgressMonitor;
> }
>
> public IMatch createMatch(Object fileResource, int
> start, int end,
> ISourceElementCallbackDelegate node ) throws CoreException
> --- PATCH START - OpenDeclarations ---
> Index:
> src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java
> ===================================================================
> RCS
> file:
> /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/O
> penDeclarationsAction.java,v
> retrieving revision 1.2.2.2
> diff -u -r1.2.2.2 OpenDeclarationsAction.java
> --- src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java
> 11
> Nov 2003 18:28:20 -0000 1.2.2.2
> +++ src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java
> 3
> Feb 2004 14:48:50 -0000
> @@ -23,9 +23,10 @@
> import org.eclipse.cdt.ui.CSearchResultLabelProvider;
> import org.eclipse.cdt.ui.CUIPlugin;
> import org.eclipse.cdt.ui.IWorkingCopyManager;
> -import org.eclipse.core.resources.IFile;
> -import org.eclipse.core.resources.IProject;
> +import org.eclipse.core.runtime.IProgressMonitor;
> import org.eclipse.jface.action.Action;
> +import org.eclipse.jface.dialogs.ProgressMonitorDialog;
> +import org.eclipse.jface.operation.IRunnableWithProgress;
> import org.eclipse.jface.resource.ImageDescriptor;
> import org.eclipse.jface.text.BadLocationException;
> import org.eclipse.jface.text.IDocument;
> @@ -35,6 +36,7 @@
> import org.eclipse.ui.IEditorPart;
> import org.eclipse.ui.PartInitException;
> import org.eclipse.ui.texteditor.IDocumentProvider;
> +import org.eclipse.ui.texteditor.IUpdate;
>
> /**
> * This action opens a java CEditor on the element represented by text
> selection of
> @@ -42,12 +44,11 @@
> *
> * Use action from package org.eclipse.jdt.ui.actions
> */
> -public class OpenDeclarationsAction extends Action {
> +public class OpenDeclarationsAction extends Action implements IUpdate {
>
> private String fDialogTitle;
> private String fDialogMessage;
> protected CEditor fEditor;
> - BasicSearchResultCollector resultCollector = null;
> SearchEngine searchEngine = null;
>
> /**
> @@ -63,7 +64,6 @@
>
> setDialogMessage(CEditorMessages.getString
> ("OpenDeclarations.dialog.message")); //$NON-NLS-1$
>
> searchEngine = new SearchEngine();
> - resultCollector = new
> BasicSearchResultCollector();
> }
>
> /**
> @@ -93,66 +93,86 @@
> public void setContentEditor(CEditor editor) {
>
> fEditor= editor;
> }
> +
> + /**
> + * Return the selected string from the editor
> + * @return The string currently selected, or null if
> there is no
> valid selection
> + */
> + protected String getSelectedStringFromEditor() {
> + if (fEditor.getSelectionProvider() ==
> null) {
> + return null;
> + }
> +
> + try {
> + ITextSelection
> selection= (ITextSelection)
> fEditor.getSelectionProvider().getSelection();
> + String sel =
> selection.getText();
> + if (sel.equals(""))
> + {
> + int
> selStart = selection.getOffset();
> +
> +
> IDocumentProvider prov =
> fEditor.getDocumentProvider();
> +
> IDocument doc = prov.getDocument
> (fEditor.getEditorInput());
> + sel
> = getSelection(doc, selStart);
> + }
> + return sel;
> + } catch(Exception x) {
> + return null;
> + }
> + }
>
> /**
> * @see IAction#actionPerformed
> */
> public void run() {
> -
> - IWorkingCopyManager fManager =
> CUIPlugin.getDefault
> ().getWorkingCopyManager();
> - ITranslationUnit unit =
> fManager.getWorkingCopy
> (fEditor.getEditorInput());
> -
> - if (fEditor.getSelectionProvider() !=
> null) {
> - ITextSelection
> selection= (ITextSelection)
> fEditor.getSelectionProvider().getSelection();
> - try {
> -
> ArrayList elementsFound = new ArrayList();
> -
> String sel = selection.getText();
> - if
> (sel.equals(""))
> - {
> -
> int selStart = selection.getOffset
> ();
> -
>
> -
> IDocumentProvider prov =
> fEditor.getDocumentProvider();
> -
> IDocument doc = prov.getDocument
> (fEditor.getEditorInput());
> -
> sel = getSelection(doc, selStart);
> - }
> -
> -
> IFile file = fEditor.getInputFile();
> -
> if(file == null)
> -
> return;
> -
> IProject project = file.getProject();
> -
> if(project == null)
> -
> return;
> -
> + final String selectedText =
> getSelectedStringFromEditor();
> +
> + if(selectedText == null) {
> + return;
> + }
> +
> + final ArrayList elementsFound = new
> ArrayList();
> +
> + IRunnableWithProgress runnable = new
> IRunnableWithProgress()
> {
> + public void
> run(IProgressMonitor monitor) {
> +
> BasicSearchResultCollector resultCollector
> = new BasicSearchResultCollector(monitor);
> +
> IWorkingCopyManager fManager =
> CUIPlugin.getDefault().getWorkingCopyManager();
> +
> ITranslationUnit unit =
> fManager.getWorkingCopy(fEditor.getEditorInput());
> +
>
> ICElement[] projectScopeElement = new
> ICElement[1];
>
> projectScopeElement[0] = unit.getCProject
> ();//(ICElement)currentScope.getCProject();
>
> ICSearchScope scope =
> SearchEngine.createCSearchScope(projectScopeElement, true);
>
> OrPattern orPattern = new OrPattern();
> //
> search for global variables, functions,
> classes, structs, unions, enums and macros
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.VAR,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.FUNCTION,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.METHOD,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.TYPE,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.ENUM,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.FIELD,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.NAMESPACE,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.MACRO,
> ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern
> (SearchEngine.createSearchPattern( sel, ICSearchConstants.TYPEDEF,
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText, ICSearchConstants.VAR,
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.FUNCTION,
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.METHOD,
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText, ICSearchConstants.TYPE,
>
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText, ICSearchConstants.ENUM,
>
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.FIELD,
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.NAMESPACE, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.MACRO,
> ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern
> (SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.TYPEDEF,
> ICSearchConstants.DECLARATIONS, true ));
>
> searchEngine.search(CUIPlugin.getWorkspace
> (), orPattern, scope, resultCollector, true);
> -
> elementsFound.addAll
> (resultCollector.getSearchResults());
> -
> - if
> (elementsFound.isEmpty() == false) {
> -
> IMatch selected= selectCElement
> (elementsFound, getShell(), fDialogTitle, fDialogMessage);
> -
> if (selected != null) {
> -
> open(selected);
> -
> return;
> -
> }
> - }
> - } catch
> (Exception x) {
> -
> CUIPlugin.getDefault().log(x);
> +
> elementsFound.addAll
> (resultCollector.getSearchResults());
> }
> - }
> + };
>
> - getShell().getDisplay().beep();
>
> + try {
> +
> ProgressMonitorDialog progressMonitor = new
> ProgressMonitorDialog(getShell());
> +
> progressMonitor.run(true, true, runnable);
> +
> + if
> (elementsFound.isEmpty() == true) {
> +
> return;
> + }
> +
> + IMatch selected=
> selectCElement(elementsFound,
> getShell(), fDialogTitle, fDialogMessage);
> + if (selected !=
> null) {
> +
> open(selected);
> +
> return;
> + }
> + } catch(Exception x) {
> +
> CUIPlugin.getDefault().log(x);
> + }
> }
>
> protected Shell getShell() {
> @@ -247,5 +267,13 @@
>
> return selectedWord;
>
> }
> +
> + /* (non-Javadoc)
> + * @see org.eclipse.ui.texteditor.IUpdate#update()
> + */
> + public void update() {
> +
> setEnabled(getSelectedStringFromEditor() != null);
> + }
> +
> }
>
>
> --- PATCH END ---
> Index:
> search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> ===================================================================
> RCS file:
> /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/Basi
> cSearchResultCollector.java,v
> retrieving revision 1.8
> diff -u -r1.8 BasicSearchResultCollector.java
> --- search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> 23 Sep 2003 13:54:21 -0000 1.8
> +++ search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> 3 Feb 2004 15:01:00 -0000
> @@ -53,6 +53,14 @@
> * Window>Preferences>Java>Code Generation>Code and Comments
> */
> public class BasicSearchResultCollector implements
> ICSearchResultCollector {
> + IProgressMonitor fProgressMonitor = null;
> +
> + public BasicSearchResultCollector() {
> + }
> +
> + public BasicSearchResultCollector(IProgressMonitor
> monitor) {
> + fProgressMonitor = monitor;
> + }
>
> public void aboutToStart() {
> results = new HashSet();
> @@ -62,7 +70,7 @@
> }
>
> public IProgressMonitor getProgressMonitor() {
> - return null;
> + return fProgressMonitor;
> }
>
> public IMatch createMatch(Object fileResource, int
> start, int end, ISourceElementCallbackDelegate node ) throws
> CoreException
> Index:
> src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java
> ===================================================================
> RCS file:
> /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/Op
> enDeclarationsAction.java,v
> retrieving revision 1.2.2.2
> diff -u -r1.2.2.2 OpenDeclarationsAction.java
> --- src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java
> 11 Nov 2003 18:28:20 -0000 1.2.2.2
> +++ src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java
> 3 Feb 2004 14:48:50 -0000
> @@ -23,9 +23,10 @@
> import org.eclipse.cdt.ui.CSearchResultLabelProvider;
> import org.eclipse.cdt.ui.CUIPlugin;
> import org.eclipse.cdt.ui.IWorkingCopyManager;
> -import org.eclipse.core.resources.IFile;
> -import org.eclipse.core.resources.IProject;
> +import org.eclipse.core.runtime.IProgressMonitor;
> import org.eclipse.jface.action.Action;
> +import org.eclipse.jface.dialogs.ProgressMonitorDialog;
> +import org.eclipse.jface.operation.IRunnableWithProgress;
> import org.eclipse.jface.resource.ImageDescriptor;
> import org.eclipse.jface.text.BadLocationException;
> import org.eclipse.jface.text.IDocument;
> @@ -35,6 +36,7 @@
> import org.eclipse.ui.IEditorPart;
> import org.eclipse.ui.PartInitException;
> import org.eclipse.ui.texteditor.IDocumentProvider;
> +import org.eclipse.ui.texteditor.IUpdate;
>
> /**
> * This action opens a java CEditor on the element represented by text
> selection of
> @@ -42,12 +44,11 @@
> *
> * Use action from package org.eclipse.jdt.ui.actions
> */
> -public class OpenDeclarationsAction extends Action {
> +public class OpenDeclarationsAction extends Action implements IUpdate {
>
> private String fDialogTitle;
> private String fDialogMessage;
> protected CEditor fEditor;
> - BasicSearchResultCollector resultCollector = null;
> SearchEngine searchEngine = null;
>
> /**
> @@ -63,7 +64,6 @@
>
> setDialogMessage(CEditorMessages.getString("OpenDeclarations.dialog.mess
> age")); //$NON-NLS-1$
>
> searchEngine = new SearchEngine();
> - resultCollector = new
> BasicSearchResultCollector();
> }
>
> /**
> @@ -93,66 +93,86 @@
> public void setContentEditor(CEditor editor) {
>
> fEditor= editor;
> }
> +
> + /**
> + * Return the selected string from the editor
> + * @return The string currently selected, or null if
> there is no valid selection
> + */
> + protected String getSelectedStringFromEditor() {
> + if (fEditor.getSelectionProvider() ==
> null) {
> + return null;
> + }
> +
> + try {
> + ITextSelection
> selection= (ITextSelection)
> fEditor.getSelectionProvider().getSelection();
> + String sel =
> selection.getText();
> + if (sel.equals(""))
> + {
> + int
> selStart = selection.getOffset();
> +
> +
> IDocumentProvider prov = fEditor.getDocumentProvider();
> +
> IDocument doc = prov.getDocument(fEditor.getEditorInput());
> + sel
> = getSelection(doc, selStart);
> + }
> + return sel;
> + } catch(Exception x) {
> + return null;
> + }
> + }
>
> /**
> * @see IAction#actionPerformed
> */
> public void run() {
> -
> - IWorkingCopyManager fManager =
> CUIPlugin.getDefault().getWorkingCopyManager();
> - ITranslationUnit unit =
> fManager.getWorkingCopy(fEditor.getEditorInput());
> -
> - if (fEditor.getSelectionProvider() !=
> null) {
> - ITextSelection
> selection= (ITextSelection)
> fEditor.getSelectionProvider().getSelection();
> - try {
> -
> ArrayList elementsFound = new ArrayList();
> -
> String sel = selection.getText();
> - if
> (sel.equals(""))
> - {
> -
> int selStart = selection.getOffset();
> -
>
> -
> IDocumentProvider prov = fEditor.getDocumentProvider();
> -
> IDocument doc = prov.getDocument(fEditor.getEditorInput());
> -
> sel = getSelection(doc, selStart);
> - }
> -
> -
> IFile file = fEditor.getInputFile();
> -
> if(file == null)
> -
> return;
> -
> IProject project = file.getProject();
> -
> if(project == null)
> -
> return;
> -
> + final String selectedText =
> getSelectedStringFromEditor();
> +
> + if(selectedText == null) {
> + return;
> + }
> +
> + final ArrayList elementsFound = new
> ArrayList();
> +
> + IRunnableWithProgress runnable = new
> IRunnableWithProgress() {
> + public void
> run(IProgressMonitor monitor) {
> +
> BasicSearchResultCollector resultCollector = new
> BasicSearchResultCollector(monitor);
> +
> IWorkingCopyManager fManager =
> CUIPlugin.getDefault().getWorkingCopyManager();
> +
> ITranslationUnit unit =
> fManager.getWorkingCopy(fEditor.getEditorInput());
> +
>
> ICElement[] projectScopeElement = new ICElement[1];
>
> projectScopeElement[0] =
> unit.getCProject();//(ICElement)currentScope.getCProject();
>
> ICSearchScope scope =
> SearchEngine.createCSearchScope(projectScopeElement, true);
>
> OrPattern orPattern = new OrPattern();
> //
> search for global variables, functions, classes, structs, unions, enums
> and macros
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.VAR, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.FUNCTION, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.METHOD, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.TYPE, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.ENUM, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.FIELD, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.NAMESPACE, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.MACRO, ICSearchConstants.DECLARATIONS, true ));
> -
> orPattern.addPattern(SearchEngine.createSearchPattern( sel,
> ICSearchConstants.TYPEDEF, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.VAR, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.FUNCTION, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.METHOD, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.TYPE, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.ENUM, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.FIELD, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.NAMESPACE, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.MACRO, ICSearchConstants.DECLARATIONS, true ));
> +
> orPattern.addPattern(SearchEngine.createSearchPattern( selectedText,
> ICSearchConstants.TYPEDEF, ICSearchConstants.DECLARATIONS, true ));
>
> searchEngine.search(CUIPlugin.getWorkspace(), orPattern, scope,
> resultCollector, true);
> -
> elementsFound.addAll(resultCollector.getSearchResults());
> -
> - if
> (elementsFound.isEmpty() == false) {
> -
> IMatch selected= selectCElement(elementsFound, getShell(), fDialogTitle,
> fDialogMessage);
> -
> if (selected != null) {
> -
> open(selected);
> -
> return;
> -
> }
> - }
> - } catch
> (Exception x) {
> -
> CUIPlugin.getDefault().log(x);
> +
> elementsFound.addAll(resultCollector.getSearchResults());
>
> }
> - }
> + };
>
> - getShell().getDisplay().beep();
>
> + try {
> +
> ProgressMonitorDialog progressMonitor = new
> ProgressMonitorDialog(getShell());
> +
> progressMonitor.run(true, true, runnable);
> +
> + if
> (elementsFound.isEmpty() == true) {
> +
> return;
> + }
> +
> + IMatch selected=
> selectCElement(elementsFound, getShell(), fDialogTitle, fDialogMessage);
> + if (selected !=
> null) {
> +
> open(selected);
> +
> return;
> + }
> + } catch(Exception x) {
> +
> CUIPlugin.getDefault().log(x);
> + }
> }
>
> protected Shell getShell() {
> @@ -247,5 +267,13 @@
>
> return selectedWord;
>
> }
> +
> + /* (non-Javadoc)
> + * @see org.eclipse.ui.texteditor.IUpdate#update()
> + */
> + public void update() {
> +
> setEnabled(getSelectedStringFromEditor() != null);
> + }
> +
> }
>
>
>
>
--
Index: src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java,v
retrieving revision 1.2.2.2
diff -u -r1.2.2.2 OpenDeclarationsAction.java
--- src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java 11 Nov 2003 18:28:20 -0000 1.2.2.2
+++ src/org/eclipse/cdt/internal/ui/editor/OpenDeclarationsAction.java 3 Feb 2004 14:48:50 -0000
@@ -23,9 +23,10 @@
import org.eclipse.cdt.ui.CSearchResultLabelProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IWorkingCopyManager;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
@@ -35,6 +36,7 @@
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.IUpdate;
/**
* This action opens a java CEditor on the element represented by text selection of
@@ -42,12 +44,11 @@
*
* Use action from package org.eclipse.jdt.ui.actions
*/
-public class OpenDeclarationsAction extends Action {
+public class OpenDeclarationsAction extends Action implements IUpdate {
private String fDialogTitle;
private String fDialogMessage;
protected CEditor fEditor;
- BasicSearchResultCollector resultCollector = null;
SearchEngine searchEngine = null;
/**
@@ -63,7 +64,6 @@
setDialogMessage(CEditorMessages.getString("OpenDeclarations.dialog.message")); //$NON-NLS-1$
searchEngine = new SearchEngine();
- resultCollector = new BasicSearchResultCollector();
}
/**
@@ -93,66 +93,86 @@
public void setContentEditor(CEditor editor) {
fEditor= editor;
}
+
+ /**
+ * Return the selected string from the editor
+ * @return The string currently selected, or null if there is no valid selection
+ */
+ protected String getSelectedStringFromEditor() {
+ if (fEditor.getSelectionProvider() == null) {
+ return null;
+ }
+
+ try {
+ ITextSelection selection= (ITextSelection) fEditor.getSelectionProvider().getSelection();
+ String sel = selection.getText();
+ if (sel.equals(""))
+ {
+ int selStart = selection.getOffset();
+
+ IDocumentProvider prov = fEditor.getDocumentProvider();
+ IDocument doc = prov.getDocument(fEditor.getEditorInput());
+ sel = getSelection(doc, selStart);
+ }
+ return sel;
+ } catch(Exception x) {
+ return null;
+ }
+ }
/**
* @see IAction#actionPerformed
*/
public void run() {
-
- IWorkingCopyManager fManager = CUIPlugin.getDefault().getWorkingCopyManager();
- ITranslationUnit unit = fManager.getWorkingCopy(fEditor.getEditorInput());
-
- if (fEditor.getSelectionProvider() != null) {
- ITextSelection selection= (ITextSelection) fEditor.getSelectionProvider().getSelection();
- try {
- ArrayList elementsFound = new ArrayList();
- String sel = selection.getText();
- if (sel.equals(""))
- {
- int selStart = selection.getOffset();
-
- IDocumentProvider prov = fEditor.getDocumentProvider();
- IDocument doc = prov.getDocument(fEditor.getEditorInput());
- sel = getSelection(doc, selStart);
- }
-
- IFile file = fEditor.getInputFile();
- if(file == null)
- return;
- IProject project = file.getProject();
- if(project == null)
- return;
-
+ final String selectedText = getSelectedStringFromEditor();
+
+ if(selectedText == null) {
+ return;
+ }
+
+ final ArrayList elementsFound = new ArrayList();
+
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) {
+ BasicSearchResultCollector resultCollector = new BasicSearchResultCollector(monitor);
+ IWorkingCopyManager fManager = CUIPlugin.getDefault().getWorkingCopyManager();
+ ITranslationUnit unit = fManager.getWorkingCopy(fEditor.getEditorInput());
+
ICElement[] projectScopeElement = new ICElement[1];
projectScopeElement[0] = unit.getCProject();//(ICElement)currentScope.getCProject();
ICSearchScope scope = SearchEngine.createCSearchScope(projectScopeElement, true);
OrPattern orPattern = new OrPattern();
// search for global variables, functions, classes, structs, unions, enums and macros
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.VAR, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.FUNCTION, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.METHOD, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.TYPE, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.ENUM, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.FIELD, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.NAMESPACE, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.MACRO, ICSearchConstants.DECLARATIONS, true ));
- orPattern.addPattern(SearchEngine.createSearchPattern( sel, ICSearchConstants.TYPEDEF, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.VAR, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.FUNCTION, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.METHOD, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.TYPE, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.ENUM, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.FIELD, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.NAMESPACE, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.MACRO, ICSearchConstants.DECLARATIONS, true ));
+ orPattern.addPattern(SearchEngine.createSearchPattern( selectedText, ICSearchConstants.TYPEDEF, ICSearchConstants.DECLARATIONS, true ));
searchEngine.search(CUIPlugin.getWorkspace(), orPattern, scope, resultCollector, true);
- elementsFound.addAll(resultCollector.getSearchResults());
-
- if (elementsFound.isEmpty() == false) {
- IMatch selected= selectCElement(elementsFound, getShell(), fDialogTitle, fDialogMessage);
- if (selected != null) {
- open(selected);
- return;
- }
- }
- } catch (Exception x) {
- CUIPlugin.getDefault().log(x);
+ elementsFound.addAll(resultCollector.getSearchResults());
}
- }
+ };
- getShell().getDisplay().beep();
+ try {
+ ProgressMonitorDialog progressMonitor = new ProgressMonitorDialog(getShell());
+ progressMonitor.run(true, true, runnable);
+
+ if (elementsFound.isEmpty() == true) {
+ return;
+ }
+
+ IMatch selected= selectCElement(elementsFound, getShell(), fDialogTitle, fDialogMessage);
+ if (selected != null) {
+ open(selected);
+ return;
+ }
+ } catch(Exception x) {
+ CUIPlugin.getDefault().log(x);
+ }
}
protected Shell getShell() {
@@ -247,5 +267,13 @@
return selectedWord;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.texteditor.IUpdate#update()
+ */
+ public void update() {
+ setEnabled(getSelectedStringFromEditor() != null);
+ }
+
}