1
0
Fork 0
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:
Martin Oberhuber 2008-04-24 01:06:45 +00:00
parent f1c1fc4530
commit 3263fe1cc2
8 changed files with 207 additions and 29 deletions

View file

@ -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);
} }

View file

@ -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);
}
} }

View file

@ -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;
} }
} }

View file

@ -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;
}
} }

View file

@ -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;
}
} }

View file

@ -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;

View file

@ -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) {

View file

@ -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() {