/*******************************************************************************
* 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.StringArrayTableWizardSectionCallback;
import com.liferay.ide.ui.util.SWTUtil;
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.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.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 NewPortalPropertiesHookWizardPage extends DataModelWizardPage implements INewHookDataModelProperties
{
protected EventActionsTableWizardSection eventActionsSection;
protected Text portalPropertiesFile;
protected PropertyOverridesTableWizardSection propertyOverridesSection;
public NewPortalPropertiesHookWizardPage( IDataModel dataModel, String pageName )
{
super( dataModel, pageName, Msgs.createPortalProperties, HookUI.imageDescriptorFromPlugin(
HookUI.PLUGIN_ID, "/icons/wizban/hook_wiz.png" ) ); //$NON-NLS-1$
setDescription( Msgs.specifyPortalProperties );
}
protected void createEventActionsGroup( Composite topComposite )
{
Composite composite = SWTUtil.createTopComposite( topComposite, 2 );
composite.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 3, 1 ) );
eventActionsSection =
new EventActionsTableWizardSection(
composite, Msgs.defineActions, Msgs.addEventAction, Msgs.add, Msgs.edit,
Msgs.remove, new String[] { Msgs.eventTitle, Msgs.classTitle }, new String[] { Msgs.eventLabel, Msgs.classLabel }, null,
getDataModel(), PORTAL_PROPERTIES_ACTION_ITEMS );
GridData gd = new GridData( SWT.FILL, SWT.CENTER, true, true, 1, 1 );
gd.heightHint = 150;
eventActionsSection.setLayoutData( gd );
eventActionsSection.setCallback( new StringArrayTableWizardSectionCallback() );
IProject project = CoreUtil.getProject( getDataModel().getStringProperty( PROJECT_NAME ) );
if( project != null )
{
eventActionsSection.setProject( project );
}
}
protected void createPortalPropertiesFileGroup( 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.portalPropertiesFileLabel, 1 );
portalPropertiesFile = SWTUtil.createText( composite, 1 );
this.synchHelper.synchText( portalPropertiesFile, PORTAL_PROPERTIES_FILE, null );
Button iconFileBrowse = SWTUtil.createPushButton( composite, Msgs.browse, null );
iconFileBrowse.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
handleBrowseButton( NewPortalPropertiesHookWizardPage.this.portalPropertiesFile );
}
} );
}
protected void createPropertiesOverridesGroup( Composite topComposite )
{
Composite composite = SWTUtil.createTopComposite( topComposite, 2 );
composite.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 3, 1 ) );
propertyOverridesSection =
new PropertyOverridesTableWizardSection(
composite, Msgs.specifyProperties, Msgs.addPropertyOverride, Msgs.add, Msgs.edit,
Msgs.remove, new String[] { Msgs.propertyTitle, Msgs.valueTitle }, new String[] { Msgs.propertyLabel, Msgs.valueLabel }, null,
getDataModel(), PORTAL_PROPERTIES_OVERRIDE_ITEMS );
GridData gd = new GridData( SWT.FILL, SWT.CENTER, true, true, 1, 1 );
gd.heightHint = 150;
propertyOverridesSection.setLayoutData( gd );
propertyOverridesSection.setCallback( new StringArrayTableWizardSectionCallback() );
IProject project = CoreUtil.getProject( getDataModel().getStringProperty( PROJECT_NAME ) );
if( project != null )
{
propertyOverridesSection.setProject( project );
}
}
@Override
protected Composite createTopLevelComposite( Composite parent )
{
Composite topComposite = SWTUtil.createTopComposite( parent, 3 );
topComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true, 1, 1 ) );
createPortalPropertiesFileGroup( topComposite );
createEventActionsGroup( topComposite );
createPropertiesOverridesGroup( topComposite );
return topComposite;
}
protected ISelectionStatusValidator getContainerDialogSelectionValidator()
{
return new ISelectionStatusValidator()
{
public IStatus validate( Object[] selection )
{
if( selection != null && selection.length > 0 && selection[0] != null &&
!( selection[0] instanceof IProject ) )
{
return Status.OK_STATUS;
}
return HookUI.createErrorStatus( Msgs.chooseValidFileFolder );
}
};
}
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;
}
}
}
else if( element instanceof IFile )
{
IFile file = (IFile) element;
return file.exists() && file.getName().equals( "portal.properties" ); //$NON-NLS-1$
}
return false;
}
};
}
@Override
protected String[] getValidationPropertyNames()
{
return new String[] { PORTAL_PROPERTIES_FILE, PORTAL_PROPERTIES_ACTION_ITEMS, PORTAL_PROPERTIES_OVERRIDE_ITEMS };
}
protected void handleBrowseButton( 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( Msgs.portalPropertiesFile );
dialog.setMessage( Msgs.portalPropertiesFile );
dialog.addFilter( filter );
dialog.setInput( CoreUtil.getWorkspaceRoot() );
if( dialog.open() == Window.OK )
{
Object element = dialog.getFirstResult();
try
{
if( element instanceof IFile )
{
IFile file = (IFile) element;
text.setText( file.getFullPath().toPortableString() );
}
else if( element instanceof IFolder )
{
IFolder folder = (IFolder) element;
text.setText( folder.getFullPath().append( "portal.properties" ).toPortableString() ); //$NON-NLS-1$
}
}
catch( Exception ex )
{
// Do nothing
}
}
}
private static class Msgs extends NLS
{
public static String add;
public static String addEventAction;
public static String addPropertyOverride;
public static String browse;
public static String chooseValidFileFolder;
public static String classLabel;
public static String classTitle;
public static String createPortalProperties;
public static String defineActions;
public static String edit;
public static String eventLabel;
public static String eventTitle;
public static String portalPropertiesFileLabel;
public static String portalPropertiesFile;
public static String propertyLabel;
public static String propertyTitle;
public static String remove;
public static String specifyPortalProperties;
public static String specifyProperties;
public static String valueLabel;
public static String valueTitle;
static
{
initializeMessages( NewPortalPropertiesHookWizardPage.class.getName(), Msgs.class );
}
}
}