Skip to content

Commit ff05889

Browse files
committed
add TableHelper class and save / restore visibility state on most tables
1 parent 225c55d commit ff05889

9 files changed

Lines changed: 145 additions & 33 deletions

File tree

app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTable.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.stream.Collectors;
1111

1212
import org.phoebus.framework.nls.NLS;
13+
import org.phoebus.framework.persistence.Memento;
1314
import org.phoebus.framework.spi.AppDescriptor;
1415
import org.phoebus.framework.spi.AppInstance;
1516
import org.phoebus.ui.docking.DockItem;
@@ -87,4 +88,16 @@ public void setNodeResource(URI resource) {
8788
controller.setSearchString(parsedQuery);
8889
controller.setIsNodeTable(true);
8990
}
91+
92+
@Override
93+
public void restore(final Memento memento)
94+
{
95+
controller.restore(memento);
96+
}
97+
98+
@Override
99+
public void save(final Memento memento)
100+
{
101+
controller.save(memento);
102+
}
90103
}

app/alarm/logging-ui/src/main/java/org/phoebus/applications/alarm/logging/ui/AlarmLogTableController.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@
4242
import org.phoebus.applications.alarm.model.SeverityLevel;
4343
import org.phoebus.applications.alarm.model.json.JsonModelReader;
4444
import org.phoebus.applications.alarm.ui.AlarmUI;
45+
import org.phoebus.applications.alarm.ui.table.AlarmInfoRow;
4546
import org.phoebus.framework.jobs.Job;
47+
import org.phoebus.framework.persistence.Memento;
4648
import org.phoebus.framework.selection.SelectionService;
4749
import org.phoebus.ui.application.ContextMenuHelper;
50+
import org.phoebus.ui.application.TableHelper;
4851
import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog;
4952
import org.phoebus.ui.javafx.FocusUtil;
5053
import org.phoebus.ui.javafx.ImageCache;
@@ -607,7 +610,7 @@ public void createContextMenu() {
607610
// search for other context menu actions registered for AlarmLogTableType
608611
SelectionService.getInstance().setSelection("AlarmLogTable", tableView.getSelectionModel().getSelectedItems());
609612

610-
if (ContextMenuHelper.addColumnVisibilityEntries(tableView, contextMenu))
613+
if (TableHelper.addContextMenuColumnVisibilityEntries(tableView, contextMenu))
611614
contextMenu.getItems().add(new SeparatorMenuItem());
612615

613616
ContextMenuHelper.addSupportedEntries(FocusUtil.setFocusOn(tableView), contextMenu);
@@ -663,4 +666,12 @@ public void selectConfigs() {
663666
configsContextMenu.hide();
664667
}
665668
}
669+
670+
void save(final Memento memento) {
671+
TableHelper.saveColumnVisibilities(tableView, memento, (col, idx) -> "COL" + idx + "vis");
672+
}
673+
674+
void restore(final Memento memento) {
675+
TableHelper.restoreColumnVisibilities(tableView, memento, (col, idx) -> "COL" + idx + "vis");
676+
}
666677
}

app/alarm/ui/src/main/java/org/phoebus/applications/alarm/ui/table/AlarmTableUI.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.phoebus.ui.application.ContextMenuHelper;
4040
import org.phoebus.ui.application.ContextMenuService;
4141
import org.phoebus.ui.application.SaveSnapshotAction;
42+
import org.phoebus.ui.application.TableHelper;
4243
import org.phoebus.ui.dialog.ExceptionDetailsErrorDialog;
4344
import org.phoebus.ui.javafx.Brightness;
4445
import org.phoebus.ui.javafx.ClearingTextField;
@@ -540,7 +541,7 @@ private void createContextMenu(final TableView<AlarmInfoRow> table, final boolea
540541
final ObservableList<MenuItem> menu_items = menu.getItems();
541542
menu_items.clear();
542543

543-
if (ContextMenuHelper.addColumnVisibilityEntries(table, menu)) {
544+
if (TableHelper.addContextMenuColumnVisibilityEntries(table, menu)) {
544545
menu_items.add(new SeparatorMenuItem());
545546
}
546547

@@ -610,6 +611,9 @@ void restore(final Memento memento)
610611
for (TableColumn<AlarmInfoRow, ?> col : active.getColumns())
611612
memento.getNumber("COL" + i++).ifPresent(wid -> col.setPrefWidth(wid.doubleValue()));
612613

614+
// visibility is linked to other table, no need to also save/restore other table
615+
TableHelper.restoreColumnVisibilities(active, memento, (col, idx) -> "COL" + idx + "vis");
616+
613617
i = memento.getNumber("SORT").orElse(-1).intValue();
614618
if (i >= 0)
615619
{
@@ -627,6 +631,9 @@ void save(final Memento memento)
627631
for (TableColumn<AlarmInfoRow, ?> col : active.getColumns())
628632
memento.setNumber("COL" + i++, col.getWidth());
629633

634+
// visibility is linked to other table, no need to also save/restore other table
635+
TableHelper.saveColumnVisibilities(active, memento, (col, idx) -> "COL" + idx + "vis");
636+
630637
final List<TableColumn<AlarmInfoRow, ?>> sorted = active.getSortOrder();
631638
if (sorted.size() == 1)
632639
{

app/pvtable/src/main/java/org/phoebus/applications/pvtable/PVTableInstance.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.phoebus.applications.pvtable.ui.PVTable;
2424
import org.phoebus.framework.jobs.JobManager;
2525
import org.phoebus.framework.jobs.JobMonitor;
26+
import org.phoebus.framework.persistence.Memento;
2627
import org.phoebus.framework.spi.AppDescriptor;
2728
import org.phoebus.framework.spi.AppInstance;
2829
import org.phoebus.framework.util.ResourceParser;
@@ -41,13 +42,14 @@ public class PVTableInstance implements AppInstance
4142
final private AppDescriptor app;
4243
final private DockItemWithInput dock_item;
4344

44-
private PVTableModel model = new PVTableModel();
45+
private final PVTableModel model = new PVTableModel();
46+
private final PVTable table;
4547

4648
PVTableInstance(final AppDescriptor app)
4749
{
4850
this.app = app;
4951

50-
final PVTable table = new PVTable(model);
52+
table = new PVTable(model);
5153

5254
dock_item = new DockItemWithInput(this, table, null, PVTableApplication.file_extensions, this::doSave);
5355
DockPane.getActiveDockPane().addTab(dock_item);
@@ -147,4 +149,16 @@ public void stop()
147149
logger.log(Level.INFO, "Stopping PV Table...");
148150
model.dispose();
149151
}
152+
153+
@Override
154+
public void restore(final Memento memento)
155+
{
156+
table.restore(memento);
157+
}
158+
159+
@Override
160+
public void save(final Memento memento)
161+
{
162+
table.save(memento);
163+
}
150164
}

app/pvtable/src/main/java/org/phoebus/applications/pvtable/ui/PVTable.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@
2727
import org.phoebus.applications.pvtable.model.PVTableModelListener;
2828
import org.phoebus.core.types.ProcessVariable;
2929
import org.phoebus.core.vtypes.VTypeHelper;
30+
import org.phoebus.framework.persistence.Memento;
3031
import org.phoebus.framework.selection.Selection;
3132
import org.phoebus.framework.selection.SelectionService;
3233
import org.phoebus.security.authorization.AuthorizationService;
3334
import org.phoebus.ui.application.ContextMenuHelper;
3435
import org.phoebus.ui.application.ContextMenuService;
3536
import org.phoebus.ui.application.SaveSnapshotAction;
37+
import org.phoebus.ui.application.TableHelper;
3638
import org.phoebus.ui.autocomplete.PVAutocompleteMenu;
3739
import org.phoebus.ui.dialog.DialogHelper;
3840
import org.phoebus.ui.dialog.NumericInputDialog;
@@ -740,7 +742,7 @@ private void createContextMenu()
740742
menu.getItems().clear();
741743
menu.getItems().addAll(info, new SeparatorMenuItem());
742744

743-
if (ContextMenuHelper.addColumnVisibilityEntries(table, menu))
745+
if (TableHelper.addContextMenuColumnVisibilityEntries(table, menu))
744746
menu.getItems().add(new SeparatorMenuItem());
745747

746748
if (model.isSaveRestoreEnabled())
@@ -1050,4 +1052,12 @@ private void addPVsFromString(final PVTableItem existing, final String pv_text)
10501052
if (! pv.isEmpty())
10511053
model.addItemAbove(existing, pv);
10521054
}
1055+
1056+
public void save(final Memento memento) {
1057+
TableHelper.saveColumnVisibilities(table, memento, (col, idx) -> "COL" + idx + "vis");
1058+
}
1059+
1060+
public void restore(final Memento memento) {
1061+
TableHelper.restoreColumnVisibilities(table, memento, (col, idx) -> "COL" + idx + "vis");
1062+
}
10531063
}

app/scan/ui/src/main/java/org/csstudio/scan/ui/monitor/ScanMonitor.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -169,23 +169,13 @@ private Node create()
169169
@Override
170170
public void restore(final Memento memento)
171171
{
172-
final List<TableColumn<ScanInfoProxy, ?>> columns = scans.getTableColumns();
173-
// Don't restore width of the last column, the "Error",
174-
// because its pref.width is bound to a computation from table width
175-
// and sum of other columns
176-
for (int i=0; i<columns.size()-1; ++i)
177-
{
178-
final TableColumn<?, ?> col = columns.get(i);
179-
memento.getNumber("COL" + i).ifPresent(wid -> col.setPrefWidth(wid.doubleValue()));
180-
}
172+
scans.restore(memento);
181173
}
182174

183175
@Override
184176
public void save(final Memento memento)
185177
{
186-
int i = 0;
187-
for (TableColumn<?,?> col : scans.getTableColumns())
188-
memento.setNumber("COL" + i++, col.getWidth());
178+
scans.save(memento);
189179
}
190180

191181
private void dispose()

app/scan/ui/src/main/java/org/csstudio/scan/ui/monitor/ScansTable.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import org.csstudio.scan.ui.ScanUIPreferences;
2222
import org.phoebus.framework.jobs.JobManager;
2323
import org.phoebus.framework.jobs.JobMonitor;
24+
import org.phoebus.framework.persistence.Memento;
2425
import org.phoebus.ui.application.ContextMenuHelper;
26+
import org.phoebus.ui.application.TableHelper;
2527
import org.phoebus.ui.dialog.DialogHelper;
2628
import org.phoebus.ui.javafx.ImageCache;
2729
import org.phoebus.util.time.TimestampFormats;
@@ -299,7 +301,7 @@ private void createContextMenu()
299301
// Start with benign, "read only" commands, then end with commands that
300302
// do something like re-submit, abort, remove
301303
menu.getItems().setAll(server_info, new SeparatorMenuItem());
302-
if (ContextMenuHelper.addColumnVisibilityEntries(scan_table, menu))
304+
if (TableHelper.addContextMenuColumnVisibilityEntries(scan_table, menu))
303305
menu.getItems().add(new SeparatorMenuItem());
304306

305307
final List<ScanInfo> selection = scan_table.getSelectionModel().getSelectedItems().stream().map(proxy -> proxy.info).collect(Collectors.toList());
@@ -476,4 +478,24 @@ private boolean isStatusbarVisible()
476478
{
477479
return getChildren().size() > 1;
478480
}
481+
482+
void save(final Memento memento) {
483+
int i = 0;
484+
for (TableColumn<?,?> col : getTableColumns())
485+
memento.setNumber("COL" + i++, col.getWidth());
486+
TableHelper.saveColumnVisibilities(scan_table, memento, (col, idx) -> "COL" + idx + "vis");
487+
}
488+
489+
void restore(final Memento memento) {
490+
final List<TableColumn<ScanInfoProxy, ?>> columns = getTableColumns();
491+
// Don't restore width of the last column, the "Error",
492+
// because its pref.width is bound to a computation from table width
493+
// and sum of other columns
494+
for (int i=0; i<columns.size()-1; ++i)
495+
{
496+
final TableColumn<?, ?> col = columns.get(i);
497+
memento.getNumber("COL" + i).ifPresent(wid -> col.setPrefWidth(wid.doubleValue()));
498+
}
499+
TableHelper.restoreColumnVisibilities(scan_table, memento, (col, idx) -> "COL" + idx + "vis");
500+
}
479501
}

core/ui/src/main/java/org/phoebus/ui/application/ContextMenuHelper.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,4 @@ public static boolean addSupportedEntries(Runnable setFocus, final ContextMenu m
8080

8181
return true;
8282
}
83-
84-
/** Add context menu entries for showing / hiding columns
85-
*
86-
* */
87-
public static boolean addColumnVisibilityEntries(final TableView<?> table, final ContextMenu menu) {
88-
for (TableColumn<?, ?> col : table.getColumns()) {
89-
if (col.getText().isEmpty()) continue;
90-
CheckMenuItem item = new CheckMenuItem("Show " + col.getText());
91-
// col.visibleProperty().bindBidirectional(item.selectedProperty());
92-
item.selectedProperty().bindBidirectional(col.visibleProperty());
93-
menu.getItems().add(item);
94-
}
95-
return !table.getColumns().isEmpty();
96-
}
97-
9883
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.phoebus.ui.application;
2+
3+
import javafx.collections.ObservableList;
4+
import javafx.scene.control.CheckMenuItem;
5+
import javafx.scene.control.ContextMenu;
6+
import javafx.scene.control.TableColumn;
7+
import javafx.scene.control.TableView;
8+
import org.phoebus.framework.persistence.Memento;
9+
10+
import java.util.function.BiFunction;
11+
12+
public class TableHelper {
13+
14+
/** Add context menu entries for showing / hiding columns
15+
* */
16+
public static boolean addContextMenuColumnVisibilityEntries(final TableView<?> table, final ContextMenu menu) {
17+
boolean added_item = false;
18+
for (TableColumn<?, ?> col : table.getColumns()) {
19+
if (col.getText().isEmpty()) continue;
20+
CheckMenuItem item = new CheckMenuItem("Show " + col.getText());
21+
item.selectedProperty().bindBidirectional(col.visibleProperty());
22+
menu.getItems().add(item);
23+
added_item = true;
24+
}
25+
return added_item;
26+
}
27+
28+
29+
/** Save column visibilities to a memento
30+
* */
31+
public static <T> void saveColumnVisibilities(
32+
final TableView<T> table,
33+
final Memento memento,
34+
BiFunction<TableColumn<T, ?>, Integer, String> key
35+
) {
36+
ObservableList<TableColumn<T, ?>> columns = table.getColumns();
37+
for (int i = 0; i < columns.size(); i++) {
38+
TableColumn<T, ?> col = columns.get(i);
39+
if (col.getText().isEmpty()) continue;
40+
String k = key.apply(col, i);
41+
memento.setBoolean(k, col.isVisible());
42+
}
43+
}
44+
45+
/** Restore column visibilities from a memento
46+
* */
47+
public static <T> void restoreColumnVisibilities(
48+
final TableView<T> table,
49+
final Memento memento,
50+
BiFunction<TableColumn<T, ?>, Integer, String> key
51+
) {
52+
ObservableList<TableColumn<T, ?>> columns = table.getColumns();
53+
for (int i = 0; i < columns.size(); i++) {
54+
TableColumn<T, ?> col = columns.get(i);
55+
if (col.getText().isEmpty()) continue;
56+
String k = key.apply(col, i);
57+
memento.getBoolean(k).ifPresent(col::setVisible);
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)