diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/action/IdeActions.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/action/IdeActions.java index 6b1add7f1e1..b2242c94f59 100644 --- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/action/IdeActions.java +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/action/IdeActions.java @@ -37,6 +37,7 @@ public interface IdeActions { String GROUP_PROJECT_EXPLORER_CONTEXT_MENU = "projectExplorerContextMenu"; String GROUP_EDITOR_TAB_CONTEXT_MENU = "editorTabContextMenu"; String GROUP_CONSOLES_TREE_CONTEXT_MENU = "consolesTreeContextMenu"; + String GROUP_EDITOR_CONTEXT_MENU = "editorContextMenu"; String GROUP_OTHER_MENU = "otherMenu"; String GROUP_LEFT_MAIN_MENU = "leftMainMenu"; diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/core/StandardComponentInitializer.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/core/StandardComponentInitializer.java index 61afdb319c8..8dfda7d0f26 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/core/StandardComponentInitializer.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/core/StandardComponentInitializer.java @@ -655,6 +655,18 @@ public void initialize() { actionManager.registerAction("noOpAction", new NoOpAction()); actionManager.registerAction("signatureHelp", signatureHelpAction); + DefaultActionGroup editorContextMenuGroup = new DefaultActionGroup(actionManager); + actionManager.registerAction(IdeActions.GROUP_EDITOR_CONTEXT_MENU, editorContextMenuGroup); + + editorContextMenuGroup.add(undoAction); + editorContextMenuGroup.add(redoAction); + editorContextMenuGroup.addSeparator(); + editorContextMenuGroup.add(formatterAction); + + editorContextMenuGroup.addSeparator(); + editorContextMenuGroup.add(fullTextSearchAction); + editorContextMenuGroup.add(closeActiveEditorAction); + // Define hot-keys keyBinding.getGlobal().addKey(new KeyBuilder().action().alt().charCode('n').build(), "navigateToFile"); keyBinding.getGlobal().addKey(new KeyBuilder().action().charCode('F').build(), "fullTextSearch"); diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java index cc23078f4d9..758487d0de5 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/menu/ContextMenu.java @@ -18,13 +18,11 @@ import com.google.inject.Singleton; import org.eclipse.che.ide.api.action.Action; -import org.eclipse.che.ide.api.action.ActionEvent; import org.eclipse.che.ide.api.action.ActionGroup; import org.eclipse.che.ide.api.action.ActionManager; import org.eclipse.che.ide.api.action.ActionSelectedHandler; import org.eclipse.che.ide.api.action.DefaultActionGroup; import org.eclipse.che.ide.api.action.IdeActions; -import org.eclipse.che.ide.api.action.Presentation; import org.eclipse.che.ide.api.keybinding.KeyBindingAgent; import org.eclipse.che.ide.api.parts.PerspectiveManager; import org.eclipse.che.ide.ui.toolbar.CloseMenuHandler; @@ -53,7 +51,6 @@ public class ContextMenu implements CloseMenuHandler, ActionSelectedHandler { private PopupMenu popupMenu; private MenuLockLayer lockLayer; - protected final DefaultActionGroup actions; protected final PresentationFactory presentationFactory; @Inject @@ -63,7 +60,6 @@ public ContextMenu(ActionManager actionManager, KeyBindingAgent keyBindingAgent, this.managerProvider = managerProvider; presentationFactory = new PresentationFactory(); - actions = new DefaultActionGroup(actionManager); blockBrowserMenu(); } @@ -94,7 +90,7 @@ public void onBrowserEvent(com.google.gwt.user.client.Event event) { */ public void show(int x, int y) { hide(); - updateActions(); + ActionGroup actions = updateActions(); lockLayer = new MenuLockLayer(this); popupMenu = new PopupMenu(actions, @@ -123,24 +119,15 @@ private void calculatePosition(PopupMenu popupMenu, int x, int y) { /** * Updates the list of visible actions. */ - private void updateActions() { - actions.removeAll(); + protected ActionGroup updateActions() { + final ActionGroup mainActionGroup = (ActionGroup)actionManager.getAction(getGroupMenu()); if (mainActionGroup == null) { - return; + return new DefaultActionGroup(actionManager); } - final Action[] children = mainActionGroup.getChildren(null); - for (final Action action : children) { - final Presentation presentation = presentationFactory.getPresentation(action); - final ActionEvent e = new ActionEvent(presentation, actionManager, managerProvider.get()); - - action.update(e); - if (presentation.isVisible()) { - actions.add(action); - } - } + return mainActionGroup; } protected String getGroupMenu() { diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorTabContextMenu.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorTabContextMenu.java index 80601b7c366..0ded6355da0 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorTabContextMenu.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/part/editor/EditorTabContextMenu.java @@ -17,6 +17,7 @@ import org.eclipse.che.ide.api.action.Action; import org.eclipse.che.ide.api.action.ActionGroup; import org.eclipse.che.ide.api.action.ActionManager; +import org.eclipse.che.ide.api.action.DefaultActionGroup; import org.eclipse.che.ide.api.action.IdeActions; import org.eclipse.che.ide.api.action.Presentation; import org.eclipse.che.ide.api.editor.EditorPartPresenter; @@ -57,8 +58,6 @@ public EditorTabContextMenu(@Assisted EditorTab editorTab, this.editorPart = editorPart; this.editorPartStack = editorPartStack; this.actionManager = actionManager; - - updateActions(); } /** {@inheritDoc} */ @@ -67,10 +66,10 @@ protected String getGroupMenu() { return IdeActions.GROUP_EDITOR_TAB_CONTEXT_MENU; } - private void updateActions() { + protected ActionGroup updateActions() { final ActionGroup mainActionGroup = (ActionGroup)actionManager.getAction(getGroupMenu()); if (mainActionGroup == null) { - return; + return new DefaultActionGroup(actionManager); } final Action[] children = mainActionGroup.getChildren(null); @@ -81,5 +80,6 @@ private void updateActions() { presentation.putClientProperty(CURRENT_TAB_PROP, editorTab); presentation.putClientProperty(CURRENT_PANE_PROP, editorPartStack); } + return super.updateActions(); } } diff --git a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/menu/TestMenuPath.java b/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/menu/TestMenuPath.java deleted file mode 100644 index 38fa1b050ca..00000000000 --- a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/menu/TestMenuPath.java +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012-2016 Codenvy, S.A. - * 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: - * Codenvy, S.A. - initial API and implementation - *******************************************************************************/ -package org.eclipse.che.ide.menu; - -/** - * Test {@link MenuPath} class functionality - * - * @author Nikolay Zamosenchuk - */ -public class TestMenuPath { - -// @Test -// public void testSimplePath1() { -// String path = "a"; -// MenuPath menuPath = new MenuPath(path); -// assertEquals(1, menuPath.getSize()); -// assertEquals("a", menuPath.getParentPath(1)); -// } -// -// @Test -// public void testSimplePath2() { -// String path = "a/"; -// MenuPath menuPath = new MenuPath(path); -// assertEquals(1, menuPath.getSize()); -// assertEquals("a", menuPath.getParentPath(1)); -// } -// -// @Test -// public void testSimplePath3() { -// String path = "/a/"; -// MenuPath menuPath = new MenuPath(path); -// assertEquals(1, menuPath.getSize()); -// assertEquals("a", menuPath.getParentPath(1)); -// } -// -// @Test -// public void shouldReturnCorrectParentPath() { -// String path = "a/b/c"; -// MenuPath menuPath = new MenuPath(path); -// assertEquals("a", menuPath.getParentPath(1)); -// assertEquals("a/b", menuPath.getParentPath(2)); -// assertEquals("a/b/c", menuPath.getParentPath(3)); -// } -// -// @Test -// public void shouldReturnCorrectPathElement() { -// String path = "a/b/c"; -// MenuPath menuPath = new MenuPath(path); -// assertEquals("a", menuPath.getPathElementAt(0)); -// assertEquals("b", menuPath.getPathElementAt(1)); -// assertEquals("c", menuPath.getPathElementAt(2)); -// } - -} diff --git a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/JavaExtension.java b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/JavaExtension.java index aedc49849a7..3fa3fb0524a 100644 --- a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/JavaExtension.java +++ b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/JavaExtension.java @@ -15,6 +15,7 @@ import org.eclipse.che.ide.api.action.ActionManager; import org.eclipse.che.ide.api.action.DefaultActionGroup; +import org.eclipse.che.ide.api.action.IdeActions; import org.eclipse.che.ide.api.constraints.Anchor; import org.eclipse.che.ide.api.constraints.Constraints; import org.eclipse.che.ide.api.extension.Extension; @@ -145,6 +146,14 @@ private void prepareActions(NewPackageAction newPackageAction, mainContextMenuGroup.add(markDirectoryAsGroup); mainContextMenuGroup.addSeparator(); + DefaultActionGroup editorContextMenuGroup = (DefaultActionGroup)actionManager.getAction(IdeActions.GROUP_EDITOR_CONTEXT_MENU); + + editorContextMenuGroup.add(quickDocumentationAction, new Constraints(Anchor.AFTER, "format")); + editorContextMenuGroup.add(quickFixAction, new Constraints(Anchor.AFTER, "showQuickDoc")); + editorContextMenuGroup.add(openDeclarationAction, new Constraints(Anchor.AFTER, "quickFix")); + editorContextMenuGroup.add(refactorGroup, new Constraints(Anchor.AFTER, "openJavaDeclaration")); + editorContextMenuGroup.add(fileStructureAction, new Constraints(Anchor.AFTER, GROUP_ASSISTANT_REFACTORING)); + if (UserAgent.isMac()) { keyBinding.getGlobal().addKey(new KeyBuilder().alt().control().charCode('b').build(), "openImplementation"); keyBinding.getGlobal().addKey(new KeyBuilder().control().charCode('j').build(), "showQuickDoc"); diff --git a/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorPresenter.java b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorPresenter.java index 825d66fa3a1..8b5d1397fa5 100644 --- a/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorPresenter.java +++ b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/OrionEditorPresenter.java @@ -14,6 +14,8 @@ import com.google.gwt.core.client.Scheduler; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.dom.client.ContextMenuEvent; +import com.google.gwt.event.dom.client.ContextMenuHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; @@ -118,6 +120,7 @@ import org.eclipse.che.ide.editor.orion.client.jso.OrionLinkedModelDataOverlay; import org.eclipse.che.ide.editor.orion.client.jso.OrionLinkedModelGroupOverlay; import org.eclipse.che.ide.editor.orion.client.jso.OrionLinkedModelOverlay; +import org.eclipse.che.ide.editor.orion.client.menu.EditorContextMenu; import org.eclipse.che.ide.editor.orion.client.signature.SignatureHelpView; import org.eclipse.che.ide.part.editor.multipart.EditorMultiPartStackPresenter; import org.eclipse.che.ide.resource.Path; @@ -171,15 +174,16 @@ public class OrionEditorPresenter extends AbstractEditorPresenter implements Tex private final EditorMultiPartStackPresenter editorMultiPartStackPresenter; private final EditorLocalizationConstants constant; private final EditorWidgetFactory editorWidgetFactory; - private final EditorInitializePromiseHolder editorModule; - private final TextEditorPartView editorView; - private final EventBus generalEventBus; - private final FileTypeIdentifier fileTypeIdentifier; - private final QuickAssistantFactory quickAssistantFactory; - private final WorkspaceAgent workspaceAgent; - private final NotificationManager notificationManager; - private final AppContext appContext; - private final SignatureHelpView signatureHelpView; + private final EditorInitializePromiseHolder editorModule; + private final TextEditorPartView editorView; + private final EventBus generalEventBus; + private final FileTypeIdentifier fileTypeIdentifier; + private final QuickAssistantFactory quickAssistantFactory; + private final WorkspaceAgent workspaceAgent; + private final NotificationManager notificationManager; + private final AppContext appContext; + private final SignatureHelpView signatureHelpView; + private final EditorContextMenu contextMenu; private final AnnotationRendering rendering = new AnnotationRendering(); private HasKeyBindings keyBindingsManager; @@ -218,7 +222,8 @@ public OrionEditorPresenter(final CodeAssistantFactory codeAssistantFactory, final WorkspaceAgent workspaceAgent, final NotificationManager notificationManager, final AppContext appContext, - final SignatureHelpView signatureHelpView) { + final SignatureHelpView signatureHelpView, + final EditorContextMenu contextMenu) { this.codeAssistantFactory = codeAssistantFactory; this.deletedFilesController = deletedFilesController; this.breakpointManager = breakpointManager; @@ -238,6 +243,7 @@ public OrionEditorPresenter(final CodeAssistantFactory codeAssistantFactory, this.notificationManager = notificationManager; this.appContext = appContext; this.signatureHelpView = signatureHelpView; + this.contextMenu = contextMenu; keyBindingsManager = new TemporaryKeyBindingsManager(); @@ -1055,6 +1061,13 @@ public void onContentInitialized() { isInitialized = true; } }); + + editorWidget.addDomHandler(new ContextMenuHandler() { + @Override + public void onContextMenu(ContextMenuEvent event) { + contextMenu.show(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY()); + } + }, ContextMenuEvent.getType()); } } } diff --git a/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/menu/EditorContextMenu.java b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/menu/EditorContextMenu.java new file mode 100644 index 00000000000..dd90c8b1e9b --- /dev/null +++ b/plugins/plugin-orion/che-plugin-orion-editor/src/main/java/org/eclipse/che/ide/editor/orion/client/menu/EditorContextMenu.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2012-2016 Codenvy, S.A. + * 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: + * Codenvy, S.A. - initial API and implementation + *******************************************************************************/ +package org.eclipse.che.ide.editor.orion.client.menu; + +import com.google.inject.Provider; + +import org.eclipse.che.ide.api.action.ActionManager; +import org.eclipse.che.ide.api.action.IdeActions; +import org.eclipse.che.ide.api.keybinding.KeyBindingAgent; +import org.eclipse.che.ide.api.parts.PerspectiveManager; +import org.eclipse.che.ide.menu.ContextMenu; + +import javax.inject.Inject; + +/** + * Editor context menu, shows {@link IdeActions#GROUP_EDITOR_CONTEXT_MENU} action group. + */ +public class EditorContextMenu extends ContextMenu { + + @Inject + public EditorContextMenu(ActionManager actionManager, + KeyBindingAgent keyBindingAgent, + Provider managerProvider) { + super(actionManager, keyBindingAgent, managerProvider); + } + + + @Override + protected String getGroupMenu() { + return IdeActions.GROUP_EDITOR_CONTEXT_MENU; + } +}