X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=android%2Fsrc%2Fpl%2Fpolidea%2Ftreeview%2FInMemoryTreeStateManager.java;fp=android%2Fsrc%2Fpl%2Fpolidea%2Ftreeview%2FInMemoryTreeStateManager.java;h=0000000000000000000000000000000000000000;hb=9349577cdfdff682b2aabd6daa24fdc3a7449b58;hp=bae675bf874c8a5cd4455c5fb564e85c6a0b27c3;hpb=30ba0a882f0c061176ba14dbf86d3d6fad096c02;p=debian%2Fopenrocket diff --git a/android/src/pl/polidea/treeview/InMemoryTreeStateManager.java b/android/src/pl/polidea/treeview/InMemoryTreeStateManager.java deleted file mode 100644 index bae675bf..00000000 --- a/android/src/pl/polidea/treeview/InMemoryTreeStateManager.java +++ /dev/null @@ -1,374 +0,0 @@ -package pl.polidea.treeview; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import android.database.DataSetObserver; - -/** - * In-memory manager of tree state. - * - * @param - * type of identifier - */ -public class InMemoryTreeStateManager implements TreeStateManager { - private static final long serialVersionUID = 1L; - private final Map> allNodes = new HashMap>(); - private final InMemoryTreeNode topSentinel = new InMemoryTreeNode( - null, null, -1, true); - private transient List visibleListCache = null; // lasy initialised - private transient List unmodifiableVisibleList = null; - private boolean visibleByDefault = true; - private final transient Set observers = new HashSet(); - - private synchronized void internalDataSetChanged() { - visibleListCache = null; - unmodifiableVisibleList = null; - for (final DataSetObserver observer : observers) { - observer.onChanged(); - } - } - - /** - * If true new nodes are visible by default. - * - * @param visibleByDefault - * if true, then newly added nodes are expanded by default - */ - public void setVisibleByDefault(final boolean visibleByDefault) { - this.visibleByDefault = visibleByDefault; - } - - private InMemoryTreeNode getNodeFromTreeOrThrow(final T id) { - if (id == null) { - throw new NodeNotInTreeException("(null)"); - } - final InMemoryTreeNode node = allNodes.get(id); - if (node == null) { - throw new NodeNotInTreeException(id.toString()); - } - return node; - } - - private InMemoryTreeNode getNodeFromTreeOrThrowAllowRoot(final T id) { - if (id == null) { - return topSentinel; - } - return getNodeFromTreeOrThrow(id); - } - - private void expectNodeNotInTreeYet(final T id) { - final InMemoryTreeNode node = allNodes.get(id); - if (node != null) { - throw new NodeAlreadyInTreeException(id.toString(), node.toString()); - } - } - - @Override - public synchronized TreeNodeInfo getNodeInfo(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrow(id); - final List> children = node.getChildren(); - boolean expanded = false; - if (!children.isEmpty() && children.get(0).isVisible()) { - expanded = true; - } - return new TreeNodeInfo(id, node.getLevel(), !children.isEmpty(), - node.isVisible(), expanded); - } - - @Override - public synchronized List getChildren(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(id); - return node.getChildIdList(); - } - - @Override - public synchronized T getParent(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(id); - return node.getParent(); - } - - private boolean getChildrenVisibility(final InMemoryTreeNode node) { - boolean visibility; - final List> children = node.getChildren(); - if (children.isEmpty()) { - visibility = visibleByDefault; - } else { - visibility = children.get(0).isVisible(); - } - return visibility; - } - - @Override - public synchronized void addBeforeChild(final T parent, final T newChild, - final T beforeChild) { - expectNodeNotInTreeYet(newChild); - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(parent); - final boolean visibility = getChildrenVisibility(node); - // top nodes are always expanded. - if (beforeChild == null) { - final InMemoryTreeNode added = node.add(0, newChild, visibility); - allNodes.put(newChild, added); - } else { - final int index = node.indexOf(beforeChild); - final InMemoryTreeNode added = node.add(index == -1 ? 0 : index, - newChild, visibility); - allNodes.put(newChild, added); - } - if (visibility) { - internalDataSetChanged(); - } - } - - @Override - public synchronized void addAfterChild(final T parent, final T newChild, - final T afterChild) { - expectNodeNotInTreeYet(newChild); - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(parent); - final boolean visibility = getChildrenVisibility(node); - if (afterChild == null) { - final InMemoryTreeNode added = node.add( - node.getChildrenListSize(), newChild, visibility); - allNodes.put(newChild, added); - } else { - final int index = node.indexOf(afterChild); - final InMemoryTreeNode added = node.add( - index == -1 ? node.getChildrenListSize() : index, newChild, - visibility); - allNodes.put(newChild, added); - } - if (visibility) { - internalDataSetChanged(); - } - } - - @Override - public synchronized void removeNodeRecursively(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(id); - final boolean visibleNodeChanged = removeNodeRecursively(node); - final T parent = node.getParent(); - final InMemoryTreeNode parentNode = getNodeFromTreeOrThrowAllowRoot(parent); - parentNode.removeChild(id); - if (visibleNodeChanged) { - internalDataSetChanged(); - } - } - - private boolean removeNodeRecursively(final InMemoryTreeNode node) { - boolean visibleNodeChanged = false; - for (final InMemoryTreeNode child : node.getChildren()) { - if (removeNodeRecursively(child)) { - visibleNodeChanged = true; - } - } - node.clearChildren(); - if (node.getId() != null) { - allNodes.remove(node.getId()); - if (node.isVisible()) { - visibleNodeChanged = true; - } - } - return visibleNodeChanged; - } - - private void setChildrenVisibility(final InMemoryTreeNode node, - final boolean visible, final boolean recursive) { - for (final InMemoryTreeNode child : node.getChildren()) { - child.setVisible(visible); - if (recursive) { - setChildrenVisibility(child, visible, true); - } - } - } - - @Override - public synchronized void expandDirectChildren(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(id); - setChildrenVisibility(node, true, false); - internalDataSetChanged(); - } - - @Override - public synchronized void expandEverythingBelow(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(id); - setChildrenVisibility(node, true, true); - internalDataSetChanged(); - } - - @Override - public synchronized void collapseChildren(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(id); - if (node == topSentinel) { - for (final InMemoryTreeNode n : topSentinel.getChildren()) { - setChildrenVisibility(n, false, true); - } - } else { - setChildrenVisibility(node, false, true); - } - internalDataSetChanged(); - } - - @Override - public synchronized T getNextSibling(final T id) { - final T parent = getParent(id); - final InMemoryTreeNode parentNode = getNodeFromTreeOrThrowAllowRoot(parent); - boolean returnNext = false; - for (final InMemoryTreeNode child : parentNode.getChildren()) { - if (returnNext) { - return child.getId(); - } - if (child.getId().equals(id)) { - returnNext = true; - } - } - return null; - } - - @Override - public synchronized T getPreviousSibling(final T id) { - final T parent = getParent(id); - final InMemoryTreeNode parentNode = getNodeFromTreeOrThrowAllowRoot(parent); - final T previousSibling = null; - for (final InMemoryTreeNode child : parentNode.getChildren()) { - if (child.getId().equals(id)) { - return previousSibling; - } - } - return null; - } - - @Override - public synchronized boolean isInTree(final T id) { - return allNodes.containsKey(id); - } - - @Override - public synchronized int getVisibleCount() { - return getVisibleList().size(); - } - - @Override - public synchronized List getVisibleList() { - T currentId = null; - if (visibleListCache == null) { - visibleListCache = new ArrayList(allNodes.size()); - do { - currentId = getNextVisible(currentId); - if (currentId == null) { - break; - } else { - visibleListCache.add(currentId); - } - } while (true); - } - if (unmodifiableVisibleList == null) { - unmodifiableVisibleList = Collections - .unmodifiableList(visibleListCache); - } - return unmodifiableVisibleList; - } - - public synchronized T getNextVisible(final T id) { - final InMemoryTreeNode node = getNodeFromTreeOrThrowAllowRoot(id); - if (!node.isVisible()) { - return null; - } - final List> children = node.getChildren(); - if (!children.isEmpty()) { - final InMemoryTreeNode firstChild = children.get(0); - if (firstChild.isVisible()) { - return firstChild.getId(); - } - } - final T sibl = getNextSibling(id); - if (sibl != null) { - return sibl; - } - T parent = node.getParent(); - do { - if (parent == null) { - return null; - } - final T parentSibling = getNextSibling(parent); - if (parentSibling != null) { - return parentSibling; - } - parent = getNodeFromTreeOrThrow(parent).getParent(); - } while (true); - } - - @Override - public synchronized void registerDataSetObserver( - final DataSetObserver observer) { - observers.add(observer); - } - - @Override - public synchronized void unregisterDataSetObserver( - final DataSetObserver observer) { - observers.remove(observer); - } - - @Override - public int getLevel(final T id) { - return getNodeFromTreeOrThrow(id).getLevel(); - } - - @Override - public Integer[] getHierarchyDescription(final T id) { - final int level = getLevel(id); - final Integer[] hierarchy = new Integer[level + 1]; - int currentLevel = level; - T currentId = id; - T parent = getParent(currentId); - while (currentLevel >= 0) { - hierarchy[currentLevel--] = getChildren(parent).indexOf(currentId); - currentId = parent; - parent = getParent(parent); - } - return hierarchy; - } - - private void appendToSb(final StringBuilder sb, final T id) { - if (id != null) { - final TreeNodeInfo node = getNodeInfo(id); - final int indent = node.getLevel() * 4; - final char[] indentString = new char[indent]; - Arrays.fill(indentString, ' '); - sb.append(indentString); - sb.append(node.toString()); - sb.append(Arrays.asList(getHierarchyDescription(id)).toString()); - sb.append("\n"); - } - final List children = getChildren(id); - for (final T child : children) { - appendToSb(sb, child); - } - } - - @Override - public synchronized String toString() { - final StringBuilder sb = new StringBuilder(); - appendToSb(sb, null); - return sb.toString(); - } - - @Override - public synchronized void clear() { - allNodes.clear(); - topSentinel.clearChildren(); - internalDataSetChanged(); - } - - @Override - public void refresh() { - internalDataSetChanged(); - } - -}