/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Mateusz Matela <mateusz.matela@gmail.com> - [code manipulation] [dcr] toString() builder wizard - https://bugs.eclipse.org/bugs/show_bug.cgi?id=26070 *******************************************************************************/ package org.eclipse.imp.editor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; 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.ui.IActionBars; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.actions.ActionGroup; import org.eclipse.ui.handlers.IHandlerActivation; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.part.Page; import org.eclipse.ui.texteditor.IUpdate; /** * Action group that adds the source and generate actions to a part's context * menu and installs handlers for the corresponding global menu actions. * * <p> * This class may be instantiated; it is not intended to be subclassed. * </p> * * @since 2.0 * * @noextend This class is not intended to be subclassed by clients. */ public class GenerateActionGroup extends ActionGroup { /** * Pop-up menu: id of the source sub menu (value <code>org.eclipse.imp.source.menu</code>). * * @since 3.0 */ public static final String MENU_ID= "org.eclipse.imp.source.menu"; //$NON-NLS-1$ /** * Pop-up menu: id of the import group of the source sub menu (value * <code>importGroup</code>). * * @since 3.0 */ public static final String GROUP_IMPORT= "importGroup"; //$NON-NLS-1$ /** * Pop-up menu: id of the generate group of the source sub menu (value * <code>generateGroup</code>). * * @since 3.0 */ public static final String GROUP_GENERATE= "generateGroup"; //$NON-NLS-1$ /** * Pop-up menu: id of the code group of the source sub menu (value * <code>codeGroup</code>). * * @since 3.0 */ public static final String GROUP_CODE= "codeGroup"; //$NON-NLS-1$ /** * Pop-up menu: id of the externalize group of the source sub menu (value * <code>externalizeGroup</code>). * * TODO: Make API */ private static final String GROUP_EXTERNALIZE= "externalizeGroup"; //$NON-NLS-1$ /** * Pop-up menu: id of the comment group of the source sub menu (value * <code>commentGroup</code>). * * TODO: Make API */ private static final String GROUP_COMMENT= "commentGroup"; //$NON-NLS-1$ /** * Pop-up menu: id of the edit group of the source sub menu (value * <code>editGroup</code>). * * TODO: Make API */ private static final String GROUP_EDIT= "editGroup"; //$NON-NLS-1$ private UniversalEditor fEditor; private IWorkbenchSite fSite; private String fGroupName= IWorkbenchActionConstants.GROUP_REORGANIZE; private List fRegisteredSelectionListeners; // private AddImportOnSelectionAction fAddImport; // private OverrideMethodsAction fOverrideMethods; // private GenerateHashCodeEqualsAction fHashCodeEquals; // private GenerateToStringAction fToString; // private AddGetterSetterAction fAddGetterSetter; // private AddDelegateMethodsAction fAddDelegateMethods; // private AddUnimplementedConstructorsAction fAddUnimplementedConstructors; // private GenerateNewConstructorUsingFieldsAction fGenerateConstructorUsingFields; // private AddJavaDocStubAction fAddJavaDocStub; // private AddBookmarkAction fAddBookmark; // private AddTaskAction fAddTaskAction; // private ExternalizeStringsAction fExternalizeStrings; // private AllCleanUpsAction fCleanUp; // private FindBrokenNLSKeysAction fFindNLSProblems; // // private OrganizeImportsAction fOrganizeImports; // private MultiSortMembersAction fSortMembers; // private FormatAllAction fFormatAll; private static final String QUICK_MENU_ID= "org.eclipse.imp.source.quickMenu"; //$NON-NLS-1$ private IHandlerActivation fQuickAccessHandlerActivation; private IHandlerService fHandlerService; private final ISelectionProvider fSelectionProvider; /** * Note: This constructor is for internal use only. Clients should not call this constructor. * @param editor the compilation unit editor * @param groupName the group name to add the action to * * @noreference This constructor is not intended to be referenced by clients. */ public GenerateActionGroup(UniversalEditor editor, String groupName) { fSite= editor.getSite(); fSelectionProvider= fSite.getSelectionProvider(); fEditor= editor; fGroupName= groupName; // fAddImport= new AddImportOnSelectionAction(editor); // fAddImport.setActionDefinitionId(IJavaEditorActionDefinitionIds.ADD_IMPORT); // fAddImport.update(); // editor.setAction("AddImport", fAddImport); //$NON-NLS-1$ // // fOrganizeImports= new OrganizeImportsAction(editor); // fOrganizeImports.setActionDefinitionId(IJavaEditorActionDefinitionIds.ORGANIZE_IMPORTS); // editor.setAction("OrganizeImports", fOrganizeImports); //$NON-NLS-1$ // // fSortMembers= new MultiSortMembersAction(editor); // fSortMembers.setActionDefinitionId(IJavaEditorActionDefinitionIds.SORT_MEMBERS); // editor.setAction("SortMembers", fSortMembers); //$NON-NLS-1$ // // fOverrideMethods= new OverrideMethodsAction(editor); // fOverrideMethods.setActionDefinitionId(IJavaEditorActionDefinitionIds.OVERRIDE_METHODS); // editor.setAction("OverrideMethods", fOverrideMethods); //$NON-NLS-1$ // // fAddGetterSetter= new AddGetterSetterAction(editor); // fAddGetterSetter.setActionDefinitionId(IJavaEditorActionDefinitionIds.CREATE_GETTER_SETTER); // editor.setAction("AddGetterSetter", fAddGetterSetter); //$NON-NLS-1$ // // fAddDelegateMethods= new AddDelegateMethodsAction(editor); // fAddDelegateMethods.setActionDefinitionId(IJavaEditorActionDefinitionIds.CREATE_DELEGATE_METHODS); // editor.setAction("AddDelegateMethods", fAddDelegateMethods); //$NON-NLS-1$ // // fAddUnimplementedConstructors= new AddUnimplementedConstructorsAction(editor); // fAddUnimplementedConstructors.setActionDefinitionId(IJavaEditorActionDefinitionIds.ADD_UNIMPLEMENTED_CONTRUCTORS); // editor.setAction("AddUnimplementedConstructors", fAddUnimplementedConstructors); //$NON-NLS-1$ // // fGenerateConstructorUsingFields= new GenerateNewConstructorUsingFieldsAction(editor); // fGenerateConstructorUsingFields.setActionDefinitionId(IJavaEditorActionDefinitionIds.GENERATE_CONSTRUCTOR_USING_FIELDS); // editor.setAction("GenerateConstructorUsingFields", fGenerateConstructorUsingFields); //$NON-NLS-1$ // // fHashCodeEquals= new GenerateHashCodeEqualsAction(editor); // fHashCodeEquals.setActionDefinitionId(IJavaEditorActionDefinitionIds.GENERATE_HASHCODE_EQUALS); // editor.setAction("GenerateHashCodeEquals", fHashCodeEquals); //$NON-NLS-1$ // // fToString= new GenerateToStringAction(editor); // fToString.setActionDefinitionId(IJavaEditorActionDefinitionIds.GENERATE_TOSTRING); // editor.setAction("GenerateToString", fToString); //$NON-NLS-1$ // // fAddJavaDocStub= new AddJavaDocStubAction(editor); // fAddJavaDocStub.setActionDefinitionId(IJavaEditorActionDefinitionIds.ADD_JAVADOC_COMMENT); // editor.setAction("AddJavadocComment", fAddJavaDocStub); //$NON-NLS-1$ // // fCleanUp= new AllCleanUpsAction(editor); // fCleanUp.setActionDefinitionId(IJavaEditorActionDefinitionIds.CLEAN_UP); // editor.setAction("CleanUp", fCleanUp); //$NON-NLS-1$ // // fExternalizeStrings= new ExternalizeStringsAction(editor); // fExternalizeStrings.setActionDefinitionId(IJavaEditorActionDefinitionIds.EXTERNALIZE_STRINGS); // editor.setAction("ExternalizeStrings", fExternalizeStrings); //$NON-NLS-1$ // // installQuickAccessAction(); } /** * Creates a new <code>GenerateActionGroup</code>. The group * requires that the selection provided by the page's selection provider * is of type <code>org.eclipse.jface.viewers.IStructuredSelection</code>. * * @param page the page that owns this action group */ public GenerateActionGroup(Page page) { this(page.getSite(), null); //installQuickAccessAction(); } /** * Creates a new <code>GenerateActionGroup</code>. The group * requires that the selection provided by the part's selection provider * is of type <code>org.eclipse.jface.viewers.IStructuredSelection</code>. * * @param part the view part that owns this action group */ public GenerateActionGroup(IViewPart part) { this(part.getSite(), null); //installQuickAccessAction(); } /** * Creates a new <code>GenerateActionGroup</code>. The group requires * that the selection provided by the given selection provider is of type * {@link IStructuredSelection}. * * @param site the site that will own the action group. * @param selectionProvider the selection provider used instead of the * page selection provider. * * @since 3.4 */ public GenerateActionGroup(IWorkbenchSite site, ISelectionProvider selectionProvider) { fSite= site; fSelectionProvider= selectionProvider == null ? fSite.getSelectionProvider() : selectionProvider; ISelection selection= fSelectionProvider.getSelection(); // fOverrideMethods= new OverrideMethodsAction(site); // fOverrideMethods.setActionDefinitionId(IJavaEditorActionDefinitionIds.OVERRIDE_METHODS); // // fAddGetterSetter= new AddGetterSetterAction(site); // fAddGetterSetter.setActionDefinitionId(IJavaEditorActionDefinitionIds.CREATE_GETTER_SETTER); // // fAddDelegateMethods= new AddDelegateMethodsAction(site); // fAddDelegateMethods.setActionDefinitionId(IJavaEditorActionDefinitionIds.CREATE_DELEGATE_METHODS); // // fAddUnimplementedConstructors= new AddUnimplementedConstructorsAction(site); // fAddUnimplementedConstructors.setActionDefinitionId(IJavaEditorActionDefinitionIds.ADD_UNIMPLEMENTED_CONTRUCTORS); // // fGenerateConstructorUsingFields= new GenerateNewConstructorUsingFieldsAction(site); // fGenerateConstructorUsingFields.setActionDefinitionId(IJavaEditorActionDefinitionIds.GENERATE_CONSTRUCTOR_USING_FIELDS); // // fHashCodeEquals= new GenerateHashCodeEqualsAction(site); // fHashCodeEquals.setActionDefinitionId(IJavaEditorActionDefinitionIds.GENERATE_HASHCODE_EQUALS); // // fToString= new GenerateToStringAction(site); // fToString.setActionDefinitionId(IJavaEditorActionDefinitionIds.GENERATE_TOSTRING); // // fAddJavaDocStub= new AddJavaDocStubAction(site); // fAddJavaDocStub.setActionDefinitionId(IJavaEditorActionDefinitionIds.ADD_JAVADOC_COMMENT); // // fAddBookmark= new AddBookmarkAction(site, true); // fAddBookmark.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_ADD_BOOKMARK); // // // context-menu only -> no action definition ids // // fAddTaskAction= new AddTaskAction(site); // fAddTaskAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_ADD_TASK); // // fExternalizeStrings= new ExternalizeStringsAction(site); // fExternalizeStrings.setActionDefinitionId(IJavaEditorActionDefinitionIds.EXTERNALIZE_STRINGS); // // fFindNLSProblems= new FindBrokenNLSKeysAction(site); // fFindNLSProblems.setActionDefinitionId(FindBrokenNLSKeysAction.FIND_BROKEN_NLS_KEYS_ACTION_ID); // // fOrganizeImports= new OrganizeImportsAction(site); // fOrganizeImports.setActionDefinitionId(IJavaEditorActionDefinitionIds.ORGANIZE_IMPORTS); // // fSortMembers= new MultiSortMembersAction(site); // fSortMembers.setActionDefinitionId(IJavaEditorActionDefinitionIds.SORT_MEMBERS); // // fFormatAll= new FormatAllAction(site); // fFormatAll.setActionDefinitionId(IJavaEditorActionDefinitionIds.FORMAT); // // fCleanUp= new AllCleanUpsAction(site); // fCleanUp.setActionDefinitionId(IJavaEditorActionDefinitionIds.CLEAN_UP); // // // fOverrideMethods.update(selection); // fAddGetterSetter.update(selection); // fAddDelegateMethods.update(selection); // fAddUnimplementedConstructors.update(selection); // fGenerateConstructorUsingFields.update(selection); // fHashCodeEquals.update(selection); // fToString.update(selection); // fAddJavaDocStub.update(selection); // fExternalizeStrings.update(selection); // fFindNLSProblems.update(selection); // fCleanUp.update(selection); // fAddTaskAction.update(selection); // fOrganizeImports.update(selection); // fSortMembers.update(selection); // fFormatAll.update(selection); // if (selection instanceof IStructuredSelection) { // IStructuredSelection ss= (IStructuredSelection)selection; // fAddBookmark.selectionChanged(ss); // } else { // fAddBookmark.setEnabled(false); // } // // registerSelectionListener(fSelectionProvider, fAddBookmark); // SelectionDispatchAction[] actions= new SelectionDispatchAction[] { // fOverrideMethods, // fAddGetterSetter, // fAddDelegateMethods, // fAddUnimplementedConstructors, // fGenerateConstructorUsingFields, // fHashCodeEquals, // fToString, // fAddJavaDocStub, // fExternalizeStrings, // fFindNLSProblems, // fOrganizeImports, // fFormatAll, // fSortMembers, // fAddTaskAction, // fCleanUp // }; // // for (int i= 0; i < actions.length; i++) { // SelectionDispatchAction action= actions[i]; // registerSelectionListener(fSelectionProvider, action); // if (selectionProvider != null) { // action.setSpecialSelectionProvider(fSelectionProvider); // } // } // FIXME, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=213335 //installQuickAccessAction(); } // private void installQuickAccessAction() { // fHandlerService= (IHandlerService)fSite.getService(IHandlerService.class); // if (fHandlerService != null) { // IHandler handler= new JDTQuickMenuCreator(fEditor) { // protected void fillMenu(IMenuManager menu) { // fillQuickMenu(menu); // } // }.createHandler(); // fQuickAccessHandlerActivation= fHandlerService.activateHandler(QUICK_MENU_ID, handler); // } // } private void registerSelectionListener(ISelectionProvider provider, ISelectionChangedListener listener) { if (fRegisteredSelectionListeners == null) fRegisteredSelectionListeners= new ArrayList(20); provider.addSelectionChangedListener(listener); fRegisteredSelectionListeners.add(listener); } /* * The state of the editor owning this action group has changed. * This method does nothing if the group's owner isn't an * editor. */ /** * Note: This method is for internal use only. Clients should not call this method. * * @noreference This method is not intended to be referenced by clients. * @deprecated As of 3.5, this method is no longer called */ public void editorStateChanged() { Assert.isTrue(isEditorOwner()); } /* (non-Javadoc) * Method declared in ActionGroup */ public void fillActionBars(IActionBars actionBar) { super.fillActionBars(actionBar); setGlobalActionHandlers(actionBar); } /* (non-Javadoc) * Method declared in ActionGroup */ public void fillContextMenu(IMenuManager menu) { super.fillContextMenu(menu); MenuManager subMenu= new MenuManager("Source", MENU_ID); subMenu.setActionDefinitionId(QUICK_MENU_ID); int added= 0; if (isEditorOwner()) { added= fillEditorSubMenu(subMenu); } else { added= fillViewSubMenu(subMenu); } if (added > 0) menu.appendToGroup(fGroupName, subMenu); } // private void fillQuickMenu(IMenuManager menu) { // if (isEditorOwner()) { // if (!fEditor.isBreadcrumbActive()) // fillEditorSubMenu(menu); // } else { // fillViewSubMenu(menu); // } // } private int fillEditorSubMenu(IMenuManager source) { int added= 0; source.add(new Separator(GROUP_COMMENT)); added+= addEditorAction(source, UniversalEditor.TOGGLE_COMMENT_COMMAND); //$NON-NLS-1$ added+= addEditorAction(source, "AddBlockComment"); //$NON-NLS-1$ added+= addEditorAction(source, "RemoveBlockComment"); //$NON-NLS-1$ // added+= addAction(source, fAddJavaDocStub); source.add(new Separator(GROUP_EDIT)); added+= addEditorAction(source, UniversalEditor.INDENT_SELECTION_COMMAND); //$NON-NLS-1$ // added+= addEditorAction(source, "Format"); //$NON-NLS-1$ source.add(new Separator(GROUP_IMPORT)); // added+= addAction(source, fAddImport); // added+= addAction(source, fOrganizeImports); // added+= addAction(source, fSortMembers); // added+= addAction(source, fCleanUp); source.add(new Separator(GROUP_GENERATE)); // added+= addAction(source, fOverrideMethods); // added+= addAction(source, fAddGetterSetter); // added+= addAction(source, fAddDelegateMethods); // added+= addAction(source, fHashCodeEquals); // added+= addAction(source, fToString); // added+= addAction(source, fGenerateConstructorUsingFields); // added+= addAction(source, fAddUnimplementedConstructors); source.add(new Separator(GROUP_CODE)); source.add(new Separator(GROUP_EXTERNALIZE)); // added+= addAction(source, fExternalizeStrings); return added; } private int fillViewSubMenu(IMenuManager source) { int added= 0; source.add(new Separator(GROUP_COMMENT)); // added+= addAction(source, fAddJavaDocStub); source.add(new Separator(GROUP_EDIT)); // added+= addAction(source, fFormatAll); source.add(new Separator(GROUP_IMPORT)); // added+= addAction(source, fAddImport); // added+= addAction(source, fOrganizeImports); // added+= addAction(source, fSortMembers); // added+= addAction(source, fCleanUp); source.add(new Separator(GROUP_GENERATE)); // added+= addAction(source, fOverrideMethods); // added+= addAction(source, fAddGetterSetter); // added+= addAction(source, fAddDelegateMethods); // added+= addAction(source, fHashCodeEquals); // added+= addAction(source, fToString); // added+= addAction(source, fGenerateConstructorUsingFields); // added+= addAction(source, fAddUnimplementedConstructors); source.add(new Separator(GROUP_CODE)); source.add(new Separator(GROUP_EXTERNALIZE)); // added+= addAction(source, fExternalizeStrings); // added+= addAction(source, fFindNLSProblems); return added; } /* (non-Javadoc) * Method declared in ActionGroup */ public void dispose() { if (fRegisteredSelectionListeners != null) { ISelectionProvider provider= fSelectionProvider; for (Iterator iter= fRegisteredSelectionListeners.iterator(); iter.hasNext();) { ISelectionChangedListener listener= (ISelectionChangedListener) iter.next(); provider.removeSelectionChangedListener(listener); } } if (fQuickAccessHandlerActivation != null && fHandlerService != null) { fHandlerService.deactivateHandler(fQuickAccessHandlerActivation); } fEditor= null; // fCleanUp.dispose(); super.dispose(); } private void setGlobalActionHandlers(IActionBars actionBar) { // actionBar.setGlobalActionHandler(JdtActionConstants.ADD_IMPORT, fAddImport); // actionBar.setGlobalActionHandler(JdtActionConstants.OVERRIDE_METHODS, fOverrideMethods); // actionBar.setGlobalActionHandler(JdtActionConstants.GENERATE_GETTER_SETTER, fAddGetterSetter); // actionBar.setGlobalActionHandler(JdtActionConstants.GENERATE_DELEGATE_METHODS, fAddDelegateMethods); // actionBar.setGlobalActionHandler(JdtActionConstants.ADD_CONSTRUCTOR_FROM_SUPERCLASS, fAddUnimplementedConstructors); // actionBar.setGlobalActionHandler(JdtActionConstants.GENERATE_CONSTRUCTOR_USING_FIELDS, fGenerateConstructorUsingFields); // actionBar.setGlobalActionHandler(JdtActionConstants.GENERATE_HASHCODE_EQUALS, fHashCodeEquals); // actionBar.setGlobalActionHandler(JdtActionConstants.GENERATE_TOSTRING, fToString); // actionBar.setGlobalActionHandler(JdtActionConstants.ADD_JAVA_DOC_COMMENT, fAddJavaDocStub); // actionBar.setGlobalActionHandler(JdtActionConstants.EXTERNALIZE_STRINGS, fExternalizeStrings); // actionBar.setGlobalActionHandler(JdtActionConstants.CLEAN_UP, fCleanUp); // actionBar.setGlobalActionHandler(FindBrokenNLSKeysAction.ACTION_HANDLER_ID, fFindNLSProblems); // actionBar.setGlobalActionHandler(JdtActionConstants.ORGANIZE_IMPORTS, fOrganizeImports); // actionBar.setGlobalActionHandler(JdtActionConstants.SORT_MEMBERS, fSortMembers); // if (!isEditorOwner()) { // // editor provides its own implementation of these actions. // actionBar.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(), fAddBookmark); // actionBar.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(), fAddTaskAction); // actionBar.setGlobalActionHandler(JdtActionConstants.FORMAT, fFormatAll); // } } private int addAction(IMenuManager menu, IAction action) { if (action != null && action.isEnabled()) { menu.add(action); return 1; } return 0; } private int addEditorAction(IMenuManager menu, String actionID) { if (fEditor == null) return 0; IAction action= fEditor.getAction(actionID); if (action == null) return 0; if (action instanceof IUpdate) ((IUpdate)action).update(); if (action.isEnabled()) { menu.add(action); return 1; } return 0; } private boolean isEditorOwner() { return fEditor != null; } }