001 package net.sf.tacos.components.tree;
002
003 import java.io.Serializable;
004 import java.util.Collection;
005 import java.util.Iterator;
006 import java.util.Set;
007 import net.sf.tacos.model.IKeyProvider;
008 import net.sf.tacos.model.ITreeContentProvider;
009 import org.apache.hivemind.util.Defense;
010
011 /**
012 * @author phraktle
013 */
014 public class TreeManager implements ITreeManager {
015
016 private final Set state;
017 private final ITreeContentProvider contentProvider;
018 private final IKeyProvider keyProvider;
019
020 /**
021 * Creates tree manager.
022 * @param state
023 * @param contentProvider
024 * @param keyProvider
025 */
026 public TreeManager(Set state, ITreeContentProvider contentProvider,
027 IKeyProvider keyProvider)
028 {
029 Defense.notNull(state, "tree state");
030 Defense.notNull(contentProvider, "tree contentProvider");
031 Defense.notNull(keyProvider, "tree keyProvider");
032
033 this.state = state;
034 this.contentProvider = contentProvider;
035 this.keyProvider = keyProvider;
036 }
037
038 /**
039 *
040 * {@inheritDoc}
041 */
042 public boolean isExpanded(Object element)
043 {
044 return isExpandedKey(keyProvider.getKey(element));
045 }
046
047 /**
048 *
049 * {@inheritDoc}
050 */
051 public boolean isExpandedKey(Serializable key)
052 {
053 return state.contains(key);
054 }
055
056 /**
057 *
058 * {@inheritDoc}
059 */
060 public void setExpanded(Object element, boolean open)
061 {
062 setExpandedKey(keyProvider.getKey(element), open);
063 }
064
065 /**
066 *
067 * {@inheritDoc}
068 */
069 public void setExpandedKey(Serializable key, boolean open)
070 {
071 if (open) {
072 state.add(key);
073 } else {
074 state.remove(key);
075 }
076 }
077
078 /**
079 *
080 * @return
081 */
082 public Set getState()
083 {
084 return state;
085 }
086
087 /**
088 *
089 * {@inheritDoc}
090 */
091 public void collapseAll()
092 {
093 state.clear();
094 }
095
096 /**
097 *
098 * {@inheritDoc}
099 */
100 public Object reveal(Object element)
101 {
102 Object parent = contentProvider.getParent(element);
103 if (parent != null) {
104 setExpanded(parent, true);
105 return reveal(parent);
106 } else return element;
107 }
108
109 /**
110 *
111 * {@inheritDoc}
112 */
113 public void expandAll()
114 {
115 expand(contentProvider.getElements());
116 }
117
118 /**
119 * Expands all elements
120 * @param rootElements
121 */
122 private void expand(Collection rootElements)
123 {
124 for(Iterator i = rootElements.iterator(); i.hasNext();) {
125 Object element = i.next();
126 setExpanded(element, true);
127 if (contentProvider.hasChildren(element)) {
128 expand(contentProvider.getChildren(element));
129 }
130 }
131 }
132
133 }