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:
parent
f1c1fc4530
commit
3263fe1cc2
8 changed files with 207 additions and 29 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Add table
Reference in a new issue