2 * Copyright (C) 2017 EfficiOS Inc., Alexandre Montplaisir <alexmonthy@efficios.com>
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 package org
.lttng
.scope
.tmf2
.views
.ui
.timeline
.widgets
.timegraph
.toolbar
.drawnevents
;
12 import java
.util
.Optional
;
14 import org
.eclipse
.jdt
.annotation
.Nullable
;
15 import org
.lttng
.scope
.tmf2
.views
.core
.timegraph
.model
.provider
.ITimeGraphModelProvider
;
16 import org
.lttng
.scope
.tmf2
.views
.core
.timegraph
.model
.provider
.drawnevents
.ITimeGraphDrawnEventProvider
;
17 import org
.lttng
.scope
.tmf2
.views
.core
.timegraph
.model
.provider
.drawnevents
.TimeGraphDrawnEventProviderManager
;
18 import org
.lttng
.scope
.tmf2
.views
.core
.timegraph
.model
.render
.drawnevents
.TimeGraphDrawnEventSeries
;
19 import org
.lttng
.scope
.tmf2
.views
.ui
.jfx
.JfxColorFactory
;
20 import org
.lttng
.scope
.tmf2
.views
.ui
.jfx
.JfxUtils
;
21 import org
.lttng
.scope
.tmf2
.views
.ui
.timeline
.widgets
.timegraph
.TimeGraphWidget
;
22 import org
.lttng
.scope
.tmf2
.views
.ui
.timeline
.widgets
.timegraph
.layer
.TimeGraphDrawnEventLayer
;
24 import com
.google
.common
.collect
.Iterables
;
26 import javafx
.application
.Platform
;
27 import javafx
.collections
.ListChangeListener
;
28 import javafx
.collections
.SetChangeListener
;
29 import javafx
.scene
.control
.CheckMenuItem
;
30 import javafx
.scene
.control
.MenuButton
;
31 import javafx
.scene
.control
.MenuItem
;
32 import javafx
.scene
.control
.SeparatorMenuItem
;
33 import javafx
.scene
.paint
.Color
;
34 import javafx
.scene
.shape
.Shape
;
37 * Menu button showing listing the existing drawn-event providers, with menu
38 * items to create/clear such providers.
40 * TODO This button and its related actions are independent from a time graph
41 * widget. They could be moved elsewhere in the UI at some point.
43 * @author Alexandre Montplaisir
45 public class EventSeriesMenuButton
extends MenuButton
{
47 private static final TimeGraphDrawnEventProviderManager PROVIDER_MANAGER
=
48 TimeGraphDrawnEventProviderManager
.instance();
54 * Time graph widget to which this button refers
56 public EventSeriesMenuButton(TimeGraphWidget widget
) {
57 setText(Messages
.eventSeriesMenuButtonName
);
59 MenuItem separator
= new SeparatorMenuItem();
62 * There are minimum 3 items in the menu. Whenever there are more (from
63 * registered providers), make the separator visible.
65 getItems().addListener((ListChangeListener
<MenuItem
>) change
-> {
66 separator
.visibleProperty().set(change
.getList().size() > 3);
69 /* "Create New Series" menu item */
70 MenuItem addNewSeriesMenuItem
= new MenuItem(Messages
.newEventSeriesMenuItem
);
71 addNewSeriesMenuItem
.setOnAction(e
-> {
72 ITimeGraphModelProvider modelProvider
= widget
.getControl().getModelRenderProvider();
73 CreateEventSeriesDialog dialog
= new CreateEventSeriesDialog(modelProvider
);
74 dialog
.setOnShowing(h
-> Platform
.runLater(() -> JfxUtils
.centerDialogOnScreen(dialog
, EventSeriesMenuButton
.this)));
75 Optional
<@Nullable PredicateDrawnEventProvider
> results
= dialog
.showAndWait();
76 ITimeGraphDrawnEventProvider provider
= results
.orElse(null);
77 if (provider
!= null) {
78 PROVIDER_MANAGER
.getRegisteredProviders().add(provider
);
79 provider
.enabledProperty().set(true);
83 /* "Clear series" menu item */
84 MenuItem clearSeriesMenuItem
= new MenuItem(Messages
.clearEventSeriesMenuItem
);
85 clearSeriesMenuItem
.setOnAction(e
-> {
86 // TODO Eventually we could track which providers were created from
87 // this button/dialog, and only clear those here.
88 PROVIDER_MANAGER
.getRegisteredProviders().clear();
91 getItems().addAll(separator
, addNewSeriesMenuItem
, clearSeriesMenuItem
);
94 /* Load the already-registered providers */
95 PROVIDER_MANAGER
.getRegisteredProviders().forEach(this::addProviderToMenu
);
97 /* Watch for future addition/removal of providers */
98 PROVIDER_MANAGER
.getRegisteredProviders().addListener((SetChangeListener
<ITimeGraphDrawnEventProvider
>) change
-> {
99 ITimeGraphDrawnEventProvider addedProvider
= change
.getElementAdded();
100 if (addedProvider
!= null) {
101 addProviderToMenu(addedProvider
);
103 ITimeGraphDrawnEventProvider removedProvider
= change
.getElementRemoved();
104 if (removedProvider
!= null) {
105 removeProviderFromMenu(removedProvider
);
110 private void addProviderToMenu(ITimeGraphDrawnEventProvider provider
) {
111 CheckMenuItem item
= new EventProviderMenuItem(provider
);
112 int index
= getItems().size() - 3;
113 getItems().add(index
, item
);
116 private void removeProviderFromMenu(ITimeGraphDrawnEventProvider provider
) {
117 MenuItem itemToRemove
= Iterables
118 .tryFind(getItems(), item
-> {
119 return (item
instanceof EventProviderMenuItem
120 && ((EventProviderMenuItem
) item
).getProvider().equals(provider
));
124 if (itemToRemove
!= null) {
125 getItems().remove(itemToRemove
);
130 * Menu item that represents a particular
131 * {@link ITimeGraphDrawnEventProvider}.
133 private static class EventProviderMenuItem
extends CheckMenuItem
{
135 private final ITimeGraphDrawnEventProvider fProvider
;
137 public EventProviderMenuItem(ITimeGraphDrawnEventProvider provider
) {
138 fProvider
= provider
;
140 TimeGraphDrawnEventSeries series
= provider
.getEventSeries();
142 setMnemonicParsing(false);
143 setText(series
.getSeriesName());
144 selectedProperty().bindBidirectional(provider
.enabledProperty());
146 Shape graphic
= TimeGraphDrawnEventLayer
.getShapeFromSymbol(series
.getSymbolStyle().get());
147 Color color
= JfxColorFactory
.getColorFromDef(series
.getColor().get());
148 graphic
.setFill(color
);
152 public ITimeGraphDrawnEventProvider
getProvider() {