From d4ee68f40160848231f785153e45c5f881bf5440 Mon Sep 17 00:00:00 2001 From: Raphael Moll <> Date: Thu, 9 Apr 2009 13:09:46 -0700 Subject: [PATCH] AI 145402: am: CL 145004 ADT #1761064: Properly refresh manifest activity list on framework reload. Issue: when the SDK gets (re)loaded, the uiRootNode changes in the UiTreeBlock. However the TreeViewer is using a content provider which root node was not updated. The fix is to make the content provider dynamically ask for the root node to the tree block. Instead of depending on the class directly, a new interface is passed for this. Original author: raphael Merged from: //branches/cupcake/... Automated import of CL 145402 --- .../editors/manifest/ManifestEditor.java | 7 +++-- .../ui/tree/NewItemSelectionDialog.java | 2 +- .../ui/tree/UiModelTreeContentProvider.java | 14 +++++----- .../editors/ui/tree/UiRootNodeProvider.java | 27 +++++++++++++++++++ .../eclipse/editors/ui/tree/UiTreeBlock.java | 17 +++++++++--- 5 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiRootNodeProvider.java diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/manifest/ManifestEditor.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/manifest/ManifestEditor.java index d0f8d7b85..dc32383d9 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/manifest/ManifestEditor.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/manifest/ManifestEditor.java @@ -159,9 +159,9 @@ public final class ManifestEditor extends AndroidEditor { protected void xmlModelChanged(Document xml_doc) { // create the ui root node on demand. initUiRootNode(false /*force*/); - + loadFromXml(xml_doc); - + super.xmlModelChanged(xml_doc); } @@ -184,7 +184,7 @@ public final class ManifestEditor extends AndroidEditor { } } } - + private void onDescriptorsChanged(UiElementNode oldManifestNode) { mUiManifestNode.reloadFromXmlNode(oldManifestNode.getXmlNode()); @@ -321,7 +321,6 @@ public final class ManifestEditor extends AndroidEditor { if (mUiManifestNode != null && force == false) { return; } - AndroidManifestDescriptors manifestDescriptor = getManifestDescriptors(); diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/NewItemSelectionDialog.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/NewItemSelectionDialog.java index 07298810f..72fe06034 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/NewItemSelectionDialog.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/NewItemSelectionDialog.java @@ -38,7 +38,7 @@ import java.util.Arrays; /** * A selection dialog to select the type of the new element node to - * created, either in the application node or the selected sub node. + * create, either in the application node or the selected sub node. */ public class NewItemSelectionDialog extends AbstractElementListSelectionDialog { diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiModelTreeContentProvider.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiModelTreeContentProvider.java index 9f34d9e72..30919926b 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiModelTreeContentProvider.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiModelTreeContentProvider.java @@ -30,16 +30,15 @@ import java.util.ArrayList; */ class UiModelTreeContentProvider implements ITreeContentProvider { - /** The root {@link UiElementNode} which contains all the elements that are to be - * manipulated by this tree view. In general this is the manifest UI node. */ - private UiElementNode mUiRootNode; /** The descriptor of the elements to be displayed as root in this tree view. All elements * of the same type in the root will be displayed. */ private ElementDescriptor[] mDescriptorFilters; + /** Object which provides the uiRootNode */ + private final UiRootNodeProvider mUiRootNodeProvider; - public UiModelTreeContentProvider(UiElementNode uiRootNode, + public UiModelTreeContentProvider(UiRootNodeProvider rootNodeProvider, ElementDescriptor[] descriptorFilters) { - mUiRootNode = uiRootNode; + mUiRootNodeProvider = rootNodeProvider; mDescriptorFilters = descriptorFilters; } @@ -87,8 +86,9 @@ class UiModelTreeContentProvider implements ITreeContentProvider { */ public Object[] getElements(Object inputElement) { ArrayList roots = new ArrayList(); - if (mUiRootNode != null) { - for (UiElementNode ui_node : mUiRootNode.getUiChildren()) { + UiElementNode uiRootNode = mUiRootNodeProvider.getRootNode(); + if (uiRootNode != null) { + for (UiElementNode ui_node : uiRootNode.getUiChildren()) { if (mDescriptorFilters == null || mDescriptorFilters.length == 0) { roots.add(ui_node); } else { diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiRootNodeProvider.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiRootNodeProvider.java new file mode 100644 index 000000000..5121e3546 --- /dev/null +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiRootNodeProvider.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.editors.ui.tree; + +import com.android.ide.eclipse.editors.uimodel.UiElementNode; + +/** + * An object that can provide a uiRootNode. + */ +public interface UiRootNodeProvider { + /** Returns the UiDocumentNode for the current model. */ + public abstract UiElementNode getRootNode(); +} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiTreeBlock.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiTreeBlock.java index fc384e8c0..8038a47de 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiTreeBlock.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/ui/tree/UiTreeBlock.java @@ -83,7 +83,8 @@ import java.util.LinkedList; * On the left is a details part that displays all the visible UI attributes for a given * selected UI element node. */ -public final class UiTreeBlock extends MasterDetailsBlock implements ICommitXml { +public final class UiTreeBlock extends MasterDetailsBlock + implements ICommitXml, UiRootNodeProvider { /** Height hint for the tree view. Helps the grid layout resize properly on smaller screens. */ private static final int TREE_HEIGHT_HINT = 50; @@ -181,6 +182,17 @@ public final class UiTreeBlock extends MasterDetailsBlock implements ICommitXml return mMasterPart; } + /** + * Returns the {@link UiElementNode} for the current model. + *

+ * This is used by the content provider attached to {@link #mTreeViewer} since + * the uiRootNode changes after each call to + * {@link #changeRootAndDescriptors(UiElementNode, ElementDescriptor[], boolean)}. + */ + public UiElementNode getRootNode() { + return mUiRootNode; + } + @Override protected void createMasterPart(final IManagedForm managedForm, Composite parent) { FormToolkit toolkit = managedForm.getToolkit(); @@ -239,8 +251,7 @@ public final class UiTreeBlock extends MasterDetailsBlock implements ICommitXml tree.setLayoutData(gd); mTreeViewer = new TreeViewer(tree); - mTreeViewer.setContentProvider(new UiModelTreeContentProvider( - mUiRootNode, mDescriptorFilters)); + mTreeViewer.setContentProvider(new UiModelTreeContentProvider(this, mDescriptorFilters)); mTreeViewer.setLabelProvider(new UiModelTreeLabelProvider()); mTreeViewer.setInput("unused"); //$NON-NLS-1$