Java tutorial
/****************************************************************************** * 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.su.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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; 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.common.internal.provisional.utils.PlatformUtils; import com.ebmwebsourcing.petals.services.PetalsServicesPlugin; import com.ebmwebsourcing.petals.services.su.export.SuExportWizard.SuExportMode; import com.ebmwebsourcing.petals.services.utils.ServiceProjectRelationUtils; /** * @author Vincent Zurczak - EBM WebSourcing */ public class SuExportWizardPage extends WizardPage { protected static final String PREF_DIRECTORY_LOC = "petals.services.export.su.directory"; protected static final String PREF_FILE_LOC = "petals.services.export.su.file"; private final Map<IProject, Boolean> suProjects = new LinkedHashMap<IProject, Boolean>(); private SuExportMode exportMode; private File outputFile; private boolean complete = false; private Label lastLabel; /** * Constructor. * @param selection */ public SuExportWizardPage(IStructuredSelection selection) { super("SU Export Page"); setTitle("Service Unit Export"); //NON-NLS-1 setDescription("Export one or several Service Unit projects."); //NON-NLS-1 for (IProject p : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { if (ServiceProjectRelationUtils.isSuProject(p)) this.suProjects.put(p, false); } for (Iterator<?> it = selection.iterator(); it.hasNext();) { IProject project = PlatformUtils.getAdaptedProject(it.next()); if (project != null && this.suProjects.containsKey(project)) this.suProjects.put(project, 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(2, false); layout.marginHeight = 10; layout.marginWidth = 10; container.setLayout(layout); container.setLayoutData(new GridData(GridData.FILL_BOTH)); // Project viewer Label l = new Label(container, SWT.NONE); l.setText("Select the Service Unit project(s) to export:"); GridData layoutData = new GridData(); layoutData.horizontalSpan = 2; l.setLayoutData(layoutData); final TableViewer viewer = new TableViewer(container, SWT.BORDER | SWT.CHECK); layoutData = new GridData(GridData.FILL_BOTH); layoutData.heightHint = 140; layoutData.widthHint = 440; layoutData.horizontalSpan = 2; viewer.getTable().setLayoutData(layoutData); viewer.setLabelProvider(new WorkbenchLabelProvider()); viewer.setContentProvider(new ArrayContentProvider()); viewer.setInput(this.suProjects.keySet()); for (TableItem item : viewer.getTable().getItems()) { IProject p = (IProject) item.getData(); if (this.suProjects.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(); SuExportWizardPage.this.suProjects.put(p, checked); validate(); } }); // Export options final Composite exportComposite = new Composite(container, SWT.SHADOW_ETCHED_OUT); layout = new GridLayout(2, false); layout.marginHeight = 0; layout.marginWidth = 0; exportComposite.setLayout(layout); layoutData = new GridData(GridData.FILL_HORIZONTAL); layoutData.verticalIndent = 17; layoutData.horizontalSpan = 2; exportComposite.setLayoutData(layoutData); l = new Label(exportComposite, SWT.NONE); l.setText("Export mode:"); final Combo exportCombo = new Combo(exportComposite, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); exportCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); exportCombo.setItems(new String[] { "Distinct export, in a same directory", "Distinct export, in the project directories", "All-in-one export, in a same service assembly" }); this.lastLabel = new Label(exportComposite, SWT.NONE); exportCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } public void widgetDefaultSelected(SelectionEvent e) { // Get the export type int selectionIndex = exportCombo.getSelectionIndex(); // Delete the last two widgets boolean found = false; if (SuExportWizardPage.this.lastLabel != null) { for (Control control : exportComposite.getChildren()) { if (found) control.dispose(); else found = control.equals(SuExportWizardPage.this.lastLabel); } } // Add new widgets - separate, external directory if (selectionIndex == 0) { SuExportWizardPage.this.exportMode = SuExportMode.SEPARATE_IN_DIRECTORY; SuExportWizardPage.this.lastLabel.setVisible(true); SuExportWizardPage.this.lastLabel.setText("Output directory:"); Composite subContainer = new Composite(exportComposite, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginWidth = 0; layout.marginHeight = 0; subContainer.setLayout(layout); subContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final Text dirText = new Text(subContainer, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); dirText.setBackground(dirText.getDisplay().getSystemColor(SWT.COLOR_WHITE)); dirText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); String loc = PetalsServicesPlugin.getDefault().getPreferenceStore() .getString(PREF_DIRECTORY_LOC); if (loc.length() != 0) { dirText.setText(loc); SuExportWizardPage.this.outputFile = new File(loc); } dirText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { SuExportWizardPage.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 (SuExportWizardPage.this.outputFile != null && SuExportWizardPage.this.outputFile.exists()) dlg.setFilterPath(SuExportWizardPage.this.outputFile.getAbsolutePath()); String loc = dlg.open(); if (loc != null) { dirText.setText(loc); PetalsServicesPlugin.getDefault().getPreferenceStore().setValue(PREF_DIRECTORY_LOC, loc); } } }); } // Separate, project directories else if (selectionIndex == 1) { SuExportWizardPage.this.exportMode = SuExportMode.SEPARATE_IN_PROJECT; SuExportWizardPage.this.lastLabel.setVisible(false); } // Same SA else if (selectionIndex == 2) { SuExportWizardPage.this.exportMode = SuExportMode.ALL_IN_ONE; SuExportWizardPage.this.lastLabel.setVisible(true); SuExportWizardPage.this.lastLabel.setText("Output file:"); Composite subContainer = new Composite(exportComposite, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginWidth = 0; layout.marginHeight = 0; subContainer.setLayout(layout); subContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final Text fileText = new Text(subContainer, SWT.SINGLE | SWT.BORDER); fileText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); String loc = PetalsServicesPlugin.getDefault().getPreferenceStore().getString(PREF_FILE_LOC); if (loc.length() != 0) { fileText.setText(loc); SuExportWizardPage.this.outputFile = new File(loc); } fileText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { SuExportWizardPage.this.outputFile = new File(fileText.getText()); validate(); } }); final Button browseFileButton = new Button(subContainer, SWT.PUSH); browseFileButton.setText("Browse..."); browseFileButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } public void widgetDefaultSelected(SelectionEvent e) { FileDialog dlg = new FileDialog(fileText.getShell()); dlg.setText("Target Service Assembly"); dlg.setFilterExtensions(new String[] { "*.zip" }); dlg.setOverwrite(true); if (SuExportWizardPage.this.outputFile != null) { dlg.setFileName(SuExportWizardPage.this.outputFile.getName()); File parentFile = SuExportWizardPage.this.outputFile.getParentFile(); if (parentFile != null) dlg.setFilterPath(parentFile.getAbsolutePath()); } String loc = dlg.open(); if (loc != null) { if (!loc.endsWith(".zip")) loc += ".zip"; fileText.setText(loc); PetalsServicesPlugin.getDefault().getPreferenceStore().setValue(PREF_FILE_LOC, loc); } } }); } // Refresh the container exportComposite.layout(); validate(); } }); // Last UI details setControl(container); viewer.getTable().setFocus(); exportCombo.select(0); exportCombo.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 (getSuProjectsToExport().isEmpty()) updateStatus("You must select at least one Service Unit project to export."); else if (this.exportMode == null) updateStatus("You have to select an export mode."); else if (this.exportMode == SuExportMode.ALL_IN_ONE) { if (this.outputFile == null || this.outputFile.getAbsolutePath().trim().length() == 0) updateStatus("You have to provide a valid file path."); else if (this.outputFile.exists() && !this.outputFile.isFile()) updateStatus("The destination already exists and is not a file."); else updateStatus(null); } else if (this.exportMode == SuExportMode.SEPARATE_IN_DIRECTORY && (this.outputFile == null || !this.outputFile.exists() || !this.outputFile.isDirectory())) updateStatus("You have to provide a valid directory path."); 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); } /** * Gets the SU projects to export. * @return the list of SU projects to export */ public Collection<IProject> getSuProjectsToExport() { List<IProject> result = new ArrayList<IProject>(); for (Map.Entry<IProject, Boolean> entry : this.suProjects.entrySet()) { if (entry.getValue()) result.add(entry.getKey()); } return result; } /** * @return the exportMode */ public SuExportMode getExportMode() { return this.exportMode; } /** * @return the outputFile */ public File getOutputFile() { return this.outputFile; } }