blob: d034248c7c10eddf18ea9c57c49697922793ff47 [file] [log] [blame]
/******************************************************************************
* 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
* https://www.eclipse.org/legal/epl-2.0/
*
* 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 );
}
}
}