From 92bd716a443b18d223231d2023b91d5211bebc1b Mon Sep 17 00:00:00 2001 From: ksaintin Date: Thu, 27 Feb 2025 03:07:20 +0100 Subject: [PATCH 1/2] Manage layout as absolute path and save memento in user location backward compatibility see #3250 --- .../main/java/org/phoebus/ui/Preferences.java | 2 +- .../ui/application/PhoebusApplication.java | 52 ++++++++----------- .../ui/application/SaveLayoutHelper.java | 31 +++++------ .../phoebus_ui_preferences.properties | 2 +- 4 files changed, 41 insertions(+), 46 deletions(-) diff --git a/core/ui/src/main/java/org/phoebus/ui/Preferences.java b/core/ui/src/main/java/org/phoebus/ui/Preferences.java index 4ca81ee0f3..97b43aaac8 100644 --- a/core/ui/src/main/java/org/phoebus/ui/Preferences.java +++ b/core/ui/src/main/java/org/phoebus/ui/Preferences.java @@ -43,7 +43,7 @@ public class Preferences @Preference public static String default_save_path; /** layout_dir */ @Preference public static String layout_dir; - /** layout_default */ + /** layout_default absolute path*/ @Preference public static String layout_default; /** print_landscape */ @Preference public static boolean print_landscape; diff --git a/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java b/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java index 0acb2707db..5108576c30 100644 --- a/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java +++ b/core/ui/src/main/java/org/phoebus/ui/application/PhoebusApplication.java @@ -560,28 +560,7 @@ private void startUI(final MementoTree memento, final JobMonitor monitor) throws Preferences.ui_monitor_period, TimeUnit.MILLISECONDS); closeAllTabsMenuItem.acceleratorProperty().setValue(closeAllTabsKeyCombination); - - //Load a custom layout at start if layout_default is defined in preferences - String layoutFileName = Preferences.layout_default; - if(layoutFileName != null && !layoutFileName.isBlank()) { - layoutFileName = !layoutFileName.endsWith(".memento")? layoutFileName + ".memento" :layoutFileName; - String layout_dir = Preferences.layout_dir; - File parentFolder = null; - File user = Locations.user(); - if(layout_dir != null && !layout_dir.isBlank() && !layout_dir.contains("$(")) { - parentFolder = new File(user, layout_dir); - } - if(parentFolder == null) { - parentFolder = user; - } - File layoutFile = new File(parentFolder,layoutFileName ); - if(layoutFile.exists()) { - startLayoutReplacement(layoutFile); - } - else { - logger.log(Level.WARNING, "Layout file " + layoutFileName + " is not found"); - } - } + } /** @@ -798,9 +777,8 @@ void createLoadLayoutsMenu() { } // Get every momento file from the configured layout - String layout_dir = Preferences.layout_dir; - if (layout_dir != null && !layout_dir.isBlank() && !layout_dir.contains("$(")) { - final File layoutDir = new File(Locations.user(), layout_dir); + if (Preferences.layout_dir != null && !Preferences.layout_dir.isBlank()) { + final File layoutDir = new File(Preferences.layout_dir); if (layoutDir.exists()) { final File[] systemLayoutFiles = layoutDir.listFiles(); if (systemLayoutFiles != null) { @@ -1317,9 +1295,10 @@ private void replaceLayout(final MementoTree memento) { */ private MementoTree loadDefaultMemento(final List parameters, final JobMonitor monitor) { monitor.beginTask(Messages.MonitorTaskPers, 1); - File memfile = XMLMementoTree.getDefaultFile(); + MementoTree memTree = null; + File memfile = null; try { - for (int i = 0; i < parameters.size(); ++i) + for (int i = 0; i < parameters.size(); ++i) { if ("-layout".equals(parameters.get(i))) { if (i >= parameters.size() - 1) throw new Exception("Missing /path/to/Example.memento for -layout option"); @@ -1331,9 +1310,24 @@ private MementoTree loadDefaultMemento(final List parameters, final JobM parameters.remove(i); break; } + } + if(memfile == null) {//if no layout found in argument check preferences + //Load a custom layout at start if layout_default is defined in preferences + String layoutFileName = Preferences.layout_default; + if(layoutFileName != null && !layoutFileName.isBlank()) { + //layout is in absolute path and not based on layout_dir + layoutFileName = !layoutFileName.endsWith(".memento")? layoutFileName + ".memento" :layoutFileName; + memfile = new File(layoutFileName); + } + } + + if(memfile == null) {// if still null get default one + memfile = XMLMementoTree.getDefaultFile(); + } + if (memfile.canRead()) { logger.log(Level.INFO, "Loading state from " + memfile); - return loadMemento(memfile); + memTree = loadMemento(memfile); } else logger.log(Level.WARNING, "Cannot load state from " + memfile + ", no such file"); } catch (Exception ex) { @@ -1341,7 +1335,7 @@ private MementoTree loadDefaultMemento(final List parameters, final JobM } finally { monitor.done(); } - return null; + return memTree; } /** diff --git a/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java b/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java index babdb53383..517f22a705 100644 --- a/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java +++ b/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java @@ -157,23 +157,19 @@ private static void positionDialog(final Dialog dialog, Stage stage) private static boolean saveState(List stagesToSave, final String layout) { final String memento_filename = layout + ".memento"; - //Take in account layout dir and add Layout folder in the path + //Always Save in user location for backward compatibilty + final File memento_file = new File(Locations.user(), memento_filename); + //Save also in layout_dir as absolute path instead of user relative location String layout_dir = Preferences.layout_dir; - File user = Locations.user(); - File parentFolder = null; - if(layout_dir != null && !layout_dir.isEmpty() && !layout_dir.contains("$(")) { - parentFolder = new File(user , layout_dir); - if(!parentFolder.exists()) { - parentFolder.mkdir(); + File layoutDir = null; + if(layout_dir != null && !layout_dir.isBlank() && !layout_dir.contains("$(")) { + layoutDir = new File(layout_dir); + if(!layoutDir.exists()) { + layoutDir.mkdir(); } } - if(parentFolder == null) { - parentFolder = user; - } - - final File memento_file = new File(parentFolder, memento_filename); - + final File memento_custom = layoutDir != null ? new File(layoutDir, memento_filename):null; // File.exists() is blocking in nature. // To combat this the phoebus application maintains a list of *.memento files that are in the default directory. // Check if the file name is in the list, and confirm a file overwrite with the user. @@ -189,8 +185,13 @@ private static boolean saveState(List stagesToSave, final String layout) // Save in background thread JobManager.schedule("Save " + memento_filename, monitor -> { - MementoHelper.saveState(stagesToSave, memento_file, null, null, PhoebusApplication.INSTANCE.isMenuVisible(), PhoebusApplication.INSTANCE.isToolbarVisible(), PhoebusApplication.INSTANCE.isStatusbarVisible()); - + boolean menuVisible = PhoebusApplication.INSTANCE.isMenuVisible(); + boolean toolbarVisible = PhoebusApplication.INSTANCE.isToolbarVisible(); + boolean statusBarVisible = PhoebusApplication.INSTANCE.isStatusbarVisible(); + MementoHelper.saveState(stagesToSave, memento_file, null, null,menuVisible, toolbarVisible, statusBarVisible); + if(memento_custom != null){ + MementoHelper.saveState(stagesToSave, memento_custom, null, null,menuVisible, toolbarVisible, statusBarVisible); + } // After the layout has been saved, // update menu to include the newly saved layout PhoebusApplication.INSTANCE.createLoadLayoutsMenu(); diff --git a/core/ui/src/main/resources/phoebus_ui_preferences.properties b/core/ui/src/main/resources/phoebus_ui_preferences.properties index c85bc446e4..fa10200fef 100644 --- a/core/ui/src/main/resources/phoebus_ui_preferences.properties +++ b/core/ui/src/main/resources/phoebus_ui_preferences.properties @@ -96,7 +96,7 @@ default_save_path= # Set the path to a folder with default layouts layout_dir= -# Set default layout at start +# Set default layout at start absolutepath layout_default= # Compute print scaling in 'landscape' mode? From 615fbe29b5f6707218f6a2e28caff401d1f38411 Mon Sep 17 00:00:00 2001 From: ksaintin Date: Thu, 27 Feb 2025 13:22:14 +0100 Subject: [PATCH 2/2] Save layout in user location else in layout_dir if flag save_layout_in_layout_dir is enable see PR #3300 --- .../main/java/org/phoebus/ui/Preferences.java | 2 ++ .../ui/application/SaveLayoutHelper.java | 29 ++++++++++--------- .../phoebus_ui_preferences.properties | 3 ++ 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/core/ui/src/main/java/org/phoebus/ui/Preferences.java b/core/ui/src/main/java/org/phoebus/ui/Preferences.java index 97b43aaac8..dad73b7a38 100644 --- a/core/ui/src/main/java/org/phoebus/ui/Preferences.java +++ b/core/ui/src/main/java/org/phoebus/ui/Preferences.java @@ -45,6 +45,8 @@ public class Preferences @Preference public static String layout_dir; /** layout_default absolute path*/ @Preference public static String layout_default; + /** layout_default absolute path*/ + @Preference public static boolean save_layout_in_layout_dir; /** print_landscape */ @Preference public static boolean print_landscape; /** ok_severity_text_color */ diff --git a/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java b/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java index 517f22a705..0f96a6fc64 100644 --- a/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java +++ b/core/ui/src/main/java/org/phoebus/ui/application/SaveLayoutHelper.java @@ -157,19 +157,24 @@ private static void positionDialog(final Dialog dialog, Stage stage) private static boolean saveState(List stagesToSave, final String layout) { final String memento_filename = layout + ".memento"; - //Always Save in user location for backward compatibilty - final File memento_file = new File(Locations.user(), memento_filename); - //Save also in layout_dir as absolute path instead of user relative location - String layout_dir = Preferences.layout_dir; - File layoutDir = null; - if(layout_dir != null && !layout_dir.isBlank() && !layout_dir.contains("$(")) { - layoutDir = new File(layout_dir); - if(!layoutDir.exists()) { - layoutDir.mkdir(); + //By default save in user location folder + File tmpMementoFile = new File(Locations.user(), memento_filename); + + //Save in layout_dir as absolute path if save_in_layout_dir is enable + boolean save_in_layout_dir = Preferences.save_layout_in_layout_dir; + if(save_in_layout_dir) { + String layout_dir = Preferences.layout_dir; + if(layout_dir != null && !layout_dir.isBlank() && !layout_dir.contains("$(")) { + File layoutDir = new File(layout_dir); + // the folder could be in read only + if(layoutDir.exists() && layoutDir.canWrite()) { + tmpMementoFile = new File(layoutDir, memento_filename); + } } } + + final File memento_file = tmpMementoFile; - final File memento_custom = layoutDir != null ? new File(layoutDir, memento_filename):null; // File.exists() is blocking in nature. // To combat this the phoebus application maintains a list of *.memento files that are in the default directory. // Check if the file name is in the list, and confirm a file overwrite with the user. @@ -188,10 +193,8 @@ private static boolean saveState(List stagesToSave, final String layout) boolean menuVisible = PhoebusApplication.INSTANCE.isMenuVisible(); boolean toolbarVisible = PhoebusApplication.INSTANCE.isToolbarVisible(); boolean statusBarVisible = PhoebusApplication.INSTANCE.isStatusbarVisible(); + MementoHelper.saveState(stagesToSave, memento_file, null, null,menuVisible, toolbarVisible, statusBarVisible); - if(memento_custom != null){ - MementoHelper.saveState(stagesToSave, memento_custom, null, null,menuVisible, toolbarVisible, statusBarVisible); - } // After the layout has been saved, // update menu to include the newly saved layout PhoebusApplication.INSTANCE.createLoadLayoutsMenu(); diff --git a/core/ui/src/main/resources/phoebus_ui_preferences.properties b/core/ui/src/main/resources/phoebus_ui_preferences.properties index fa10200fef..cfb8b0d59f 100644 --- a/core/ui/src/main/resources/phoebus_ui_preferences.properties +++ b/core/ui/src/main/resources/phoebus_ui_preferences.properties @@ -99,6 +99,9 @@ layout_dir= # Set default layout at start absolutepath layout_default= +# If enable layout are saved in layout_dir instead of default user location +save_layout_in_layout_dir=false + # Compute print scaling in 'landscape' mode? # Landscape mode is generally most suited for printouts # of displays or plots, because the monitor tends to be 'wide'.