package com.netifera.platform.host.internal.terminal.ui.pty; import org.eclipse.tm.internal.terminal.connector.TerminalConnector; import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import com.netifera.platform.api.log.ILogger; import com.netifera.platform.api.probe.IProbe; import com.netifera.platform.host.internal.terminal.ui.Activator; import com.netifera.platform.host.terminal.ui.view.TerminalView; import com.netifera.platform.ui.actions.SpaceAction; public class OpenProbePtyTerminalAction extends SpaceAction { private final IWorkbenchPage page; private final ILogger logger; private final IProbe probe; public OpenProbePtyTerminalAction(IProbe probe, ILogger logger) { super("Open Shell"); setImageDescriptor(Activator.getInstance().getImageCache().getDescriptor("icons/terminal_view.png")); this.page = getActivePage(); this.logger = logger; this.probe = probe; } private IWorkbenchPage getActivePage() { /* hack around stupid java 'final' rule for anonymous inner classes */ final IWorkbenchPage[] pageHolder = new IWorkbenchPage[1]; PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { public void run() { final IWorkbench wb = PlatformUI.getWorkbench(); if(wb == null) return; final IWorkbenchWindow window = wb.getActiveWorkbenchWindow(); if(window == null) return; pageHolder[0] = window.getActivePage(); } }); return pageHolder[0]; } public void run() { if(page == null) return; try { openProcessView(); } catch (PartInitException e) { logger.warning("Error opening terminal view", e); } } private void openProcessView() throws PartInitException { IViewPart view = page.showView("org.eclipse.tm.terminal.view.TerminalView", "SecondaryTerminal" + System.currentTimeMillis(), IWorkbenchPage.VIEW_ACTIVATE); TerminalView terminal = (TerminalView) view; TerminalConnector.Factory factory = new TerminalConnector.Factory() { public TerminalConnectorImpl makeConnector() throws Exception { return new PTYConnector(probe); } }; terminal.setConnector(new TerminalConnector(factory, "pty-terminal", "Terminal")); terminal.setSpace(getSpace()); terminal.onTerminalConnect(); } }