package com.android.ide.eclipse.adt.wizards.newproject;
+import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.sdk.Sdk;
+import com.android.ide.eclipse.adt.sdk.Sdk.ITargetChangeListener;
import com.android.ide.eclipse.common.AndroidConstants;
import com.android.ide.eclipse.common.project.AndroidManifestParser;
import com.android.sdklib.IAndroidTarget;
private Button mCreateActivityCheck;
private Text mMinSdkVersionField;
private SdkTargetSelector mSdkTargetSelector;
+ private ITargetChangeListener mSdkTargetChangeListener;
private boolean mInternalLocationPathUpdate;
protected boolean mInternalProjectNameUpdate;
// Validate. This will complain about the first empty field.
setPageComplete(validatePage());
}
+
+ @Override
+ public void dispose() {
+
+ if (mSdkTargetChangeListener != null) {
+ AdtPlugin.getDefault().removeTargetListener(mSdkTargetChangeListener);
+ mSdkTargetChangeListener = null;
+ }
+
+ super.dispose();
+ }
/**
* Creates the group for the project name:
group.setFont(parent.getFont());
group.setText("Target");
- // get the targets from the sdk
- IAndroidTarget[] targets = null;
- if (Sdk.getCurrent() != null) {
- targets = Sdk.getCurrent().getTargets();
- }
+ // The selector is created without targets. They are added below in the change listener.
+ mSdkTargetSelector = new SdkTargetSelector(group, null, false /*multi-selection*/);
- mSdkTargetSelector = new SdkTargetSelector(group, targets, false /*multi-selection*/);
+ mSdkTargetChangeListener = new ITargetChangeListener() {
+ public void onProjectTargetChange(IProject changedProject) {
+ // Ignore
+ }
- // If there's only one target, select it
- if (targets != null && targets.length == 1) {
- mSdkTargetSelector.setSelection(targets[0]);
- }
+ public void onTargetsLoaded() {
+ // Update the sdk target selector with the new targets
+
+ // get the targets from the sdk
+ IAndroidTarget[] targets = null;
+ if (Sdk.getCurrent() != null) {
+ targets = Sdk.getCurrent().getTargets();
+ }
+ mSdkTargetSelector.setTargets(targets);
+
+ // If there's only one target, select it
+ if (targets != null && targets.length == 1) {
+ mSdkTargetSelector.setSelection(targets[0]);
+ }
+ }
+ };
+
+ AdtPlugin.getDefault().addTargetListener(mSdkTargetChangeListener);
+
+ // Invoke it once to initialize the targets
+ mSdkTargetChangeListener.onTargetsLoaded();
mSdkTargetSelector.setSelectionListener(new SelectionAdapter() {
@Override
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.sdk.AndroidTargetData;
import com.android.ide.eclipse.adt.sdk.Sdk;
+import com.android.ide.eclipse.adt.sdk.Sdk.ITargetChangeListener;
import com.android.ide.eclipse.common.AndroidConstants;
import com.android.ide.eclipse.common.project.ProjectChooserHelper;
import com.android.ide.eclipse.editors.descriptors.DocumentDescriptor;
"An XML file that describes preferences.", // tooltip
ResourceFolderType.XML, // folder type
AndroidTargetData.DESCRIPTOR_PREFERENCES, // root seed
- AndroidConstants.CLASS_PREFERENCE_SCREEN, // default root
+ AndroidConstants.CLASS_NAME_PREFERENCE_SCREEN, // default root
SdkConstants.NS_RESOURCES, // xmlns
null, // default attributes
1 // target API level
private boolean mInternalTypeUpdate;
private boolean mInternalConfigSelectorUpdate;
private ProjectChooserHelper mProjectChooserHelper;
+ private ITargetChangeListener mSdkTargetChangeListener;
+ private TypeInfo mCurrentTypeInfo;
// --- UI creation ---
initializeFromSelection(mInitialSelection);
initializeRootValues();
enableTypesBasedOnApi();
+ if (mCurrentTypeInfo != null) {
+ updateRootCombo(mCurrentTypeInfo);
+ }
+ installTargetChangeListener();
validatePage();
}
+
+ private void installTargetChangeListener() {
+ mSdkTargetChangeListener = new ITargetChangeListener() {
+ public void onProjectTargetChange(IProject changedProject) {
+ // If this is the current project, force it to reload its data
+ if (changedProject != null && changedProject == mProject) {
+ changeProject(mProject);
+ }
+ }
+
+ public void onTargetsLoaded() {
+ // Reload the current project, if any, in case its target has changed.
+ if (mProject != null) {
+ changeProject(mProject);
+ }
+ }
+ };
+
+ AdtPlugin.getDefault().addTargetListener(mSdkTargetChangeListener);
+ }
+
+ @Override
+ public void dispose() {
+
+ if (mSdkTargetChangeListener != null) {
+ AdtPlugin.getDefault().removeTargetListener(mSdkTargetChangeListener);
+ mSdkTargetChangeListener = null;
+ }
+
+ super.dispose();
+ }
/**
* Returns the target project or null.
return;
}
-
// Find the best match in the element list. In case there are multiple selected elements
// select the one that provides the most information and assign them a score,
// e.g. project=1 + folder=2 + file=4.
/**
* Changes mProject to the given new project and update the UI accordingly.
+ * <p/>
+ * Note that this does not check if the new project is the same as the current one
+ * on purpose, which allows a project to be updated when its target has changed or
+ * when targets are loaded in the background.
*/
private void changeProject(IProject newProject) {
mProject = newProject;
private void selectType(TypeInfo type) {
if (type == null || !type.getWidget().getSelection()) {
mInternalTypeUpdate = true;
+ mCurrentTypeInfo = type;
for (TypeInfo type2 : sTypes) {
type2.getWidget().setSelection(type2 == type);
}