cdc.perfs.ui.fx.MainPane Maven / Gradle / Ivy
package cdc.perfs.ui.fx;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import cdc.perfs.Context;
import cdc.perfs.io.PerfsBin;
import cdc.perfs.io.PerfsXml;
import cdc.perfs.runtime.RuntimeEnvironment;
import cdc.perfs.snapshot.SnapshotEnvironment;
import cdc.perfs.ui.RefreshRate;
import cdc.perfs.ui.Rendering;
import cdc.ui.fx.FxUtil;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.RadioMenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Region;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class MainPane extends BorderPane {
protected final TabPane wTabPane = new TabPane();
private final EnvironmentPane wRuntimePane;
private final List wEnvironmentPanes = new ArrayList<>();
private About wAbout = null;
public MainPane(Stage stage) {
stage.getIcons().addAll(FxUtil.getApplicationImages());
stage.setTitle("CDC Perfs Monitor");
stage.setWidth(800.0);
stage.setHeight(500.0);
setCenter(wTabPane);
wRuntimePane = new EnvironmentPane(this, RuntimeEnvironment.getInstance());
wEnvironmentPanes.add(wRuntimePane);
final Tab wTab = new Tab("Runtime");
wTab.setContent(wRuntimePane);
wTab.setClosable(false);
wTabPane.getTabs().add(wTab);
final Scene scene = new Scene(this);
stage.setScene(scene);
buildMenus();
}
public EnvironmentPane getRuntimePane() {
return wRuntimePane;
}
public List getEnvironmentPanes() {
return wEnvironmentPanes;
}
void addSnaphot(SnapshotEnvironment environment) {
final EnvironmentPane wSnapshotPane = new EnvironmentPane(this, environment);
final Tab wTab = new Tab("Snapshot");
wTab.setContent(wSnapshotPane);
wTabPane.getTabs().add(wTab);
// Configure the newly created environment panel to match
// runtime panel configuration
final ControlledChartPane rtDisplay = wRuntimePane.getControlledChartPane();
final ControlledChartPane ssDisplay = wSnapshotPane.getControlledChartPane();
ssDisplay.setDisplayStatsEnabled(rtDisplay.getDisplayStatsEnabled());
ssDisplay.setRefreshRate(rtDisplay.getRefreshRate());
ssDisplay.setRendering(rtDisplay.getRendering());
ssDisplay.setDrawBordersEnabled(rtDisplay.getDrawBordersEnabled());
ssDisplay.setScale(rtDisplay.getScale());
ssDisplay.setFocusNanos(rtDisplay.getFocusNanos());
// Reproduce contexts visibility
final ContextsTableModel rtModel = wRuntimePane.getContextsTableModel();
final ContextsTableModel ssModel = wSnapshotPane.getContextsTableModel();
for (final Context rtContext : rtModel.getContexts()) {
final Context ssContext = ssModel.getContext(rtContext.getId());
if (ssContext != null) {
final boolean visible = rtModel.isVisible(rtContext);
ssModel.setVisible(ssContext, visible);
}
}
wEnvironmentPanes.add(wSnapshotPane);
}
private void buildMenus() {
final MenuBar wMenuBar = new MenuBar();
setTop(wMenuBar);
buildFileMenu(wMenuBar);
buildSettingsMenu(wMenuBar);
buildHelpMenu(wMenuBar);
}
private void buildFileMenu(MenuBar wMenuBar) {
final Menu wMenu = new Menu("File");
wMenuBar.getMenus().add(wMenu);
FxUtil.addMenuItem(wMenu, "Open", e -> open(wTabPane));
}
private void buildSettingsMenu(MenuBar wMenuBar) {
final Menu wMenu = new Menu("Settings");
// Refresh items when this menu is shown
wMenu.setOnShowing(event -> {
// Warning : this code must be compliant with order of
// declarations of menus
final Menu source = (Menu) event.getSource();
refreshRefreshRate(source, 0);
refreshRendering(source, 1);
refreshDrawBorders(source, 2);
refreshShowStats(source, 3);
});
wMenuBar.getMenus().add(wMenu);
buildRefreshRateMenu(wMenu);
buildRenderingMenu(wMenu);
buildDrawBordersMenuItem(wMenu);
buildShowStatsMenuItem(wMenu);
}
void refreshRefreshRate(Menu source,
int pos) {
final RefreshRate rate = getRuntimePane().getControlledChartPane().getRefreshRate();
final Menu menu = (Menu) source.getItems().get(pos);
for (int index = 0; index < menu.getItems().size(); index++) {
final RadioMenuItem item = (RadioMenuItem) menu.getItems().get(index);
if (item.getUserData().equals(rate.name())) {
item.setSelected(true);
}
}
}
void refreshRendering(Menu source,
int pos) {
final Rendering rendering = getRuntimePane().getControlledChartPane().getRendering();
final Menu menu = (Menu) source.getItems().get(pos);
for (int index = 0; index < menu.getItems().size(); index++) {
final RadioMenuItem item = (RadioMenuItem) menu.getItems().get(index);
if (item.getUserData().equals(rendering.name())) {
item.setSelected(true);
}
}
}
void refreshDrawBorders(Menu source,
int pos) {
final boolean enabled = getRuntimePane().getControlledChartPane().getDrawBordersEnabled();
final CheckMenuItem item = (CheckMenuItem) source.getItems().get(pos);
item.setSelected(enabled);
}
void refreshShowStats(Menu source,
int pos) {
final boolean enabled = getRuntimePane().getControlledChartPane().getDisplayStatsEnabled();
final CheckMenuItem item = (CheckMenuItem) source.getItems().get(pos);
item.setSelected(enabled);
}
private void buildRefreshRateMenu(Menu wMenu) {
final Menu wRefreshRate = new Menu("Refresh rate");
wMenu.getItems().add(wRefreshRate);
final ToggleGroup group = new ToggleGroup();
for (final RefreshRate rate : RefreshRate.values()) {
final RadioMenuItem wMenuItem =
new RadioMenuItem(rate.getLabel() + " (" + rate.getDelay() + "ms)");
wMenuItem.setUserData(rate.name());
wRefreshRate.getItems().add(wMenuItem);
if (getRuntimePane().getControlledChartPane().getRefreshRate() == rate) {
wMenuItem.setSelected(true);
}
group.getToggles().add(wMenuItem);
wMenuItem.setOnAction(event -> {
final String cmd = (String) ((RadioMenuItem) event.getSource()).getUserData();
final RefreshRate lrate = RefreshRate.valueOf(cmd);
for (final EnvironmentPane pane : getEnvironmentPanes()) {
pane.getControlledChartPane().setRefreshRate(lrate);
}
});
}
}
private void buildRenderingMenu(Menu wMenu) {
final Menu wRendering = new Menu("Rendering");
wMenu.getItems().add(wRendering);
final ToggleGroup group = new ToggleGroup();
for (final Rendering rendering : Rendering.values()) {
final RadioMenuItem wMenuItem = new RadioMenuItem(rendering.getLabel());
wMenuItem.setUserData(rendering.name());
wRendering.getItems().add(wMenuItem);
if (getRuntimePane().getControlledChartPane().getRendering() == rendering) {
wMenuItem.setSelected(true);
}
group.getToggles().add(wMenuItem);
wMenuItem.setOnAction(event -> {
final String cmd = (String) ((RadioMenuItem) event.getSource()).getUserData();
final Rendering lrendering = Rendering.valueOf(cmd);
for (final EnvironmentPane pane : getEnvironmentPanes()) {
pane.getControlledChartPane().setRendering(lrendering);
}
});
}
}
private void buildDrawBordersMenuItem(Menu wMenu) {
final CheckMenuItem wMenuItem = new CheckMenuItem("Draw borders");
wMenu.getItems().add(wMenuItem);
wMenuItem.setSelected(getRuntimePane().getControlledChartPane().getDrawBordersEnabled());
wMenuItem.setOnAction(event -> {
final CheckMenuItem source = (CheckMenuItem) event.getSource();
for (final EnvironmentPane pane : getEnvironmentPanes()) {
pane.getControlledChartPane().setDrawBordersEnabled(source.isSelected());
}
});
}
private void buildShowStatsMenuItem(Menu wMenu) {
final CheckMenuItem wMenuItem = new CheckMenuItem("Show stats");
wMenu.getItems().add(wMenuItem);
wMenuItem.setSelected(getRuntimePane().getControlledChartPane().getDrawBordersEnabled());
wMenuItem.setOnAction(event -> {
final CheckMenuItem source = (CheckMenuItem) event.getSource();
for (final EnvironmentPane panel : getEnvironmentPanes()) {
panel.getControlledChartPane().setDisplayStatsEnabled(source.isSelected());
}
});
}
private void buildHelpMenu(MenuBar wMenuBar) {
final Menu wMenu = new Menu("Help");
wMenuBar.getMenus().add(wMenu);
FxUtil.addMenuItem(wMenu, "About", e -> showAbout());
}
protected void showAbout() {
if (wAbout == null) {
wAbout = new About();
}
wAbout.show();
wAbout.toFront();
}
protected void open(Node parent) {
final FileChooser wChooser = new FileChooser();
wChooser.setTitle("Open");
wChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Snapshot binary or xml files",
"*.dat",
"*.xml"));
final File file = wChooser.showOpenDialog(parent.getScene().getWindow());
if (file != null) {
try {
if (file.getPath().endsWith(".dat")) {
final PerfsBin.Reader reader = new PerfsBin.Reader();
final SnapshotEnvironment environment = reader.load(file.getPath());
addSnaphot(environment);
} else if (file.getPath().endsWith(".xml")) {
final PerfsXml.Loader loader = new PerfsXml.Loader();
final SnapshotEnvironment environment = loader.load(file.getPath());
addSnaphot(environment);
} else {
throw new IOException("Unrecognized extension");
}
// TODO filename
} catch (final IOException e) {
final Alert alert = new Alert(AlertType.ERROR);
final Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
stage.getIcons().addAll(FxUtil.getApplicationImages());
alert.setTitle("Error");
alert.setHeaderText("Failed to open '" + file.getPath() + "'");
alert.setContentText(e.getMessage());
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.showAndWait();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy