blob: d2f3c8f0d0b46b1518a573861a52496fc452983c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2014 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
* David McKnight (IBM) - [338031] Remote Shell view tabs should have close (x) icon
* David McKnight (IBM) -[425014] profile commit job don't always complete during shutdown
* David McKnight (IBM) -[431378] [shells] Remote shells not always restored properly on reconnect
*******************************************************************************/
package org.eclipse.rse.internal.shells.ui.view;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.rse.shells.ui.view.SystemCommandsView;
import org.eclipse.rse.shells.ui.view.TabFolderLayout;
import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem;
import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCommandShell;
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
import org.eclipse.rse.ui.view.SystemTableView;
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.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
/**
* This is the desktop view wrapper of the System View viewer.
*/
public class CommandsViewWorkbook extends Composite
{
private CTabFolder _folder;
private SystemCommandsViewPart _viewPart;
public CommandsViewWorkbook(Composite parent, SystemCommandsViewPart viewPart)
{
super(parent, SWT.NONE);
_folder = new CTabFolder(this, SWT.NONE);
_folder.setLayout(new TabFolderLayout());
_folder.setLayoutData(new GridData(GridData.FILL_BOTH));
setLayout(new FillLayout());
_viewPart = viewPart;
}
public void dispose()
{
if (!_folder.isDisposed())
{
for (int i = 0; i < _folder.getItemCount(); i++)
{
CTabItem item = _folder.getItem(i);
if (!item.isDisposed())
{
CommandsViewPage page = (CommandsViewPage) item.getData();
page.dispose();
}
}
_folder.dispose();
}
super.dispose();
}
public CTabFolder getFolder()
{
return _folder;
}
public void remove(Object root)
{
for (int i = 0; i < _folder.getItemCount(); i++)
{
CTabItem item = _folder.getItem(i);
if (!item.isDisposed())
{
CommandsViewPage page = (CommandsViewPage) item.getData();
if (page != null && root == page.getInput())
{
item.dispose();
page.dispose();
page = null;
item = null;
_folder.redraw();
return;
}
}
}
}
public CTabItem getSelectedTab()
{
if (_folder.getItemCount() > 0)
{
int index = _folder.getSelectionIndex();
CTabItem item = _folder.getItem(index);
return item;
}
return null;
}
public CommandsViewPage getCurrentTabItem()
{
if (_folder.getItemCount() > 0)
{
int index = _folder.getSelectionIndex();
CTabItem item = _folder.getItem(index);
return (CommandsViewPage) item.getData();
}
return null;
}
public void showCurrentPage()
{
_folder.setFocus();
}
/**
* For defect 165680, needed to change the active tab
* @param root the shell to show
*/
public void showPageFor(IRemoteCommandShell root)
{
for (int i = 0; i < _folder.getItemCount(); i++)
{
CTabItem item = _folder.getItem(i);
CommandsViewPage page = (CommandsViewPage) item.getData();
if (page != null && root == page.getInput())
{
_folder.setSelection(item);
}
}
}
public Object getInput()
{
CommandsViewPage page = getCurrentTabItem();
if (page != null)
{
// page.setFocus();
return page.getInput();
}
return null;
}
public SystemCommandsView getViewer()
{
if (getCurrentTabItem() != null)
{
return getCurrentTabItem().getViewer();
}
return null;
}
public void updateOutput(IRemoteCommandShell root, boolean createTab)
{
if (!_folder.isDisposed())
{
for (int i = 0; i < _folder.getItemCount(); i++)
{
CTabItem item = _folder.getItem(i);
Object data = item.getData();
CommandsViewPage page = (CommandsViewPage)data;
if (page != null && root == page.getInput())
{
if (!root.isActive())
{
setTabTitle((IAdaptable) root, item);
page.updateTitle((IAdaptable) root);
page.setEnabled(false);
}
page.updateOutput();
updateActionStates();
//page.setFocus();
return;
}
}
if (/*root.isActive() &&*/ createTab)
{
// never shown this, so add it
createTabItem((IAdaptable) root);
}
}
}
private void createTabItem(IAdaptable root)
{
CommandsViewPage commandsViewPage = new CommandsViewPage(_viewPart);
CTabItem titem = new CTabItem(_folder, SWT.CLOSE);
setTabTitle(root, titem);
titem.setData(commandsViewPage);
titem.setControl(commandsViewPage.createTabFolderPage(_folder, _viewPart.getEditorActionHandler()));
_folder.setSelection(titem );
commandsViewPage.setInput(root);
SystemTableView viewer = commandsViewPage.getViewer();
_viewPart.getSite().setSelectionProvider(viewer);
_viewPart.getSite().registerContextMenu(viewer.getContextMenuManager(), viewer);
//commandsViewPage.getViewer().addSelectionChangedListener((SystemCommandsViewPart)_viewPart);
commandsViewPage.setFocus();
titem.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
Object source = e.getSource();
if (source instanceof CTabItem) {
CTabItem currentItem = (CTabItem) source;
Object data = currentItem.getData();
if (data instanceof CommandsViewPage) {
IRemoteCommandShell command = (IRemoteCommandShell)((CommandsViewPage)data).getInput();
try {
IRemoteCmdSubSystem cmdSubSystem = command.getCommandSubSystem();
if (cmdSubSystem != null && cmdSubSystem.isConnected()){
if (!_viewPart.getSite().getWorkbenchWindow().getWorkbench().isClosing()){
cmdSubSystem.removeShell(command);
}
}
}
catch (Exception ex){
}
}
}
}
});
}
private void setTabTitle(IAdaptable root, CTabItem titem)
{
ISystemViewElementAdapter va = (ISystemViewElementAdapter) root.getAdapter(ISystemViewElementAdapter.class);
if (va != null)
{
titem.setText(va.getName(root));
titem.setImage(va.getImageDescriptor(root).createImage());
}
}
public void setInput(IAdaptable root)
{
for (int i = 0; i < _folder.getItemCount(); i++)
{
CTabItem item = _folder.getItem(i);
CommandsViewPage page = (CommandsViewPage) item.getData();
if (root == page.getInput())
{
_folder.setSelection(i);
page.getViewer().updateChildren();
return;
}
}
}
public void updateActionStates()
{
for (int i = 0; i < _folder.getItemCount(); i++)
{
CTabItem item = _folder.getItem(i);
if (!item.isDisposed())
{
CommandsViewPage page = (CommandsViewPage) item.getData();
if (page != null)
{
page.updateActionStates();
}
}
}
}
}