diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeView.java b/src/main/java/org/jabref/gui/groups/GroupTreeView.java index 4dbbf152859..abc6e9fb460 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeView.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeView.java @@ -71,6 +71,8 @@ public class GroupTreeView { private GroupTreeViewModel viewModel; private CustomLocalDragboard localDragboard; + private DragExpansionHandler dragExpansionHandler; + private static void removePseudoClasses(TreeTableRow row, PseudoClass... pseudoClasses) { for (PseudoClass pseudoClass : pseudoClasses) { row.pseudoClassStateChanged(pseudoClass, false); @@ -84,6 +86,7 @@ public void initialize() { // Set-up groups tree groupTree.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); + dragExpansionHandler = new DragExpansionHandler(); // Set-up bindings Consumer> updateSelectedGroups = @@ -220,7 +223,7 @@ public void initialize() { event.acceptTransferModes(TransferMode.MOVE, TransferMode.LINK); //expand node and all children on drag over - row.getTreeItem().setExpanded(true); + dragExpansionHandler.expandGroup(row.getTreeItem()); removePseudoClasses(row, dragOverBottom, dragOverCenter, dragOverTop); switch (getDroppingMouseLocation(row, event)) { @@ -399,4 +402,28 @@ private DroppingMouseLocation getDroppingMouseLocation(TreeTableRow draggedItem; + private long dragStarted; + + public void expandGroup(TreeItem treeItem) { + if (!treeItem.equals(draggedItem)) { + this.draggedItem = treeItem; + this.dragStarted = System.currentTimeMillis(); + this.draggedItem.setExpanded(this.draggedItem.isExpanded()); + return; + } + + if (System.currentTimeMillis() - this.dragStarted > DRAG_TIME_BEFORE_EXPANDING_MS) { + // expand or collapse the tree item and reset the time + this.dragStarted = System.currentTimeMillis(); + this.draggedItem.setExpanded(!this.draggedItem.isExpanded()); + } else { + // leave the expansion state of the tree item as it is + this.draggedItem.setExpanded(this.draggedItem.isExpanded()); + } + } + } }