1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.metis.viewer;
18
19 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20 import io.github.tonywasher.joceanus.oceanus.event.OceanusEvent;
21 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventManager;
22 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar;
23 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistrar.OceanusEventProvider;
24 import io.github.tonywasher.joceanus.oceanus.event.OceanusEventRegistration;
25 import io.github.tonywasher.joceanus.tethys.api.base.TethysUIEvent;
26 import io.github.tonywasher.joceanus.tethys.api.control.TethysUIHTMLManager;
27 import io.github.tonywasher.joceanus.tethys.api.control.TethysUISplitTreeManager;
28 import io.github.tonywasher.joceanus.tethys.api.control.TethysUITreeManager;
29 import io.github.tonywasher.joceanus.tethys.api.control.TethysUITreeManager.TethysUITreeItem;
30 import io.github.tonywasher.joceanus.tethys.api.dialog.TethysUIChildDialog;
31 import io.github.tonywasher.joceanus.tethys.api.factory.TethysUIFactory;
32 import io.github.tonywasher.joceanus.tethys.api.pane.TethysUIBorderPaneManager;
33
34 import java.util.ArrayList;
35 import java.util.Iterator;
36 import java.util.List;
37
38
39
40
41 public class MetisViewerWindow
42 implements OceanusEventProvider<TethysUIEvent> {
43
44
45
46 private static final String NAME_CURRENT = "Current";
47
48
49
50
51 private static final int WINDOW_WIDTH = 900;
52
53
54
55
56 private static final int WINDOW_HEIGHT = 600;
57
58
59
60
61 private final TethysUIFactory<?> theFactory;
62
63
64
65
66 private final MetisViewerManager theDataManager;
67
68
69
70
71 private final OceanusEventManager<TethysUIEvent> theEventManager;
72
73
74
75
76 private final TethysUISplitTreeManager<MetisViewerEntry> theSplitTree;
77
78
79
80
81 private final TethysUITreeManager<MetisViewerEntry> theTree;
82
83
84
85
86 private final TethysUIHTMLManager theHtml;
87
88
89
90
91 private final MetisViewerFormatter theFormatter;
92
93
94
95
96 private final List<OceanusEventRegistration<MetisViewerEvent>> theRegistrations;
97
98
99
100
101 private final MetisViewerControl theControl;
102
103
104
105
106 private TethysUIChildDialog theDialog;
107
108
109
110
111 private MetisViewerPage theActive;
112
113
114
115
116
117
118
119
120 public MetisViewerWindow(final TethysUIFactory<?> pFactory,
121 final MetisViewerManager pDataManager) throws OceanusException {
122
123 theFactory = pFactory;
124 theDataManager = pDataManager;
125
126
127 theEventManager = new OceanusEventManager<>();
128
129
130 theSplitTree = pFactory.controlFactory().newSplitTreeManager();
131 theTree = theSplitTree.getTreeManager();
132 theHtml = theSplitTree.getHTMLManager();
133
134
135 theControl = new MetisViewerControl(pFactory, this);
136 theSplitTree.setControlPane(theControl);
137
138
139 theRegistrations = new ArrayList<>();
140
141
142 theFormatter = new MetisViewerFormatter(pFactory.getDataFormatter());
143
144
145 theHtml.setCSSContent(MetisViewerStyleSheet.CSS_VIEWER);
146
147
148 initialiseTree();
149
150
151 theSplitTree.getEventRegistrar().addEventListener(this::handleSplitTreeAction);
152 }
153
154 @Override
155 public OceanusEventRegistrar<TethysUIEvent> getEventRegistrar() {
156 return theEventManager.getEventRegistrar();
157 }
158
159
160
161
162
163
164 public TethysUISplitTreeManager<MetisViewerEntry> getSplitTreeManager() {
165 return theSplitTree;
166 }
167
168
169
170
171
172
173 public TethysUITreeManager<MetisViewerEntry> getTreeManager() {
174 return theTree;
175 }
176
177
178
179
180
181
182 public TethysUIHTMLManager getHTMLManager() {
183 return theHtml;
184 }
185
186
187
188
189 private void initialiseTree() {
190
191 final TethysUITreeItem<MetisViewerEntry> myRoot = theTree.getRoot();
192 theTree.setRootName(MetisViewerResource.VIEWER_ROOT.getValue());
193 theTree.setRootVisible();
194
195
196 final Iterator<MetisViewerEntry> myIterator = theDataManager.rootIterator();
197 while (myIterator.hasNext()) {
198 final MetisViewerEntry myEntry = myIterator.next();
199
200
201 final TethysUITreeItem<MetisViewerEntry> myTreeItem = theTree.addChildItem(myRoot, myEntry.getUniqueName(), myEntry);
202 myTreeItem.setVisible(myEntry.isVisible());
203
204
205 createChildEntries(myTreeItem);
206 }
207
208
209 final OceanusEventRegistrar<MetisViewerEvent> myRegistrar = theDataManager.getEventRegistrar();
210 theRegistrations.add(myRegistrar.addEventListener(MetisViewerEvent.FOCUS, this::handleFocusEvent));
211 theRegistrations.add(myRegistrar.addEventListener(MetisViewerEvent.VISIBILITY, this::handleVisibilityEvent));
212 theRegistrations.add(myRegistrar.addEventListener(MetisViewerEvent.VALUE, this::handleValueEvent));
213 theRegistrations.add(myRegistrar.addEventListener(MetisViewerEvent.ENTRY, this::handleEntryEvent));
214
215
216 final MetisViewerEntry myEntry = theDataManager.getFocus();
217 if (myEntry != null) {
218 theTree.lookUpAndSelectItem(myEntry.getUniqueName());
219 }
220 }
221
222
223
224
225 protected void terminateTree() {
226
227 final OceanusEventRegistrar<MetisViewerEvent> myRegistrar = theDataManager.getEventRegistrar();
228 final Iterator<OceanusEventRegistration<MetisViewerEvent>> myIterator = theRegistrations.iterator();
229 while (myIterator.hasNext()) {
230 final OceanusEventRegistration<MetisViewerEvent> myRegistration = myIterator.next();
231
232
233 myRegistrar.removeEventListener(myRegistration);
234 myIterator.remove();
235 }
236
237
238 theTree.getRoot().removeChildren();
239 }
240
241
242
243
244
245
246 private void createChildEntries(final TethysUITreeItem<MetisViewerEntry> pItem) {
247
248 final MetisViewerEntry myItem = pItem.getItem();
249
250
251 final Iterator<MetisViewerEntry> myIterator = myItem.childIterator();
252 while (myIterator.hasNext()) {
253 final MetisViewerEntry myEntry = myIterator.next();
254
255
256 final TethysUITreeItem<MetisViewerEntry> myTreeItem = theTree.addChildItem(pItem, myEntry.getUniqueName(), myEntry);
257 myTreeItem.setVisible(myEntry.isVisible());
258
259
260 createChildEntries(myTreeItem);
261 }
262 }
263
264
265
266
267
268
269 private void handleFocusEvent(final OceanusEvent<MetisViewerEvent> pEvent) {
270
271 final MetisViewerEntry myEntry = pEvent.getDetails(MetisViewerEntry.class);
272 final boolean isSelected = myEntry.equals(theTree.getSelectedItem());
273
274
275 if (!isSelected) {
276
277 theTree.lookUpAndSelectItem(myEntry.getUniqueName());
278 }
279 }
280
281
282
283
284
285
286 private void handleVisibilityEvent(final OceanusEvent<MetisViewerEvent> pEvent) {
287
288 final MetisViewerEntry myEntry = pEvent.getDetails(MetisViewerEntry.class);
289 final TethysUITreeItem<MetisViewerEntry> myTreeItem = theTree.lookUpItem(myEntry.getUniqueName());
290 if (myTreeItem != null) {
291 myTreeItem.setVisible(myEntry.isVisible());
292 }
293 }
294
295
296
297
298
299
300 private void handleValueEvent(final OceanusEvent<MetisViewerEvent> pEvent) {
301
302 final MetisViewerEntry myEntry = pEvent.getDetails(MetisViewerEntry.class);
303 final boolean isSelected = myEntry.equals(theTree.getSelectedItem());
304 final TethysUITreeItem<MetisViewerEntry> myTreeItem = theTree.lookUpItem(myEntry.getUniqueName());
305
306
307 myTreeItem.removeChildren();
308 createChildEntries(myTreeItem);
309
310
311 if (isSelected) {
312
313 handleNewTreeItem(myEntry);
314 }
315 }
316
317
318
319
320
321
322 private void handleEntryEvent(final OceanusEvent<MetisViewerEvent> pEvent) {
323
324 final MetisViewerEntry myEntry = pEvent.getDetails(MetisViewerEntry.class);
325 final MetisViewerEntry myParent = myEntry.getParent();
326
327
328 if (myParent == null) {
329
330 theTree.addRootItem(myEntry.getUniqueName(), myEntry);
331
332
333 } else {
334
335 final TethysUITreeItem<MetisViewerEntry> myTreeItem = theTree.lookUpItem(myParent.getUniqueName());
336 theTree.addChildItem(myTreeItem, myEntry.getUniqueName(), myEntry);
337 }
338 }
339
340
341
342
343
344
345
346 protected void fireEvent(final TethysUIEvent pEventId,
347 final Object pValue) {
348 theEventManager.fireEvent(pEventId, pValue);
349 }
350
351
352
353
354 public void showDialog() {
355
356 if (theDialog == null) {
357
358 theDialog = theFactory.dialogFactory().newChildDialog();
359 theDialog.setTitle(MetisViewerResource.VIEWER_TITLE.getValue());
360
361
362 final TethysUIBorderPaneManager myPanel = theFactory.paneFactory().newBorderPane();
363 myPanel.setCentre(theSplitTree);
364 myPanel.setPreferredWidth(WINDOW_WIDTH);
365 myPanel.setPreferredHeight(WINDOW_HEIGHT);
366 theDialog.setContent(myPanel);
367
368
369 theDialog.getEventRegistrar().addEventListener(TethysUIEvent.WINDOWCLOSED, e -> {
370 theTree.setVisible(false);
371 fireEvent(TethysUIEvent.WINDOWCLOSED, null);
372 });
373 }
374
375
376 if (!theDialog.isShowing()) {
377
378 theTree.setVisible(true);
379 theDialog.showDialog();
380 }
381 }
382
383
384
385
386 public void hideDialog() {
387
388 if (theDialog != null
389 && theDialog.isShowing()) {
390
391 theDialog.hideDialog();
392
393
394 terminateTree();
395 }
396 }
397
398
399
400
401 public void closeWindow() {
402 hideDialog();
403 if (theDialog != null) {
404 theDialog.closeDialog();
405 }
406 }
407
408
409
410
411
412
413 protected void handleSplitTreeAction(final OceanusEvent<TethysUIEvent> pEvent) {
414 switch (pEvent.getEventId()) {
415 case NEWVALUE:
416 handleNewTreeItem(pEvent.getDetails(MetisViewerEntry.class));
417 break;
418 case BUILDPAGE:
419 handleLink(pEvent.getDetails(String.class));
420 pEvent.consume();
421 break;
422 default:
423 break;
424 }
425 }
426
427
428
429
430
431
432 private void handleNewTreeItem(final MetisViewerEntry pEntry) {
433 if (pEntry != null) {
434
435 theActive = new MetisViewerPage(pEntry);
436 updatePage();
437 pEntry.setFocus();
438 }
439 }
440
441
442
443
444 protected void handleParentPage() {
445
446 theActive = theActive.getParent();
447 updatePage();
448 }
449
450
451
452
453 protected void handleNextPage() {
454
455 theActive.next();
456 updatePage();
457 }
458
459
460
461
462 protected void handlePreviousPage() {
463
464 theActive.previous();
465 updatePage();
466 }
467
468
469
470
471
472
473 protected void handleExplicitPage(final int pIndex) {
474
475 theActive.setPageNo(pIndex);
476 updatePage();
477 }
478
479
480
481
482
483
484 protected void handleMode(final MetisViewerMode pMode) {
485
486 theActive.setMode(pMode);
487 updatePage();
488 }
489
490
491
492
493
494
495 private void handleLink(final String pLink) {
496
497 theActive = theActive.newPage(pLink);
498 updatePage();
499 }
500
501
502
503
504 private void updatePage() {
505 theFormatter.formatPage(theActive);
506 theHtml.setHTMLContent(theActive.getHtml(), NAME_CURRENT);
507 theControl.updateState(theActive);
508 }
509 }