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 }