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 @@
+
+