package net.databinder.components.tree.hib; import javax.swing.tree.DefaultMutableTreeNode; import net.databinder.components.tree.data.DataTreeObject; import net.databinder.hib.Databinder; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.form.Form; import org.hibernate.Session; /** * Delete the selected node. Works only with {@link SingleSelectionDataTree} to * avoid dealing with multiple selected nodes. * <p> * The root cannot be deleted, it must be handled elsewhere in the application. * This follows the Sun <a * href="http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html">How * to Use Trees</a> tutorial, example DynamicTreeDemo. * </p> * * @author Thomas Kappler * * @param <T> * see {@link DataTree} */ public class DataTreeDeleteButton<T extends DataTreeObject<T>> extends AjaxButton { private SingleSelectionDataTree<T> tree; private boolean deleteOnlyLeafs = true; public DataTreeDeleteButton(String id, SingleSelectionDataTree<T> tree) { super(id); this.tree = tree; setDefaultFormProcessing(false); } public DataTreeDeleteButton(String id, SingleSelectionDataTree<T> tree, boolean deleteOnlyLeafs) { this(id, tree); this.deleteOnlyLeafs = deleteOnlyLeafs; } @Override public boolean isEnabled() { DefaultMutableTreeNode selected = tree.getSelectedTreeNode(); if (selected == null) { return false; } if (selected.isRoot()) { return false; } if (deleteOnlyLeafs) { return selected.isLeaf(); } return true; } @Override protected void onSubmit(AjaxRequestTarget target, Form form) { DefaultMutableTreeNode selectedNode = tree.getSelectedTreeNode(); T selected = tree.getSelectedUserObject(); DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) selectedNode.getParent(); T parent = tree.getDataTreeNode(parentNode); if (parent != null) parent.getChildren().remove(selected); parentNode.remove(selectedNode); Session session = Databinder.getHibernateSession(); if (session.contains(selected)) { session.delete(selected); session.getTransaction().commit(); } tree.getTreeState().selectNode(parentNode, true); tree.repaint(target); tree.updateDependentComponents(target, parentNode); } }