/*******************************************************************************
* 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.hook.ui.wizard;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.hook.core.operation.INewHookDataModelProperties;
import com.liferay.ide.hook.ui.HookUI;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.project.ui.wizard.StringArrayTableWizardSection;
import com.liferay.ide.project.ui.wizard.StringArrayTableWizardSectionCallback;
import com.liferay.ide.ui.util.SWTUtil;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
/**
* @author Greg Amerson
*/
@SuppressWarnings( "restriction" )
public class NewLanguagePropertiesHookWizardPage extends DataModelWizardPage implements INewHookDataModelProperties
{
protected Text contentFolder;
protected StringArrayTableWizardSection languagePropertiesSection;
public NewLanguagePropertiesHookWizardPage( IDataModel dataModel, String pageName )
{
super( dataModel, pageName, Msgs.createLanguageProperties, HookUI.imageDescriptorFromPlugin(
HookUI.PLUGIN_ID, "/icons/wizban/hook_wiz.png" ) ); //$NON-NLS-1$
setDescription( Msgs.createNewLanguagePropertiesFiles );
}
protected void createContentFolderGroup( Composite topComposite )
{
Composite composite = SWTUtil.createTopComposite( topComposite, 3 );
GridLayout gl = new GridLayout( 3, false );
gl.marginLeft = 5;
composite.setLayout( gl );
composite.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 3, 1 ) );
SWTUtil.createLabel( composite, SWT.LEAD, Msgs.contentFolder, 1 );
contentFolder = SWTUtil.createText( composite, 1 );
this.synchHelper.synchText( contentFolder, CONTENT_FOLDER, null );
Button iconFileBrowse = SWTUtil.createPushButton( composite, Msgs.browse, null );
iconFileBrowse.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
handleFileBrowseButton( NewLanguagePropertiesHookWizardPage.this.contentFolder );
}
} );
}
protected void createLanguagePropertiesGroup( Composite parent )
{
Composite composite = SWTUtil.createTopComposite( parent, 2 );
composite.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 3, 1 ) );
languagePropertiesSection =
new StringArrayTableWizardSection(
composite, Msgs.languagePropertyFiles, Msgs.languagePropertyFileTitle, Msgs.add, Msgs.edit, Msgs.remove,
new String[] { Msgs.add }, new String[] { Msgs.languagePropertyFileLabel }, null, getDataModel(),
LANGUAGE_PROPERTIES_ITEMS );
GridData gd = new GridData( SWT.FILL, SWT.CENTER, true, true, 1, 1 );
gd.heightHint = 175;
languagePropertiesSection.setLayoutData( gd );
languagePropertiesSection.setCallback( new StringArrayTableWizardSectionCallback() );
}
@Override
protected Composite createTopLevelComposite( Composite parent )
{
Composite topComposite = SWTUtil.createTopComposite( parent, 3 );
createContentFolderGroup( topComposite );
createLanguagePropertiesGroup( topComposite );
return topComposite;
}
@Override
protected void enter()
{
super.enter();
this.synchHelper.synchAllUIWithModel();
}
protected ISelectionStatusValidator getContainerDialogSelectionValidator()
{
return new ISelectionStatusValidator()
{
public IStatus validate( Object[] selection )
{
if( selection != null && selection.length > 0 && selection[0] != null &&
!( selection[0] instanceof IProject ) && !( selection[0] instanceof IFile ) )
{
return Status.OK_STATUS;
}
return HookUI.createErrorStatus( Msgs.chooseValidFolder );
}
};
}
protected ViewerFilter getContainerDialogViewerFilter()
{
return new ViewerFilter()
{
@SuppressWarnings( "deprecation" )
public boolean select( Viewer viewer, Object parent, Object element )
{
if( element instanceof IProject )
{
IProject project = (IProject) element;
return project.getName().equals(
model.getProperty( IArtifactEditOperationDataModelProperties.PROJECT_NAME ) );
}
else if( element instanceof IFolder )
{
IFolder folder = (IFolder) element;
// only show source folders
IProject project =
CoreUtil.getProject( model.getStringProperty( IArtifactEditOperationDataModelProperties.PROJECT_NAME ) );
IPackageFragmentRoot[] sourceFolders = J2EEProjectUtilities.getSourceContainers( project );
for( int i = 0; i < sourceFolders.length; i++ )
{
if( sourceFolders[i].getResource() != null && sourceFolders[i].getResource().equals( folder ) )
{
return true;
}
else if( ProjectUtil.isParent( folder, sourceFolders[i].getResource() ) )
{
return true;
}
}
}
return false;
}
};
}
@Override
protected String[] getValidationPropertyNames()
{
return new String[] { CONTENT_FOLDER, LANGUAGE_PROPERTIES_ITEMS };
}
protected void handleFileBrowseButton( final Text text )
{
ISelectionStatusValidator validator = getContainerDialogSelectionValidator();
ViewerFilter filter = getContainerDialogViewerFilter();
ITreeContentProvider contentProvider = new WorkbenchContentProvider();
ILabelProvider labelProvider =
new DecoratingLabelProvider(
new WorkbenchLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator() );
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog( getShell(), labelProvider, contentProvider );
dialog.setValidator( validator );
dialog.setTitle( J2EEUIMessages.CONTAINER_SELECTION_DIALOG_TITLE );
dialog.setMessage( J2EEUIMessages.CONTAINER_SELECTION_DIALOG_DESC );
dialog.addFilter( filter );
dialog.setInput( CoreUtil.getWorkspaceRoot() );
if( dialog.open() == Window.OK )
{
Object element = dialog.getFirstResult();
try
{
if( element instanceof IFolder )
{
IFolder folder = (IFolder) element;
IProject project = CoreUtil.getProject( getDataModel().getStringProperty( PROJECT_NAME ) );
List<IFolder> sources = CoreUtil.getSourceFolders( JavaCore.create( project ) );
if( sources.size() > 0 && folder.equals( sources.get( 0 ) ) )
{
folder = folder.getFolder( "content" ); //$NON-NLS-1$
}
text.setText( folder.getFullPath().toPortableString() );
}
}
catch( Exception ex )
{
// Do nothing
}
}
}
private static class Msgs extends NLS
{
public static String add;
public static String browse;
public static String chooseValidFolder;
public static String contentFolder;
public static String createLanguageProperties;
public static String createNewLanguagePropertiesFiles;
public static String edit;
public static String languagePropertyFileLabel;
public static String languagePropertyFiles;
public static String languagePropertyFileTitle;
public static String remove;
static
{
initializeMessages( NewLanguagePropertiesHookWizardPage.class.getName(), Msgs.class );
}
}
}