Palette browser - fix bug when adding several blocks by ENTER
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / palette / listener / PaletteMouseListener.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.Component;
16 import java.awt.Point;
17 import java.awt.Rectangle;
18 import java.awt.event.MouseAdapter;
19 import java.awt.event.MouseEvent;
20 import java.awt.geom.Rectangle2D;
21
22 import javax.swing.SwingUtilities;
23
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.PaletteView;
27
28 /**
29  * Implement the default mouse listener for the palette view
30  * @author Marcos CARDINOT <mcardinot@gmail.com>
31  */
32 public final class PaletteMouseListener extends MouseAdapter {
33
34     private Point startPoint;
35
36     /** Default constructor */
37     public PaletteMouseListener() {
38         super();
39     }
40
41     /**
42      * Clear selections when palette view is clicked
43      * @param e MouseEvent
44      */
45     @Override
46     public void mouseClicked(MouseEvent e) {
47         super.mouseClicked(e);
48         PaletteCtrl.clearSelections();
49     }
50
51     /**
52      * Invoked when the mouse is pressed
53      * @param e MouseEvent
54      */
55     @Override
56     public void mousePressed(MouseEvent e) {
57         super.mousePressed(e);
58         this.startPoint = e.getPoint();
59     }
60
61     /**
62      * Select blocks by dragging the mouse pointer
63      * @param e MouseEvent
64      */
65     @Override
66     public void mouseDragged(MouseEvent e) {
67         super.mouseDragged(e);
68         if (!SwingUtilities.isLeftMouseButton(e)) {
69             return;
70         }
71
72         Point endPoint = e.getPoint();
73         double x = Math.min(startPoint.getX(), endPoint.getX());
74         double y = Math.min(startPoint.getY(), endPoint.getY());
75         double w = Math.abs(startPoint.getX() - endPoint.getX());
76         double h = Math.abs(startPoint.getY() - endPoint.getY());
77
78         Rectangle2D.Double rect = new Rectangle2D.Double(x, y, w, h);
79         PaletteView view = (PaletteView) e.getSource();
80         view.setSelectionRectangle(rect);
81
82         Component[] blocks = view.getComponents();
83         for (Component block : blocks) {
84             Rectangle b = block.getBounds();
85             boolean selected = rect.contains(b.getCenterX(), b.getCenterY());
86             ((PaletteBlockView) block).getController().setSelected(selected);
87         }
88
89         // makes the scrollbar follow the selection
90         view.scrollRectToVisible(new Rectangle(endPoint));
91     }
92
93     /**
94      * @param e MouseEvent
95      */
96     @Override
97     public void mouseReleased(MouseEvent e) {
98         super.mouseReleased(e);
99         PaletteView view = (PaletteView) e.getSource();
100         view.setSelectionRectangle(null);
101         Component[] blocks = view.getComponents();
102         if (blocks.length > 0) {
103             blocks[0].requestFocus();
104         }
105     }
106 }