/******************************************************************************
* Copyright (c) 2009-2013, Linagora
*
* 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:
* Linagora - initial API and implementation
*******************************************************************************/
package com.ebmwebsourcing.petals.common.internal.provisional.ui;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.ProblemsLabelDecorator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import com.ebmwebsourcing.petals.common.internal.PetalsCommonPlugin;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.JavaUtils;
/**
* A wizard page to select Java libraries from the dependencies of a Java project.
* @author Vincent Zurczak - EBM WebSourcing
*/
public class LibrariesExportWizardPage extends WizardPage implements IWizardPage {
private Image jarImage;
private CheckboxTreeViewer libViewer;
private final Map<IJavaProject, Set<JavaProjectLibrary>> dependencies;
private final Set<File> librariesToImport;
/**
* @param pageName
*/
public LibrariesExportWizardPage( String pageName ) {
super( pageName );
this.dependencies = new HashMap<IJavaProject, Set<JavaProjectLibrary>> ();
this.librariesToImport = new HashSet<File> ();
ImageDescriptor desc = PetalsCommonPlugin.getImageDescriptor( "icons/obj16/jar_l_obj.gif" );
if( desc != null )
this.jarImage = desc.createImage();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage
* #createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl( Composite parent ) {
Composite container = new Composite( parent, SWT.NONE );
container.setLayout( new GridLayout ());
container.setLayoutData( new GridData( GridData.FILL_BOTH ));
new Label( container, SWT.NONE ).setText( "Select the dependencies to export." );
this.libViewer = new CheckboxTreeViewer(
container,
SWT.CHECK | SWT.BORDER | SWT.HIDE_SELECTION | SWT.SINGLE );
this.libViewer.getTree().setLayoutData( new GridData( GridData.FILL_BOTH ));
this.libViewer.setContentProvider( new JavaLibaryContentProvider ());
int labelFlags = JavaElementLabelProvider.SHOW_BASICS
| JavaElementLabelProvider.SHOW_OVERLAY_ICONS
| JavaElementLabelProvider.SHOW_SMALL_ICONS;
final DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(
new JavaElementLabelProvider( labelFlags ),
new ProblemsLabelDecorator( null )) {
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.DecoratingLabelProvider
* #getText(java.lang.Object)
*/
@Override
public String getText( Object element ) {
if( element instanceof JavaProjectLibrary )
return ((JavaProjectLibrary) element).library.getName();
return super.getText( element );
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.DecoratingLabelProvider
* #getImage(java.lang.Object)
*/
@Override
public Image getImage( Object element ) {
if( element instanceof JavaProjectLibrary )
return LibrariesExportWizardPage.this.jarImage;
return super.getImage( element );
}
};
this.libViewer.setLabelProvider( labelProvider );
this.libViewer.setInput( new Object ());
this.libViewer.addCheckStateListener( new LibraryTreeCheckStateListener ());
this.libViewer.getTree().addMouseMoveListener( new MouseMoveListener () {
public void mouseMove( MouseEvent e ) {
TreeItem item = ((Tree) e.widget).getItem ( new Point( e.x, e.y ));
if( item != null && item.getData() != null && item.getData() instanceof JavaProjectLibrary ) {
JavaProjectLibrary jpl = (JavaProjectLibrary) item.getData();
String tooltip = jpl.library.getAbsolutePath();
item.getParent().setToolTipText( tooltip );
}
else
LibrariesExportWizardPage.this.libViewer.getTree().setToolTipText( null );
}
});
setControl( container );
}
/**
* @param selectedProject the selectedProject to set
*/
public void setSelectedJavaProject( IJavaProject selectedProject ) {
this.dependencies.clear();
if( selectedProject != null ) {
List<IJavaProject> proj = JavaUtils.getJavaProjectDependencies( selectedProject );
for( IJavaProject jp : proj ) {
List<String> locations = JavaUtils.getClasspath( jp, false, false );
Set<JavaProjectLibrary> libs = new HashSet<JavaProjectLibrary> ();
for( String loc : locations ) {
if( !loc.endsWith( ".jar" ) && !loc.endsWith( ".zip" ))
continue;
File f = new File( loc );
JavaProjectLibrary jpl = new JavaProjectLibrary ();
jpl.javaProject = jp;
jpl.library = f;
libs.add( jpl );
}
this.dependencies.put( jp, libs );
}
}
if( this.libViewer != null ) {
this.libViewer.refresh();
if( selectedProject != null ) {
this.libViewer.expandToLevel( selectedProject, 1 );
this.libViewer.setSelection( new StructuredSelection( selectedProject ));
}
}
}
/**
* @return the librariesToImport
*/
public Set<File> getLibariesToImport() {
return this.librariesToImport;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.DialogPage#dispose()
*/
@Override
public void dispose() {
if( this.jarImage != null )
this.jarImage.dispose();
super.dispose();
}
/**
*
*/
private class JavaLibaryContentProvider implements ITreeContentProvider {
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider
* #getChildren(java.lang.Object)
*/
public Object[] getChildren( Object parentElement ) {
if( parentElement instanceof IJavaProject ) {
IJavaProject jp = (IJavaProject) parentElement;
Set<JavaProjectLibrary> libs = LibrariesExportWizardPage.this.dependencies.get( jp );
return libs.toArray();
}
return new Object[ 0 ];
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider
* #getParent(java.lang.Object)
*/
public Object getParent( Object element ) {
if( element instanceof JavaProjectLibrary )
return ((JavaProjectLibrary) element).javaProject;
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider
* #hasChildren(java.lang.Object)
*/
public boolean hasChildren( Object element ) {
return getChildren( element ).length > 0;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider
* #getElements(java.lang.Object)
*/
public Object[] getElements( Object inputElement ) {
return LibrariesExportWizardPage.this.dependencies.keySet().toArray();
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider
* #dispose()
*/
public void dispose() {
// nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider
* #inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) {
// nothing
}
}
/**
*
*/
private static class JavaProjectLibrary {
IJavaProject javaProject;
File library;
}
/**
*
*/
private class LibraryTreeCheckStateListener implements ICheckStateListener {
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ICheckStateListener
* #checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
*/
public void checkStateChanged( CheckStateChangedEvent event ) {
// JavaProjectLibrary
if( event.getElement() instanceof JavaProjectLibrary ) {
JavaProjectLibrary jpl = (JavaProjectLibrary) event.getElement();
updateHierarchyState( jpl );
if( event.getChecked())
LibrariesExportWizardPage.this.librariesToImport.add( jpl.library );
else
LibrariesExportWizardPage.this.librariesToImport.remove( jpl.library );
}
// IJavaProject
else if( event.getElement() instanceof IJavaProject ) {
IJavaProject jp = (IJavaProject) event.getElement();
LibrariesExportWizardPage.this.libViewer.setSubtreeChecked( jp, event.getChecked());
Set<JavaProjectLibrary> jpls = LibrariesExportWizardPage.this.dependencies.get( jp );
List<File> libs = new ArrayList<File> ();
for( JavaProjectLibrary jpl : jpls )
libs.add( jpl.library );
if( event.getChecked())
LibrariesExportWizardPage.this.librariesToImport.addAll( libs );
else
LibrariesExportWizardPage.this.librariesToImport.removeAll( libs );
}
}
/**
* Update the check state in the tree.
*
* @param jpl
* @param checked
*/
private void updateHierarchyState( JavaProjectLibrary jpl ) {
Set<JavaProjectLibrary> jpls = LibrariesExportWizardPage.this.dependencies.get( jpl.javaProject );
int childrenCount = jpls.size();
int checkedChildren = 0;
for( JavaProjectLibrary jp : jpls ) {
if( LibrariesExportWizardPage.this.libViewer.getChecked( jp ))
checkedChildren ++;
}
if( checkedChildren == 0 )
LibrariesExportWizardPage.this.libViewer.setGrayChecked( jpl.javaProject, false );
else if( checkedChildren == childrenCount ) {
LibrariesExportWizardPage.this.libViewer.setGrayed( jpl.javaProject, false );
LibrariesExportWizardPage.this.libViewer.setChecked( jpl.javaProject, true );
}
else
LibrariesExportWizardPage.this.libViewer.setGrayChecked( jpl.javaProject, true );
}
}
}