/******************************************************************************
* Copyright (c) 2009-2013, Linagora
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Linagora - initial API and implementation
*******************************************************************************/
package com.ebmwebsourcing.petals.common.extensions.internal.wizards;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
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.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import com.ebmwebsourcing.petals.common.extensions.PetalsCommonWsdlExtPlugin;
/**
* The first page used in the Java2Wsdl wizard.
* <p>It aims at selecting the Java class to transform into a WSDL.</p>
* <p>
* It contains a selection table displaying all the Java projects
* available in the workspace, and a text field to select
* a class from the selected project.
* </p>
*
* @author Vincent Zurczak - EBM WebSourcing
*/
public class JavaToWSDLWizardPage extends WizardPage {
private String className;
private IJavaProject javaProject;
private Text classText;
private boolean complete = false;
private boolean firstAppearance = true;
/**
* Constructor.
* @param pageName
* @param selection
*/
public JavaToWSDLWizardPage( String pageName, IStructuredSelection selection ) {
super( pageName );
setTitle( "Java Interface" ); //NON-NLS-1
setDescription( "Select a Java interface." ); //NON-NLS-1
if( selection != null && ! selection.isEmpty()) {
Object o = selection.getFirstElement();
try {
if( o instanceof IProject
&& ((IProject) o).isAccessible()
&& ((IProject) o).hasNature( JavaCore.NATURE_ID ))
this.javaProject = JavaCore.create((IProject) o);
} catch( CoreException e ) {
PetalsCommonWsdlExtPlugin.log( e, IStatus.WARNING );
}
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage
* #createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl( Composite parent ) {
Composite container = new Composite( parent, SWT.NONE );
GridLayout layout = new GridLayout( 2, false );
container.setLayout( layout );
container.setLayoutData( new GridData( GridData.FILL_BOTH ));
// Container selection
Label l = new Label( container, SWT.NONE );
l.setText( "Select the Java project that contains the classes." );
GridData layoutData = new GridData();
layoutData.horizontalSpan = 2;
l.setLayoutData( layoutData );
TreeViewer viewer = new TreeViewer( container, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER );
layoutData = new GridData( GridData.FILL_BOTH );
layoutData.horizontalSpan = 2;
viewer.getTree().setLayoutData( layoutData );
viewer.setLabelProvider( new WorkbenchLabelProvider ());
viewer.setContentProvider( new WorkbenchContentProvider () {
@Override
public Object[] getChildren( Object o ) {
if( o instanceof IWorkspaceRoot ) {
IProject[] projects = ((IWorkspaceRoot) o).getProjects();
ArrayList<IJavaProject> result = new ArrayList<IJavaProject> ();
for( IProject project : projects ) {
try {
if( ! project.isOpen()
|| !project.hasNature( JavaCore.NATURE_ID ))
continue;
} catch( CoreException e ) {
PetalsCommonWsdlExtPlugin.log( e, IStatus.WARNING );
continue;
}
IJavaProject p = JavaCore.create( project );
result.add( p );
}
return result.toArray();
}
return new Object[ 0 ];
}
});
// Set page input
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
viewer.setInput( root );
if( this.javaProject != null ) {
viewer.setSelection( new StructuredSelection( this.javaProject ), true );
viewer.expandToLevel( this.javaProject, 1 );
}
viewer.addSelectionChangedListener( new ISelectionChangedListener () {
@Override
public void selectionChanged( SelectionChangedEvent event ) {
IStructuredSelection s = (IStructuredSelection) event.getSelection();
if( ! s.isEmpty())
JavaToWSDLWizardPage.this.javaProject = (IJavaProject) s.getFirstElement();
else
JavaToWSDLWizardPage.this.javaProject = null;
validate();
}
});
viewer.addDoubleClickListener( new IDoubleClickListener () {
@Override
public void doubleClick( DoubleClickEvent event ) {
openClassSelectionDialog();
}
});
// Class field
l = new Label( container, SWT.NONE );
l.setText( "Select the Java interface." );
layoutData = new GridData();
layoutData.horizontalSpan = 2;
layoutData.verticalIndent = 15;
l.setLayoutData( layoutData );
this.classText = new Text( container, SWT.BORDER | SWT.SINGLE );
this.classText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.classText.addModifyListener( new ModifyListener () {
@Override
public void modifyText( ModifyEvent e ) {
JavaToWSDLWizardPage.this.className = JavaToWSDLWizardPage.this.classText.getText();
validate();
}
});
Button b = new Button( container, SWT.PUSH );
b.setText( "Browse..." );
b.addSelectionListener( new SelectionAdapter () {
@Override
public void widgetDefaultSelected( SelectionEvent e ) {
openClassSelectionDialog();
}
@Override
public void widgetSelected( SelectionEvent e ) {
openClassSelectionDialog();
}
});
this.classText.setFocus();
setControl( container );
}
/**
* Open a dialog to select a class.
*/
private void openClassSelectionDialog () {
if( this.javaProject == null )
return;
Shell shell = this.classText.getShell();
IJavaSearchScope scope = SearchEngine.createJavaSearchScope(
new IJavaElement[] { this.javaProject },
IJavaSearchScope.SOURCES
| IJavaSearchScope.APPLICATION_LIBRARIES
| IJavaSearchScope.REFERENCED_PROJECTS );
String filter = this.classText.getText().trim();
filter = filter.length() == 0 ? "?" : filter;
try {
SelectionDialog dlg = JavaUI.createTypeDialog(
shell,
new ProgressMonitorDialog( shell ),
scope,
IJavaElementSearchConstants.CONSIDER_INTERFACES,
true,
filter );
if( dlg.open() == Window.OK ) {
IType type = (IType) dlg.getResult()[ 0 ];
String selection = type.getFullyQualifiedName();
this.classText.setText( selection );
this.classText.setSelection( selection.length());
}
} catch( JavaModelException e ) {
PetalsCommonWsdlExtPlugin.log( e, IStatus.ERROR );
}
}
/**
* Validates the page fields.
*/
private void validate() {
String msg = null;
if( this.javaProject == null )
msg = "You must select a Java project.";
else if( this.className == null )
msg = "You must select a Java interface.";
if( this.firstAppearance )
this.firstAppearance = false;
else
setErrorMessage( msg );
setPageComplete( msg == null );
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage
* #isPageComplete()
*/
@Override
public boolean isPageComplete() {
return this.complete;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage
* #setPageComplete(boolean)
*/
@Override
public void setPageComplete( boolean complete ) {
this.complete = complete;
super.setPageComplete( complete );
}
/**
* @return the className
*/
public String getClassName() {
return this.className;
}
/**
* @return the javaProject
*/
public IJavaProject getJavaProject() {
return this.javaProject;
}
}