X-Git-Url: http://git.phpeclipse.com 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 index 0000000..bb5dd99 --- /dev/null +++ b/net.sourceforge.phpeclipse.32.compatibility/src/net/sourceforge/phpeclipse/obfuscator/export/WizardObfuscatorResourceExportPage1.java @@ -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 null + */ + 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; + + } + +}