Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / states / BoxSelectionState.java
1 package net.mograsim.logic.model.editor.states;
2
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.widgets.Display;
5
6 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
7 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
8 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer;
9 import net.mograsim.logic.model.editor.Editor;
10 import net.mograsim.logic.model.editor.Selection;
11 import net.mograsim.logic.model.editor.handles.Handle;
12
13 public class BoxSelectionState extends EditorState
14 {
15         private Point origin;
16         private double mX, mY;
17
18         private final ZoomedRenderer boxRenderer = gc ->
19         {
20                 if (origin != null)
21                 {
22                         gc.setLineWidth(0.5);
23                         gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW));
24                         gc.drawRectangle(origin.x, origin.y, mX - origin.x, mY - origin.y);
25                 }
26         };
27
28         public BoxSelectionState(Editor editor, StateManager manager)
29         {
30                 super(editor, manager);
31         }
32
33         @Override
34         public void onEntry()
35         {
36                 editor.gui.logicCanvas.addZoomedRenderer(boxRenderer);
37                 editor.gui.logicCanvas.redrawThreadsafe();
38         }
39
40         @Override
41         public void onExit()
42         {
43                 editor.gui.logicCanvas.removeZoomedRenderer(boxRenderer);
44                 editor.gui.logicCanvas.redrawThreadsafe();
45         }
46
47         @Override
48         public void boxSelect()
49         {
50                 manager.setState(new SelectionState(editor, manager));
51         }
52
53         @Override
54         public void clicked(Point clicked, int stateMask)
55         {
56                 if (origin == null)
57                 {
58                         origin = new Point(clicked.x, clicked.y);
59                         mX = clicked.x;
60                         mY = clicked.y;
61                 } else
62                 {
63                         Selection s = editor.getSelection();
64                         s.clear();
65                         boolean leftToRight = mX > origin.x, topToBottom = mY > origin.y;
66                         double x = leftToRight ? origin.x : mX, y = topToBottom ? origin.y : mY, width = leftToRight ? mX - origin.x : origin.x - mX,
67                                         height = topToBottom ? mY - origin.y : origin.y - mY;
68
69                         Rectangle selected = new Rectangle(x, y, width, height);
70                         for (Handle h : editor.handleManager.getHandles())
71                         {
72                                 Rectangle hBounds = h.getBounds();
73                                 if (selected.contains(hBounds.x, hBounds.y) && selected.contains(hBounds.x + hBounds.width, hBounds.y + hBounds.height))
74                                 {
75                                         s.add(h);
76                                 }
77                         }
78                         manager.setState(new SelectionState(editor, manager));
79                 }
80         }
81
82         @Override
83         public void mouseMoved(double x, double y)
84         {
85                 mX = x;
86                 mY = y;
87                 editor.gui.logicCanvas.redrawThreadsafe();
88         }
89 }