- moved TerminalHandler to separate plugin since it performs actions that are best suited for remote utilities
Signed-off-by: Ioana Grigoropol <ioanax.grigoro...@intel.com> --- .../org.yocto.remote.utils/META-INF/MANIFEST.MF | 9 +- .../org/yocto/remote/utils/TerminalHandler.java | 128 ++++++++++++++++++++ 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/TerminalHandler.java diff --git a/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF b/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF index 9616484..e7afbd0 100644 --- a/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF +++ b/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF @@ -11,10 +11,17 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Import-Package: org.eclipse.rse.core, org.eclipse.rse.core.model, org.eclipse.rse.core.subsystems, + org.eclipse.rse.internal.terminals.ui, + org.eclipse.rse.internal.terminals.ui.views, org.eclipse.rse.services, org.eclipse.rse.services.files, org.eclipse.rse.services.shells, + org.eclipse.rse.services.terminals, org.eclipse.rse.subsystems.files.core.servicesubsystem, org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem, - org.eclipse.rse.subsystems.terminals.core + org.eclipse.rse.subsystems.terminals.core, + org.eclipse.rse.subsystems.terminals.core.elements, + org.eclipse.rse.ui, + org.eclipse.tm.internal.terminal.control, + org.eclipse.tm.internal.terminal.provisional.api Export-Package: org.yocto.remote.utils diff --git a/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/TerminalHandler.java b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/TerminalHandler.java new file mode 100644 index 0000000..e28ae79 --- /dev/null +++ b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/TerminalHandler.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2010 Intel Corporation. + * 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: + * Intel - initial API and implementation + *******************************************************************************/ +package org.yocto.remote.utils; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.rse.core.model.IHost; +import org.eclipse.rse.internal.terminals.ui.TerminalServiceHelper; +import org.eclipse.rse.internal.terminals.ui.views.RSETerminalConnector; +import org.eclipse.rse.internal.terminals.ui.views.TerminalViewTab; +import org.eclipse.rse.internal.terminals.ui.views.TerminalViewer; +import org.eclipse.rse.internal.terminals.ui.views.TerminalsUI; +import org.eclipse.rse.services.terminals.ITerminalShell; +import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem; +import org.eclipse.rse.subsystems.terminals.core.elements.TerminalElement; +import org.eclipse.rse.ui.SystemBasePlugin; +import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; +import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; + +abstract public class TerminalHandler extends AbstractHandler { + + + protected Shell shell; + + protected String changeTerm = "export TERM=vt100;"; + + abstract protected String getInitCmd(); + abstract protected String getConnnectionName(); + abstract protected String getDialogTitle(); + + protected ITerminalShell getTerminalShellFromTab(CTabItem item) { + ITerminalShell terminalShell = null; + ITerminalViewControl terminalViewControl = (ITerminalViewControl) item + .getData(TerminalViewTab.DATA_KEY_CONTROL); + ITerminalConnector terminalConnector = terminalViewControl + .getTerminalConnector(); + if (terminalConnector instanceof RSETerminalConnector) { + RSETerminalConnector rseTerminalConnector = (RSETerminalConnector) terminalConnector; + terminalShell = rseTerminalConnector.getTerminalHostShell(); + } + return terminalShell; + } + + protected boolean preProcess(final ITerminalServiceSubSystem terminalSubSystem) { + if (!terminalSubSystem.isConnected()) { + try { + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + dialog.run(true, true, new IRunnableWithProgress(){ + @Override + public void run(IProgressMonitor monitor) { + monitor.beginTask("Connecting to remote target ...", 100); + try { + terminalSubSystem.connect(new NullProgressMonitor(), false); + monitor.done(); + } catch (Exception e) { + CommonHelper.showErrorDialog("Connection failure", null, e.getMessage()); + monitor.done(); + + } + } + }); + } catch (OperationCanceledException e) { + // user canceled, return silently + return false; + } catch (Exception e) { + SystemBasePlugin.logError(e.getLocalizedMessage(), e); + return false; + } + } else + return true; + return false; + } + + public void execute(IHost host) throws ExecutionException { + + final ITerminalServiceSubSystem terminalSubSystem = RSEHelper.getTerminalSubSystem(host); + + if (terminalSubSystem != null) { + TerminalsUI terminalsUI = TerminalsUI.getInstance(); + TerminalViewer viewer = terminalsUI.activateTerminalsView(); + if (preProcess(terminalSubSystem)) { + CTabItem tab = viewer.getTabFolder().createTabItem( + terminalSubSystem.getHost(), changeTerm + getInitCmd()); + //since RSETerminalConnector not exit the shell during the diconnection, + //we have manually exit it here + try { + tab.addDisposeListener(new DisposeListener() { + @Override + public void widgetDisposed(DisposeEvent e) { + Object source = e.getSource(); + if (source instanceof CTabItem) { + CTabItem currentItem = (CTabItem) source; + ITerminalShell shell=getTerminalShellFromTab(currentItem); + if(shell!=null) { + shell.exit(); + } + } + } + }); + }catch(Exception e) { + e.printStackTrace(); + } + TerminalElement element = TerminalServiceHelper + .createTerminalElement(tab, terminalSubSystem); + terminalSubSystem.addChild(element); + + } + } + } + +} -- 1.7.9.5 _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto