1 package net.mograsim.logic.model.editor.ui;
3 import static net.mograsim.logic.model.preferences.RenderPreferences.DRAG_BUTTON;
4 import static net.mograsim.logic.model.preferences.RenderPreferences.ZOOM_BUTTON;
6 import java.io.IOException;
8 import org.eclipse.swt.SWT;
9 import org.eclipse.swt.graphics.Point;
10 import org.eclipse.swt.graphics.Rectangle;
11 import org.eclipse.swt.layout.GridData;
12 import org.eclipse.swt.layout.GridLayout;
13 import org.eclipse.swt.widgets.Composite;
14 import org.eclipse.swt.widgets.Display;
15 import org.eclipse.swt.widgets.List;
16 import org.eclipse.swt.widgets.Menu;
17 import org.eclipse.swt.widgets.MenuItem;
18 import org.eclipse.swt.widgets.Shell;
19 import org.eclipse.swt.widgets.ToolBar;
20 import org.eclipse.swt.widgets.ToolItem;
22 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay;
23 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
24 import net.mograsim.logic.model.editor.Editor;
25 import net.mograsim.logic.model.editor.SaveLoadManager;
26 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
28 public class EditorGUI
30 public final Display display;
31 public final Shell shell;
32 public final EditorCanvas logicCanvas;
33 private final List addList;
34 private final Editor editor;
36 public EditorGUI(Editor editor)
39 display = Display.getDefault();
40 shell = new Shell(display);
42 GridLayout layout = new GridLayout();
43 layout.numColumns = 1;
44 shell.setLayout(layout);
46 setupTopToolBar(shell);
47 Composite innerComp = new Composite(shell, SWT.NONE);
48 GridData innerCompData = new GridData();
49 innerCompData.grabExcessHorizontalSpace = true;
50 innerCompData.grabExcessVerticalSpace = true;
51 innerCompData.horizontalAlignment = SWT.FILL;
52 innerCompData.verticalAlignment = SWT.FILL;
53 innerComp.setLayoutData(innerCompData);
55 GridLayout innerLayout = new GridLayout();
56 innerComp.setLayout(innerLayout);
57 innerLayout.numColumns = 2;
59 GridData d = new GridData();
60 d.grabExcessHorizontalSpace = true;
61 d.horizontalAlignment = SWT.FILL;
62 d.grabExcessVerticalSpace = true;
63 d.verticalAlignment = SWT.FILL;
65 logicCanvas = new EditorCanvas(innerComp, SWT.TRAIL, editor);
66 logicCanvas.setLayoutData(d);
69 d.grabExcessVerticalSpace = true;
70 d.verticalAlignment = SWT.FILL;
72 addList = new List(innerComp, SWT.V_SCROLL);
73 addList.setLayoutData(d);
76 setupBottomToolBar(innerComp);
78 ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas);
79 userInput.buttonDrag = editor.renderPrefs.getInt(DRAG_BUTTON);
80 userInput.buttonZoom = editor.renderPrefs.getInt(ZOOM_BUTTON);
81 userInput.enableUserInput();
82 new ZoomableCanvasOverlay(logicCanvas, null).enableScale();
85 private ToolBar setupTopToolBar(Composite parent)
87 GridData d = new GridData();
88 d.grabExcessHorizontalSpace = true;
89 d.horizontalAlignment = SWT.FILL;
91 ToolBar toolBar = new ToolBar(parent, SWT.BORDER);
92 toolBar.setLayoutData(d);
94 ToolItem file = new ToolItem(toolBar, SWT.DROP_DOWN);
97 DropDownEntry newEntry = new DropDownEntry("New", Editor::openNewEditor);
98 DropDownEntry loadEntry = new DropDownEntry("Load", () ->
102 SaveLoadManager.openLoadDialog();
104 catch (IOException e)
106 editor.dialogManager.openWarningDialog("Failed to load Component!", e.getMessage());
109 DropDownEntry saveEntry = new DropDownEntry("Save", editor::save);
110 DropDownEntry saveAsEntry = new DropDownEntry("Save as...", editor::saveAs);
112 DropDownEntry[] entries = new DropDownEntry[] { newEntry, loadEntry, saveEntry, saveAsEntry };
114 setupDrowpDownMenu(file, entries);
116 file.setText("File");
120 @SuppressWarnings("unused") // ToolItem
121 private ToolBar setupBottomToolBar(Composite parent)
123 GridData d = new GridData();
124 d.grabExcessHorizontalSpace = true;
125 d.horizontalAlignment = SWT.FILL;
127 ToolBar toolBar = new ToolBar(parent, SWT.BORDER);
128 toolBar.setLayoutData(d);
130 ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE);
131 snappingLabel.setText("Snapping:");
133 ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN);
134 DropDownEntry[] entries = new DropDownEntry[Editor.Snapping.values().length];
136 for (Editor.Snapping sn : Editor.Snapping.values())
138 entries[index++] = new DropDownEntry(sn.toString(), () ->
140 editor.setSnapping(sn);
141 snappSelect.setText(sn.toString());
144 snappSelect.setText(editor.getSnapping().toString());
145 setupDrowpDownMenu(snappSelect, entries);
147 new ToolItem(toolBar, SWT.SEPARATOR);
154 private void setupDrowpDownMenu(ToolItem parent, DropDownEntry[] entries)
156 Menu menu = new Menu(shell, SWT.POP_UP);
157 for (DropDownEntry entry : entries)
159 MenuItem item = new MenuItem(menu, SWT.PUSH);
160 item.addListener(SWT.Selection, e -> entry.onSelected.run());
161 item.setText(entry.title);
164 parent.addListener(SWT.Selection, e ->
166 Rectangle rect = parent.getBounds();
167 Point pt = new Point(rect.x, rect.y + rect.height);
168 pt = parent.getParent().toDisplay(pt);
169 menu.setLocation(pt.x, pt.y);
170 menu.setVisible(true);
174 private static class DropDownEntry
176 public final String title;
177 public final Runnable onSelected;
179 public DropDownEntry(String title, Runnable onSelected)
183 this.onSelected = onSelected;
187 public void refreshAddList()
189 addList.setItems(IndirectModelComponentCreator.getStandardComponentIDs().keySet().stream().sorted().toArray(String[]::new));
193 public String getAddListSelected()
195 String[] selection = addList.getSelection();
196 if (selection.length == 0)
197 throw new IllegalStateException("Selection in the Add Component List may never be empty!");
204 while (!shell.isDisposed())
205 if (!display.readAndDispatch())