
Modification de propriétés sur test/resolve-in-workspace
___________________________________________________________________
Ajouté : svn:ignore
   + bin



Index: test/resolve-in-workspace/.classpath
===================================================================
--- test/resolve-in-workspace/.classpath	(révision 0)
+++ test/resolve-in-workspace/.classpath	(révision 0)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?ivyXmlPath=ivy.xml&amp;confs=*&amp;ivySettingsPath=project%3A%2F%2F%2Fivysettings.xml&amp;loadSettingsOnDemand=false&amp;propertyFiles=&amp;doRetrieve=false&amp;retrievePattern=lib%2F%5Bconf%5D%2F%5Bartifact%5D.%5Bext%5D&amp;retrieveSync=false&amp;retrieveConfs=*&amp;retrieveTypes=*&amp;acceptedTypes=jar&amp;sourceTypes=source&amp;javadocTypes=javadoc&amp;sourceSuffixes=-source%2C-sources%2C-src&amp;javadocSuffixes=-javadoc%2C-javadocs%2C-doc%2C-docs&amp;alphaOrder=false&amp;resolveInWorkspace=true"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: test/resolve-in-workspace/.project
===================================================================
--- test/resolve-in-workspace/.project	(révision 0)
+++ test/resolve-in-workspace/.project	(révision 0)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ivydetest-resolve-in-workspace</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: test/resolve-in-workspace/ivy.xml
===================================================================
--- test/resolve-in-workspace/ivy.xml	(révision 0)
+++ test/resolve-in-workspace/ivy.xml	(révision 0)
@@ -0,0 +1,31 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.    
+-->
+<ivy-module version="1.0">
+    <info organisation="org.apache.ivyde" module="ivytest-resolve-in-workspace">
+        <description>
+            Project using the resolve in workspace feature
+        </description>
+    </info>
+    <configurations>
+        <conf name="default" />
+    </configurations>
+    <dependencies>
+        <dependency org="commons-logging" name="commons-logging" rev="latest.integration" conf="default" />
+    </dependencies>
+</ivy-module>
Index: test/resolve-in-workspace/ivysettings.xml
===================================================================
--- test/resolve-in-workspace/ivysettings.xml	(révision 0)
+++ test/resolve-in-workspace/ivysettings.xml	(révision 0)
@@ -0,0 +1,10 @@
+<ivysettings>
+    <caches defaultCacheDir="${ivy.settings.dir}/../cache-fakerepo" useOrigin="false" />
+    <settings defaultResolver="fakerepo" checkUpToDate="false" />
+    <resolvers>
+        <filesystem name="fakerepo">
+            <ivy pattern="${ivy.settings.dir}/../fakerepo/[organisation]/[module]/ivy-[revision].xml"/>
+            <artifact pattern="${ivy.settings.dir}/../fakerepo/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
+        </filesystem>
+    </resolvers>
+</ivysettings>
Index: org.apache.ivyde.eclipse/.project
===================================================================
--- org.apache.ivyde.eclipse/.project	(révision 736034)
+++ org.apache.ivyde.eclipse/.project	(copie de travail)
@@ -1,22 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one
-   or more contributor license agreements.  See the NOTICE file
-   distributed with this work for additional information
-   regarding copyright ownership.  The ASF licenses this file
-   to you under the Apache License, Version 2.0 (the
-   "License"); you may not use this file except in compliance
-   with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing,
-   software distributed under the License is distributed on an
-   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-   KIND, either express or implied.  See the License for the
-   specific language governing permissions and limitations
-   under the License.    
--->
 <projectDescription>
 	<name>org.apache.ivyde.eclipse</name>
 	<comment></comment>
@@ -38,15 +20,9 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
-		<buildCommand>
-			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
 	</natures>
 </projectDescription>
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/resolver/WorkspaceResolver.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/resolver/WorkspaceResolver.java	(révision 0)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/resolver/WorkspaceResolver.java	(révision 0)
@@ -0,0 +1,200 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.resolver;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+
+import org.apache.ivy.core.module.descriptor.Artifact;
+import org.apache.ivy.core.module.descriptor.Configuration;
+import org.apache.ivy.core.module.descriptor.DefaultArtifact;
+import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.report.ArtifactDownloadReport;
+import org.apache.ivy.core.report.DownloadReport;
+import org.apache.ivy.core.report.DownloadStatus;
+import org.apache.ivy.core.report.MetadataArtifactDownloadReport;
+import org.apache.ivy.core.resolve.DownloadOptions;
+import org.apache.ivy.core.resolve.ResolveData;
+import org.apache.ivy.core.resolve.ResolvedModuleRevision;
+import org.apache.ivy.core.settings.IvySettings;
+import org.apache.ivy.plugins.resolver.AbstractResolver;
+import org.apache.ivy.plugins.resolver.util.ResolvedResource;
+import org.apache.ivy.util.Message;
+import org.apache.ivyde.eclipse.IvyDEException;
+import org.apache.ivyde.eclipse.IvyPlugin;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+
+/**
+ * This is an Eclipse workspace Ivy resolver. When used with the custom IvyClasspathContainer
+ * changes, this resolver will link dependent projects when they are open in the same workspace,
+ * allowing full-fledged linked project functionality Eclipse provides, such as incremental
+ * compilation, debugging, mouseover javadocs, and source browsing across projects.
+ * 
+ * <b>How it works</b> During a resolve, it looks at all open projects in the workspace that have
+ * Ivy containers. The <b>first</b> project that publishes the module on which the project being
+ * resolved depends, will be picked and returned as a special type of artifact called "project".
+ * 
+ * The IvyClasspathContainer will recognize the artifact as a project and put the eclipse project as
+ * a dependent project within the classpath container of the parent.
+ * 
+ * If you do not want a project to be linked as a dependency, close it or delete from the workspace.
+ * As soon as you do that, any projects that were linked to it will automatically re-resolve (see
+ * {@link WorkspaceResourceChangeListener}) and use the standard Ivy means of finding the
+ * dependency.
+ * 
+ * The {@link WorkspaceResourceChangeListener} will also auto-resolve when a new project is added or
+ * opened, so opening a project will automatically link it into the currently open projects where
+ * necessary.
+ * 
+ * Since the resolver is not aware which module revision a project is publishing, it optimistically
+ * matches any revision of the module.
+ * 
+ * Since the resolver stops after finding the first open project which matches the module, having
+ * multiple open versions of the same project in the workspace (for example, different branches) may
+ * set the wrong version as a dependency. You are advised to only open the version of the project
+ * which you want other projects in the workspace to depend on.
+ * 
+ * NOTE: Transitive dependencies are not passed from the dependent project to the parent when
+ * projects are linked. If you find you are missing some transitive dependencies, just set your
+ * dependent eclipse project to export its ivy dependencies. (Project->Properties->Java Build
+ * Path->Order and Export-> -> check the ivy container) This will only export the configuration that
+ * project is using and not what a dependent project may ask for when it's being resolved. To do
+ * that, this resolver will need to be modified to pass transitive dependencies along.
+ */
+public class WorkspaceResolver extends AbstractResolver {
+
+    public static final String ECLIPSE_PROJECT_TYPE = "eclipse-project";
+
+    public static final String ECLIPSE_PROJECT_EXTENSION = "eclipse-project";
+
+    private final IJavaProject resolvingJavaProject;
+
+    public WorkspaceResolver(IJavaProject javaProject, IvySettings ivySettings) {
+        this.resolvingJavaProject = javaProject;
+        setName(javaProject.getElementName() + "-ivyde-workspace-resolver");
+        setSettings(ivySettings);
+    }
+
+    public DownloadReport download(Artifact[] artifacts, DownloadOptions options) {
+        // Not much to do here - downloads are not required for workspace projects.
+        DownloadReport dr = new DownloadReport();
+        for (int i = 0; i < artifacts.length; i++) {
+            final ArtifactDownloadReport adr = new ArtifactDownloadReport(artifacts[i]);
+            dr.addArtifactReport(adr);
+
+            // Only report java projects as downloaded
+            if (artifacts[i].getType().equals(ECLIPSE_PROJECT_TYPE)) {
+                Message.verbose("\t[WORKSPACE   ] " + artifacts[i]);
+                adr.setDownloadStatus(DownloadStatus.NO);
+                adr.setSize(0);
+            } else {
+                Message.verbose("\t[Eclipse Workspace resolver - skipping non-project artifact] "
+                        + artifacts[i]);
+                adr.setDownloadStatus(DownloadStatus.NO);
+            }
+        }
+        return dr;
+    }
+
+    public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
+            throws ParseException {
+
+        IJavaProject[] projects;
+        try {
+            projects = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects();
+        } catch (JavaModelException e) {
+            IvyPlugin.log(IStatus.ERROR, "JDT Error while resolving in workspace for "
+                    + resolvingJavaProject.getElementName(), e);
+            return null;
+        }
+
+        // Iterate over workspace to find Java project which has an Ivy
+        // container for this dependency
+        for (int i = 0; i < projects.length; i++) {
+            IJavaProject javaProject = projects[i];
+            if (resolvingJavaProject.equals(javaProject)) {
+                // we don't want to introduce self dependency
+                continue;
+            }
+            if (!javaProject.exists()) {
+                continue;
+            }
+            IvyClasspathContainer ivycp = IvyClasspathUtil.getIvyClasspathContainer(javaProject);
+            if (ivycp != null) {
+                ModuleDescriptor md;
+                try {
+                    md = ivycp.getConf().getModuleDescriptor();
+                } catch (IvyDEException e) {
+                    IvyPlugin.log(IStatus.WARNING, "Resolve in workspace for '"
+                            + resolvingJavaProject.getElementName() + "' cannot depend on "
+                            + ivycp.getDescription() + " [" + e.getMessage() + "]", null);
+                    continue;
+                }
+
+                // Found one; check if it is for the module we need
+                if (getSettings().getVersionMatcher().accept(dd.getDependencyRevisionId(), md)) {
+
+                    // Get a revision which will match desired revision
+                    ModuleRevisionId localId = md.getModuleRevisionId();// generateLocalId(dd.getDependencyRevisionId());
+                    Artifact af = new DefaultArtifact(localId, md.getPublicationDate(), javaProject
+                            .getPath().toString(), ECLIPSE_PROJECT_TYPE, ECLIPSE_PROJECT_EXTENSION);
+
+                    DefaultModuleDescriptor workspaceMd = DefaultModuleDescriptor
+                            .newDefaultInstance(localId);
+
+                    String[] allConfs = md.getConfigurationsNames();
+                    if (allConfs.length == 0) {
+                        workspaceMd.addArtifact(ModuleDescriptor.DEFAULT_CONFIGURATION, af);
+                    } else {
+                        for (int k = 0; k < allConfs.length; k++) {
+                            workspaceMd.addConfiguration(new Configuration(allConfs[k]));
+                            workspaceMd.addArtifact(allConfs[k], af);
+                        }
+                    }
+
+                    MetadataArtifactDownloadReport madr = new MetadataArtifactDownloadReport(af);
+                    madr.setDownloadStatus(DownloadStatus.SUCCESSFUL);
+                    madr.setSearched(true);
+
+                    return new ResolvedModuleRevision(this, this, workspaceMd, madr);
+                }
+            }
+        }
+
+        // Didn't find module in any open project, proceed to other resolvers.
+        return null;
+    }
+
+    public void publish(Artifact artifact, File src, boolean overwrite) throws IOException {
+        throw new UnsupportedOperationException("publish not supported by " + getName());
+    }
+
+    public ResolvedResource findIvyFileRef(DependencyDescriptor dd, ResolveData data) {
+        return null;
+    }
+}
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/resolver/WorkspaceResourceChangeListener.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/resolver/WorkspaceResourceChangeListener.java	(révision 0)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/resolver/WorkspaceResourceChangeListener.java	(révision 0)
@@ -0,0 +1,238 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.resolver;
+
+import java.util.Collection;
+import java.util.LinkedHashSet;
+
+import org.apache.ivyde.eclipse.IvyPlugin;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceRuleFactory;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+
+/**
+ * This ResourceChangeListener detects when projects linked in as Ivy dependencies are closed. When
+ * necessary, it will re-resolve Ivy projects which had the dependent project linked into the Ivy
+ * container before it was closed.
+ */
+public class WorkspaceResourceChangeListener implements IResourceChangeListener {
+
+    public void resourceChanged(IResourceChangeEvent event) {
+
+        try {
+            if (event.getType() == IResourceChangeEvent.PRE_CLOSE
+                    || event.getType() == IResourceChangeEvent.PRE_DELETE) {
+                if (!IvyPlugin.getPreferenceStoreHelper().getAutoResolveOnClose()) {
+                    return;
+                }
+                IResource res = event.getResource();
+                IJavaProject javaProject;
+                switch (res.getType()) {
+                    case IResource.FOLDER:
+                        javaProject = JavaCore.create(((IFolder) res).getProject());
+                        break;
+                    case IResource.FILE:
+                        javaProject = JavaCore.create(((IFile) res).getProject());
+                        break;
+                    case IResource.PROJECT:
+                        javaProject = JavaCore.create((IProject) res);
+                        break;
+                    default:
+                        return;
+                }
+                projectClosed(javaProject);
+            } else if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
+                if (!IvyPlugin.getPreferenceStoreHelper().getAutoResolveOnOpen()) {
+                    return;
+                }
+                projectOpened(event);
+            }
+        } catch (JavaModelException jme) {
+            IvyPlugin.log(IStatus.ERROR,
+                "Errors occurred trying to find projects affected by closure", jme);
+        } catch (OperationCanceledException oce) {
+            IvyPlugin.log(IStatus.CANCEL,
+                "Ivy update of dependent proejects affected by project close operation canceled",
+                null);
+        }
+    }
+
+    private void projectClosed(final IJavaProject javaProject) throws JavaModelException {
+        // Check if one of Ivy projects is being removed
+        IvyClasspathContainer ivycp = IvyClasspathUtil.getIvyClasspathContainer(javaProject);
+        if (ivycp == null) {
+            return;
+        }
+
+        // Found an Ivy container in this project -- notify dependent projects
+        // to perform fresh resolve
+
+        // Let's try to be nice and use the workspace method to schedule resolves in
+        // dependent projects after the close operation has finished.
+        IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
+        ISchedulingRule modifyRule = ruleFactory.modifyRule(javaProject.getCorrespondingResource());
+        class IvyClosedProjectJob extends WorkspaceJob {
+
+            public IvyClosedProjectJob() {
+                super("IvyClosedProjectJob");
+            }
+
+            public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+                resolveAffectedProjects(javaProject.getPath(), isUser(), monitor);
+                return Status.OK_STATUS;
+            }
+        }
+
+        IvyClosedProjectJob job = new IvyClosedProjectJob();
+        job.setRule(modifyRule);
+        job.schedule();
+
+    }
+
+    private void projectOpened(IResourceChangeEvent event) {
+
+        // Find out if a project was opened.
+        IResourceDelta delta = event.getDelta();
+        if (delta == null) {
+            return;
+        }
+
+        final Collection projects = new LinkedHashSet();
+        IResourceDelta[] projDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED);
+        for (int i = 0; i < projDeltas.length; ++i) {
+            IResourceDelta projDelta = projDeltas[i];
+            if ((projDelta.getFlags() & IResourceDelta.OPEN) == 0) {
+                continue;
+            }
+            IResource resource = projDeltas[i].getResource();
+            if (!(resource instanceof IProject)) {
+                continue;
+            }
+            IJavaProject javaProject = JavaCore.create((IProject) resource);
+            IvyClasspathContainer ivycp = IvyClasspathUtil.getIvyClasspathContainer(javaProject);
+            if (ivycp == null || !ivycp.getConf().isInheritedResolveInWorkspace()) {
+                continue;
+            }
+            projects.add(resource);
+        }
+
+        if (projects.size() == 0) {
+            return;
+        }
+
+        // Let's try to be nice and use the workspace method to schedule resolves in
+        // dependent projects after the open operation has finished.
+        IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
+        ISchedulingRule modifyRule = ruleFactory.modifyRule(ResourcesPlugin.getWorkspace()
+                .getRoot());
+        class IvyOpenProjectJob extends WorkspaceJob {
+
+            public IvyOpenProjectJob() {
+                super("IvyOpenProjectJob");
+            }
+
+            public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+                resolveAllProjectsExcept(projects, isUser(), monitor);
+                return Status.OK_STATUS;
+            }
+        }
+
+        IvyOpenProjectJob job = new IvyOpenProjectJob();
+        job.setRule(modifyRule);
+        job.schedule();
+    }
+
+    /*
+     * Only resolve those projects which include the specified project path as ivy dependency
+     */
+    private void resolveAffectedProjects(IPath projectPath, boolean isUser, IProgressMonitor monitor)
+            throws JavaModelException {
+        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+        IJavaProject[] projects = JavaCore.create(root).getJavaProjects();
+
+        for (int i = 0; i < projects.length; i++) {
+            IJavaProject javaProject = projects[i];
+            IvyClasspathContainer c = IvyClasspathUtil.getIvyClasspathContainer(javaProject);
+            if (c == null) {
+                continue;
+            }
+            IClasspathEntry[] containerEntries = c.getClasspathEntries();
+            for (int j = 0; j < containerEntries.length; j++) {
+                IClasspathEntry containerEntry = containerEntries[j];
+                if (containerEntry == null
+                        || containerEntry.getEntryKind() != IClasspathEntry.CPE_PROJECT
+                        || !containerEntry.getPath().equals(projectPath)) {
+                    continue;
+                }
+
+                SubProgressMonitor subMonitor = null;
+                if (monitor != null) {
+                    if (monitor.isCanceled()) {
+                        return;
+                    }
+                    subMonitor = new SubProgressMonitor(monitor, 1);
+                }
+                c.launchResolve(false, isUser, subMonitor);
+                break;
+            }
+        }
+    }
+
+    private void resolveAllProjectsExcept(Collection sourceProjects, boolean isUser,
+            IProgressMonitor monitor) throws JavaModelException {
+        IJavaProject[] projects = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot())
+                .getJavaProjects();
+        for (int i = 0; i < projects.length; i++) {
+            if (sourceProjects.contains(projects[i])) {
+                continue;
+            }
+            SubProgressMonitor subMonitor = null;
+            if (monitor != null) {
+                if (monitor.isCanceled()) {
+                    return;
+                }
+                subMonitor = new SubProgressMonitor(monitor, 1);
+            }
+            IvyClasspathContainer ivycp = IvyClasspathUtil.getIvyClasspathContainer(projects[i]);
+            ivycp.launchResolve(false, isUser, subMonitor);
+        }
+    }
+
+}
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyResolveJob.java	(copie de travail)
@@ -44,7 +44,6 @@
 import org.apache.ivy.core.event.resolve.StartResolveDependencyEvent;
 import org.apache.ivy.core.module.descriptor.Artifact;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.module.id.ModuleId;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.report.ArtifactDownloadReport;
 import org.apache.ivy.core.report.ResolveReport;
@@ -59,10 +58,10 @@
 import org.apache.ivy.util.filter.ArtifactTypeFilter;
 import org.apache.ivyde.eclipse.IvyDEException;
 import org.apache.ivyde.eclipse.IvyPlugin;
+import org.apache.ivyde.eclipse.resolver.WorkspaceResolver;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -74,9 +73,7 @@
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jdt.core.IClasspathAttribute;
 import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
 
 /**
  * Eclipse classpath container that will contain the ivy resolved entries.
@@ -218,16 +215,17 @@
                     Thread.currentThread().setContextClassLoader(
                         IvyResolveJob.class.getClassLoader());
                     try {
-                        Map/*<ModuleRevisionId, IvyNode>*/ dependencies = Collections.EMPTY_MAP;
+                        Map/* <ModuleRevisionId, IvyNode> */dependencies = Collections.EMPTY_MAP;
                         List configurations = new ArrayList();
                         configurations.addAll(conf.getConfs());
-                        configurations.addAll(Arrays.asList(conf.getInheritedRetrieveConfs().split(",")));
+                        configurations.addAll(Arrays.asList(conf.getInheritedRetrieveConfs().split(
+                            ",")));
                         if (usePreviousResolveIfExist) {
                             if (configurations.size() == 1 && "*".equals(configurations.get(0))) {
                                 confs = md.getConfigurationsNames();
                             } else {
-                                confs = (String[]) configurations
-                                        .toArray(new String[configurations.size()]);
+                                confs = (String[]) configurations.toArray(new String[configurations
+                                        .size()]);
                             }
 
                             all = new LinkedHashSet();
@@ -240,7 +238,7 @@
                                         .getConfigurationResolveReportInCache(
                                             ResolveOptions.getDefaultResolveId(md), confs[i]);
                                 boolean resolved = false;
-                                if (report.exists() && !conf.isResolveInWorkspace()) {
+                                if (report.exists()) {
                                     // found a report, try to parse it.
                                     try {
                                         XmlReportParser parser = new XmlReportParser();
@@ -277,8 +275,8 @@
                         } else {
                             Message.info("\n\nIVYDE: calling resolve on " + conf.ivyXmlPath + "\n");
                             ResolveOptions resolveOption = new ResolveOptions()
-                                    .setConfs((String[]) configurations.toArray(new String[configurations
-                                            .size()]));
+                                    .setConfs((String[]) configurations
+                                            .toArray(new String[configurations.size()]));
                             resolveOption.setValidate(ivy.getSettings().doValidate());
                             ResolveReport report = ivy.resolve(md, resolveOption);
                             problemMessages = report.getAllProblemMessages();
@@ -464,83 +462,37 @@
         }
     }
 
-    private IClasspathEntry[] artifacts2ClasspathEntries(
-            Collection all, Map/*<ModuleRevisionId, IvyNode>*/ dependencies) {
+    private IClasspathEntry[] artifacts2ClasspathEntries(Collection all, Map/*
+                                                                             * <ModuleRevisionId,
+                                                                             * IvyNode>
+                                                                             */dependencies) {
         IClasspathEntry[] classpathEntries;
         Collection paths = new LinkedHashSet();
 
-        Map idToJProject = new HashMap();
-        if (conf.isResolveInWorkspace()) {
-            try {
-                IJavaProject[] projects = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot())
-                        .getJavaProjects();
-                for (int i = 0; i < projects.length; i++) {
-                    IJavaProject javaProject = projects[i];
-                    ModuleDescriptor md = findModuleDescriptor(javaProject);
-                    if (md != null) {
-                        idToJProject.put(md.getModuleRevisionId().getModuleId(), javaProject);
-                    }
-                }
-            } catch (JavaModelException e) {
-                IvyPlugin.log(IStatus.ERROR, "Error while listing the java projects,"
-                        + " dependencies between java projects won't be used", e);
-            }
-        }
-
         for (Iterator iter = all.iterator(); iter.hasNext();) {
             ArtifactDownloadReport artifact = (ArtifactDownloadReport) iter.next();
 
-            boolean usedProject = false;
-            if (conf.isResolveInWorkspace()) {
-                ModuleId moduleId = artifact.getArtifact().getModuleRevisionId().getModuleId();
-                IJavaProject project = (IJavaProject) idToJProject.get(moduleId);
-                if (project != null && project.exists()) {
-                    IClasspathEntry entry = JavaCore.newProjectEntry(project.getPath());
-                    if (entry != null && !paths.contains(entry)) {
-                        paths.add(entry);
-                    }
-                    usedProject = true;
-                }
+            if (artifact.getType().equals(WorkspaceResolver.ECLIPSE_PROJECT_TYPE)) {
+                // This is a java project in the workspace, add project path
+                paths.add(JavaCore.newProjectEntry(new Path(artifact.getName()), true));
+            } else if (artifact.getLocalFile() != null && accept(artifact.getArtifact())) {
+                Path classpathArtifact = new Path(artifact.getLocalFile().getAbsolutePath());
+                Path sourcesArtifact = getSourcesArtifactPath(artifact, all, dependencies);
+                Path javadocArtifact = getJavadocArtifactPath(artifact, all, dependencies);
+                paths.add(JavaCore.newLibraryEntry(classpathArtifact, getSourceAttachment(
+                    classpathArtifact, sourcesArtifact), getSourceAttachmentRoot(classpathArtifact,
+                    sourcesArtifact), null, getExtraAttribute(classpathArtifact, javadocArtifact),
+                    false));
             }
 
-            if (!usedProject) {
-                if (artifact.getLocalFile() != null && accept(artifact.getArtifact())) {
-                    Path classpathArtifact = new Path(artifact.getLocalFile().getAbsolutePath());
-                    Path sourcesArtifact = getSourcesArtifactPath(artifact, all, dependencies);
-                    Path javadocArtifact = getJavadocArtifactPath(artifact, all, dependencies);
-                    paths.add(JavaCore.newLibraryEntry(classpathArtifact, getSourceAttachment(
-                        classpathArtifact, sourcesArtifact), getSourceAttachmentRoot(
-                        classpathArtifact, sourcesArtifact), null, getExtraAttribute(
-                        classpathArtifact, javadocArtifact), false));
-                }
-            }
-
         }
         classpathEntries = (IClasspathEntry[]) paths.toArray(new IClasspathEntry[paths.size()]);
 
         return classpathEntries;
     }
 
-    /*
-     * Finds and parses the ivy.xml file for the supplied project's classpath container
-     */
-    private ModuleDescriptor findModuleDescriptor(IJavaProject javaProject) {
-        IvyClasspathContainer cp = IvyClasspathUtil.getIvyClasspathContainer(javaProject);
-        if (cp == null) {
-            return null;
-        }
-        try {
-            return cp.getConf().getModuleDescriptor();
-        } catch (IvyDEException e) {
-            e.log(IStatus.WARNING, "IvyDE could not found out if the project "
-                    + javaProject.getElementName() + " should be included in " + conf
-                    + " classpath: ");
-        }
-        return null;
-    }
-
-    private Path getSourcesArtifactPath(ArtifactDownloadReport adr, Collection all, 
-            Map/*<ModuleRevisionId, IvyNode>*/ dependencies) {
+    private Path getSourcesArtifactPath(ArtifactDownloadReport adr, Collection all,
+            Map/* <ModuleRevisionId, IvyNode> */dependencies) {
         Artifact artifact = adr.getArtifact();
         monitor.subTask("searching sources for " + artifact);
         for (Iterator iter = all.iterator(); iter.hasNext();) {
@@ -553,7 +505,7 @@
                 return new Path(otherAdr.getLocalFile().getAbsolutePath());
             }
         }
-        // we haven't found source artifact in resolved artifacts, 
+        // we haven't found source artifact in resolved artifacts,
         // let's look in the module declaring the artifact
         IvyNode node = (IvyNode) dependencies.get(artifact.getId().getModuleRevisionId());
         if (node != null) {
@@ -561,10 +513,10 @@
             for (int i = 0; i < artifacts.length; i++) {
                 Artifact metaArtifact = artifacts[i];
                 if (isSourceArtifactName(artifact.getName(), metaArtifact.getName())
-                    && isSources(metaArtifact)) {
+                        && isSources(metaArtifact)) {
                     // we've found the source artifact, let's provision it
-                    ArtifactDownloadReport metaAdr = ivy.getResolveEngine().download(
-                        metaArtifact, new DownloadOptions());
+                    ArtifactDownloadReport metaAdr = ivy.getResolveEngine().download(metaArtifact,
+                        new DownloadOptions());
                     if (metaAdr.getLocalFile() != null && metaAdr.getLocalFile().exists()) {
                         return new Path(metaAdr.getLocalFile().getAbsolutePath());
                     }
@@ -574,8 +526,8 @@
         return null;
     }
 
-    private Path getJavadocArtifactPath(ArtifactDownloadReport adr, Collection all, 
-            Map/*<ModuleRevisionId, IvyNode>*/ dependencies) {
+    private Path getJavadocArtifactPath(ArtifactDownloadReport adr, Collection all,
+            Map/* <ModuleRevisionId, IvyNode> */dependencies) {
         Artifact artifact = adr.getArtifact();
         monitor.subTask("searching javadoc for " + artifact);
         for (Iterator iter = all.iterator(); iter.hasNext();) {
@@ -588,7 +540,7 @@
                 return new Path(otherAdr.getLocalFile().getAbsolutePath());
             }
         }
-        // we haven't found javadoc artifact in resolved artifacts, 
+        // we haven't found javadoc artifact in resolved artifacts,
         // let's look in the module declaring the artifact
         IvyNode node = (IvyNode) dependencies.get(artifact.getId().getModuleRevisionId());
         if (node != null) {
@@ -596,10 +548,10 @@
             for (int i = 0; i < artifacts.length; i++) {
                 Artifact metaArtifact = artifacts[i];
                 if (isJavadocArtifactName(artifact.getName(), metaArtifact.getName())
-                    && isJavadoc(metaArtifact)) {
+                        && isJavadoc(metaArtifact)) {
                     // we've found the javadoc artifact, let's provision it
-                    ArtifactDownloadReport metaAdr = ivy.getResolveEngine().download(
-                        metaArtifact, new DownloadOptions());
+                    ArtifactDownloadReport metaAdr = ivy.getResolveEngine().download(metaArtifact,
+                        new DownloadOptions());
                     if (metaAdr.getLocalFile() != null && metaAdr.getLocalFile().exists()) {
                         return new Path(metaAdr.getLocalFile().getAbsolutePath());
                     }
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathContainerConfiguration.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathContainerConfiguration.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/cpcontainer/IvyClasspathContainerConfiguration.java	(copie de travail)
@@ -39,9 +39,12 @@
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.settings.IvySettings;
 import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
+import org.apache.ivy.plugins.resolver.ChainResolver;
+import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.util.Message;
 import org.apache.ivyde.eclipse.IvyDEException;
 import org.apache.ivyde.eclipse.IvyPlugin;
+import org.apache.ivyde.eclipse.resolver.WorkspaceResolver;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
@@ -558,7 +561,8 @@
             throw ex;
         }
 
-        if (file.lastModified() != ivySettingsLastModified || !getInheritedLoadSettingsOnDemandPath()) {
+        if (file.lastModified() != ivySettingsLastModified
+                || !getInheritedLoadSettingsOnDemandPath()) {
             IvySettings ivySettings = createIvySettings();
             if (ivySettingsLastModified == -1) {
                 Message.info("\n\n");
@@ -585,7 +589,12 @@
     }
 
     private IvySettings createIvySettings() throws IvyDEException {
-        IvySettings ivySettings = new IvySettings();
+        IvySettings ivySettings;
+        if (isInheritedResolveInWorkspace()) {
+            ivySettings = new WorkspaceIvySettings();
+        } else {
+            ivySettings = new IvySettings();
+        }
         if (javaProject != null) {
             ivySettings.setBaseDir(javaProject.getProject().getLocation().toFile());
         }
@@ -641,6 +650,25 @@
         return ivySettings;
     }
 
+    private class WorkspaceIvySettings extends IvySettings {
+
+        public DependencyResolver getResolver(String resolverName) {
+            DependencyResolver resolver = super.getResolver(resolverName);
+            if (resolver == null) {
+                Message.error("unknown resolver " + resolverName);
+                return null;
+            }
+            ChainResolver chain = new ChainResolver();
+            chain.setName(javaProject.getElementName() + "-ivyde-workspace-chain-resolver");
+            chain.setSettings(this);
+            chain.setReturnFirst(true);
+            chain.add(new WorkspaceResolver(javaProject, this));
+            chain.add(resolver);
+            return chain;
+        }
+
+    }
+
     public String getInheritedIvySettingsPath() {
         if (!isSettingsSpecific) {
             return IvyPlugin.getPreferenceStoreHelper().getIvySettingsPath();
@@ -736,7 +764,7 @@
         return alphaOrder;
     }
 
-    public boolean isResolveInWorkspace() {
+    public boolean isInheritedResolveInWorkspace() {
         if (!isAdvancedProjectSpecific) {
             return IvyPlugin.getPreferenceStoreHelper().isResolveInWorkspace();
         }
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/IvyPlugin.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/IvyPlugin.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/IvyPlugin.java	(copie de travail)
@@ -26,6 +26,7 @@
 import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil;
 import org.apache.ivyde.eclipse.cpcontainer.fragmentinfo.IPackageFragmentExtraInfo;
 import org.apache.ivyde.eclipse.cpcontainer.fragmentinfo.PreferenceStoreInfo;
+import org.apache.ivyde.eclipse.resolver.WorkspaceResourceChangeListener;
 import org.apache.ivyde.eclipse.ui.console.IvyConsole;
 import org.apache.ivyde.eclipse.ui.preferences.IvyDEPreferenceStoreHelper;
 import org.apache.ivyde.eclipse.ui.preferences.PreferenceConstants;
@@ -124,6 +125,11 @@
                 }
             }
         });
+
+        // Listen for project open/close events to auto-update inter-project dependencies
+        ResourcesPlugin.getWorkspace().addResourceChangeListener(
+            new WorkspaceResourceChangeListener());
+
         log(IStatus.INFO, "IvyDE plugin started", null);
     }
 
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ResolveAllAction.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ResolveAllAction.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/actions/ResolveAllAction.java	(copie de travail)
@@ -78,7 +78,7 @@
                     }
                     SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
                     IvyClasspathContainer cp = (IvyClasspathContainer) iter.next();
-                    cp.launchResolve(false, true, subMonitor);
+                    cp.launchResolve(false, isUser(), subMonitor);
                 }
 
                 return Status.OK_STATUS;
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/PreferenceInitializer.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/PreferenceInitializer.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/PreferenceInitializer.java	(copie de travail)
@@ -62,6 +62,10 @@
 
     public static final int DEFAULT_RESOLVE_ON_STARTUP = 1;
 
+    public static final boolean DEFAULT_AUTO_RESOLVE_ON_CLOSE = true;
+
+    public static final boolean DEFAULT_AUTO_RESOLVE_ON_OPEN = false;
+
     public void initializeDefaultPreferences() {
         IPreferenceStore store = IvyPlugin.getDefault().getPreferenceStore();
         store.setDefault(PreferenceConstants.P_BOOLEAN, true);
@@ -105,6 +109,8 @@
             DEFAULT_LOAD_SETTINGS_ON_DEMAND);
         store.setDefault(PreferenceConstants.RESOLVE_ON_STARTUP, DEFAULT_RESOLVE_ON_STARTUP);
 
+        store.setDefault(PreferenceConstants.AUTO_RESOLVE_ON_CLOSE, DEFAULT_AUTO_RESOLVE_ON_CLOSE);
+        store.setDefault(PreferenceConstants.AUTO_RESOLVE_ON_OPEN, DEFAULT_AUTO_RESOLVE_ON_OPEN);
     }
 
 }
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/PreferenceConstants.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/PreferenceConstants.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/PreferenceConstants.java	(copie de travail)
@@ -72,4 +72,8 @@
 
     public static final String RESOLVE_ON_STARTUP = "resolveOnStartup";
 
+    public static final String AUTO_RESOLVE_ON_OPEN = "autoResolve.open";
+
+    public static final String AUTO_RESOLVE_ON_CLOSE = "autoResolve.close";
+
 }
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/IvyDEPreferenceStoreHelper.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/IvyDEPreferenceStoreHelper.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/IvyDEPreferenceStoreHelper.java	(copie de travail)
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.ivyde.eclipse.IvyPlugin;
 import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil;
 import org.eclipse.jface.preference.IPreferenceStore;
 
@@ -195,4 +196,20 @@
         prefStore.setValue(PreferenceConstants.RESOLVE_ON_STARTUP, resolveOnStartup);
     }
 
+    public boolean getAutoResolveOnClose() {
+        return prefStore.getBoolean(PreferenceConstants.AUTO_RESOLVE_ON_CLOSE);
+    }
+
+    public void setAutoResolveOnClose(boolean autoResolveOnOpen) {
+        prefStore.setValue(PreferenceConstants.AUTO_RESOLVE_ON_CLOSE, autoResolveOnOpen);
+    }
+
+    public boolean getAutoResolveOnOpen() {
+        return prefStore.getBoolean(PreferenceConstants.AUTO_RESOLVE_ON_OPEN);
+    }
+
+    public void setAutoResolveOnOpen(boolean autoResolveOnOpen) {
+        prefStore.setValue(PreferenceConstants.AUTO_RESOLVE_ON_OPEN, autoResolveOnOpen);
+    }
+
 }
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/WorkspaceResolverPreferencePage.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/WorkspaceResolverPreferencePage.java	(révision 0)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/WorkspaceResolverPreferencePage.java	(révision 0)
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ivyde.eclipse.ui.preferences;
+
+import org.apache.ivyde.eclipse.IvyPlugin;
+import org.eclipse.jface.preference.BooleanFieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+public class WorkspaceResolverPreferencePage extends FieldEditorPreferencePage implements
+        IWorkbenchPreferencePage {
+
+    public WorkspaceResolverPreferencePage() {
+        super(GRID);
+        setPreferenceStore(IvyPlugin.getDefault().getPreferenceStore());
+        setDescription("");
+    }
+
+    /**
+     * Creates the field editors. Field editors are abstractions of the common GUI blocks needed to
+     * manipulate various types of preferences. Each field editor knows how to save and restore
+     * itself.
+     */
+    public void createFieldEditors() {
+        final Composite fieldParent = getFieldEditorParent();
+
+        BooleanFieldEditor autoResolveOnClose = new BooleanFieldEditor(
+                PreferenceConstants.AUTO_RESOLVE_ON_CLOSE,
+                "On project closing trigger resolve on dependent project", fieldParent) {
+            protected Label getLabelControl() {
+                Label label = super.getLabelControl();
+                label.setToolTipText("Will automatically resolve projects in the "
+                        + "workspace after dependent project is closed");
+                return label;
+            }
+        };
+        addField(autoResolveOnClose);
+
+        BooleanFieldEditor autoResolveOnOpen = new BooleanFieldEditor(
+                PreferenceConstants.AUTO_RESOLVE_ON_OPEN,
+                "On project opening trigger resolve on every other project",
+                fieldParent) {
+            protected Label getLabelControl() {
+                Label label = super.getLabelControl();
+                label.setToolTipText("Will automatically resolve projects in the "
+                        + "workspace and link open project where necessary");
+                return label;
+            }
+        };
+        addField(autoResolveOnOpen);
+
+    }
+
+    public void init(IWorkbench workbench) {
+    }
+
+}
Index: org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/ClasspathPreferencePage.java
===================================================================
--- org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/ClasspathPreferencePage.java	(révision 736034)
+++ org.apache.ivyde.eclipse/src/java/org/apache/ivyde/eclipse/ui/preferences/ClasspathPreferencePage.java	(copie de travail)
@@ -59,7 +59,7 @@
         resolveInWorkspaceCheck = new Button(composite, SWT.CHECK);
         resolveInWorkspaceCheck.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true,
                 false, 3, 1));
-        resolveInWorkspaceCheck.setText("Resolve dependencies in workspace (EXPERIMENTAL)");
+        resolveInWorkspaceCheck.setText("Resolve dependencies in workspace");
         resolveInWorkspaceCheck
                 .setToolTipText("Will replace jars on the classpath with workspace projects");
 
Index: org.apache.ivyde.eclipse/plugin.xml
===================================================================
--- org.apache.ivyde.eclipse/plugin.xml	(révision 736034)
+++ org.apache.ivyde.eclipse/plugin.xml	(copie de travail)
@@ -181,6 +181,12 @@
             id="org.apache.ivyde.eclipse.ui.preferences.SettingsPreferencePage"
             name="Settings">
       </page>
+      <page
+            name="Workspace Resolver"
+            class="org.apache.ivyde.eclipse.ui.preferences.WorkspaceResolverPreferencePage"
+            id="org.apache.ivyde.eclipse.ui.preferences.WorkspaceResolverPreferencePage"
+            category="org.apache.ivyde.eclipse.ui.preferences.IvyPreferencePage">
+      </page>
    </extension>
    <extension
          point="org.eclipse.core.runtime.preferences">
