/****************************************************************************** * Copyright (c) 2010-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.sa.export; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; 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.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.DirectoryDialog; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.model.WorkbenchLabelProvider; import com.ebmwebsourcing.petals.services.PetalsServicesPlugin; import com.ebmwebsourcing.petals.services.sa.export.SaExportWizard.SaExportMode; import com.ebmwebsourcing.petals.services.utils.ServiceProjectRelationUtils; /** * @author Vincent Zurczak - EBM WebSourcing */ public class SaExportWizardPage extends WizardPage { private static final String PREF_DIRECTORY_LOC = "petals.services.export.sa.directory"; private final Map<IProject,Boolean> saProjects = new LinkedHashMap<IProject,Boolean> (); private SaExportMode exportMode; private File outputFile; private boolean complete = false; /** * Constructor. * @param selection */ public SaExportWizardPage( IStructuredSelection selection ) { super( "SA Export Page" ); setTitle( "Service Assembly Export" ); //NON-NLS-1 setDescription( "Export one or several Service Assembly projects." ); //NON-NLS-1 for( IProject p : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { if( projectMatches( p )) this.saProjects.put( p, false ); } for( Iterator<?> it=selection.iterator(); it.hasNext(); ) { Object o = it.next(); if( o instanceof IProject ) { IProject p = (IProject) o; if( this.saProjects.containsKey( p )) this.saProjects.put( p, true ); } } } /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage * #createControl(org.eclipse.swt.widgets.Composite) */ public void createControl( Composite parent ) { Composite container = new Composite( parent, SWT.NONE ); GridLayout layout = new GridLayout(); layout.marginHeight = 10; layout.marginWidth = 10; container.setLayout( layout ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); new Label( container, SWT.NONE ).setText( "Select the Service Assembly project(s) to export:" ); // Project viewer TableViewer viewer = new TableViewer( container, SWT.BORDER | SWT.CHECK ); GridData layoutData = new GridData( GridData.FILL_BOTH ); layoutData.heightHint = 180; viewer.getTable().setLayoutData( layoutData ); viewer.setLabelProvider( new WorkbenchLabelProvider()); viewer.setContentProvider( new ArrayContentProvider()); viewer.setInput( this.saProjects.keySet()); for( TableItem item : viewer.getTable().getItems()) { IProject p = (IProject) item.getData(); if( this.saProjects.get( p )) item.setChecked( true ); } viewer.getTable().addListener( SWT.Selection, new Listener() { public void handleEvent( Event event ) { boolean checked = ((TableItem) event.item).getChecked(); IProject p = (IProject) ((TableItem) event.item).getData(); SaExportWizardPage.this.saProjects.put( p, checked ); validate(); } }); // Export mode Label label = new Label( container, SWT.NONE ); label.setText( "Select the export mode:" ); layoutData = new GridData(); layoutData.verticalIndent = 17; label.setLayoutData( layoutData ); // Export mode - one per project Button projectModeButton = new Button( container, SWT.RADIO ); projectModeButton.setText( "Export every selected Service Assembly in its project." ); projectModeButton.setToolTipText( "The created archives will be placed at the root of the associated Service Assembly projects." ); layoutData = new GridData(); layoutData.verticalIndent = 3; projectModeButton.setLayoutData( layoutData ); // Export mode - one per project, in a same directory Button separateModeButton = new Button( container, SWT.RADIO ); separateModeButton.setText( "Export the Service Assemblies separately, but in a same directory." ); separateModeButton.setToolTipText( "The created archive will be placed in the selected directory." ); Composite subContainer = new Composite( container, SWT.NONE ); layout = new GridLayout( 3, false ); layout.marginWidth = 0; layout.marginHeight = 0; layout.marginLeft = 16; subContainer.setLayout( layout ); subContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); final Label dirLabel = new Label( subContainer, SWT.NONE ); dirLabel.setText( "Output directory:" ); layoutData = new GridData(); layoutData.widthHint = 90; dirLabel.setLayoutData( layoutData ); final Text dirText = new Text( subContainer, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY ); dirText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); String loc = PetalsServicesPlugin.getDefault().getPreferenceStore().getString( PREF_DIRECTORY_LOC ); if( loc.length() != 0 ) { dirText.setText( loc ); this.outputFile = new File( loc ); } dirText.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { SaExportWizardPage.this.outputFile = new File( dirText.getText()); validate(); } }); final Button browseDirButton = new Button( subContainer, SWT.PUSH ); browseDirButton.setText( "Browse..." ); browseDirButton.addSelectionListener( new SelectionListener() { public void widgetSelected( SelectionEvent e ) { widgetDefaultSelected( e ); } public void widgetDefaultSelected( SelectionEvent e ) { DirectoryDialog dlg = new DirectoryDialog( dirText.getShell()); dlg.setText( "Output Directory" ); dlg.setMessage( "Select the output directory." ); if( SaExportWizardPage.this.outputFile != null && SaExportWizardPage.this.outputFile.exists()) dlg.setFilterPath( SaExportWizardPage.this.outputFile.getAbsolutePath()); String loc = dlg.open(); if( loc != null ) { dirText.setText( loc ); PetalsServicesPlugin.getDefault().getPreferenceStore().setValue( PREF_DIRECTORY_LOC, loc ); } } }); // Selection listeners projectModeButton.addSelectionListener( new SelectionListener() { public void widgetSelected( SelectionEvent e ) { widgetDefaultSelected( e ); } public void widgetDefaultSelected( SelectionEvent e ) { dirLabel.setEnabled( false ); dirText.setEnabled( false ); browseDirButton.setEnabled( false ); dirText.setBackground( dirText.getDisplay().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND )); SaExportWizardPage.this.outputFile = null; SaExportWizardPage.this.exportMode = SaExportMode.IN_PROJECT; validate(); } }); separateModeButton.addSelectionListener( new SelectionListener() { public void widgetSelected( SelectionEvent e ) { widgetDefaultSelected( e ); } public void widgetDefaultSelected( SelectionEvent e ) { dirLabel.setEnabled( true ); dirText.setEnabled( true ); browseDirButton.setEnabled( true ); dirText.setBackground( dirText.getDisplay().getSystemColor( SWT.COLOR_WHITE )); SaExportWizardPage.this.outputFile = new File( dirText.getText()); SaExportWizardPage.this.exportMode = SaExportMode.IN_SAME_LOCATION; validate(); } }); // Last UI details setControl( container ); viewer.getTable().setFocus(); projectModeButton.setSelection( true ); projectModeButton.notifyListeners( SWT.Selection, new Event()); String msg = getErrorMessage(); if( msg != null ) { setErrorMessage( null ); setMessage( msg, IMessageProvider.INFORMATION ); } } /** * Validates the page entries. */ private void validate() { setMessage( null, IMessageProvider.INFORMATION ); if( getSaProjectsToExport().isEmpty()) updateStatus( "You must select at least one Service Assembly project to export." ); else if( this.exportMode == null ) updateStatus( "You have to select an export mode." ); else if( this.exportMode == SaExportMode.IN_SAME_LOCATION && ( this.outputFile == null || ! this.outputFile.exists() || ! this.outputFile.isDirectory())) updateStatus( "You have to select a valid output directory." ); else updateStatus( null ); } /** * Updates the page status. * @param msg */ private void updateStatus( String msg ) { 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 ); } /** * Checks if a project can be a base project. * @param project * @return */ private boolean projectMatches( IProject project ) { boolean result = project.isAccessible() &&ServiceProjectRelationUtils.isSaProject( project ); return result; } /** * Gets the SA projects to export. * @return the list of SA projects to export */ public Collection<IProject> getSaProjectsToExport() { List<IProject> result = new ArrayList<IProject>(); for( Map.Entry<IProject,Boolean> entry : this.saProjects.entrySet()) { if( entry.getValue()) result.add( entry.getKey()); } return result; } /** * @return the exportMode */ public SaExportMode getExportMode() { return this.exportMode; } /** * @return the outputFile */ public File getOutputFile() { return this.outputFile; } }