package org.lightview.view; import java.util.Map.Entry; import java.util.Set; import javafx.collections.MapChangeListener; import javafx.collections.MapChangeListener.Change; import javafx.collections.ObservableList; import javafx.collections.ObservableMap; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.HBox; import javafx.scene.layout.HBoxBuilder; import javafx.scene.layout.VBox; import javafx.scene.layout.VBoxBuilder; import javafx.scene.text.Text; import javafx.stage.Modality; import javafx.stage.Stage; import org.lightview.model.Snapshot; import org.lightview.presenter.EscalationsPresenterBindings; /** * * @author adam bien, adam-bien.com */ public class Escalations { private TabPane pane; private final ObservableMap<String, ObservableList<Snapshot>> escalations; private final Node firstTab; private final EscalationsPresenterBindings presenter; public Escalations(Node firstTab, EscalationsPresenterBindings epb) { this.presenter = epb; this.pane = new TabPane(); this.escalations = epb.getEscalations(); this.firstTab = firstTab; this.initialSetup(); this.registerForChanges(); } private void initialSetup() { final Tab liveStream = createTab("Live Stream", firstTab); liveStream.setClosable(false); registerNewScriptMenu(liveStream); pane.getTabs().add(liveStream); Set<Entry<String, ObservableList<Snapshot>>> entrySet = this.escalations.entrySet(); for (Entry<String, ObservableList<Snapshot>> escalation : entrySet) { String title = escalation.getKey(); ObservableList<Snapshot> snapshots = escalation.getValue(); addGrid(title, snapshots); } } private Tab createTab(String caption, Node content) { Tab tab = new Tab(); tab.setContent(content); tab.setText(caption); return tab; } private void registerForChanges() { this.escalations.addListener(new MapChangeListener<String, ObservableList<Snapshot>>() { @Override public void onChanged(Change<? extends String, ? extends ObservableList<Snapshot>> change) { String name = change.getKey(); if (change.wasAdded() && change.wasRemoved()) { return; } if (change.wasRemoved()) { remove(name, change.getValueRemoved()); } if (change.wasAdded()) { add(name, change.getValueAdded()); } } }); } void remove(String name, ObservableList<Snapshot> change) { System.out.println("Sync: remove " + name + change); } void add(String name, ObservableList<Snapshot> change) { System.out.println("Sync: add: " + name + change); addGrid(name, change); } public Node view() { return this.pane; } void addGrid(String title, ObservableList<Snapshot> snapshots) { SnapshotTable grid = new SnapshotTable(snapshots); Tab escalationTab = createTab(title, grid.createTable()); registerNewScriptMenu(escalationTab); registerDeleteScriptMenu(escalationTab); pane.getTabs().add(escalationTab); } void registerNewScriptMenu(final Tab tab) { ContextMenu contextMenu = tab.getContextMenu(); if (contextMenu == null) { contextMenu = new ContextMenu(); } MenuItem newScript = new MenuItem("New Script"); newScript.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { openNewScriptDialog(); } }); contextMenu.getItems().addAll(newScript); tab.setContextMenu(contextMenu); } void registerDeleteScriptMenu(final Tab tab) { ContextMenu contextMenu = tab.getContextMenu(); if (contextMenu == null) { contextMenu = new ContextMenu(); } MenuItem newScript = new MenuItem("Delete"); newScript.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { String scriptName = tab.getText(); presenter.deleteScript(scriptName); pane.getTabs().remove(tab); } }); contextMenu.getItems().addAll(newScript); tab.setContextMenu(contextMenu); } private void openNewScriptDialog() { Scripts scripts = new Scripts(presenter); scripts.createView(); } /* private void openNewScriptDialog() { Stage dialogStage = new Stage(); dialogStage.initModality(Modality.WINDOW_MODAL); HBox nameBox = new HBox(10); final TextField name = new TextField(); name.setText("Errors"); nameBox.getChildren().addAll(new Text("Name:"), name); final TextArea content = new TextArea(); String msg = getDefaultScript(); content.setText(msg); Button save = new Button("Save"); save.setDefaultButton(true); save.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent arg0) { String nameText = name.getText(); String contentText = content.getText(); presenter.newScript(nameText, contentText); } }); VBox vbox = VBoxBuilder.create(). children(nameBox, content, save). alignment(Pos.CENTER).spacing(10).padding(new Insets(10)).build(); final Scene scene = new Scene(vbox); name.requestFocus(); dialogStage.setScene(scene); dialogStage.setTitle("New Script"); dialogStage.show(); } */ String getDefaultScript() { return "(current.totalErrors - previous.totalErrors) == 0"; } }