1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
import java.awt.Point;
import java.awt.dnd.DnDConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
/**
* Gestion du Drag and Drop
*
*/
public class DefaultTreeTransferHandler extends AbstractTreeTransferHandler {
public DefaultTreeTransferHandler(TreeListePanier tree, int action) {
super(tree, action, true);
}
/**
* Determine si l'on peut déplacer le noeud
* @param target l'emplacement ciblé
* @param draggedNode le noeud que l'on souhaite deplacer
* @param action l'action que l'on souhaite réaliser
* @param location l'emplacement du noeud à déplacer
* @return boolean indicant si l'on peut ou non déplacer le noeud
*
*/
public boolean canPerformAction(TreeListePanier target, DefaultMutableTreeNode draggedNode, int action, Point location) {
TreePath pathTarget = target.getPathForLocation(location.x, location.y);
if (pathTarget == null) {
target.setSelectionPath(null);
return(false);
}
target.setSelectionPath(pathTarget);
if(action == DnDConstants.ACTION_COPY) {
return(true);
} else if(action == DnDConstants.ACTION_MOVE) {
DefaultMutableTreeNode parentNode =(DefaultMutableTreeNode)pathTarget.getLastPathComponent();
// On ne peut pas déplacer un noeud si :
// - Si c'est dans lui meme
// - Si le parent du noeud courant ne change pas
// - Si le nouveau noeud est un enfant du noeud courant
// - Si le nouveau noeud n'est pas de type "Panier"
if (parentNode == draggedNode.getParent()
|| draggedNode.isNodeDescendant(parentNode)
|| !(parentNode.getUserObject() instanceof Panier)) {
return(false);
}
else {
return(true);
}
}
else {
return(false);
}
}
/**
* Réalise le "drag and drop"
*/
public boolean executeDrop(TreeListePanier target, DefaultMutableTreeNode draggedNode, DefaultMutableTreeNode newParentNode, int action) {
if (action == DnDConstants.ACTION_COPY) {
DefaultMutableTreeNode newNode = target.makeDeepCopy(draggedNode);
((DefaultTreeModel)target.getModel()).insertNodeInto(newNode,newParentNode,newParentNode.getChildCount());
TreePath treePath = new TreePath(newNode.getPath());
target.scrollPathToVisible(treePath);
target.setSelectionPath(treePath);
return(true);
}
if (action == DnDConstants.ACTION_MOVE) {
draggedNode.removeFromParent();
((DefaultTreeModel)target.getModel()).insertNodeInto(draggedNode,newParentNode,newParentNode.getChildCount());
TreePath treePath = new TreePath(draggedNode.getPath());
target.scrollPathToVisible(treePath);
target.setSelectionPath(treePath);
saveDrop(draggedNode, newParentNode);
return(true);
}
return(false);
}
/**
* Sauvegarde le nouvelle emplacement de l'élément déplacé
* @param draggedNode le noeud que l'on souhaite deplacer
* @param newParentNode le nouveau parent du noeud courant
*/
public void saveDrop(DefaultMutableTreeNode draggedNode, DefaultMutableTreeNode newParentNode) {
Long panierId = ((Panier)newParentNode.getUserObject()).getId();
try {
Object monNoeud = draggedNode.getUserObject();
// Affecte le nouvelle element "parent" + enregistrement de la modification
if (monNoeud instanceof Panier){
Panier monPanier = (Panier)monNoeud;
monPanier.setIdParent(panierId);
PanierService.modifier(monPanier, false, null);
} else if (monNoeud instanceof EFolderPanier){
EFolderPanier monPanier = (EFolderPanier)monNoeud;
monPanier.setIdPanier(panierId);
EFolderPanierService.modifier(monPanier, false, null);
}
} catch (Exception e) {
log.error(e);
}
}
} |
Partager