/****************************************************************************** * 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; } }