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