From 897e40ab49087c65320ad0f5a4856c639d6d6a77 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Wed, 18 Nov 2009 14:28:03 +0000 Subject: [PATCH] Bug 290499 - Generating Getter, Setter and Implementing Methods should by available through the Outline context menus Patch by Marc-Andre Laperle --- .../ui/editor/AbstractCModelOutlinePage.java | 20 +++++++ .../ui/editor/CContentOutlinePage.java | 7 +++ .../cdt/ui/actions/GenerateActionGroup.java | 53 ++++++++++++++++--- 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AbstractCModelOutlinePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AbstractCModelOutlinePage.java index 5d18f10cd14..736469ca0ea 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AbstractCModelOutlinePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AbstractCModelOutlinePage.java @@ -253,6 +253,7 @@ public abstract class AbstractCModelOutlinePage extends Page implements IContent private ActionGroup fMemberFilterActionGroup; private ActionGroup fSelectionSearchGroup; private ActionGroup fRefactoringActionGroup; + private ActionGroup fSourceActionGroup; private ActionGroup fOpenViewActionGroup; /** * Custom filter action group. @@ -403,6 +404,10 @@ public abstract class AbstractCModelOutlinePage extends Page implements IContent fSelectionSearchGroup.fillContextMenu(menu); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } + + if (fSourceActionGroup != null) { + fSourceActionGroup.fillContextMenu(menu); + } if (fRefactoringActionGroup != null) { fRefactoringActionGroup.fillContextMenu(menu); @@ -464,6 +469,7 @@ public abstract class AbstractCModelOutlinePage extends Page implements IContent fSelectionSearchGroup = createSearchActionGroup(); fOpenViewActionGroup = createOpenViewActionGroup(); + fSourceActionGroup = createSourceActionGroup(); fRefactoringActionGroup= createRefactoringActionGroup(); // Custom filter group fCustomFiltersActionGroup= createCustomFiltersActionGroup(); @@ -587,6 +593,15 @@ public abstract class AbstractCModelOutlinePage extends Page implements IContent // default: no refactoring actions return null; } + + /** + * @return an ActionGroup contributing source actions or + * null if source actions are not supported + */ + protected ActionGroup createSourceActionGroup() { + // default: no source actions + return null; + } /** * @return an ActionGroup instance to provide custom filters or @@ -628,6 +643,11 @@ public abstract class AbstractCModelOutlinePage extends Page implements IContent fRefactoringActionGroup.setContext(new ActionContext(selection)); fRefactoringActionGroup.updateActionBars(); } + + if (fSourceActionGroup != null) { + fSourceActionGroup.setContext(new ActionContext(selection)); + fSourceActionGroup.updateActionBars(); + } } @Override diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinePage.java index d4db9157a48..9e3cbfc34de 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CContentOutlinePage.java @@ -27,6 +27,7 @@ import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup; +import org.eclipse.cdt.ui.actions.GenerateActionGroup; import org.eclipse.cdt.ui.actions.MemberFilterActionGroup; import org.eclipse.cdt.ui.actions.OpenViewActionGroup; import org.eclipse.cdt.ui.refactoring.actions.CRefactoringActionGroup; @@ -134,6 +135,12 @@ public class CContentOutlinePage extends AbstractCModelOutlinePage { protected ActionGroup createRefactoringActionGroup() { return new CRefactoringActionGroup(this); } + + + @Override + protected ActionGroup createSourceActionGroup() { + return new GenerateActionGroup(this); + } @Override protected ActionGroup createCustomFiltersActionGroup() { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java index d17549b3031..274e1d50ff3 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/actions/GenerateActionGroup.java @@ -25,6 +25,7 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchCommandConstants; @@ -38,8 +39,12 @@ import org.eclipse.ui.ide.IDEActionFactory; import org.eclipse.ui.part.Page; import org.eclipse.ui.texteditor.ITextEditorActionConstants; import org.eclipse.ui.texteditor.IUpdate; + +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.ui.refactoring.actions.GettersAndSettersAction; import org.eclipse.cdt.ui.refactoring.actions.ImplementMethodAction; +import org.eclipse.cdt.ui.refactoring.actions.RefactoringAction; import org.eclipse.cdt.internal.ui.IContextMenuConstants; import org.eclipse.cdt.internal.ui.actions.ActionMessages; @@ -59,7 +64,7 @@ import org.eclipse.cdt.internal.ui.editor.ICEditorActionDefinitionIds; * @noextend This class is not intended to be subclassed by clients. * @since 4.0 */ -public class GenerateActionGroup extends ActionGroup { +public class GenerateActionGroup extends ActionGroup implements ISelectionChangedListener { /** * Pop-up menu: id of the source sub menu (value org.eclipse.cdt.ui.source.menu). @@ -106,6 +111,7 @@ public class GenerateActionGroup extends ActionGroup { private IWorkbenchSite fSite; private String fGroupName= IContextMenuConstants.GROUP_REORGANIZE; private List fRegisteredSelectionListeners; + private List fRefactorActions= new ArrayList(); private AddIncludeOnSelectionAction fAddInclude; // private OverrideMethodsAction fOverrideMethods; @@ -234,9 +240,16 @@ public class GenerateActionGroup extends ActionGroup { // fOverrideMethods= new OverrideMethodsAction(site); // fOverrideMethods.setActionDefinitionId(ICEditorActionDefinitionIds.OVERRIDE_METHODS); // -// fAddGetterSetter= new AddGetterSetterAction(site); -// fAddGetterSetter.setActionDefinitionId(ICEditorActionDefinitionIds.CREATE_GETTER_SETTER); -// + fAddGetterSetter = new GettersAndSettersAction(); + fAddGetterSetter.setActionDefinitionId(ICEditorActionDefinitionIds.GETTERS_AND_SETTERS); + fAddGetterSetter.setSite(fSite); + fRefactorActions.add(fAddGetterSetter); + + fImplementMethod = new ImplementMethodAction(); + fImplementMethod.setActionDefinitionId(ICEditorActionDefinitionIds.IMPLEMENT_METHOD); + fImplementMethod.setSite(fSite); + fRefactorActions.add(fImplementMethod); + // fAddDelegateMethods= new AddDelegateMethodsAction(site); // fAddDelegateMethods.setActionDefinitionId(ICEditorActionDefinitionIds.CREATE_DELEGATE_METHODS); // @@ -275,7 +288,6 @@ public class GenerateActionGroup extends ActionGroup { // fOverrideMethods.update(selection); -// fAddGetterSetter.update(selection); // fAddDelegateMethods.update(selection); // fAddUnimplementedConstructors.update(selection); // fGenerateConstructorUsingFields.update(selection); @@ -297,7 +309,6 @@ public class GenerateActionGroup extends ActionGroup { } // registerSelectionListener(provider, fOverrideMethods); -// registerSelectionListener(provider, fAddGetterSetter); // registerSelectionListener(provider, fAddDelegateMethods); // registerSelectionListener(provider, fAddUnimplementedConstructors); // registerSelectionListener(provider, fGenerateConstructorUsingFields); @@ -312,6 +323,9 @@ public class GenerateActionGroup extends ActionGroup { registerSelectionListener(provider, fAddTaskAction); // registerSelectionListener(provider, fCleanUp); + selectionChanged(new SelectionChangedEvent(provider, selection)); + registerSelectionListener(provider, this); + installQuickAccessAction(); } @@ -509,5 +523,30 @@ public class GenerateActionGroup extends ActionGroup { private boolean isEditorOwner() { return fEditor != null; - } + } + + private ICElement getCElement(ISelection selection) { + if (selection instanceof IStructuredSelection) { + IStructuredSelection ss = (IStructuredSelection) selection; + if (ss.size() == 1) { + Object o = ss.getFirstElement(); + if (o instanceof ICElement && o instanceof ISourceReference) { + return (ICElement) o; + } + } + } + return null; + } + + /** + * {@inheritDoc} + * @since 5.2 + * @noreference This method is not intended to be referenced by clients. + */ + public void selectionChanged(SelectionChangedEvent event) { + ICElement celem = getCElement(event.getSelection()); + for (RefactoringAction action : fRefactorActions) { + action.updateSelection(celem); + } + } }