org.eclipse.jst.common.project.facet.ui.libprov.user.UserLibraryProviderInstallPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.common.project.facet.ui.libprov.user.UserLibraryProviderInstallPanel.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.user;

import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.IMG_PATH_BUTTON_DOWNLOAD;
import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.IMG_PATH_BUTTON_MANAGE_LIBRARIES;
import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.IMG_PATH_OBJECTS_LIBRARY;
import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.getImageDescriptor;
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.gdvfill;
import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gl;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.core.UserLibraryManager;
import org.eclipse.jdt.internal.ui.preferences.UserLibraryPreferencePage;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.common.project.facet.core.libprov.IPropertyChangeListener;
import org.eclipse.jst.common.project.facet.core.libprov.user.UserLibraryProviderInstallOperationConfig;
import org.eclipse.jst.common.project.facet.ui.libprov.LibraryProviderOperationPanel;
import org.eclipse.jst.common.project.facet.ui.libprov.user.internal.DownloadLibraryWizard;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.dialogs.PreferencesUtil;

/**
 * The install operation panel corresponding to the user-library-provider that uses JDT user library facility
 * for managing libraries. 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
 */

@SuppressWarnings("restriction")

public class UserLibraryProviderInstallPanel

        extends LibraryProviderOperationPanel

{
    private Composite rootComposite = null;
    private CheckboxTableViewer libsTableViewer = null;
    private MenuItem downloadLibraryMenuItem = null;
    private ToolItem downloadLibraryButton = null;
    private boolean downloadCommandEnabled = true;

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

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

        final Composite tableComposite = new Composite(this.rootComposite, SWT.NONE);
        tableComposite.setLayoutData(gdhfill());
        tableComposite.setLayout(gl(2, 0, 0));

        final Table libsTable = new Table(tableComposite, SWT.CHECK | SWT.BORDER);
        libsTable.setLayoutData(gdhhint(gdhfill(), 60));

        this.libsTableViewer = new CheckboxTableViewer(libsTable);
        this.libsTableViewer.setContentProvider(new LibrariesContentProvider());
        this.libsTableViewer.setLabelProvider(new LibrariesLabelProvider());
        this.libsTableViewer.setComparator(new ViewerComparator());
        this.libsTableViewer.setInput(new Object());

        final UserLibraryProviderInstallOperationConfig cfg = (UserLibraryProviderInstallOperationConfig) getOperationConfig();

        this.libsTableViewer.setCheckedElements(cfg.getLibraryNames().toArray());

        this.libsTableViewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(final CheckStateChangedEvent event) {
                final List<String> libs = new ArrayList<String>();

                for (Object element : UserLibraryProviderInstallPanel.this.libsTableViewer.getCheckedElements()) {
                    libs.add((String) element);
                }

                cfg.setLibraryNames(libs);
            }
        });

        final IPropertyChangeListener listener = new IPropertyChangeListener() {
            public void propertyChanged(final String property, final Object oldValue, final Object newValue) {
                handleLibraryNamesChanged();
            }
        };

        cfg.addListener(listener, UserLibraryProviderInstallOperationConfig.PROP_LIBRARY_NAMES);

        final Image manageLibrariesImage = getImageDescriptor(IMG_PATH_BUTTON_MANAGE_LIBRARIES).createImage();
        final Image downloadLibraryImage = getImageDescriptor(IMG_PATH_BUTTON_DOWNLOAD).createImage();

        final Menu menu = new Menu(libsTable);
        libsTable.setMenu(menu);

        final ToolBar toolBar = new ToolBar(tableComposite, SWT.FLAT | SWT.VERTICAL);
        toolBar.setLayoutData(gdvfill());

        final SelectionAdapter manageLibrariesListener = new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                final String id = UserLibraryPreferencePage.ID;
                final Shell shell = libsTable.getShell();

                final PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(shell, id,
                        new String[] { id }, null);

                if (dialog.open() == Window.OK) {
                    UserLibraryProviderInstallPanel.this.libsTableViewer.refresh();

                    // We need to send an event up the listener chain since validation needs to be
                    // refreshed. This not an ideal solution, but it does work. The name of the 
                    // property is not important since the listener that does validation is global.

                    final List<String> libNames = cfg.getLibraryNames();
                    cfg.notifyListeners("validation", libNames, libNames); //$NON-NLS-1$
                }
            }
        };

        final MenuItem manageLibrariesMenuItem = new MenuItem(menu, SWT.PUSH);
        manageLibrariesMenuItem.setText(Resources.manageLibrariesMenuItem);
        manageLibrariesMenuItem.setImage(manageLibrariesImage);
        manageLibrariesMenuItem.addSelectionListener(manageLibrariesListener);

        final ToolItem manageLibrariesButton = new ToolItem(toolBar, SWT.PUSH);
        manageLibrariesButton.setImage(manageLibrariesImage);
        manageLibrariesButton.setToolTipText(Resources.manageLibrariesButtonToolTip);
        manageLibrariesButton.addSelectionListener(manageLibrariesListener);

        final SelectionAdapter downloadLibraryListener = new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                final UserLibraryProviderInstallOperationConfig cfg = (UserLibraryProviderInstallOperationConfig) getOperationConfig();

                final String downloadedLibraryName = DownloadLibraryWizard.open(cfg);

                if (downloadedLibraryName != null) {
                    refreshLibrariesList();
                    cfg.addLibraryName(downloadedLibraryName);
                }
            }
        };

        this.downloadLibraryMenuItem = new MenuItem(menu, SWT.PUSH);
        this.downloadLibraryMenuItem.setText(Resources.downloadLibraryMenuItem);
        this.downloadLibraryMenuItem.setImage(downloadLibraryImage);
        this.downloadLibraryMenuItem.setEnabled(this.downloadCommandEnabled);
        this.downloadLibraryMenuItem.addSelectionListener(downloadLibraryListener);

        this.downloadLibraryButton = new ToolItem(toolBar, SWT.PUSH);
        this.downloadLibraryButton.setImage(downloadLibraryImage);
        this.downloadLibraryButton.setToolTipText(Resources.downloadLibraryButtonToolTip);
        this.downloadLibraryButton.setEnabled(this.downloadCommandEnabled);
        this.downloadLibraryButton.addSelectionListener(downloadLibraryListener);

        final Control footerControl = createFooter(this.rootComposite);

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

        this.rootComposite.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(final DisposeEvent event) {
                cfg.removeListener(listener);
                manageLibrariesImage.dispose();
                downloadLibraryImage.dispose();
            }
        });

        return this.rootComposite;
    }

    /**
     * This method can be overridden to create a control beneath the libraries 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 createControlNextToManageHyperlink(parent);
    }

    /**
     * @deprecated override createFooter method instead
     */

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

    /**
     * Controls enablement of the download command. This can be useful to extenders
     * of this class. The download command might be surfaced to users as a button,
     * a menu item or via other means. This method controls enablement of all of these
     * manifestations.
     * 
     * @param enabled <code>true</code>, if the download command should be enabled and
     *   <code>false</code> otherwise
     */

    protected void setDownloadCommandEnabled(final boolean enabled) {
        this.downloadCommandEnabled = enabled;

        if (this.downloadLibraryButton != null) {
            this.downloadLibraryButton.setEnabled(enabled);
        }

        if (this.downloadLibraryMenuItem != null) {
            this.downloadLibraryMenuItem.setEnabled(enabled);
        }
    }

    private void handleLibraryNamesChanged() {
        if (this.rootComposite.getDisplay().getThread() != Thread.currentThread()) {
            this.rootComposite.getDisplay().asyncExec(new Runnable() {
                public void run() {
                    handleLibraryNamesChanged();
                }
            });

            return;
        }

        final UserLibraryProviderInstallOperationConfig cfg = (UserLibraryProviderInstallOperationConfig) getOperationConfig();

        this.libsTableViewer.setCheckedElements(cfg.getLibraryNames().toArray());
    }

    private void refreshLibrariesList() {
        this.libsTableViewer.refresh();
    }

    private static final class LibrariesContentProvider

            implements IStructuredContentProvider

    {

        public Object[] getElements(Object inputElement) {
            final UserLibraryManager userLibManager = JavaModelManager.getUserLibraryManager();
            return userLibManager.getUserLibraryNames();
        }

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

        public void dispose() {
        }
    }

    private static final class LibrariesLabelProvider

            extends LabelProvider

    {
        private final Image libraryImage = getImageDescriptor(IMG_PATH_OBJECTS_LIBRARY).createImage();

        public Image getImage(final Object element) {
            return this.libraryImage;
        }

        public String getText(final Object element) {
            return (String) element;
        }

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

    private static final class Resources

            extends NLS

    {
        public static String manageLibrariesMenuItem;
        public static String manageLibrariesButtonToolTip;
        public static String downloadLibraryMenuItem;
        public static String downloadLibraryButtonToolTip;

        static {
            initializeMessages(UserLibraryProviderInstallPanel.class.getName(), Resources.class);
        }
    }

}