/****************************************************************************** * Copyright (c) 2008-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.services.pojo.wizards; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; 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.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultSelectionListener; import com.ebmwebsourcing.petals.common.internal.provisional.swt.ListWithButtonComposite; import com.ebmwebsourcing.petals.common.internal.provisional.swt.TextWithButtonComposite; import com.ebmwebsourcing.petals.common.internal.provisional.utils.StringUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.SwtFactory; import com.ebmwebsourcing.petals.services.pojo.Messages; import com.ebmwebsourcing.petals.services.su.wizards.pages.AbstractSuWizardPage; /** * Replace the default COMPONENT page. * @author Vincent Zurczak - EBM WebSourcing * @author Micka�l Istria - EBM WebSourcing */ public class PojoProvideSpecificPage22 extends AbstractSuWizardPage { private boolean useExistingImplementation = false; private final Set<File> jarFiles = new HashSet<File> (); private String className; /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.tools.eclipse.su.main.pages.XsdBasedAbstractSuPage * #dialogChanged() */ @Override public boolean validate() { String msg = null; if( this.useExistingImplementation ) { if( this.jarFiles.size() == 0 ) msg = "You have to provide at least one *.jar file."; else if( StringUtils.isEmpty( this.className )) msg = "You have to provide the name of the POJO class."; } updateStatus( msg ); return msg == null; } /** * @return the jarFiles */ public Set<File> getJarFiles() { return this.jarFiles; } /** * @return the useExistingImplementation */ public boolean isUseExistingImplementation() { return this.useExistingImplementation; } /** * @return the className */ public String getClassName() { return this.className; } /* * (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. setDescription( "Select the Java resources of the POJO." ); final Composite container = new Composite( parent, SWT.NONE ); GridLayoutFactory.swtDefaults().numColumns( 2 ).extendedMargins( 15, 15, 20, 0 ).applyTo( container ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); setControl( container ); // Case 1: create a sample POJO Button createJavaProjectButton = new Button( container, SWT.RADIO ); createJavaProjectButton.setText( "Create a Java project and a sample POJO class." ); createJavaProjectButton.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 2, 1)); createJavaProjectButton.addSelectionListener( new DefaultSelectionListener() { @Override public void widgetSelected(SelectionEvent e) { validate(); } }); // Case 2: use an existing implementation, already packaged in a JAR final Button useExistingImplemButton = new Button( container, SWT.RADIO ); useExistingImplemButton.setText( "Use an existing POJO implementation." ); useExistingImplemButton.setSelection( this.useExistingImplementation ); useExistingImplemButton.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 3, 1)); // The list of JARs Label l = new Label(container, SWT.NONE); l.setText( Messages.classpath ); l.setLayoutData( new GridData( SWT.DEFAULT, SWT.TOP, false, true )); final ListWithButtonComposite lwb = SwtFactory.createFileListViewer( container, "Jar", this.jarFiles ); lwb.addModificationListener( new Listener() { @Override public void handleEvent( Event event ) { validate(); } }); // The class selection new Label( container, SWT.NONE ).setText( Messages.className); final TextWithButtonComposite classBrowser = new TextWithButtonComposite( container ); classBrowser.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); classBrowser.getText().setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); classBrowser.getButton().setText( "Browse..." ); classBrowser.getButton().addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { String cName = openClassSelectionDialog(); if( cName != null ) { classBrowser.getText().setText( cName ); classBrowser.getText().setSelection( cName.length()); } } }); // Hack for a nicer UI int width1 = lwb.getRemoveButton().computeSize( SWT.DEFAULT, SWT.DEFAULT ).x; int width2 = lwb.getAddButton().computeSize( SWT.DEFAULT, SWT.DEFAULT ).x; int width = Math.max( width1, width2 ); GridDataFactory.swtDefaults().hint( width, SWT.DEFAULT ).applyTo( classBrowser.getButton()); // Listeners classBrowser.getText().addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { PojoProvideSpecificPage22.this.className = ((Text) e.widget).getText(); validate(); } }); Listener activationListener = new Listener() { @Override public void handleEvent( Event event ) { PojoProvideSpecificPage22.this.useExistingImplementation = useExistingImplemButton.getSelection(); classBrowser.getText().setEnabled( PojoProvideSpecificPage22.this.useExistingImplementation ); classBrowser.getButton().setEnabled( PojoProvideSpecificPage22.this.useExistingImplementation ); lwb.setEnabled( PojoProvideSpecificPage22.this.useExistingImplementation ); validate(); } }; createJavaProjectButton.addListener( SWT.Selection, activationListener ); useExistingImplemButton.addListener( SWT.Selection, activationListener ); // Initialize createJavaProjectButton.setSelection(true); useExistingImplemButton.setSelection(false); createJavaProjectButton.notifyListeners( SWT.Selection, new Event()); validate(); setErrorMessage( null ); } /** * Opens a dialog to select a class contained in the JAR files. * @return the selected class name, or null if CANCEL was clicked */ private String openClassSelectionDialog() { // Get all the classes in the JAR List<String> classNames = new ArrayList<String> (); for( File f : this.jarFiles ) { JarFile jarFile = null; try { jarFile = new JarFile( f ); Enumeration<JarEntry> entries = jarFile.entries(); while( entries.hasMoreElements()) { String entryName = entries.nextElement().getName(); if( entryName.endsWith( ".class" ) && ! entryName.contains( "$" )) { entryName = entryName.substring( 0, entryName.length() - 6 ); entryName = entryName.replaceAll( "/", "." ); classNames.add( entryName ); } } } catch( IOException e ) { continue; } finally { if( jarFile != null ) { try { jarFile.close(); } catch( IOException e1 ) { // nothing } } } } // Display them in a dialog ElementListSelectionDialog dlg = new ElementListSelectionDialog( getShell(), new LabelProvider()); dlg.setTitle( "Class Selection" ); dlg.setElements( classNames.toArray()); dlg.setMessage( "Select the POJO class." ); dlg.setFilter( this.className != null ? this.className : "*" ); dlg.setAllowDuplicates( false ); dlg.setIgnoreCase( false ); dlg.setMultipleSelection( false ); String result = null; if( dlg.open() == Window.OK ) result = (String) dlg.getFirstResult(); return result; } }