/*******************************************************************************
* 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.extension.machine.client;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.api.machine.gwt.client.events.ExtServerStateEvent;
import org.eclipse.che.api.machine.gwt.client.events.ExtServerStateHandler;
import org.eclipse.che.ide.actions.CreateSnapshotAction;
import org.eclipse.che.ide.actions.StopMachineAction;
import org.eclipse.che.ide.actions.StopWorkspaceAction;
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.Constraints;
import org.eclipse.che.ide.api.extension.Extension;
import org.eclipse.che.ide.api.icon.Icon;
import org.eclipse.che.ide.api.icon.IconRegistry;
import org.eclipse.che.ide.api.keybinding.KeyBindingAgent;
import org.eclipse.che.ide.api.keybinding.KeyBuilder;
import org.eclipse.che.ide.api.parts.PartStackType;
import org.eclipse.che.ide.api.parts.PerspectiveManager;
import org.eclipse.che.ide.api.parts.WorkspaceAgent;
import org.eclipse.che.ide.extension.machine.client.actions.CreateMachineAction;
import org.eclipse.che.ide.extension.machine.client.actions.DestroyMachineAction;
import org.eclipse.che.ide.extension.machine.client.actions.EditCommandsAction;
import org.eclipse.che.ide.extension.machine.client.actions.ExecuteSelectedCommandAction;
import org.eclipse.che.ide.extension.machine.client.actions.NewTerminalAction;
import org.eclipse.che.ide.extension.machine.client.actions.RestartMachineAction;
import org.eclipse.che.ide.extension.machine.client.actions.RunCommandAction;
import org.eclipse.che.ide.extension.machine.client.actions.SelectCommandComboBoxReady;
import org.eclipse.che.ide.extension.machine.client.actions.SwitchPerspectiveAction;
import org.eclipse.che.ide.extension.machine.client.command.custom.CustomCommandType;
import org.eclipse.che.ide.extension.machine.client.command.valueproviders.ServerPortProvider;
import org.eclipse.che.ide.extension.machine.client.machine.console.ClearConsoleAction;
import org.eclipse.che.ide.extension.machine.client.machine.console.MachineConsoleToolbar;
import org.eclipse.che.ide.extension.machine.client.machine.extserver.ProjectApiComponentInitializer;
import org.eclipse.che.ide.extension.machine.client.outputspanel.OutputsContainerPresenter;
import org.eclipse.che.ide.extension.machine.client.processes.ConsolesPanelPresenter;
import org.eclipse.che.ide.ui.toolbar.ToolbarPresenter;
import org.eclipse.che.ide.util.input.KeyCodeMap;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_CENTER_TOOLBAR;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_MAIN_MENU;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_RIGHT_TOOLBAR;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_RUN;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_WORKSPACE;
import static org.eclipse.che.ide.api.constraints.Anchor.AFTER;
import static org.eclipse.che.ide.api.constraints.Constraints.FIRST;
import static org.eclipse.che.ide.workspace.perspectives.project.ProjectPerspective.PROJECT_PERSPECTIVE_ID;
/**
* Machine extension entry point.
*
* @author Artem Zatsarynnyi
* @author Dmitry Shnurenko
*/
@Singleton
@Extension(title = "Machine", version = "1.0.0")
public class MachineExtension {
public static final String GROUP_MACHINE_CONSOLE_TOOLBAR = "MachineConsoleToolbar";
public static final String GROUP_MACHINE_TOOLBAR = "MachineGroupToolbar";
public static final String GROUP_COMMANDS_LIST = "CommandsListGroup";
public static final String GROUP_COMMANDS_LIST_DISPLAY_NAME = "Run";
@Inject
public MachineExtension(MachineResources machineResources,
final EventBus eventBus,
final WorkspaceAgent workspaceAgent,
final ConsolesPanelPresenter consolesPanelPresenter,
//projectApiComponentInitializer has handler which will work at the right time
final ProjectApiComponentInitializer projectApiComponentInitializer,
final ServerPortProvider machinePortProvider,
final OutputsContainerPresenter outputsContainerPresenter,
final PerspectiveManager perspectiveManager,
IconRegistry iconRegistry,
CustomCommandType arbitraryCommandType) {
machineResources.getCss().ensureInjected();
eventBus.addHandler(ExtServerStateEvent.TYPE, new ExtServerStateHandler() {
@Override
public void onExtServerStarted(ExtServerStateEvent event) {
perspectiveManager.setPerspectiveId(PROJECT_PERSPECTIVE_ID);
workspaceAgent.openPart(outputsContainerPresenter, PartStackType.INFORMATION);
workspaceAgent.openPart(consolesPanelPresenter, PartStackType.INFORMATION);
}
@Override
public void onExtServerStopped(ExtServerStateEvent event) {
}
});
iconRegistry.registerIcon(new Icon(arbitraryCommandType.getId() + ".commands.category.icon", machineResources.customCommandType()));
}
@Inject
private void prepareActions(MachineLocalizationConstant localizationConstant,
ActionManager actionManager,
KeyBindingAgent keyBinding,
NewTerminalAction newTerminalAction,
ExecuteSelectedCommandAction executeSelectedCommandAction,
SelectCommandComboBoxReady selectCommandAction,
EditCommandsAction editCommandsAction,
CreateMachineAction createMachine,
RestartMachineAction restartMachine,
DestroyMachineAction destroyMachineAction,
StopWorkspaceAction stopWorkspaceAction,
StopMachineAction stopMachineAction,
SwitchPerspectiveAction switchPerspectiveAction,
CreateSnapshotAction createSnapshotAction,
RunCommandAction runCommandAction) {
final DefaultActionGroup mainMenu = (DefaultActionGroup)actionManager.getAction(GROUP_MAIN_MENU);
final DefaultActionGroup workspaceMenu = (DefaultActionGroup)actionManager.getAction(GROUP_WORKSPACE);
final DefaultActionGroup runMenu = (DefaultActionGroup)actionManager.getAction(GROUP_RUN);
// register actions
actionManager.registerAction("editCommands", editCommandsAction);
actionManager.registerAction("selectCommandAction", selectCommandAction);
actionManager.registerAction("executeSelectedCommand", executeSelectedCommandAction);
// add actions in main menu
runMenu.add(editCommandsAction);
//add actions in machine menu
final DefaultActionGroup machineMenu = new DefaultActionGroup(localizationConstant.mainMenuMachine(), true, actionManager);
actionManager.registerAction("machine", machineMenu);
actionManager.registerAction("createMachine", createMachine);
actionManager.registerAction("destroyMachine", destroyMachineAction);
actionManager.registerAction("restartMachine", restartMachine);
actionManager.registerAction("stopWorkspace", stopWorkspaceAction);
actionManager.registerAction("stopMachine", stopMachineAction);
actionManager.registerAction("createSnapshot", createSnapshotAction);
actionManager.registerAction("runCommand", runCommandAction);
actionManager.registerAction("newTerminal", newTerminalAction);
workspaceMenu.add(stopWorkspaceAction);
mainMenu.add(machineMenu, new Constraints(AFTER, IdeActions.GROUP_PROJECT));
machineMenu.add(createMachine);
machineMenu.add(restartMachine);
machineMenu.add(destroyMachineAction);
machineMenu.add(stopMachineAction);
machineMenu.add(createSnapshotAction);
// add actions on center part of toolbar
final DefaultActionGroup centerToolbarGroup = (DefaultActionGroup)actionManager.getAction(GROUP_CENTER_TOOLBAR);
final DefaultActionGroup machineToolbarGroup = new DefaultActionGroup(GROUP_MACHINE_TOOLBAR, false, actionManager);
actionManager.registerAction(GROUP_MACHINE_TOOLBAR, machineToolbarGroup);
centerToolbarGroup.add(machineToolbarGroup);
machineToolbarGroup.add(selectCommandAction);
final DefaultActionGroup executeToolbarGroup = new DefaultActionGroup(actionManager);
executeToolbarGroup.add(executeSelectedCommandAction);
machineToolbarGroup.add(executeToolbarGroup);
// add actions on right part of toolbar
final DefaultActionGroup rightToolbarGroup = (DefaultActionGroup)actionManager.getAction(GROUP_RIGHT_TOOLBAR);
rightToolbarGroup.add(switchPerspectiveAction);
// add group for command list
final DefaultActionGroup commandList = new DefaultActionGroup(GROUP_COMMANDS_LIST_DISPLAY_NAME, true, actionManager);
actionManager.registerAction(GROUP_COMMANDS_LIST, commandList);
commandList.add(editCommandsAction, FIRST);
final DefaultActionGroup runContextGroup = (DefaultActionGroup)actionManager.getAction(IdeActions.GROUP_RUN_CONTEXT_MENU);
runContextGroup.add(commandList);
runContextGroup.addSeparator();
// Define hot-keys
keyBinding.getGlobal().addKey(new KeyBuilder().alt().charCode(KeyCodeMap.F12).build(), "newTerminal");
}
@Inject
private void setUpMachineConsole(ActionManager actionManager,
ClearConsoleAction clearConsoleAction,
@MachineConsoleToolbar ToolbarPresenter machineConsoleToolbar) {
// add toolbar to Machine console
final DefaultActionGroup consoleToolbarActionGroup = new DefaultActionGroup(GROUP_MACHINE_CONSOLE_TOOLBAR, false, actionManager);
consoleToolbarActionGroup.add(clearConsoleAction);
consoleToolbarActionGroup.addSeparator();
machineConsoleToolbar.bindMainGroup(consoleToolbarActionGroup);
}
}