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