8365c952c286d5b4db410fb5882be1c664affdb0
[deliverable/tracecompass.git] / tmf / org.lttng.scope.tmf2.views.ui / src / org / lttng / scope / tmf2 / views / ui / timeline / widgets / timegraph / toolbar / drawnevents / EventSeriesMenuButton.java
1 /*
2 * Copyright (C) 2017 EfficiOS Inc., Alexandre Montplaisir <alexmonthy@efficios.com>
3 *
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
8 */
9
10 package org.lttng.scope.tmf2.views.ui.timeline.widgets.timegraph.toolbar.drawnevents;
11
12 import java.util.Optional;
13
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;
23
24 import com.google.common.collect.Iterables;
25
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;
35
36 /**
37 * Menu button showing listing the existing drawn-event providers, with menu
38 * items to create/clear such providers.
39 *
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.
42 *
43 * @author Alexandre Montplaisir
44 */
45 public class EventSeriesMenuButton extends MenuButton {
46
47 private static final TimeGraphDrawnEventProviderManager PROVIDER_MANAGER =
48 TimeGraphDrawnEventProviderManager.instance();
49
50 /**
51 * Constructor
52 *
53 * @param widget
54 * Time graph widget to which this button refers
55 */
56 public EventSeriesMenuButton(TimeGraphWidget widget) {
57 setText(Messages.eventSeriesMenuButtonName);
58
59 MenuItem separator = new SeparatorMenuItem();
60
61 /*
62 * There are minimum 3 items in the menu. Whenever there are more (from
63 * registered providers), make the separator visible.
64 */
65 getItems().addListener((ListChangeListener<MenuItem>) change -> {
66 separator.visibleProperty().set(change.getList().size() > 3);
67 });
68
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);
80 }
81 });
82
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();
89 });
90
91 getItems().addAll(separator, addNewSeriesMenuItem, clearSeriesMenuItem);
92
93
94 /* Load the already-registered providers */
95 PROVIDER_MANAGER.getRegisteredProviders().forEach(this::addProviderToMenu);
96
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);
102 }
103 ITimeGraphDrawnEventProvider removedProvider = change.getElementRemoved();
104 if (removedProvider != null) {
105 removeProviderFromMenu(removedProvider);
106 }
107 });
108 }
109
110 private void addProviderToMenu(ITimeGraphDrawnEventProvider provider) {
111 CheckMenuItem item = new EventProviderMenuItem(provider);
112 int index = getItems().size() - 3;
113 getItems().add(index, item);
114 }
115
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));
121 })
122 .orNull();
123
124 if (itemToRemove != null) {
125 getItems().remove(itemToRemove);
126 }
127 }
128
129 /**
130 * Menu item that represents a particular
131 * {@link ITimeGraphDrawnEventProvider}.
132 */
133 private static class EventProviderMenuItem extends CheckMenuItem {
134
135 private final ITimeGraphDrawnEventProvider fProvider;
136
137 public EventProviderMenuItem(ITimeGraphDrawnEventProvider provider) {
138 fProvider = provider;
139
140 TimeGraphDrawnEventSeries series = provider.getEventSeries();
141
142 setMnemonicParsing(false);
143 setText(series.getSeriesName());
144 selectedProperty().bindBidirectional(provider.enabledProperty());
145
146 Shape graphic = TimeGraphDrawnEventLayer.getShapeFromSymbol(series.getSymbolStyle().get());
147 Color color = JfxColorFactory.getColorFromDef(series.getColor().get());
148 graphic.setFill(color);
149 setGraphic(graphic);
150 }
151
152 public ITimeGraphDrawnEventProvider getProvider() {
153 return fProvider;
154 }
155 }
156
157 }
This page took 0.041208 seconds and 5 git commands to generate.