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.List;
17 import org.eclipse.core.runtime.CoreException;
18 import org.eclipse.core.runtime.IProgressMonitor;
19 import org.eclipse.core.runtime.NullProgressMonitor;
20 import org.eclipse.core.runtime.SubProgressMonitor;
22 import org.eclipse.jface.operation.IRunnableContext;
23 import org.eclipse.jface.operation.IRunnableWithProgress;
24 import org.eclipse.jface.viewers.IStructuredSelection;
26 import org.eclipse.ui.IWorkbenchSite;
27 import org.eclipse.ui.part.ISetSelectionTarget;
29 import org.eclipse.jdt.core.IClasspathEntry;
30 import org.eclipse.jdt.core.IJavaElement;
31 import org.eclipse.jdt.core.IJavaProject;
32 import org.eclipse.jdt.core.IPackageFragmentRoot;
33 import org.eclipse.jdt.core.JavaModelException;
35 import org.eclipse.jdt.internal.corext.buildpath.BuildpathDelta;
36 import org.eclipse.jdt.internal.corext.buildpath.ClasspathModifier;
38 import org.eclipse.jdt.internal.ui.JavaPlugin;
39 import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
40 import org.eclipse.jdt.internal.ui.wizards.buildpaths.CPListElement;
41 import org.eclipse.jdt.internal.ui.wizards.buildpaths.CPListElementAttribute;
43 public class ResetAllOutputFoldersAction extends BuildpathModifierAction {
45 private final IRunnableContext fContext;
46 private final IJavaProject fJavaProject;
49 public ResetAllOutputFoldersAction(IRunnableContext context, IJavaProject project, ISetSelectionTarget selectionTarget) {
50 this(null, selectionTarget, context, project);
53 public ResetAllOutputFoldersAction(IWorkbenchSite site, ISetSelectionTarget selectionTarget, IRunnableContext context, IJavaProject javaProject) {
54 super(site, selectionTarget, BuildpathModifierAction.RESET_ALL_OUTPUT_FOLDERS);
57 fJavaProject= javaProject;
59 setText(NewWizardMessages.NewSourceContainerWorkbookPage_ToolBar_Reset_tooltip);
60 setToolTipText(NewWizardMessages.NewSourceContainerWorkbookPage_ToolBar_Reset_tooltip);
67 public String getDetailedDescription() {
68 return NewWizardMessages.PackageExplorerActionGroup_FormText_Default_ResetAllOutputFolders;
76 final IRunnableWithProgress runnable= new IRunnableWithProgress() {
77 public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
79 resetOutputFolders(fJavaProject, monitor);
80 } catch (CoreException e) {
81 throw new InvocationTargetException(e);
86 fContext.run(false, false, runnable);
87 } catch (InvocationTargetException e) {
88 if (e.getCause() instanceof CoreException) {
89 showExceptionDialog((CoreException)e.getCause(), NewWizardMessages.RemoveFromBuildpathAction_ErrorTitle);
93 } catch (InterruptedException e) {
97 private List<Object> resetOutputFolders(IJavaProject project, IProgressMonitor monitor) throws JavaModelException {
99 monitor= new NullProgressMonitor();
101 IPackageFragmentRoot[] roots= project.getPackageFragmentRoots();
102 monitor.beginTask(NewWizardMessages.ClasspathModifier_Monitor_ResetOutputFolder, roots.length + 10);
103 List<CPListElementAttribute> entries= new ArrayList<CPListElementAttribute>();
104 for (int i= 0; i < roots.length; i++) {
106 IPackageFragmentRoot root= roots[i];
107 if (root.isArchive() || root.isExternal())
109 IClasspathEntry entry= root.getRawClasspathEntry();
110 CPListElement element= CPListElement.createFromExisting(entry, project);
111 CPListElementAttribute outputFolder= new CPListElementAttribute(element, CPListElement.OUTPUT, element.getAttribute(CPListElement.OUTPUT), true);
112 entries.add(outputFolder);
114 return reset(entries, project, new SubProgressMonitor(monitor, 10));
120 private List<Object> reset(List<CPListElementAttribute> selection, IJavaProject project, IProgressMonitor monitor) throws JavaModelException {
122 monitor= new NullProgressMonitor();
124 monitor.beginTask(NewWizardMessages.ClasspathModifier_Monitor_Resetting, selection.size());
125 List<CPListElement> entries= ClasspathModifier.getExistingEntries(project);
126 List<Object> result= new ArrayList<Object>();
127 for (int i= 0; i < selection.size(); i++) {
128 Object element= selection.get(i);
129 if (element instanceof IJavaElement) {
130 IJavaElement javaElement= (IJavaElement) element;
131 IPackageFragmentRoot root;
132 if (element instanceof IJavaProject)
133 root= project.getPackageFragmentRoot(project.getResource());
135 root= (IPackageFragmentRoot) element;
136 CPListElement entry= ClasspathModifier.getClasspathEntry(entries, root);
137 ClasspathModifier.resetFilters(javaElement, entry, project, new SubProgressMonitor(monitor, 1));
138 result.add(javaElement);
140 CPListElement selElement= ((CPListElementAttribute) element).getParent();
141 CPListElement entry= ClasspathModifier.getClasspathEntry(entries, selElement);
142 CPListElementAttribute outputFolder= ClasspathModifier.resetOutputFolder(entry, project);
143 result.add(outputFolder);
147 ClasspathModifier.commitClassPath(entries, project, null);
149 BuildpathDelta delta= new BuildpathDelta(getToolTipText());
150 delta.setNewEntries(entries.toArray(new CPListElement[entries.size()]));
151 informListeners(delta);
160 protected boolean canHandle(IStructuredSelection elements) {