@@ -71,6 +71,8 @@ public class GroupTreeView {
7171    private  GroupTreeViewModel  viewModel ;
7272    private  CustomLocalDragboard  localDragboard ;
7373
74+     private  DragExpansionHandler  dragExpansionHandler ;
75+ 
7476    private  static  void  removePseudoClasses (TreeTableRow <GroupNodeViewModel > row , PseudoClass ... pseudoClasses ) {
7577        for  (PseudoClass  pseudoClass  : pseudoClasses ) {
7678            row .pseudoClassStateChanged (pseudoClass , false );
@@ -84,6 +86,7 @@ public void initialize() {
8486
8587        // Set-up groups tree 
8688        groupTree .getSelectionModel ().setSelectionMode (SelectionMode .MULTIPLE );
89+         dragExpansionHandler  = new  DragExpansionHandler ();
8790
8891        // Set-up bindings 
8992        Consumer <ObservableList <GroupNodeViewModel >> updateSelectedGroups  =
@@ -220,7 +223,7 @@ public void initialize() {
220223                    event .acceptTransferModes (TransferMode .MOVE , TransferMode .LINK );
221224
222225                    //expand node and all children on drag over 
223-                     row .getTreeItem (). setExpanded ( true );
226+                     dragExpansionHandler . expandGroup ( row .getTreeItem ());
224227
225228                    removePseudoClasses (row , dragOverBottom , dragOverCenter , dragOverTop );
226229                    switch  (getDroppingMouseLocation (row , event )) {
@@ -399,4 +402,28 @@ private DroppingMouseLocation getDroppingMouseLocation(TreeTableRow<GroupNodeVie
399402            return  DroppingMouseLocation .CENTER ;
400403        }
401404    }
405+ 
406+     private  class  DragExpansionHandler  {
407+         private  static  final  long  DRAG_TIME_BEFORE_EXPANDING_MS  = 1000 ;
408+         private  TreeItem <GroupNodeViewModel > draggedItem ;
409+         private  long  dragStarted ;
410+ 
411+         public  void  expandGroup (TreeItem <GroupNodeViewModel > treeItem ) {
412+             if  (!treeItem .equals (draggedItem )) {
413+                 this .draggedItem  = treeItem ;
414+                 this .dragStarted  = System .currentTimeMillis ();
415+                 this .draggedItem .setExpanded (this .draggedItem .isExpanded ());
416+                 return ;
417+             }
418+ 
419+             if  (System .currentTimeMillis () - this .dragStarted  > DRAG_TIME_BEFORE_EXPANDING_MS ) {
420+                 // expand or collapse the tree item and reset the time 
421+                 this .dragStarted  = System .currentTimeMillis ();
422+                 this .draggedItem .setExpanded (!this .draggedItem .isExpanded ());
423+             } else  {
424+                 // leave the expansion state of the tree item as it is 
425+                 this .draggedItem .setExpanded (this .draggedItem .isExpanded ());
426+             }
427+         }
428+     }
402429}
0 commit comments