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