1 package net.mograsim.logic.model.editor.ui;
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;
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;
25 public class EditorGUI
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;
33 public EditorGUI(Editor editor)
36 display = Display.getDefault();
37 shell = new Shell(display);
40 GridLayout layout = new GridLayout();
41 shell.setLayout(layout);
42 layout.numColumns = 2;
44 GridData d = new GridData();
45 d.grabExcessVerticalSpace = true;
46 d.verticalAlignment = SWT.FILL;
48 addList = new List(shell, SWT.V_SCROLL);
49 addList.setLayoutData(d);
53 d.grabExcessHorizontalSpace = true;
54 d.horizontalAlignment = SWT.FILL;
55 d.grabExcessVerticalSpace = true;
56 d.verticalAlignment = SWT.FILL;
58 logicCanvas = new EditorCanvas(shell, SWT.TRAIL, editor);
59 logicCanvas.setLayoutData(d);
63 ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas);
64 userInput.buttonDrag = 3;
65 userInput.buttonZoom = 2;
66 userInput.enableUserInput();
67 new ZoomableCanvasOverlay(logicCanvas, null).enableScale();
70 private ToolBar setupToolBar()
72 GridData d = new GridData();
73 d.grabExcessHorizontalSpace = true;
74 d.horizontalAlignment = SWT.FILL;
76 ToolBar toolBar = new ToolBar(shell, SWT.BORDER);
77 toolBar.setLayoutData(d);
79 ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE);
80 snappingLabel.setText("Snapping:");
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())
86 MenuItem item = new MenuItem(menu, SWT.PUSH);
87 item.addSelectionListener(new SelectionListener()
90 public void widgetSelected(SelectionEvent arg0)
92 editor.setSnapping(sn);
93 snappSelect.setText(sn.toString());
97 public void widgetDefaultSelected(SelectionEvent arg0) {}
99 item.setText(sn.toString());
102 snappSelect.setText(editor.getSnapping().toString());
103 snappSelect.addListener(SWT.Selection, new Listener()
105 public void handleEvent(Event event)
107 if (event.detail == SWT.ARROW)
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);
118 new ToolItem(toolBar, SWT.SEPARATOR);
125 public void refreshAddList()
127 addList.setItems(IndirectGUIComponentCreator.getStandardComponentIDs().toArray(String[]::new));
131 public String getAddListSelected()
133 String[] selection = addList.getSelection();
134 if (selection.length == 0)
135 throw new IllegalStateException("Selection in the Add Component List may never be empty!");
142 while (!shell.isDisposed())
143 if (!display.readAndDispatch())