/*******************************************************************************
*
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
*******************************************************************************/
package com.liferay.ide.server.ui.portal;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.server.core.portal.PortalBundle;
import com.liferay.ide.server.core.portal.PortalRuntime;
import com.liferay.ide.server.ui.LiferayServerUI;
import com.liferay.ide.ui.util.SWTUtil;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstallType;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
import org.eclipse.wst.server.ui.wizard.IWizardHandle;
/**
* @author Gregory Amerson
* @author Simon Jiang
* @author Andy Wu
*/
public class PortalRuntimeComposite extends Composite implements ModifyListener
{
private Text dirField;
private List<IVMInstall> installedJREs;
private String[] jreNames;
private Button jreButton;
private Combo jreCombo;
private Label jreLabel;
private Text nameField;
private IRuntimeWorkingCopy runtimeWC;
private Text typeField;
private final IWizardHandle wizard;
public PortalRuntimeComposite( Composite parent, IWizardHandle wizard )
{
super( parent, SWT.NONE );
this.wizard = wizard;
wizard.setTitle( Msgs.liferayPortalRuntime );
wizard.setDescription( Msgs.specifyInstallationDirectory );
wizard.setImageDescriptor( LiferayServerUI.getImageDescriptor( LiferayServerUI.IMG_WIZ_RUNTIME ) );
createControl( parent );
}
protected void createControl( final Composite parent )
{
setLayout( createLayout() );
setLayoutData( createLayoutData() );
setBackground( parent.getBackground() );
createFields();
enableJREControls( false );
Dialog.applyDialogFont( this );
}
private void createFields()
{
this.nameField = createTextField( Msgs.name );
this.nameField.addModifyListener( this );
this.dirField = createTextField( Msgs.liferayPortalRuntimeDirectory );
this.dirField.addModifyListener( this );
SWTUtil.createButton( this, Msgs.browse ).addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
final DirectoryDialog dd = new DirectoryDialog( getShell() );
dd.setMessage( Msgs.selectLiferayPortalDirectory );
final String selectedDir = dd.open();
if( selectedDir != null )
{
dirField.setText( selectedDir );
}
}
});
this.typeField = createReadOnlyTextField( Msgs.detectedPortalBundleType );
jreLabel = createLabel( Msgs.selecteRuntimeJRE );
jreCombo = new Combo( this, SWT.DROP_DOWN | SWT.READ_ONLY );
jreCombo.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
jreCombo.addModifyListener( new ModifyListener()
{
@Override
public void modifyText( ModifyEvent e )
{
int sel = jreCombo.getSelectionIndex();
IVMInstall vmInstall = null;
if( sel > 0 )
{
vmInstall = installedJREs.get( sel - 1 );
}
PortalRuntime portalRuntime = getPortalRuntime();
if( portalRuntime != null )
{
portalRuntime.setVMInstall( vmInstall );
}
validate();
}
} );
jreButton = SWTUtil.createButton( this, Msgs.installedJREs );
jreButton.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
if( SWTUtil.showPreferencePage(
"org.eclipse.jdt.debug.ui.preferences.VMPreferencePage", getShell() ) )
{
updateJREs();
validate();
}
}
});
}
protected Label createLabel( String text )
{
Label label = new Label( this, SWT.NONE );
label.setText( text );
GridDataFactory.generate( label, 2, 1 );
return label;
}
protected Layout createLayout()
{
return new GridLayout( 2, false );
}
private GridData createLayoutData()
{
return new GridData( GridData.FILL_BOTH );
}
protected Text createReadOnlyTextField( String labelText )
{
return createTextField( labelText, SWT.READ_ONLY );
}
protected Text createTextField( String labelText )
{
return createTextField( labelText, SWT.NONE );
}
protected Text createTextField( String labelText, int style )
{
createLabel( labelText );
Text text = new Text( this, SWT.BORDER | style );
text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
return text;
}
protected void enableJREControls( boolean enabled )
{
jreLabel.setEnabled( enabled );
jreCombo.setEnabled( enabled );
jreButton.setEnabled( enabled );
}
protected PortalRuntime getPortalRuntime()
{
return (PortalRuntime) getRuntime().loadAdapter( PortalRuntime.class, null );
}
protected IRuntimeWorkingCopy getRuntime()
{
return this.runtimeWC;
}
protected void init()
{
if( this.dirField == null || this.nameField == null || getRuntime() == null )
{
return;
}
setFieldValue( this.nameField, getRuntime().getName() );
setFieldValue( this.dirField, getRuntime().getLocation() != null ?
getRuntime().getLocation().toOSString() : StringPool.EMPTY );
updateFields();
}
@Override
public void modifyText( ModifyEvent e )
{
if( e.getSource().equals( dirField ) )
{
getRuntime().setLocation( new Path( dirField.getText() ) );
updateFields();
validate();
enableJREControls( true );
updateJREs();
}
else if( e.getSource().equals( nameField ) )
{
getRuntime().setName( nameField.getText() );
}
}
public void setRuntime( IRuntimeWorkingCopy newRuntime )
{
if( newRuntime == null )
{
this.runtimeWC = null;
}
else
{
this.runtimeWC = newRuntime;
}
init();
try
{
validate();
}
catch( NullPointerException e )
{
// ignore exception because this composite haven't been created and there are no shell
}
}
private void updateFields()
{
final PortalRuntime portalRuntime = getPortalRuntime();
if( portalRuntime != null )
{
final PortalBundle portalBundle = portalRuntime.getPortalBundle();
setFieldValue( this.typeField, portalBundle != null ? portalBundle.getDisplayName() : StringPool.BLANK );
}
}
protected void validate()
{
final IStatus status = this.runtimeWC.validate( null );
if( status == null || status.isOK() )
{
this.wizard.setMessage( null, IMessageProvider.NONE );
}
else if( status.getSeverity() == IStatus.WARNING )
{
this.wizard.setMessage( status.getMessage(), IMessageProvider.WARNING );
}
else
{
this.wizard.setMessage( status.getMessage(), IMessageProvider.ERROR );
}
this.wizard.update();
}
public static void setFieldValue( Text field, String value )
{
if( field != null && !field.isDisposed() )
{
field.setText( value != null ? value : StringPool.EMPTY );
}
}
protected void updateJREs()
{
PortalRuntime portalRuntime = getPortalRuntime();
IVMInstall currentVM = null;
if ( portalRuntime!=null && portalRuntime.getVMInstall()!=null )
{
currentVM = portalRuntime.getVMInstall();
}
else
{
currentVM = JavaRuntime.getDefaultVMInstall();
}
int currentJREIndex = -1;
// get all installed JVMs
installedJREs = new ArrayList<IVMInstall>();
IVMInstallType[] vmInstallTypes = JavaRuntime.getVMInstallTypes();
int size = vmInstallTypes.length;
for( int i = 0; i < size; i++ )
{
IVMInstall[] vmInstalls = vmInstallTypes[i].getVMInstalls();
int size2 = vmInstalls.length;
for( int j = 0; j < size2; j++ )
{
installedJREs.add( vmInstalls[j] );
}
}
// get names
size = installedJREs.size();
jreNames = new String[size + 1];
jreNames[0] = Msgs.defaultWorkbenchJRE;
for( int i = 0; i < size; i++ )
{
IVMInstall vmInstall = installedJREs.get( i );
jreNames[i + 1] = vmInstall.getName();
if( vmInstall.equals( currentVM ) )
{
currentJREIndex = i + 1;
}
}
if( jreCombo != null )
{
jreCombo.setItems( jreNames );
jreCombo.select( currentJREIndex );
}
}
static class Msgs extends NLS
{
public static String browse;
public static String defaultWorkbenchJRE;
public static String detectedPortalBundleType;
public static String installedJREs;
public static String liferayPortalRuntime;
public static String liferayPortalRuntimeDirectory;
public static String name;
public static String selecteRuntimeJRE;
public static String selectLiferayPortalDirectory;
public static String specifyInstallationDirectory;
static
{
initializeMessages( PortalRuntimeComposite.class.getName(), Msgs.class );
}
}
}