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

}