Home | History | Annotate | Download | only in properties
      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 
     58     public AndroidPropertyPage() {
     59         // pass
     60     }
     61 
     62     @Override
     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
    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
    162     protected void performDefaults() {
    163         fillUi();
    164         updateValidity();
    165     }
    166 
    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 
    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