/*******************************************************************************
* 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.ILiferayPortal;
import com.liferay.ide.core.ILiferayProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.hook.ui.HookUI;
import com.liferay.ide.project.ui.wizard.StringArrayTableWizardSection;
import com.liferay.ide.ui.dialog.FilteredTypesSelectionDialogEx;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.core.search.BasicSearchEngine;
import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
/**
* @author Greg Amerson
* @author Simon Jiang
*/
@SuppressWarnings( "restriction" )
public class EventActionsTableWizardSection extends StringArrayTableWizardSection
{
protected class AddEventActionDialog extends AddStringArrayDialog
{
protected String[] buttonLabels;
protected CLabel errorMessageLabel;
public AddEventActionDialog( Shell shell, String windowTitle, String[] labelsForTextField, String[] buttonLabels )
{
super( shell, windowTitle, labelsForTextField );
setShellStyle( getShellStyle() | SWT.RESIZE );
this.buttonLabels = buttonLabels;
setWidthHint( 450 );
}
@Override
protected Control createContents( Composite parent )
{
Composite composite = (Composite) super.createContents( parent );
getButton( IDialogConstants.OK_ID ).setEnabled( false );
return composite;
}
@Override
public Control createDialogArea( Composite parent )
{
super.createDialogArea( parent );
errorMessageLabel = new CLabel( parent, SWT.LEFT_TO_RIGHT );
errorMessageLabel.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, true, false, 2, 1 ) );
errorMessageLabel.setImage( PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJS_ERROR_TSK ) );
errorMessageLabel.setVisible( false );
return parent;
}
@Override
protected Text createField( Composite parent, final int index )
{
Label label = new Label( parent, SWT.LEFT );
label.setText( labelsForTextField[index] );
label.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ) );
// Composite composite = new Composite(parent, SWT.NONE);
// GridData data = new GridData(GridData.FILL_HORIZONTAL);
// composite.setLayoutData(data);
// composite.setLayout(new GridLayout(2, false));
final Text text = new Text( parent, SWT.SINGLE | SWT.BORDER );
GridData data = new GridData( GridData.FILL_HORIZONTAL );
// data.widthHint = 200;
text.setLayoutData( data );
Composite buttonComposite = new Composite( parent, SWT.NONE );
String[] buttonLbls = buttonLabels[index].split( "," ); //$NON-NLS-1$
GridLayout gl = new GridLayout( buttonLbls.length, true );
gl.marginWidth = 0;
gl.horizontalSpacing = 1;
buttonComposite.setLayout( gl );
for( final String lbl : buttonLbls )
{
Button button = new Button( buttonComposite, SWT.PUSH );
button.setText( lbl );
button.addSelectionListener
(
new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
handleArrayDialogButtonSelected( index, lbl, text );
}
}
);
}
return text;
}
protected void handleArrayDialogButtonSelected( int index, String label, Text text )
{
if( index == 0 )
{ // select event
handleSelectEventButton( text );
}
else if( index == 1 && Msgs.select.equals( label ) )
{
handleSelectClassButton( text );
}
else if( index == 1 && Msgs.newLabel.equals( label ) )
{
handleNewClassButton( text );
}
}
protected void handleNewClassButton( Text text )
{
NewEventActionClassDialog dialog = new NewEventActionClassDialog( getShell(), model );
if( dialog.open() == Window.OK )
{
String qualifiedClassname = dialog.getQualifiedClassname();
text.setText( qualifiedClassname );
}
}
protected void handleSelectClassButton( Text text )
{
Control control = text;
// IPackageFragmentRoot packRoot = (IPackageFragmentRoot)
// model.getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT);
// if (packRoot == null)
// return;
IJavaSearchScope scope = null;
try
{
// scope =
// BasicSearchEngine.createHierarchyScope(packRoot.getJavaProject().findType("com.liferay.portal.kernel.events.SimpleAction"));
scope =
BasicSearchEngine.createJavaSearchScope( new IJavaElement[] { JavaCore.create( CoreUtil.getProject( model.getStringProperty( INewJavaClassDataModelProperties.PROJECT_NAME ) ) ) } );
}
catch( Exception e )
{
HookUI.logError( e );
return;
}
// This includes all entries on the classpath. This behavior is
// identical
// to the Super Class Browse Button on the Create new Java Class
// Wizard
// final IJavaSearchScope scope =
// SearchEngine.createJavaSearchScope(new
// IJavaElement[] {root.getJavaProject()} );
FilteredTypesSelectionDialog dialog =
new FilteredTypesSelectionDialogEx( getShell(), false, null, scope, IJavaSearchConstants.CLASS );
dialog.setTitle( Msgs.eventSelection );
dialog.setMessage( Msgs.selectEventAction );
if( dialog.open() == Window.OK )
{
IType type = (IType) dialog.getFirstResult();
String classFullPath = J2EEUIMessages.EMPTY_STRING;
if( type != null )
{
classFullPath = type.getFullyQualifiedName();
}
if( control instanceof Text )
{
( (Text) control ).setText( classFullPath );
}
else if( control instanceof Combo )
{
( (Combo) control ).setText( classFullPath );
}
return;
}
}
protected void handleSelectEventButton( Text text )
{
String[] hookProperties = new String[] {};
final ILiferayProject liferayProject = LiferayCore.create( project );
if( liferayProject != null )
{
final ILiferayPortal portal = liferayProject.adapt( ILiferayPortal.class );
if( portal != null )
{
hookProperties = portal.getHookSupportedProperties();
}
}
PropertiesFilteredDialog dialog = new PropertiesFilteredDialog( getParentShell(), ".*events.*" ); //$NON-NLS-1$
dialog.setTitle( Msgs.propertySelection );
dialog.setMessage( Msgs.selectProperty );
dialog.setInput( hookProperties );
if( dialog.open() == Window.OK )
{
Object[] selected = dialog.getResult();
text.setText( selected[0].toString() );
}
}
@Override
public void modifyText( ModifyEvent e )
{
boolean classNameValid = false;
if( texts[1].getText().trim().length() > 0 )
{
int classNameStatus =
JavaConventions.validateJavaTypeName(
texts[1].getText().trim(), CompilerOptions.VERSION_1_7, CompilerOptions.VERSION_1_7 ).getSeverity();
classNameValid = ( classNameStatus != IStatus.ERROR ) ? true : false;
}
if( !classNameValid )
{
errorMessageLabel.setText( "Invalid class name" );
}
this.errorMessageLabel.setVisible( !( classNameValid ) );
getButton( IDialogConstants.OK_ID ).setEnabled( classNameValid );
}
}
public class EditEventActionDialog extends EditStringArrayDialog
{
protected CLabel errorMessageLabel;
public EditEventActionDialog(
Shell shell, String windowTitle, String[] labelsForTextField, String[] valuesForTextField )
{
super( shell, windowTitle, labelsForTextField, valuesForTextField );
}
@Override
public Control createDialogArea( Composite parent )
{
super.createDialogArea( parent );
errorMessageLabel = new CLabel( parent, SWT.LEFT_TO_RIGHT );
errorMessageLabel.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, true, false, 2, 1 ) );
errorMessageLabel.setImage( PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJS_ERROR_TSK ) );
errorMessageLabel.setVisible( false );
return parent;
}
@Override
public void modifyText( ModifyEvent e )
{
boolean classNameValid = false;
if( texts[1].getText().trim().length() > 0 )
{
int classNameStatus =
JavaConventions.validateJavaTypeName(
texts[1].getText().trim(), CompilerOptions.VERSION_1_7, CompilerOptions.VERSION_1_7 ).getSeverity();
classNameValid = ( classNameStatus != IStatus.ERROR ) ? true : false;
}
if( !classNameValid )
{
errorMessageLabel.setText( "Invalid class name" );
}
this.errorMessageLabel.setVisible( !( classNameValid ) );
getButton( IDialogConstants.OK_ID ).setEnabled( classNameValid );
}
}
protected String[] buttonLabels;
// protected File eventActionPropertiesFile;
protected IProject project;
public EventActionsTableWizardSection(
Composite parent, String componentLabel, String dialogTitle, String addButtonLabel, String editButtonLabel,
String removeButtonLabel, String[] columnTitles, String[] fieldLabels, Image labelProviderImage,
IDataModel model, String propertyName )
{
super( parent, componentLabel, dialogTitle, addButtonLabel, editButtonLabel, removeButtonLabel, columnTitles, fieldLabels, labelProviderImage, model, propertyName );
this.buttonLabels = new String[] { Msgs.select, Msgs.selectNew };
}
public void setProject( IProject project )
{
this.project = project;
}
@Override
protected void handleAddButtonSelected()
{
AddEventActionDialog dialog = new AddEventActionDialog( getShell(), dialogTitle, fieldLabels, buttonLabels );
if( dialog.open() == Window.OK )
{
String[] stringArray = dialog.getStringArray();
addStringArray( stringArray );
}
}
@Override
protected void handleEditButtonSelected()
{
ISelection s = viewer.getSelection();
if (!(s instanceof IStructuredSelection))
{
return;
}
IStructuredSelection selection = (IStructuredSelection) s;
if (selection.size() != 1)
{
return;
}
Object selectedObj = selection.getFirstElement();
String[] valuesForText = (String[]) selectedObj;
EditEventActionDialog dialog = new EditEventActionDialog(getShell(), dialogTitle, fieldLabels, valuesForText);
dialog.open();
String[] stringArray = dialog.getStringArray();
editStringArray(valuesForText, stringArray);
}
private static class Msgs extends NLS
{
public static String eventSelection;
public static String newLabel;
public static String propertySelection;
public static String select;
public static String selectEventAction;
public static String selectNew;
public static String selectProperty;
static
{
initializeMessages( EventActionsTableWizardSection.class.getName(), Msgs.class );
}
}
}