--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.obfuscator.export;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+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.DirectoryDialog;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.dialogs.WizardExportResourcesPage;
+
+/**
+ * Page 1 of the base resource export-to-file-system Wizard
+ */
+/* package */
+class WizardObfuscatorResourceExportPage1 extends WizardExportResourcesPage
+ implements Listener {
+
+ // widgets
+ private Combo destinationNameField;
+
+ private Button destinationBrowseButton;
+
+ protected Button overwriteExistingFilesCheckbox;
+
+ // protected Button createDirectoryStructureButton;
+ // protected Button createSelectionOnlyButton;
+
+ // constants
+ private static final int SIZING_TEXT_FIELD_WIDTH = 250;
+
+ // dialog store id constants
+ private static final String STORE_DESTINATION_NAMES_ID = "WizardObfuscatorResourceExportPage1.STORE_DESTINATION_NAMES_ID"; //$NON-NLS-1$
+
+ private static final String STORE_OVERWRITE_EXISTING_FILES_ID = "WizardObfuscatorResourceExportPage1.STORE_OVERWRITE_EXISTING_FILES_ID"; //$NON-NLS-1$
+ // private static final String STORE_CREATE_STRUCTURE_ID =
+ // "WizardObfuscatorResourceExportPage1.STORE_CREATE_STRUCTURE_ID";
+ // //$NON-NLS-1$
+
+ // messages
+ private static final String SELECT_DESTINATION_MESSAGE = ObfuscatorExportMessages
+ .getString("FileExport.selectDestinationMessage"); //$NON-NLS-1$
+
+ private static final String SELECT_DESTINATION_TITLE = ObfuscatorExportMessages
+ .getString("FileExport.selectDestinationTitle"); //$NON-NLS-1$
+
+ /**
+ * Create an instance of this class
+ */
+ protected WizardObfuscatorResourceExportPage1(String name,
+ IStructuredSelection selection) {
+ super(name, selection);
+ }
+
+ /**
+ * Create an instance of this class
+ */
+ public WizardObfuscatorResourceExportPage1(IStructuredSelection selection) {
+ this("fileSystemExportPage1", selection); //$NON-NLS-1$
+ setTitle(ObfuscatorExportMessages
+ .getString("ObfuscatorTransfer.fileSystemTitle")); //$NON-NLS-1$
+ setDescription(ObfuscatorExportMessages
+ .getString("FileExport.exportLocalFileSystem")); //$NON-NLS-1$
+ }
+
+ /**
+ * Add the passed value to self's destination widget's history
+ *
+ * @param value
+ * java.lang.String
+ */
+ protected void addDestinationItem(String value) {
+ destinationNameField.add(value);
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ giveFocusToDestination();
+ // WorkbenchHelp.setHelp(
+ // getControl(),
+ // IDataTransferHelpContextIds.FILE_SYSTEM_EXPORT_WIZARD_PAGE);
+ }
+
+ /**
+ * Create the export destination specification widgets
+ *
+ * @param parent
+ * org.eclipse.swt.widgets.Composite
+ */
+ protected void createDestinationGroup(Composite parent) {
+
+ Font font = parent.getFont();
+ // destination specification group
+ Composite destinationSelectionGroup = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ destinationSelectionGroup.setLayout(layout);
+ destinationSelectionGroup.setLayoutData(new GridData(
+ GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+ destinationSelectionGroup.setFont(font);
+
+ Label destinationLabel = new Label(destinationSelectionGroup, SWT.NONE);
+ destinationLabel.setText(getDestinationLabel());
+ destinationLabel.setFont(font);
+
+ // destination name entry field
+ destinationNameField = new Combo(destinationSelectionGroup, SWT.SINGLE
+ | SWT.BORDER);
+ destinationNameField.addListener(SWT.Modify, this);
+ destinationNameField.addListener(SWT.Selection, this);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
+ | GridData.GRAB_HORIZONTAL);
+ data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+ destinationNameField.setLayoutData(data);
+ destinationNameField.setFont(font);
+
+ // destination browse button
+ destinationBrowseButton = new Button(destinationSelectionGroup,
+ SWT.PUSH);
+ destinationBrowseButton.setText(ObfuscatorExportMessages
+ .getString("ObfuscatorTransfer.browse")); //$NON-NLS-1$
+ destinationBrowseButton.addListener(SWT.Selection, this);
+ destinationBrowseButton.setFont(font);
+ setButtonLayoutData(destinationBrowseButton);
+
+ new Label(parent, SWT.NONE); // vertical spacer
+ }
+
+ /**
+ * Create the buttons in the options group.
+ */
+
+ protected void createOptionsGroupButtons(Group optionsGroup) {
+
+ Font font = optionsGroup.getFont();
+ createOverwriteExisting(optionsGroup, font);
+
+ // createDirectoryStructureOptions(optionsGroup, font);
+ }
+
+ /**
+ * Create the buttons for the group that determine if the entire or selected
+ * directory structure should be created.
+ *
+ * @param optionsGroup
+ * @param font
+ */
+ // protected void createDirectoryStructureOptions(
+ // Group optionsGroup,
+ // Font font) {
+ // // create directory structure radios
+ // createDirectoryStructureButton =
+ // new Button(optionsGroup, SWT.RADIO | SWT.LEFT);
+ // createDirectoryStructureButton.setText(ObfuscatorExportMessages.getString("FileExport.createDirectoryStructure"));
+ // //$NON-NLS-1$
+ // createDirectoryStructureButton.setSelection(false);
+ // createDirectoryStructureButton.setFont(font);
+ //
+ // // create directory structure radios
+ // createSelectionOnlyButton =
+ // new Button(optionsGroup, SWT.RADIO | SWT.LEFT);
+ // createSelectionOnlyButton.setText(
+ // ObfuscatorExportMessages.getString(
+ // "FileExport.createSelectedDirectories"));//$NON-NLS-1$
+ // createSelectionOnlyButton.setSelection(true);
+ // createSelectionOnlyButton.setFont(font);
+ // }
+ /**
+ * Create the button for checking if we should ask if we are going to
+ * overwrite existing files.
+ *
+ * @param optionsGroup
+ * @param font
+ */
+ protected void createOverwriteExisting(Group optionsGroup, Font font) {
+ // overwrite... checkbox
+ overwriteExistingFilesCheckbox = new Button(optionsGroup, SWT.CHECK
+ | SWT.LEFT);
+ overwriteExistingFilesCheckbox.setText(ObfuscatorExportMessages
+ .getString("ExportFile.overwriteExisting")); //$NON-NLS-1$
+ overwriteExistingFilesCheckbox.setFont(font);
+ }
+
+ /**
+ * Attempts to ensure that the specified directory exists on the local file
+ * system. Answers a boolean indicating success.
+ *
+ * @return boolean
+ * @param directory
+ * java.io.File
+ */
+ protected boolean ensureDirectoryExists(File directory) {
+ if (!directory.exists()) {
+ if (!queryYesNoQuestion(ObfuscatorExportMessages
+ .getString("ObfuscatorTransfer.createTargetDirectory"))) //$NON-NLS-1$
+ return false;
+
+ if (!directory.mkdirs()) {
+ displayErrorDialog(ObfuscatorExportMessages
+ .getString("ObfuscatorTransfer.directoryCreationError")); //$NON-NLS-1$
+ giveFocusToDestination();
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * If the target for export does not exist then attempt to create it. Answer
+ * a boolean indicating whether the target exists (ie.- if it either
+ * pre-existed or this method was able to create it)
+ *
+ * @return boolean
+ */
+ protected boolean ensureTargetIsValid(File targetDirectory) {
+ if (targetDirectory.exists() && !targetDirectory.isDirectory()) {
+ displayErrorDialog(ObfuscatorExportMessages
+ .getString("FileExport.directoryExists")); //$NON-NLS-1$
+ giveFocusToDestination();
+ return false;
+ }
+
+ return ensureDirectoryExists(targetDirectory);
+ }
+
+ /**
+ * Set up and execute the passed Operation. Answer a boolean indicating
+ * success.
+ *
+ * @return boolean
+ */
+ protected boolean executeExportOperation(ObfuscatorExportOperation op) {
+ // op.setCreateLeadupStructure(
+ // createDirectoryStructureButton.getSelection());
+ op.setOverwriteFiles(overwriteExistingFilesCheckbox.getSelection());
+
+ try {
+ getContainer().run(true, true, op);
+ } catch (InterruptedException e) {
+ return false;
+ } catch (InvocationTargetException e) {
+ displayErrorDialog(e.getTargetException());
+ return false;
+ }
+
+ IStatus status = op.getStatus();
+ if (!status.isOK()) {
+ ErrorDialog.openError(getContainer().getShell(),
+ ObfuscatorExportMessages
+ .getString("ObfuscatorTransfer.exportProblems"), //$NON-NLS-1$
+ null, // no special message
+ status);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * The Finish button was pressed. Try to do the required work now and answer
+ * a boolean indicating success. If false is returned then the wizard will
+ * not close.
+ *
+ * @return boolean
+ */
+ public boolean finish() {
+ if (!ensureTargetIsValid(new File(getDestinationValue())))
+ return false;
+
+ List resourcesToExport = getWhiteCheckedResources();
+
+ // Save dirty editors if possible but do not stop if not all are saved
+ saveDirtyEditors();
+ // about to invoke the operation so save our state
+ saveWidgetValues();
+
+ if (resourcesToExport.size() > 0)
+ return executeExportOperation(new ObfuscatorExportOperation(null,
+ resourcesToExport, getDestinationValue(), this));
+
+ MessageDialog.openInformation(getContainer().getShell(),
+ ObfuscatorExportMessages
+ .getString("ObfuscatorTransfer.information"), //$NON-NLS-1$
+ ObfuscatorExportMessages.getString("FileExport.noneSelected")); //$NON-NLS-1$
+
+ return false;
+ }
+
+ /**
+ * Answer the string to display in self as the destination type
+ *
+ * @return java.lang.String
+ */
+ protected String getDestinationLabel() {
+ return ObfuscatorExportMessages.getString("FileExport.toDirectory"); //$NON-NLS-1$
+ }
+
+ /**
+ * Answer the contents of self's destination specification widget
+ *
+ * @return java.lang.String
+ */
+ protected String getDestinationValue() {
+ return destinationNameField.getText().trim();
+ }
+
+ /**
+ * Set the current input focus to self's destination entry field
+ */
+ protected void giveFocusToDestination() {
+ destinationNameField.setFocus();
+ }
+
+ /**
+ * Open an appropriate destination browser so that the user can specify a
+ * source to import from
+ */
+ protected void handleDestinationBrowseButtonPressed() {
+ DirectoryDialog dialog = new DirectoryDialog(getContainer().getShell(),
+ SWT.SAVE);
+ dialog.setMessage(SELECT_DESTINATION_MESSAGE);
+ dialog.setText(SELECT_DESTINATION_TITLE);
+ dialog.setFilterPath(getDestinationValue());
+ String selectedDirectoryName = dialog.open();
+
+ if (selectedDirectoryName != null) {
+ setErrorMessage(null);
+ setDestinationValue(selectedDirectoryName);
+ }
+ }
+
+ /**
+ * Handle all events and enablements for widgets in this page
+ *
+ * @param e
+ * Event
+ */
+ public void handleEvent(Event e) {
+ Widget source = e.widget;
+
+ if (source == destinationBrowseButton)
+ handleDestinationBrowseButtonPressed();
+
+ updatePageCompletion();
+ }
+
+ /**
+ * Hook method for saving widget values for restoration by the next instance
+ * of this class.
+ */
+ protected void internalSaveWidgetValues() {
+ // update directory names history
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ String[] directoryNames = settings
+ .getArray(STORE_DESTINATION_NAMES_ID);
+ if (directoryNames == null)
+ directoryNames = new String[0];
+
+ directoryNames = addToHistory(directoryNames, getDestinationValue());
+ settings.put(STORE_DESTINATION_NAMES_ID, directoryNames);
+
+ // options
+ settings.put(STORE_OVERWRITE_EXISTING_FILES_ID,
+ overwriteExistingFilesCheckbox.getSelection());
+
+ // settings.put(
+ // STORE_CREATE_STRUCTURE_ID,
+ // createDirectoryStructureButton.getSelection());
+
+ }
+ }
+
+ /**
+ * Hook method for restoring widget values to the values that they held last
+ * time this wizard was used to completion.
+ */
+ protected void restoreWidgetValues() {
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ String[] directoryNames = settings
+ .getArray(STORE_DESTINATION_NAMES_ID);
+ if (directoryNames == null)
+ return; // ie.- no settings stored
+
+ // destination
+ setDestinationValue(directoryNames[0]);
+ for (int i = 0; i < directoryNames.length; i++)
+ addDestinationItem(directoryNames[i]);
+
+ // options
+ overwriteExistingFilesCheckbox.setSelection(settings
+ .getBoolean(STORE_OVERWRITE_EXISTING_FILES_ID));
+
+ // boolean createDirectories =
+ // settings.getBoolean(STORE_CREATE_STRUCTURE_ID);
+ // createDirectoryStructureButton.setSelection(createDirectories);
+ // createSelectionOnlyButton.setSelection(!createDirectories);
+ }
+ }
+
+ /**
+ * Set the contents of the receivers destination specification widget to the
+ * passed value
+ *
+ */
+ protected void setDestinationValue(String value) {
+ destinationNameField.setText(value);
+ }
+
+ /**
+ * Answer a boolean indicating whether the receivers destination
+ * specification widgets currently all contain valid values.
+ */
+ protected boolean validateDestinationGroup() {
+ String destinationValue = getDestinationValue();
+ if (destinationValue.length() == 0) {
+ setMessage(destinationEmptyMessage());
+ return false;
+ }
+
+ String conflictingContainer = getConflictingContainerNameFor(destinationValue);
+ if (conflictingContainer == null)
+ setErrorMessage(""); //$NON-NLS-1$
+ else {
+ setErrorMessage(ObfuscatorExportMessages.format(
+ "FileExport.conflictingContainer", //$NON-NLS-1$
+ new Object[] { conflictingContainer }));
+ giveFocusToDestination();
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Get the message used to denote an empty destination.
+ */
+ protected String destinationEmptyMessage() {
+ return ObfuscatorExportMessages
+ .getString("FileExport.destinationEmpty"); //$NON-NLS-1$
+ }
+
+ /**
+ * Returns the name of a container with a location that encompasses
+ * targetDirectory. Returns null if there is no conflict.
+ *
+ * @param targetDirectory
+ * the path of the directory to check.
+ * @return the conflicting container name or <code>null</code>
+ */
+ protected String getConflictingContainerNameFor(String targetDirectory) {
+
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IPath testPath = new Path(targetDirectory);
+
+ if (root.getFullPath().isPrefixOf(testPath))
+ return ObfuscatorExportMessages.getString("FileExport.rootName"); //$NON-NLS-1$
+
+ IProject[] projects = root.getProjects();
+
+ for (int i = 0; i < projects.length; i++) {
+ if (projects[i].getFullPath().isPrefixOf(testPath))
+ return projects[i].getName();
+ }
+
+ return null;
+
+ }
+
+}