/******************************************************************************
 * 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.internal;

import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gd;
import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gdfill;
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.gl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.jst.common.project.facet.core.libprov.ILibraryProvider;
import org.eclipse.jst.common.project.facet.core.libprov.IPropertyChangeListener;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderActionType;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderOperationConfig;
import org.eclipse.jst.common.project.facet.ui.libprov.LibraryProviderOperationPanel;
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.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.PageBook;

/**
 * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
 */

public final class LibraryInstallPanel

    extends Composite
    
{
    private final LibraryInstallDelegate delegate;
    private final Group providersGroup;
    private final Combo providersCombo;
    private final PageBook providersPageBook;
    private final Map<ILibraryProvider,Control> providerPages;
    private final Composite noProviderComposite;
    
    public LibraryInstallPanel( final Composite parent,
                                final LibraryInstallDelegate delegate,
                                final String label )
    {
        super( parent, SWT.NONE );
        
        setLayout( gl( 1, 0, 0 ) );
        
        this.delegate = delegate;
        this.providerPages = new HashMap<ILibraryProvider,Control>();
        
        this.providersGroup = new Group( this, SWT.NONE );
        this.providersGroup.setLayoutData( gdhfill() );
        this.providersGroup.setLayout( gl( 1 ) );
        this.providersGroup.setText( label != null ? label : Resources.providersGroupLabel );
        
        final Composite providersComboComposite = new Composite( this.providersGroup, SWT.NONE );
        providersComboComposite.setLayoutData( gdhfill() );
        providersComboComposite.setLayout( gl( 2, 0, 0 ) );
        
        final Label providersComboLabel = new Label( providersComboComposite, SWT.NONE );
        providersComboLabel.setLayoutData( gd() );
        providersComboLabel.setText( Resources.providersComboLabel );
        
        this.providersCombo = new Combo( providersComboComposite, SWT.BORDER | SWT.READ_ONLY );
        this.providersCombo.setLayoutData( gdhfill() );
        
        this.providersCombo.addSelectionListener
        ( 
            new SelectionAdapter()
            {
                @Override
                public void widgetSelected( final SelectionEvent event )
                {
                    handleProviderSelected();
                }
            }
        );
        
        final Label separator = new Label( this.providersGroup, SWT.SEPARATOR | SWT.HORIZONTAL );
        separator.setLayoutData( gdhfill() );
        
        this.providersPageBook = new PageBook( this.providersGroup, SWT.NONE );
        this.providersPageBook.setLayoutData( gdhfill() );
        
        this.noProviderComposite = new Composite( this.providersPageBook, SWT.NONE );
        this.noProviderComposite.setLayout( gl( 1 ) );
        this.noProviderComposite.setVisible( false );
        
        final Label noProviderLabel = new Label( this.noProviderComposite, SWT.NONE );
        noProviderLabel.setText( Resources.noProvidersAvailable );
        noProviderLabel.setLayoutData( gdhfill() );
        
        handleProvidersSetChanged();
        
        final IPropertyChangeListener listener = new IPropertyChangeListener()
        {
            public void propertyChanged( final String property,
                                         final Object oldValue,
                                         final Object newValue )
            {
                handleOperationConfigChanged( property, oldValue, newValue );
            }
        }; 
        
        this.delegate.addListener( listener ); 
        
        this.addDisposeListener
        (
            new DisposeListener()
            {
                public void widgetDisposed( final DisposeEvent event )
                {
                    LibraryInstallPanel.this.delegate.removeListener( listener );
                }
            }
        );
    }
    
    private void handleProvidersSetChanged()
    {
        this.providerPages.clear();
        this.providersCombo.setItems( new String[ 0 ] );
        
        final List<ILibraryProvider> providers = this.delegate.getLibraryProviders();
        final ILibraryProvider selectedProvider = this.delegate.getLibraryProvider();
        
        for( ILibraryProvider provider : providers )
        {
            this.providersCombo.add( provider.getLabel() );
            
            final int index = this.providersCombo.getItemCount() - 1;
            this.providersCombo.setData( String.valueOf( index ), provider );
            
            final LibraryProviderOperationConfig cfg 
                = this.delegate.getLibraryProviderOperationConfig( provider );

            final LibraryProviderOperationPanel panel 
                = LibraryProviderFrameworkUiImpl.get().getOperationPanel( provider, LibraryProviderActionType.INSTALL );
            
            if( panel != null )
            {
                panel.setOperationConfig( cfg );
                
                final Control panelControl = panel.createControl( this.providersPageBook );
                panelControl.setLayoutData( gdfill() );
                panelControl.setVisible( false );
                
                this.providerPages.put( provider, panelControl );
            }

            if( provider.equals( selectedProvider ) )
            {
                this.providersCombo.select( index );
            }
        }

        handleProviderSelected();
    }
    
    private void handleProviderSelected()
    {
        final int selection = this.providersCombo.getSelectionIndex();
        
        if( selection == -1 )
        {
            this.delegate.setLibraryProvider( null );
            this.providersPageBook.showPage( this.noProviderComposite );
        }
        else
        {
            final ILibraryProvider provider 
                = (ILibraryProvider) this.providersCombo.getData( String.valueOf( selection ) );
         
            this.delegate.setLibraryProvider( provider );
            
            final Control providerPanelControl = this.providerPages.get( provider );
            this.providersPageBook.showPage( providerPanelControl );
        }
        
        getShell().layout( true, true );
    }
    
    private void handleOperationConfigChanged( final String property,
                                               final Object oldValue,
                                               final Object newValue )
    {
        if( getDisplay().getThread() != Thread.currentThread() )
        {
            getDisplay().asyncExec
            (
                new Runnable()
                {
                    public void run()
                    {
                        handleOperationConfigChanged( property, oldValue, newValue );
                    }
                }
            );
            
            return;
        }
        
        if( property.equals( LibraryInstallDelegate.PROP_AVAILABLE_PROVIDERS ) )
        {
            handleProvidersSetChanged();
        }
        else if( property.equals( LibraryInstallDelegate.PROP_SELECTED_PROVIDER ) )
        {
            final ILibraryProvider selectedProvider = this.delegate.getLibraryProvider();
            
            for( int i = 0, n = this.providersCombo.getItemCount(); i < n; i++ )
            {
                if( this.providersCombo.getData( String.valueOf( i ) ).equals( selectedProvider ) )
                {
                    this.providersCombo.select( i );
                    break;
                }
            }
            
            handleProviderSelected();
        }
    }
    
    private static final class Resources
    
        extends NLS
        
    {
        public static String providersGroupLabel;
        public static String providersComboLabel;
        public static String noProvidersAvailable;
        
        static
        {
            initializeMessages( LibraryInstallPanel.class.getName(), 
                                Resources.class );
        }
    }
    
}
