/*********************************************************************************** * * Copyright (c) 2014 Kamil Baczkowicz * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * * Kamil Baczkowicz - initial API and implementation and/or initial documentation * */ package pl.baczkowicz.mqttspy.ui; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; import javafx.scene.control.MenuItem; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.SplitPane; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.control.TitledPane; import javafx.scene.control.Tooltip; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; import javafx.stage.Stage; import javafx.stage.WindowEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pl.baczkowicz.mqttspy.connectivity.BaseMqttSubscription; import pl.baczkowicz.mqttspy.connectivity.MqttAsyncConnection; import pl.baczkowicz.mqttspy.connectivity.MqttConnectionStatus; import pl.baczkowicz.mqttspy.connectivity.MqttSubscription; import pl.baczkowicz.mqttspy.stats.StatisticsManager; import pl.baczkowicz.mqttspy.ui.connections.ConnectionManager; import pl.baczkowicz.mqttspy.ui.events.ConnectionStatusChangeEvent; import pl.baczkowicz.mqttspy.ui.events.ShowNewSubscriptionWindowEvent; import pl.baczkowicz.mqttspy.ui.utils.DialogUtils; import pl.baczkowicz.mqttspy.ui.utils.StylingUtils; import pl.baczkowicz.spy.eventbus.IKBus; import pl.baczkowicz.spy.ui.panes.PaneVisibilityStatus; import pl.baczkowicz.spy.ui.panes.TabController; import pl.baczkowicz.spy.ui.panes.TabStatus; import pl.baczkowicz.spy.ui.panes.TitledPaneStatus; import pl.baczkowicz.spy.ui.utils.DialogFactory; import pl.baczkowicz.spy.ui.utils.FxmlUtils; import pl.baczkowicz.spy.ui.utils.ImageUtils; /** * Controller looking after the connection tab. */ public class ConnectionController implements Initializable, TabController { private static final int MIN_COLLAPSED_PANE_HEIGHT = 26; private static final int SUBSCRIPTION_PANE_MIN_EXPANDED_HEIGHT = 66; private static final int TEST_CASES_PANE_MIN_EXPANDED_HEIGHT = 190; private static final int PUBLICATION_PANE_MIN_EXPANDED_HEIGHT = 96; private static final int SCRIPTED_PUBLICATION_PANE_MIN_EXPANDED_HEIGHT = 136; final static Logger logger = LoggerFactory.getLogger(ConnectionController.class); @FXML private AnchorPane connectionPane; @FXML private SplitPane splitPane; @FXML private AnchorPane newPublicationPane; @FXML private AnchorPane newSubscriptionPane; /** * The name of this field needs to be set to the name of the pane + * Controller (i.e. <fx:id>Controller). */ @FXML private NewPublicationController newPublicationPaneController; /** * The name of this field needs to be set to the name of the pane + * Controller (i.e. <fx:id>Controller). */ @FXML private PublicationScriptsController publicationScriptsPaneController; /** * The name of this field needs to be set to the name of the pane + * Controller (i.e. <fx:id>Controller). */ @FXML private NewSubscriptionController newSubscriptionPaneController; /** * The name of this field needs to be set to the name of the pane + * Controller (i.e. <fx:id>Controller). */ @FXML private TestCasesExecutionController testCasesPaneController; /** For convenience, this represents a controller for the subscriptions titled pane. */ private SubscriptionsController subscriptionsController = new SubscriptionsController(); @FXML private Button newSubButton; @FXML private TitledPane publishMessageTitledPane; @FXML private TitledPane newSubscriptionTitledPane; @FXML private TitledPane scriptedPublicationsTitledPane; @FXML private TitledPane subscriptionsTitledPane; @FXML private TitledPane testCasesTitledPane; private TitledPaneStatus publishMessageTitledStatus = new TitledPaneStatus(0); private TitledPaneStatus newSubscriptionTitledStatus = new TitledPaneStatus(3); private TitledPaneStatus scriptedPublicationsTitledStatus = new TitledPaneStatus(1); private TitledPaneStatus subscriptionsTitledStatus = new TitledPaneStatus(4); private TitledPaneStatus testCasesTitledStatus = new TitledPaneStatus(2); @FXML private TabPane subscriptionTabs; private MqttAsyncConnection connection; private Tab connectionTab; private Tooltip tooltip; private StatisticsManager statisticsManager; private ConnectionManager connectionManager; private IKBus eventBus; private Map<TitledPane, TitledPaneStatus> paneToStatus = new HashMap<>(); private boolean detailedView; private boolean replayMode; private TabStatus tabStatus; private CheckMenuItem resizeMessageContentMenu = new CheckMenuItem(); private ChangeListener<Boolean> createChangeListener() { return new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) { updateMinHeights(); } }; } public void initialize(URL location, ResourceBundle resources) { newSubButton.setTooltip(new Tooltip("Create new subscription [" + ViewManager.newSubscription.getDisplayText() + "]")); final MenuItem attach = new MenuItem("Show attached"); final ConnectionController controller = this; attach.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { showNewSubscription(PaneVisibilityStatus.ATTACHED, controller); } }); newSubButton.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (MouseButton.PRIMARY.equals(event.getButton())) { showNewSubscription(PaneVisibilityStatus.DETACHED, controller); } else { newSubButton.getContextMenu().show(newSubButton.getScene().getWindow()); } } }); newSubButton.setContextMenu(new ContextMenu(attach)); newSubButton.setDisable(false); } private void showNewSubscription(final PaneVisibilityStatus status, final ConnectionController connectionController) { eventBus.publish(new ShowNewSubscriptionWindowEvent(connectionController, status, connectionController.getNewSubscriptionPaneStatus().getVisibility())); } @FXML public void newSubscription() { final Tab selectedTab = connectionTab; final ConnectionController controller = connectionManager.getControllerForTab(selectedTab); if (controller != null) { eventBus.publish(new ShowNewSubscriptionWindowEvent( controller, PaneVisibilityStatus.DETACHED, controller.getNewSubscriptionPaneStatus().getVisibility())); } } public void init() { publishMessageTitledStatus.setController(newPublicationPaneController); newSubscriptionTitledStatus.setController(newSubscriptionPaneController); scriptedPublicationsTitledStatus.setController(publicationScriptsPaneController); subscriptionsTitledStatus.setController(subscriptionsController); testCasesTitledStatus.setController(testCasesPaneController); subscriptionsTitledPane.expandedProperty().addListener(createChangeListener()); // panes.put(subscriptionsController, true); subscriptionsTitledStatus.setVisibility(PaneVisibilityStatus.ATTACHED); paneToStatus.put(subscriptionsTitledPane, subscriptionsTitledStatus); subscriptionsController.setTitledPane(subscriptionsTitledPane); subscriptionsController.setConnectionController(this); subscriptionsController.init(); if (!replayMode) { publishMessageTitledPane.expandedProperty().addListener(createChangeListener()); scriptedPublicationsTitledPane.expandedProperty().addListener(createChangeListener()); newSubscriptionTitledPane.expandedProperty().addListener(createChangeListener()); scriptedPublicationsTitledPane.setExpanded(false); publishMessageTitledStatus.setVisibility(PaneVisibilityStatus.ATTACHED); scriptedPublicationsTitledStatus.setVisibility(PaneVisibilityStatus.ATTACHED); newSubscriptionTitledStatus.setVisibility(PaneVisibilityStatus.ATTACHED); testCasesTitledStatus.setVisibility(PaneVisibilityStatus.NOT_VISIBLE); paneToStatus.put(publishMessageTitledPane, publishMessageTitledStatus); paneToStatus.put(scriptedPublicationsTitledPane, scriptedPublicationsTitledStatus); paneToStatus.put(newSubscriptionTitledPane, newSubscriptionTitledStatus); newPublicationPaneController.setConnection(connection); newPublicationPaneController.setScriptManager(connection.getScriptManager()); newPublicationPaneController.setEventBus(eventBus); newPublicationPaneController.setConnectionController(this); newPublicationPaneController.setTitledPane(publishMessageTitledPane); newPublicationPaneController.init(); newSubscriptionPaneController.setConnection(connection); newSubscriptionPaneController.setConnectionController(this); newSubscriptionPaneController.setEventBus(eventBus); newSubscriptionPaneController.setConnectionManager(connectionManager); newSubscriptionPaneController.setTitledPane(newSubscriptionTitledPane); newSubscriptionPaneController.init(); publicationScriptsPaneController.setConnection(connection); // publicationScriptsPaneController.setEventManager(eventManager); publicationScriptsPaneController.setEventBus(eventBus); publicationScriptsPaneController.setConnectionController(this); publicationScriptsPaneController.setTitledPane(scriptedPublicationsTitledPane); publicationScriptsPaneController.init(); tooltip = new Tooltip(); connectionTab.setTooltip(tooltip); } else { // If in replay more, remote the panes from the split pane altogether // TODO: don't add them in the first place? splitPane.getItems().remove(publishMessageTitledPane); splitPane.getItems().remove(scriptedPublicationsTitledPane); splitPane.getItems().remove(newSubscriptionTitledPane); splitPane.getItems().remove(testCasesTitledPane); } updateVisiblePanes(); //updateMenus(); updateMinHeights(); // connectionPane.setMaxWidth(500); // subscriptionsTitledPane.setMaxWidth(500); // subscriptionTabs.setMaxWidth(500); // TODO: how not to resize the tab pane on too many tabs? All max sizes seems to be ignored... } private void initialiseTestCasesPane() { if (testCasesPaneController == null) { final FXMLLoader loader = FxmlUtils.createFxmlLoaderForProjectFile("TestCasesExecutionPane.fxml"); final AnchorPane testCasesPane = FxmlUtils.loadAnchorPane(loader); testCasesTitledPane = new TitledPane(); testCasesTitledPane.setText("Test cases"); testCasesTitledPane.setContent(testCasesPane); testCasesTitledPane.expandedProperty().addListener(createChangeListener()); testCasesTitledPane.setExpanded(false); testCasesPaneController = loader.getController(); testCasesPaneController.setConnection(connection); testCasesPaneController.setConnectionController(this); testCasesPaneController.setTitledPane(testCasesTitledPane); testCasesPaneController.init(); testCasesTitledStatus.setController(testCasesPaneController); paneToStatus.put(testCasesTitledPane, testCasesTitledStatus); logger.info("Test cases pane initialised!"); } } public Map<TitledPane, TitledPaneStatus> getPaneToStatusMapping() { return paneToStatus; } public void setConnectionManager(final ConnectionManager connectionManager) { this.connectionManager = connectionManager; } public void updateMinHeights() { if (publishMessageTitledPane.isExpanded()) { publishMessageTitledPane.setMinHeight(PUBLICATION_PANE_MIN_EXPANDED_HEIGHT); } else { publishMessageTitledPane.setMinHeight(MIN_COLLAPSED_PANE_HEIGHT); } if (scriptedPublicationsTitledPane.isExpanded()) { scriptedPublicationsTitledPane.setMinHeight(SCRIPTED_PUBLICATION_PANE_MIN_EXPANDED_HEIGHT); } else { scriptedPublicationsTitledPane.setMinHeight(MIN_COLLAPSED_PANE_HEIGHT); } if (newSubscriptionTitledPane.isExpanded()) { newSubscriptionTitledPane.setMinHeight(SUBSCRIPTION_PANE_MIN_EXPANDED_HEIGHT); newSubscriptionTitledPane.setMaxHeight(SUBSCRIPTION_PANE_MIN_EXPANDED_HEIGHT); } else { newSubscriptionTitledPane.setMinHeight(MIN_COLLAPSED_PANE_HEIGHT); newSubscriptionTitledPane.setMaxHeight(MIN_COLLAPSED_PANE_HEIGHT); } if (testCasesTitledPane != null) { if (testCasesTitledPane.isExpanded()) { testCasesTitledPane.setMinHeight(TEST_CASES_PANE_MIN_EXPANDED_HEIGHT); } else { testCasesTitledPane.setMinHeight(MIN_COLLAPSED_PANE_HEIGHT); } } } public MqttAsyncConnection getConnection() { return connection; } public void setConnection(MqttAsyncConnection connection) { this.connection = connection; } public Tab getTab() { return connectionTab; } public void setTab(Tab tab) { this.connectionTab = tab; } public TabPane getSubscriptionTabs() { return subscriptionTabs; } public void showTabTile(final boolean pending) { if (pending) { final HBox title = new HBox(); title.setAlignment(Pos.CENTER); final ProgressIndicator progressIndicator = new ProgressIndicator(); progressIndicator.setMaxSize(15, 15); title.getChildren().add(progressIndicator); title.getChildren().add(new Label(" " + connection.getName())); connectionTab.setGraphic(title); connectionTab.setText(null); } else if (connection.getConnectionStatus().equals(MqttConnectionStatus.CONNECTED)) { connectionTab.setGraphic( createSecurityIcons( connection.getProperties().getSSL() != null, connection.getProperties().getUserCredentials() != null, false)); connectionTab.setText(connection.getName()); } else { connectionTab.setGraphic(null); connectionTab.setText(connection.getName()); } } public static HBox createSecurityIcons(final boolean tlsEnabled, final boolean userAuthEnabled, final boolean showBothStates) { final HBox icons = new HBox(); createTlsIcon(icons, tlsEnabled, showBothStates); createAuthIcon(icons, userAuthEnabled, showBothStates); return icons; } public static void createTlsIcon(final HBox icons, final boolean tlsEnabled, final boolean showBothStates) { if (tlsEnabled) { icons.getChildren().add(ImageUtils.createIcon("lock-yes", 16)); } else if (!tlsEnabled && showBothStates) { icons.getChildren().add(ImageUtils.createIcon("lock-no", 16)); } } public static void createAuthIcon(final HBox icons, final boolean userAuthEnabled, final boolean showBothStates) { if (userAuthEnabled) { icons.getChildren().add(ImageUtils.createIcon("auth-yes", 19)); } else if (!userAuthEnabled && showBothStates) { icons.getChildren().add(ImageUtils.createIcon("auth-none", 19)); } } public void onConnectionStatusChanged(final ConnectionStatusChangeEvent event) { final MqttConnectionStatus connectionStatus = event.getChangedConnection().getConnectionStatus(); logger.debug("Updating {} connection status to {}", event.getChangedConnection().getName(), connectionStatus); newSubscriptionPaneController.setConnected(false); getNewPublicationPaneController().setConnected(false); for (final BaseMqttSubscription sub : connection.getSubscriptions().values()) { ((MqttSubscription) sub).getSubscriptionController().updateContextMenu(); } // If the context menu is available and has items in it if (connectionTab.getContextMenu() != null && connectionTab.getContextMenu().getItems().size() > 0) { // TODO: change that to the Specification pattern switch (connectionStatus) { case NOT_CONNECTED: connectionTab.getContextMenu().getItems().get(0).setDisable(false); connectionTab.getContextMenu().getItems().get(2).setDisable(true); connectionTab.getContextMenu().getItems().get(3).setDisable(false); connectionTab.getContextMenu().getItems().get(5).setDisable(true); showTabTile(false); break; case CONNECTED: connectionTab.getContextMenu().getItems().get(0).setDisable(true); connectionTab.getContextMenu().getItems().get(2).setDisable(false); connectionTab.getContextMenu().getItems().get(3).setDisable(false); connectionTab.getContextMenu().getItems().get(5).setDisable(false); newSubscriptionPaneController.setConnected(true); getNewPublicationPaneController().setConnected(true); showTabTile(false); break; case CONNECTING: connectionTab.getContextMenu().getItems().get(2).setDisable(true); connectionTab.getContextMenu().getItems().get(0).setDisable(true); connectionTab.getContextMenu().getItems().get(3).setDisable(true); connectionTab.getContextMenu().getItems().get(5).setDisable(true); showTabTile(true); break; case DISCONNECTED: connectionTab.getContextMenu().getItems().get(0).setDisable(false); connectionTab.getContextMenu().getItems().get(2).setDisable(true); connectionTab.getContextMenu().getItems().get(3).setDisable(false); connectionTab.getContextMenu().getItems().get(5).setDisable(true); showTabTile(false); break; case DISCONNECTING: connectionTab.getContextMenu().getItems().get(0).setDisable(true); connectionTab.getContextMenu().getItems().get(2).setDisable(true); connectionTab.getContextMenu().getItems().get(3).setDisable(false); connectionTab.getContextMenu().getItems().get(5).setDisable(true); showTabTile(false); break; default: break; } } if (connectionTab.getStyleClass().size() > 1) { connectionTab.getStyleClass().remove(1); } connectionTab.getStyleClass().add(StylingUtils.getStyleForMqttConnectionStatus(connectionStatus)); DialogUtils.updateConnectionTooltip(connection, tooltip); } public void updateConnectionStats() { for (final SubscriptionController subscriptionController : connectionManager.getSubscriptionManager(this).getSubscriptionControllers()) { subscriptionController.updateSubscriptionStats(); } } public StatisticsManager getStatisticsManager() { return statisticsManager; } public void setStatisticsManager(StatisticsManager statisticsManager) { this.statisticsManager = statisticsManager; } public NewSubscriptionController getNewSubscriptionPaneController() { return newSubscriptionPaneController; } public void setPaneVisiblity(final TitledPaneStatus paneStatus, final PaneVisibilityStatus visibility) { if (paneStatus == testCasesTitledStatus && testCasesPaneController == null && (PaneVisibilityStatus.ATTACHED.equals(visibility) || PaneVisibilityStatus.DETACHED.equals(visibility))) { initialiseTestCasesPane(); } // Ignore any layout requests when in replay mode if (!replayMode) { paneStatus.setRequestedVisibility(visibility); updateVisiblePanes(); updateMenus(); } } public boolean getDetailedViewVisibility() { return detailedView; } public void setViewVisibility(final boolean detailedView, final boolean basicView) { this.detailedView = detailedView; newSubscriptionPaneController.setViewVisibility(detailedView); getNewPublicationPaneController().setViewVisibility(detailedView); for (final SubscriptionController subscriptionController : connectionManager.getSubscriptionManager(this).getSubscriptionControllers()) { subscriptionController.setViewVisibility(detailedView, basicView); } } public void toggleMessagePayloadSize(final boolean resize) { for (final SubscriptionController subscriptionController : connectionManager.getSubscriptionManager(this).getSubscriptionControllers()) { subscriptionController.toggleMessagePayloadSize(resize); } } public void toggleDetailedViewVisibility() { newSubscriptionPaneController.toggleDetailedViewVisibility(); getNewPublicationPaneController().toggleDetailedViewVisibility(); for (final SubscriptionController subscriptionController : connectionManager.getSubscriptionManager(this).getSubscriptionControllers()) { subscriptionController.toggleDetailedViewVisibility(); } } public void showPanes(final PaneVisibilityStatus showManualPublications, final PaneVisibilityStatus showScriptedPublications, final PaneVisibilityStatus showNewSubscription, final PaneVisibilityStatus showReceivedMessagesSummary) { // Ignore any layout requests when in replay mode if (!replayMode) { subscriptionsTitledStatus.setRequestedVisibility(showReceivedMessagesSummary); publishMessageTitledStatus.setRequestedVisibility(showManualPublications); scriptedPublicationsTitledStatus.setRequestedVisibility(showScriptedPublications); newSubscriptionTitledStatus.setRequestedVisibility(showNewSubscription); updateVisiblePanes(); updateMenus(); } } public void setReplayMode(final boolean value) { replayMode = value; } public void showReplayMode() { connectionTab.getStyleClass().add("connection-replay"); subscriptionsTitledStatus.setRequestedVisibility(PaneVisibilityStatus.ATTACHED); publishMessageTitledStatus.setRequestedVisibility(PaneVisibilityStatus.NOT_VISIBLE); scriptedPublicationsTitledStatus.setRequestedVisibility(PaneVisibilityStatus.NOT_VISIBLE); newSubscriptionTitledStatus.setRequestedVisibility(PaneVisibilityStatus.NOT_VISIBLE); testCasesTitledStatus.setRequestedVisibility(PaneVisibilityStatus.NOT_VISIBLE); updateVisiblePanes(); subscriptionsTitledPane.setText("Logged messages"); subscriptionsController.init(); } private void updateMenus() { for (final TitledPaneStatus status : paneToStatus.values()) { status.updateMenu(); } } private void insertPane(final TitledPaneStatus status) { int insertIndex = splitPane.getItems().size(); for (int i = 0; i < splitPane.getItems().size(); i++) { final Node pane = splitPane.getItems().get(i); if (paneToStatus.get(pane).getDisplayIndex() > status.getDisplayIndex()) { insertIndex = i; break; } } // logger.info("Inserting at " + insertIndex + "; " + controller); splitPane.getItems().add(insertIndex, status.getController().getTitledPane()); } // TODO: this should be moved out to the ViewManager private void updateVisiblePanes() { for (final TitledPaneStatus status : paneToStatus.values()) { // If no changes, go to next controller... if (status.getVisibility().equals(status.getRequestedVisibility())) { continue; } status.setVisibility(status.getRequestedVisibility()); status.getController().updatePane(status.getRequestedVisibility()); // If previous value was detached, close the detached window if (status.getPreviousVisibility().equals(PaneVisibilityStatus.DETACHED)) { status.getController().getTitledPane().setCollapsible(true); status.getController().getTitledPane().setExpanded(status.isLastExpanded()); if (status.getParentWhenDetached().isShowing()) { status.getParentWhenDetached().close(); } } // If previous value was attached, remove the pane else if (status.getPreviousVisibility().equals(PaneVisibilityStatus.ATTACHED)) { // Remove from main window if (splitPane.getItems().contains(status.getController().getTitledPane())) { splitPane.getItems().remove(status.getController().getTitledPane()); } } // If the pane should be detached if (status.getVisibility().equals(PaneVisibilityStatus.DETACHED)) { // Add to separate window final Stage stage = DialogFactory.createWindowWithPane(status.getController().getTitledPane(), splitPane.getScene(), connection.getName(), 0); status.setParentWhenDetached(stage); status.setLastExpanded(status.getController().getTitledPane().isExpanded()); stage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { status.setRequestedVisibility(status.getPreviousVisibility()); updateVisiblePanes(); updateMenus(); updateMinHeights(); } }); status.getController().getTitledPane().setExpanded(true); status.getController().getTitledPane().setCollapsible(false); updateMinHeights(); stage.setMinHeight(status.getController().getTitledPane().getMinHeight()); stage.setMinWidth(300); stage.show(); } // If set to be shown else if (status.getVisibility().equals(PaneVisibilityStatus.ATTACHED)) { // logger.info("Show; contains = " + splitPane.getItems().contains(controller.getTitledPane())); // Show if (!splitPane.getItems().contains(status.getController().getTitledPane())) { insertPane(status); } } } } public TabStatus getTabStatus() { return tabStatus; } /** * Sets the pane status. * * @param paneStatus the paneStatus to set */ public void setTabStatus(TabStatus paneStatus) { this.tabStatus = paneStatus; } @Override public void refreshStatus() { if (connection != null) { onConnectionStatusChanged(new ConnectionStatusChangeEvent(connection)); } } /** * Gets the new publication pane controller. * * @return the newPublicationPaneController */ public NewPublicationController getNewPublicationPaneController() { return newPublicationPaneController; } /** * Gets the subscriptions controller. * * @return the subscriptionsController */ public SubscriptionsController getSubscriptionsController() { return subscriptionsController; } /** * Gets the publication scripts controller. * * @return the publicationScriptsPaneController */ public PublicationScriptsController getPublicationScriptsPaneController() { return publicationScriptsPaneController; } public CheckMenuItem getResizeMessageContentMenu() { return resizeMessageContentMenu; } public TestCasesExecutionController getTestCasesPaneController() { return testCasesPaneController; } public TitledPaneStatus getNewPublicationPaneStatus() { return publishMessageTitledStatus; } public TitledPaneStatus getPublicationScriptsPaneStatus() { return scriptedPublicationsTitledStatus; } public TitledPaneStatus getNewSubscriptionPaneStatus() { return newSubscriptionTitledStatus; } public TitledPaneStatus getSubscriptionsStatus() { return subscriptionsTitledStatus; } public TitledPaneStatus getTestCasesPaneStatus() { return testCasesTitledStatus; } public void setEventBus(final IKBus eventBus) { this.eventBus = eventBus; } }