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

Java tutorial

Introduction

Here is the source code for ext.org.eclipse.jdt.internal.ui.preferences.SourceAttachmentPropertyPage.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.preferences;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

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

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.operation.IRunnableWithProgress;

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

import org.eclipse.jdt.core.ClasspathContainerInitializer;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;

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

import ext.org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import ext.org.eclipse.jdt.internal.corext.util.Messages;
import ext.org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import ext.org.eclipse.jdt.internal.ui.dialogs.StatusUtil;
import ext.org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import ext.org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
import ext.org.eclipse.jdt.internal.ui.wizards.IStatusChangeListener;
import ext.org.eclipse.jdt.internal.ui.wizards.buildpaths.SourceAttachmentBlock;

/**
 * Property page to configure a archive's JARs source attachment
 */
public class SourceAttachmentPropertyPage extends PropertyPage implements IStatusChangeListener {

    private SourceAttachmentBlock fSourceAttachmentBlock;
    private IPackageFragmentRoot fRoot;
    private IPath fContainerPath;
    private IClasspathEntry fEntry;

    public SourceAttachmentPropertyPage() {
    }

    /*
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createControl(Composite parent) {
        super.createControl(parent);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
                IJavaHelpContextIds.SOURCE_ATTACHMENT_PROPERTY_PAGE);
    }

    /*
     * @see PreferencePage#createContents
     */
    @Override
    protected Control createContents(Composite composite) {
        initializeDialogUnits(composite);
        Control result = createPageContent(composite);
        Dialog.applyDialogFont(result);
        return result;
    }

    private Control createPageContent(Composite composite) {
        try {
            fContainerPath = null;
            fEntry = null;
            fRoot = getJARPackageFragmentRoot();
            if (fRoot == null || fRoot.getKind() != IPackageFragmentRoot.K_BINARY) {
                return createMessageContent(composite,
                        PreferencesMessages.SourceAttachmentPropertyPage_noarchive_message, null);
            }

            IPath containerPath = null;
            IJavaProject jproject = fRoot.getJavaProject();
            IClasspathEntry entry = JavaModelUtil.getClasspathEntry(fRoot);
            if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
                containerPath = entry.getPath();
                ClasspathContainerInitializer initializer = JavaCore
                        .getClasspathContainerInitializer(containerPath.segment(0));
                IClasspathContainer container = JavaCore.getClasspathContainer(containerPath, jproject);
                if (initializer == null || container == null) {
                    return createMessageContent(composite,
                            Messages.format(PreferencesMessages.SourceAttachmentPropertyPage_invalid_container,
                                    BasicElementLabels.getPathLabel(containerPath, false)),
                            fRoot);
                }
                String containerName = container.getDescription();

                IStatus status = initializer.getSourceAttachmentStatus(containerPath, jproject);
                if (status.getCode() == ClasspathContainerInitializer.ATTRIBUTE_NOT_SUPPORTED) {
                    return createMessageContent(composite, Messages.format(
                            PreferencesMessages.SourceAttachmentPropertyPage_not_supported, containerName), null);
                }
                if (status.getCode() == ClasspathContainerInitializer.ATTRIBUTE_READ_ONLY) {
                    return createMessageContent(composite, Messages.format(
                            PreferencesMessages.SourceAttachmentPropertyPage_read_only, containerName), fRoot);
                }
                entry = JavaModelUtil.findEntryInContainer(container, fRoot.getPath());
            }
            fContainerPath = containerPath;
            fEntry = entry;

            fSourceAttachmentBlock = new SourceAttachmentBlock(this, entry);
            return fSourceAttachmentBlock.createControl(composite);
        } catch (CoreException e) {
            JavaPlugin.log(e);
            return createMessageContent(composite,
                    PreferencesMessages.SourceAttachmentPropertyPage_noarchive_message, null);
        }
    }

    private Control createMessageContent(Composite composite, String message, IPackageFragmentRoot root) {
        Composite inner = new Composite(composite, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        inner.setLayout(layout);

        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.widthHint = convertWidthInCharsToPixels(80);

        Label label = new Label(inner, SWT.LEFT + SWT.WRAP);
        label.setLayoutData(gd);

        try {
            if (root != null) {
                message = message + "\n\n" + PreferencesMessages.SourceAttachmentPropertyPage_location_path; //$NON-NLS-1$

                Text location = new Text(inner, SWT.READ_ONLY | SWT.WRAP);
                gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
                gd.widthHint = convertWidthInCharsToPixels(80);
                location.setLayoutData(gd);
                IPath sourceAttachmentPath = root.getSourceAttachmentPath();
                String locationPath = PreferencesMessages.SourceAttachmentPropertyPage_locationPath_none;
                if (sourceAttachmentPath != null)
                    locationPath = sourceAttachmentPath.toString();
                location.setText(locationPath);
            }
        } catch (JavaModelException e) {
            JavaPlugin.log(e);
            // don't show location
        }

        label.setText(message);
        return inner;
    }

    /*
     * @see IPreferencePage#performOk
     */
    @Override
    public boolean performOk() {
        if (fSourceAttachmentBlock != null) {
            try {
                IClasspathEntry entry = fSourceAttachmentBlock.getNewEntry();
                if (entry.equals(fEntry)) {
                    return true; // no change
                }

                IRunnableWithProgress runnable = SourceAttachmentBlock.getRunnable(getShell(), entry,
                        fRoot.getJavaProject(), fContainerPath, fEntry.getReferencingEntry() != null);
                PlatformUI.getWorkbench().getProgressService().run(true, true, runnable);
            } catch (InvocationTargetException e) {
                String title = PreferencesMessages.SourceAttachmentPropertyPage_error_title;
                String message = PreferencesMessages.SourceAttachmentPropertyPage_error_message;
                ExceptionHandler.handle(e, getShell(), title, message);
                return false;
            } catch (InterruptedException e) {
                // cancelled
                return false;
            }
        }
        return true;
    }

    /*
     * @see PreferencePage#performDefaults()
     */
    @Override
    protected void performDefaults() {
        if (fSourceAttachmentBlock != null) {
            fSourceAttachmentBlock.setDefaults();
        }
        super.performDefaults();
    }

    private IPackageFragmentRoot getJARPackageFragmentRoot() throws CoreException {
        // try to find it as Java element (needed for external jars)
        IAdaptable adaptable = getElement();
        IJavaElement elem = (IJavaElement) adaptable.getAdapter(IJavaElement.class);
        if (elem instanceof IPackageFragmentRoot) {
            return (IPackageFragmentRoot) elem;
        }
        // not on classpath or not in a java project
        IResource resource = (IResource) adaptable.getAdapter(IResource.class);
        if (resource instanceof IFile) {
            IProject proj = resource.getProject();
            if (proj.hasNature(JavaCore.NATURE_ID)) {
                IJavaProject jproject = JavaCore.create(proj);
                return jproject.getPackageFragmentRoot(resource);
            }
        }
        return null;
    }

    /*
     * @see IStatusChangeListener#statusChanged
     */
    public void statusChanged(IStatus status) {
        setValid(!status.matches(IStatus.ERROR));
        StatusUtil.applyToStatusLine(this, status);
    }

}