### Eclipse Workspace Patch 1.0 #P org.eclipse.rse.subsystems.terminals.core Index: src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.terminals.core/src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java,v retrieving revision 1.1 diff -u -r1.1 TerminalServiceSubSystem.java --- src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java 16 Apr 2008 20:56:41 -0000 1.1 +++ src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java 18 Apr 2008 22:27:16 -0000 @@ -6,11 +6,13 @@ * * 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.rse.core.RSECorePlugin; import org.eclipse.rse.core.events.ISystemResourceChangeEvents; @@ -86,6 +88,30 @@ 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(); Index: src/org/eclipse/rse/subsystems/terminals/core/ITerminalServiceSubSystem.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.terminals.core/src/org/eclipse/rse/subsystems/terminals/core/ITerminalServiceSubSystem.java,v retrieving revision 1.1 diff -u -r1.1 ITerminalServiceSubSystem.java --- src/org/eclipse/rse/subsystems/terminals/core/ITerminalServiceSubSystem.java 16 Apr 2008 20:56:41 -0000 1.1 +++ src/org/eclipse/rse/subsystems/terminals/core/ITerminalServiceSubSystem.java 18 Apr 2008 22:27:16 -0000 @@ -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 void addChild(TerminalElement element); public void removeChild(TerminalElement element); + + public void removeChild(String terminalTitle); + + public TerminalElement getChild(String terminalTitle); } Index: src/org/eclipse/rse/subsystems/terminals/core/elements/TerminalElement.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.terminals.core/src/org/eclipse/rse/subsystems/terminals/core/elements/TerminalElement.java,v retrieving revision 1.1 diff -u -r1.1 TerminalElement.java --- src/org/eclipse/rse/subsystems/terminals/core/elements/TerminalElement.java 16 Apr 2008 20:56:41 -0000 1.1 +++ src/org/eclipse/rse/subsystems/terminals/core/elements/TerminalElement.java 18 Apr 2008 22:27:16 -0000 @@ -7,24 +7,28 @@ * 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) { super(terminalServiceSubSystem); this.name = name; } + + public String getName() { + return name; + } + public String toString() { return getName(); @@ -32,13 +36,27 @@ 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() { - 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; } } #P org.eclipse.rse.terminals.ui Index: src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewTab.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.terminals.ui/src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewTab.java,v retrieving revision 1.2 diff -u -r1.2 TerminalViewTab.java --- src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewTab.java 17 Apr 2008 10:47:26 -0000 1.2 +++ src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewTab.java 18 Apr 2008 22:27:17 -0000 @@ -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.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.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 @@ ; } item.setData(DATA_KEY_CONTROL, terminalControl); - } item.setControl(c); tabFolder.setSelection(item); @@ -361,12 +369,50 @@ .getAdapter(ISystemViewElementAdapter.class); if (va != null) { updateWithUniqueTitle(va.getName(root), titem); + 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; + } + } + 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 setState(TerminalState state) { - // terminalControl.setState(state); } public void setTerminalTitle(String title) { @@ -386,12 +432,12 @@ public void onTerminalConnect() { // TODO Auto-generated method stub - + } public void onTerminalDisconnect() { // TODO Auto-generated method stub - + } public void onTerminalFontChanged() { Index: src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewElementAdapter.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.terminals.ui/src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewElementAdapter.java,v retrieving revision 1.1 diff -u -r1.1 TerminalViewElementAdapter.java --- src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewElementAdapter.java 16 Apr 2008 20:56:35 -0000 1.1 +++ src/org/eclipse/rse/internal/terminals/ui/views/TerminalViewElementAdapter.java 18 Apr 2008 22:27:17 -0000 @@ -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.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,9 +103,17 @@ } 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_LIVE); + Activator.ICON_ID_TERMINAL_SUBSYSTEM); } public Object getParent(Object element) { Index: src/org/eclipse/rse/internal/terminals/ui/views/RSETerminalConnectorImpl.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.terminals.ui/src/org/eclipse/rse/internal/terminals/ui/views/RSETerminalConnectorImpl.java,v retrieving revision 1.1 diff -u -r1.1 RSETerminalConnectorImpl.java --- src/org/eclipse/rse/internal/terminals/ui/views/RSETerminalConnectorImpl.java 16 Apr 2008 20:56:35 -0000 1.1 +++ src/org/eclipse/rse/internal/terminals/ui/views/RSETerminalConnectorImpl.java 18 Apr 2008 22:27:17 -0000 @@ -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 @@ this.shell = shell; } + public ITerminalShell getTerminalHostShell() { + return shell; + } + } Index: src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.terminals.ui/src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java,v retrieving revision 1.1 diff -u -r1.1 TerminalServiceHelper.java --- src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java 16 Apr 2008 20:56:35 -0000 1.1 +++ src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java 18 Apr 2008 22:27:17 -0000 @@ -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.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 @@ 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 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; + } } \ No newline at end of file