001    package net.databinder.components.tree.hib;
002    
003    import javax.swing.tree.DefaultMutableTreeNode;
004    
005    import net.databinder.components.tree.data.DataTreeObject;
006    import net.databinder.hib.Databinder;
007    
008    import org.apache.wicket.ajax.AjaxRequestTarget;
009    import org.apache.wicket.ajax.markup.html.form.AjaxButton;
010    import org.apache.wicket.markup.html.form.Form;
011    import org.hibernate.Session;
012    
013    
014    /**
015     * Delete the selected node. Works only with {@link SingleSelectionDataTree} to
016     * avoid dealing with multiple selected nodes.
017     * <p>
018     * The root cannot be deleted, it must be handled elsewhere in the application.
019     * This follows the Sun <a
020     * href="http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html">How
021     * to Use Trees</a> tutorial, example DynamicTreeDemo.
022     * </p>
023     * 
024     * @author Thomas Kappler
025     * 
026     * @param <T>
027     *            see {@link DataTree}
028     */
029    public class DataTreeDeleteButton<T extends DataTreeObject<T>> extends AjaxButton {
030    
031            private SingleSelectionDataTree<T> tree;
032            private boolean deleteOnlyLeafs = true;
033            
034            public DataTreeDeleteButton(String id, SingleSelectionDataTree<T> tree) {
035                    super(id);
036                    this.tree = tree;
037                    setDefaultFormProcessing(false);
038            }
039    
040            public DataTreeDeleteButton(String id, SingleSelectionDataTree<T> tree,
041                            boolean deleteOnlyLeafs) {
042                    this(id, tree);
043                    this.deleteOnlyLeafs = deleteOnlyLeafs;
044            }
045    
046            @Override
047            public boolean isEnabled() {
048                    DefaultMutableTreeNode selected = tree.getSelectedTreeNode(); 
049                    if (selected == null) {
050                            return false;
051                    }
052                    if (selected.isRoot()) {
053                            return false;
054                    }
055                    if (deleteOnlyLeafs) {
056                            return selected.isLeaf();
057                    }
058                    
059                    return true;
060            }
061    
062            @Override
063            protected void onSubmit(AjaxRequestTarget target, Form form) {
064                    DefaultMutableTreeNode selectedNode = tree.getSelectedTreeNode();
065                    T selected = tree.getSelectedUserObject();
066            
067                    DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) 
068                                    selectedNode.getParent();
069                    T parent = tree.getDataTreeNode(parentNode);
070    
071                    if (parent != null)
072                            parent.getChildren().remove(selected);
073                    parentNode.remove(selectedNode);
074                    
075                    Session session = Databinder.getHibernateSession();
076                    if (session.contains(selected)) {
077                            session.delete(selected);
078                            session.getTransaction().commit();
079                    }
080                    
081                    tree.getTreeState().selectNode(parentNode, true);
082                    tree.repaint(target);
083                    tree.updateDependentComponents(target, parentNode);
084            }
085    }