This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit f9bc7c3723623d1b79dd62fe4396caf1c8392a5c
Author: Andrus Adamchik <[email protected]>
AuthorDate: Wed May 20 09:43:50 2026 -0400

    Modeler prefs - removing locator lookups from PreferenceAdapter constructors
---
 .../java/org/apache/cayenne/modeler/Application.java  |  8 ++++----
 .../apache/cayenne/modeler/pref/ClasspathPrefs.java   |  5 +++--
 .../apache/cayenne/modeler/pref/DBConnectorPrefs.java |  6 +++---
 .../org/apache/cayenne/modeler/pref/DataMapPrefs.java |  7 ++++---
 .../apache/cayenne/modeler/pref/DataNodePrefs.java    | 19 ++++++-------------
 .../org/apache/cayenne/modeler/pref/GeneralPrefs.java |  6 ++++--
 .../cayenne/modeler/pref/RecentProjectsPrefs.java     |  5 +++--
 .../apache/cayenne/modeler/project/ProjectPrefs.java  |  7 +++----
 .../cayenne/modeler/project/ProjectSession.java       |  4 ++--
 .../toolkit/component/CMComponentGeometryPrefs.java   |  6 +++---
 .../toolkit/filechooser/CMFileChooserPrefs.java       |  6 +++---
 .../modeler/toolkit/splitpane/CMSplitPanePrefs.java   |  6 +++---
 .../cayenne/modeler/toolkit/table/CMTablePrefs.java   |  6 +++---
 .../java/org/apache/cayenne/modeler/ui/MainFrame.java |  8 ++++----
 .../org/apache/cayenne/modeler/ui/MainMenuBar.java    |  2 +-
 .../modeler/ui/action/DBConnectionAwareAction.java    |  2 +-
 .../modeler/ui/action/ImportDataMapAction.java        |  2 +-
 .../modeler/ui/action/ImportEOModelAction.java        |  2 +-
 .../cayenne/modeler/ui/action/ProjectOpener.java      |  2 +-
 .../modeler/ui/action/ShowLogConsoleAction.java       |  2 +-
 .../modeler/ui/confirmremove/ConfirmRemoveDialog.java |  4 ++--
 .../modeler/ui/datasource/DataSourceDialog.java       |  8 ++++----
 .../modeler/ui/dbgen/DBGeneratorOptionsDialog.java    |  2 +-
 .../cayenne/modeler/ui/dbgen/DBGeneratorPrefs.java    | 10 +++++-----
 .../ui/dbrelationship/DbRelationshipDialog.java       |  2 +-
 .../cayenne/modeler/ui/logconsole/LogConsole.java     |  4 ++--
 .../modeler/ui/logconsole/LogConsolePrefs.java        |  9 +++++----
 .../ui/preferences/classpath/ClasspathPrefsPanel.java |  6 +++---
 .../ui/preferences/general/GeneralPrefsPanel.java     |  4 ++--
 .../cayenne/modeler/ui/project/ProjectView.java       |  2 +-
 .../editor/datadomain/cgen/DataDomainCgenTab.java     |  2 +-
 .../ui/project/editor/datamap/cgen/CgenPanel.java     |  2 +-
 .../datamap/cgen/templateeditor/TemplateEditor.java   |  4 ++--
 .../project/editor/datamap/main/DataMapMainView.java  |  2 +-
 .../project/editor/datanode/DataNodeEditorPanel.java  |  8 ++++++--
 .../editor/datanode/jdbc/JDBCDataSourcePanel.java     |  5 ++---
 .../editor/dbentity/properties/DbAttributePanel.java  |  2 +-
 .../dbentity/properties/DbEntityPropertiesView.java   |  2 +-
 .../dbentity/properties/DbRelationshipPanel.java      |  2 +-
 .../attributes/EmbeddableAttributesView.java          |  2 +-
 .../objentity/attrinfo/ObjAttributeInfoDialog.java    |  2 +-
 .../objentity/callbacks/ObjEntityCallbacksView.java   |  4 ++--
 .../objentity/properties/ObjAttributePanel.java       |  2 +-
 .../objentity/properties/ObjEntityPropertiesView.java |  2 +-
 .../objentity/properties/ObjRelationshipPanel.java    |  2 +-
 .../editor/procedure/ProcedureParameterTab.java       |  2 +-
 .../query/selectquery/SelectQueryOrderingTab.java     |  2 +-
 .../query/sqltemplate/SQLTemplatePrefetchTab.java     |  2 +-
 .../cayenne/modeler/ui/welcome/WelcomeScreen.java     |  2 +-
 49 files changed, 107 insertions(+), 106 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index 9ffb75038..1b9f62636 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -187,7 +187,7 @@ public class Application {
 
         getPrefsManager().runMigrations();
 
-        this.dbConnectors = new DBConnectorPrefs(prefsLocator).getConnectors();
+        this.dbConnectors = new 
DBConnectorPrefs(prefsLocator.appNode(DBConnectorPrefs.NODE)).getConnectors();
 
         refreshClassLoader();
 
@@ -238,7 +238,7 @@ public class Application {
      * Reinitializes ModelerClassLoader from preferences.
      */
     public void refreshClassLoader() {
-        List<String> values = new ClasspathPrefs(prefsLocator).getEntries();
+        List<String> values = new 
ClasspathPrefs(prefsLocator.appNode(ClasspathPrefs.NODE)).getEntries();
         if (!values.isEmpty()) {
             
getClassLoader().setFiles(values.stream().map(File::new).collect(Collectors.toList()));
         }
@@ -246,8 +246,8 @@ public class Application {
 
     private File initialProjectFromPreferences() {
 
-        if (new GeneralPrefs(prefsLocator).isAutoLoadProject()) {
-            List<File> files = new 
RecentProjectsPrefs(prefsLocator).getFiles();
+        if (new 
GeneralPrefs(prefsLocator.appNode(GeneralPrefs.NODE)).isAutoLoadProject()) {
+            List<File> files = new 
RecentProjectsPrefs(prefsLocator.appNode(RecentProjectsPrefs.NODE)).getFiles();
             if (!files.isEmpty()) {
                 return files.getFirst();
             }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ClasspathPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ClasspathPrefs.java
index c256fed4a..bf306c360 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ClasspathPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ClasspathPrefs.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
 
 public final class ClasspathPrefs extends PreferenceAdapter {
 
@@ -33,8 +34,8 @@ public final class ClasspathPrefs extends PreferenceAdapter {
 
     public static final String NODE = "classpath";
 
-    public ClasspathPrefs(PrefsLocator locator) {
-        super(locator.appNode(NODE));
+    public ClasspathPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     // Returns classpath entries in numeric-key order. Defensive against any
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectorPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectorPrefs.java
index 9d700cb39..3c4adde9f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectorPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectorPrefs.java
@@ -32,7 +32,7 @@ import java.util.prefs.Preferences;
  */
 public class DBConnectorPrefs extends PreferenceAdapter {
 
-    static final String NODE = "dbConnectors";
+    public static final String NODE = "dbConnectors";
 
     private static final String DB_ADAPTER_PROPERTY = "dbAdapter";
     private static final String JDBC_DRIVER_PROPERTY = "jdbcDriver";
@@ -40,8 +40,8 @@ public class DBConnectorPrefs extends PreferenceAdapter {
     private static final String URL_PROPERTY = "url";
     private static final String USER_NAME_PROPERTY = "userName";
 
-    public DBConnectorPrefs(PrefsLocator locator) {
-        super(locator.appNode(NODE));
+    public DBConnectorPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public DBConnectors getConnectors() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapPrefs.java
index c9a772117..4f9b7c955 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapPrefs.java
@@ -18,16 +18,17 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.pref;
 
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.dbconnector.DBConnector;
 
+import java.util.prefs.Preferences;
+
 public final class DataMapPrefs extends PreferenceAdapter {
 
     public static final String SUPERCLASS_PACKAGE_PROPERTY = 
"superclassPackage";
     public static final String DEFAULT_SUPERCLASS_PACKAGE_SUFFIX = "auto";
 
-    public DataMapPrefs(PrefsManager repository, DataMap dataMap) {
-        super(repository.dataMapPref(dataMap, null));
+    public DataMapPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataNodePrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataNodePrefs.java
index 2dc785c4f..79c00d94f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataNodePrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataNodePrefs.java
@@ -18,29 +18,22 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.pref;
 
-import org.apache.cayenne.project.Project;
+import java.util.prefs.Preferences;
 
 public final class DataNodePrefs extends PreferenceAdapter {
 
     public static final String LOCAL_DATA_SOURCE_PROPERTY = "localDataSource";
 
-    static final String NODE = "dataNode";
-
-    private final PrefsManager repository;
-    private final Project project;
+    public static final String NODE = "dataNode";
 
     private String localDataSource;
 
-    public DataNodePrefs(PrefsManager repository, Project project, String 
dataNodeName) {
-        super(repository.projectPref(project, NODE + "/" + dataNodeName));
-
-        // capture repo and project for the sake of "rename"
-        this.repository = repository;
-        this.project = project;
+    public DataNodePrefs(Preferences prefs) {
+        super(prefs);
     }
 
-    public DataNodePrefs rename(String newName) {
-        DataNodePrefs renamed = new DataNodePrefs(repository, project, 
newName);
+    public DataNodePrefs renameTo(Preferences newPrefs) {
+        DataNodePrefs renamed = new DataNodePrefs(newPrefs);
 
         // TODO: is this the correct behavior? In the DataMapPrefs we are 
doing "copy", not "move" to handle reverts
         PreferencesCopier.move(prefs, renamed.prefs);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/GeneralPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/GeneralPrefs.java
index 877b14bbd..dc3eb10f8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/GeneralPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/GeneralPrefs.java
@@ -19,6 +19,8 @@
 
 package org.apache.cayenne.modeler.pref;
 
+import java.util.prefs.Preferences;
+
 public final class GeneralPrefs extends PreferenceAdapter {
 
     public static final String NODE = "general";
@@ -28,8 +30,8 @@ public final class GeneralPrefs extends PreferenceAdapter {
     public static final String ENCODING = "encoding";
     public static final String FAVOURITE_DATA_SOURCE = "favouriteDataSource";
 
-    public GeneralPrefs(PrefsLocator locator) {
-        super(locator.appNode(NODE));
+    public GeneralPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public boolean isAutoLoadProject() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/RecentProjectsPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/RecentProjectsPrefs.java
index 729a85134..3e78898b0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/RecentProjectsPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/RecentProjectsPrefs.java
@@ -26,6 +26,7 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
 
 public final class RecentProjectsPrefs extends PreferenceAdapter {
 
@@ -35,8 +36,8 @@ public final class RecentProjectsPrefs extends 
PreferenceAdapter {
 
     public static final String NODE = "lastProjects";
 
-    public RecentProjectsPrefs(PrefsLocator locator) {
-        super(locator.appNode(NODE));
+    public RecentProjectsPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public List<File> getFiles() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectPrefs.java
index 62ae0b397..52724664b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectPrefs.java
@@ -53,13 +53,12 @@ import 
org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
 import org.apache.cayenne.modeler.event.display.QueryDisplayEvent;
 import org.apache.cayenne.modeler.pref.PreferenceAdapter;
-import org.apache.cayenne.modeler.pref.PrefsManager;
-import org.apache.cayenne.project.Project;
 import org.apache.cayenne.util.CayenneMapEntry;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
 
 /**
  * Binding-style handler for the Modeler's last project selection. Loaded on 
project
@@ -96,8 +95,8 @@ public final class ProjectPrefs extends PreferenceAdapter {
         query, multipleObjects
     }
 
-    public ProjectPrefs(PrefsManager repository, Project project) {
-        super(repository.projectPref(project, null));
+    public ProjectPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public void load(ProjectSession session) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
index 8edb373fb..c3b6494b2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
@@ -201,14 +201,14 @@ public class ProjectSession {
         if (project == null) {
             return;
         }
-        new ProjectPrefs(app.getPrefsManager(), project).flush(this);
+        new ProjectPrefs(app.getPrefsManager().projectPref(project, 
null)).flush(this);
     }
 
     public void restoreSelectionFromPrefs() {
         if (project == null) {
             return;
         }
-        new ProjectPrefs(app.getPrefsManager(), project).load(this);
+        new ProjectPrefs(app.getPrefsManager().projectPref(project, 
null)).load(this);
     }
 
     public boolean isDirty() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/component/CMComponentGeometryPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/component/CMComponentGeometryPrefs.java
index f1a0119e6..bfcb914b0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/component/CMComponentGeometryPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/component/CMComponentGeometryPrefs.java
@@ -20,11 +20,11 @@
 package org.apache.cayenne.modeler.toolkit.component;
 
 import org.apache.cayenne.modeler.pref.PreferenceAdapter;
-import org.apache.cayenne.modeler.pref.PrefsManager;
 
 import java.awt.*;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
+import java.util.prefs.Preferences;
 
 public final class CMComponentGeometryPrefs extends PreferenceAdapter {
 
@@ -33,8 +33,8 @@ public final class CMComponentGeometryPrefs extends 
PreferenceAdapter {
     private static final String X_PROPERTY = "x";
     private static final String Y_PROPERTY = "y";
 
-    public CMComponentGeometryPrefs(PrefsManager repository, String path) {
-        super(repository.uiNode(path));
+    public CMComponentGeometryPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public void bind(Component c, int defaultWidth, int defaultHeight) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/CMFileChooserPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/CMFileChooserPrefs.java
index 44c8f31e4..53017e727 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/CMFileChooserPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/CMFileChooserPrefs.java
@@ -20,17 +20,17 @@
 package org.apache.cayenne.modeler.toolkit.filechooser;
 
 import org.apache.cayenne.modeler.pref.PreferenceAdapter;
-import org.apache.cayenne.modeler.pref.PrefsManager;
 
 import javax.swing.JFileChooser;
 import java.io.File;
+import java.util.prefs.Preferences;
 
 public final class CMFileChooserPrefs extends PreferenceAdapter {
 
     private static final String PATH_PROPERTY = "path";
 
-    public CMFileChooserPrefs(PrefsManager repository, String path) {
-        super(repository.uiNode(path));
+    public CMFileChooserPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public void bind(JFileChooser chooser) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/splitpane/CMSplitPanePrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/splitpane/CMSplitPanePrefs.java
index bf8e6500e..de53da223 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/splitpane/CMSplitPanePrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/splitpane/CMSplitPanePrefs.java
@@ -20,17 +20,17 @@
 package org.apache.cayenne.modeler.toolkit.splitpane;
 
 import org.apache.cayenne.modeler.pref.PreferenceAdapter;
-import org.apache.cayenne.modeler.pref.PrefsManager;
 
 import javax.swing.*;
 import java.beans.PropertyChangeListener;
+import java.util.prefs.Preferences;
 
 public final class CMSplitPanePrefs extends PreferenceAdapter {
 
     private PropertyChangeListener listener;
 
-    public CMSplitPanePrefs(PrefsManager repository, String path) {
-        super(repository.uiNode(path));
+    public CMSplitPanePrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public void bind(JSplitPane pane, int defaultLocation) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTablePrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTablePrefs.java
index 99539351b..4b99da40b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTablePrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTablePrefs.java
@@ -19,7 +19,6 @@
 package org.apache.cayenne.modeler.toolkit.table;
 
 import org.apache.cayenne.modeler.pref.PreferenceAdapter;
-import org.apache.cayenne.modeler.pref.PrefsManager;
 
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ListSelectionEvent;
@@ -29,6 +28,7 @@ import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableModel;
 import java.util.Map;
+import java.util.prefs.Preferences;
 
 public final class CMTablePrefs extends PreferenceAdapter {
 
@@ -38,8 +38,8 @@ public final class CMTablePrefs extends PreferenceAdapter {
     private static final String ORDER_KEY = "colOrder";
     private static final String LISTENER_PROPERTY = "TablePrefs.listener";
 
-    public CMTablePrefs(PrefsManager manager, String path) {
-        super(manager.uiNode(path));
+    public CMTablePrefs(Preferences prefs) {
+        super(prefs);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
index f0f567df1..4d30c5998 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
@@ -114,7 +114,7 @@ public class MainFrame extends AppFrame {
         splitPane.getInsets().right = 5;
         splitPane.setResizeWeight(0.7);
 
-        this.splitPanePrefs = new CMSplitPanePrefs(app.getPrefsManager(), 
"frame/splitPane");
+        this.splitPanePrefs = new 
CMSplitPanePrefs(app.getPrefsManager().uiNode("frame/splitPane"));
 
         JPanel statusBar = new JPanel(new FlowLayout(FlowLayout.LEFT, 3, 1));
         statusBar.setBorder(TopBorder.create());
@@ -238,7 +238,7 @@ public class MainFrame extends AppFrame {
             }
         });
 
-        new CMComponentGeometryPrefs(app.getPrefsManager(), 
"frame/geometry").bind(this, 1200, 720);
+        new 
CMComponentGeometryPrefs(app.getPrefsManager().uiNode("frame/geometry")).bind(this,
 1200, 720);
 
         setVisible(true);
     }
@@ -328,11 +328,11 @@ public class MainFrame extends AppFrame {
      * Adds path to the list of last opened projects in preferences.
      */
     public void addToLastProjListAction(File file) {
-        new RecentProjectsPrefs(app.getPrefsLocator()).addFile(file);
+        new 
RecentProjectsPrefs(app.getPrefsLocator().appNode(RecentProjectsPrefs.NODE)).addFile(file);
     }
 
     public void changePathInLastProjListAction(File oldFile, File newFile) {
-        RecentProjectsPrefs prefs = new 
RecentProjectsPrefs(app.getPrefsLocator());
+        RecentProjectsPrefs prefs = new 
RecentProjectsPrefs(app.getPrefsLocator().appNode(RecentProjectsPrefs.NODE));
         prefs.removeFile(oldFile);
         prefs.addFile(newFile);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
index 1ec537238..03d66a625 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
@@ -149,7 +149,7 @@ class MainMenuBar extends JMenuBar {
          */
         public void rebuildFromPreferences() {
 
-            List<File> files = new 
RecentProjectsPrefs(app.getPrefsLocator()).getFiles();
+            List<File> files = new 
RecentProjectsPrefs(app.getPrefsLocator().appNode(RecentProjectsPrefs.NODE)).getFiles();
 
             // read menus
             Component[] comps = getMenuComponents();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
index 7f6006979..ee39e62e7 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
@@ -73,6 +73,6 @@ public abstract class DBConnectionAwareAction extends 
AppAction {
     }
 
     private DataMapPrefs dataMapPrefs(DataMap dataMap) {
-        return new DataMapPrefs(app.getPrefsManager(), dataMap);
+        return new DataMapPrefs(app.getPrefsManager().dataMapPref(dataMap, 
null));
     }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
index 78c05d88a..aacb87743 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
@@ -102,7 +102,7 @@ public class ImportDataMapAction extends AppAction {
         JFileChooser chooser = new JFileChooser();
         chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
 
-        new CMFileChooserPrefs(app.getPrefsManager(), 
"importDataMap/lastDir").bind(chooser);
+        new 
CMFileChooserPrefs(app.getPrefsManager().uiNode("importDataMap/lastDir")).bind(chooser);
 
         chooser.addChoosableFileFilter(FileFilters.getDataMapFilter());
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
index 6661dc59d..27382c5fc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
@@ -325,7 +325,7 @@ public class ImportEOModelAction extends AppAction {
             eoModelChooser = new EOModelChooser("Select EOModel");
         }
 
-        new CMFileChooserPrefs(app.getPrefsManager(), 
"importEOModel/lastDir").bind(eoModelChooser);
+        new 
CMFileChooserPrefs(app.getPrefsManager().uiNode("importEOModel/lastDir")).bind(eoModelChooser);
 
         return eoModelChooser;
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
index 10d860c28..6a5a36fa3 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
@@ -137,7 +137,7 @@ class ProjectOpener extends JFileChooser {
     }
 
     private File getDefaultStartDir(Application application) {
-        List<File> recent = new 
RecentProjectsPrefs(application.getPrefsLocator()).getFiles();
+        List<File> recent = new 
RecentProjectsPrefs(application.getPrefsLocator().appNode(RecentProjectsPrefs.NODE)).getFiles();
         if (!recent.isEmpty()) {
             File parent = recent.get(0).getParentFile();
             if (parent != null && parent.isDirectory()) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
index 7239ce0ad..3baa53e33 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
@@ -44,6 +44,6 @@ public class ShowLogConsoleAction extends AppAction {
     }
 
     private Boolean isConsoleShown() {
-        return new LogConsolePrefs(app.getPrefsLocator()).isShowConsole();
+        return new 
LogConsolePrefs(app.getPrefsLocator().appNode(LogConsolePrefs.NODE)).isShowConsole();
     }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/confirmremove/ConfirmRemoveDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/confirmremove/ConfirmRemoveDialog.java
index edc7fe5a5..8a5ca3fad 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/confirmremove/ConfirmRemoveDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/confirmremove/ConfirmRemoveDialog.java
@@ -63,7 +63,7 @@ public class ConfirmRemoveDialog {
         // If the user clicks "cancel" or window close button, we'll just 
ignore whatever's in the checkbox because
         // it's non-sensical.
         if (shouldDelete) {
-            new 
GeneralPrefs(application.getPrefsLocator()).setNoDeletePrompt(neverPromptAgainBox.isSelected());
+            new 
GeneralPrefs(application.getPrefsLocator().appNode(GeneralPrefs.NODE)).setNoDeletePrompt(neverPromptAgainBox.isSelected());
         }
     }
 
@@ -72,7 +72,7 @@ public class ConfirmRemoveDialog {
     }
 
     public boolean shouldDelete(String name) {
-        if (allowAsking && !new 
GeneralPrefs(application.getPrefsLocator()).isNoDeletePrompt()) {
+        if (allowAsking && !new 
GeneralPrefs(application.getPrefsLocator().appNode(GeneralPrefs.NODE)).isNoDeletePrompt())
 {
             showDialog(name);
         }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceDialog.java
index ac3c8d033..b7564ca6e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceDialog.java
@@ -84,7 +84,7 @@ public class DataSourceDialog extends ProjectDialog {
         refreshDataSources();
         initFavouriteDataSource();
 
-        DataMapPrefs dataMapPrefs = new DataMapPrefs(app.getPrefsManager(), 
session.getSelectedDataMap());
+        DataMapPrefs dataMapPrefs = new 
DataMapPrefs(app.getPrefsManager().dataMapPref(session.getSelectedDataMap(), 
null));
         if (dataMapPrefs.hasDbAdapter()) {
             getConnectionInfoFromPreferences().copyTo(connector);
         }
@@ -155,7 +155,7 @@ public class DataSourceDialog extends ProjectDialog {
     }
 
     private void initFavouriteDataSource() {
-        String favourite = new 
GeneralPrefs(app.getPrefsLocator()).getFavouriteDataSource();
+        String favourite = new 
GeneralPrefs(app.getPrefsLocator().appNode(GeneralPrefs.NODE)).getFavouriteDataSource();
         if (favourite != null && connectors.containsKey(favourite)) {
             setSelectedDataSource(favourite);
             dataSources.setSelectedItem(dataSourceKey);
@@ -163,7 +163,7 @@ public class DataSourceDialog extends ProjectDialog {
     }
 
     private DBConnector getConnectionInfoFromPreferences() {
-        DataMapPrefs dataMapPrefs = new DataMapPrefs(app.getPrefsManager(), 
session.getSelectedDataMap());
+        DataMapPrefs dataMapPrefs = new 
DataMapPrefs(app.getPrefsManager().dataMapPref(session.getSelectedDataMap(), 
null));
         DBConnector c = dataMapPrefs.getConnector();
         return c != null ? c : new DBConnector();
     }
@@ -197,7 +197,7 @@ public class DataSourceDialog extends ProjectDialog {
         this.canceled = canceled;
         dispose();
         if (!canceled) {
-            new 
GeneralPrefs(app.getPrefsLocator()).setFavouriteDataSource(dataSourceKey);
+            new 
GeneralPrefs(app.getPrefsLocator().appNode(GeneralPrefs.NODE)).setFavouriteDataSource(dataSourceKey);
         }
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
index ba1795912..8fc897991 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
@@ -106,7 +106,7 @@ public class DBGeneratorOptionsDialog extends ProjectDialog 
{
 
         this.connector = new DBConnector();
         this.connector.setAllowDataSourceFailure(true);
-        this.generatorDefaults = new DBGeneratorPrefs(app.getPrefsManager(), 
session.project());
+        this.generatorDefaults = new 
DBGeneratorPrefs(app.getPrefsManager().projectPref(session.project(), 
DBGeneratorPrefs.NODE));
 
         // create widgets — set initial state before wiring listeners so we
         // don't fire spurious refresh events during construction.
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorPrefs.java
index 23b5e8aee..db7c7b27a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorPrefs.java
@@ -19,15 +19,15 @@
 package org.apache.cayenne.modeler.ui.dbgen;
 
 import org.apache.cayenne.modeler.pref.PreferenceAdapter;
-import org.apache.cayenne.modeler.pref.PrefsManager;
-import org.apache.cayenne.project.Project;
+
+import java.util.prefs.Preferences;
 
 /**
  * Persistence for the DB Generator dialog's checkbox options.
  */
 public class DBGeneratorPrefs extends PreferenceAdapter {
 
-    static final String NODE = "dbGenerator";
+    public static final String NODE = "dbGenerator";
 
     private static final String CREATE_FK_PROPERTY = "createFK";
     private static final String CREATE_PK_PROPERTY = "createPK";
@@ -35,8 +35,8 @@ public class DBGeneratorPrefs extends PreferenceAdapter {
     private static final String DROP_PK_PROPERTY = "dropPK";
     private static final String DROP_TABLES_PROPERTY = "dropTables";
 
-    public DBGeneratorPrefs(PrefsManager repository, Project project) {
-        super(repository.projectPref(project, NODE));
+    public DBGeneratorPrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public boolean getCreateFK() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
index cd050ed2c..5c8e632fa 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java
@@ -321,7 +321,7 @@ public class DbRelationshipDialog extends ProjectDialog {
         AutoCompletion.enable(targetCombo, session::getSelectedDataMap);
         targetColumn.setCellEditor(new CMComboBoxCellEditor(targetCombo));
 
-        new CMTablePrefs(app.getPrefsManager(), "dbEntity/dbjoinTable")
+        new CMTablePrefs(app.getPrefsManager().uiNode("dbEntity/dbjoinTable"))
                 .bind(table, null, DbJoinTableModel.SOURCE);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
index 9862ba6c1..f64da5827 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
@@ -158,7 +158,7 @@ public class LogConsole extends AppPanel implements 
LogAppender {
     }
 
     public void toggle() {
-        if (new LogConsolePrefs(app.getPrefsLocator()).toggleShowConsole()) {
+        if (new 
LogConsolePrefs(app.getPrefsLocator().appNode(LogConsolePrefs.NODE)).toggleShowConsole())
 {
             appear();
         } else {
             disappear();
@@ -166,7 +166,7 @@ public class LogConsole extends AppPanel implements 
LogAppender {
     }
 
     public void showConsoleIfNeeded() {
-        if (new LogConsolePrefs(app.getPrefsLocator()).isShowConsole()) {
+        if (new 
LogConsolePrefs(app.getPrefsLocator().appNode(LogConsolePrefs.NODE)).isShowConsole())
 {
             appear();
         }
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsolePrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsolePrefs.java
index af1fabcf2..42e63f0dc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsolePrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsolePrefs.java
@@ -20,15 +20,16 @@
 package org.apache.cayenne.modeler.ui.logconsole;
 
 import org.apache.cayenne.modeler.pref.PreferenceAdapter;
-import org.apache.cayenne.modeler.pref.PrefsLocator;
+
+import java.util.prefs.Preferences;
 
 public final class LogConsolePrefs extends PreferenceAdapter {
 
-    static final String NODE = "logConsole";
+    public static final String NODE = "logConsole";
     static final String SHOW_CONSOLE = "showLogConsole";
 
-    public LogConsolePrefs(PrefsLocator locator) {
-        super(locator.appNode(NODE));
+    public LogConsolePrefs(Preferences prefs) {
+        super(prefs);
     }
 
     public boolean isShowConsole() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
index 0bd87c22b..90918ac56 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
@@ -54,7 +54,7 @@ public class ClasspathPrefsPanel extends AppPanel {
     public ClasspathPrefsPanel(Application app) {
         super(app);
 
-        this.entries = new ArrayList<>(new 
ClasspathPrefs(app.getPrefsLocator()).getEntries());
+        this.entries = new ArrayList<>(new 
ClasspathPrefs(app.getPrefsLocator().appNode(ClasspathPrefs.NODE)).getEntries());
         this.tableModel = new ClasspathTableModel();
         this.table = new CMTable();
         this.table.setRowMargin(3);
@@ -70,7 +70,7 @@ public class ClasspathPrefsPanel extends AppPanel {
     }
 
     public void commit() {
-        new ClasspathPrefs(app.getPrefsLocator()).setEntries(entries);
+        new 
ClasspathPrefs(app.getPrefsLocator().appNode(ClasspathPrefs.NODE)).setEntries(entries);
         app.refreshClassLoader();
     }
 
@@ -139,7 +139,7 @@ public class ClasspathPrefsPanel extends AppPanel {
         chooser.setDialogType(JFileChooser.OPEN_DIALOG);
         chooser.setAcceptAllFileFilterUsed(true);
 
-        new CMFileChooserPrefs(app.getPrefsManager(), 
"classpath/lastDir").bind(chooser);
+        new 
CMFileChooserPrefs(app.getPrefsManager().uiNode("classpath/lastDir")).bind(chooser);
         if (filter != null) {
             chooser.addChoosableFileFilter(filter);
             chooser.setFileFilter(filter);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/general/GeneralPrefsPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/general/GeneralPrefsPanel.java
index c7d1f3973..87e966019 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/general/GeneralPrefsPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/general/GeneralPrefsPanel.java
@@ -55,7 +55,7 @@ public class GeneralPrefsPanel extends AppPanel {
         this.systemEncoding = Charset.defaultCharset().name();
         this.defaultLabel = systemEncoding + " (default)";
 
-        GeneralPrefs prefs = new GeneralPrefs(app.getPrefsLocator());
+        GeneralPrefs prefs = new 
GeneralPrefs(app.getPrefsLocator().appNode(GeneralPrefs.NODE));
 
         this.encodingChoices = new JComboBox<>(new 
DefaultComboBoxModel<>(encodingLabels()));
         selectEncoding(prefs.getEncoding());
@@ -70,7 +70,7 @@ public class GeneralPrefsPanel extends AppPanel {
     }
 
     public void commit() {
-        GeneralPrefs prefs = new GeneralPrefs(app.getPrefsLocator());
+        GeneralPrefs prefs = new 
GeneralPrefs(app.getPrefsLocator().appNode(GeneralPrefs.NODE));
         prefs.setEncoding(selectedEncoding());
         prefs.setAutoLoadProject(autoLoadProject.isSelected());
         prefs.setNoDeletePrompt(noDeletePrompt.isSelected());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
index 21de66b6e..25f998bd6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
@@ -102,7 +102,7 @@ public class ProjectView extends ProjectPanel {
 
         this.filterPopup = new TreeFilterPopup(treePanel);
 
-        new CMSplitPanePrefs(app.getPrefsManager(), 
"project/splitPane").bind(splitPane, 300);
+        new 
CMSplitPanePrefs(app.getPrefsManager().uiNode("project/splitPane")).bind(splitPane,
 300);
     }
 
     public EditorPanelView getEditorPanel() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/cgen/DataDomainCgenTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/cgen/DataDomainCgenTab.java
index 99cea6e66..6136f1905 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/cgen/DataDomainCgenTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/cgen/DataDomainCgenTab.java
@@ -88,7 +88,7 @@ public class DataDomainCgenTab extends 
DataDomainGeneratorsTab<CgenConfiguration
         CgenConfiguration cgenConfiguration = new CgenConfiguration();
         cgenConfiguration.setDataMap(dataMap);
         cgenConfiguration.updateOutputPath(CgenOps.baseDir(session));
-        cgenConfiguration.setEncoding(new 
GeneralPrefs(app.getPrefsLocator()).getEncoding());
+        cgenConfiguration.setEncoding(new 
GeneralPrefs(app.getPrefsLocator().appNode(GeneralPrefs.NODE)).getEncoding());
 
         cgenConfiguration.resolveExcludedEntities();
         cgenConfiguration.resolveExcludedEmbeddables();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java
index 70c7a0d7c..10d6f494c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenPanel.java
@@ -447,7 +447,7 @@ public class CgenPanel extends ProjectPanel
             configuration.setRootPath(Utils.getRootPathForDataMap(map));
             configuration.updateOutputPath(basePath);
         }
-        configuration.setEncoding(new 
GeneralPrefs(app.getPrefsLocator()).getEncoding());
+        configuration.setEncoding(new 
GeneralPrefs(app.getPrefsLocator().appNode(GeneralPrefs.NODE)).getEncoding());
         return configuration;
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/templateeditor/TemplateEditor.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/templateeditor/TemplateEditor.java
index d131578a2..63946cfec 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/templateeditor/TemplateEditor.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/templateeditor/TemplateEditor.java
@@ -256,8 +256,8 @@ public class TemplateEditor extends AppFrame {
     }
 
     private void bindGeometry() {
-        new CMSplitPanePrefs(app.getPrefsManager(), 
"templateEditor/splitPane").bind(split, 600);
-        new CMComponentGeometryPrefs(app.getPrefsManager(), 
"templateEditor/geometry").bind(this, 1200, 700);
+        new 
CMSplitPanePrefs(app.getPrefsManager().uiNode("templateEditor/splitPane")).bind(split,
 600);
+        new 
CMComponentGeometryPrefs(app.getPrefsManager().uiNode("templateEditor/geometry")).bind(this,
 1200, 700);
     }
 
     private void mapVelocityTokenMaker() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
index adc918264..8766966f4 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
@@ -241,7 +241,7 @@ public class DataMapMainView extends ProjectPanel {
         dataMap.setDefaultPackage(newDefaultPackage);
 
         // update class generation preferences
-        new DataMapPrefs(app.getPrefsManager(), dataMap)
+        new DataMapPrefs(app.getPrefsManager().dataMapPref(dataMap, null))
                 .setSuperclassPackage(newDefaultPackage, 
DataMapPrefs.DEFAULT_SUPERCLASS_PACKAGE_SUFFIX);
 
         session.fireDataMapEvent(DataMapEvent.ofChange(this, dataMap));
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/DataNodeEditorPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/DataNodeEditorPanel.java
index b98165e5a..44f022242 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/DataNodeEditorPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/DataNodeEditorPanel.java
@@ -231,7 +231,7 @@ public class DataNodeEditorPanel extends ProjectPanel {
         String oldName = node.getName();
         node.setName(newName);
 
-        new DataNodePrefs(app.getPrefsManager(), session.project(), 
oldName).rename(newName);
+        new 
DataNodePrefs(dataNodePref(oldName)).renameTo(dataNodePref(newName));
     }
 
     private DataNodePrefs nodePrefs() {
@@ -239,7 +239,11 @@ public class DataNodeEditorPanel extends ProjectPanel {
         if (selected == null) {
             throw new IllegalStateException("No DataNode selected");
         }
-        return new DataNodePrefs(app.getPrefsManager(), session.project(), 
selected.getName());
+        return new DataNodePrefs(dataNodePref(selected.getName()));
+    }
+
+    private java.util.prefs.Preferences dataNodePref(String dataNodeName) {
+        return app.getPrefsManager().projectPref(session.project(), 
DataNodePrefs.NODE + "/" + dataNodeName);
     }
 
     private void dataSourceConfigAction() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourcePanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourcePanel.java
index ca798c59e..096194d0c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourcePanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourcePanel.java
@@ -158,10 +158,9 @@ public class JDBCDataSourcePanel extends DataSourcePanel {
 
         DataSourceDescriptor projectDataSourceDescriptor = 
getNode().getDataSourceDescriptor();
 
-        String key = new DataNodePrefs(
-                app.getPrefsManager(),
+        String key = new DataNodePrefs(app.getPrefsManager().projectPref(
                 frame.getProjectSession().project(),
-                getNode().getName()).getLocalDataSource();
+                DataNodePrefs.NODE + "/" + 
getNode().getName())).getLocalDataSource();
         if (key == null) {
             frame.updateStatus("No Local DataSource selected for node...");
             return;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
index 33751d06c..5e051a3a1 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
@@ -185,7 +185,7 @@ public class DbAttributePanel extends JPanel implements 
DbEntityDisplayListener,
         TableColumn typeColumn = 
table.getColumnModel().getColumn(DbAttributeTableModel.DB_ATTRIBUTE_TYPE);
         typeColumn.setCellEditor(new CMComboBoxCellEditor(comboBox));
 
-        new CMTablePrefs(session.app().getPrefsManager(), 
"dbEntity/attributeTable")
+        new 
CMTablePrefs(session.app().getPrefsManager().uiNode("dbEntity/attributeTable"))
                 .bind(table, null, DbAttributeTableModel.DB_ATTRIBUTE_NAME);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
index 68806b65b..2479ea0f1 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
@@ -71,7 +71,7 @@ public class DbEntityPropertiesView extends ProjectPanel 
implements DbEntityDisp
 
         splitPane.setOneTouchExpandable(true);
         splitPane.setResizeWeight(0.5);
-        new CMSplitPanePrefs(app.getPrefsManager(), 
"dbEntity/splitPane").bind(splitPane, -1);
+        new 
CMSplitPanePrefs(app.getPrefsManager().uiNode("dbEntity/splitPane")).bind(splitPane,
 -1);
         add(splitPane);
 
         toolBar.setFloatable(false);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
index 5f51566c9..3b2f89101 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
@@ -193,7 +193,7 @@ public class DbRelationshipPanel extends JPanel implements 
DbEntityDisplayListen
         TableColumn toDepPkColumn = 
table.getColumnModel().getColumn(DbRelationshipTableModel.TO_DEPENDENT_KEY);
         toDepPkColumn.setCellRenderer(new CheckBoxCellRenderer());
 
-        new CMTablePrefs(session.app().getPrefsManager(), 
"dbEntity/relationshipTable")
+        new 
CMTablePrefs(session.app().getPrefsManager().uiNode("dbEntity/relationshipTable"))
                 .bind(table, null, DbRelationshipTableModel.NAME);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
index b9d1036be..0d67b86bc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
@@ -171,7 +171,7 @@ public class EmbeddableAttributesView extends ProjectPanel 
implements
         AutoCompletion.enable(javaTypesCombo, false, true, 
session::getSelectedDataMap);
         typeColumn.setCellEditor(new CMComboBoxCellEditor(javaTypesCombo));
 
-        new CMTablePrefs(app.getPrefsManager(), "embeddable/attributeTable")
+        new 
CMTablePrefs(app.getPrefsManager().uiNode("embeddable/attributeTable"))
                 .bind(table, null, 
EmbeddableAttributeTableModel.OBJ_ATTRIBUTE);
 
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
index a11b3e699..c92145ddc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
@@ -411,7 +411,7 @@ public class ObjAttributeInfoDialog extends ProjectDialog 
implements TreeSelecti
                 
.getColumn(OverrideEmbeddableAttributeTableModel.DB_ATTRIBUTE_TYPE);
         dbAttrTypeColumn.setCellRenderer(renderer);
 
-        new CMTablePrefs(app.getPrefsManager(), 
"objEntity/overrideAttributeTable")
+        new 
CMTablePrefs(app.getPrefsManager().uiNode("objEntity/overrideAttributeTable"))
                 .bind(overrideAttributeTable, null,
                         OverrideEmbeddableAttributeTableModel.OBJ_ATTRIBUTE);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
index 99592211e..6ecdab5a4 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
@@ -219,7 +219,7 @@ public class ObjEntityCallbacksView extends ProjectPanel {
         }
 
         for (CMTable table : tables) {
-            new CMTablePrefs(app.getPrefsManager(), "objEntity/callbackTable")
+            new 
CMTablePrefs(app.getPrefsManager().uiNode("objEntity/callbackTable"))
                     .bind(table, MIN_SIZES);
         }
     }
@@ -513,7 +513,7 @@ public class ObjEntityCallbacksView extends ProjectPanel {
 
         public void mouseDragged(MouseEvent e) {
             if (table.getColumnWidthChanged()) {
-                new CMTablePrefs(app.getPrefsManager(), 
"objEntity/callbackTable")
+                new 
CMTablePrefs(app.getPrefsManager().uiNode("objEntity/callbackTable"))
                         .bind(table, MIN_SIZES);
                 for (CMTable nextTable : tables) {
                     if (!table.equals(nextTable)) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
index 3f8c430d7..3e0ef0cc2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
@@ -318,7 +318,7 @@ public class ObjAttributePanel extends JPanel implements 
ObjEntityDisplayListene
         
table.getColumnModel().getColumn(ObjAttributeTableModel.DB_ATTRIBUTE).setCellRenderer(new
 DbAttributePathComboBoxRenderer());
         
table.getColumnModel().getColumn(ObjAttributeTableModel.DB_ATTRIBUTE).setCellEditor(new
 DbAttributePathComboBoxEditor(session::getSelectedDataMap));
 
-        new CMTablePrefs(session.app().getPrefsManager(), 
"objEntity/attributeTable")
+        new 
CMTablePrefs(session.app().getPrefsManager().uiNode("objEntity/attributeTable"))
                 .bind(table, minSizes, ObjAttributeTableModel.OBJ_ATTRIBUTE);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
index 93637d37e..57317de21 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
@@ -67,7 +67,7 @@ public class ObjEntityPropertiesView extends ProjectPanel 
implements ObjEntityDi
 
         splitPane.setOneTouchExpandable(true);
         splitPane.setResizeWeight(0.5);
-        new CMSplitPanePrefs(app.getPrefsManager(), 
"objEntity/splitPane").bind(splitPane, -1);
+        new 
CMSplitPanePrefs(app.getPrefsManager().uiNode("objEntity/splitPane")).bind(splitPane,
 -1);
         add(splitPane);
 
         toolBar.setFloatable(false);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
index fbd4c7a5b..5b1b1ff12 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
@@ -276,7 +276,7 @@ public class ObjRelationshipPanel extends JPanel implements 
ObjEntityDisplayList
         deleteRulesCombo.setSelectedIndex(0); // Default to the first value
         col.setCellEditor(new CMComboBoxCellEditor(deleteRulesCombo));
 
-        new CMTablePrefs(session.app().getPrefsManager(), 
"objEntity/relationshipTable")
+        new 
CMTablePrefs(session.app().getPrefsManager().uiNode("objEntity/relationshipTable"))
                 .bind(table, null, ObjRelationshipTableModel.REL_NAME);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
index ced3323fc..0d642f9d2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
@@ -287,7 +287,7 @@ public class ProcedureParameterTab extends ProjectPanel 
implements ProcedurePara
         moveUp.setEnabled(false);
         moveDown.setEnabled(false);
 
-        new CMTablePrefs(app.getPrefsManager(), 
"procedure/parameterTable").bind(table, null);
+        new 
CMTablePrefs(app.getPrefsManager().uiNode("procedure/parameterTable")).bind(table,
 null);
     }
 
     public void procedureParameterAdded(ProcedureParameterEvent e) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
index 18973568b..409f84803 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
@@ -81,7 +81,7 @@ public class SelectQueryOrderingTab extends ProjectPanel {
 
         //As of CAY-888 #3 main pane is now a JSplitPane. Top component is a 
bit larger.
         JSplitPane mainPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
-        new CMSplitPanePrefs(app.getPrefsManager(), 
"selectQuery/orderingSplit").bind(mainPanel, defLocation);
+        new 
CMSplitPanePrefs(app.getPrefsManager().uiNode("selectQuery/orderingSplit")).bind(mainPanel,
 defLocation);
 
         mainPanel.setTopComponent(createEditorPanel());
         mainPanel.setBottomComponent(createSelectorPanel());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
index e27f0ba20..dea02e82b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
@@ -92,7 +92,7 @@ public class SQLTemplatePrefetchTab extends ProjectPanel {
 
         //As of CAY-888 #3 main pane is now a JSplitPane. Top component is a 
bit larger.
         JSplitPane mainPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
-        new CMSplitPanePrefs(app.getPrefsManager(), 
"sqlTemplate/prefetchSplit").bind(mainPanel, defLocation);
+        new 
CMSplitPanePrefs(app.getPrefsManager().uiNode("sqlTemplate/prefetchSplit")).bind(mainPanel,
 defLocation);
 
         mainPanel.setTopComponent(createEditorPanel());
         mainPanel.setBottomComponent(createSelectorPanel());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java
index 941651044..e32f1d547 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java
@@ -126,7 +126,7 @@ public class WelcomeScreen extends AppPanel implements 
RecentFileListener, Recen
 
     @Override
     public void recentFileListChanged() {
-        List<File> arr = new 
RecentProjectsPrefs(app.getPrefsLocator()).getFiles();
+        List<File> arr = new 
RecentProjectsPrefs(app.getPrefsLocator().appNode(RecentProjectsPrefs.NODE)).getFiles();
         recentProjectsList.setModel(new RecentFileListModel(arr));
     }
 }

Reply via email to