/******************************************************************************* * Copyright (c) 2002, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Initial Contributors: * The following IBM employees contributed to the Remote System Explorer * component that contains this file: David McKnight, Kushal Munir, * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson, * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * * Contributors: * 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 * Martin Oberhuber (Wind River) - [227571] RSE Terminal should honor Encoding set on the IHost * Michael Scharf (Wind River) - [236203] [rseterminal] Potentially UI blocking code in TerminalViewTab.createTabItem * Anna Dushistova (MontaVista) - [244437] [rseterminal] Possible race condition when multiple Terminals are launched after each other * Martin Oberhuber (Wind River) - [247700] Terminal uses ugly fonts in JEE package * Anna Dushistova (MontaVista) - [267609] [rseterminal] The first "Launch Terminal" command creates no terminal tab ********************************************************************************/ package org.yocto.sdk.remotetools.views; import java.io.UnsupportedEncodingException; import org.eclipse.core.runtime.IAdaptable; 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.jface.resource.FontRegistry; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.rse.core.model.IHost; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MenuListener; import org.eclipse.swt.graphics.Font; 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.control.ITerminalListener; import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; import org.eclipse.tm.internal.terminal.control.TerminalViewControlFactory; import org.eclipse.tm.internal.terminal.control.actions.TerminalActionClearAll; import org.eclipse.tm.internal.terminal.control.actions.TerminalActionCopy; import org.eclipse.tm.internal.terminal.control.actions.TerminalActionCut; import org.eclipse.tm.internal.terminal.control.actions.TerminalActionPaste; import org.eclipse.tm.internal.terminal.control.actions.TerminalActionSelectAll; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.themes.IThemeManager; /** * This is the desktop view wrapper of the System View viewer. */ public class TerminalViewTab extends Composite { public static String DATA_KEY_CONTROL = "$_control_$"; //$NON-NLS-1$ private final CTabFolder tabFolder; private IPropertyChangeListener propertyChangeListener; private Menu menu; private boolean fMenuAboutToShow; private TerminalActionCopy fActionEditCopy; private TerminalActionCut fActionEditCut; private TerminalActionPaste fActionEditPaste; private TerminalActionClearAll fActionEditClearAll; private TerminalActionSelectAll fActionEditSelectAll; protected class TerminalContextMenuHandler implements MenuListener, IMenuListener { public void menuHidden(MenuEvent event) { fMenuAboutToShow = false; fActionEditCopy.updateAction(fMenuAboutToShow); } public void menuShown(MenuEvent e) { } public void menuAboutToShow(IMenuManager menuMgr) { fMenuAboutToShow = true; fActionEditCopy.updateAction(fMenuAboutToShow); fActionEditCut.updateAction(fMenuAboutToShow); fActionEditSelectAll.updateAction(fMenuAboutToShow); fActionEditPaste.updateAction(fMenuAboutToShow); fActionEditClearAll.updateAction(fMenuAboutToShow); } } public TerminalViewTab(final Composite parent, TerminalViewer viewer) { super(parent, SWT.NONE); tabFolder = new CTabFolder(this, SWT.NONE); tabFolder.setLayout(new FillLayout()); tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); setLayout(new FillLayout()); tabFolder.setBackground(parent.getBackground()); tabFolder.setSimple(false); tabFolder.setUnselectedImageVisible(false); tabFolder.setUnselectedCloseVisible(false); tabFolder.setMinimizeVisible(false); tabFolder.setMaximizeVisible(false); //TODO setupActions(); } public void dispose() { if (propertyChangeListener != null) { IThemeManager mgr = PlatformUI.getWorkbench().getThemeManager(); mgr.removePropertyChangeListener(propertyChangeListener); propertyChangeListener = null; } if (!tabFolder.isDisposed()) { tabFolder.dispose(); } super.dispose(); } public CTabFolder getFolder() { return tabFolder; } public void remove(Object root) { } public int getItemCount(){ return tabFolder.getItemCount(); } public CTabItem getSelectedTab() { if (tabFolder.getItemCount() > 0) { int index = tabFolder.getSelectionIndex(); CTabItem item = tabFolder.getItem(index); return item; } return null; } public void showCurrentPage() { tabFolder.setFocus(); } public void showPageFor(Object root) { for (int i = 0; i < tabFolder.getItemCount(); i++) { CTabItem item = tabFolder.getItem(i); if (item.getData() == root) { tabFolder.setSelection(item); } } } public void showPageFor(String tabName) { for (int i = 0; i < tabFolder.getItemCount(); i++) { CTabItem item = tabFolder.getItem(i); if (item.getText().equals(tabName)) { tabFolder.setSelection(item); return; } } } public void disposePageFor(String tabName) { for (int i = 0; i < tabFolder.getItemCount(); i++) { CTabItem item = tabFolder.getItem(i); if (item.getText().equals(tabName)) { item.dispose(); return; } } } public void propertyChange(PropertyChangeEvent e) { // for now always update if (tabFolder!=null) { CTabItem[] items = tabFolder.getItems(); for (int i=0; i