| /****************************************************************************** |
| * Copyright (c) 2008 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; |
| |
| /** |
| * 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(); |
| |
| libsTable.addDisposeListener |
| ( |
| new DisposeListener() |
| { |
| public void widgetDisposed( final DisposeEvent event ) |
| { |
| manageLibrariesImage.dispose(); |
| downloadLibraryImage.dispose(); |
| } |
| } |
| ); |
| |
| 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 ); |
| } |
| } |
| }; |
| |
| final MenuItem downloadLibraryMenuItem = new MenuItem( menu, SWT.PUSH ); |
| downloadLibraryMenuItem.setText( Resources.downloadLibraryMenuItem ); |
| downloadLibraryMenuItem.setImage( downloadLibraryImage ); |
| downloadLibraryMenuItem.addSelectionListener( downloadLibraryListener ); |
| |
| final ToolItem downloadLibraryButton = new ToolItem( toolBar, SWT.PUSH ); |
| downloadLibraryButton.setImage( downloadLibraryImage ); |
| downloadLibraryButton.setToolTipText( Resources.downloadLibraryButtonToolTip ); |
| downloadLibraryButton.addSelectionListener( downloadLibraryListener ); |
| |
| final Control footerControl = createFooter( this.rootComposite ); |
| |
| if( footerControl != null ) |
| { |
| footerControl.setLayoutData( gdhfill() ); |
| } |
| |
| 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; |
| } |
| |
| 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 ); |
| } |
| } |
| |
| } |