/******************************************************************************* * 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; } }