/*******************************************************************************
* 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.ui.snippets.wizard;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.ui.util.SWTUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog;
import org.eclipse.jdt.internal.ui.wizards.SuperInterfaceSelectionDialog;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.jsf.common.util.JDTBeanIntrospector;
import org.eclipse.jst.jsf.common.util.JDTBeanProperty;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
/**
* @author Greg Amerson
*/
@SuppressWarnings( { "restriction", "rawtypes" } )
public class AbstractModelWizardPage extends NewTypeWizardPage
{
protected class TypeFieldAdapter implements IStringButtonAdapter, IDialogFieldListener, IListAdapter
{
// -------- IStringButtonAdapter
public void changeControlPressed( DialogField field )
{
typeChangeControlPressed( field );
}
public void customButtonPressed( ListDialogField field, int index )
{
// doButtonPressed(index);
}
public void dialogFieldChanged( DialogField field )
{
}
public void doubleClicked( ListDialogField field )
{
}
public void selectionChanged( ListDialogField field )
{
}
}
protected static final int IDX_DESELECT = 1;
protected static final int IDX_SELECT = 0;
public static Object[] getTypeProperties( IType type )
{
if( type == null )
{
return null;
}
JDTBeanIntrospector beanIntrospector = new JDTBeanIntrospector( type );
Map<String, JDTBeanProperty> properties = beanIntrospector.getProperties();
return properties.keySet().toArray();
}
protected IEditorPart editorPart;
protected String lastVarName = StringPool.EMPTY;
protected StringButtonDialogField modelClassDialogField;
protected CheckedListDialogField propertyListField;
protected Label varNameLabel;
protected Text varNameText;
public AbstractModelWizardPage( String pageName, IEditorPart editor )
{
super( true, pageName );
editorPart = editor;
TypeFieldAdapter adapter = new TypeFieldAdapter();
modelClassDialogField = new StringButtonDialogField( adapter );
modelClassDialogField.setLabelText( Msgs.modelClassLabel );
modelClassDialogField.setButtonLabel( Msgs.newTypeWizardPage_superclass_button );
String[] buttonLabels = new String[] { Msgs.selectAllLabel, Msgs.deselectAllLabel };
propertyListField = new CheckedListDialogField( adapter, buttonLabels, new LabelProvider() );
propertyListField.setDialogFieldListener( adapter );
propertyListField.setLabelText( Msgs.propertyColumnsLabel );
propertyListField.setCheckAllButtonIndex( IDX_SELECT );
propertyListField.setUncheckAllButtonIndex( IDX_DESELECT );
}
public void createControl( Composite parent )
{
Composite topComposite = SWTUtil.createTopComposite( parent, 3 );
modelClassDialogField.doFillIntoGrid( topComposite, 3 );
// Text modelClassText = modelClassDialogField.getTextControl(null);
//
// JavaTypeCompletionProcessor classCompletionProcessor = new JavaTypeCompletionProcessor(false, false, true);
// classCompletionProcessor.setCompletionContextRequestor(new CompletionContextRequestor() {
//
// @Override
// public StubTypeContext getStubTypeContext() {
// return getClassStubTypeContext();
// }
// });
//
// ControlContentAssistHelper.createTextContentAssistant(modelClassText, classCompletionProcessor);
// TextFieldNavigationHandler.install(modelClassText);
propertyListField.doFillIntoGrid( topComposite, 3 );
LayoutUtil.setHorizontalSpan( propertyListField.getLabelControl( null ), 1 );
LayoutUtil.setWidthHint( propertyListField.getLabelControl( null ), convertWidthInCharsToPixels( 40 ) );
LayoutUtil.setHorizontalGrabbing( propertyListField.getListControl( null ) );
propertyListField.getTableViewer().setComparator( new ViewerComparator() );
varNameLabel = new Label( topComposite, SWT.LEFT );
varNameLabel.setText( Msgs.variableNameLabel );
varNameLabel.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_FILL ) );
varNameText = new Text( topComposite, SWT.SINGLE | SWT.BORDER );
varNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
varNameText.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
lastVarName = varNameText.getText();
}
} );
setControl( topComposite );
}
public IJavaProject getJavaProject()
{
IJavaProject javaProject = null;
if( editorPart != null )
{
IEditorInput editorInput = editorPart.getEditorInput();
if( editorInput instanceof IFileEditorInput )
{
IProject project = ( (IFileEditorInput) editorInput ).getFile().getProject();
return JavaCore.create( project );
}
}
return javaProject;
}
public String getModel()
{
try
{
IType type = getJavaProject().findType( getModelClass() );
return type.getElementName();
}
catch( Exception e )
{
}
return StringPool.EMPTY;
}
public String getModelClass()
{
return modelClassDialogField.getText();
}
// protected StubTypeContext getClassStubTypeContext() {
// if (fClassStubTypeContext == null) {
// fClassStubTypeContext = TypeContextChecker.createSuperClassStubTypeContext(getTypeName(), null, null);
// }
// return fClassStubTypeContext;
// }
public String[] getPropertyColumns()
{
return (String[]) propertyListField.getCheckedElements().toArray( new String[0] );
}
public String getTypeName()
{
return modelClassDialogField.getText();
}
public String getVarName()
{
return lastVarName;
}
protected IType chooseClass()
{
IJavaProject project = getJavaProject();
if( project == null )
{
return null;
}
IJavaElement[] elements = new IJavaElement[] { project };
IJavaSearchScope scope = SearchEngine.createJavaSearchScope( elements );
FilteredTypesSelectionDialog dialog =
new FilteredTypesSelectionDialog(
getShell(), false, getWizard().getContainer(), scope, IJavaSearchConstants.CLASS_AND_INTERFACE );
dialog.setTitle( Msgs.modelClassSelection );
dialog.setMessage( Msgs.newTypeWizardPage_SuperClassDialog_message );
dialog.setInitialPattern( getSuperClass() );
if( dialog.open() == Window.OK )
{
return (IType) dialog.getFirstResult();
}
return null;
}
protected void handleBrowseButtonPressed()
{
}
protected void typeChangeControlPressed( DialogField field )
{
IType type = chooseClass();
if( type != null )
{
modelClassDialogField.setText( SuperInterfaceSelectionDialog.getNameWithTypeParameters( type ) );
updatePropertyList( type );
}
}
protected void updatePropertyList( IType type )
{
List<Object> propNames = new ArrayList<Object>();
Object[] props = getTypeProperties( type );
if( !CoreUtil.isNullOrEmpty( props ) )
{
propNames.addAll( Arrays.asList( props ) );
}
try
{
if( type.isInterface() )
{
String[] superInterfaces = type.getSuperInterfaceNames();
if( !CoreUtil.isNullOrEmpty( superInterfaces ) )
{
for( String superInterface : superInterfaces )
{
IType superInterfaceType = type.getJavaProject().findType( superInterface );
Object[] superInterfaceProps = getTypeProperties( superInterfaceType );
if( !CoreUtil.isNullOrEmpty( superInterfaceProps ) )
{
propNames.addAll( Arrays.asList( superInterfaceProps ) );
}
}
}
}
else
{
IType superType = type.getJavaProject().findType( type.getSuperclassName() );
Object[] superTypeProps = getTypeProperties( superType );
if( !CoreUtil.isNullOrEmpty( superTypeProps ) )
{
propNames.addAll( Arrays.asList( superTypeProps ) );
}
}
}
catch( Exception e )
{
// no error this is best effort
}
propertyListField.setElements( propNames );
varNameText.setText( "a" + getModel() ); //$NON-NLS-1$
}
private static class Msgs extends NLS
{
public static String deselectAllLabel;
public static String modelClassLabel;
public static String modelClassSelection;
public static String newTypeWizardPage_superclass_button;
public static String newTypeWizardPage_SuperClassDialog_message;
public static String propertyColumnsLabel;
public static String selectAllLabel;
public static String variableNameLabel;
static
{
initializeMessages( AbstractModelWizardPage.class.getName(), Msgs.class );
}
}
}