ext.org.eclipse.jdt.internal.ui.preferences.ClasspathContainerPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for ext.org.eclipse.jdt.internal.ui.preferences.ClasspathContainerPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 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.preferences;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;

import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.IWizard;

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.preferences.WizardPropertyPage;

import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;

import org.eclipse.jdt.launching.JavaRuntime;

import ext.org.eclipse.jdt.internal.ui.actions.ActionMessages;
import ext.org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
import ext.org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import ext.org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathSupport;
import ext.org.eclipse.jdt.internal.ui.wizards.buildpaths.ClasspathContainerWizard;

/**
 * Wraps a PropertyPage around a ClasspathContainerWizard.
 * It is required, that the wizard consists of exactly one page.
 */
public class ClasspathContainerPreferencePage extends WizardPropertyPage {

    private IJavaProject fJavaProject;
    private IClasspathEntry fEntry;

    public ClasspathContainerPreferencePage() {
        noDefaultAndApplyButton();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setElement(IAdaptable element) {
        super.setElement(element);

        ClassPathContainer container;
        if (element instanceof ClassPathContainer) {
            container = (ClassPathContainer) element;
        } else {
            container = (ClassPathContainer) element.getAdapter(ClassPathContainer.class);
        }
        fJavaProject = container.getJavaProject();
        fEntry = container.getClasspathEntry();
    }

    @Override
    protected IWizard createWizard() {
        try {
            IJavaProject project = fJavaProject;
            IClasspathEntry[] entries = project.getRawClasspath();
            return new ClasspathContainerWizard(fEntry, project, entries);
        } catch (JavaModelException e) {
            String title = ActionMessages.ConfigureContainerAction_error_title;
            String message = ActionMessages.ConfigureContainerAction_error_creationfailed_message;
            ExceptionHandler.handle(e, getShell(), title, message);
        }

        return null;
    }

    /**
     * Apply the changes to the classpath
     */
    @Override
    protected void applyChanges() {
        IClasspathEntry[] created = ((ClasspathContainerWizard) getWizard()).getNewEntries();
        if (created == null || created.length != 1)
            return;

        final IClasspathEntry result = created[0];
        if (result == null || result.equals(fEntry))
            return;

        try {
            IClasspathEntry[] entries = fJavaProject.getRawClasspath();

            int idx = indexInClasspath(entries, fEntry);
            if (idx == -1)
                return;

            final IClasspathEntry[] newEntries = new IClasspathEntry[entries.length];
            System.arraycopy(entries, 0, newEntries, 0, entries.length);
            newEntries[idx] = result;

            IRunnableContext context = new ProgressMonitorDialog(getShell());
            context = PlatformUI.getWorkbench().getProgressService();
            context.run(true, true, new IRunnableWithProgress() {
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    try {
                        if (result.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
                            IPath path = result.getPath();
                            String eeID = JavaRuntime.getExecutionEnvironmentId(path);
                            if (eeID != null) {
                                BuildPathSupport.setEEComplianceOptions(fJavaProject, eeID, null);
                            }
                        }
                        fJavaProject.setRawClasspath(newEntries, fJavaProject.getOutputLocation(), monitor);
                    } catch (CoreException e) {
                        throw new InvocationTargetException(e);
                    }
                }
            });

            fEntry = result;

        } catch (JavaModelException e) {
            String title = ActionMessages.ConfigureContainerAction_error_title;
            String message = ActionMessages.ConfigureContainerAction_error_creationfailed_message;
            ExceptionHandler.handle(e, getShell(), title, message);
        } catch (InvocationTargetException e) {
            String title = ActionMessages.ConfigureContainerAction_error_title;
            String message = ActionMessages.ConfigureContainerAction_error_applyingfailed_message;
            ExceptionHandler.handle(e, getShell(), title, message);
        } catch (InterruptedException e) {
            // user cancelled
        }
    }

    private static int indexInClasspath(IClasspathEntry[] entries, IClasspathEntry entry) {
        for (int i = 0; i < entries.length; i++) {
            if (entries[i].equals(entry)) {
                return i;
            }
        }
        return -1;
    }

}