1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-08 16:55: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:
* 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;
@ -16,4 +17,8 @@ public interface ITerminalServiceSubSystem extends ISubSystem {
public void addChild(TerminalElement element);
public void removeChild(TerminalElement element);
public void removeChild(String terminalTitle);
public TerminalElement getChild(String terminalTitle);
}

View file

@ -6,12 +6,15 @@
*
* Contributors:
* 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;
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.events.ISystemResourceChangeEvents;
import org.eclipse.rse.core.events.SystemResourceChangeEvent;
@ -86,6 +89,30 @@ public final class TerminalServiceSubSystem extends SubSystem implements
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() {
if (children != null)
return children.toArray();
@ -107,21 +134,15 @@ public final class TerminalServiceSubSystem extends SubSystem implements
case CommunicationsEvent.AFTER_DISCONNECT:
// no longer listen
getConnectorService().removeCommunicationsListener(this);
// if (_cmdShells != null) _cmdShells.clear();
// if (_envVars != null) _envVars.clear();
// _defaultShell = null;
break;
case CommunicationsEvent.BEFORE_DISCONNECT:
case CommunicationsEvent.CONNECTION_ERROR:
// remove all shells
// saveShellState(_cmdShells);
// if (getShells().length > 0)
// {
// Display.getDefault().asyncExec(new CancelAllShells());
// // cancelAllShells();
// }
Display.getDefault().asyncExec(new Runnable(){
public void run() {
cancelAllTerminals();
}
});
break;
default:
break;
@ -132,5 +153,38 @@ public final class TerminalServiceSubSystem extends SubSystem implements
public boolean isPassiveCommunicationsListener() {
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:
* Yu-Fen Kuo (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;
import org.eclipse.rse.core.subsystems.AbstractResource;
import org.eclipse.rse.internal.services.terminals.ITerminalShell;
import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem;
public class TerminalElement extends AbstractResource {
private String name;
public String getName() {
return name;
}
private ITerminalShell terminalShell;
public TerminalElement(String name,
ITerminalServiceSubSystem terminalServiceSubSystem) {
@ -26,19 +25,38 @@ public class TerminalElement extends AbstractResource {
this.name = name;
}
public String getName() {
return name;
}
public String toString() {
return getName();
}
public boolean equals(Object obj) {
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);
}
public int 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:
* 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;
@ -17,10 +18,15 @@ import org.eclipse.rse.core.RSECorePlugin;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.core.model.ISystemRegistry;
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.terminals.core.ITerminalServiceSubSystem;
import org.eclipse.rse.subsystems.terminals.core.elements.TerminalElement;
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 {
@ -49,7 +55,8 @@ public class TerminalServiceHelper {
ISystemRegistry systemRegistry = RSECorePlugin.getTheSystemRegistry();
ISubSystem[] subsystems = systemRegistry.getSubSystems(connection);
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];
return subSystem;
}
@ -82,10 +89,36 @@ public class TerminalServiceHelper {
public static void removeTerminalElementFromHost(CTabItem item, IHost host) {
ITerminalServiceSubSystem terminalServiceSubSystem = getTerminalSubSystem(host);
if (terminalServiceSubSystem != null) {
TerminalElement element = new TerminalElement(item.getText(),
terminalServiceSubSystem);
TerminalElement element = terminalServiceSubSystem.getChild(item.getText());
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:
* 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;
@ -86,4 +87,8 @@ public class RSETerminalConnectorImpl extends TerminalConnectorImpl {
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
* Yu-Fen Kuo (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;
@ -37,6 +38,7 @@ import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.resource.ImageDescriptor;
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.actions.RemoveTerminalAction;
import org.eclipse.rse.internal.terminals.ui.actions.ShowInTerminalViewAction;
@ -101,10 +103,18 @@ public class TerminalViewElementAdapter extends AbstractSystemViewAdapter
}
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(
Activator.ICON_ID_TERMINAL_SUBSYSTEM_LIVE);
}
}
return Activator.getDefault().getImageDescriptor(
Activator.ICON_ID_TERMINAL_SUBSYSTEM);
}
public Object getParent(Object element) {
return null;

View file

@ -15,6 +15,7 @@
* David McKnight (IBM) - [165680] "Show in Remote Shell View" does not work
* Yu-Fen Kuo (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;
@ -23,8 +24,15 @@ import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
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.ISystemRegistry;
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.swt.SWT;
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.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.tm.internal.terminal.actions.TerminalAction;
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.setControl(c);
tabFolder.setSelection(item);
@ -361,12 +369,50 @@ public class TerminalViewTab extends Composite implements ITerminalListener,
.getAdapter(ISystemViewElementAdapter.class);
if (va != null) {
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) {
// terminalControl.setState(state);
titem.setImage(va.getImageDescriptor(root).createImage());
}
}
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) {

View file

@ -21,6 +21,7 @@
* Radoslav Gerganov(ProSyst) - [181563] Fix hardcoded Ctrl+Space for remote shell content assist
* Yu-Fen Kuo (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;
@ -32,9 +33,11 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.rse.core.RSECorePlugin;
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.model.ISystemRegistry;
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.SystemWidgetHelpers;
import org.eclipse.rse.ui.messages.ISystemMessageLine;
@ -103,8 +106,12 @@ public class TerminalViewer extends ViewPart implements ISelectionListener,
}
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() {