org.eclipse.jst.common.project.facet.ui.libprov.osgi.OsgiBundlesLibraryProviderInstallPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.common.project.facet.ui.libprov.osgi.OsgiBundlesLibraryProviderInstallPanel.java

Source

/******************************************************************************
 * Copyright (c) 2010 Oracle
 * 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:
 *    Konstantin Komissarchik - initial implementation and ongoing maintenance
 ******************************************************************************/

package org.eclipse.jst.common.project.facet.ui.libprov.osgi;

import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.PLUGIN_ID;
import static org.eclipse.ui.plugin.AbstractUIPlugin.imageDescriptorFromPlugin;
import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gdhfill;
import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gdhhint;
import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gl;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.common.project.facet.core.libprov.osgi.BundleReference;
import org.eclipse.jst.common.project.facet.core.libprov.osgi.OsgiBundlesLibraryProviderInstallOperationConfig;
import org.eclipse.jst.common.project.facet.ui.libprov.LibraryProviderOperationPanel;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.wst.common.project.facet.ui.internal.util.ProblemOverlayImageDescriptor;

/**
 * The install operation panel corresponding to the osgi-bundles-library-provider that exposes
 * specified OSGi libraries from the Eclipse install to user project's classpath. This class can 
 * be subclassed by those wishing to extend the base implementation supplied by the framework.
 * 
 * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
 * @since 1.4
 */

public class OsgiBundlesLibraryProviderInstallPanel

        extends LibraryProviderOperationPanel

{
    /**
     * Creates the panel control.
     * 
     * @param parent the parent composite
     * @return the created control
     */

    @Override
    public Control createControl(final Composite parent) {
        final Composite rootComposite = new Composite(parent, SWT.NONE);
        rootComposite.setLayout(gl(1, 0, 0));

        final Table bundlesTable = new Table(rootComposite, SWT.BORDER);
        bundlesTable.setLayoutData(gdhhint(gdhfill(), 60));
        bundlesTable.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));

        final TableViewer bundlesTableViewer = new TableViewer(bundlesTable);

        final IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
            public Object[] getElements(final Object inputElement) {
                final OsgiBundlesLibraryProviderInstallOperationConfig cfg = (OsgiBundlesLibraryProviderInstallOperationConfig) getOperationConfig();

                return cfg.getBundleReferences().toArray();
            }

            public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
            }

            public void dispose() {
            }
        };

        bundlesTableViewer.setContentProvider(contentProvider);

        final LabelProvider labelProvider = new LabelProvider() {
            private final ImageDescriptor bundleImageDescriptor = imageDescriptorFromPlugin(PLUGIN_ID,
                    "images/bundle.png"); //$NON-NLS-1$

            private final Image bundleImage = this.bundleImageDescriptor.createImage();

            private final Image bundleImageError = (new ProblemOverlayImageDescriptor(this.bundleImageDescriptor,
                    IStatus.ERROR)).createImage();

            public Image getImage(final Object element) {
                final boolean isResolvable = ((BundleReference) element).isResolvable();
                return isResolvable ? this.bundleImage : this.bundleImageError;
            }

            public String getText(final Object element) {
                final BundleReference bundleReference = (BundleReference) element;
                final StringBuilder buf = new StringBuilder();

                buf.append(' ');
                buf.append(bundleReference.getBundleId());

                if (bundleReference.getVersionRange() != null) {
                    buf.append(' ');
                    buf.append(bundleReference.getVersionRange().toString());
                }

                return buf.toString();
            }

            @Override
            public void dispose() {
                this.bundleImage.dispose();
                this.bundleImageError.dispose();
            }
        };

        bundlesTableViewer.setLabelProvider(labelProvider);

        bundlesTableViewer.setInput(new Object());

        final Control footerControl = createFooter(rootComposite);

        if (footerControl != null) {
            footerControl.setLayoutData(gdhfill());
        }

        return rootComposite;
    }

    /**
     * This method can be overridden to create a control beneath the bundles table. The default
     * implementation doesn't create a control and returns <code>null</code>.
     * 
     * @param parent the parent composite 
     * @return the created control
     */

    protected Control createFooter(final Composite parent) {
        return null;
    }

}