| /****************************************************************************** |
| * 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.j2ee.internal.ui; |
| |
| import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.checkForComponentDependencyAttribute; |
| import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.getDefaultRuntimePath; |
| import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.isClassFolderEntry; |
| import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.modifyDependencyPath; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.jdt.core.IClasspathContainer; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.internal.ui.JavaPluginImages; |
| import org.eclipse.jdt.ui.ISharedImages; |
| import org.eclipse.jdt.ui.JavaUI; |
| import org.eclipse.jface.viewers.DoubleClickEvent; |
| import org.eclipse.jface.viewers.IDoubleClickListener; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants.DependencyAttributeType; |
| import org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyExtensions; |
| import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin; |
| import org.eclipse.jst.j2ee.internal.ui.J2EEModuleDependenciesPropertyPage.ClasspathEntryProxy; |
| import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.wst.common.componentcore.ComponentCore; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; |
| import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle; |
| import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment; |
| import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants; |
| |
| @SuppressWarnings( "restriction" ) |
| |
| public final class AddJavaBuildPathEntriesWizardFragment |
| |
| extends WizardFragment |
| |
| { |
| public static final String PROP_SELECTION = "selection"; //$NON-NLS-1$ |
| |
| private IWizardHandle wizard; |
| private TreeViewer viewer; |
| private IJavaProject jproj; |
| |
| public AddJavaBuildPathEntriesWizardFragment() |
| { |
| setComplete( false ); |
| } |
| |
| @Override |
| public boolean hasComposite() |
| { |
| return true; |
| } |
| |
| @Override |
| public Composite createComposite( final Composite parent, |
| final IWizardHandle handle ) |
| { |
| this.wizard = handle; |
| |
| handle.setTitle( Resources.title ); |
| handle.setDescription( Resources.description ); |
| handle.setImageDescriptor( JavaPluginImages.DESC_WIZBAN_ADD_LIBRARY ); |
| |
| final Composite composite = new Composite( parent, SWT.NONE ); |
| composite.setLayout( new GridLayout() ); |
| |
| this.viewer = new TreeViewer( composite, SWT.MULTI | SWT.BORDER ); |
| |
| final GridData gd = new GridData( GridData.FILL_BOTH ); |
| gd.widthHint = 390; |
| gd.heightHint = 185; |
| |
| this.viewer.getTree().setLayoutData( gd ); |
| |
| this.viewer.setContentProvider( new BuildPathEntriesContentProvider() ); |
| this.viewer.setLabelProvider( new BuildPathEntriesLabelProvider() ); |
| |
| this.viewer.addSelectionChangedListener |
| ( |
| new ISelectionChangedListener() |
| { |
| public void selectionChanged( final SelectionChangedEvent event ) |
| { |
| handleSelectionChanged(); |
| } |
| } |
| ); |
| |
| this.viewer.addDoubleClickListener |
| ( |
| new IDoubleClickListener() |
| { |
| public void doubleClick( final DoubleClickEvent event ) |
| { |
| handleDoubleClick(); |
| } |
| } |
| ); |
| |
| final IProject proj = (IProject) getTaskModel().getObject( IReferenceWizardConstants.PROJECT ); |
| this.jproj = JavaCore.create( proj ); |
| |
| this.viewer.setInput( new Object() ); |
| |
| return composite; |
| } |
| |
| private void handleSelectionChanged() |
| { |
| final List<IClasspathEntry> list = new ArrayList<IClasspathEntry>(); |
| final IStructuredSelection selection = (IStructuredSelection) this.viewer.getSelection(); |
| final IVirtualComponent virtualComponent = ComponentCore.createComponent(this.jproj.getProject()); |
| final boolean isWebApp = JavaEEProjectUtilities.isDynamicWebProject( this.jproj.getProject() ); |
| |
| for( Iterator<?> itr = selection.iterator(); itr.hasNext(); ) |
| { |
| final Object obj = itr.next(); |
| |
| if( obj instanceof IClasspathEntry ) |
| { |
| final IClasspathEntry cpeOriginal = (IClasspathEntry) obj; |
| |
| IPath runtimePath = null; |
| if(virtualComponent == null){ |
| runtimePath = getDefaultRuntimePath( isWebApp, isClassFolderEntry( cpeOriginal ) ); |
| } else { |
| runtimePath = getDefaultRuntimePath(virtualComponent, cpeOriginal); |
| } |
| final IClasspathEntry cpeTagged = modifyDependencyPath( cpeOriginal, runtimePath ); |
| |
| list.add( cpeTagged ); |
| } |
| else |
| { |
| list.clear(); |
| break; |
| } |
| } |
| |
| getTaskModel().putObject( PROP_SELECTION, list ); |
| |
| setComplete( ! list.isEmpty() ); |
| this.wizard.update(); |
| } |
| |
| private void handleDoubleClick() |
| { |
| advanceToNextPageOrFinish(); |
| } |
| |
| private IJavaProject getJavaProject() |
| { |
| return this.jproj; |
| } |
| |
| public static String getClasspathEntryText( final IJavaProject jproj, |
| final IClasspathEntry cpe ) |
| { |
| final int type = cpe.getEntryKind(); |
| |
| if( type == IClasspathEntry.CPE_CONTAINER ) |
| { |
| try |
| { |
| final IClasspathContainer container = JavaCore.getClasspathContainer( cpe.getPath(), jproj ); |
| return container.getDescription(); |
| } |
| catch( Exception e ) |
| { |
| J2EEUIPlugin.logError(e); |
| } |
| } |
| else if( type == IClasspathEntry.CPE_LIBRARY ) |
| { |
| final IPath path = cpe.getPath(); |
| |
| final StringBuilder buf = new StringBuilder(); |
| buf.append( path.lastSegment() ); |
| buf.append( " - " ); //$NON-NLS-1$ |
| buf.append( path.removeLastSegments( 1 ).toOSString() ); |
| |
| return buf.toString(); |
| } |
| |
| return cpe.getPath().toPortableString(); |
| } |
| |
| public static Image getClasspathEntryImage( final IJavaProject jproj, |
| final IClasspathEntry cpe ) |
| { |
| final int type = cpe.getEntryKind(); |
| final String imgId; |
| |
| if( type == IClasspathEntry.CPE_CONTAINER ) |
| { |
| imgId = ISharedImages.IMG_OBJS_LIBRARY; |
| } |
| else if( type == IClasspathEntry.CPE_LIBRARY ) |
| { |
| imgId = ISharedImages.IMG_OBJS_JAR; |
| } |
| else if( type == IClasspathEntry.CPE_VARIABLE ) |
| { |
| imgId = ISharedImages.IMG_OBJS_CLASSPATH_VAR_ENTRY; |
| } |
| else |
| { |
| imgId = null; |
| } |
| |
| return ( imgId == null ? null : JavaUI.getSharedImages().getImage( imgId ) ); |
| } |
| |
| private final class BuildPathEntriesContentProvider |
| |
| implements ITreeContentProvider |
| |
| { |
| public Object[] getElements( final Object input ) |
| { |
| final List<IClasspathEntry> elements = new ArrayList<IClasspathEntry>(); |
| final List<?> filteredContainerIds = ClasspathDependencyExtensions.get().getFilteredClasspathContainerIDs(); |
| |
| try |
| { |
| for( IClasspathEntry cpe : getJavaProject().getRawClasspath() ) |
| { |
| final int type = cpe.getEntryKind(); |
| final IPath path = cpe.getPath(); |
| boolean relevant = false; |
| |
| if( type == IClasspathEntry.CPE_CONTAINER ) |
| { |
| if( path.segmentCount() > 0 && ! filteredContainerIds.contains( path.segment( 0 ) ) ) |
| { |
| relevant = true; |
| } |
| } |
| else if( type == IClasspathEntry.CPE_LIBRARY || type == IClasspathEntry.CPE_VARIABLE ) |
| { |
| relevant = true; |
| } |
| |
| if( relevant ) |
| { |
| if( checkForComponentDependencyAttribute( cpe, DependencyAttributeType.CLASSPATH_COMPONENT_NONDEPENDENCY ) != null ) |
| { |
| relevant = false; |
| } |
| } |
| |
| if( relevant ) |
| { |
| boolean found = false; |
| |
| for( Object directive : (List<?>) getTaskModel().getObject( IReferenceWizardConstants.ALL_DIRECTIVES ) ) |
| { |
| if( directive instanceof ClasspathEntryProxy ) |
| { |
| final ClasspathEntryProxy proxy = (ClasspathEntryProxy) directive; |
| |
| if( type == proxy.entry.getEntryKind() && path.equals( proxy.entry.getPath() ) ) |
| { |
| found = true; |
| break; |
| } |
| } |
| } |
| |
| if( found ) |
| { |
| relevant = false; |
| } |
| } |
| |
| if( relevant ) |
| { |
| elements.add( cpe ); |
| } |
| } |
| } |
| catch( CoreException e ) |
| { |
| J2EEUIPlugin.logError(e); |
| } |
| |
| return elements.toArray(); |
| } |
| |
| public boolean hasChildren( final Object element ) |
| { |
| return ( element instanceof IClasspathEntry ) && |
| ( ( (IClasspathEntry) element ).getEntryKind() == IClasspathEntry.CPE_CONTAINER ); |
| } |
| |
| public Object[] getChildren( final Object parent ) |
| { |
| if( parent instanceof IClasspathEntry ) |
| { |
| final IClasspathEntry cpe = (IClasspathEntry) parent; |
| |
| if( cpe.getEntryKind() == IClasspathEntry.CPE_CONTAINER ) |
| { |
| final List<ChildClasspathEntry> children = new ArrayList<ChildClasspathEntry>(); |
| |
| try |
| { |
| final IClasspathContainer container = JavaCore.getClasspathContainer( cpe.getPath(), getJavaProject() ); |
| |
| if( container != null ) |
| { |
| for( IClasspathEntry child : container.getClasspathEntries() ) |
| { |
| children.add( new ChildClasspathEntry( cpe, child ) ); |
| } |
| } |
| } |
| catch( Exception e ) |
| { |
| J2EEUIPlugin.logError(e); |
| } |
| |
| return children.toArray(); |
| } |
| } |
| |
| return new Object[ 0 ]; |
| } |
| |
| public Object getParent( final Object element ) |
| { |
| if( element instanceof ChildClasspathEntry ) |
| { |
| return ( (ChildClasspathEntry) element ).parent; |
| } |
| |
| return null; |
| } |
| |
| public void inputChanged( final Viewer viewer, |
| final Object oldInput, |
| final Object newInput ) |
| { |
| } |
| |
| public void dispose() |
| { |
| } |
| } |
| |
| private final class BuildPathEntriesLabelProvider |
| |
| extends LabelProvider |
| |
| { |
| @Override |
| public String getText( final Object element ) |
| { |
| final IClasspathEntry cpe; |
| |
| if( element instanceof IClasspathEntry ) |
| { |
| cpe = (IClasspathEntry) element; |
| } |
| else |
| { |
| cpe = ( (ChildClasspathEntry) element ).entry; |
| } |
| |
| return getClasspathEntryText( getJavaProject(), cpe ); |
| } |
| |
| @Override |
| public Image getImage( final Object element ) |
| { |
| final IClasspathEntry cpe; |
| |
| if( element instanceof IClasspathEntry ) |
| { |
| cpe = (IClasspathEntry) element; |
| } |
| else |
| { |
| cpe = ( (ChildClasspathEntry) element ).entry; |
| } |
| |
| return getClasspathEntryImage( getJavaProject(), cpe ); |
| } |
| } |
| |
| private static final class ChildClasspathEntry |
| { |
| public final IClasspathEntry parent; |
| public final IClasspathEntry entry; |
| |
| public ChildClasspathEntry( final IClasspathEntry parent, |
| final IClasspathEntry entry ) |
| { |
| this.parent = parent; |
| this.entry = entry; |
| } |
| } |
| |
| public static final class Resources extends NLS |
| { |
| public static String title; |
| public static String description; |
| |
| static |
| { |
| initializeMessages( AddJavaBuildPathEntriesWizardFragment.class.getName(), Resources.class ); |
| } |
| } |
| |
| } |