Restructured the Preferences system
[Mograsim.git] / plugins / 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 static net.mograsim.logic.model.preferences.RenderPreferences.DRAG_BUTTON;
4 import static net.mograsim.logic.model.preferences.RenderPreferences.ZOOM_BUTTON;
5
6 import java.io.IOException;
7
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;
21
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;
27
28 public class EditorGUI
29 {
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;
35
36         public EditorGUI(Editor editor)
37         {
38                 this.editor = editor;
39                 display = Display.getDefault();
40                 shell = new Shell(display);
41
42                 GridLayout layout = new GridLayout();
43                 layout.numColumns = 1;
44                 shell.setLayout(layout);
45
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);
54
55                 GridLayout innerLayout = new GridLayout();
56                 innerComp.setLayout(innerLayout);
57                 innerLayout.numColumns = 2;
58
59                 GridData d = new GridData();
60                 d.grabExcessHorizontalSpace = true;
61                 d.horizontalAlignment = SWT.FILL;
62                 d.grabExcessVerticalSpace = true;
63                 d.verticalAlignment = SWT.FILL;
64
65                 logicCanvas = new EditorCanvas(innerComp, SWT.TRAIL, editor);
66                 logicCanvas.setLayoutData(d);
67
68                 d = new GridData();
69                 d.grabExcessVerticalSpace = true;
70                 d.verticalAlignment = SWT.FILL;
71                 d.verticalSpan = 2;
72                 addList = new List(innerComp, SWT.V_SCROLL);
73                 addList.setLayoutData(d);
74                 refreshAddList();
75
76                 setupBottomToolBar(innerComp);
77
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();
83         }
84
85         private ToolBar setupTopToolBar(Composite parent)
86         {
87                 GridData d = new GridData();
88                 d.grabExcessHorizontalSpace = true;
89                 d.horizontalAlignment = SWT.FILL;
90
91                 ToolBar toolBar = new ToolBar(parent, SWT.BORDER);
92                 toolBar.setLayoutData(d);
93
94                 ToolItem file = new ToolItem(toolBar, SWT.DROP_DOWN);
95
96                 // TODO
97                 DropDownEntry newEntry = new DropDownEntry("New", Editor::openNewEditor);
98                 DropDownEntry loadEntry = new DropDownEntry("Load", () ->
99                 {
100                         try
101                         {
102                                 SaveLoadManager.openLoadDialog();
103                         }
104                         catch (IOException e)
105                         {
106                                 editor.dialogManager.openWarningDialog("Failed to load Component!", e.getMessage());
107                         }
108                 });
109                 DropDownEntry saveEntry = new DropDownEntry("Save", editor::save);
110                 DropDownEntry saveAsEntry = new DropDownEntry("Save as...", editor::saveAs);
111
112                 DropDownEntry[] entries = new DropDownEntry[] { newEntry, loadEntry, saveEntry, saveAsEntry };
113
114                 setupDrowpDownMenu(file, entries);
115
116                 file.setText("File");
117                 return toolBar;
118         }
119
120         @SuppressWarnings("unused") // ToolItem
121         private ToolBar setupBottomToolBar(Composite parent)
122         {
123                 GridData d = new GridData();
124                 d.grabExcessHorizontalSpace = true;
125                 d.horizontalAlignment = SWT.FILL;
126
127                 ToolBar toolBar = new ToolBar(parent, SWT.BORDER);
128                 toolBar.setLayoutData(d);
129
130                 ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE);
131                 snappingLabel.setText("Snapping:");
132
133                 ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN);
134                 DropDownEntry[] entries = new DropDownEntry[Editor.Snapping.values().length];
135                 int index = 0;
136                 for (Editor.Snapping sn : Editor.Snapping.values())
137                 {
138                         entries[index++] = new DropDownEntry(sn.toString(), () ->
139                         {
140                                 editor.setSnapping(sn);
141                                 snappSelect.setText(sn.toString());
142                         });
143                 }
144                 snappSelect.setText(editor.getSnapping().toString());
145                 setupDrowpDownMenu(snappSelect, entries);
146
147                 new ToolItem(toolBar, SWT.SEPARATOR);
148
149                 toolBar.pack();
150
151                 return toolBar;
152         }
153
154         private void setupDrowpDownMenu(ToolItem parent, DropDownEntry[] entries)
155         {
156                 Menu menu = new Menu(shell, SWT.POP_UP);
157                 for (DropDownEntry entry : entries)
158                 {
159                         MenuItem item = new MenuItem(menu, SWT.PUSH);
160                         item.addListener(SWT.Selection, e -> entry.onSelected.run());
161                         item.setText(entry.title);
162                 }
163
164                 parent.addListener(SWT.Selection, e ->
165                 {
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);
171                 });
172         }
173
174         private static class DropDownEntry
175         {
176                 public final String title;
177                 public final Runnable onSelected;
178
179                 public DropDownEntry(String title, Runnable onSelected)
180                 {
181                         super();
182                         this.title = title;
183                         this.onSelected = onSelected;
184                 }
185         }
186
187         public void refreshAddList()
188         {
189                 addList.setItems(IndirectModelComponentCreator.getStandardComponentIDs().keySet().stream().sorted().toArray(String[]::new));
190                 addList.select(0);
191         }
192
193         public String getAddListSelected()
194         {
195                 String[] selection = addList.getSelection();
196                 if (selection.length == 0)
197                         throw new IllegalStateException("Selection in the Add Component List may never be empty!");
198                 return selection[0];
199         }
200
201         public void open()
202         {
203                 shell.open();
204                 while (!shell.isDisposed())
205                         if (!display.readAndDispatch())
206                                 display.sleep();
207         }
208 }