/******************************************************************************* * Copyright (c) 2012-2017 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.terminal; import com.google.gwt.core.client.Callback; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.api.core.model.workspace.WorkspaceStatus; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.callback.AsyncPromiseHelper; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.machine.events.WsAgentStateEvent; import org.eclipse.che.ide.api.machine.events.WsAgentStateHandler; import org.eclipse.che.ide.api.parts.Perspective; import org.eclipse.che.ide.api.parts.PerspectiveManager; import org.eclipse.che.ide.api.workspace.event.WorkspaceStartingEvent; import org.eclipse.che.ide.api.workspace.event.WorkspaceStoppedEvent; import org.eclipse.che.ide.machine.MachineStatusHandler; import org.eclipse.che.ide.macro.ServerAddressMacroRegistrar; import org.eclipse.che.lib.terminal.client.TerminalResources; import org.eclipse.che.requirejs.RequireJsLoader; /** * Terminal entry point. */ @Singleton public class TerminalInitializer { private final PerspectiveManager perspectiveManager; @Inject public TerminalInitializer(final TerminalResources terminalResources, final EventBus eventBus, final PerspectiveManager perspectiveManager, final Provider<MachineStatusHandler> machineStatusHandlerProvider, final Provider<ServerAddressMacroRegistrar> machinePortProvider, final AppContext appContext, final TerminalInitializePromiseHolder terminalModule, final RequireJsLoader requireJsLoader) { this.perspectiveManager = perspectiveManager; terminalResources.getTerminalStyle().ensureInjected(); machineStatusHandlerProvider.get(); eventBus.addHandler(WsAgentStateEvent.TYPE, new WsAgentStateHandler() { @Override public void onWsAgentStarted(WsAgentStateEvent event) { restoreTerminal(); machinePortProvider.get(); } @Override public void onWsAgentStopped(WsAgentStateEvent event) { } }); eventBus.addHandler(WorkspaceStartingEvent.TYPE, event -> maximizeTerminal()); eventBus.addHandler(WorkspaceStoppedEvent.TYPE, event -> maximizeTerminal()); if (appContext.getWorkspace() == null || WorkspaceStatus.RUNNING != appContext.getWorkspace().getStatus()) { maximizeTerminal(); } Promise<Void> termInitPromise = AsyncPromiseHelper.createFromAsyncRequest(callback -> injectTerminal(requireJsLoader, callback)); terminalModule.setInitializerPromise(termInitPromise); } private void injectTerminal(RequireJsLoader rJsLoader, final AsyncCallback<Void> callback) { rJsLoader.require(new Callback<JavaScriptObject[], Throwable>() { @Override public void onFailure(Throwable reason) { callback.onFailure(reason); } @Override public void onSuccess(JavaScriptObject[] result) { callback.onSuccess(null); } }, new String[]{"term/xterm"}, new String[]{"Xterm"}); } /** * Maximizes terminal. */ private void maximizeTerminal() { Scheduler.get().scheduleDeferred(() -> { Perspective perspective = perspectiveManager.getActivePerspective(); if (perspective != null) { perspective.maximizeBottomPartStack(); } }); } /** * Restores terminal to its default size. */ private void restoreTerminal() { Perspective perspective = perspectiveManager.getActivePerspective(); if (perspective != null) { perspective.restore(); } } }