Palette browser - fix bug when dragging several blocks
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / palette / listener / PaletteDragGestureListener.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2015 - Marcos CARDINOT
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 package org.scilab.modules.xcos.palette.listener;
14
15 import java.awt.Point;
16 import java.awt.datatransfer.Transferable;
17 import java.awt.dnd.DragGestureEvent;
18 import java.awt.dnd.DragGestureListener;
19 import java.awt.dnd.InvalidDnDOperationException;
20
21 import org.scilab.modules.gui.messagebox.ScilabModalDialog;
22 import org.scilab.modules.gui.messagebox.ScilabModalDialog.IconType;
23 import org.scilab.modules.xcos.palette.PaletteBlockCtrl;
24 import org.scilab.modules.xcos.palette.PaletteCtrl;
25 import org.scilab.modules.xcos.palette.view.PaletteBlockView;
26 import org.scilab.modules.xcos.palette.view.PaletteManagerView;
27 import org.scilab.modules.xcos.utils.XcosMessages;
28
29 /**
30  * Install the handler for dragging nodes into a graph.
31  * @author Marcos CARDINOT <mcardinot@gmail.com>
32  */
33 public final class PaletteDragGestureListener implements DragGestureListener {
34
35     /**
36      * Default constructor
37      */
38     public PaletteDragGestureListener() {
39     }
40
41     /**
42      * @param e The associated event
43      */
44     @Override
45     public void dragGestureRecognized(DragGestureEvent e) {
46         PaletteBlockCtrl blockCtrl = ((PaletteBlockView) e.getComponent()).getController();
47         PaletteCtrl paletteCtrl = blockCtrl.getPaletteCtrl();
48
49         if (paletteCtrl == null) {
50             return;
51         }
52
53         if (!blockCtrl.isSelected()) {
54             PaletteCtrl.clearSelections();
55         }
56         blockCtrl.setSelected(true);
57
58         if (PaletteManagerView.get() == null) {
59             PaletteManagerView.restore(null);
60         }
61         final PaletteManagerView winView = PaletteManagerView.get();
62
63         winView.setInfo(XcosMessages.LOADING_BLOCKS);
64         try {
65             Transferable transfer = paletteCtrl.getTransferable();
66             if (transfer != null) {
67                 e.startDrag(null, null, new Point(), transfer, null);
68             }
69         } catch (InvalidDnDOperationException exception) {
70             ScilabModalDialog.show(winView, XcosMessages.UNABLE_TO_LOAD_SELECTED_BLOCKS,
71                                    XcosMessages.XCOS_ERROR, IconType.ERROR_ICON);
72         } finally {
73             winView.setInfo(XcosMessages.EMPTY_INFO);
74         }
75     }
76 }