1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.wizards.buildpaths.newsourcepage;
13 import java.lang.reflect.InvocationTargetException;
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.Iterator;
17 import java.util.List;
19 import org.eclipse.swt.widgets.Shell;
21 import org.eclipse.core.runtime.CoreException;
22 import org.eclipse.core.runtime.IProgressMonitor;
23 import org.eclipse.core.runtime.SubProgressMonitor;
25 import org.eclipse.core.resources.IFolder;
26 import org.eclipse.core.resources.IResource;
28 import org.eclipse.jface.operation.IRunnableContext;
29 import org.eclipse.jface.operation.IRunnableWithProgress;
30 import org.eclipse.jface.viewers.IStructuredSelection;
31 import org.eclipse.jface.viewers.StructuredSelection;
32 import org.eclipse.jface.window.Window;
34 import org.eclipse.ui.IWorkbenchSite;
35 import org.eclipse.ui.PlatformUI;
36 import org.eclipse.ui.part.ISetSelectionTarget;
38 import org.eclipse.jdt.core.IClasspathEntry;
39 import org.eclipse.jdt.core.IJavaElement;
40 import org.eclipse.jdt.core.IJavaProject;
41 import org.eclipse.jdt.core.IPackageFragmentRoot;
42 import org.eclipse.jdt.core.JavaModelException;
44 import org.eclipse.jdt.internal.corext.buildpath.BuildpathDelta;
45 import org.eclipse.jdt.internal.corext.buildpath.CPJavaProject;
46 import org.eclipse.jdt.internal.corext.buildpath.ClasspathModifier;
47 import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
48 import org.eclipse.jdt.internal.corext.util.Messages;
50 import org.eclipse.jdt.ui.JavaElementLabels;
52 import org.eclipse.jdt.internal.ui.JavaPlugin;
53 import org.eclipse.jdt.internal.ui.JavaPluginImages;
54 import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
55 import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
56 import org.eclipse.jdt.internal.ui.wizards.buildpaths.CPListElement;
57 import org.eclipse.jdt.internal.ui.wizards.buildpaths.newsourcepage.ClasspathModifierQueries.IRemoveLinkedFolderQuery;
59 //SelectedElements iff enabled: IPackageFramgentRoot || IJavaProject || ClassPathContainer
60 public class RemoveFromBuildpathAction extends BuildpathModifierAction {
62 private final IRunnableContext fContext;
64 public RemoveFromBuildpathAction(IWorkbenchSite site) {
65 this(site, null, PlatformUI.getWorkbench().getProgressService());
67 setImageDescriptor(JavaPluginImages.DESC_ELCL_REMOVE_FROM_BP);
70 public RemoveFromBuildpathAction(IRunnableContext context, ISetSelectionTarget selectionTarget) {
71 this(null, selectionTarget, context);
73 setImageDescriptor(JavaPluginImages.DESC_ELCL_REMOVE_AS_SOURCE_FOLDER);
74 setDisabledImageDescriptor(JavaPluginImages.DESC_DLCL_REMOVE_AS_SOURCE_FOLDER);
77 public RemoveFromBuildpathAction(IWorkbenchSite site, ISetSelectionTarget selectionTarget, IRunnableContext context) {
78 super(site, selectionTarget, BuildpathModifierAction.REMOVE_FROM_BP);
82 setText(NewWizardMessages.NewSourceContainerWorkbookPage_ToolBar_RemoveFromCP_label);
83 setToolTipText(NewWizardMessages.NewSourceContainerWorkbookPage_ToolBar_RemoveFromCP_tooltip);
90 public String getDetailedDescription() {
94 if (getSelectedElements().size() != 1)
95 return NewWizardMessages.PackageExplorerActionGroup_FormText_Default_FromBuildpath;
97 Object elem= getSelectedElements().get(0);
99 if (elem instanceof IJavaProject) {
100 String name= ClasspathModifier.escapeSpecialChars(JavaElementLabels.getElementLabel(((IJavaElement)elem), JavaElementLabels.ALL_DEFAULT));
101 return Messages.format(NewWizardMessages.PackageExplorerActionGroup_FormText_ProjectFromBuildpath, name);
102 } else if (elem instanceof IPackageFragmentRoot) {
103 String name= ClasspathModifier.escapeSpecialChars(JavaElementLabels.getElementLabel(((IJavaElement)elem), JavaElementLabels.ALL_DEFAULT));
104 return Messages.format(NewWizardMessages.PackageExplorerActionGroup_FormText_fromBuildpath, name);
105 } else if (elem instanceof ClassPathContainer) {
106 return NewWizardMessages.PackageExplorerActionGroup_FormText_Default_FromBuildpath;
119 final IJavaProject project;
120 Object object= getSelectedElements().get(0);
121 if (object instanceof IJavaProject) {
122 project= (IJavaProject)object;
123 } else if (object instanceof IPackageFragmentRoot) {
124 IPackageFragmentRoot root= (IPackageFragmentRoot)object;
125 project= root.getJavaProject();
127 ClassPathContainer container= (ClassPathContainer)object;
128 project= container.getJavaProject();
131 final List<Object> elementsToRemove= new ArrayList<Object>();
132 final List<IFolder> foldersToDelete= new ArrayList<IFolder>();
133 queryToRemoveLinkedFolders(elementsToRemove, foldersToDelete);
135 final IRunnableWithProgress runnable= new IRunnableWithProgress() {
136 public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
138 monitor.beginTask(NewWizardMessages.ClasspathModifier_Monitor_RemoveFromBuildpath, foldersToDelete.size() + 10);
140 CPJavaProject cpProject= CPJavaProject.createFromExisting(project);
141 CPListElement[] toRemove= new CPListElement[elementsToRemove.size()];
143 for (Iterator<Object> iterator= elementsToRemove.iterator(); iterator.hasNext();) {
144 Object element= iterator.next();
145 if (element instanceof IJavaProject) {
146 toRemove[i]= ClasspathModifier.getListElement(((IJavaProject)element).getPath(), cpProject.getCPListElements());
147 } else if (element instanceof IPackageFragmentRoot) {
148 toRemove[i]= CPListElement.createFromExisting(((IPackageFragmentRoot)element).getRawClasspathEntry(), project);
150 toRemove[i]= CPListElement.createFromExisting(((ClassPathContainer)element).getClasspathEntry(), project);
155 BuildpathDelta delta= ClasspathModifier.removeFromBuildpath(toRemove, cpProject);
156 ClasspathModifier.commitClassPath(cpProject, new SubProgressMonitor(monitor, 10));
158 deleteFolders(foldersToDelete, new SubProgressMonitor(monitor, foldersToDelete.size()));
160 informListeners(delta);
162 if (delta.getDeletedResources().length == foldersToDelete.size()) {
163 selectAndReveal(new StructuredSelection(project));
165 List<IResource> result= new ArrayList<IResource>(Arrays.asList(delta.getDeletedResources()));
166 result.removeAll(foldersToDelete);
167 selectAndReveal(new StructuredSelection(result));
169 } catch (CoreException e) {
170 throw new InvocationTargetException(e);
176 fContext.run(false, false, runnable);
178 } catch (CoreException e) {
179 showExceptionDialog(e, NewWizardMessages.RemoveFromBuildpathAction_ErrorTitle);
180 } catch (InvocationTargetException e) {
181 if (e.getCause() instanceof CoreException) {
182 showExceptionDialog((CoreException)e.getCause(), NewWizardMessages.RemoveFromBuildpathAction_ErrorTitle);
186 } catch (InterruptedException e) {
190 private void deleteFolders(List<IFolder> folders, IProgressMonitor monitor) throws CoreException {
192 monitor.beginTask(NewWizardMessages.ClasspathModifier_Monitor_RemoveFromBuildpath, folders.size());
194 for (Iterator<IFolder> iter= folders.iterator(); iter.hasNext();) {
195 IFolder folder= iter.next();
196 folder.delete(true, true, new SubProgressMonitor(monitor, 1));
203 private void queryToRemoveLinkedFolders(final List<Object> elementsToRemove, final List<IFolder> foldersToDelete) throws JavaModelException {
204 final Shell shell= getShell();
205 for (Iterator<?> iter= getSelectedElements().iterator(); iter.hasNext();) {
206 Object element= iter.next();
207 if (element instanceof IPackageFragmentRoot) {
208 IFolder folder= getLinkedSourceFolder((IPackageFragmentRoot)element);
209 if (folder != null) {
210 RemoveLinkedFolderDialog dialog= new RemoveLinkedFolderDialog(shell, folder);
212 final int result= dialog.open() == Window.OK?dialog.getRemoveStatus():IRemoveLinkedFolderQuery.REMOVE_CANCEL;
214 if (result != IRemoveLinkedFolderQuery.REMOVE_CANCEL) {
215 if (result == IRemoveLinkedFolderQuery.REMOVE_BUILD_PATH) {
216 elementsToRemove.add(element);
217 } else if (result == IRemoveLinkedFolderQuery.REMOVE_BUILD_PATH_AND_FOLDER) {
218 elementsToRemove.add(element);
219 foldersToDelete.add(folder);
223 elementsToRemove.add(element);
226 elementsToRemove.add(element);
231 private IFolder getLinkedSourceFolder(IPackageFragmentRoot root) throws JavaModelException {
232 if (root.getKind() != IPackageFragmentRoot.K_SOURCE)
235 final IResource resource= root.getCorrespondingResource();
236 if (!(resource instanceof IFolder))
239 final IFolder folder= (IFolder) resource;
240 if (!folder.isLinked())
247 protected boolean canHandle(IStructuredSelection elements) {
248 if (elements.size() == 0)
252 for (Iterator<?> iter= elements.iterator(); iter.hasNext();) {
253 Object element= iter.next();
255 if (element instanceof IJavaProject) {
256 IJavaProject project= (IJavaProject)element;
257 if (!ClasspathModifier.isSourceFolder(project))
260 } else if (element instanceof IPackageFragmentRoot) {
261 IClasspathEntry entry= JavaModelUtil.getClasspathEntry((IPackageFragmentRoot) element);
262 if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER)
264 if (entry.getReferencingEntry() != null)
266 } else if (element instanceof ClassPathContainer) {
273 } catch (JavaModelException e) {