1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.eclipse.org/org/documents/epl-v10.php
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.ide.eclipse.adt.internal.actions;
18 
19 import com.android.annotations.NonNull;
20 import com.android.ide.eclipse.adt.internal.project.AndroidNature;
21 import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
22 
23 import org.eclipse.core.resources.IProject;
24 import org.eclipse.core.runtime.CoreException;
25 import org.eclipse.core.runtime.IAdaptable;
26 import org.eclipse.core.runtime.IProgressMonitor;
27 import org.eclipse.core.runtime.IStatus;
28 import org.eclipse.core.runtime.Status;
29 import org.eclipse.core.runtime.jobs.Job;
30 import org.eclipse.jdt.core.JavaModelException;
31 import org.eclipse.jface.action.IAction;
32 import org.eclipse.jface.viewers.ISelection;
33 import org.eclipse.jface.viewers.IStructuredSelection;
34 import org.eclipse.ui.IObjectActionDelegate;
35 import org.eclipse.ui.IWorkbenchPart;
36 import org.eclipse.ui.IWorkbenchWindow;
37 import org.eclipse.ui.IWorkbenchWindowActionDelegate;
38 
39 import java.util.Iterator;
40 
41 /**
42  * Action to fix the project properties:
43  * <ul>
44  * <li>Make sure the framework archive is present with the link to the java
45  * doc</li>
46  * </ul>
47  */
48 public class FixProjectAction implements IObjectActionDelegate {
49 
50     private ISelection mSelection;
51 
52     /**
53      * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
54      */
55     @Override
setActivePart(IAction action, IWorkbenchPart targetPart)56     public void setActivePart(IAction action, IWorkbenchPart targetPart) {
57     }
58 
59     @Override
run(IAction action)60     public void run(IAction action) {
61         if (mSelection instanceof IStructuredSelection) {
62 
63             for (Iterator<?> it = ((IStructuredSelection) mSelection).iterator();
64                     it.hasNext();) {
65                 Object element = it.next();
66                 IProject project = null;
67                 if (element instanceof IProject) {
68                     project = (IProject) element;
69                 } else if (element instanceof IAdaptable) {
70                     project = (IProject) ((IAdaptable) element)
71                             .getAdapter(IProject.class);
72                 }
73                 if (project != null) {
74                     fixProject(project);
75                 }
76             }
77         }
78     }
79 
80     @Override
selectionChanged(IAction action, ISelection selection)81     public void selectionChanged(IAction action, ISelection selection) {
82         mSelection = selection;
83     }
84 
fixProject(final IProject project)85     private void fixProject(final IProject project) {
86         createFixProjectJob(project).schedule();
87     }
88 
89     /**
90      * Creates a job to fix the project
91      *
92      * @param project the project to fix
93      * @return a job to perform the fix (not yet scheduled)
94      */
95     @NonNull
createFixProjectJob(@onNull final IProject project)96     public static Job createFixProjectJob(@NonNull final IProject project) {
97         return new Job("Fix Project Properties") {
98 
99             @Override
100             protected IStatus run(IProgressMonitor monitor) {
101                 try {
102                     if (monitor != null) {
103                         monitor.beginTask("Fix Project Properties", 6);
104                     }
105 
106                     ProjectHelper.fixProject(project);
107                     if (monitor != null) {
108                         monitor.worked(1);
109                     }
110 
111                     // fix the nature order to have the proper project icon
112                     ProjectHelper.fixProjectNatureOrder(project);
113                     if (monitor != null) {
114                         monitor.worked(1);
115                     }
116 
117                     // now we fix the builders
118                     AndroidNature.configureResourceManagerBuilder(project);
119                     if (monitor != null) {
120                         monitor.worked(1);
121                     }
122 
123                     AndroidNature.configurePreBuilder(project);
124                     if (monitor != null) {
125                         monitor.worked(1);
126                     }
127 
128                     AndroidNature.configureApkBuilder(project);
129                     if (monitor != null) {
130                         monitor.worked(1);
131                     }
132 
133                     return Status.OK_STATUS;
134                 } catch (JavaModelException e) {
135                     return e.getJavaModelStatus();
136                 } catch (CoreException e) {
137                     return e.getStatus();
138                 } finally {
139                     if (monitor != null) {
140                         monitor.done();
141                     }
142                 }
143             }
144         };
145     }
146 
147     /**
148      * @see IWorkbenchWindowActionDelegate#init
149      */
150     public void init(IWorkbenchWindow window) {
151         // pass
152     }
153 
154 }
155