1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-18 13:45:45 +02:00

[227535][rseterminal][api] Add "Launch Terminal" command handler code (apply patch from Anna Dushistova)

This commit is contained in:
Martin Oberhuber 2008-05-05 23:01:29 +00:00
parent ba07826c2f
commit 6aecdeb353
4 changed files with 182 additions and 3 deletions

View file

@ -20,4 +20,6 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.4
Export-Package: org.eclipse.rse.internal.terminals.ui;x-internal:=true,
org.eclipse.rse.internal.terminals.ui.actions;x-internal:=true,
org.eclipse.rse.internal.terminals.ui.configuration.adapter;x-internal:=true,
org.eclipse.rse.internal.terminals.ui.handlers;x-internal:=true,
org.eclipse.rse.internal.terminals.ui.views;x-internal:=true
Bundle-Localization: plugin

View file

@ -6,7 +6,8 @@
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
# Yu-Fen Kuo (MontaVista) - initial API and implementation
# Yu-Fen Kuo (MontaVista) - initial API and implementation
# Anna Dushistova (MontaVista) - [227535][rseterminal][api] terminals.ui should not depend on files.core
###############################################################################
# NLS_MESSAGEFORMAT_NONE
@ -15,6 +16,6 @@
pluginName = RSE Terminals UI (Incubation)
providerName = Eclipse.org
terminalsView.name = Terminals
Launch_Terminal_Tooltip=Launch a terminal from the selected directory

View file

@ -14,6 +14,7 @@ Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
Contributors:
Martin Oberhuber (Wind River) - [180519] declaratively register adapter factories
Yu-Fen Kuo (MontaVista) - [170910] Integrate Terminal with RSE
Anna Dushistova (MontaVista) - [227535] [rseterminal][api] terminals.ui should not depend on files.core
-->
<?eclipse version="3.2"?>
<plugin>
@ -39,7 +40,7 @@ Yu-Fen Kuo (MontaVista) - [170910] Integrate Terminal with RSE
<extension
point="org.eclipse.ui.views">
<view
name="Terminals"
name="%terminalsView.name"
icon="icons/terminal_view.gif"
category="org.eclipse.rse.ui.view"
class="org.eclipse.rse.internal.terminals.ui.views.TerminalViewer"

View file

@ -0,0 +1,175 @@
/********************************************************************************
* Copyright (c) 2002, 2008 IBM Corporation and others. 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
*
* Initial Contributors:
* The following IBM employees contributed to the Remote System Explorer
* component that contains this file: David McKnight, Kushal Munir,
* Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson,
* Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
*
* Contributors:
* Martin Oberhuber (Wind River) - [187218] Fix error reporting for connect()
* Kevin Doyle (IBM) - [187083] Launch Shell action available on folders inside virtual files
* David McKnight (IBM) - [216252] [api][nls] Resource Strings specific to subsystems should be moved from rse.ui into files.ui / shells.ui / processes.ui where possible
* Yu-Fen Kuo (MontaVista) - Adapted from SystemCommandAction
* Anna Dushistova (MontaVista) - [227535] Adapted from LaunchTerminalAction to remove dependecy from files.core
********************************************************************************/
package org.eclipse.rse.internal.terminals.ui.handlers;
import java.util.Iterator;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.rse.core.filters.ISystemFilterReference;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.core.subsystems.ISubSystem;
import org.eclipse.rse.internal.terminals.ui.TerminalServiceHelper;
import org.eclipse.rse.internal.terminals.ui.views.TerminalViewer;
import org.eclipse.rse.internal.terminals.ui.views.TerminalsUI;
import org.eclipse.rse.services.clientserver.PathUtility;
import org.eclipse.rse.services.clientserver.archiveutils.ArchiveHandlerManager;
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.rse.ui.view.ISystemPropertyConstants;
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.ui.handlers.HandlerUtil;
public class LaunchTerminalCommandHandler extends AbstractHandler {
private ITerminalServiceSubSystem subSystem;
private Object selected;
private ISystemFilterReference selectedFilterRef;
public LaunchTerminalCommandHandler() {
}
private IHost getCurrentHost(IAdaptable adaptable) {
IHost currentHost = null;
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter) adaptable
.getAdapter(ISystemViewElementAdapter.class);
if (adapter != null) {
ISubSystem ss = adapter.getSubSystem(adaptable);
if (ss != null) {
currentHost = ss.getHost();
}
}
return currentHost;
}
private ITerminalServiceSubSystem getTerminalSubSystem() {
IHost currentHost = null;
if (selectedFilterRef != null) {
currentHost = getCurrentHost((IAdaptable) selectedFilterRef);
} else if (selected != null) {
currentHost = getCurrentHost((IAdaptable) selected);
}
if (currentHost != null) {
return TerminalServiceHelper.getTerminalSubSystem(currentHost);
}
return subSystem;
}
private Object getTargetFromFilter() {
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter) ((IAdaptable) selectedFilterRef)
.getAdapter(ISystemViewElementAdapter.class);
if (adapter != null) {
ISubSystem ss = adapter.getSubSystem(selectedFilterRef);
if (ss != null) {
Object target = ss.getTargetForFilter(selectedFilterRef);
if (target != null) {
return target;
}
}
}
return null;
}
private void init(IStructuredSelection selection) {
Iterator e = selection.iterator();
Object selectedObject = e.next();
if (selectedObject != null) {
if (selectedObject instanceof ISystemFilterReference) {
selectedFilterRef = (ISystemFilterReference) selectedObject;
selected = getTargetFromFilter();
} else if (selectedObject instanceof ITerminalServiceSubSystem) {
subSystem = (ITerminalServiceSubSystem) selectedObject;
} else {
selected = selectedObject;
}
}
}
public Object execute(ExecutionEvent event) throws ExecutionException {
init((IStructuredSelection) HandlerUtil.getCurrentSelection(event));
ITerminalServiceSubSystem terminalSubSystem = getTerminalSubSystem();
if (terminalSubSystem != null) {
TerminalsUI terminalsUI = TerminalsUI.getInstance();
TerminalViewer viewer = terminalsUI.activateTerminalsView();
if (!terminalSubSystem.isConnected()) {
try {
terminalSubSystem.connect(new NullProgressMonitor(), false);
} catch (OperationCanceledException e) {
// user canceled, return silently
return null;
} catch (Exception e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
if (terminalSubSystem.isConnected()) {
CTabItem tab = viewer.getTabFolder().createTabItem(
terminalSubSystem.getHost(), getInitialDirectoryCmd());
TerminalElement element = TerminalServiceHelper
.createTerminalElement(tab, terminalSubSystem);
terminalSubSystem.addChild(element);
}
}
return null;
}
private String getInitialDirectoryCmd() {
if (selected == null)
return null;
String path = getWorkingDirectory(selected);
String cdCmd = "cd " + PathUtility.enQuoteUnix(path); //$NON-NLS-1$
if (getTerminalSubSystem().getHost().getSystemType().isWindows()) {
cdCmd = "cd /d \"" + path + '\"'; //$NON-NLS-1$
}
return cdCmd + "\r"; //$NON-NLS-1$
}
private String getWorkingDirectory(Object element) {
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter) ((IAdaptable) element)
.getAdapter(ISystemViewElementAdapter.class);
if (adapter != null) {
String path = (String) adapter
.getPropertyValue(ISystemPropertyConstants.P_FILE_CANONICAL_PATH);
// folder -- real or virtual
if (ArchiveHandlerManager.isVirtual(path)) {
path = path
.substring(
0,
path
.indexOf(ArchiveHandlerManager.VIRTUAL_CANONICAL_SEPARATOR));
}
return path;
}
return null;
}
}