/*******************************************************************************
* 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.service.ui.wizard;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.project.ui.wizard.LiferayDataModelWizardPage;
import com.liferay.ide.sdk.core.SDKUtil;
import com.liferay.ide.service.core.operation.INewServiceBuilderDataModelProperties;
import com.liferay.ide.service.ui.ServiceUI;
import com.liferay.ide.ui.util.SWTUtil;
import java.net.URL;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
@SuppressWarnings( "restriction" )
public class NewServiceBuilderWizardPage extends LiferayDataModelWizardPage
implements INewServiceBuilderDataModelProperties
{
protected Text author;
protected Text namespace;
protected Button packageButton;
protected Label packageLabel;
protected Text packageText;
protected String projectName;
protected Combo projectNameCombo;
protected Label projectNameLabel;
protected Text serviceFile;
protected Button useSampleTemplate;
public NewServiceBuilderWizardPage( IDataModel dataModel, String pageName, String title, String description )
{
super( dataModel, pageName, title, ServiceUI.imageDescriptorFromPlugin(
ServiceUI.PLUGIN_ID, "/icons/wizban/service_wiz.png" ) ); //$NON-NLS-1$
setDescription( description );
}
protected void createPackageNamespaceAuthorGroup( Composite parent )
{
Composite group = SWTUtil.createTopComposite( parent, 3 );
group.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
// package
packageLabel = new Label( group, SWT.LEFT );
packageLabel.setText( Msgs.packagePath );
packageLabel.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_FILL ) );
packageText = new Text( group, SWT.SINGLE | SWT.BORDER );
packageText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
synchHelper.synchText( packageText, PACKAGE_PATH, null );
IPackageFragment packageFragment = getSelectedPackageFragment();
String targetProject = model.getStringProperty( PROJECT_NAME );
if( packageFragment != null && packageFragment.exists() &&
packageFragment.getJavaProject().getElementName().equals( targetProject ) )
{
// IPackageFragmentRoot root =
// getPackageFragmentRoot(packageFragment);
// if (root != null)
// folderText.setText(root.getPath().toString());
model.setProperty( PACKAGE_PATH, packageFragment.getElementName() );
}
packageButton = new Button( group, SWT.PUSH );
packageButton.setText( J2EEUIMessages.BROWSE_BUTTON_LABEL );
packageButton.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_FILL ) );
packageButton.addSelectionListener( new SelectionListener()
{
public void widgetDefaultSelected( SelectionEvent e )
{
// Do nothing
}
public void widgetSelected( SelectionEvent e )
{
handlePackageButtonPressed();
}
} );
SWTUtil.createLabel( group, SWT.LEAD, Msgs.namespace, 1 );
namespace = SWTUtil.createText( group, 1 );
this.synchHelper.synchText( namespace, NAMESPACE, null );
SWTUtil.createLabel( group, SWT.LEAD, StringPool.EMPTY, 1 );
SWTUtil.createLabel( group, SWT.LEAD, Msgs.author, 1 );
author = SWTUtil.createText( group, 1 );
this.synchHelper.synchText( author, AUTHOR, null );
SWTUtil.createLabel( group, StringPool.EMPTY, 1 );
SWTUtil.createLabel( group, StringPool.EMPTY, 1 );
Composite checkboxParent = SWTUtil.createComposite( group, 1, 1, SWT.FILL, 0, 3 );
useSampleTemplate =
SWTUtil.createCheckButton( checkboxParent, Msgs.includeSampleEntity, null, true, 1 );
GridData data = new GridData( SWT.FILL, SWT.CENTER, true, false, 1, 1 );
useSampleTemplate.setLayoutData( data );
this.synchHelper.synchCheckbox( useSampleTemplate, USE_SAMPLE_TEMPLATE, null );
}
/**
* Add project group
*/
protected void createProjectNameServiceFileGroup( Composite parent )
{
// set up project name label
projectNameLabel = new Label( parent, SWT.NONE );
projectNameLabel.setText( "Plugin project:" ); //$NON-NLS-1$
projectNameLabel.setLayoutData( new GridData() );
// set up project name entry field
projectNameCombo = new Combo( parent, SWT.BORDER | SWT.READ_ONLY );
GridData data = new GridData( GridData.FILL_HORIZONTAL );
data.widthHint = 300;
data.horizontalSpan = 1;
data.grabExcessHorizontalSpace = true;
projectNameCombo.setLayoutData( data );
synchHelper.synchCombo( projectNameCombo, PROJECT_NAME, null );
String initialProjectName = initializeProjectList( projectNameCombo, model );
if( projectName == null && initialProjectName != null )
{
projectName = initialProjectName;
}
SWTUtil.createLabel( parent, SWT.LEAD, Msgs.serviceFile, 1 );
serviceFile = SWTUtil.createText( parent, 1 );
this.synchHelper.synchText( serviceFile, SERVICE_FILE, null );
}
@Override
protected Composite createTopLevelComposite( Composite parent )
{
Composite topComposite = SWTUtil.createTopComposite( parent, 2 );
createProjectNameServiceFileGroup( topComposite );
SWTUtil.createSeparator( topComposite, 2 );
createPackageNamespaceAuthorGroup( topComposite );
setShellImage();
return topComposite;
}
protected IPackageFragmentRoot getPackageFragmentRoot( IPackageFragment packageFragment )
{
if( packageFragment == null )
{
return null;
}
else if( packageFragment.getParent() instanceof IPackageFragment )
{
return getPackageFragmentRoot( (IPackageFragment) packageFragment.getParent() );
}
else if( packageFragment.getParent() instanceof IPackageFragmentRoot )
{
return (IPackageFragmentRoot) packageFragment.getParent();
}
else
{
return null;
}
}
protected IPackageFragment getSelectedPackageFragment()
{
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if( window == null )
{
return null;
}
ISelection selection = window.getSelectionService().getSelection();
if( selection == null )
{
return null;
}
IJavaElement element = getInitialJavaElement( selection );
if( element != null )
{
if( element.getElementType() == IJavaElement.PACKAGE_FRAGMENT )
{
return (IPackageFragment) element;
}
else if( element.getElementType() == IJavaElement.COMPILATION_UNIT )
{
IJavaElement parent = ( (ICompilationUnit) element ).getParent();
if( parent.getElementType() == IJavaElement.PACKAGE_FRAGMENT )
{
return (IPackageFragment) parent;
}
}
else if( element.getElementType() == IJavaElement.TYPE )
{
return ( (IType) element ).getPackageFragment();
}
}
return null;
}
protected IPackageFragmentRoot getSelectedPackageFragmentRoot()
{
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if( window == null )
{
return null;
}
ISelection selection = window.getSelectionService().getSelection();
if( selection == null )
{
return null;
}
// StructuredSelection stucturedSelection = (StructuredSelection)
// selection;
IJavaElement element = getInitialJavaElement( selection );
if( element != null )
{
if( element.getElementType() == IJavaElement.PACKAGE_FRAGMENT_ROOT )
return (IPackageFragmentRoot) element;
}
return null;
}
protected String[] getValidationPropertyNames()
{
return new String[] { PROJECT_NAME, SERVICE_FILE, PACKAGE_PATH, NAMESPACE, AUTHOR };
}
protected void handlePackageButtonPressed()
{
IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model.getProperty( JAVA_PACKAGE_FRAGMENT_ROOT );
if( packRoot == null )
{
return;
}
IJavaElement[] packages = null;
try
{
packages = packRoot.getChildren();
}
catch( JavaModelException e )
{
// Do nothing
}
if( packages == null )
packages = new IJavaElement[0];
ElementListSelectionDialog dialog =
new ElementListSelectionDialog( getShell(), new JavaElementLabelProvider(
JavaElementLabelProvider.SHOW_DEFAULT ) );
dialog.setTitle( J2EEUIMessages.PACKAGE_SELECTION_DIALOG_TITLE );
dialog.setMessage( J2EEUIMessages.PACKAGE_SELECTION_DIALOG_DESC );
dialog.setEmptyListMessage( J2EEUIMessages.PACKAGE_SELECTION_DIALOG_MSG_NONE );
dialog.setElements( packages );
if( dialog.open() == Window.OK )
{
IPackageFragment fragment = (IPackageFragment) dialog.getFirstResult();
if( fragment != null )
{
packageText.setText( fragment.getElementName() );
}
else
{
packageText.setText( J2EEUIMessages.EMPTY_STRING );
}
}
}
protected boolean isProjectValid( IProject project )
{
return ( ProjectUtil.isPortletProject( project ) || ProjectUtil.isHookProject( project ) ||
ProjectUtil.isExtProject( project ) ) && SDKUtil.isSDKProject( project );
}
protected void setShellImage()
{
URL url = ServiceUI.getDefault().getBundle().getEntry( "/icons/e16/service.png" ); //$NON-NLS-1$
Image shellImage = ImageDescriptor.createFromURL( url ).createImage();
getShell().setImage( shellImage );
}
private static class Msgs extends NLS
{
public static String author;
public static String includeSampleEntity;
public static String namespace;
public static String packagePath;
public static String serviceFile;
static
{
initializeMessages( NewServiceBuilderWizardPage.class.getName(), Msgs.class );
}
}
}