Palette DnD - fix bug when the user holds the left mouse button
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / palette / PaletteBlockCtrl.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Clement DAVID
4  * Copyright (C) 2011-2015 - Scilab Enterprises - Clement DAVID
5  * Copyright (C) 2015 - Marcos CARDINOT
6  *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17
18 package org.scilab.modules.xcos.palette;
19
20 import java.awt.dnd.DnDConstants;
21 import java.awt.dnd.DragGestureListener;
22 import java.awt.dnd.DragSource;
23 import java.awt.event.KeyListener;
24 import java.awt.event.MouseListener;
25
26 import org.scilab.modules.xcos.block.BasicBlock;
27 import org.scilab.modules.xcos.palette.listener.PaletteBlockKeyListener;
28 import org.scilab.modules.xcos.palette.listener.PaletteBlockMouseListener;
29 import org.scilab.modules.xcos.palette.listener.PaletteDragGestureListener;
30 import org.scilab.modules.xcos.palette.model.PaletteBlock;
31 import org.scilab.modules.xcos.palette.view.PaletteBlockView;
32 import org.scilab.modules.xcos.palette.view.PaletteBlockView.StatusUI;
33 import org.scilab.modules.xcos.palette.view.PaletteManagerView;
34
35 import com.mxgraph.swing.util.mxGraphTransferable;
36 import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement;
37
38 /**
39  * A palette block is the representation of the block in the palette.
40  * @author Marcos CARDINOT <mcardinot@gmail.com>
41  * @author Clement DAVID
42  */
43 public final class PaletteBlockCtrl {
44
45     private static final DragGestureListener DRAG_LISTENER = new PaletteDragGestureListener();
46     private static final KeyListener KEY_LISTENER = new PaletteBlockKeyListener();
47     private static final MouseListener MOUSE_LISTENER = new PaletteBlockMouseListener();
48
49     private final PaletteCtrl paletteCtrl;
50     private final PaletteBlock model;
51     private final PaletteBlockView view;
52     private BasicBlock basicBlock;
53     private boolean isSelected;
54
55     /**
56      * Default constructor
57      * @param ctrl The palette in which it belongs
58      * @param model the block data
59      */
60     public PaletteBlockCtrl(PaletteCtrl ctrl, PaletteBlock model) {
61         this.paletteCtrl = ctrl;
62         this.model = model;
63         this.view = new PaletteBlockView(this);
64         this.isSelected = false;
65         this.basicBlock = null;
66
67         // add block to its parent palette
68         this.paletteCtrl.addBlock(this);
69
70         // install listeners
71         this.view.setFocusTraversalKeysEnabled(false);
72         this.view.addKeyListener(KEY_LISTENER);
73         this.view.addMouseListener(MOUSE_LISTENER);
74
75         DragSource dragSource = DragSource.getDefaultDragSource();
76         dragSource.createDefaultDragGestureRecognizer(this.getView(),
77                 DnDConstants.ACTION_COPY_OR_MOVE, DRAG_LISTENER);
78     }
79
80     /**
81      * @return true if it is selected, false otherwise
82      */
83     public boolean isSelected() {
84         return isSelected;
85     }
86
87     /**
88      * @param selected The selected state to set
89      */
90     public void setSelected(boolean selected) {
91         if (selected) {
92             getView().requestFocus();
93             getView().setStatusUI(StatusUI.SELECTED);
94         } else {
95             PaletteManagerView.get().getPanel().requestFocus();
96             getView().setStatusUI(StatusUI.NON_SELECTED);
97         }
98         isSelected = selected;
99     }
100
101     /**
102      * @return the parent palette (PaletteCtrl)
103      */
104     public PaletteCtrl getPaletteCtrl() {
105         return paletteCtrl;
106     }
107
108     /**
109      * @return the view
110      */
111     public PaletteBlockView getView() {
112         return view;
113     }
114
115     /**
116      * @return the model
117      */
118     public PaletteBlock getModel() {
119         return model;
120     }
121
122     /**
123      * Get the loaded block.
124      * @return basicblock
125      */
126     public BasicBlock getBlock() {
127         if (basicBlock == null) {
128             basicBlock = (BasicBlock) ((mxGraphTransferable) paletteCtrl.getTransferable()).getCells()[0];
129         }
130         return basicBlock;
131     }
132 }