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