diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/models/CategoryNode.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/models/CategoryNode.java | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/models/CategoryNode.java b/WordPress/src/main/java/org/wordpress/android/models/CategoryNode.java new file mode 100644 index 000000000..cd01d8c79 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/models/CategoryNode.java @@ -0,0 +1,110 @@ +package org.wordpress.android.models; + +import android.util.SparseArray; +import org.wordpress.android.WordPress; + +import java.util.*; + +public class CategoryNode { + private int categoryId; + private String name; + private int parentId; + private int level; + SortedMap<String, CategoryNode> children = new TreeMap<String, CategoryNode>(new Comparator<String>() { + @Override + public int compare(String s, String s2) { + return s.compareToIgnoreCase(s2); + } + }); + + public SortedMap<String, CategoryNode> getChildren() { + return children; + } + + public void setChildren(SortedMap<String, CategoryNode> children) { + this.children = children; + } + + public CategoryNode(int categoryId, int parentId, String name) { + this.categoryId = categoryId; + this.parentId = parentId; + this.name = name; + } + + public int getCategoryId() { + return categoryId; + } + + public void setCategoryId(int categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getParentId() { + return parentId; + } + + public void setParentId(int parentId) { + this.parentId = parentId; + } + + public int getLevel() { + return level; + } + + public static CategoryNode createCategoryTreeFromDB(int blogId) { + CategoryNode rootCategory = new CategoryNode(-1, -1, ""); + if (WordPress.wpDB == null) { + return rootCategory; + } + List<String> stringCategories = WordPress.wpDB.loadCategories(blogId); + + // First pass instantiate CategoryNode objects + SparseArray<CategoryNode> categoryMap = new SparseArray<CategoryNode>(); + CategoryNode currentRootNode; + for (String name : stringCategories) { + int categoryId = WordPress.wpDB.getCategoryId(blogId, name); + int parentId = WordPress.wpDB.getCategoryParentId(blogId, name); + CategoryNode node = new CategoryNode(categoryId, parentId, name); + categoryMap.put(categoryId, node); + } + + // Second pass associate nodes to form a tree + for(int i = 0; i < categoryMap.size(); i++){ + CategoryNode category = categoryMap.valueAt(i); + if (category.getParentId() == 0) { // root node + currentRootNode = rootCategory; + } else { + currentRootNode = categoryMap.get(category.getParentId(), rootCategory); + } + currentRootNode.children.put(category.getName(), categoryMap.get(category.getCategoryId())); + } + return rootCategory; + } + + private static void preOrderTreeTraversal(CategoryNode node, int level, ArrayList<CategoryNode> returnValue) { + if (node == null) { + return ; + } + if (node.parentId != -1) { + node.level = level; + returnValue.add(node); + } + for (CategoryNode child : node.getChildren().values()) { + preOrderTreeTraversal(child, level + 1, returnValue); + } + } + + public static ArrayList<CategoryNode> getSortedListOfCategoriesFromRoot(CategoryNode node) { + ArrayList<CategoryNode> sortedCategories = new ArrayList<CategoryNode>(); + preOrderTreeTraversal(node, 0, sortedCategories); + return sortedCategories; + } +}
\ No newline at end of file |