Changes:
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / obfuscator / export / WizardObfuscatorResourceExportPage1.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/obfuscator/export/WizardObfuscatorResourceExportPage1.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/obfuscator/export/WizardObfuscatorResourceExportPage1.java
new file mode 100644 (file)
index 0000000..2b0c9e2
--- /dev/null
@@ -0,0 +1,470 @@
+/*******************************************************************************
+ * 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.getLocation().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].getLocation().isPrefixOf(testPath))
+                               return projects[i].getName();
+               }
+
+               return null;
+
+       }
+
+}