diff options
Diffstat (limited to 'tools/droiddoc/src/NavTree.java')
-rw-r--r-- | tools/droiddoc/src/NavTree.java | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/tools/droiddoc/src/NavTree.java b/tools/droiddoc/src/NavTree.java new file mode 100644 index 0000000..9eef0ce --- /dev/null +++ b/tools/droiddoc/src/NavTree.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +import org.clearsilver.HDF; + +import java.util.ArrayList; + +public class NavTree { + + public static void writeNavTree(String dir) { + ArrayList<Node> children = new ArrayList(); + for (PackageInfo pkg: DroidDoc.choosePackages()) { + children.add(makePackageNode(pkg)); + } + Node node = new Node("Reference", dir + "packages.html", children); + + StringBuilder buf = new StringBuilder(); + if (false) { + // if you want a root node + buf.append("["); + node.render(buf); + buf.append("]"); + } else { + // if you don't want a root node + node.renderChildren(buf); + } + + HDF data = DroidDoc.makeHDF(); + data.setValue("reference_tree", buf.toString()); + ClearPage.write(data, "navtree_data.cs", "navtree_data.js"); + } + + private static Node makePackageNode(PackageInfo pkg) { + ArrayList<Node> children = new ArrayList(); + + children.add(new Node("Description", pkg.fullDescriptionHtmlPage(), null)); + + addClassNodes(children, "Interfaces", pkg.interfaces()); + addClassNodes(children, "Classes", pkg.ordinaryClasses()); + addClassNodes(children, "Enums", pkg.enums()); + addClassNodes(children, "Exceptions", pkg.exceptions()); + addClassNodes(children, "Errors", pkg.errors()); + + return new Node(pkg.name(), pkg.htmlPage(), children); + } + + private static void addClassNodes(ArrayList<Node> parent, String label, ClassInfo[] classes) { + ArrayList<Node> children = new ArrayList(); + + for (ClassInfo cl: classes) { + if (cl.checkLevel()) { + children.add(new Node(cl.name(), cl.htmlPage(), null)); + } + } + + if (children.size() > 0) { + parent.add(new Node(label, null, children)); + } + } + + private static class Node { + private String mLabel; + private String mLink; + ArrayList<Node> mChildren; + + Node(String label, String link, ArrayList<Node> children) { + mLabel = label; + mLink = link; + mChildren = children; + } + + static void renderString(StringBuilder buf, String s) { + if (s == null) { + buf.append("null"); + } else { + buf.append('"'); + final int N = s.length(); + for (int i=0; i<N; i++) { + char c = s.charAt(i); + if (c >= ' ' && c <= '~' && c != '"' && c != '\\') { + buf.append(c); + } else { + buf.append("\\u"); + for (int j=0; i<4; i++) { + char x = (char)(c & 0x000f); + if (x > 10) { + x = (char)(x - 10 + 'a'); + } else { + x = (char)(x + '0'); + } + buf.append(x); + c >>= 4; + } + } + } + buf.append('"'); + } + } + + void renderChildren(StringBuilder buf) { + ArrayList<Node> list = mChildren; + if (list == null || list.size() == 0) { + // We output null for no children. That way empty lists here can just + // be a byproduct of how we generate the lists. + buf.append("null"); + } else { + buf.append("[ "); + final int N = list.size(); + for (int i=0; i<N; i++) { + list.get(i).render(buf); + if (i != N-1) { + buf.append(", "); + } + } + buf.append(" ]\n"); + } + } + + void render(StringBuilder buf) { + buf.append("[ "); + renderString(buf, mLabel); + buf.append(", "); + renderString(buf, mLink); + buf.append(", "); + renderChildren(buf); + buf.append(" ]"); + } + } +} |