4
4
import java .awt .CardLayout ;
5
5
import java .awt .Color ;
6
6
import java .awt .Component ;
7
+ import java .awt .datatransfer .DataFlavor ;
8
+ import java .awt .datatransfer .UnsupportedFlavorException ;
9
+ import java .awt .dnd .DropTargetAdapter ;
10
+ import java .awt .dnd .DropTargetDragEvent ;
11
+ import java .awt .dnd .DropTargetDropEvent ;
12
+ import java .awt .dnd .DropTargetEvent ;
13
+ import java .awt .dnd .DropTargetListener ;
7
14
import java .io .File ;
15
+ import java .io .IOException ;
8
16
import java .util .ArrayList ;
17
+ import java .util .Arrays ;
9
18
import java .util .Iterator ;
10
19
import java .util .List ;
11
20
import java .util .Map ;
12
21
import java .util .Optional ;
22
+ import java .util .TooManyListenersException ;
13
23
import java .util .function .Function ;
14
24
import java .util .stream .Collectors ;
15
25
import java .util .stream .Stream ;
16
26
17
27
import javax .swing .BorderFactory ;
28
+ import javax .swing .DropMode ;
18
29
import javax .swing .GroupLayout ;
19
30
import javax .swing .GroupLayout .Alignment ;
20
31
import javax .swing .JButton ;
29
40
import javax .swing .ListCellRenderer ;
30
41
import javax .swing .ListModel ;
31
42
import javax .swing .ListSelectionModel ;
43
+ import javax .swing .TransferHandler ;
32
44
import javax .swing .UIManager ;
33
45
import javax .swing .border .Border ;
34
46
@@ -229,7 +241,7 @@ private JPanel createTitlePanel() {
229
241
230
242
addButton .addActionListener (e -> addNewDataSetToList ());
231
243
deleteButton .addActionListener (e -> deleteSelectedItems ());
232
- scanButton .addActionListener (e -> scan ());
244
+ scanButton .addActionListener (e -> scanButtonClicked ());
233
245
234
246
JPanel panel = new JPanel ();
235
247
GroupLayout layout = new GroupLayout (panel );
@@ -318,31 +330,36 @@ private void reset() {
318
330
}
319
331
}
320
332
321
- private void scan () {
333
+ private void scanButtonClicked () {
322
334
Optional <File > rootFolder = fileBrowser .browseForRootFolder (jframeProvider .get ());
323
335
if (rootFolder .isPresent ()) {
324
- scanButton .setEnabled (false );
325
- ResolverTask task = new ResolverTask (rootFolder .get ());
336
+ File root = rootFolder .get ();
337
+ runResolverTask (Arrays .asList (root ));
338
+ }
339
+ }
340
+
341
+ private void runResolverTask (List <File > files ) {
342
+ scanButton .setEnabled (false );
343
+ ResolverTask task = new ResolverTask (files );
344
+
345
+ dialogTaskManager .execute (new TaskIterator (task ), new TaskObserver () {
326
346
327
- dialogTaskManager .execute (new TaskIterator (task ), new TaskObserver () {
328
-
329
- @ Override
330
- public void taskFinished (ObservableTask task ) {
331
- @ SuppressWarnings ("unchecked" )
332
- List <DataSetParameters > datasets = task .getResults (List .class );
333
- if (!datasets .isEmpty ()) {
334
- datasets .forEach (MasterDetailDialogPage .this ::addDataSetToList );
335
- dataSetList .setSelectedValue (datasets .get (0 ), true );
336
- }
337
- }
338
-
339
- @ Override
340
- public void allFinished (FinishStatus finishStatus ) {
341
- scanButton .setEnabled (true );
342
- updateButtonEnablement ();
347
+ @ Override
348
+ public void taskFinished (ObservableTask task ) {
349
+ @ SuppressWarnings ("unchecked" )
350
+ List <DataSetParameters > datasets = task .getResults (List .class );
351
+ if (!datasets .isEmpty ()) {
352
+ datasets .forEach (MasterDetailDialogPage .this ::addDataSetToList );
353
+ dataSetList .setSelectedValue (datasets .get (0 ), true );
343
354
}
344
- });
345
- }
355
+ }
356
+
357
+ @ Override
358
+ public void allFinished (FinishStatus finishStatus ) {
359
+ scanButton .setEnabled (true );
360
+ updateButtonEnablement ();
361
+ }
362
+ });
346
363
}
347
364
348
365
@@ -457,11 +474,18 @@ public DetailPanel getDetailPanel() {
457
474
458
475
private class DataSetList extends JList <DataSetListItem > {
459
476
477
+ private boolean isDragging ;
478
+
460
479
@ Inject
461
480
public DataSetList (ListModel <DataSetListItem > model ) {
462
481
setModel (model );
463
482
setCellRenderer (new CellRenderer ());
464
483
setSelectionMode (ListSelectionModel .SINGLE_INTERVAL_SELECTION );
484
+ setDropMode (DropMode .ON );
485
+ setTransferHandler (new ResolverTaskTransferHandler ());
486
+ try {
487
+ getDropTarget ().addDropTargetListener (getDropTargetListener ());
488
+ } catch (TooManyListenersException e ) { /* do nothing */ }
465
489
}
466
490
467
491
private class CellRenderer implements ListCellRenderer <DataSetListItem > {
@@ -470,8 +494,8 @@ private class CellRenderer implements ListCellRenderer<DataSetListItem> {
470
494
public Component getListCellRendererComponent (JList <? extends DataSetListItem > list ,
471
495
DataSetListItem listItem , int index , boolean isSelected , boolean cellHasFocus ) {
472
496
473
- Color bgColor = UIManager .getColor (isSelected ? "Table.selectionBackground" : "Table.background" );
474
- Color fgColor = UIManager .getColor (isSelected ? "Table.selectionForeground" : "Table.foreground" );
497
+ Color bgColor = UIManager .getColor (isSelected | isDragging ? "Table.selectionBackground" : "Table.background" );
498
+ Color fgColor = UIManager .getColor (isSelected ? "Table.selectionForeground" : "Table.foreground" );
475
499
476
500
DetailPanel detail = listItem .getDetailPanel ();
477
501
JLabel iconLabel = new JLabel (" " + detail .getIcon () + " " );
@@ -486,7 +510,6 @@ public Component getListCellRendererComponent(JList<? extends DataSetListItem> l
486
510
JPanel panel = new JPanel (new BorderLayout ());
487
511
panel .add (iconLabel , BorderLayout .WEST );
488
512
panel .add (titleLabel , BorderLayout .CENTER );
489
-
490
513
panel .setBackground (bgColor );
491
514
492
515
Border emptyBorder = BorderFactory .createEmptyBorder (2 , 4 , 2 , 4 );
@@ -495,6 +518,65 @@ public Component getListCellRendererComponent(JList<? extends DataSetListItem> l
495
518
return panel ;
496
519
}
497
520
}
521
+
522
+ private DropTargetListener getDropTargetListener () {
523
+ return new DropTargetAdapter () {
524
+ Color normalColor = getBackground ();
525
+ Color dragColor = UIManager .getColor ("Table.selectionBackground" );
526
+
527
+ public void dragEnter (DropTargetDragEvent e ) {
528
+ isDragging = true ;
529
+ setBackground (dragColor );
530
+ }
531
+ public void dragExit (DropTargetEvent e ) {
532
+ isDragging = false ;
533
+ setBackground (normalColor );
534
+ }
535
+ public void drop (DropTargetDropEvent e ) {
536
+ isDragging = false ;
537
+ setBackground (normalColor );
538
+ }
539
+ };
540
+ }
541
+ }
542
+
543
+
544
+ private class ResolverTaskTransferHandler extends TransferHandler {
545
+
546
+ @ Override
547
+ public boolean canImport (TransferSupport support ) {
548
+ if (!support .isDrop ())
549
+ return false ;
550
+ if (!support .isDataFlavorSupported (DataFlavor .javaFileListFlavor ))
551
+ return false ;
552
+ boolean copySupported = (COPY & support .getSourceDropActions ()) == COPY ;
553
+ if (!copySupported )
554
+ return false ;
555
+ return true ;
556
+ }
557
+
558
+ @ Override
559
+ public boolean importData (TransferSupport support ) {
560
+ if (!canImport (support ))
561
+ return false ;
562
+
563
+ Object transferData ;
564
+ try {
565
+ transferData = support .getTransferable ().getTransferData (DataFlavor .javaFileListFlavor );
566
+ } catch (UnsupportedFlavorException | IOException e ) {
567
+ e .printStackTrace ();
568
+ return false ;
569
+ }
570
+
571
+ if (transferData instanceof List ) {
572
+ @ SuppressWarnings ("unchecked" )
573
+ List <File > fileList = (List <File >) transferData ;
574
+ runResolverTask (fileList );
575
+ return true ;
576
+ }
577
+ return false ;
578
+ }
579
+
498
580
}
499
581
500
582
}
0 commit comments