aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java160
1 files changed, 160 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java
new file mode 100644
index 000000000..1a85ea682
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2008 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.adt.internal.editors.uimodel;
+
+import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
+import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener.UiUpdateState;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents an XML document node that can be modified by the user interface in the XML editor.
+ * <p/>
+ * The structure of a given {@link UiDocumentNode} is declared by a corresponding
+ * {@link DocumentDescriptor}.
+ */
+public class UiDocumentNode extends UiElementNode {
+
+ /**
+ * Creates a new {@link UiDocumentNode} described by a given {@link DocumentDescriptor}.
+ *
+ * @param documentDescriptor The {@link DocumentDescriptor} for the XML node. Cannot be null.
+ */
+ public UiDocumentNode(DocumentDescriptor documentDescriptor) {
+ super(documentDescriptor);
+ }
+
+ /**
+ * Computes a short string describing the UI node suitable for tree views.
+ * Uses the element's attribute "android:name" if present, or the "android:label" one
+ * followed by the element's name.
+ *
+ * @return A short string describing the UI node suitable for tree views.
+ */
+ @Override
+ public String getShortDescription() {
+ return "Document"; //$NON-NLS-1$
+ }
+
+ /**
+ * Computes a "breadcrumb trail" description for this node.
+ *
+ * @param include_root Whether to include the root (e.g. "Manifest") or not. Has no effect
+ * when called on the root node itself.
+ * @return The "breadcrumb trail" description for this node.
+ */
+ @Override
+ public String getBreadcrumbTrailDescription(boolean include_root) {
+ return "Document"; //$NON-NLS-1$
+ }
+
+ /**
+ * This method throws an exception when attempted to assign a parent, since XML documents
+ * cannot have a parent. It is OK to assign null.
+ */
+ @Override
+ protected void setUiParent(UiElementNode parent) {
+ if (parent != null) {
+ // DEBUG. Change to log warning.
+ throw new UnsupportedOperationException("Documents can't have UI parents"); //$NON-NLS-1$
+ }
+ super.setUiParent(null);
+ }
+
+ /**
+ * Populate this element node with all values from the given XML node.
+ *
+ * This fails if the given XML node has a different element name -- it won't change the
+ * type of this ui node.
+ *
+ * This method can be both used for populating values the first time and updating values
+ * after the XML model changed.
+ *
+ * @param xml_node The XML node to mirror
+ * @return Returns true if the XML structure has changed (nodes added, removed or replaced)
+ */
+ @Override
+ public boolean loadFromXmlNode(Node xml_node) {
+ boolean structure_changed = (getXmlDocument() != xml_node);
+ setXmlDocument((Document) xml_node);
+ structure_changed |= super.loadFromXmlNode(xml_node);
+ if (structure_changed) {
+ invokeUiUpdateListeners(UiUpdateState.CHILDREN_CHANGED);
+ }
+ return structure_changed;
+ }
+
+ /**
+ * This method throws an exception if there is no underlying XML document.
+ * <p/>
+ * XML documents cannot be created per se -- they are a by-product of the StructuredEditor
+ * XML parser.
+ *
+ * @return The current value of getXmlDocument().
+ */
+ @Override
+ public Node createXmlNode() {
+ if (getXmlDocument() == null) {
+ // By design, a document node cannot be created, it is owned by the XML parser.
+ // By "design" this should never happen since the XML parser always creates an XML
+ // document container, even for an empty file.
+ throw new UnsupportedOperationException("Documents cannot be created"); //$NON-NLS-1$
+ }
+ return getXmlDocument();
+ }
+
+ /**
+ * This method throws an exception and does not even try to delete the XML document.
+ * <p/>
+ * XML documents cannot be deleted per se -- they are a by-product of the StructuredEditor
+ * XML parser.
+ *
+ * @return The removed node or null if it didn't exist in the first place.
+ */
+ @Override
+ public Node deleteXmlNode() {
+ // DEBUG. Change to log warning.
+ throw new UnsupportedOperationException("Documents cannot be deleted"); //$NON-NLS-1$
+ }
+
+ /**
+ * Returns all elements in this document.
+ *
+ * @param document the document
+ * @return all elements in the document
+ */
+ public static List<UiElementNode> getAllElements(UiDocumentNode document) {
+ List<UiElementNode> elements = new ArrayList<UiElementNode>(64);
+ for (UiElementNode child : document.getUiChildren()) {
+ addElements(child, elements);
+ }
+ return elements;
+ }
+
+ private static void addElements(UiElementNode node, List<UiElementNode> elements) {
+ elements.add(node);
+
+ for (UiElementNode child : node.getUiChildren()) {
+ addElements(child, elements);
+ }
+ }
+}
+