mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-09 01:05:38 +02:00
[227527] [rseterminal] RSE Terminal doesn't reset the "connected" state when the shell exits (patch applied from Yu-Fen Kuo)
This commit is contained in:
parent
f1c1fc4530
commit
3263fe1cc2
8 changed files with 207 additions and 29 deletions
|
@ -6,6 +6,7 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
package org.eclipse.rse.subsystems.terminals.core;
|
package org.eclipse.rse.subsystems.terminals.core;
|
||||||
|
|
||||||
|
@ -16,4 +17,8 @@ public interface ITerminalServiceSubSystem extends ISubSystem {
|
||||||
public void addChild(TerminalElement element);
|
public void addChild(TerminalElement element);
|
||||||
|
|
||||||
public void removeChild(TerminalElement element);
|
public void removeChild(TerminalElement element);
|
||||||
|
|
||||||
|
public void removeChild(String terminalTitle);
|
||||||
|
|
||||||
|
public TerminalElement getChild(String terminalTitle);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,15 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.rse.subsystems.terminals.core;
|
package org.eclipse.rse.subsystems.terminals.core;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.rse.core.RSECorePlugin;
|
import org.eclipse.rse.core.RSECorePlugin;
|
||||||
import org.eclipse.rse.core.events.ISystemResourceChangeEvents;
|
import org.eclipse.rse.core.events.ISystemResourceChangeEvents;
|
||||||
import org.eclipse.rse.core.events.SystemResourceChangeEvent;
|
import org.eclipse.rse.core.events.SystemResourceChangeEvent;
|
||||||
|
@ -86,6 +89,30 @@ public final class TerminalServiceSubSystem extends SubSystem implements
|
||||||
Display.getDefault().asyncExec(new Refresh(this));
|
Display.getDefault().asyncExec(new Refresh(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeChild(String terminalTitle) {
|
||||||
|
if (children != null) {
|
||||||
|
TerminalElement element = getChild(terminalTitle);
|
||||||
|
if (element != null){
|
||||||
|
children.remove(element);
|
||||||
|
if (children == null) {
|
||||||
|
getConnectorService().removeCommunicationsListener(this);
|
||||||
|
}
|
||||||
|
Display.getDefault().asyncExec(new Refresh(this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public TerminalElement getChild(String terminalTitle) {
|
||||||
|
if (children != null) {
|
||||||
|
Iterator iterator = children.iterator();
|
||||||
|
while (iterator.hasNext()){
|
||||||
|
TerminalElement element = (TerminalElement)iterator.next();
|
||||||
|
if (element.getName().equals(terminalTitle))
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
public Object[] getChildren() {
|
public Object[] getChildren() {
|
||||||
if (children != null)
|
if (children != null)
|
||||||
return children.toArray();
|
return children.toArray();
|
||||||
|
@ -107,21 +134,15 @@ public final class TerminalServiceSubSystem extends SubSystem implements
|
||||||
case CommunicationsEvent.AFTER_DISCONNECT:
|
case CommunicationsEvent.AFTER_DISCONNECT:
|
||||||
// no longer listen
|
// no longer listen
|
||||||
getConnectorService().removeCommunicationsListener(this);
|
getConnectorService().removeCommunicationsListener(this);
|
||||||
// if (_cmdShells != null) _cmdShells.clear();
|
|
||||||
// if (_envVars != null) _envVars.clear();
|
|
||||||
// _defaultShell = null;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CommunicationsEvent.BEFORE_DISCONNECT:
|
case CommunicationsEvent.BEFORE_DISCONNECT:
|
||||||
case CommunicationsEvent.CONNECTION_ERROR:
|
case CommunicationsEvent.CONNECTION_ERROR:
|
||||||
// remove all shells
|
Display.getDefault().asyncExec(new Runnable(){
|
||||||
// saveShellState(_cmdShells);
|
public void run() {
|
||||||
// if (getShells().length > 0)
|
cancelAllTerminals();
|
||||||
// {
|
}
|
||||||
// Display.getDefault().asyncExec(new CancelAllShells());
|
});
|
||||||
// // cancelAllShells();
|
|
||||||
// }
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -132,5 +153,38 @@ public final class TerminalServiceSubSystem extends SubSystem implements
|
||||||
public boolean isPassiveCommunicationsListener() {
|
public boolean isPassiveCommunicationsListener() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
public void cancelAllTerminals() {
|
||||||
|
if (children == null || children.size() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = children.size() - 1; i >= 0; i--) {
|
||||||
|
TerminalElement element = (TerminalElement) children.get(i);
|
||||||
|
|
||||||
|
try {
|
||||||
|
removeTerminalElement(element);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
children.clear();
|
||||||
|
Display.getDefault().asyncExec(new Refresh(this));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeTerminalElement(TerminalElement element) {
|
||||||
|
element.getTerminalShell().exit();
|
||||||
|
ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry();
|
||||||
|
registry.fireEvent(new SystemResourceChangeEvent(element, ISystemResourceChangeEvents.EVENT_COMMAND_SHELL_REMOVED, null));
|
||||||
|
}
|
||||||
|
public void initializeSubSystem(IProgressMonitor monitor) {
|
||||||
|
super.initializeSubSystem(monitor);
|
||||||
|
getConnectorService().addCommunicationsListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uninitializeSubSystem(IProgressMonitor monitor) {
|
||||||
|
getConnectorService().removeCommunicationsListener(this);
|
||||||
|
super.uninitializeSubSystem(monitor);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -7,18 +7,17 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
||||||
* Anna Dushistova (MontaVista) - initial API and implementation
|
* Anna Dushistova (MontaVista) - initial API and implementation
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
package org.eclipse.rse.subsystems.terminals.core.elements;
|
package org.eclipse.rse.subsystems.terminals.core.elements;
|
||||||
|
|
||||||
import org.eclipse.rse.core.subsystems.AbstractResource;
|
import org.eclipse.rse.core.subsystems.AbstractResource;
|
||||||
|
import org.eclipse.rse.internal.services.terminals.ITerminalShell;
|
||||||
import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem;
|
import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem;
|
||||||
|
|
||||||
public class TerminalElement extends AbstractResource {
|
public class TerminalElement extends AbstractResource {
|
||||||
private String name;
|
private String name;
|
||||||
|
private ITerminalShell terminalShell;
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TerminalElement(String name,
|
public TerminalElement(String name,
|
||||||
ITerminalServiceSubSystem terminalServiceSubSystem) {
|
ITerminalServiceSubSystem terminalServiceSubSystem) {
|
||||||
|
@ -26,19 +25,38 @@ public class TerminalElement extends AbstractResource {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getName();
|
return getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (obj instanceof TerminalElement) {
|
if (obj instanceof TerminalElement) {
|
||||||
return name.equals(((TerminalElement) obj).getName());
|
if (obj == this)
|
||||||
|
return true;
|
||||||
|
return name.equals(((TerminalElement) obj).getName())
|
||||||
|
&& terminalShell == ((TerminalElement) obj)
|
||||||
|
.getTerminalShell();
|
||||||
}
|
}
|
||||||
return super.equals(obj);
|
return super.equals(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return name.hashCode();
|
if (terminalShell != null)
|
||||||
|
return terminalShell.hashCode() + name.hashCode();
|
||||||
|
return name.hashCode() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ITerminalShell getTerminalShell() {
|
||||||
|
return terminalShell;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTerminalShell(ITerminalShell terminalShell) {
|
||||||
|
this.terminalShell = terminalShell;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
* Yu-Fen Kuo (MontaVista) - initial API and implementation
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.rse.internal.terminals.ui;
|
package org.eclipse.rse.internal.terminals.ui;
|
||||||
|
@ -17,10 +18,15 @@ import org.eclipse.rse.core.RSECorePlugin;
|
||||||
import org.eclipse.rse.core.model.IHost;
|
import org.eclipse.rse.core.model.IHost;
|
||||||
import org.eclipse.rse.core.model.ISystemRegistry;
|
import org.eclipse.rse.core.model.ISystemRegistry;
|
||||||
import org.eclipse.rse.core.subsystems.ISubSystem;
|
import org.eclipse.rse.core.subsystems.ISubSystem;
|
||||||
|
import org.eclipse.rse.internal.services.terminals.ITerminalShell;
|
||||||
|
import org.eclipse.rse.internal.terminals.ui.views.RSETerminalConnector;
|
||||||
|
import org.eclipse.rse.internal.terminals.ui.views.TerminalViewTab;
|
||||||
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
|
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
|
||||||
import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem;
|
import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem;
|
||||||
import org.eclipse.rse.subsystems.terminals.core.elements.TerminalElement;
|
import org.eclipse.rse.subsystems.terminals.core.elements.TerminalElement;
|
||||||
import org.eclipse.swt.custom.CTabItem;
|
import org.eclipse.swt.custom.CTabItem;
|
||||||
|
import org.eclipse.tm.internal.terminal.control.ITerminalViewControl;
|
||||||
|
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
|
||||||
|
|
||||||
public class TerminalServiceHelper {
|
public class TerminalServiceHelper {
|
||||||
|
|
||||||
|
@ -49,7 +55,8 @@ public class TerminalServiceHelper {
|
||||||
ISystemRegistry systemRegistry = RSECorePlugin.getTheSystemRegistry();
|
ISystemRegistry systemRegistry = RSECorePlugin.getTheSystemRegistry();
|
||||||
ISubSystem[] subsystems = systemRegistry.getSubSystems(connection);
|
ISubSystem[] subsystems = systemRegistry.getSubSystems(connection);
|
||||||
for (int i = 0; i < subsystems.length; i++) {
|
for (int i = 0; i < subsystems.length; i++) {
|
||||||
if ("ssh.terminals".equals(subsystems[i].getSubSystemConfiguration().getId())) {
|
if ("ssh.terminals".equals(subsystems[i]
|
||||||
|
.getSubSystemConfiguration().getId())) {
|
||||||
ITerminalServiceSubSystem subSystem = (ITerminalServiceSubSystem) subsystems[i];
|
ITerminalServiceSubSystem subSystem = (ITerminalServiceSubSystem) subsystems[i];
|
||||||
return subSystem;
|
return subSystem;
|
||||||
}
|
}
|
||||||
|
@ -82,10 +89,36 @@ public class TerminalServiceHelper {
|
||||||
public static void removeTerminalElementFromHost(CTabItem item, IHost host) {
|
public static void removeTerminalElementFromHost(CTabItem item, IHost host) {
|
||||||
ITerminalServiceSubSystem terminalServiceSubSystem = getTerminalSubSystem(host);
|
ITerminalServiceSubSystem terminalServiceSubSystem = getTerminalSubSystem(host);
|
||||||
if (terminalServiceSubSystem != null) {
|
if (terminalServiceSubSystem != null) {
|
||||||
TerminalElement element = new TerminalElement(item.getText(),
|
TerminalElement element = terminalServiceSubSystem.getChild(item.getText());
|
||||||
terminalServiceSubSystem);
|
|
||||||
terminalServiceSubSystem.removeChild(element);
|
terminalServiceSubSystem.removeChild(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void updateTerminalShellForTerminalElement(CTabItem item) {
|
||||||
|
Object data = item.getData();
|
||||||
|
if (data instanceof IHost){
|
||||||
|
IHost host = (IHost) data;
|
||||||
|
ITerminalServiceSubSystem terminalServiceSubSystem = TerminalServiceHelper.getTerminalSubSystem(host);
|
||||||
|
TerminalElement element = terminalServiceSubSystem.getChild(item.getText());
|
||||||
|
if (element != null){
|
||||||
|
ITerminalShell terminalShell = getTerminalShellFromTab(item);
|
||||||
|
if (element.getTerminalShell() != terminalShell){
|
||||||
|
element.setTerminalShell(terminalShell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static 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;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Anna Dushistova (MontaVista) - initial API and implementation
|
* Anna Dushistova (MontaVista) - initial API and implementation
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
package org.eclipse.rse.internal.terminals.ui.views;
|
package org.eclipse.rse.internal.terminals.ui.views;
|
||||||
|
|
||||||
|
@ -86,4 +87,8 @@ public class RSETerminalConnectorImpl extends TerminalConnectorImpl {
|
||||||
this.shell = shell;
|
this.shell = shell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ITerminalShell getTerminalHostShell() {
|
||||||
|
return shell;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
* Xuan Chen (IBM) - [223126] [api][breaking] Remove API related to User Actions in RSE Core/UI
|
* Xuan Chen (IBM) - [223126] [api][breaking] Remove API related to User Actions in RSE Core/UI
|
||||||
* Yu-Fen Kuo (MontaVista) - Adopted from SystemViewRemoteOutputAdapter
|
* Yu-Fen Kuo (MontaVista) - Adopted from SystemViewRemoteOutputAdapter
|
||||||
* Anna Dushistova (MontaVista) - Adopted from SystemViewRemoteOutputAdapter
|
* Anna Dushistova (MontaVista) - Adopted from SystemViewRemoteOutputAdapter
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.rse.internal.terminals.ui.views;
|
package org.eclipse.rse.internal.terminals.ui.views;
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ import org.eclipse.core.runtime.IAdaptable;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.jface.resource.ImageDescriptor;
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
import org.eclipse.jface.viewers.IStructuredSelection;
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.rse.internal.services.terminals.ITerminalShell;
|
||||||
import org.eclipse.rse.internal.terminals.ui.Activator;
|
import org.eclipse.rse.internal.terminals.ui.Activator;
|
||||||
import org.eclipse.rse.internal.terminals.ui.actions.RemoveTerminalAction;
|
import org.eclipse.rse.internal.terminals.ui.actions.RemoveTerminalAction;
|
||||||
import org.eclipse.rse.internal.terminals.ui.actions.ShowInTerminalViewAction;
|
import org.eclipse.rse.internal.terminals.ui.actions.ShowInTerminalViewAction;
|
||||||
|
@ -101,10 +103,18 @@ public class TerminalViewElementAdapter extends AbstractSystemViewAdapter
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImageDescriptor getImageDescriptor(Object element) {
|
public ImageDescriptor getImageDescriptor(Object element) {
|
||||||
// TODO different image for different state?
|
if (element instanceof TerminalElement){
|
||||||
|
TerminalElement terminalElement = (TerminalElement)element;
|
||||||
|
ITerminalShell terminalShell = terminalElement.getTerminalShell();
|
||||||
|
if (terminalShell != null){
|
||||||
|
if (terminalShell.isActive())
|
||||||
return Activator.getDefault().getImageDescriptor(
|
return Activator.getDefault().getImageDescriptor(
|
||||||
Activator.ICON_ID_TERMINAL_SUBSYSTEM_LIVE);
|
Activator.ICON_ID_TERMINAL_SUBSYSTEM_LIVE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return Activator.getDefault().getImageDescriptor(
|
||||||
|
Activator.ICON_ID_TERMINAL_SUBSYSTEM);
|
||||||
|
}
|
||||||
|
|
||||||
public Object getParent(Object element) {
|
public Object getParent(Object element) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
* David McKnight (IBM) - [165680] "Show in Remote Shell View" does not work
|
* David McKnight (IBM) - [165680] "Show in Remote Shell View" does not work
|
||||||
* Yu-Fen Kuo (MontaVista) - Adapted from CommandsViewWorkbook
|
* Yu-Fen Kuo (MontaVista) - Adapted from CommandsViewWorkbook
|
||||||
* Anna Dushistova (MontaVista) - Adapted from CommandsViewWorkbook
|
* Anna Dushistova (MontaVista) - Adapted from CommandsViewWorkbook
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
package org.eclipse.rse.internal.terminals.ui.views;
|
package org.eclipse.rse.internal.terminals.ui.views;
|
||||||
|
|
||||||
|
@ -23,8 +24,15 @@ import org.eclipse.jface.action.IMenuListener;
|
||||||
import org.eclipse.jface.action.IMenuManager;
|
import org.eclipse.jface.action.IMenuManager;
|
||||||
import org.eclipse.jface.action.MenuManager;
|
import org.eclipse.jface.action.MenuManager;
|
||||||
import org.eclipse.jface.action.Separator;
|
import org.eclipse.jface.action.Separator;
|
||||||
|
import org.eclipse.rse.core.RSECorePlugin;
|
||||||
|
import org.eclipse.rse.core.events.ISystemResourceChangeEvents;
|
||||||
|
import org.eclipse.rse.core.events.SystemResourceChangeEvent;
|
||||||
import org.eclipse.rse.core.model.IHost;
|
import org.eclipse.rse.core.model.IHost;
|
||||||
|
import org.eclipse.rse.core.model.ISystemRegistry;
|
||||||
import org.eclipse.rse.internal.terminals.ui.TerminalServiceHelper;
|
import org.eclipse.rse.internal.terminals.ui.TerminalServiceHelper;
|
||||||
|
import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem;
|
||||||
|
import org.eclipse.rse.subsystems.terminals.core.TerminalServiceSubSystem;
|
||||||
|
import org.eclipse.rse.subsystems.terminals.core.elements.TerminalElement;
|
||||||
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
|
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.custom.CTabFolder;
|
import org.eclipse.swt.custom.CTabFolder;
|
||||||
|
@ -38,6 +46,7 @@ import org.eclipse.swt.layout.FillLayout;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
import org.eclipse.swt.widgets.Control;
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
import org.eclipse.swt.widgets.Menu;
|
import org.eclipse.swt.widgets.Menu;
|
||||||
import org.eclipse.tm.internal.terminal.actions.TerminalAction;
|
import org.eclipse.tm.internal.terminal.actions.TerminalAction;
|
||||||
import org.eclipse.tm.internal.terminal.actions.TerminalActionClearAll;
|
import org.eclipse.tm.internal.terminal.actions.TerminalActionClearAll;
|
||||||
|
@ -203,7 +212,6 @@ public class TerminalViewTab extends Composite implements ITerminalListener,
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
item.setData(DATA_KEY_CONTROL, terminalControl);
|
item.setData(DATA_KEY_CONTROL, terminalControl);
|
||||||
|
|
||||||
}
|
}
|
||||||
item.setControl(c);
|
item.setControl(c);
|
||||||
tabFolder.setSelection(item);
|
tabFolder.setSelection(item);
|
||||||
|
@ -361,12 +369,50 @@ public class TerminalViewTab extends Composite implements ITerminalListener,
|
||||||
.getAdapter(ISystemViewElementAdapter.class);
|
.getAdapter(ISystemViewElementAdapter.class);
|
||||||
if (va != null) {
|
if (va != null) {
|
||||||
updateWithUniqueTitle(va.getName(root), titem);
|
updateWithUniqueTitle(va.getName(root), titem);
|
||||||
titem.setImage(va.getImageDescriptor(root).createImage());
|
setTabImage(root, titem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void setTabImage(IAdaptable root, CTabItem titem) {
|
||||||
|
ISystemViewElementAdapter va = (ISystemViewElementAdapter) root
|
||||||
|
.getAdapter(ISystemViewElementAdapter.class);
|
||||||
|
if (va != null) {
|
||||||
|
if (root instanceof IHost){
|
||||||
|
ITerminalServiceSubSystem terminalServiceSubSystem = TerminalServiceHelper.getTerminalSubSystem((IHost)root);
|
||||||
|
TerminalElement element = terminalServiceSubSystem.getChild(titem.getText());
|
||||||
|
if (element != null){
|
||||||
|
va = (ISystemViewElementAdapter) element.getAdapter(ISystemViewElementAdapter.class);
|
||||||
|
titem.setImage(va.getImageDescriptor(element).createImage());
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setState(TerminalState state) {
|
titem.setImage(va.getImageDescriptor(root).createImage());
|
||||||
// terminalControl.setState(state);
|
}
|
||||||
|
}
|
||||||
|
public void setState(final TerminalState state) {
|
||||||
|
if (state == TerminalState.CLOSED || state == TerminalState.CONNECTED){
|
||||||
|
Display.getDefault().asyncExec(new Runnable(){
|
||||||
|
public void run() {
|
||||||
|
CTabItem item = tabFolder.getSelection();
|
||||||
|
if (item != null && !item.isDisposed()){
|
||||||
|
Object data = item.getData();
|
||||||
|
if (data instanceof IHost){
|
||||||
|
IHost host = (IHost)data;
|
||||||
|
final ITerminalServiceSubSystem terminalServiceSubSystem = TerminalServiceHelper.getTerminalSubSystem(host);
|
||||||
|
|
||||||
|
if (state == TerminalState.CONNECTED)
|
||||||
|
TerminalServiceHelper.updateTerminalShellForTerminalElement(item);
|
||||||
|
|
||||||
|
setTabImage(host, item);
|
||||||
|
ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry();
|
||||||
|
registry.fireEvent(new SystemResourceChangeEvent(terminalServiceSubSystem,
|
||||||
|
ISystemResourceChangeEvents.EVENT_REFRESH, terminalServiceSubSystem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTerminalTitle(String title) {
|
public void setTerminalTitle(String title) {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
* Radoslav Gerganov(ProSyst) - [181563] Fix hardcoded Ctrl+Space for remote shell content assist
|
* Radoslav Gerganov(ProSyst) - [181563] Fix hardcoded Ctrl+Space for remote shell content assist
|
||||||
* Yu-Fen Kuo (MontaVista) - Adapted from SystemCommandsViewPart
|
* Yu-Fen Kuo (MontaVista) - Adapted from SystemCommandsViewPart
|
||||||
* Anna Dushistova (MontaVista) - Adapted from SystemCommandsViewPart
|
* Anna Dushistova (MontaVista) - Adapted from SystemCommandsViewPart
|
||||||
|
* Yu-Fen Kuo (MontaVista) - [227572] RSE Terminal doesn't reset the "connected" state when the shell exits
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
package org.eclipse.rse.internal.terminals.ui.views;
|
package org.eclipse.rse.internal.terminals.ui.views;
|
||||||
|
|
||||||
|
@ -32,9 +33,11 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
|
||||||
import org.eclipse.jface.viewers.Viewer;
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
import org.eclipse.rse.core.RSECorePlugin;
|
import org.eclipse.rse.core.RSECorePlugin;
|
||||||
import org.eclipse.rse.core.events.ISystemResourceChangeEvent;
|
import org.eclipse.rse.core.events.ISystemResourceChangeEvent;
|
||||||
|
import org.eclipse.rse.core.events.ISystemResourceChangeEvents;
|
||||||
import org.eclipse.rse.core.events.ISystemResourceChangeListener;
|
import org.eclipse.rse.core.events.ISystemResourceChangeListener;
|
||||||
import org.eclipse.rse.core.model.ISystemRegistry;
|
import org.eclipse.rse.core.model.ISystemRegistry;
|
||||||
import org.eclipse.rse.services.clientserver.messages.SystemMessage;
|
import org.eclipse.rse.services.clientserver.messages.SystemMessage;
|
||||||
|
import org.eclipse.rse.subsystems.terminals.core.elements.TerminalElement;
|
||||||
import org.eclipse.rse.ui.RSEUIPlugin;
|
import org.eclipse.rse.ui.RSEUIPlugin;
|
||||||
import org.eclipse.rse.ui.SystemWidgetHelpers;
|
import org.eclipse.rse.ui.SystemWidgetHelpers;
|
||||||
import org.eclipse.rse.ui.messages.ISystemMessageLine;
|
import org.eclipse.rse.ui.messages.ISystemMessageLine;
|
||||||
|
@ -103,8 +106,12 @@ public class TerminalViewer extends ViewPart implements ISelectionListener,
|
||||||
}
|
}
|
||||||
|
|
||||||
public void systemResourceChanged(ISystemResourceChangeEvent event) {
|
public void systemResourceChanged(ISystemResourceChangeEvent event) {
|
||||||
// TODO Auto-generated method stub
|
if (event.getType() == ISystemResourceChangeEvents.EVENT_COMMAND_SHELL_REMOVED) {
|
||||||
|
Object source = event.getSource();
|
||||||
|
if (source instanceof TerminalElement) {
|
||||||
|
tabFolder.disposePageFor(((TerminalElement) source).getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Shell getShell() {
|
public Shell getShell() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue