1 package net.mograsim.logic.model.editor.states;
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.widgets.Display;
6 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
7 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer;
8 import net.mograsim.logic.model.editor.Editor;
9 import net.mograsim.logic.model.editor.Selection;
10 import net.mograsim.logic.model.editor.handles.Handle;
11 import net.mograsim.logic.model.editor.handles.PinHandle;
12 import net.mograsim.logic.model.editor.handles.WireHandle;
13 import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo;
14 import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo;
15 import net.mograsim.logic.model.editor.ui.DialogManager.InteractiveDialog;
16 import net.mograsim.logic.model.model.wires.MovablePin;
17 import net.mograsim.logic.model.model.wires.Pin;
19 public class SelectionState extends EditorState
21 private final ZoomedRenderer outlineRenderer = gc ->
23 if (editor.getSelection().size() > 1)
26 gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW));
27 gc.drawRectangle(editor.getSelection().getBounds());
31 public SelectionState(Editor editor, StateManager manager)
33 super(editor, manager);
39 Point curserPos = editor.userInput.getWorldMousePosition();
40 editor.addComponent(curserPos.x, curserPos.y);
46 editor.deleteSelection();
58 Point curserPos = editor.userInput.getWorldMousePosition();
59 editor.paste(curserPos.x, curserPos.y);
63 public void duplicate()
71 if (!editor.getSelection().isEmpty())
72 manager.setState(new GrabState(editor, manager));
76 public void boxSelect()
78 manager.setState(new BoxSelectionState(editor, manager));
84 editor.gui.logicCanvas.addZoomedRenderer(outlineRenderer);
85 editor.gui.logicCanvas.redrawThreadsafe();
91 editor.gui.logicCanvas.removeZoomedRenderer(outlineRenderer);
92 editor.gui.logicCanvas.redrawThreadsafe();
96 public void clickedEmpty(Point clicked, int stateMask)
98 editor.getSelection().clear();
99 if ((stateMask & SWT.ALT) == SWT.ALT)
101 InteractiveDialog pinAdd = new InteractiveDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width");
103 if (pinAdd.getState().equals(InteractiveDialog.InteractiveDialogState.ACCEPTED))
107 Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.toBeEdited, pinAdd.getText(),
108 Integer.parseInt(pinAdd.getText(1)), clicked.x, clicked.y));
109 editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y);
110 } catch (NumberFormatException e)
112 editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!");
119 public boolean clickedHandle(HandleClickInfo handleClickInfo)
121 switch (handleClickInfo.clicked.getType())
124 if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
126 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
132 boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
133 select(handleClickInfo.clicked, additive);
136 if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
137 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
142 if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
144 WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo;
145 WireHandle clicked = (WireHandle) info.clicked;
146 clicked.parent.insertPathPoint(info.posOnWire, info.segment);
149 additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
150 select(handleClickInfo.clicked, additive);
159 private void select(Handle h, boolean additive)
161 Selection sel = editor.getSelection();
167 if (editor.getSelection().size() > 1)