Merge remote-tracking branch 'origin/development' into development
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / states / SelectionState.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.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;
16 import net.mograsim.logic.model.model.wires.MovablePin;
17 import net.mograsim.logic.model.model.wires.Pin;
18
19 public class SelectionState extends EditorState
20 {
21         private final ZoomedRenderer outlineRenderer = gc ->
22         {
23                 if (editor.getSelection().size() > 1)
24                 {
25                         gc.setLineWidth(1);
26                         gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW));
27                         gc.drawRectangle(editor.getSelection().getBounds());
28                 }
29         };
30
31         public SelectionState(Editor editor, StateManager manager)
32         {
33                 super(editor, manager);
34         }
35
36         @Override
37         public void add()
38         {
39                 Point curserPos = editor.userInput.getWorldMousePosition();
40                 editor.addComponent(curserPos.x, curserPos.y);
41         }
42
43         @Override
44         public void delete()
45         {
46                 editor.deleteSelection();
47         }
48
49         @Override
50         public void copy()
51         {
52                 editor.copy();
53         }
54
55         @Override
56         public void paste()
57         {
58                 Point curserPos = editor.userInput.getWorldMousePosition();
59                 editor.paste(curserPos.x, curserPos.y);
60         }
61
62         @Override
63         public void duplicate()
64         {
65                 editor.duplicate();
66         }
67
68         @Override
69         public void grab()
70         {
71                 if (!editor.getSelection().isEmpty())
72                         manager.setState(new GrabState(editor, manager));
73         }
74
75         @Override
76         public void boxSelect()
77         {
78                 manager.setState(new BoxSelectionState(editor, manager));
79         }
80
81         @Override
82         public void onEntry()
83         {
84                 editor.gui.logicCanvas.addZoomedRenderer(outlineRenderer);
85                 editor.gui.logicCanvas.redrawThreadsafe();
86         }
87
88         @Override
89         public void onExit()
90         {
91                 editor.gui.logicCanvas.removeZoomedRenderer(outlineRenderer);
92                 editor.gui.logicCanvas.redrawThreadsafe();
93         }
94
95         @Override
96         public void clickedEmpty(Point clicked, int stateMask)
97         {
98                 editor.getSelection().clear();
99                 if ((stateMask & SWT.ALT) == SWT.ALT)
100                 {
101                         String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width");
102                         if (result != null)
103                         {
104                                 try
105                                 {
106                                         Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.toBeEdited, result[0],
107                                                         Integer.parseInt(result[1]), clicked.x, clicked.y));
108                                         editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y);
109                                 } catch (NumberFormatException e)
110                                 {
111                                         editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!");
112                                 }
113                         }
114                 }
115         }
116
117         @Override
118         public boolean clickedHandle(HandleClickInfo handleClickInfo)
119         {
120                 switch (handleClickInfo.clicked.getType())
121                 {
122                 case INTERFACE_PIN:
123                         if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
124                         {
125                                 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
126                                 break;
127                         }
128                 case CORNER:
129                 case COMPONENT:
130                 case WIRE_POINT:
131                         boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
132                         select(handleClickInfo.clicked, additive);
133                         break;
134                 case STATIC_PIN:
135                         if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
136                                 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
137                         else
138                                 return false;
139                         break;
140                 case WIRE:
141                         if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
142                         {
143                                 WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo;
144                                 WireHandle clicked = (WireHandle) info.clicked;
145                                 clicked.parent.insertPathPoint(info.posOnWire, info.segment);
146                         } else
147                         {
148                                 additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
149                                 select(handleClickInfo.clicked, additive);
150                         }
151                         break;
152                 default:
153                         return false;
154                 }
155                 return true;
156         }
157
158         private void select(Handle h, boolean additive)
159         {
160                 Selection sel = editor.getSelection();
161                 if (sel.contains(h))
162                         if (additive)
163                                 sel.remove(h);
164                         else
165                         {
166                                 if (editor.getSelection().size() > 1)
167                                 {
168                                         sel.clear();
169                                         sel.add(h);
170                                 } else
171                                         sel.clear();
172                         }
173                 else
174                 {
175                         if (!additive)
176                                 sel.clear();
177                         sel.add(h);
178                 }
179         }
180 }