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