ext.org.eclipse.jdt.internal.ui.jarpackager.JarOptionsPage.java Source code

Java tutorial

Introduction

Here is the source code for ext.org.eclipse.jdt.internal.ui.jarpackager.JarOptionsPage.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package ext.org.eclipse.jdt.internal.ui.jarpackager;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.jdt.ui.jarpackager.JarPackageData;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SaveAsDialog;

import patch.org.eclipse.jdt.internal.ui.JavaPlugin;

import ext.org.eclipse.jdt.internal.corext.util.Messages;
import ext.org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import ext.org.eclipse.jdt.internal.ui.util.SWTUtil;

/**
 *   Page 2 of the JAR Package wizard
 */
class JarOptionsPage extends WizardPage implements IJarPackageWizardPage {

    // Untyped listener
    private class UntypedListener implements Listener {
        /*
         * Implements method from Listener
         */
        public void handleEvent(Event e) {
            if (getControl() == null)
                return;
            update();
        }
    }

    private JarPackageData fJarPackage;

    // widgets
    private Button fExportErrorsCheckbox;
    private Button fExportWarningsCheckbox;
    private Button fUseSourceFoldersCheckbox;
    private Composite fDescriptionFileGroup;
    private Button fSaveDescriptionCheckbox;
    private Label fDescriptionFileLabel;
    private Text fDescriptionFileText;
    private Button fDescriptionFileBrowseButton;
    private Button fBuildIfNeededCheckbox;

    // dialog store id constants
    private final static String PAGE_NAME = "jarOptionsWizardPage"; //$NON-NLS-1$

    private final static String STORE_EXPORT_WARNINGS = PAGE_NAME + ".EXPORT_WARNINGS"; //$NON-NLS-1$
    private final static String STORE_EXPORT_ERRORS = PAGE_NAME + ".EXPORT_ERRORS"; //$NON-NLS-1$
    private final static String STORE_SAVE_DESCRIPTION = PAGE_NAME + ".SAVE_DESCRIPTION"; //$NON-NLS-1$
    private final static String STORE_DESCRIPTION_LOCATION = PAGE_NAME + ".DESCRIPTION_LOCATION"; //$NON-NLS-1$
    private final static String STORE_USE_SRC_FOLDERS = PAGE_NAME + ".STORE_USE_SRC_FOLDERS"; //$NON-NLS-1$
    private final static String STORE_BUILD_IF_NEEDED = PAGE_NAME + ".BUILD_IF_NEEDED"; //$NON-NLS-1$

    /**
     *   Create an instance of this class
     * @param jarPackage
     */
    public JarOptionsPage(JarPackageData jarPackage) {
        super(PAGE_NAME);
        setTitle(JarPackagerMessages.JarOptionsPage_title);
        setDescription(JarPackagerMessages.JarOptionsPage_description);
        fJarPackage = jarPackage;
    }

    /*
     * Method declared on IDialogPage.
     */
    public void createControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NULL);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));

        createOptionsGroup(composite);

        restoreWidgetValues();
        setControl(composite);
        update();

        Dialog.applyDialogFont(composite);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.JAROPTIONS_WIZARD_PAGE);
    }

    /**
     *   Create the export options specification widgets.
     *
     *   @param parent org.eclipse.swt.widgets.Composite
     */
    protected void createOptionsGroup(Composite parent) {

        initializeDialogUnits(parent);

        Composite optionsGroup = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        optionsGroup.setLayout(layout);

        createLabel(optionsGroup, JarPackagerMessages.JarOptionsPage_howTreatProblems_label, false);

        UntypedListener selectionListener = new UntypedListener();

        fExportErrorsCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fExportErrorsCheckbox.setText(JarPackagerMessages.JarOptionsPage_exportErrors_text);
        fExportErrorsCheckbox.addListener(SWT.Selection, selectionListener);

        fExportWarningsCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fExportWarningsCheckbox.setText(JarPackagerMessages.JarOptionsPage_exportWarnings_text);
        fExportWarningsCheckbox.addListener(SWT.Selection, selectionListener);

        createSpacer(optionsGroup);

        fUseSourceFoldersCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fUseSourceFoldersCheckbox.setText(JarPackagerMessages.JarOptionsPage_useSourceFoldersHierarchy);
        fUseSourceFoldersCheckbox.addListener(SWT.Selection, selectionListener);
        fUseSourceFoldersCheckbox
                .setEnabled(fJarPackage.areJavaFilesExported() && !fJarPackage.areGeneratedFilesExported());

        createSpacer(optionsGroup);

        fBuildIfNeededCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fBuildIfNeededCheckbox.setText(JarPackagerMessages.JarOptionsPage_buildIfNeeded);
        fBuildIfNeededCheckbox.addListener(SWT.Selection, selectionListener);

        createSpacer(optionsGroup);

        fSaveDescriptionCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fSaveDescriptionCheckbox.setText(JarPackagerMessages.JarOptionsPage_saveDescription_text);
        fSaveDescriptionCheckbox.addListener(SWT.Selection, selectionListener);
        createDescriptionFileGroup(parent);
    }

    /**
     * Persists resource specification control setting that are to be restored
     * in the next instance of this page. Subclasses wishing to persist
     * settings for their controls should extend the hook method
     * <code>internalSaveWidgetValues</code>.
     */
    public final void saveWidgetValues() {
        // update directory names history
        IDialogSettings settings = getDialogSettings();
        if (settings != null) {
            settings.put(STORE_EXPORT_WARNINGS, fJarPackage.exportWarnings());
            settings.put(STORE_EXPORT_ERRORS, fJarPackage.areErrorsExported());
            settings.put(STORE_USE_SRC_FOLDERS, fJarPackage.useSourceFolderHierarchy());
            settings.put(STORE_BUILD_IF_NEEDED, fJarPackage.isBuildingIfNeeded());
            settings.put(STORE_SAVE_DESCRIPTION, fJarPackage.isDescriptionSaved());
            settings.put(STORE_DESCRIPTION_LOCATION, fJarPackage.getDescriptionLocation().toString());
        }
        // Allow subclasses to save values
        internalSaveWidgetValues();
    }

    /**
     * Hook method for subclasses to persist their settings.
     */
    protected void internalSaveWidgetValues() {
    }

    /**
     *   Hook method for restoring widget values to the values that they held
     *   last time this wizard was used to completion.
     */
    protected void restoreWidgetValues() {
        if (!((JarPackageWizard) getWizard()).isInitializingFromJarPackage())
            initializeJarPackage();

        fExportWarningsCheckbox.setSelection(fJarPackage.exportWarnings());
        fExportErrorsCheckbox.setSelection(fJarPackage.areErrorsExported());
        fBuildIfNeededCheckbox.setSelection(fJarPackage.isBuildingIfNeeded());
        fUseSourceFoldersCheckbox.setSelection(fJarPackage.useSourceFolderHierarchy());
        fSaveDescriptionCheckbox.setSelection(fJarPackage.isDescriptionSaved());
        fDescriptionFileText.setText(fJarPackage.getDescriptionLocation().toString());
    }

    /**
     *   Initializes the JAR package from last used wizard page values.
     */
    protected void initializeJarPackage() {
        IDialogSettings settings = getDialogSettings();
        if (settings != null) {
            fJarPackage.setExportWarnings(settings.getBoolean(STORE_EXPORT_WARNINGS));
            fJarPackage.setExportErrors(settings.getBoolean(STORE_EXPORT_ERRORS));
            fJarPackage.setUseSourceFolderHierarchy(settings.getBoolean(STORE_USE_SRC_FOLDERS));
            fJarPackage.setSaveDescription(false); // bug 15877
            String pathStr = settings.get(STORE_DESCRIPTION_LOCATION);
            if (pathStr == null)
                pathStr = ""; //$NON-NLS-1$
            fJarPackage.setDescriptionLocation(new Path(pathStr));
            if (settings.get(STORE_BUILD_IF_NEEDED) != null)
                fJarPackage.setBuildIfNeeded(settings.getBoolean(STORE_BUILD_IF_NEEDED));
        }
    }

    private void update() {
        updateModel();
        updateWidgetEnablements();
        updatePageCompletion();
    }

    /**
     *   Stores the widget values in the JAR package.
     */
    protected void updateModel() {
        if (getControl() == null)
            return;
        fJarPackage.setExportWarnings(fExportWarningsCheckbox.getSelection());
        fJarPackage.setExportErrors(fExportErrorsCheckbox.getSelection());
        fJarPackage.setBuildIfNeeded(fBuildIfNeededCheckbox.getSelection());
        fJarPackage.setSaveDescription(fSaveDescriptionCheckbox.getSelection());
        fJarPackage.setDescriptionLocation(new Path(fDescriptionFileText.getText()));
        fJarPackage.setUseSourceFolderHierarchy(fUseSourceFoldersCheckbox.getSelection());
    }

    /**
     *   Open an appropriate destination browser so that the user can specify a source
     *   to import from
     */
    protected void handleDescriptionFileBrowseButtonPressed() {
        SaveAsDialog dialog = new SaveAsDialog(getContainer().getShell());
        dialog.create();
        dialog.getShell().setText(JarPackagerMessages.JarOptionsPage_saveAsDialog_title);
        dialog.setMessage(JarPackagerMessages.JarOptionsPage_saveAsDialog_message);
        dialog.setOriginalFile(createFileHandle(fJarPackage.getDescriptionLocation()));
        if (dialog.open() == Window.OK) {
            IPath path = dialog.getResult();
            path = path.removeFileExtension().addFileExtension(JarPackagerUtil.DESCRIPTION_EXTENSION);
            fDescriptionFileText.setText(path.toString());
        }
    }

    /**
     * Updates the enablements of this page's controls. Subclasses may extend.
     */
    protected void updateWidgetEnablements() {
        boolean saveDescription = fSaveDescriptionCheckbox.getSelection();
        fDescriptionFileGroup.setEnabled(saveDescription);
        fDescriptionFileBrowseButton.setEnabled(saveDescription);
        fDescriptionFileText.setEnabled(saveDescription);
        fDescriptionFileLabel.setEnabled(saveDescription);

        boolean exportClassFiles = fJarPackage.areClassFilesExported() && !fJarPackage.areOutputFoldersExported();
        fExportWarningsCheckbox.setEnabled(exportClassFiles);
        fExportErrorsCheckbox.setEnabled(exportClassFiles);

        boolean isAutobuilding = ResourcesPlugin.getWorkspace().isAutoBuilding();
        fBuildIfNeededCheckbox.setEnabled(exportClassFiles && !isAutobuilding);

        fUseSourceFoldersCheckbox
                .setEnabled(fJarPackage.areJavaFilesExported() && !fJarPackage.areGeneratedFilesExported());
    }

    /*
     * Implements method from IJarPackageWizardPage
     */
    @Override
    public boolean isPageComplete() {
        if (fJarPackage.isDescriptionSaved()) {
            if (fJarPackage.getDescriptionLocation().toString().length() == 0) {
                setErrorMessage(null);
                return false;
            }
            IPath location = fJarPackage.getDescriptionLocation();
            if (!location.toString().startsWith("/")) { //$NON-NLS-1$
                setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionMustBeAbsolute);
                return false;
            }
            IResource resource = findResource(location);
            if (resource != null && resource.getType() != IResource.FILE) {
                setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionMustNotBeExistingContainer);
                return false;
            }
            resource = findResource(location.removeLastSegments(1));
            if (resource == null || resource.getType() == IResource.FILE) {
                setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionContainerDoesNotExist);
                return false;
            }
            String fileExtension = fJarPackage.getDescriptionLocation().getFileExtension();
            if (fileExtension == null || !fileExtension.equals(JarPackagerUtil.DESCRIPTION_EXTENSION)) {
                setErrorMessage(
                        Messages.format(JarPackagerMessages.JarOptionsPage_error_invalidDescriptionExtension,
                                JarPackagerUtil.DESCRIPTION_EXTENSION));
                return false;
            }
        }
        setErrorMessage(null);
        return true;
    }

    @Override
    public boolean canFlipToNextPage() {
        return fJarPackage.areGeneratedFilesExported() && super.canFlipToNextPage();
    }

    /*
     * Overrides method from WizardDataTransferPage
     */
    protected void createDescriptionFileGroup(Composite parent) {
        // destination specification group
        fDescriptionFileGroup = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        fDescriptionFileGroup.setLayout(layout);
        fDescriptionFileGroup.setLayoutData(new GridData(
                GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));

        fDescriptionFileLabel = new Label(fDescriptionFileGroup, SWT.NONE);
        fDescriptionFileLabel.setText(JarPackagerMessages.JarOptionsPage_descriptionFile_label);

        // destination name entry field
        fDescriptionFileText = new Text(fDescriptionFileGroup, SWT.SINGLE | SWT.BORDER);
        fDescriptionFileText.addListener(SWT.Modify, new UntypedListener());
        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
        data.widthHint = convertWidthInCharsToPixels(40);
        fDescriptionFileText.setLayoutData(data);

        // destination browse button
        fDescriptionFileBrowseButton = new Button(fDescriptionFileGroup, SWT.PUSH);
        fDescriptionFileBrowseButton.setText(JarPackagerMessages.JarOptionsPage_browseButton_text);
        fDescriptionFileBrowseButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
        SWTUtil.setButtonDimensionHint(fDescriptionFileBrowseButton);
        fDescriptionFileBrowseButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                handleDescriptionFileBrowseButtonPressed();
            }
        });
    }

    /**
     * Creates a file resource handle for the file with the given workspace path.
     * This method does not create the file resource; this is the responsibility
     * of <code>createFile</code>.
     *
     * @param filePath the path of the file resource to create a handle for
     * @return the new file resource handle
     */
    protected IFile createFileHandle(IPath filePath) {
        if (filePath.isValidPath(filePath.toString()) && filePath.segmentCount() >= 2)
            return JavaPlugin.getWorkspace().getRoot().getFile(filePath);
        else
            return null;
    }

    /*
     * Method declared on IWizardPage.
     */
    @Override
    public void setPreviousPage(IWizardPage page) {
        super.setPreviousPage(page);
        updateWidgetEnablements();
        if (getControl() != null)
            updatePageCompletion();
    }

    /*
     * Implements method from IJarPackageWizardPage.
     */
    public void finish() {
        saveWidgetValues();
    }

    /**
     * Creates a new label with a bold font.
     *
     * @param parent the parent control
     * @param text the label text
     * @param bold bold or not
     * @return the new label control
     */
    protected Label createLabel(Composite parent, String text, boolean bold) {
        Label label = new Label(parent, SWT.NONE);
        if (bold)
            label.setFont(JFaceResources.getBannerFont());
        label.setText(text);
        GridData data = new GridData();
        data.verticalAlignment = GridData.FILL;
        data.horizontalAlignment = GridData.FILL;
        label.setLayoutData(data);
        return label;
    }

    /**
     * Creates a horizontal spacer line that fills the width of its container.
     *
     * @param parent the parent control
     */
    protected void createSpacer(Composite parent) {
        Label spacer = new Label(parent, SWT.NONE);
        GridData data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.BEGINNING;
        spacer.setLayoutData(data);
    }

    /**
     * Determine if the page is complete and update the page appropriately.
     */
    protected void updatePageCompletion() {
        boolean pageComplete = isPageComplete();
        setPageComplete(pageComplete);
        if (pageComplete) {
            setErrorMessage(null);
        }
    }

    /**
     * Returns the resource for the specified path.
     *
     * @param path   the path for which the resource should be returned
     * @return the resource specified by the path or <code>null</code>
     */
    protected IResource findResource(IPath path) {
        IWorkspace workspace = JavaPlugin.getWorkspace();
        IStatus result = workspace.validatePath(path.toString(),
                IResource.ROOT | IResource.PROJECT | IResource.FOLDER | IResource.FILE);
        if (result.isOK() && workspace.getRoot().exists(path))
            return workspace.getRoot().findMember(path);
        return null;
    }
}