13
13
import java .awt .dnd .DropTargetDropEvent ;
14
14
import java .awt .dnd .DropTargetEvent ;
15
15
import java .awt .dnd .DropTargetListener ;
16
+ import java .awt .event .MouseAdapter ;
17
+ import java .awt .event .MouseEvent ;
18
+ import java .awt .event .MouseListener ;
16
19
import java .io .File ;
17
20
import java .io .IOException ;
18
21
import java .util .ArrayList ;
34
37
import javax .swing .JFrame ;
35
38
import javax .swing .JLabel ;
36
39
import javax .swing .JList ;
40
+ import javax .swing .JMenuItem ;
37
41
import javax .swing .JOptionPane ;
38
42
import javax .swing .JPanel ;
43
+ import javax .swing .JPopupMenu ;
39
44
import javax .swing .JScrollPane ;
40
45
import javax .swing .JSplitPane ;
41
46
import javax .swing .LayoutStyle ;
@@ -294,6 +299,31 @@ private void deleteSelectedItems() {
294
299
}
295
300
}
296
301
302
+ private void moveItemUp () {
303
+ int index = dataSetList .getSelectedIndex ();
304
+ // can't move "common files" or top data set
305
+ if (index >= 2 ) {
306
+ swap (index , index - 1 );
307
+ }
308
+ }
309
+
310
+ private void moveItemDown () {
311
+ int index = dataSetList .getSelectedIndex ();
312
+ if (index != 0 && index != dataSetListModel .getSize () - 1 ) {
313
+ swap (index , index + 1 );
314
+ }
315
+ }
316
+
317
+ private void swap (int a , int b ) {
318
+ DataSetListItem itemA = dataSetListModel .getElementAt (a );
319
+ DataSetListItem itemB = dataSetListModel .getElementAt (b );
320
+ dataSetListModel .set (a , itemB );
321
+ dataSetListModel .set (b , itemA );
322
+ dataSetList .setSelectedIndex (b );
323
+ dataSetList .ensureIndexIsVisible (b );
324
+ }
325
+
326
+
297
327
private void selectItem (DataSetListItem params ) {
298
328
cardLayout .show (dataSetDetailPanel , params == null ? "nothing" : params .id );
299
329
dataSetDetailPanel .revalidate ();
@@ -499,6 +529,7 @@ public DataSetList(ListModel<DataSetListItem> model) {
499
529
setSelectionMode (ListSelectionModel .SINGLE_INTERVAL_SELECTION );
500
530
setDropMode (DropMode .ON );
501
531
setTransferHandler (new ResolverTaskTransferHandler ());
532
+ addMouseListener (getContextMenuMouseListener ());
502
533
try {
503
534
getDropTarget ().addDropTargetListener (getDropTargetListener ());
504
535
} catch (TooManyListenersException e ) { /* do nothing */ }
@@ -535,6 +566,45 @@ public Component getListCellRendererComponent(JList<? extends DataSetListItem> l
535
566
}
536
567
}
537
568
569
+
570
+ private MouseListener getContextMenuMouseListener () {
571
+ return new MouseAdapter () {
572
+ @ Override public void mousePressed (MouseEvent e ) {
573
+ showContextMenu (e );
574
+ }
575
+ @ Override public void mouseReleased (MouseEvent e ) {
576
+ showContextMenu (e );
577
+ }
578
+ private void showContextMenu (MouseEvent e ) {
579
+ if (!e .isPopupTrigger ())
580
+ return ;
581
+
582
+ int index = locationToIndex (e .getPoint ());
583
+ if (index != -1 && getCellBounds (index ,index ).contains (e .getPoint ())) {
584
+ setSelectedIndex (index );
585
+
586
+ JMenuItem deleteItem = new JMenuItem ("Delete" );
587
+ deleteItem .addActionListener (ae -> deleteSelectedItems ());
588
+ JMenuItem upItem = new JMenuItem ("Move Up" );
589
+ upItem .addActionListener (ae -> moveItemUp ());
590
+ JMenuItem downItem = new JMenuItem ("Move Down" );
591
+ downItem .addActionListener (ae -> moveItemDown ());
592
+
593
+ deleteItem .setEnabled (index > 0 );
594
+ upItem .setEnabled (index > 1 );
595
+ downItem .setEnabled (index != 0 && index != getModel ().getSize ()-1 );
596
+
597
+ JPopupMenu menu = new JPopupMenu ();
598
+ menu .add (upItem );
599
+ menu .add (downItem );
600
+ menu .addSeparator ();
601
+ menu .add (deleteItem );
602
+ menu .show (DataSetList .this , e .getX (), e .getY ());
603
+ }
604
+ }
605
+ };
606
+ }
607
+
538
608
private DropTargetListener getDropTargetListener () {
539
609
return new DropTargetAdapter () {
540
610
Color normalColor = getBackground ();
@@ -554,6 +624,7 @@ public void drop(DropTargetDropEvent e) {
554
624
}
555
625
};
556
626
}
627
+
557
628
}
558
629
559
630
0 commit comments