1 /*
2  * Copyright (C) 2008 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.properties;
18 
19 import com.android.SdkConstants;
20 import com.android.ide.eclipse.adt.AdtPlugin;
21 import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
22 import com.android.ide.eclipse.adt.internal.sdk.Sdk;
23 import com.android.sdklib.IAndroidTarget;
24 import com.android.sdklib.internal.project.ProjectProperties;
25 import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
26 import com.android.sdkuilib.internal.widgets.SdkTargetSelector;
27 
28 import org.eclipse.core.resources.IProject;
29 import org.eclipse.core.resources.IResource;
30 import org.eclipse.core.runtime.NullProgressMonitor;
31 import org.eclipse.swt.SWT;
32 import org.eclipse.swt.events.SelectionAdapter;
33 import org.eclipse.swt.events.SelectionEvent;
34 import org.eclipse.swt.layout.GridData;
35 import org.eclipse.swt.layout.GridLayout;
36 import org.eclipse.swt.widgets.Button;
37 import org.eclipse.swt.widgets.Composite;
38 import org.eclipse.swt.widgets.Control;
39 import org.eclipse.swt.widgets.Group;
40 import org.eclipse.ui.dialogs.PropertyPage;
41 
42 /**
43  * Property page for "Android" project.
44  * This is accessible from the Package Explorer when right clicking a project and choosing
45  * "Properties".
46  *
47  */
48 public class AndroidPropertyPage extends PropertyPage {
49 
50     private IProject mProject;
51     private SdkTargetSelector mSelector;
52     private Button mIsLibrary;
53     // APK-SPLIT: This is not yet supported, so we hide the UI
54 //    private Button mSplitByDensity;
55     private LibraryProperties mLibraryDependencies;
56     private ProjectPropertiesWorkingCopy mPropertiesWorkingCopy;
57 
AndroidPropertyPage()58     public AndroidPropertyPage() {
59         // pass
60     }
61 
62     @Override
createContents(Composite parent)63     protected Control createContents(Composite parent) {
64         // get the element (this is not yet valid in the constructor).
65         mProject = (IProject)getElement();
66 
67         // get the targets from the sdk
68         IAndroidTarget[] targets = null;
69         if (Sdk.getCurrent() != null) {
70             targets = Sdk.getCurrent().getTargets();
71         }
72 
73         // build the UI.
74         Composite top = new Composite(parent, SWT.NONE);
75         top.setLayoutData(new GridData(GridData.FILL_BOTH));
76         top.setLayout(new GridLayout(1, false));
77 
78         Group targetGroup = new Group(top, SWT.NONE);
79         targetGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
80         targetGroup.setLayout(new GridLayout(1, false));
81         targetGroup.setText("Project Build Target");
82 
83         mSelector = new SdkTargetSelector(targetGroup, targets);
84 
85         Group libraryGroup = new Group(top, SWT.NONE);
86         libraryGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
87         libraryGroup.setLayout(new GridLayout(1, false));
88         libraryGroup.setText("Library");
89 
90         mIsLibrary = new Button(libraryGroup, SWT.CHECK);
91         mIsLibrary.setText("Is Library");
92 
93         mLibraryDependencies = new LibraryProperties(libraryGroup);
94 
95         // fill the ui
96         fillUi();
97 
98         // add callbacks
99         mSelector.setSelectionListener(new SelectionAdapter() {
100             @Override
101             public void widgetSelected(SelectionEvent e) {
102                 updateValidity();
103             }
104         });
105 
106         if (mProject.isOpen() == false) {
107             // disable the ui.
108         }
109 
110         return top;
111     }
112 
113     @Override
performOk()114     public boolean performOk() {
115         Sdk currentSdk = Sdk.getCurrent();
116         if (currentSdk != null && mProject.isOpen()) {
117             ProjectState state = Sdk.getProjectState(mProject);
118 
119             // simply update the properties copy. Eclipse will be notified of the file change
120             // and will reload it smartly (detecting differences) and updating the ProjectState.
121             // See Sdk.mFileListener
122             boolean mustSaveProp = false;
123 
124             IAndroidTarget newTarget = mSelector.getSelected();
125             if (state == null || newTarget != state.getTarget()) {
126                 mPropertiesWorkingCopy.setProperty(ProjectProperties.PROPERTY_TARGET,
127                         newTarget.hashString());
128                 mustSaveProp = true;
129             }
130 
131             if (state == null || mIsLibrary.getSelection() != state.isLibrary()) {
132                 mPropertiesWorkingCopy.setProperty(ProjectProperties.PROPERTY_LIBRARY,
133                         Boolean.toString(mIsLibrary.getSelection()));
134                 mustSaveProp = true;
135             }
136 
137             if (mLibraryDependencies.save()) {
138                 mustSaveProp = true;
139             }
140 
141             if (mustSaveProp) {
142                 try {
143                     mPropertiesWorkingCopy.save();
144 
145                     IResource projectProp = mProject.findMember(SdkConstants.FN_PROJECT_PROPERTIES);
146                     if (projectProp != null) {
147                         projectProp.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
148                     }
149                 } catch (Exception e) {
150                     String msg = String.format(
151                             "Failed to save %1$s for project %2$s",
152                             SdkConstants.FN_PROJECT_PROPERTIES, mProject.getName());
153                     AdtPlugin.log(e, msg);
154                 }
155             }
156         }
157 
158         return true;
159     }
160 
161     @Override
performDefaults()162     protected void performDefaults() {
163         fillUi();
164         updateValidity();
165     }
166 
fillUi()167     private void fillUi() {
168         if (Sdk.getCurrent() != null && mProject.isOpen()) {
169             ProjectState state = Sdk.getProjectState(mProject);
170 
171             // make a working copy of the properties
172             mPropertiesWorkingCopy = state.getProperties().makeWorkingCopy();
173 
174             // get the target
175             IAndroidTarget target = state.getTarget();
176             if (target != null) {
177                 mSelector.setSelection(target);
178             }
179 
180             mIsLibrary.setSelection(state.isLibrary());
181             mLibraryDependencies.setContent(state, mPropertiesWorkingCopy);
182         }
183 
184     }
185 
updateValidity()186     private void updateValidity() {
187         // look for the selection and validate the page if there is a selection
188         IAndroidTarget target = mSelector.getSelected();
189         setValid(target != null);
190     }
191 }
192