/*******************************************************************************
* Copyright (c) 2007, 2009 Innoopract Informationssysteme GmbH.
* 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
*
* Contributors:
* Innoopract Informationssysteme GmbH - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.rap.ui.internal.launch.tab;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import org.eclipse.rap.ui.internal.launch.*;
import org.eclipse.rap.ui.internal.launch.RAPLaunchConfig.BrowserMode;
import org.eclipse.rap.ui.internal.launch.RAPLaunchConfig.LibraryVariant;
import org.eclipse.rap.ui.internal.launch.util.ErrorUtil;
import org.eclipse.rap.ui.internal.launch.util.Images;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.dialogs.PreferencesUtil;
public final class MainTab extends AbstractLaunchConfigurationTab {
private static final String BROWSER_PREFERENCE_PAGE
= "org.eclipse.ui.browser.preferencePage"; //$NON-NLS-1$
private final GridDataFactory fillHorizontal;
private final ModifyListener modifyListener;
private final SelectionListener selectionListener;
private final Image tabImage;
private final Image warnImage;
private Text txtServletName;
private Text txtEntryPoint;
private Button cbTerminatePrevious;
private Button cbOpenBrowser;
private Button rbInternalBrowser;
private Button rbExternalBrowser;
private Button cbManualPort;
private Spinner spnPort;
private Button cbUseSessionTimeout;
private Spinner spnSessionTimeout;
private ComboViewer cmbLogLevel;
private ComboViewer cmbLibVariant;
public MainTab() {
tabImage = Images.DESC_MAIN_TAB.createImage();
warnImage = Images.WARNING.createImage();
GridData gridData = new GridData( SWT.FILL, SWT.CENTER, true, false );
fillHorizontal = GridDataFactory.createFrom( gridData );
modifyListener = new ModifyListener() {
public void modifyText( final ModifyEvent e ) {
updateLaunchConfigurationDialog();
}
};
selectionListener = new SelectionAdapter() {
public void widgetSelected( final SelectionEvent e ) {
updateLaunchConfigurationDialog();
}
};
}
////////////
// Overrides
public void dispose() {
tabImage.dispose();
warnImage.dispose();
super.dispose();
}
public void createControl( final Composite parent ) {
// Create container that holds all sections
Composite container = new Composite( parent, SWT.NONE );
container.setLayout( new GridLayout() );
container.setLayoutData( new GridData( GridData.FILL_BOTH ) );
// Create sections
createServletNameAndEntryPointSection( container );
createBrowserModeSection( container );
createRuntimeSettingsSection( container );
// Set container for this tab page
Dialog.applyDialogFont( container );
setControl( container );
}
public String getName() {
return LaunchMessages.MainTab_Name;
}
public Image getImage() {
return tabImage;
}
public void initializeFrom( final ILaunchConfiguration config ) {
RAPLaunchConfig rapConfig = new RAPLaunchConfig( config );
try {
// ServletName
txtServletName.setText( rapConfig.getServletName() );
// EntryPoint
txtEntryPoint.setText( rapConfig.getEntryPoint() );
// TerminatePrevious
cbTerminatePrevious.setSelection( rapConfig.getTerminatePrevious() );
// Port
cbManualPort.setSelection( rapConfig.getUseManualPort() );
spnPort.setSelection( rapConfig.getPort() );
// OpenBrowser
boolean openBrowser = rapConfig.getOpenBrowser();
cbOpenBrowser.setSelection( openBrowser );
rbInternalBrowser.setEnabled( openBrowser );
rbExternalBrowser.setEnabled( openBrowser );
// BrowserMode
if( BrowserMode.EXTERNAL.equals( rapConfig.getBrowserMode() ) ) {
rbExternalBrowser.setSelection( true );
rbInternalBrowser.setSelection( false );
} else {
rbExternalBrowser.setSelection( false );
rbInternalBrowser.setSelection( true );
}
// SessionTimeout
cbUseSessionTimeout.setSelection( rapConfig.getUseSessionTimeout() );
spnSessionTimeout.setSelection( rapConfig.getSessionTimeout() );
// LogLevel
Level logLevel = rapConfig.getLogLevel();
StructuredSelection logSelection = new StructuredSelection( logLevel );
cmbLogLevel.setSelection( logSelection );
// LibraryVariant
LibraryVariant libVariant = rapConfig.getLibraryVariant();
StructuredSelection libSelection = new StructuredSelection( libVariant );
cmbLibVariant.setSelection( libSelection );
} catch( CoreException e ) {
ErrorUtil.show( null, e );
}
}
public void performApply( final ILaunchConfigurationWorkingCopy config ) {
RAPLaunchConfig rapConfig = new RAPLaunchConfig( config );
// ServletName
rapConfig.setServletName( txtServletName.getText() );
// EntryPoint
rapConfig.setEntryPoint( txtEntryPoint.getText() );
// TerminatePrevious
rapConfig.setTerminatePrevious( cbTerminatePrevious.getSelection() );
// OpenBrowser
rapConfig.setOpenBrowser( cbOpenBrowser.getSelection() );
// BrowserMode
rapConfig.setBrowserMode( getBrowserMode() );
// Manual Port
spnPort.setEnabled( cbManualPort.getSelection() );
// Port Number
rapConfig.setUseManualPort( cbManualPort.getSelection() );
rapConfig.setPort( spnPort.getSelection() );
// Session Timeout
spnSessionTimeout.setEnabled( cbUseSessionTimeout.getSelection() );
rapConfig.setUseSessionTimeout( cbUseSessionTimeout.getSelection() );
rapConfig.setSessionTimeout( spnSessionTimeout.getSelection() );
// Client-side log level
rapConfig.setLogLevel( getLogLevel() );
rapConfig.setLibraryVariant( getLibraryVariant() );
validate( rapConfig );
setDirty( true );
}
public void setDefaults( final ILaunchConfigurationWorkingCopy config ) {
RAPLaunchConfig.setDefaults( config );
}
public boolean isValid( final ILaunchConfiguration launchConfig ) {
return getErrorMessage() == null;
}
///////////////////////////////////
// Helping methods to create the UI
private void createServletNameAndEntryPointSection( final Composite parent ) {
Group group = new Group( parent, SWT.NONE );
group.setLayout( new GridLayout( 3, false ) );
group.setLayoutData( fillHorizontal.create() );
group.setText( LaunchMessages.MainTab_ServletAndEntryPoint );
Label lblServletName = new Label( group, SWT.NONE );
lblServletName.setText( LaunchMessages.MainTab_ServletName );
txtServletName = new Text( group, SWT.BORDER );
txtServletName.setLayoutData( fillHorizontal.create() );
txtServletName.addModifyListener( modifyListener );
Button btnBrowseServletName = new Button( group, SWT.PUSH );
btnBrowseServletName.setText( LaunchMessages.MainTab_BrowseServletName );
btnBrowseServletName.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( final SelectionEvent event ) {
handleBrowseServletName();
}
} );
Label lblEntryPoint = new Label( group, SWT.NONE );
lblEntryPoint.setText( LaunchMessages.MainTab_EntryPoint );
txtEntryPoint = new Text( group, SWT.BORDER );
txtEntryPoint.setLayoutData( fillHorizontal.create() );
txtEntryPoint.addModifyListener( modifyListener );
Button btnBrowseEntryPoint = new Button( group, SWT.PUSH );
btnBrowseEntryPoint.setText( LaunchMessages.MainTab_BrowseEntryPoint );
btnBrowseEntryPoint.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( final SelectionEvent event ) {
handleBrowseEntryPoint();
}
} );
cbTerminatePrevious = new Button( group, SWT.CHECK );
cbTerminatePrevious.setLayoutData( spanHorizontal( 3, 0 ) );
String text = LaunchMessages.MainTab_TerminatePrevious;
cbTerminatePrevious.setText( text );
cbTerminatePrevious.addSelectionListener( selectionListener );
}
private void createBrowserModeSection( final Composite parent ) {
Group group = new Group( parent, SWT.NONE );
group.setLayoutData( fillHorizontal.create() );
group.setText( LaunchMessages.MainTab_Browser );
group.setLayout( new GridLayout( 2, false ) );
cbOpenBrowser = new Button( group, SWT.CHECK );
GridDataFactory grab = GridDataFactory.swtDefaults();
grab.grab( true, false );
cbOpenBrowser.setLayoutData( grab.create() );
cbOpenBrowser.setText( LaunchMessages.MainTab_OpenApplicationIn );
cbOpenBrowser.addSelectionListener( selectionListener );
Link lnkBrowserPrefs = new Link( group, SWT.NONE );
lnkBrowserPrefs.setText( LaunchMessages.MainTab_ConfigureBrowsers );
lnkBrowserPrefs.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( final SelectionEvent event ) {
handleBrowserPrefsLink();
}
} );
rbInternalBrowser = new Button( group, SWT.RADIO );
rbInternalBrowser.setLayoutData( spanHorizontal( 2, 17 ) );
rbInternalBrowser.setText( LaunchMessages.MainTab_InternalBrowser );
rbInternalBrowser.addSelectionListener( selectionListener );
rbExternalBrowser = new Button( group, SWT.RADIO );
rbExternalBrowser.setLayoutData( spanHorizontal( 2, 17 ) );
rbExternalBrowser.setText( LaunchMessages.MainTab_ExternalBrowser );
rbExternalBrowser.addSelectionListener( selectionListener );
cbOpenBrowser.addSelectionListener( new SelectionAdapter() {
public void widgetSelected( SelectionEvent e ) {
boolean openBrowser = cbOpenBrowser.getSelection();
rbInternalBrowser.setEnabled( openBrowser );
rbExternalBrowser.setEnabled( openBrowser );
}
} );
}
private void createRuntimeSettingsSection( final Composite parent ) {
Group group = new Group( parent, SWT.NONE );
group.setLayoutData( fillHorizontal.create() );
group.setText( LaunchMessages.MainTab_RuntimeSettings );
group.setLayout( new GridLayout( 2, false ) );
cbManualPort = new Button( group, SWT.CHECK );
cbManualPort.setText( LaunchMessages.MainTab_ManualPortConfig );
cbManualPort.addSelectionListener( selectionListener );
spnPort = new Spinner( group, SWT.BORDER );
spnPort.setLayoutData( new GridData( 60, SWT.DEFAULT ) );
spnPort.setMinimum( RAPLaunchConfig.MIN_PORT_NUMBER );
spnPort.setMaximum( RAPLaunchConfig.MAX_PORT_NUMBER );
spnPort.addModifyListener( modifyListener );
cbUseSessionTimeout = new Button( group, SWT.CHECK );
cbUseSessionTimeout.setText( LaunchMessages.MainTab_ManualTimeoutConfig );
cbUseSessionTimeout.addSelectionListener( selectionListener );
spnSessionTimeout = new Spinner( group, SWT.BORDER );
spnSessionTimeout.setLayoutData( new GridData( 60, SWT.DEFAULT ) );
spnSessionTimeout.setMinimum( RAPLaunchConfig.MIN_SESSION_TIMEOUT );
spnSessionTimeout.setMaximum( RAPLaunchConfig.MAX_SESSION_TIMEOUT );
spnSessionTimeout.addModifyListener( modifyListener );
Label lblLogLevel = new Label( group, SWT.NONE );
lblLogLevel.setText( LaunchMessages.MainTab_ClientLogLevel );
cmbLogLevel = new ComboViewer( group, SWT.DROP_DOWN | SWT.READ_ONLY );
int itemCount = RAPLaunchConfig.LOG_LEVELS.length;
cmbLogLevel.getCombo().setVisibleItemCount( itemCount );
cmbLogLevel.setLabelProvider( new LogLevelLabelProvider() );
cmbLogLevel.setContentProvider( new ArrayContentProvider() );
cmbLogLevel.setInput( RAPLaunchConfig.LOG_LEVELS );
cmbLogLevel.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged( final SelectionChangedEvent event ) {
updateLaunchConfigurationDialog();
}
} );
Label lblLibraryVariant = new Label( group, SWT.NONE );
lblLibraryVariant.setText( LaunchMessages.MainTab_ClientLibraryVariant );
cmbLibVariant = new ComboViewer( group, SWT.DROP_DOWN | SWT.READ_ONLY );
cmbLibVariant.setLabelProvider( new LibraryVariantLabelProvider() );
cmbLibVariant.setContentProvider( new ArrayContentProvider() );
cmbLibVariant.setInput( LibraryVariant.values() );
cmbLibVariant.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged( final SelectionChangedEvent event ) {
updateLaunchConfigurationDialog();
}
} );
}
////////////////
// Layout helper
private static GridData spanHorizontal( final int span, int indent ) {
GridData result
= new GridData( SWT.FILL, SWT.CENTER, true, false, span, SWT.DEFAULT );
result.horizontalIndent = indent;
return result;
}
/////////////
// Validation
private void validate( final RAPLaunchConfig config ) {
RAPLaunchConfigValidator validator = new RAPLaunchConfigValidator( config );
IStatus[] states = validator.validate();
String infoMessage = findMessage( states, IStatus.INFO );
String warnMessage = findMessage( states, IStatus.WARNING );
String errorMessage = findMessage( states, IStatus.ERROR );
if( warnMessage != null ) {
setMessage( warnMessage );
} else {
setMessage( infoMessage );
}
setErrorMessage( errorMessage );
}
private static String findMessage( final IStatus[] states,
final int severity )
{
String result = null;
for( int i = 0; result == null && i < states.length; i++ ) {
if( states[ i ].matches( severity ) ) {
result = states[ i ].getMessage();
}
}
return result;
}
////////////////
// Handle events
private void handleBrowseEntryPoint() {
EntryPointSelectionDialog dialog
= new EntryPointSelectionDialog( getShell() );
if( dialog.open() == Window.OK ) {
Object[] selection = dialog.getResult();
EntryPointExtension entryPoint = ( EntryPointExtension )selection[ 0 ];
txtEntryPoint.setText( entryPoint.getParameter() );
}
}
private void handleBrowseServletName() {
ServletNameSelectionDialog dialog
= new ServletNameSelectionDialog( getShell() );
if( dialog.open() == Window.OK ) {
Object[] selection = dialog.getResult();
BrandingExtension branding = ( BrandingExtension )selection[ 0 ];
txtServletName.setText( branding.getServletName() );
String defaultEntryPointId = branding.getDefaultEntryPointId();
String parameter = null;
EntryPointExtension defaultEntryPoint
= EntryPointExtension.findById( defaultEntryPointId );
if( defaultEntryPoint != null ) {
parameter = defaultEntryPoint.getParameter();
}
if( txtEntryPoint.getText().length() == 0 && parameter != null ) {
txtEntryPoint.setText( parameter );
}
}
}
private void handleBrowserPrefsLink() {
PreferenceDialog dialog
= PreferencesUtil.createPreferenceDialogOn( getShell(),
BROWSER_PREFERENCE_PAGE,
null,
null );
dialog.open();
dialog.close();
}
/////////////////////////////////////////////////////////
// Helpers to get entered/selected values from UI widgets
private BrowserMode getBrowserMode() {
return rbExternalBrowser.getSelection()
? BrowserMode.EXTERNAL
: BrowserMode.INTERNAL;
}
private Level getLogLevel() {
Level result = Level.OFF;
ISelection selection = cmbLogLevel.getSelection();
if( !selection.isEmpty() ) {
result = ( Level )( ( IStructuredSelection )selection ).getFirstElement();
}
return result;
}
private LibraryVariant getLibraryVariant() {
LibraryVariant result = LibraryVariant.STANDARD;
ISelection selection = cmbLibVariant.getSelection();
if( !selection.isEmpty() ) {
IStructuredSelection structuredSel = ( IStructuredSelection )selection;
result = ( LibraryVariant )structuredSel.getFirstElement();
}
return result;
}
////////////////
// Inner classes
private static final class LogLevelLabelProvider extends LabelProvider {
private static final Map lables = new HashMap();
static {
lables.put( Level.ALL, LaunchMessages.MainTab_LogLevelAll );
lables.put( Level.OFF, LaunchMessages.MainTab_LogLevelOff );
lables.put( Level.CONFIG, LaunchMessages.MainTab_LogLevelConfig );
lables.put( Level.WARNING, LaunchMessages.MainTab_LogLevelWarning );
lables.put( Level.SEVERE, LaunchMessages.MainTab_LogLevelSevere );
lables.put( Level.FINE, LaunchMessages.MainTab_LogLevelFine );
lables.put( Level.FINER, LaunchMessages.MainTab_LogLevelFiner );
lables.put( Level.FINEST, LaunchMessages.MainTab_LogLevelFinest );
lables.put( Level.INFO, LaunchMessages.MainTab_LogLevelInfo );
}
public String getText( final Object element ) {
String result = ( String )lables.get( element );
if( result == null ) {
result = super.getText( element );
}
return result;
}
}
private static final class LibraryVariantLabelProvider extends LabelProvider {
public String getText( final Object element ) {
String result;
if( LibraryVariant.STANDARD.equals( element ) ) {
result = LaunchMessages.MainTab_LibraryVariantStandard;
} else if( LibraryVariant.DEBUG.equals( element ) ) {
result = LaunchMessages.MainTab_LibraryVariantDebug;
} else {
result = super.getText( element );
}
return result;
}
}
}