diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java index 92b7fa8d54..a06cafcd16 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryDisplayController.java @@ -27,6 +27,7 @@ import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Button; +import javafx.scene.control.TextField; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToolBar; import javafx.scene.image.ImageView; @@ -40,9 +41,14 @@ import org.phoebus.olog.es.api.model.OlogLog; import org.phoebus.ui.javafx.ImageCache; +import java.util.logging.Level; +import java.util.logging.Logger; + public class LogEntryDisplayController { + static Logger log = Logger.getLogger(LogEntryDisplayController.class.getName()); + @FXML @SuppressWarnings("unused") private SingleLogEntryDisplayController singleLogEntryDisplayController; @@ -69,6 +75,8 @@ public class LogEntryDisplayController { private Node singleLogEntryDisplay; @FXML private Node mergedLogEntryDisplay; + @FXML + private TextField jumpToLogEntryTextField; ImageView goBackButtonIcon = ImageCache.getImageView(LogEntryDisplayController.class, "/icons/backward_nav.png"); ImageView goBackButtonIconDisabled = ImageCache.getImageView(LogEntryDisplayController.class, "/icons/backward_disabled.png"); @@ -112,6 +120,19 @@ public void initialize() { goForwardButton.disableProperty().addListener(goForwardButtonDisabledPropertyChangeListener); goForwardButtonDisabledPropertyChangeListener.changed(goForwardButton.disableProperty(), false, true); } + + jumpToLogEntryTextField.setPromptText(Messages.LogEntryID); + jumpToLogEntryTextField.focusedProperty().addListener((property, oldValue, newValue) -> { + if (oldValue && !newValue) { + // When clicking away without first pressing enter, restore the current value of jumpToLogEntryTextField: + if (logEntryProperty.get() != null) { + jumpToLogEntryTextField.setText(logEntryProperty.get().getId().toString()); + } + else { + jumpToLogEntryTextField.setText(""); + } + } + }); } @FXML @@ -133,6 +154,28 @@ public void showHideLogEntryGroup() { } } + @FXML + public void jumpToLogEntry() { + String logEntryIDToJumpToString = jumpToLogEntryTextField.getText(); + long logEntryIDToJumpTo; + try { + logEntryIDToJumpTo = Long.parseLong(logEntryIDToJumpToString); + } + catch (NumberFormatException numberFormatException) { + return; + } + + if (logEntryIDToJumpTo > 0) { + if (logEntryTableViewController.goBackAndGoForwardActions.isPresent()) { + boolean success = logEntryTableViewController.goBackAndGoForwardActions.get().loadLogEntryWithID(logEntryIDToJumpTo); + if (!success) { + log.log(Level.WARNING, "Error loading entry with log entry ID: " + logEntryIDToJumpTo + "."); + } + } + } + Platform.runLater(() -> jumpToLogEntryTextField.end()); + } + @FXML public void reply() { // Show a new editor dialog. When user selects to save the reply entry, update the original log entry @@ -175,7 +218,8 @@ public void setLogEntry(LogEntry logEntry) { currentViewProperty.set(SINGLE); showHideLogEntryGroupButton.selectedProperty().set(false); hasLinkedEntriesProperty.set(logEntry.getProperties() - .stream().anyMatch(p -> p.getName().equals(LogGroupProperty.NAME)));; + .stream().anyMatch(p -> p.getName().equals(LogGroupProperty.NAME))); + jumpToLogEntryTextField.setText(logEntryProperty.get().getId().toString()); }); } } diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTable.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTable.java index 6993b63859..b6fe81fee5 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTable.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTable.java @@ -172,12 +172,17 @@ private void addGoForwardAction() { } } - private void loadLogEntryWithID(Long id) { - goForwardActions.clear(); - addGoBackAction(); - - LogEntry logEntry = controller.client.getLog(id); - gotoLogEntry(logEntry); + protected boolean loadLogEntryWithID(Long id) { + try { + LogEntry logEntry = controller.client.getLog(id); + goForwardActions.clear(); + addGoBackAction(); + gotoLogEntry(logEntry); + return true; + } + catch (RuntimeException runtimeException) { + return false; + } } protected void goBack() { diff --git a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java index 861ede206e..7d5d280eaf 100644 --- a/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java +++ b/app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/Messages.java @@ -38,12 +38,14 @@ public class Messages Forward, GroupingFailed, GroupSelectedEntries, + JumpToLogEntry, Level, Logbook, LogbookNotSupported, LogbooksSearchFailTitle, LogbookServiceUnavailableTitle, LogbookServiceHasNoLogbooks, + LogEntryID, NewLogEntry, NoAttachments, NoClipboardContent, diff --git a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml index 2ed4d85964..a1ee45a978 100644 --- a/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml +++ b/app/logbook/olog/ui/src/main/resources/org/phoebus/logbook/olog/ui/LogEntryDisplay.fxml @@ -33,6 +33,8 @@ +