--- /dev/null
+package net.mograsim.logic.model.editor.states;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer;
+import net.mograsim.logic.model.editor.Editor;
+import net.mograsim.logic.model.editor.Selection;
+import net.mograsim.logic.model.editor.handles.Handle;
+
+public class BoxSelectionState extends EditorState
+{
+ private Point origin;
+ private double mX, mY;
+
+ private final ZoomedRenderer boxRenderer = gc ->
+ {
+ if (origin != null)
+ {
+ gc.setLineWidth(0.5);
+ gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW));
+ gc.drawRectangle(origin.x, origin.y, mX - origin.x, mY - origin.y);
+ }
+ };
+
+ public BoxSelectionState(Editor editor, StateManager manager)
+ {
+ super(editor, manager);
+ }
+
+ @Override
+ public void onEntry()
+ {
+ editor.gui.logicCanvas.addZoomedRenderer(boxRenderer);
+ editor.gui.logicCanvas.redrawThreadsafe();
+ }
+
+ @Override
+ public void onExit()
+ {
+ editor.gui.logicCanvas.removeZoomedRenderer(boxRenderer);
+ editor.gui.logicCanvas.redrawThreadsafe();
+ }
+
+ @Override
+ public void boxSelect()
+ {
+ manager.setState(new SelectionState(editor, manager));
+ }
+
+ @Override
+ public void clicked(Point clicked, int stateMask)
+ {
+ if (origin == null)
+ {
+ origin = new Point(clicked.x, clicked.y);
+ mX = clicked.x;
+ mY = clicked.y;
+ } else
+ {
+ Selection s = editor.getSelection();
+ s.clear();
+ boolean leftToRight = mX > origin.x, topToBottom = mY > origin.y;
+ double x = leftToRight ? origin.x : mX, y = topToBottom ? origin.y : mY,
+ width = leftToRight ? mX - origin.x : origin.x - mX,
+ height = topToBottom ? mY - origin.y : origin.y - mY;
+
+ Rectangle selected = new Rectangle(x, y, width, height);
+ for (Handle h : editor.handleManager.getHandles())
+ {
+ Rectangle hBounds = h.getBounds();
+ if (selected.contains(hBounds.x, hBounds.y)
+ && selected.contains(hBounds.x + hBounds.width, hBounds.y + hBounds.height))
+ {
+ s.add(h);
+ }
+ }
+ manager.setState(new SelectionState(editor, manager));
+ }
+ }
+
+ @Override
+ public void mouseMoved(double x, double y)
+ {
+ mX = x;
+ mY = y;
+ editor.gui.logicCanvas.redrawThreadsafe();
+ }
+}