/*******************************************************************************
* 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.project.ui;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.project.core.ProjectCore;
import com.liferay.ide.project.core.facet.IPluginProjectDataModelProperties;
import com.liferay.ide.project.core.model.LiferayPluginSDKOp;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKCorePlugin;
import com.liferay.ide.sdk.core.SDKUtil;
import com.liferay.ide.server.core.ILiferayRuntime;
import com.liferay.ide.server.util.ServerUtil;
import com.liferay.ide.ui.util.SWTUtil;
import com.liferay.ide.ui.util.UIUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.osgi.util.NLS;
import org.eclipse.sapphire.ui.def.DefinitionLoader;
import org.eclipse.sapphire.ui.def.DefinitionLoader.Reference;
import org.eclipse.sapphire.ui.forms.DialogDef;
import org.eclipse.sapphire.ui.forms.swt.SapphireDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.ServerCore;
import org.osgi.service.prefs.BackingStoreException;
/**
* @author Greg Amerson
* @author Simon Jiang
*/
public class LiferayProjectPropertyPage extends PropertyPage
implements IWorkbenchPropertyPage, IPluginProjectDataModelProperties
{
private Combo runtimeCombo;
private Text sdkLabel;
public LiferayProjectPropertyPage()
{
super();
setImageDescriptor( ProjectUI.imageDescriptorFromPlugin(
ProjectUI.PLUGIN_ID, "/icons/e16/liferay.png" ) ); //$NON-NLS-1$
noDefaultAndApplyButton();
}
@Override
protected Control createContents( Composite parent )
{
Composite top = SWTUtil.createTopComposite( parent, 3 );
createInfoGroup( top );
return top;
}
protected Group createDefaultGroup( Composite parent, String text, int columns )
{
GridLayout gl = new GridLayout( columns, false );
Group group = new Group( parent, SWT.NONE );
group.setText( text );
group.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
group.setLayout( gl );
return group;
}
@Override
public boolean performOk()
{
final IProject proj = getProject();
if ( SDKUtil.isSDKProject( proj ) )
{
if ( runtimeCombo != null )
{
final String selectedRuntimeName = this.runtimeCombo.getText();
if( !CoreUtil.isNullOrEmpty( selectedRuntimeName ) )
{
final org.eclipse.wst.common.project.facet.core.runtime.IRuntime runtime =
RuntimeManager.getRuntime( selectedRuntimeName );
if( runtime != null )
{
final IFacetedProject fProject = ProjectUtil.getFacetedProject( getProject() );
final org.eclipse.wst.common.project.facet.core.runtime.IRuntime primaryRuntime =
fProject.getPrimaryRuntime();
if( !runtime.equals( primaryRuntime ) )
{
Job job = new WorkspaceJob("Setting targeted runtime for project.") //$NON-NLS-1$
{
@Override
public IStatus runInWorkspace( IProgressMonitor monitor ) throws CoreException
{
IStatus retval = Status.OK_STATUS;
try
{
fProject.setTargetedRuntimes( Collections.singleton( runtime ), monitor );
fProject.setPrimaryRuntime( runtime, monitor );
}
catch( Exception e )
{
retval = ProjectUI.createErrorStatus( "Could not set targeted runtime", e ); //$NON-NLS-1$
}
return retval;
}
};
job.schedule();
}
}
else
{
return false;
}
}
}
final String sdkName = this.sdkLabel.getText();
if ( !CoreUtil.isNullOrEmpty( sdkName ) )
{
try
{
final IEclipsePreferences prefs = new ProjectScope( getProject() ).getNode( SDKCorePlugin.PLUGIN_ID );
prefs.put( SDKCorePlugin.PREF_KEY_SDK_NAME, sdkName );
prefs.flush();
}
catch( BackingStoreException be )
{
ProjectCore.logError( "Unable to persist sdk name to project " + getProject(), be );
}
}
}
return true;
}
protected void createInfoGroup( final Composite parent )
{
new Label( parent, SWT.LEFT ).setText( Msgs.liferayPluginTypeLabel );
final Text pluginTypeLabel = new Text( parent, SWT.READ_ONLY | SWT.BORDER );
pluginTypeLabel.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 2, 1 ) );
final IProjectFacet liferayFacet = ProjectUtil.getLiferayFacet( getFacetedProject() );
if( liferayFacet != null )
{
pluginTypeLabel.setText( liferayFacet.getLabel() );
}
final IProject proj = getProject();
if ( proj != null && ProjectUtil.isLiferayFacetedProject( proj ) )
{
try
{
if ( ! ProjectUtil.isMavenProject( proj ) )
{
final SDK projectSdk = SDKUtil.getSDK( getProject() );
new Label( parent, SWT.LEFT ).setText( Msgs.liferaySdkLabel );
sdkLabel = new Text( parent, SWT.READ_ONLY | SWT.BORDER );
if( projectSdk != null )
{
sdkLabel.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 2, 1 ) );
sdkLabel.setText( projectSdk.getName() );
}
else
{
sdkLabel.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 1, 1 ) );
sdkLabel.setText( "" );
final Hyperlink link = new Hyperlink( parent, SWT.NULL );
link.setLayoutData( new GridData( SWT.RIGHT, SWT.TOP, false, false, 1, 1 ) );
link.setForeground( parent.getDisplay().getSystemColor( SWT.COLOR_BLUE ) );
link.setUnderlined( true );
link.setText( Msgs.changeliferaySdk );
link.addHyperlinkListener
(
new HyperlinkAdapter()
{
public void linkActivated( HyperlinkEvent e )
{
final LiferayPluginSDKOp op =
( (LiferayPluginSDKOp) ( LiferayPluginSDKOp.TYPE.instantiate().initialize() ) );
final Reference<DialogDef> dialogRef =
DefinitionLoader.context( this.getClass().getClassLoader() ).sdef(
"com.liferay.ide.project.ui.dialog.SelectPluginsSDKDialog" ).dialog( "ConfigureLiferaySDK" );
final SapphireDialog dialog =
new SapphireDialog( UIUtil.getActiveShell(), op, dialogRef );
dialog.setBlockOnOpen( true );
final int result = dialog.open();
if( result != SapphireDialog.CANCEL )
{
sdkLabel.setText( op.getPluginsSDKName().content() );
}
}
}
);
}
new Label( parent, SWT.LEFT ).setText( Msgs.liferayRuntimeLabel );
this.runtimeCombo = new Combo( parent, SWT.DROP_DOWN | SWT.READ_ONLY );
this.runtimeCombo.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false, 2, 1 ) );
String currentRuntimeName = null;
try
{
ILiferayRuntime liferayRuntime = ServerUtil.getLiferayRuntime( getProject() );
if ( liferayRuntime != null)
{
currentRuntimeName = liferayRuntime.getRuntime().getName();
}
}
catch( Exception e )
{
ProjectUI.logError( "Could not determine liferay runtime", e ); //$NON-NLS-1$
}
final List<String> runtimeNames = new ArrayList<String>();
int selectionIndex = -1;
for( IRuntime runtime : ServerCore.getRuntimes() )
{
if( ServerUtil.isLiferayRuntime( runtime ) )
{
runtimeNames.add( runtime.getName() );
if( runtime.getName().equals( currentRuntimeName ) )
{
selectionIndex = runtimeNames.size() - 1;
}
}
}
if( runtimeNames.size() == 0 )
{
runtimeNames.add( "No Liferay runtimes available." ); //$NON-NLS-1$
}
this.runtimeCombo.setItems( runtimeNames.toArray( new String[0] ) );
if( selectionIndex > -1 )
{
this.runtimeCombo.select( selectionIndex );
}
}
}
catch(Exception e)
{
ProjectUI.logError( "Could not determine whether its a maven project ", e ); //$NON-NLS-1$
}
}
}
protected IFacetedProject getFacetedProject()
{
IFacetedProject retval = null;
IProject project = getProject();
if( project != null )
{
retval = ProjectUtil.getFacetedProject( project );
}
return retval;
}
protected IProject getProject()
{
IAdaptable adaptable = getElement();
IProject project = (IProject) adaptable.getAdapter( IProject.class );
return project;
}
private static class Msgs extends NLS
{
public static String liferayPluginTypeLabel;
public static String liferayRuntimeLabel;
public static String liferaySdkLabel;
public static String changeliferaySdk;
static
{
initializeMessages( LiferayProjectPropertyPage.class.getName(), Msgs.class );
}
}
}