[yocto] [PATCH 09/12] Move TerminalHandler to org.yocto.remote.utils

Ioana Grigoropol ioanax.grigoropol at intel.com
Wed May 8 05:57:15 PDT 2013


- moved TerminalHandler to separate plugin since it performs actions that are best suited for remote utilities

Signed-off-by: Ioana Grigoropol <ioanax.grigoropol at 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




More information about the yocto mailing list