/*****************************************************************************
* Copyright (c) 2006, 2007 g-Eclipse Consortium
* 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 development of the original code was made for the
* g-Eclipse project founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributors:
* Thomas Koeckerbauer GUP, JKU - initial API and implementation
*****************************************************************************/
package eu.geclipse.terminal.internal;
import java.io.IOException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.preference.IPreferenceStore;
//import org.eclipse.jface.viewers.ISelectionChangedListener;
//import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolder2Adapter;
import org.eclipse.swt.custom.CTabFolderEvent;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.ViewPart;
import eu.geclipse.core.IBidirectionalConnection;
import eu.geclipse.terminal.ITerminalListener;
import eu.geclipse.terminal.ITerminalPage;
import eu.geclipse.terminal.ITerminalView;
import eu.geclipse.terminal.internal.preferences.PreferenceConstants;
/**
* View containing VT100 terminal emulators. Terminals can be added by creating
* a terminal factory plugin.
*/
public class TerminalView extends ViewPart implements ITerminalView {
CTabFolder cTabFolder = null;
SelectionProviderIntermediate selectionProvider;
private NewTerminalDropDownAction newTerminalAction;
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
@Override
public void createPartControl( final Composite parent ) {
makeActions();
contributeToActionBars();
this.selectionProvider = new SelectionProviderIntermediate();
getSite().setSelectionProvider( this.selectionProvider );
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.verticalAlignment = GridData.FILL;
this.cTabFolder = new CTabFolder( parent, SWT.FLAT | SWT.BOTTOM );
this.cTabFolder.setLayoutData( gridData );
this.cTabFolder.addFocusListener( new FocusAdapter () {
@Override
public void focusGained( final FocusEvent event ) {
CTabFolder folder = (CTabFolder) event.widget;
CTabItem item = folder.getSelection();
if( item != null && item.getControl() != null ) {
item.getControl().setFocus();
}
}
} );
this.cTabFolder.addCTabFolder2Listener( new CTabFolder2Adapter() {
@Override
public void close( final CTabFolderEvent event ) {
((TerminalPage)((CTabItem)event.item).getControl()).closeConnection();
}
} );
IActionBars actionBars = getViewSite().getActionBars();
actionBars.setGlobalActionHandler( ActionFactory.PASTE.getId(), new Action() {
@Override
public void run() {
CTabItem item = TerminalView.this.cTabFolder.getSelection();
if( item != null && item.getControl() != null ) {
((TerminalPage)item.getControl()).paste();
}
}
} );
// removed since the global copy action binds ctrl-c in the terminal to copy
/* final Action copyAction = new Action() {
@Override
public void run() {
CTabItem item = TerminalView.this.cTabFolder.getSelection();
if( item != null && item.getControl() != null ) {
((TerminalPage)item.getControl()).copy();
}
}
};
actionBars.setGlobalActionHandler( ActionFactory.COPY.getId(), copyAction );
this.selectionProvider.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged( final SelectionChangedEvent event ) {
copyAction.setEnabled( !event.getSelection().isEmpty() );
}
} );*/
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalToolBar( bars.getToolBarManager() );
}
private void fillLocalToolBar( final IToolBarManager manager ) {
manager.add( this.newTerminalAction );
}
private void makeActions() {
this.newTerminalAction = new NewTerminalDropDownAction( this );
}
/**
* Passing the focus request to the viewer's control.
*/
@Override
public void setFocus() {
this.cTabFolder.setFocus();
}
/* (non-Javadoc)
* @see eu.geclipse.terminal.views.ITerminalView#addTerminal(java.io.InputStream,
* java.io.OutputStream)
*/
public ITerminalPage addTerminal( final IBidirectionalConnection connection,
final ITerminalListener termListener ) throws IOException {
final CTabItem cTabItem = new CTabItem( this.cTabFolder, SWT.CLOSE );
TerminalPage page = new TerminalPage( this.cTabFolder, SWT.NONE, cTabItem );
page.setConnection( connection );
page.addTerminalListener( termListener );
page.addTerminalListener( new ITerminalListener() {
/* (non-Javadoc)
* @see eu.geclipse.terminal.ITerminalListener#terminated()
*/
public void terminated() {
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
boolean closeTabs = store.getBoolean( PreferenceConstants.P_CLOSE_TABS );
if ( closeTabs ) {
Display.getDefault().syncExec( new Runnable() {
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
cTabItem.dispose();
}
} );
}
}
/* (non-Javadoc)
* @see eu.geclipse.terminal.ITerminalListener#windowSizeChanged(int, int, int, int)
*/
public void windowSizeChanged( final int cols, final int lines,
final int pixels, final int pixels2 ) {
// not needed
}
/* (non-Javadoc)
* @see eu.geclipse.terminal.ITerminalListener#windowTitleChanged(java.lang.String)
*/
public void windowTitleChanged( final String windowTitle ) {
// not needed
}
} );
cTabItem.setControl( page );
this.cTabFolder.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent event ) {
TerminalView.this.selectionProvider.setSelectionProviderDelegate(
((TerminalPage)(((CTabFolder)event.getSource()).getSelection()).getControl()).getTerminal());
}
} );
this.cTabFolder.setSelection( cTabItem );
this.selectionProvider.setSelectionProviderDelegate( page.getTerminal() );
return page;
}
}