org.eclipse.pde.api.tools.ui.internal.wizards.DirectoryBasedApiBaselineWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.pde.api.tools.ui.internal.wizards.DirectoryBasedApiBaselineWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2015 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
 *     Manumitting Technologies Inc - bug 324310
 *     Simon Scholz <simon.scholz@vogella.com> - Bug 484445
 *******************************************************************************/
package org.eclipse.pde.api.tools.ui.internal.wizards;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.nio.file.Paths;
import java.util.HashSet;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.pde.api.tools.internal.model.ApiModelFactory;
import org.eclipse.pde.api.tools.internal.model.SystemLibraryApiComponent;
import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent;
import org.eclipse.pde.api.tools.ui.internal.ApiToolsLabelProvider;
import org.eclipse.pde.api.tools.ui.internal.IApiToolsHelpContextIds;
import org.eclipse.pde.api.tools.ui.internal.SWTFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
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.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.PlatformUI;

/**
 * The wizard page allowing a new directory-based API profiles to be created or
 * an existing one to be edited.
 *
 * @since 1.0.0
 */
public class DirectoryBasedApiBaselineWizardPage extends ApiBaselineWizardPage {
    public static boolean isApplicable(IApiBaseline profile) {
        String loc = profile.getLocation();
        return loc != null && new Path(loc).toFile().exists();
    }

    /**
     * Resets the baseline contents based on current settings and a location
     * from which to read plug-ins.
     */
    class ReloadOperation implements IRunnableWithProgress {
        private String location, name;

        /**
         * Constructor
         *
         * @param platformPath
         */
        public ReloadOperation(String name, String location) {
            this.location = location;
            this.name = name;
        }

        @Override
        public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
            monitor.beginTask(WizardMessages.ApiProfileWizardPage_0, 10);
            try {
                fProfile = ApiModelFactory.newApiBaseline(name, location);
                ApiModelFactory.addComponents(fProfile, location, monitor);
                DirectoryBasedApiBaselineWizardPage.this.contentchange = true;
            } catch (CoreException e) {
                ApiPlugin.log(e);
            } finally {
                monitor.done();
            }
        }

    }

    /**
     * widgets
     */
    private Text nametext = null;
    private TreeViewer treeviewer = null;
    Combo locationcombo = null;
    private Button browsebutton = null, reloadbutton = null;

    /**
     * We need to know if we are initializing the page to not respond to changed
     * events causing validation when the wizard opens.
     *
     * https://bugs.eclipse.org/bugs/show_bug.cgi?id=266597
     */
    private boolean initializing = false;

    /**
     * Constructor
     *
     * @param profile
     */
    protected DirectoryBasedApiBaselineWizardPage(IApiBaseline profile) {
        super(profile);
    }

    @Override
    public void createControl(Composite parent) {
        Composite comp = SWTFactory.createComposite(parent, 4, 1, GridData.FILL_HORIZONTAL);
        SWTFactory.createWrapLabel(comp, WizardMessages.ApiProfileWizardPage_5, 1);
        nametext = SWTFactory.createText(comp, SWT.BORDER | SWT.SINGLE, 3,
                GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.BEGINNING);
        nametext.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                setPageComplete(pageValid());
            }
        });

        SWTFactory.createVerticalSpacer(comp, 1);

        SWTFactory.createWrapLabel(comp, WizardMessages.ApiProfileWizardPage_9, 1);
        locationcombo = SWTFactory.createCombo(comp, SWT.BORDER | SWT.SINGLE, 1,
                GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.BEGINNING, null);
        locationcombo.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                setPageComplete(pageValid());
                updateButtons();
            }
        });
        browsebutton = SWTFactory.createPushButton(comp, WizardMessages.ApiProfileWizardPage_10, null);
        browsebutton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                DirectoryDialog dialog = new DirectoryDialog(getShell());
                dialog.setMessage(WizardMessages.ApiProfileWizardPage_11);
                String loctext = locationcombo.getText().trim();
                if (loctext.length() > 0) {
                    dialog.setFilterPath(loctext);
                }
                String newPath = dialog.open();
                if (newPath != null
                        && (!new Path(loctext).equals(new Path(newPath)) || getCurrentComponents().length == 0)) {
                    /*
                     * If the path is identical, but there is no component
                     * loaded, we still want to reload. This might be the case
                     * if the combo is initialized by copy/paste with a path
                     * that points to a plugin directory
                     */
                    locationcombo.setText(newPath);
                    setErrorMessage(null);
                    doReload();
                }
            }
        });

        reloadbutton = SWTFactory.createPushButton(comp, WizardMessages.ApiProfileWizardPage_12, null);
        reloadbutton.setEnabled(locationcombo.getText().trim().length() > 0);
        reloadbutton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doReload();
            }
        });

        SWTFactory.createWrapLabel(comp, WizardMessages.ApiProfileWizardPage_13, 4);
        Tree tree = new Tree(comp, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 250;
        gd.horizontalSpan = 4;
        tree.setLayoutData(gd);
        treeviewer = new TreeViewer(tree);
        treeviewer.setLabelProvider(new ApiToolsLabelProvider());
        treeviewer.setContentProvider(new ContentProvider());
        treeviewer.setComparator(new ViewerComparator());
        treeviewer.setInput(getCurrentComponents());
        treeviewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                updateButtons();
            }
        });
        treeviewer.addFilter(new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof IApiComponent) {
                    IApiComponent component = (IApiComponent) element;
                    try {
                        if (component.isSourceComponent() || component.isSystemComponent()) {
                            return false;
                        }
                    } catch (CoreException e) {
                        ApiPlugin.log(e);
                    }
                    return true;
                }
                return !(element instanceof SystemLibraryApiComponent);
            }
        });

        setControl(comp);
        setPageComplete(fProfile != null);
        initialize();
        PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IApiToolsHelpContextIds.APIPROFILES_WIZARD_PAGE);
        Dialog.applyDialogFont(comp);
    }

    /**
     * Initializes the controls of the page if the profile is not
     * <code>null</code>
     */
    @Override
    protected void initialize() {
        initializing = true;
        try {
            super.initialize();
            if (fProfile != null) {
                nametext.setText(fProfile.getName());
                IApiComponent[] components = fProfile.getApiComponents();
                HashSet<String> locations = new HashSet<String>();
                String loc = fProfile.getLocation();
                IPath location = null;
                if (loc != null) {
                    location = new Path(loc);
                    // check if the location is a file
                    if (location.toFile().isDirectory()) {
                        locations.add(location.removeTrailingSeparator().toOSString());
                    }
                } else {
                    for (int i = 0; i < components.length; i++) {
                        if (!components[i].isSystemComponent()) {
                            location = new Path(components[i].getLocation()).removeLastSegments(1);
                            if (location.toFile().isDirectory()) {
                                locations.add(location.removeTrailingSeparator().toOSString());
                            }
                        }
                    }
                }
                if (locations.size() > 0) {
                    locationcombo.setItems(locations.toArray(new String[locations.size()]));
                    locationcombo.select(0);
                }
            } else {
                // try to set the default location to be the current install
                // directory
                // https://bugs.eclipse.org/bugs/show_bug.cgi?id=258969
                Location location = Platform.getInstallLocation();
                if (location != null) {
                    URL url = location.getURL();
                    IPath path = new Path(url.getFile()).removeTrailingSeparator();
                    if (path.toFile().exists()) {
                        locationcombo.add(path.toOSString());
                        locationcombo.select(0);
                    }
                }
            }
        } finally {
            initializing = false;
        }
    }

    /**
     * Reloads all of the plugins from the location specified in the location
     * text field.
     */
    protected void doReload() {
        String location = locationcombo.getText().trim();
        IRunnableWithProgress op = new ReloadOperation(nametext.getText().trim(), location);
        try {
            getContainer().run(true, true, op);
            // If no name has been set, the directories' name is taken as name.
            if (nametext.getText().isEmpty()) {
                nametext.setText(String.valueOf(Paths.get(location).getFileName()));
            }
            treeviewer.setInput(getCurrentComponents());
            treeviewer.refresh();
            setPageComplete(pageValid());
            nametext.setFocus();
            nametext.selectAll();
        } catch (InvocationTargetException ite) {
        } catch (InterruptedException ie) {
        }
    }

    @Override
    public IApiBaseline finish() throws IOException, CoreException {
        if (fProfile != null) {
            fProfile.setName(nametext.getText().trim());
        }
        return fProfile;
    }

    /**
     * @return if the page is valid, such that it is considered complete and can
     *         be 'finished'
     */
    protected boolean pageValid() {
        if (initializing) {
            return false;
        }
        setErrorMessage(null);
        if (!isNameValid(nametext.getText().trim())) {
            return false;
        }
        String text = locationcombo.getText().trim();
        if (text.length() < 1) {
            setErrorMessage(WizardMessages.ApiProfileWizardPage_23);
            reloadbutton.setEnabled(false);
            return false;
        }
        if (!new Path(text).toFile().exists()) {
            setErrorMessage(WizardMessages.ApiProfileWizardPage_24);
            reloadbutton.setEnabled(false);
            return false;
        }
        if (fProfile != null) {
            if (fProfile.getApiComponents().length == 0) {
                setErrorMessage(WizardMessages.ApiProfileWizardPage_2);
                return false;
            }
            IStatus status = fProfile.getExecutionEnvironmentStatus();
            if (status.getSeverity() == IStatus.ERROR) {
                setErrorMessage(status.getMessage());
                return false;
            }
            if (fProfile.getLocation() != null && !fProfile.getLocation().equals(locationcombo.getText())) {
                setErrorMessage(WizardMessages.ApiProfileWizardPage_location_needs_reset);
                return false;
            }
        } else {
            setErrorMessage(WizardMessages.ApiProfileWizardPage_location_needs_reset);
            return false;
        }
        return true;
    }

    /**
     * Updates the state of a variety of buttons on this page
     */
    protected void updateButtons() {
        String loctext = locationcombo.getText().trim();
        reloadbutton.setEnabled(loctext.length() > 0);
    }

}