Compatibility fragment commit
[phpeclipse.git] / net.sourceforge.phpeclipse.32.compatibility / src / net / sourceforge / phpeclipse / obfuscator / export / WizardObfuscatorResourceExportPage1.java
diff --git a/net.sourceforge.phpeclipse.32.compatibility/src/net/sourceforge/phpeclipse/obfuscator/export/WizardObfuscatorResourceExportPage1.java b/net.sourceforge.phpeclipse.32.compatibility/src/net/sourceforge/phpeclipse/obfuscator/export/WizardObfuscatorResourceExportPage1.java
new file mode 100644 (file)
index 0000000..bb5dd99
--- /dev/null
@@ -0,0 +1,505 @@
+/*******************************************************************************
+ * 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;
+
+       }
+
+}