001    package net.databinder.components.tree.hib;
002    
003    import java.util.Collection;
004    
005    import javax.swing.tree.DefaultMutableTreeNode;
006    
007    import net.databinder.components.tree.data.DataTreeObject;
008    import net.databinder.models.hib.HibernateListModel;
009    import net.databinder.models.hib.HibernateObjectModel;
010    
011    import org.apache.wicket.markup.html.tree.ITreeState;
012    
013    
014    
015    /**
016     * A {@link DataTree} in single selection mode (see {@link ITreeState}), with
017     * methods to retrieve the selected node or its backing object.
018     * 
019     * @author Thomas Kappler
020     * 
021     * @param <T>
022     *            see {@link DataTree}
023     */
024    public abstract class SingleSelectionDataTree<T extends DataTreeObject<T>> extends DataTree<T> {
025    
026            public SingleSelectionDataTree(String id, HibernateObjectModel rootModel) {
027                    super(id, rootModel);
028                    getTreeState().setAllowSelectMultiple(false);
029            }
030            
031            public SingleSelectionDataTree(String id, HibernateListModel childrenModel) {
032                    super(id, childrenModel);
033                    getTreeState().setAllowSelectMultiple(false);
034            }
035    
036            /**
037             * Depends on the tree disallowing multiple selection, which we
038             * configured in the constructor.
039             * 
040             * @return the currently selected tree node if any, else null
041             */
042            public DefaultMutableTreeNode getSelectedTreeNode() {
043                    @SuppressWarnings("unchecked")
044                    Collection<DefaultMutableTreeNode> selectedNodes = 
045                                    getTreeState().getSelectedNodes();
046                    if (selectedNodes.isEmpty()) {
047                            return null;
048                    }
049                    DefaultMutableTreeNode selected = (DefaultMutableTreeNode) 
050                                    selectedNodes.iterator().next();
051                    return selected;
052            }
053            
054            /**
055             * Return the currently selected user object (of type T). 
056             * 
057             * @return the one currently selected T if any, else null
058             */
059            public T getSelectedUserObject() {
060                    DefaultMutableTreeNode selectedNode = getSelectedTreeNode();
061                    if (selectedNode == null) {
062                            return null;
063                    }
064                    return getDataTreeNode(selectedNode);
065            }
066    }