/******************************************************************************
 * 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 );
        }
    }

}