/****************************************************************************** * 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.studio.dev.properties.internal.wizards; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IContainer; 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.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; 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.wizard.WizardPage; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import com.ebmwebsourcing.petals.studio.dev.properties.internal.PetalsStudioDevPlugin; import com.ebmwebsourcing.petals.studio.dev.properties.internal.Utils; /** * The only required page to create a new 'jbi.xml' file. * @author Vincent Zurczak - EBM WebSourcing */ public class GenerateConstantsWizardPage extends WizardPage { private IPackageFragmentRoot target; private final IProject originalSelection; private String javaPackage, className; /** * Constructor. * @param project */ public GenerateConstantsWizardPage( IProject project ) { super( "MainPage" ); this.originalSelection = project; setTitle( "Constants Generation" ); setDescription( "Generate a Java class with model constants." ); } /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage * #createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl( Composite parent ) { // Create the composite container and define its layout final Composite container = new Composite( parent, SWT.NONE ); GridLayoutFactory.swtDefaults().extendedMargins( 15, 15, 15, 10 ).numColumns( 2 ).applyTo( container ); container.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); // Container viewer Label l = new Label( container, SWT.NONE ); l.setText( "Select the output directory to generate the Java constants." ); GridDataFactory.swtDefaults().span( 2, 1 ).applyTo( l ); TreeViewer viewer = new TreeViewer( container, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.HIDE_SELECTION ); GridData layoutData = new GridData( GridData.FILL_BOTH ); layoutData.heightHint = 100; layoutData.horizontalSpan = 2; viewer.getTree().setLayoutData( layoutData ); viewer.setLabelProvider( new WorkbenchLabelProvider ()); viewer.setContentProvider( new WorkbenchContentProvider() { /* * (non-Javadoc) * @see org.eclipse.ui.model.BaseWorkbenchContentProvider * #getChildren(java.lang.Object) */ @Override public Object[] getChildren( Object o ) { List<Object> children = new ArrayList<Object> (); try { if( o instanceof IJavaProject ) { for( IPackageFragmentRoot root : ((IJavaProject) o).getPackageFragmentRoots()) { if( root.getResource() instanceof IContainer ) children.add( root ); } } else if( o instanceof IWorkspaceRoot ) { for( IProject p : ((IWorkspaceRoot) o).getProjects()) { if( ! p.isAccessible() || ! p.hasNature( JavaCore.NATURE_ID )) continue; IJavaProject jp = JavaCore.create( p ); if( jp != null ) children.add( jp ); } } } catch( CoreException e ) { PetalsStudioDevPlugin.log( e, IStatus.ERROR ); } return children.toArray( new Object[ 0 ]); } /* * (non-Javadoc) * @see org.eclipse.ui.model.BaseWorkbenchContentProvider * #hasChildren(java.lang.Object) */ @Override public boolean hasChildren( Object element ) { return getChildren( element ).length > 0; } }); // Set page input viewer.setInput( ResourcesPlugin.getWorkspace().getRoot()); if( this.originalSelection != null ) { try { IJavaProject jp = JavaCore.create( this.originalSelection ); for( IPackageFragmentRoot root : jp.getPackageFragmentRoots()) { if( root.getResource() instanceof IContainer ) { GenerateConstantsWizardPage.this.target = root; break; } } } catch( JavaModelException e ) { PetalsStudioDevPlugin.log( e, IStatus.ERROR, "This should not happen (check in the handler)." ); } } if( this.target != null ) { viewer.setSelection( new StructuredSelection( this.target ), true ); viewer.expandToLevel( this.target, 1 ); viewer.getTree().notifyListeners( SWT.Selection, new Event()); } // Java meta new Label( container, SWT.NONE ).setText( "Java Package:" ); final Text packageText = new Text( container, SWT.SINGLE | SWT.BORDER ); packageText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); packageText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { GenerateConstantsWizardPage.this.javaPackage = ((Text) e.widget).getText().trim(); validate(); } }); new Label( container, SWT.NONE ).setText( "Java Class Name:" ); final Text classText = new Text( container, SWT.SINGLE | SWT.BORDER ); classText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); classText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { GenerateConstantsWizardPage.this.className = ((Text) e.widget).getText().trim(); validate(); } }); // Add the missing listeners viewer.addPostSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event ) { Object o = ((IStructuredSelection) event.getSelection()).getFirstElement(); if( o instanceof IPackageFragmentRoot ) { GenerateConstantsWizardPage.this.target = (IPackageFragmentRoot) o; String pName = GenerateConstantsWizardPage.this.target.getJavaProject().getProject().getName(); packageText.setText( pName.replaceAll( "-", "." ) + ".generated" ); int index = pName.lastIndexOf( '.' ) + 1; if( index <= 0 || index > pName.length()) pName = "Default"; else pName = pName.substring( index ); classText.setText( pName ); } else { GenerateConstantsWizardPage.this.target = null; } } }); // Set control setControl( container ); } /** * Validates the page entries. */ private void validate() { String errorMsg = null; if( this.target == null ) errorMsg = "You must select a source folder to generate the code."; else if( Utils.isEmpty( this.javaPackage )) errorMsg = "You must specify a Java package name."; else if( Utils.isEmpty( this.className )) errorMsg = "You must specify a Java class name."; setErrorMessage( errorMsg ); setPageComplete( errorMsg == null ); } /** * @return the javaPackage */ public String getJavaPackage() { return this.javaPackage; } /** * @return the className */ public String getClassName() { return this.className; } /** * @return the target */ public IPackageFragmentRoot getTarget() { return this.target; } }