Skip to content

Commit da7ef78

Browse files
committed
Merge remote-tracking branch 'origin/master' into image_offset
2 parents 7e14a6d + 67a2511 commit da7ef78

File tree

17 files changed

+502
-177
lines changed

17 files changed

+502
-177
lines changed

app/display/model/src/main/java/org/csstudio/display/builder/model/properties/IntegerWidgetProperty.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,16 @@ public IntegerWidgetProperty(
6363
@Override
6464
protected Integer parseExpandedSpecification(final String text) throws Exception
6565
{
66+
67+
if(text.isBlank())
68+
{ // If the value read from the .bob is empty then it should return the default
69+
// note we should hard-fail here; there shouldn't be a null value by this point,
70+
// and Integer.valueOf(null) throws an NPE instead of NumberFormatException.
71+
return default_value;
72+
}
73+
6674
try
67-
{ // Should be integer..
75+
{ // Otherwise try to parse to an integer
6876
return Integer.valueOf(text);
6977
}
7078
catch (final NumberFormatException ex)

app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/AdvancedSearchViewController.java

Lines changed: 88 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -21,35 +21,35 @@
2121
import com.google.common.base.Strings;
2222
import javafx.application.Platform;
2323
import javafx.beans.property.SimpleBooleanProperty;
24+
import javafx.beans.value.ChangeListener;
2425
import javafx.beans.value.ObservableValue;
2526
import javafx.fxml.FXML;
26-
import javafx.fxml.FXMLLoader;
2727
import javafx.geometry.Pos;
2828
import javafx.scene.control.Button;
2929
import javafx.scene.control.ComboBox;
3030
import javafx.scene.control.Label;
3131
import javafx.scene.control.RadioButton;
3232
import javafx.scene.control.TextField;
33+
import javafx.scene.input.KeyCode;
34+
import javafx.scene.input.KeyEvent;
3335
import javafx.scene.layout.AnchorPane;
3436
import javafx.scene.layout.GridPane;
3537
import javafx.scene.layout.HBox;
3638
import javafx.scene.layout.VBox;
3739
import org.phoebus.logbook.LogClient;
3840
import org.phoebus.logbook.Logbook;
3941
import org.phoebus.logbook.Tag;
40-
import org.phoebus.ui.dialog.ListSelectionController;
42+
import org.phoebus.ui.dialog.ListSelectionPopOver;
4143
import org.phoebus.ui.dialog.PopOver;
4244
import org.phoebus.ui.time.TimeRelativeIntervalPane;
4345
import org.phoebus.util.time.TimeParser;
4446
import org.phoebus.util.time.TimeRelativeInterval;
4547
import org.phoebus.util.time.TimestampFormats;
4648

47-
import java.io.IOException;
4849
import java.util.Arrays;
4950
import java.util.Collections;
5051
import java.util.List;
5152
import java.util.Map;
52-
import java.util.logging.Level;
5353
import java.util.logging.Logger;
5454
import java.util.stream.Collectors;
5555

@@ -84,23 +84,17 @@ public class AdvancedSearchViewController {
8484

8585
@FXML
8686
TextField searchLogbooks;
87-
PopOver logbookSearchPopover;
87+
ListSelectionPopOver logbookSearchPopover;
8888

8989
@FXML
9090
ComboBox<String> levelSelector;
9191

9292
@FXML
9393
TextField searchTags;
94-
PopOver tagSearchPopover;
94+
ListSelectionPopOver tagSearchPopover;
9595

9696
private final LogClient logClient;
9797

98-
private ListSelectionController tagController;
99-
private ListSelectionController logbookController;
100-
101-
List<String> logbookNames;
102-
List<String> tagNames;
103-
10498
@FXML
10599
private AnchorPane advancedSearchPane;
106100

@@ -118,26 +112,45 @@ public class AdvancedSearchViewController {
118112
private final SimpleBooleanProperty sortAscending = new SimpleBooleanProperty(false);
119113
private final SimpleBooleanProperty requireAttachments = new SimpleBooleanProperty(false);
120114

115+
private Runnable searchCallback = () -> {
116+
throw new IllegalStateException("Search callback is not set on AdvancedSearchViewConroller!");
117+
};
118+
121119
public AdvancedSearchViewController(LogClient logClient, SearchParameters searchParameters) {
122120
this.logClient = logClient;
123121
this.searchParameters = searchParameters;
124122
}
125123

124+
public void setSearchCallback(Runnable searchCallback) {
125+
this.searchCallback = searchCallback;
126+
}
127+
126128
@FXML
127129
public void initialize() {
128130

129131
searchTitle.textProperty().bindBidirectional(this.searchParameters.titleProperty());
132+
searchTitle.setOnKeyReleased(this::searchOnEnter);
130133
searchText.textProperty().bindBidirectional(this.searchParameters.textProperty());
134+
searchText.setOnKeyReleased(this::searchOnEnter);
131135
searchAuthor.textProperty().bindBidirectional(this.searchParameters.authorProperty());
136+
searchAuthor.setOnKeyReleased(this::searchOnEnter);
132137
levelSelector.valueProperty().bindBidirectional(this.searchParameters.levelProperty());
138+
levelSelector.setOnAction(e -> searchCallback.run());
133139
searchTags.textProperty().bindBidirectional(this.searchParameters.tagsProperty());
140+
searchParameters.tagsProperty().addListener(searchOnTextChange);
134141
searchLogbooks.textProperty().bindBidirectional(this.searchParameters.logbooksProperty());
142+
searchParameters.logbooksProperty().addListener(searchOnTextChange);
135143
startTime.textProperty().bindBidirectional(this.searchParameters.startTimeProperty());
144+
startTime.setOnKeyReleased(this::searchOnEnter);
136145
endTime.textProperty().bindBidirectional(this.searchParameters.endTimeProperty());
146+
endTime.setOnKeyReleased(this::searchOnEnter);
137147
searchParameters.addListener((observable, oldValue, newValue) -> {
138148
updateControls(newValue);
139149
});
150+
sortAscending.addListener(searchOnSortChange);
151+
140152
attachmentTypes.textProperty().bindBidirectional(this.searchParameters.attachmentsProperty());
153+
attachmentTypes.setOnKeyReleased(this::searchOnEnter);
141154

142155
levelLabel.setText(LogbookUIPreferences.level_field_name);
143156

@@ -173,6 +186,7 @@ public void initialize() {
173186
}
174187
if (timeSearchPopover.isShowing())
175188
timeSearchPopover.hide();
189+
searchCallback.run();
176190
});
177191
});
178192
Button cancel = new Button();
@@ -204,68 +218,50 @@ public void initialize() {
204218
}
205219
});
206220

207-
FXMLLoader logbookSelectionLoader = new FXMLLoader();
208-
logbookSelectionLoader.setLocation(this.getClass().getResource("/org/phoebus/ui/dialog/ListSelection.fxml"));
209-
try {
210-
logbookSelectionLoader.load();
211-
logbookController = logbookSelectionLoader.getController();
212-
logbookController.setOnApply((List<String> t) -> {
213-
Platform.runLater(() -> {
214-
if (t.isEmpty()) {
215-
searchParameters.logbooksProperty().setValue(null);
216-
} else {
217-
searchParameters.logbooksProperty().setValue(t.stream().collect(Collectors.joining(",")));
221+
logbookSearchPopover = ListSelectionPopOver.create(
222+
(logbooks, popover) -> {
223+
String logbooksValue = String.join(",", logbooks);
224+
searchParameters.logbooksProperty().setValue(logbooksValue);
225+
if (popover.isShowing()) {
226+
popover.hide();
218227
}
219-
if (logbookSearchPopover.isShowing())
220-
logbookSearchPopover.hide();
221-
});
222-
return true;
223-
});
224-
logbookController.setOnCancel((List<String> t) -> {
225-
if (logbookSearchPopover.isShowing())
226-
logbookSearchPopover.hide();
227-
return true;
228-
});
229-
logbookSearchPopover = new PopOver(logbookSelectionLoader.getRoot());
230-
} catch (IOException e) {
231-
logger.log(Level.WARNING, "failed to open logbook search dialog", e);
232-
}
228+
},
229+
(logbooks, popover) -> {
230+
if (popover.isShowing()) {
231+
popover.hide();
232+
}
233+
}
234+
);
233235

234-
FXMLLoader tagSelectionLoader = new FXMLLoader();
235-
tagSelectionLoader.setLocation(this.getClass().getResource("/org/phoebus/ui/dialog/ListSelection.fxml"));
236-
try {
237-
tagSelectionLoader.load();
238-
tagController = tagSelectionLoader.getController();
239-
tagController.setOnApply((List<String> t) -> {
240-
Platform.runLater(() -> {
241-
242-
String tagsValue =
243-
t.stream().collect(Collectors.joining(","));
244-
//searchParameters.put(Keys.TAGS, tagsValue);
236+
tagSearchPopover = ListSelectionPopOver.create(
237+
(tags, popover) -> {
238+
String tagsValue = String.join(",", tags);
245239
searchParameters.tagsProperty().setValue(tagsValue);
246-
247-
if (tagSearchPopover.isShowing()) {
248-
tagSearchPopover.hide();
240+
if (popover.isShowing()) {
241+
popover.hide();
249242
}
250-
});
251-
return true;
252-
});
253-
tagController.setOnCancel((List<String> t) -> {
254-
if (tagSearchPopover.isShowing())
255-
tagSearchPopover.hide();
256-
return true;
257-
});
258-
tagSearchPopover = new PopOver(tagSelectionLoader.getRoot());
259-
} catch (IOException e) {
260-
logger.log(Level.WARNING, "failed to open tag search dialog", e);
261-
}
243+
},
244+
(tags, popover) -> {
245+
if (popover.isShowing()) {
246+
popover.hide();
247+
}
248+
}
249+
);
262250

263251
searchTags.setOnMouseClicked(mouseEvent -> {
264252
if (tagSearchPopover.isShowing()) {
265253
tagSearchPopover.hide();
266254
} else {
267-
tagNames = logClient.listTags().stream().map(Tag::getName).sorted().collect(Collectors.toList());
268-
tagController.setAvailable(tagNames);
255+
List<String> selectedTags = Arrays.stream( searchParameters.tagsProperty().getValueSafe().split(","))
256+
.map(String::trim)
257+
.filter(it -> !it.isEmpty())
258+
.collect(Collectors.toList());
259+
List<String> availableTags = logClient.listTags().stream()
260+
.map(Tag::getName)
261+
.sorted()
262+
.collect(Collectors.toList());
263+
tagSearchPopover.setAvailable(availableTags, selectedTags);
264+
tagSearchPopover.setSelected(selectedTags);
269265
tagSearchPopover.show(searchTags);
270266
}
271267
});
@@ -274,8 +270,16 @@ public void initialize() {
274270
if (logbookSearchPopover.isShowing()) {
275271
logbookSearchPopover.hide();
276272
} else {
277-
logbookNames = logClient.listLogbooks().stream().map(Logbook::getName).sorted().collect(Collectors.toList());
278-
logbookController.setAvailable(logbookNames);
273+
List<String> selectedLogbooks = Arrays.stream( searchParameters.logbooksProperty().getValueSafe().split(","))
274+
.map(String::trim)
275+
.filter(it -> !it.isEmpty())
276+
.collect(Collectors.toList());
277+
List<String> availableLogbooks = logClient.listLogbooks().stream()
278+
.map(Logbook::getName)
279+
.sorted()
280+
.collect(Collectors.toList());
281+
logbookSearchPopover.setAvailable(availableLogbooks, selectedLogbooks);
282+
logbookSearchPopover.setSelected(selectedLogbooks);
279283
logbookSearchPopover.show(searchLogbooks);
280284
}
281285
});
@@ -324,7 +328,7 @@ private void updateControls(String queryString) {
324328
validatedLogbookNames.stream().collect(Collectors.joining(","));
325329
searchParameters.logbooksProperty().setValue(selectedLogbooks);
326330
}
327-
logbookController.setSelected(validatedLogbookNames);
331+
logbookSearchPopover.setSelected(validatedLogbookNames);
328332
} else if (keys.equals(Keys.TAGS)) {
329333
List<String> validatedTagsNames = getValidatedTagsSelection(entry.getValue());
330334
if (validatedTagsNames.isEmpty()) {
@@ -333,7 +337,7 @@ private void updateControls(String queryString) {
333337
String selectedTags = validatedTagsNames.stream().collect(Collectors.joining(","));
334338
searchParameters.tagsProperty().setValue(selectedTags);
335339
}
336-
tagController.setSelected(validatedTagsNames);
340+
tagSearchPopover.setSelected(validatedTagsNames);
337341
}
338342
}
339343
});
@@ -368,4 +372,19 @@ protected List<String> getValidatedTagsSelection(String tags) {
368372
public SimpleBooleanProperty getSortAscending(){
369373
return sortAscending;
370374
}
375+
376+
private void searchOnEnter(KeyEvent e) {
377+
if (e.getCode() == KeyCode.ENTER) {
378+
searchCallback.run();
379+
}
380+
}
381+
382+
private final ChangeListener<? super String> searchOnTextChange = (options, oldValue, newValue) -> {
383+
searchCallback.run();
384+
};
385+
386+
private final ChangeListener<? super Boolean> searchOnSortChange = (options, oldValue, newValue) -> {
387+
searchCallback.run();
388+
};
389+
371390
}

app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryCalender.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import javafx.fxml.FXMLLoader;
44
import javafx.scene.control.Alert;
5+
import org.phoebus.framework.nls.NLS;
56
import org.phoebus.framework.persistence.Memento;
67
import org.phoebus.framework.spi.AppDescriptor;
78
import org.phoebus.framework.spi.AppInstance;
@@ -13,6 +14,7 @@
1314
import org.phoebus.ui.docking.DockPane;
1415

1516
import java.io.IOException;
17+
import java.util.ResourceBundle;
1618
import java.util.logging.Level;
1719
import java.util.logging.Logger;
1820

@@ -33,7 +35,9 @@ public class LogEntryCalender implements AppInstance {
3335
SearchParameters searchParameters = new SearchParameters();
3436
searchParameters.setQuery(ologQueryManager.getQueries().get(0).getQuery());
3537
FXMLLoader loader = new FXMLLoader();
38+
ResourceBundle resourceBundle = NLS.getMessages(Messages.class);
3639
loader.setLocation(this.getClass().getResource("LogEntryCalenderView.fxml"));
40+
loader.setResources(resourceBundle);
3741
loader.setControllerFactory(clazz -> {
3842
try {
3943
if(app.getClient() != null)

app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryCalenderViewController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ public LogEntryCalenderViewController(LogClient logClient, OlogQueryManager olog
9797

9898
@FXML
9999
public void initialize() {
100+
101+
advancedSearchViewController.setSearchCallback(this::search);
100102
configureComboBox();
101103
// Set the search parameters in the advanced search controller so that it operates on the same object.
102104
ologQueries.setAll(ologQueryManager.getQueries());

app/logbook/olog/ui/src/main/java/org/phoebus/logbook/olog/ui/LogEntryTableViewController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ public LogEntryTableViewController(LogClient logClient, OlogQueryManager ologQue
132132

133133
@FXML
134134
public void initialize() {
135+
136+
advancedSearchViewController.setSearchCallback(this::search);
137+
135138
configureComboBox();
136139
ologQueries.setAll(ologQueryManager.getQueries());
137140

0 commit comments

Comments
 (0)