2727import javafx .scene .control .TreeTableRow ;
2828import javafx .scene .control .TreeTableView ;
2929import javafx .scene .input .ClipboardContent ;
30- import javafx .scene .input .DragEvent ;
3130import javafx .scene .input .Dragboard ;
3231import javafx .scene .input .MouseButton ;
3332import javafx .scene .input .MouseEvent ;
4039import org .jabref .gui .GUIGlobals ;
4140import org .jabref .gui .StateManager ;
4241import org .jabref .gui .util .BindingsHelper ;
42+ import org .jabref .gui .util .ControlHelper ;
4343import org .jabref .gui .util .CustomLocalDragboard ;
4444import org .jabref .gui .util .RecursiveTreeItem ;
4545import org .jabref .gui .util .TaskExecutor ;
@@ -74,12 +74,6 @@ public class GroupTreeView {
7474
7575 private DragExpansionHandler dragExpansionHandler ;
7676
77- private static void removePseudoClasses (TreeTableRow <GroupNodeViewModel > row , PseudoClass ... pseudoClasses ) {
78- for (PseudoClass pseudoClass : pseudoClasses ) {
79- row .pseudoClassStateChanged (pseudoClass , false );
80- }
81- }
82-
8377 @ FXML
8478 public void initialize () {
8579 this .localDragboard = GUIGlobals .localDragboard ;
@@ -169,10 +163,6 @@ public void initialize() {
169163 PseudoClass rootPseudoClass = PseudoClass .getPseudoClass ("root" );
170164 PseudoClass subElementPseudoClass = PseudoClass .getPseudoClass ("sub" );
171165
172- // Pseudo-classes for drag and drop
173- PseudoClass dragOverBottom = PseudoClass .getPseudoClass ("dragOver-bottom" );
174- PseudoClass dragOverCenter = PseudoClass .getPseudoClass ("dragOver-center" );
175- PseudoClass dragOverTop = PseudoClass .getPseudoClass ("dragOver-top" );
176166 groupTree .setRowFactory (treeTable -> {
177167 TreeTableRow <GroupNodeViewModel > row = new TreeTableRow <>();
178168 row .treeItemProperty ().addListener ((ov , oldTreeItem , newTreeItem ) -> {
@@ -226,23 +216,16 @@ public void initialize() {
226216 //expand node and all children on drag over
227217 dragExpansionHandler .expandGroup (row .getTreeItem ());
228218
229- removePseudoClasses (row , dragOverBottom , dragOverCenter , dragOverTop );
230- switch (getDroppingMouseLocation (row , event )) {
231- case BOTTOM :
232- row .pseudoClassStateChanged (dragOverBottom , true );
233- break ;
234- case CENTER :
235- row .pseudoClassStateChanged (dragOverCenter , true );
236- break ;
237- case TOP :
238- row .pseudoClassStateChanged (dragOverTop , true );
239- break ;
219+ if (localDragboard .hasBibEntries ()) {
220+ ControlHelper .setDroppingPseudoClasses (row );
221+ } else {
222+ ControlHelper .setDroppingPseudoClasses (row , event );
240223 }
241224 }
242225 event .consume ();
243226 });
244227 row .setOnDragExited (event -> {
245- removePseudoClasses (row , dragOverBottom , dragOverCenter , dragOverTop );
228+ ControlHelper . removeDroppingPseudoClasses (row );
246229 });
247230
248231 row .setOnDragDropped (event -> {
@@ -255,13 +238,13 @@ public void initialize() {
255238 Optional <GroupNodeViewModel > source = viewModel .rootGroupProperty ().get ()
256239 .getChildByPath (pathToSource );
257240 if (source .isPresent ()) {
258- source .get ().draggedOn (row .getItem (), getDroppingMouseLocation (row , event ));
241+ source .get ().draggedOn (row .getItem (), ControlHelper . getDroppingMouseLocation (row , event ));
259242 success = true ;
260243 }
261244 }
262245 }
263246
264- if (localDragboard .hasType ( DragAndDropDataFormats . BIBENTRY_LIST_CLASS )) {
247+ if (localDragboard .hasBibEntries ( )) {
265248 List <BibEntry > entries = localDragboard .getBibEntries ();
266249 row .getItem ().addEntriesToGroup (entries );
267250 success = true ;
@@ -281,7 +264,7 @@ private void updateSelection(List<TreeItem<GroupNodeViewModel>> newSelectedGroup
281264 if ((newSelectedGroups == null ) || newSelectedGroups .isEmpty ()) {
282265 viewModel .selectedGroupsProperty ().clear ();
283266 } else {
284- List <GroupNodeViewModel > list = newSelectedGroups .stream ().filter (model -> model != null && !(model .getValue ().getGroupNode ().getGroup () instanceof AllEntriesGroup )).map (TreeItem < GroupNodeViewModel > ::getValue ).collect (Collectors .toList ());
267+ List <GroupNodeViewModel > list = newSelectedGroups .stream ().filter (model -> model != null && !(model .getValue ().getGroupNode ().getGroup () instanceof AllEntriesGroup )).map (TreeItem ::getValue ).collect (Collectors .toList ());
285268 viewModel .selectedGroupsProperty ().setAll (list );
286269 }
287270 }
@@ -378,19 +361,6 @@ private void setupClearButtonField(CustomTextField customTextField) {
378361 }
379362 }
380363
381- /**
382- * Determines where the mouse is in the given row.
383- */
384- private DroppingMouseLocation getDroppingMouseLocation (TreeTableRow <GroupNodeViewModel > row , DragEvent event ) {
385- if ((row .getHeight () * 0.25 ) > event .getY ()) {
386- return DroppingMouseLocation .TOP ;
387- } else if ((row .getHeight () * 0.75 ) < event .getY ()) {
388- return DroppingMouseLocation .BOTTOM ;
389- } else {
390- return DroppingMouseLocation .CENTER ;
391- }
392- }
393-
394364 private class DragExpansionHandler {
395365 private static final long DRAG_TIME_BEFORE_EXPANDING_MS = 1000 ;
396366 private TreeItem <GroupNodeViewModel > draggedItem ;
0 commit comments