Merge branch 'development' of
[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.DialogManager.InteractiveDialog;
11 import net.mograsim.logic.model.editor.handles.Handle;
12 import net.mograsim.logic.model.editor.handles.PinHandle;
13 import net.mograsim.logic.model.editor.handles.WireHandle;
14 import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo;
15 import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo;
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.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.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                         InteractiveDialog pinAdd = new InteractiveDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width");
102                         pinAdd.open();
103                         if (pinAdd.getState().equals(InteractiveDialog.InteractiveDialogState.ACCEPTED))
104                         {
105                                 try
106                                 {
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)
111                                 {
112                                         editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!");
113                                 }
114                         }
115                 }
116         }
117
118         @Override
119         public boolean clickedHandle(HandleClickInfo handleClickInfo)
120         {
121                 switch (handleClickInfo.clicked.getType())
122                 {
123                 case INTERFACE_PIN:
124                         if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
125                         {
126                                 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
127                                 break;
128                         }
129                 case CORNER:
130                 case COMPONENT:
131                 case WIRE_POINT:
132                         boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
133                         select(handleClickInfo.clicked, additive);
134                         break;
135                 case STATIC_PIN:
136                         if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
137                                 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
138                         else
139                                 return false;
140                         break;
141                 case WIRE:
142                         if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
143                         {
144                                 WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo;
145                                 WireHandle clicked = (WireHandle) info.clicked;
146                                 clicked.parent.insertPathPoint(info.posOnWire, info.segment);
147                         } else
148                         {
149                                 additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
150                                 select(handleClickInfo.clicked, additive);
151                         }
152                         break;
153                 default:
154                         return false;
155                 }
156                 return true;
157         }
158
159         private void select(Handle h, boolean additive)
160         {
161                 Selection sel = editor.getSelection();
162                 if (sel.contains(h))
163                         if (additive)
164                                 sel.remove(h);
165                         else
166                         {
167                                 if (editor.getSelection().size() > 1)
168                                 {
169                                         sel.clear();
170                                         sel.add(h);
171                                 } else
172                                         sel.clear();
173                         }
174                 else
175                 {
176                         if (!additive)
177                                 sel.clear();
178                         sel.add(h);
179                 }
180         }
181 }