Merge remote-tracking branch 'origin/development' into development
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / ui / EditorGUI.java
1 package net.mograsim.logic.model.editor.ui;
2
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.events.SelectionEvent;
5 import org.eclipse.swt.events.SelectionListener;
6 import org.eclipse.swt.graphics.Point;
7 import org.eclipse.swt.graphics.Rectangle;
8 import org.eclipse.swt.layout.GridData;
9 import org.eclipse.swt.layout.GridLayout;
10 import org.eclipse.swt.widgets.Display;
11 import org.eclipse.swt.widgets.Event;
12 import org.eclipse.swt.widgets.List;
13 import org.eclipse.swt.widgets.Listener;
14 import org.eclipse.swt.widgets.Menu;
15 import org.eclipse.swt.widgets.MenuItem;
16 import org.eclipse.swt.widgets.Shell;
17 import org.eclipse.swt.widgets.ToolBar;
18 import org.eclipse.swt.widgets.ToolItem;
19
20 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay;
21 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
22 import net.mograsim.logic.model.editor.Editor;
23 import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
24
25 public class EditorGUI
26 {
27         public final Display display;
28         public final Shell shell;
29         public final EditorCanvas logicCanvas;
30         private final List addList;
31         private final Editor editor;
32
33         public EditorGUI(Editor editor)
34         {
35                 this.editor = editor;
36                 display = Display.getDefault();
37                 shell = new Shell(display);
38
39                 // Layout
40                 GridLayout layout = new GridLayout();
41                 shell.setLayout(layout);
42                 layout.numColumns = 2;
43
44                 GridData d = new GridData();
45                 d.grabExcessVerticalSpace = true;
46                 d.verticalAlignment = SWT.FILL;
47                 d.verticalSpan = 2;
48                 addList = new List(shell, SWT.V_SCROLL);
49                 addList.setLayoutData(d);
50                 refreshAddList();
51
52                 d = new GridData();
53                 d.grabExcessHorizontalSpace = true;
54                 d.horizontalAlignment = SWT.FILL;
55                 d.grabExcessVerticalSpace = true;
56                 d.verticalAlignment = SWT.FILL;
57
58                 logicCanvas = new EditorCanvas(shell, SWT.TRAIL, editor);
59                 logicCanvas.setLayoutData(d);
60
61                 setupToolBar();
62
63                 ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas);
64                 userInput.buttonDrag = 3;
65                 userInput.buttonZoom = 2;
66                 userInput.enableUserInput();
67                 new ZoomableCanvasOverlay(logicCanvas, null).enableScale();
68         }
69
70         private ToolBar setupToolBar()
71         {
72                 GridData d = new GridData();
73                 d.grabExcessHorizontalSpace = true;
74                 d.horizontalAlignment = SWT.FILL;
75
76                 ToolBar toolBar = new ToolBar(shell, SWT.BORDER);
77                 toolBar.setLayoutData(d);
78
79                 ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE);
80                 snappingLabel.setText("Snapping:");
81                 
82                 Menu menu = new Menu(shell, SWT.POP_UP);
83                 ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN);
84                 for (Editor.Snapping sn : Editor.Snapping.values())
85                 {
86                         MenuItem item = new MenuItem(menu, SWT.PUSH);
87                         item.addSelectionListener(new SelectionListener()
88                         {
89                                 @Override
90                                 public void widgetSelected(SelectionEvent arg0)
91                                 {
92                                         editor.setSnapping(sn);
93                                         snappSelect.setText(sn.toString());
94                                 }
95                                 
96                                 @Override
97                                 public void widgetDefaultSelected(SelectionEvent arg0) {}
98                         });
99                         item.setText(sn.toString());
100                 }
101                 
102                 snappSelect.setText(editor.getSnapping().toString());
103                 snappSelect.addListener(SWT.Selection, new Listener()
104                 {
105                         public void handleEvent(Event event)
106                         {
107                                 if (event.detail == SWT.ARROW)
108                                 {
109                                         Rectangle rect = snappSelect.getBounds();
110                                         Point pt = new Point(rect.x, rect.y + rect.height);
111                                         pt = toolBar.toDisplay(pt);
112                                         menu.setLocation(pt.x, pt.y);
113                                         menu.setVisible(true);
114                                 }
115                         }
116                 });
117                 
118                 new ToolItem(toolBar, SWT.SEPARATOR);
119                 
120                 toolBar.pack();
121
122                 return toolBar;
123         }
124
125         public void refreshAddList()
126         {
127                 addList.setItems(IndirectGUIComponentCreator.getStandardComponentIDs().toArray(String[]::new));
128                 addList.select(0);
129         }
130
131         public String getAddListSelected()
132         {
133                 String[] selection = addList.getSelection();
134                 if (selection.length == 0)
135                         throw new IllegalStateException("Selection in the Add Component List may never be empty!");
136                 return selection[0];
137         }
138
139         public void open()
140         {
141                 shell.open();
142                 while (!shell.isDisposed())
143                         if (!display.readAndDispatch())
144                                 display.sleep();
145         }
146
147 }