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

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


The following commit(s) were added to refs/heads/master by this push:
     new 93fff5798 CAY-2918 Remove OGNL Binding Architecture from CayenneModeler
93fff5798 is described below

commit 93fff5798a716c8843a543c157a5ae0ebd32fdda
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Apr 12 15:45:08 2026 -0400

    CAY-2918 Remove OGNL Binding Architecture from CayenneModeler
    
    getting rid of "bindToComboSelection", "bindToStateChange"
---
 .../apache/cayenne/modeler/ProjectTreeModel.java   |  46 +-
 .../cayenne/modeler/action/FilterAction.java       |  40 +-
 .../dialog/datadomain/FilterController.java        | 168 ++++---
 .../modeler/dialog/datadomain/FilterDialog.java    | 185 ++------
 .../modeler/dialog/db/DataSourceWizard.java        | 516 ++++++++++-----------
 .../modeler/dialog/db/gen/DBGeneratorOptions.java  |  66 ++-
 .../modeler/dialog/pref/DataSourcePreferences.java |   7 +-
 .../modeler/dialog/pref/EncodingSelector.java      |  81 +---
 .../modeler/dialog/pref/EncodingSelectorView.java  |  19 +-
 .../modeler/dialog/pref/GeneralPreferences.java    |   5 -
 .../apache/cayenne/modeler/editor/EditorView.java  |   3 +-
 .../editor/datanode/MainDataNodeEditor.java        |  49 +-
 .../org/apache/cayenne/swing/ActionDelegate.java   |  41 --
 .../org/apache/cayenne/swing/BindingBuilder.java   |  64 ---
 .../org/apache/cayenne/swing/BindingFactory.java   |  20 -
 .../cayenne/swing/ComboSelectionBinding.java       | 158 -------
 .../org/apache/cayenne/swing/ItemEventBinding.java |  69 ---
 17 files changed, 519 insertions(+), 1018 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java
index 3c98ce886..a3da3af1d 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java
@@ -35,7 +35,6 @@ import javax.swing.tree.MutableTreeNode;
 import javax.swing.tree.TreeNode;
 import java.util.Comparator;
 import java.util.Enumeration;
-import java.util.Map;
 
 /**
  * ProjectTreeModel is a model of Cayenne project tree.
@@ -170,8 +169,8 @@ public class ProjectTreeModel extends DefaultTreeModel {
                return currentNode;
        }
 
-       public void setFiltered(Map<String, Boolean> filterMap) {
-               filter.setFilterMap(filterMap);
+       public void setFiltered(boolean dbEntity, boolean objEntity, boolean 
embeddable, boolean procedure, boolean query) {
+               filter.setFilter(dbEntity, objEntity, embeddable, procedure, 
query);
        }
 
        public int getChildCount(Object parent) {
@@ -229,24 +228,43 @@ public class ProjectTreeModel extends DefaultTreeModel {
        }
 
        static class Filter {
-               private Map<String, Boolean> filterMap;
-               boolean pass = true;
+               private boolean dbEntity;
+               private boolean objEntity;
+               private boolean embeddable;
+               private boolean procedure;
+               private boolean query;
+               private boolean pass;
+
+               Filter() {
+                       this.dbEntity = true;
+                       this.objEntity = true;
+                       this.embeddable = true;
+                       this.procedure = true;
+                       this.query = true;
+                       this.pass = true;
+               }
 
-               public void setFilterMap(Map<String, Boolean> filterMap) {
-                       this.filterMap = filterMap;
-                       pass = false;
+               public void setFilter(boolean dbEntity, boolean objEntity, 
boolean embeddable, boolean procedure, boolean query) {
+                       this.dbEntity = dbEntity;
+                       this.objEntity = objEntity;
+                       this.embeddable = embeddable;
+                       this.procedure = procedure;
+                       this.query = query;
+                       this.pass = false;
                }
 
                public boolean pass(DefaultMutableTreeNode obj) {
                        Object root = obj.getUserObject();
                        Object firstLeaf = obj.getFirstLeaf().getUserObject();
 
-                       return ((pass) || (root instanceof DataMap) || (root 
instanceof DataNodeDescriptor)
-                                       || (firstLeaf instanceof DbEntity && 
filterMap.get("dbEntity"))
-                                       || (firstLeaf instanceof ObjEntity && 
filterMap.get("objEntity"))
-                                       || (firstLeaf instanceof Embeddable && 
filterMap.get("embeddable"))
-                                       || (firstLeaf instanceof 
QueryDescriptor && filterMap.get("query"))
-                                       || (firstLeaf instanceof Procedure && 
filterMap.get("procedure")));
+                       return (pass
+                                       || (root instanceof DataMap)
+                                       || (root instanceof DataNodeDescriptor)
+                                       || (firstLeaf instanceof DbEntity && 
dbEntity)
+                                       || (firstLeaf instanceof ObjEntity && 
objEntity)
+                                       || (firstLeaf instanceof Embeddable && 
embeddable)
+                                       || (firstLeaf instanceof 
QueryDescriptor && query)
+                                       || (firstLeaf instanceof Procedure && 
procedure));
                }
        }
 }
\ No newline at end of file
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FilterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FilterAction.java
index cbc92a6af..dc99b1305 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FilterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FilterAction.java
@@ -18,42 +18,38 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.action;
 
-import java.awt.event.ActionEvent;
-
-import javax.swing.JButton;
 import org.apache.cayenne.modeler.Application;
-
 import org.apache.cayenne.modeler.dialog.datadomain.FilterDialog;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
-public class FilterAction extends CayenneAction{
-    
-       private FilterDialog filterDialog = null;
-       
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+
+public class FilterAction extends CayenneAction {
+
     public static String getActionName() {
         return "Filter tree";
     }
 
-       public FilterAction(Application application) {
+    public FilterAction(Application application) {
         super(getActionName(), application);
     }
-       
+
     @Override
     public String getIconName() {
         return "icon-filter.png";
     }
 
-       @Override
-       public void performAction(ActionEvent e) {
-               JButton source = (JButton)e.getSource();
-        if(filterDialog == null) {
-            filterDialog = new 
FilterDialog(getApplication().getFrameController().getEditorView().getFilterController());
-        }
-               filterDialog.pack();
-               filterDialog.show(source, 0, source.getHeight());
-       }
-
-    public void resetDialog() {
-        filterDialog = null;
+    @Override
+    public void performAction(ActionEvent e) {
+        JButton source = (JButton) e.getSource();
+        FilterDialog dialog = getApplication()
+                .getFrameController()
+                .getEditorView()
+                .getFilterController()
+                .getView();
+
+        dialog.pack();
+        dialog.show(source, 0, source.getHeight());
     }
 }
\ No newline at end of file
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterController.java
index 443181d05..0814109dc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterController.java
@@ -18,76 +18,108 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog.datadomain;
 
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
+import org.apache.cayenne.modeler.ProjectTreeModel;
+import org.apache.cayenne.modeler.ProjectTreeView;
 
-import javax.swing.JTree;
+import javax.swing.*;
 import javax.swing.tree.TreeNode;
 import javax.swing.tree.TreePath;
-
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.ProjectTreeModel;
-import org.apache.cayenne.modeler.ProjectTreeView;
+import java.util.Enumeration;
 
 public class FilterController {
-       
-       private Map<String,Boolean> filterMap = new HashMap<>();
-       private ProjectTreeView tree;
-       private ProjectController eventController;
-       private ProjectTreeModel treeModel;
-       
-       public ProjectTreeView getTree() {
-               return tree;
-       }
-
-       public ProjectTreeModel getTreeModel() {
-               return treeModel;
-       }
-
-       public ProjectController getEventController() {
-               return eventController;
-       }
-
-       public Map<String, Boolean> getFilterMap() {
-               return filterMap;
-       }
-
-       public FilterController(ProjectController eventController, 
ProjectTreeView treePanel) {
-       
-               this.eventController = eventController;
-               this.tree = treePanel;
-               this.treeModel = tree.getProjectModel();
-               
-               filterMap.put("dbEntity",       true);
-               filterMap.put("objEntity",      true);
-               filterMap.put("embeddable",     true);
-               filterMap.put("procedure",      true);
-               filterMap.put("query",          true);
-       }
-       
-       
-       public void treeExpOrCollPath(String action) {
-               TreeNode root = (TreeNode) treeModel.getRoot();
-               expandAll(tree, new TreePath(root),action);
-       }
-
-       private void expandAll(JTree tree, TreePath parent, String action) {
-               TreeNode node = (TreeNode) parent.getLastPathComponent();
-               
-               if (node.getChildCount() >= 0) {
-                       for (Enumeration e = node.children(); 
e.hasMoreElements();) {
-                               TreeNode n = (TreeNode) e.nextElement();
-                               TreePath path = parent.pathByAddingChild(n);
-                               expandAll(tree, path, action);
-                       }
-               }
-
-               if("expand".equals(action)) {
-                       tree.expandPath(parent);
-               } else if("collapse".equals(action)) {
-                       treeModel.reload(treeModel.getRootNode());
-               }
-       }
-       
-}
\ No newline at end of file
+
+    private boolean showDbEntity;
+    private boolean showObjEntity;
+    private boolean showEmbeddable;
+    private boolean showProcedure;
+    private boolean showQuery;
+
+    private final ProjectTreeView treeView;
+    private final ProjectTreeModel treeModel;
+    private final FilterDialog view;
+
+    public FilterController(ProjectTreeView treeView) {
+
+        this.view = new FilterDialog();
+        this.treeView = treeView;
+        this.treeModel = treeView.getProjectModel();
+
+        selectAll();
+
+        view.getDbEntity().addActionListener(e -> {
+            showDbEntity = view.getDbEntity().isSelected();
+            applyFilter();
+        });
+        view.getObjEntity().addActionListener(e -> {
+            showObjEntity = view.getObjEntity().isSelected();
+            applyFilter();
+        });
+        view.getEmbeddable().addActionListener(e -> {
+            showEmbeddable = view.getEmbeddable().isSelected();
+            applyFilter();
+        });
+        view.getProcedure().addActionListener(e -> {
+            showProcedure = view.getProcedure().isSelected();
+            applyFilter();
+        });
+        view.getQuery().addActionListener(e -> {
+            showQuery = view.getQuery().isSelected();
+            applyFilter();
+        });
+
+        view.getAll().addActionListener(e -> removeFilter());
+    }
+
+    private void selectAll() {
+        showDbEntity = showObjEntity = showEmbeddable = showProcedure = 
showQuery = true;
+        view.getDbEntity().setSelected(true);
+        view.getObjEntity().setSelected(true);
+        view.getEmbeddable().setSelected(true);
+        view.getProcedure().setSelected(true);
+
+        view.getQuery().setSelected(true);
+        view.getAll().setEnabled(false);
+    }
+
+    private void removeFilter() {
+        selectAll();
+        treeModel.setFiltered(true, true, true, true, true);
+        treeView.updateUI();
+    }
+
+    private void applyFilter() {
+        treeModel.setFiltered(showDbEntity, showObjEntity, showEmbeddable, 
showProcedure, showQuery);
+        treeView.updateUI();
+
+        boolean all = showDbEntity && showObjEntity && showEmbeddable && 
showProcedure && showQuery;
+        view.getAll().setSelected(all);
+        view.getAll().setEnabled(!all);
+    }
+
+    public FilterDialog getView() {
+        return view;
+    }
+
+    public void treeExpOrCollPath(String action) {
+        TreeNode root = (TreeNode) treeModel.getRoot();
+        expandAll(treeView, new TreePath(root), action);
+    }
+
+    private void expandAll(JTree tree, TreePath parent, String action) {
+        TreeNode node = (TreeNode) parent.getLastPathComponent();
+
+        if (node.getChildCount() >= 0) {
+            for (Enumeration<? extends TreeNode> e = node.children(); 
e.hasMoreElements(); ) {
+                TreeNode n = e.nextElement();
+                TreePath path = parent.pathByAddingChild(n);
+                expandAll(tree, path, action);
+            }
+        }
+
+        if ("expand".equals(action)) {
+            tree.expandPath(parent);
+        } else if ("collapse".equals(action)) {
+            treeModel.reload(treeModel.getRootNode());
+        }
+    }
+}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterDialog.java
index c1ec0a6bc..d1a88d262 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datadomain/FilterDialog.java
@@ -18,159 +18,38 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog.datadomain;
 
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.swing.BindingBuilder;
-
-import javax.swing.JCheckBox;
-import javax.swing.JPopupMenu;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
+import javax.swing.*;
 
 public class FilterDialog extends JPopupMenu {
 
-       private JCheckBox dbEntity;
-       private JCheckBox objEntity;
-       private JCheckBox embeddable;
-       private JCheckBox procedure;
-       private JCheckBox query;
-       private JCheckBox all;
-       private ProjectController eventController;
-       private FilterController filterController;
-
-       /* NOTE: Setters and getters are used by view bindings, don't delete 
them */
-
-       public Boolean getDbEntityFilter() {
-               return filterController.getFilterMap().get("dbEntity");
-       }
-       public void setDbEntityFilter(Boolean value) {
-               filterController.getFilterMap().put("dbEntity", value);
-       }
-       
-       public Boolean getObjEntityFilter() {
-               return filterController.getFilterMap().get("objEntity");
-       }
-
-       public void setObjEntityFilter(Boolean value) {
-               filterController.getFilterMap().put("objEntity", value);
-       }
-       
-       public Boolean getEmbeddableFilter() {
-               return filterController.getFilterMap().get("embeddable");
-       }
-       public void setEmbeddableFilter(Boolean value) {
-               filterController.getFilterMap().put("embeddable", value);
-       }
-       
-       public Boolean getProcedureFilter() {
-               return filterController.getFilterMap().get("procedure");
-       }
-
-       public void setProcedureFilter(Boolean value) {
-               filterController.getFilterMap().put("procedure", value);
-       }
-       
-       public Boolean getQueryFilter() {
-               return filterController.getFilterMap().get("query");
-       }
-       public void setQueryFilter(Boolean value) {
-               filterController.getFilterMap().put("query", value);
-       }
-
-       public Boolean getAllFilter() {
-               for(Boolean selected : 
filterController.getFilterMap().values()) {
-                       if(!selected) {
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-       public void setAllFilter(Boolean value) {
-       }
-       
-       public FilterDialog(FilterController filterController){
-               super();
-               this.filterController=filterController;
-               this.eventController=filterController.getEventController();
-               initView(); 
-               initController();
-       }
-       
-       public void initView(){
-
-               all = new JCheckBox("Show all");
-               dbEntity = new JCheckBox("DbEntity");
-               objEntity = new JCheckBox("ObjEntity");
-               embeddable = new JCheckBox("Embeddable");
-               procedure = new JCheckBox("Procedure");
-               query = new JCheckBox("Query");
-
-               add(all);
-               addSeparator();
-               add(dbEntity);
-               add(objEntity);
-               add(embeddable);
-               add(procedure);
-               add(query);
-       }
-
-       private void initController() {
-               BindingBuilder builder = new BindingBuilder(
-                         eventController.getApplication().getBindingFactory(),
-                         this);
-
-               builder.bindToStateChange(dbEntity, 
"dbEntityFilter").updateView();
-               builder.bindToStateChange(objEntity, 
"objEntityFilter").updateView();
-               builder.bindToStateChange(embeddable, 
"embeddableFilter").updateView();
-               builder.bindToStateChange(procedure, 
"procedureFilter").updateView();
-               builder.bindToStateChange(query, "queryFilter").updateView();
-               builder.bindToStateChange(all, "allFilter").updateView();
-
-               dbEntity.addActionListener(new CheckListener("dbEntity"));
-               objEntity.addActionListener(new CheckListener("objEntity"));
-               embeddable.addActionListener(new CheckListener("embeddable"));
-               procedure.addActionListener(new CheckListener("procedure"));
-               query.addActionListener(new CheckListener("query"));
-
-        all.setEnabled(false);
-               all.addActionListener(e -> {
-                       dbEntity.setSelected(true);
-                       objEntity.setSelected(true);
-                       embeddable.setSelected(true);
-                       procedure.setSelected(true);
-                       query.setSelected(true);
-                       all.setEnabled(false);
-
-                       
filterController.getTreeModel().setFiltered(filterController.getFilterMap());
-                       filterController.getTree().updateUI();
-               });
-       }
-
-       void checkAllStates() {
-               if(!getAllFilter()) {
-                       all.setSelected(false);
-                       all.setEnabled(true);
-               } else {
-                       all.setSelected(true);
-                       all.setEnabled(false);
-               }
-       }
-
-       private class CheckListener implements ActionListener {
-
-               String key;
-
-               public CheckListener(String key) {
-                       this.key = key;
-               }
-
-               @Override
-               public void actionPerformed(ActionEvent e) {
-                       filterController.getFilterMap().put(key, ((JCheckBox) 
e.getSource()).isSelected());
-                       
filterController.getTreeModel().setFiltered(filterController.getFilterMap());
-                       filterController.getTree().updateUI();
-            checkAllStates();
-               }
-       }
-}
\ No newline at end of file
+    private final JCheckBox dbEntity;
+    private final JCheckBox objEntity;
+    private final JCheckBox embeddable;
+    private final JCheckBox procedure;
+    private final JCheckBox query;
+    private final JCheckBox all;
+
+    public FilterDialog() {
+        this.all = new JCheckBox("Show all");
+        this.dbEntity = new JCheckBox("DbEntity");
+        this.objEntity = new JCheckBox("ObjEntity");
+        this.embeddable = new JCheckBox("Embeddable");
+        this.procedure = new JCheckBox("Procedure");
+        this.query = new JCheckBox("Query");
+
+        add(all);
+        addSeparator();
+        add(dbEntity);
+        add(objEntity);
+        add(embeddable);
+        add(procedure);
+        add(query);
+    }
+
+    public JCheckBox getDbEntity() { return dbEntity; }
+    public JCheckBox getObjEntity() { return objEntity; }
+    public JCheckBox getEmbeddable() { return embeddable; }
+    public JCheckBox getProcedure() { return procedure; }
+    public JCheckBox getQuery() { return query; }
+    public JCheckBox getAll() { return all; }
+}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
index 6986516fa..f049dda38 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
@@ -19,17 +19,6 @@
 
 package org.apache.cayenne.modeler.dialog.db;
 
-import javax.sql.DataSource;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import java.awt.Component;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.prefs.Preferences;
-
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.modeler.ClassLoadingService;
 import org.apache.cayenne.modeler.ProjectController;
@@ -40,8 +29,15 @@ import 
org.apache.cayenne.modeler.event.DataSourceModificationListener;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
+
+import javax.sql.DataSource;
+import javax.swing.*;
+import java.awt.*;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.prefs.Preferences;
 
 import static org.apache.cayenne.modeler.pref.DBConnectionInfo.*;
 
@@ -52,260 +48,244 @@ import static 
org.apache.cayenne.modeler.pref.DBConnectionInfo.*;
  */
 public class DataSourceWizard extends CayenneController {
 
-       private final ProjectController projectController;
-       private final DataSourceWizardView view;
-       private final String[] buttons;
-
-       private ObjectBinding dataSourceBinding;
-       private Map<String, DBConnectionInfo> dataSources;
-       private String dataSourceKey;
-       // this object is a clone of an object selected from the dropdown, as 
we need to allow local temporary modifications
-       private DBConnectionInfo connectionInfo;
-       private DbAdapter adapter;
-       private DataSource dataSource;
-       private boolean canceled;
-       private DataSourceModificationListener dataSourceListener;
-
-       public DataSourceWizard(ProjectController parent, String title) {
-               this(parent, title, new String[]{"Continue", "Cancel"});
-       }
-
-       public DataSourceWizard(ProjectController parent, String title, 
String[] buttons) {
-               super(parent);
-
-               this.buttons = buttons;
-               this.connectionInfo = new DBConnectionInfo();
-               this.projectController = parent;
-
-               this.view = createView();
-               this.view.setTitle(title);
-
-               initBindings();
-               initDataSourceListener();
-       }
-
-       /**
-        * Creates swing dialog for this wizard
-        */
-       private DataSourceWizardView createView() {
-               return new DataSourceWizardView(this, buttons);
-       }
-
-       protected void initBindings() {
-               final BindingBuilder builder = new 
BindingBuilder(getApplication().getBindingFactory(), this);
-
-               dataSourceBinding = 
builder.bindToComboSelection(view.getDataSources(), "dataSourceKey");
-
-               view.getCancelButton().addActionListener(e -> cancelAction());
-               view.getOkButton().addActionListener(e -> okAction());
-               view.getConfigButton().addActionListener(e -> 
dataSourceConfigAction());
-       }
-
-       private void initDataSourceListener() {
-               dataSourceListener = new DataSourceModificationListener() {
-                       @Override
-                       public void 
callbackDataSourceRemoved(DataSourceModificationEvent e) {}
-
-                       @Override
-                       public void 
callbackDataSourceAdded(DataSourceModificationEvent e) {
-                               setDataSourceKey(e.getDataSourceName());
-                               refreshDataSources();
-                       }
-               };
-               getApplication().getFrameController().getProjectController()
-                               
.addDataSourceModificationListener(dataSourceListener);
-       }
-
-       private void initFavouriteDataSource() {
-               final Preferences pref = 
getApplication().getPreferencesNode(GeneralPreferences.class, "");
-               final String favouriteDataSource = 
pref.get(GeneralPreferences.FAVOURITE_DATA_SOURCE, null);
-               if (favouriteDataSource != null && 
dataSources.containsKey(favouriteDataSource)) {
-                       setDataSourceKey(favouriteDataSource);
-                       dataSourceBinding.updateView();
-               }
-       }
-
-       private void removeDataSourceListener() {
-               getApplication().getFrameController().getProjectController()
-                               
.removeDataSourceModificationListener(dataSourceListener);
-       }
-
-       private DBConnectionInfo getConnectionInfoFromPreferences() {
-               DBConnectionInfo connectionInfo = new DBConnectionInfo();
-               DataMapDefaults dataMapDefaults = getProjectController()
-                               
.getDataMapPreferences(getProjectController().getCurrentDataMap());
-               
connectionInfo.setDbAdapter(dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY,
 null));
-               
connectionInfo.setUrl(dataMapDefaults.getCurrentPreference().get(URL_PROPERTY, 
null));
-               
connectionInfo.setUserName(dataMapDefaults.getCurrentPreference().get(USER_NAME_PROPERTY,
 null));
-               
connectionInfo.setPassword(dataMapDefaults.getCurrentPreference().get(PASSWORD_PROPERTY,
 null));
-               
connectionInfo.setJdbcDriver(dataMapDefaults.getCurrentPreference().get(JDBC_DRIVER_PROPERTY,
 null));
-               return connectionInfo;
-       }
-
-       private ProjectController getProjectController() {
-               return projectController;
-       }
-
-       public String getDataSourceKey() {
-               return dataSourceKey;
-       }
-
-       public void setDataSourceKey(final String dataSourceKey) {
-               this.dataSourceKey = dataSourceKey;
-
-               // update a clone object that will be used to obtain 
connection...
-               final DBConnectionInfo currentInfo = 
dataSources.get(dataSourceKey);
-               if (currentInfo != null) {
-                       currentInfo.copyTo(connectionInfo);
-               } else {
-                       connectionInfo = new DBConnectionInfo();
-               }
-               view.getConnectionInfo().setConnectionInfo(connectionInfo);
-       }
-
-       /**
-        * Main action method that pops up a dialog asking for user selection.
-        * Returns true if the selection was confirmed, false - if canceled.
-        */
-       public boolean startupAction() {
-               this.canceled = true;
-               refreshDataSources();
-               initFavouriteDataSource();
-
-               final DataMapDefaults dataMapDefaults = projectController.
-                               
getDataMapPreferences(projectController.getCurrentDataMap());
-               if 
(dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, null) != null) 
{
-                       
getConnectionInfoFromPreferences().copyTo(connectionInfo);
-               }
-               view.pack();
-               view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-               view.setModal(true);
-               view.connectionInfo.setConnectionInfo(connectionInfo);
-               makeCloseableOnEscape();
-               centerView();
-               view.setVisible(true);
-
-               return !canceled;
-       }
-
-       public DBConnectionInfo getConnectionInfo() {
-               return connectionInfo;
-       }
-
-       /**
-        * Tests that the entered information is valid and can be used to open a
-        * conneciton. Does not store the open connection.
-        */
-       public void okAction() {
-               final DBConnectionInfo info = getConnectionInfo();
-               final ClassLoadingService classLoader = 
getApplication().getClassLoadingService();
-
-               // doing connection testing...
-               try {
-                       try {
-                               this.adapter = info.makeAdapter(classLoader);
-                               this.dataSource = 
info.makeDataSource(classLoader);
-                       } catch (SQLException ignore) {
-                               showNoConnectorDialog("Unable to load driver '" 
+ info.getJdbcDriver() + "'");
-                               return;
-                       }
-
-                       // Test connection
-                       try (Connection connection = 
dataSource.getConnection()) {
+    private final ProjectController projectController;
+    private final DataSourceWizardView view;
+
+    private Map<String, DBConnectionInfo> dataSources;
+    private String dataSourceKey;
+    // this object is a clone of an object selected from the dropdown, as we 
need to allow local temporary modifications
+    private DBConnectionInfo connectionInfo;
+    private DbAdapter adapter;
+    private DataSource dataSource;
+    private boolean canceled;
+    private DataSourceModificationListener dataSourceListener;
+
+    public DataSourceWizard(ProjectController parent, String title) {
+        this(parent, title, new String[]{"Continue", "Cancel"});
+    }
+
+    public DataSourceWizard(ProjectController parent, String title, String[] 
buttons) {
+        super(parent);
+
+        this.connectionInfo = new DBConnectionInfo();
+        this.projectController = parent;
+
+        this.view = new DataSourceWizardView(this, buttons);
+        this.view.setTitle(title);
+
+        initBindings();
+        initDataSourceListener();
+    }
+
+    protected void initBindings() {
+        view.getDataSources().addActionListener(e -> {
+            Object sel = view.getDataSources().getSelectedItem();
+            setDataSourceKey(sel != null ? sel.toString() : null);
+        });
+
+        view.getCancelButton().addActionListener(e -> cancelAction());
+        view.getOkButton().addActionListener(e -> okAction());
+        view.getConfigButton().addActionListener(e -> 
dataSourceConfigAction());
+    }
+
+    private void initDataSourceListener() {
+        dataSourceListener = new DataSourceModificationListener() {
+            @Override
+            public void callbackDataSourceRemoved(DataSourceModificationEvent 
e) {
+            }
+
+            @Override
+            public void callbackDataSourceAdded(DataSourceModificationEvent e) 
{
+                setDataSourceKey(e.getDataSourceName());
+                refreshDataSources();
+            }
+        };
+        getApplication().getFrameController().getProjectController()
+                .addDataSourceModificationListener(dataSourceListener);
+    }
+
+    private void initFavouriteDataSource() {
+        final Preferences pref = 
getApplication().getPreferencesNode(GeneralPreferences.class, "");
+        final String favouriteDataSource = 
pref.get(GeneralPreferences.FAVOURITE_DATA_SOURCE, null);
+        if (favouriteDataSource != null && 
dataSources.containsKey(favouriteDataSource)) {
+            setDataSourceKey(favouriteDataSource);
+            view.getDataSources().setSelectedItem(dataSourceKey);
+        }
+    }
+
+    private void removeDataSourceListener() {
+        getApplication().getFrameController().getProjectController()
+                .removeDataSourceModificationListener(dataSourceListener);
+    }
+
+    private DBConnectionInfo getConnectionInfoFromPreferences() {
+        DBConnectionInfo connectionInfo = new DBConnectionInfo();
+        DataMapDefaults dataMapDefaults = 
projectController.getDataMapPreferences(projectController.getCurrentDataMap());
+        
connectionInfo.setDbAdapter(dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY,
 null));
+        
connectionInfo.setUrl(dataMapDefaults.getCurrentPreference().get(URL_PROPERTY, 
null));
+        
connectionInfo.setUserName(dataMapDefaults.getCurrentPreference().get(USER_NAME_PROPERTY,
 null));
+        
connectionInfo.setPassword(dataMapDefaults.getCurrentPreference().get(PASSWORD_PROPERTY,
 null));
+        
connectionInfo.setJdbcDriver(dataMapDefaults.getCurrentPreference().get(JDBC_DRIVER_PROPERTY,
 null));
+        return connectionInfo;
+    }
+
+    private void setDataSourceKey(final String dataSourceKey) {
+        this.dataSourceKey = dataSourceKey;
+
+        // update a clone object that will be used to obtain connection...
+        final DBConnectionInfo currentInfo = dataSources.get(dataSourceKey);
+        if (currentInfo != null) {
+            currentInfo.copyTo(connectionInfo);
+        } else {
+            connectionInfo = new DBConnectionInfo();
+        }
+        view.getConnectionInfo().setConnectionInfo(connectionInfo);
+    }
+
+    /**
+     * Main action method that pops up a dialog asking for user selection.
+     * Returns true if the selection was confirmed, false - if canceled.
+     */
+    public boolean startupAction() {
+        this.canceled = true;
+        refreshDataSources();
+        initFavouriteDataSource();
+
+        final DataMapDefaults dataMapDefaults = projectController.
+                getDataMapPreferences(projectController.getCurrentDataMap());
+        if (dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, 
null) != null) {
+            getConnectionInfoFromPreferences().copyTo(connectionInfo);
+        }
+        view.pack();
+        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        view.setModal(true);
+        view.connectionInfo.setConnectionInfo(connectionInfo);
+        makeCloseableOnEscape();
+        centerView();
+        view.setVisible(true);
+
+        return !canceled;
+    }
+
+    public DBConnectionInfo getConnectionInfo() {
+        return connectionInfo;
+    }
+
+    /**
+     * Tests that the entered information is valid and can be used to open a
+     * connection. Does not store the open connection.
+     */
+    public void okAction() {
+        DBConnectionInfo info = getConnectionInfo();
+        ClassLoadingService classLoader = 
getApplication().getClassLoadingService();
+
+        // doing connection testing...
+        try {
+            try {
+                this.adapter = info.makeAdapter(classLoader);
+                this.dataSource = info.makeDataSource(classLoader);
+            } catch (SQLException ignore) {
+                showNoConnectorDialog("Unable to load driver '" + 
info.getJdbcDriver() + "'");
+                return;
+            }
+
+            // Test connection
+            try (Connection connection = dataSource.getConnection()) {
+            }
+        } catch (Throwable th) {
+            reportError("Connection Error", th);
+            return;
+        }
+        onClose(false);
+    }
+
+    public void cancelAction() {
+        onClose(true);
+    }
+
+    /**
+     * On close handler. Introduced to remove data source listener.
+     */
+    protected void onClose(final boolean canceled) {
+        // set success flag, and unblock the caller...
+        this.canceled = canceled;
+        view.dispose();
+        removeDataSourceListener();
+        if (!canceled) {
+            Preferences pref = 
getApplication().getPreferencesNode(GeneralPreferences.class, "");
+            pref.put(GeneralPreferences.FAVOURITE_DATA_SOURCE, dataSourceKey);
+        }
+    }
+
+    /**
+     * Opens preferences panel to allow configuration of DataSource presets.
+     */
+    public void dataSourceConfigAction() {
+        final PreferenceDialog prefs = new PreferenceDialog(this);
+        prefs.showDataSourceEditorAction(dataSourceKey);
+        refreshDataSources();
+    }
+
+    /**
+     * Opens preferences panel to allow configuration of classpath.
+     */
+    public void classPathConfigAction() {
+        final PreferenceDialog prefs = new PreferenceDialog(this);
+        prefs.showClassPathEditorAction();
+        refreshDataSources();
+    }
+
+    @Override
+    public Component getView() {
+        return view;
+    }
+
+    @SuppressWarnings("unchecked")
+    private void refreshDataSources() {
+        this.dataSources = (Map<String, DBConnectionInfo>) 
getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
+                .getChildrenPreferences();
+
+        // 1.2 migration fix - update data source adapter names
+        final String _12package = "org.objectstyle.cayenne.";
+        for (DBConnectionInfo info : dataSources.values()) {
+            if (info.getDbAdapter() != null && 
info.getDbAdapter().startsWith(_12package)) {
+                info.setDbAdapter("org.apache.cayenne." + 
info.getDbAdapter().substring(_12package.length()));
+            }
+        }
+
+        final String[] keys = dataSources.keySet().toArray(new String[0]);
+        Arrays.sort(keys);
+        view.getDataSources().setModel(new DefaultComboBoxModel<>(keys));
+
+        String key = null;
+        if (dataSourceKey == null || !dataSources.containsKey(dataSourceKey)) {
+            if (keys.length > 0) {
+                key = keys[0];
             }
-               } catch (Throwable th) {
-                       reportError("Connection Error", th);
-                       return;
-               }
-               onClose(false);
-       }
-
-       public void cancelAction() {
-               onClose(true);
-       }
-
-       /**
-        * On close handler. Introduced to remove data source listener.
-        */
-       protected void onClose(final boolean canceled) {
-               // set success flag, and unblock the caller...
-               this.canceled = canceled;
-               view.dispose();
-               removeDataSourceListener();
-               if(!canceled) {
-                       Preferences pref = 
getApplication().getPreferencesNode(GeneralPreferences.class, "");
-                       pref.put(GeneralPreferences.FAVOURITE_DATA_SOURCE, 
getDataSourceKey());
-               }
-       }
-
-       /**
-        * Opens preferences panel to allow configuration of DataSource presets.
-        */
-       public void dataSourceConfigAction() {
-               final PreferenceDialog prefs = new PreferenceDialog(this);
-               prefs.showDataSourceEditorAction(dataSourceKey);
-               refreshDataSources();
-       }
-
-       /**
-        * Opens preferences panel to allow configuration of classpath.
-        */
-       public void classPathConfigAction() {
-               final PreferenceDialog prefs = new PreferenceDialog(this);
-               prefs.showClassPathEditorAction();
-               refreshDataSources();
-       }
-
-       public Component getView() {
-               return view;
-       }
-
-       @SuppressWarnings("unchecked")
-       private void refreshDataSources() {
-               this.dataSources = (Map<String, DBConnectionInfo>) 
getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
-                               .getChildrenPreferences();
-
-               // 1.2 migration fix - update data source adapter names
-               final String _12package = "org.objectstyle.cayenne.";
-               for(DBConnectionInfo info : dataSources.values()) {
-                       if (info.getDbAdapter() != null && 
info.getDbAdapter().startsWith(_12package)) {
-                               info.setDbAdapter("org.apache.cayenne." + 
info.getDbAdapter().substring(_12package.length()));
-                       }
-               }
-
-               final String[] keys = dataSources.keySet().toArray(new 
String[0]);
-               Arrays.sort(keys);
-               view.getDataSources().setModel(new 
DefaultComboBoxModel<>(keys));
-
-               String key = null;
-               if (getDataSourceKey() == null || 
!dataSources.containsKey(getDataSourceKey())) {
-                       if (keys.length > 0) {
-                               key = keys[0];
-                       }
-               }
-
-               setDataSourceKey(key != null ? key : getDataSourceKey());
-               dataSourceBinding.updateView();
-       }
-
-       protected void showNoConnectorDialog(String message) {
-               final String[] options = {"Setup driver", "Cancel"};
-
-               final int selection = JOptionPane.showOptionDialog(getView(), 
message, "Configuration error",
-                               JOptionPane.OK_CANCEL_OPTION, 
JOptionPane.ERROR_MESSAGE, null, options, options[0]);
-               if (selection == 0) {
-                       classPathConfigAction();
-               }
-       }
-
-       public DataSource getDataSource() {
-               return dataSource;
-       }
-
-       /**
-        * Returns configured DbAdapter.
-        */
-       public DbAdapter getAdapter() {
-               return adapter;
-       }
+        }
+
+        setDataSourceKey(key != null ? key : dataSourceKey);
+        view.getDataSources().setSelectedItem(dataSourceKey);
+    }
+
+    protected void showNoConnectorDialog(String message) {
+        final String[] options = {"Setup driver", "Cancel"};
+
+        final int selection = JOptionPane.showOptionDialog(getView(), message, 
"Configuration error",
+                JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, null, 
options, options[0]);
+        if (selection == 0) {
+            classPathConfigAction();
+        }
+    }
+
+    public DataSource getDataSource() {
+        return dataSource;
+    }
+
+    /**
+     * Returns configured DbAdapter.
+     */
+    public DbAdapter getAdapter() {
+        return adapter;
+    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
index dc55e1fd6..9cb9bd824 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
@@ -30,8 +30,6 @@ import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.pref.DBGeneratorDefaults;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.DbAdapterInfo;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.validation.ValidationResult;
 
 import javax.swing.*;
@@ -51,8 +49,7 @@ import java.util.Iterator;
 public class DBGeneratorOptions extends CayenneController {
 
     protected DBGeneratorOptionsView view;
-    protected ObjectBinding[] optionBindings;
-    protected ObjectBinding adapterBinding;
+    private boolean updatingAdapterCombo;
 
     protected DBConnectionInfo connectionInfo;
     protected Collection<DataMap> dataMaps;
@@ -101,37 +98,18 @@ public class DBGeneratorOptions extends CayenneController {
         view.getAdapters().setModel(adapterModel);
         view.getAdapters().setSelectedIndex(0);
 
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        adapterBinding = builder.bindToComboSelection(
-                view.getAdapters(),
-                "connectionInfo.dbAdapter",
-                "refreshSQLAction()",
-                "org.apache.cayenne.dba.JdbcAdapter");
-
-        optionBindings = new ObjectBinding[5];
-        optionBindings[0] = builder.bindToStateChangeAndAction(
-                view.getCreateFK(),
-                "generatorDefaults.createFK",
-                "refreshSQLAction()");
-        optionBindings[1] = builder.bindToStateChangeAndAction(
-                view.getCreatePK(),
-                "generatorDefaults.createPK",
-                "refreshSQLAction()");
-        optionBindings[2] = builder.bindToStateChangeAndAction(
-                view.getCreateTables(),
-                "generatorDefaults.createTables",
-                "refreshSQLAction()");
-        optionBindings[3] = builder.bindToStateChangeAndAction(
-                view.getDropPK(),
-                "generatorDefaults.dropPK",
-                "refreshSQLAction()");
-        optionBindings[4] = builder.bindToStateChangeAndAction(
-                view.getDropTables(),
-                "generatorDefaults.dropTables",
-                "refreshSQLAction()");
+        view.getAdapters().addActionListener(e -> {
+            if (updatingAdapterCombo) return;
+            Object sel = view.getAdapters().getSelectedItem();
+            
connectionInfo.setDbAdapter("org.apache.cayenne.dba.JdbcAdapter".equals(sel) ? 
null : (String) sel);
+            refreshSQLAction();
+        });
+
+        view.getCreateFK().addActionListener(e -> { 
generatorDefaults.setCreateFK(view.getCreateFK().isSelected()); 
refreshSQLAction(); });
+        view.getCreatePK().addActionListener(e -> { 
generatorDefaults.setCreatePK(view.getCreatePK().isSelected()); 
refreshSQLAction(); });
+        view.getCreateTables().addActionListener(e -> { 
generatorDefaults.setCreateTables(view.getCreateTables().isSelected()); 
refreshSQLAction(); });
+        view.getDropPK().addActionListener(e -> { 
generatorDefaults.setDropPK(view.getDropPK().isSelected()); refreshSQLAction(); 
});
+        view.getDropTables().addActionListener(e -> { 
generatorDefaults.setDropTables(view.getDropTables().isSelected()); 
refreshSQLAction(); });
 
         view.getGenerateButton().addActionListener(e -> 
generateSchemaAction());
         view.getSaveSqlButton().addActionListener(e -> storeSQLAction());
@@ -195,9 +173,11 @@ public class DBGeneratorOptions extends CayenneController {
     protected void refreshView() {
         getView().setEnabled(connectionInfo != null);
 
-        for (ObjectBinding optionBinding : optionBindings) {
-            optionBinding.updateView();
-        }
+        view.getCreateFK().setSelected(generatorDefaults.createFK);
+        view.getCreatePK().setSelected(generatorDefaults.createPK);
+        view.getCreateTables().setSelected(generatorDefaults.createTables);
+        view.getDropPK().setSelected(generatorDefaults.dropPK);
+        view.getDropTables().setSelected(generatorDefaults.dropTables);
 
         view.getSql().setText(textForSQL);
     }
@@ -227,8 +207,14 @@ public class DBGeneratorOptions extends CayenneController {
      * Updates a text area showing generated SQL.
      */
     public void refreshSQLAction() {
-        // sync generator with defaults, make SQL, then sync the view...
-        adapterBinding.updateView();
+        // sync combo to reflect current connectionInfo (e.g. after 
generateSchemaAction replaces it)
+        updatingAdapterCombo = true;
+        try {
+            String adapter = connectionInfo.getDbAdapter();
+            view.getAdapters().setSelectedItem(adapter != null ? adapter : 
"org.apache.cayenne.dba.JdbcAdapter");
+        } finally {
+            updatingAdapterCombo = false;
+        }
         connectionInfo.setDbAdapter((String) 
view.getAdapters().getSelectedItem());
         prepareGenerator();
         generatorDefaults.configureGenerator(generators);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
index 20f123303..f3a930191 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
@@ -45,7 +45,6 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.pref.CayennePreferenceEditor;
 import org.apache.cayenne.pref.ChildrenMapPreference;
 import org.apache.cayenne.pref.PreferenceEditor;
-import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
 
 /**
@@ -94,13 +93,15 @@ public class DataSourcePreferences extends 
CayenneController {
        }
 
        protected void initBindings() {
-               BindingBuilder builder = new 
BindingBuilder(getApplication().getBindingFactory(), this);
                view.getAddDataSource().addActionListener(e -> 
newDataSourceAction());
                view.getDuplicateDataSource().addActionListener(e -> 
duplicateDataSourceAction());
                view.getRemoveDataSource().addActionListener(e -> 
removeDataSourceAction());
                view.getTestDataSource().addActionListener(e -> 
testDataSourceAction());
 
-               builder.bindToComboSelection(view.getDataSources(), 
"dataSourceKey");
+               view.getDataSources().addActionListener(e -> {
+                       Object sel = view.getDataSources().getSelectedItem();
+                       setDataSourceKey(sel != null ? sel.toString() : null);
+               });
        }
 
        public Map getDataSources() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelector.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelector.java
index 797a738f1..f42c230d6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelector.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelector.java
@@ -21,13 +21,10 @@
 package org.apache.cayenne.modeler.dialog.pref;
 
 import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.*;
 import java.awt.*;
-import java.beans.PropertyChangeListener;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStreamWriter;
 import java.util.Arrays;
@@ -42,35 +39,16 @@ public class EncodingSelector extends CayenneController {
 
     public static final String ENCODING_PROPERTY_BINDING = "encoding";
 
-    protected PropertyChangeListener encodingChangeListener;
-    protected ObjectBinding defaultEncodingBinding;
-    protected ObjectBinding otherEncodingBinding;
-    protected ObjectBinding selectedEncodingBinding;
+    private final EncodingSelectorView view;
+    private final String systemEncoding;
 
-    protected EncodingSelectorView view;
-    protected String systemEncoding;
-    protected String encoding;
-    protected boolean defaultEncoding;
-
-    /**
-     * Creates new EncodingPicker.
-     */
-    public EncodingSelector(CayenneController parent) {
-        this(parent, new EncodingSelectorView());
-    }
+    private String encoding;
+    private boolean defaultEncoding;
 
     public EncodingSelector(CayenneController parent, EncodingSelectorView 
view) {
         super(parent);
         this.view = view;
 
-        initBindings();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    protected void initBindings() {
         // init static models...
         this.systemEncoding = detectPlatformEncoding();
 
@@ -79,19 +57,18 @@ public class EncodingSelector extends CayenneController {
         view.getDefaultEncodingLabel().setText("Default (" + systemEncoding + 
")");
         view.getDefaultEncoding().setSelected(true);
 
-        // create bindings...
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        this.defaultEncodingBinding = builder
-                .bindToStateChange(view.getDefaultEncoding(), 
"defaultEncoding");
+        view.getDefaultEncoding().addActionListener(e -> 
setDefaultEncoding(view.getDefaultEncoding().isSelected()));
+        view.getOtherEncoding().addActionListener(e -> 
setDefaultEncoding(!view.getOtherEncoding().isSelected()));
 
-        this.otherEncodingBinding = 
builder.bindToStateChange(view.getOtherEncoding(),
-                "otherEncoding");
+        view.getEncodingChoices().addActionListener(e -> {
+            Object sel = view.getEncodingChoices().getSelectedItem();
+            setEncoding(sel != null ? sel.toString() : null);
+        });
+    }
 
-        this.selectedEncodingBinding = builder.bindToComboSelection(view
-                .getEncodingChoices(), "encoding");
+    @Override
+    public Component getView() {
+        return view;
     }
 
     /**
@@ -127,25 +104,21 @@ public class EncodingSelector extends CayenneController {
             this.encoding = (newValue != null) ? newValue.toString() : null;
             this.defaultEncoding = encoding == null || 
encoding.equals(systemEncoding);
 
-            selectedEncodingBinding.updateView();
+            view.getEncodingChoices().setSelectedItem(encoding);
+            view.getDefaultEncoding().setSelected(defaultEncoding);
+            view.getOtherEncoding().setSelected(!defaultEncoding);
             if (defaultEncoding) {
-                defaultEncodingBinding.updateView();
                 view.getEncodingChoices().setEnabled(false);
                 view.getDefaultEncodingLabel().setEnabled(true);
             }
             else {
-                otherEncodingBinding.updateView();
                 view.getEncodingChoices().setEnabled(true);
                 view.getDefaultEncodingLabel().setEnabled(false);
             }
         }
     }
 
-    // ===============
-    //    Properties
-    // ===============
-
-    public void setEncoding(String encoding) {
+    private void setEncoding(String encoding) {
         if (!Util.nullSafeEquals(this.encoding, encoding)) {
             Object old = this.encoding;
 
@@ -154,15 +127,7 @@ public class EncodingSelector extends CayenneController {
         }
     }
 
-    public String getEncoding() {
-        return encoding;
-    }
-
-    public boolean isDefaultEncoding() {
-        return defaultEncoding;
-    }
-
-    public void setDefaultEncoding(boolean b) {
+    private void setDefaultEncoding(boolean b) {
         if (b != defaultEncoding) {
             this.defaultEncoding = b;
 
@@ -178,12 +143,4 @@ public class EncodingSelector extends CayenneController {
 
         }
     }
-
-    public boolean isOtherEncoding() {
-        return !isDefaultEncoding();
-    }
-
-    public void setOtherEncoding(boolean b) {
-        setDefaultEncoding(!b);
-    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelectorView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelectorView.java
index bbdc8ad51..7034041bb 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelectorView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/EncodingSelectorView.java
@@ -19,27 +19,22 @@
 
 package org.apache.cayenne.modeler.dialog.pref;
 
-import java.awt.BorderLayout;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 
+import javax.swing.*;
+import java.awt.*;
+
 /**
  * A panel for file encoding selection.
  * 
  */
 public class EncodingSelectorView extends JPanel {
 
-    protected JRadioButton defaultEncoding;
-    protected JRadioButton otherEncoding;
-    protected JComboBox encodingChoices;
-    protected JLabel defaultEncodingLabel;
+    private final JRadioButton defaultEncoding;
+    private final JRadioButton otherEncoding;
+    private final JComboBox encodingChoices;
+    private final JLabel defaultEncodingLabel;
 
     public EncodingSelectorView() {
         this.defaultEncoding = new JRadioButton();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/GeneralPreferences.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/GeneralPreferences.java
index f748fbbf0..263db5a5f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/GeneralPreferences.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/GeneralPreferences.java
@@ -27,11 +27,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.prefs.Preferences;
 
-import java.awt.*;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.prefs.Preferences;
-
 public class GeneralPreferences extends CayenneController {
 
        public static final String AUTO_LOAD_PROJECT_PREFERENCE = 
"autoLoadProject";
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
index a5efbf4ca..641b24ba8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
@@ -176,7 +176,6 @@ public class EditorView extends JPanel implements 
ObjEntityDisplayListener,
         // init widgets
         actionManager.getAction(CollapseTreeAction.class).setAlwaysOn(true);
         actionManager.getAction(FilterAction.class).setAlwaysOn(true);
-        actionManager.getAction(FilterAction.class).resetDialog();
 
         JToolBar barPanel = new JToolBar();
         barPanel.setFloatable(false);
@@ -267,7 +266,7 @@ public class EditorView extends JPanel implements 
ObjEntityDisplayListener,
 
 
        private void initController() {
-               this.filterController = new 
FilterController(eventController,treePanel);
+               this.filterController = new FilterController(treePanel);
                 
         eventController.addDomainDisplayListener(this);
         eventController.addDataNodeDisplayListener(this);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java
index ba2bf85cd..449eb72a8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java
@@ -43,9 +43,7 @@ import org.apache.cayenne.modeler.pref.DataNodeDefaults;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.ProjectUtil;
 import org.apache.cayenne.modeler.util.TextBinder;
-import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.BindingDelegate;
-import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.validation.ValidationException;
 
 /**
@@ -76,8 +74,7 @@ public class MainDataNodeEditor extends CayenneController {
 
        protected CustomDataSourceEditor defaultSubeditor;
        protected BindingDelegate nodeChangeProcessor;
-       protected ObjectBinding[] bindings;
-       protected ObjectBinding localDataSourceBinding;
+       private boolean refreshing;
 
        public MainDataNodeEditor(ProjectController parent, DataNodeEditor 
tabController) {
 
@@ -188,12 +185,12 @@ public class MainDataNodeEditor extends CayenneController 
{
                        }
                });
 
-               BindingBuilder builder = new 
BindingBuilder(getApplication().getBindingFactory(), this);
-
-               localDataSourceBinding = 
builder.bindToComboSelection(view.getLocalDataSources(),
-                               "parent.dataNodePreferences.localDataSource", 
NO_LOCAL_DATA_SOURCE);
-
-               // use delegate for the rest of them
+               view.getLocalDataSources().addActionListener(e -> {
+                       if (refreshing) return;
+                       Object sel = 
view.getLocalDataSources().getSelectedItem();
+                       String key = (sel == null || 
NO_LOCAL_DATA_SOURCE.equals(sel)) ? null : sel.toString();
+                       ((ProjectController) 
getParent()).getDataNodePreferences().setLocalDataSource(key);
+               });
 
                TextBinder.bind(view.getDataNodeName(), v -> {
                        if (node == null) return;
@@ -214,9 +211,17 @@ public class MainDataNodeEditor extends CayenneController {
                        ((ProjectController) getParent()).fireDataNodeEvent(new 
DataNodeEvent(MainDataNodeEditor.this, node));
                });
 
-               bindings = new ObjectBinding[2];
-               bindings[0] = builder.bindToComboSelection(view.getFactories(), 
"factoryName");
-               bindings[1] = 
builder.bindToComboSelection(view.getSchemaUpdateStrategy(), 
"schemaUpdateStrategy");
+               view.getFactories().addActionListener(e -> {
+                       if (refreshing) return;
+                       setFactoryName((String) 
view.getFactories().getSelectedItem());
+                       ((ProjectController) getParent()).fireDataNodeEvent(new 
DataNodeEvent(MainDataNodeEditor.this, node));
+               });
+
+               view.getSchemaUpdateStrategy().addActionListener(e -> {
+                       if (refreshing) return;
+                       setSchemaUpdateStrategy((String) 
view.getSchemaUpdateStrategy().getSelectedItem());
+                       ((ProjectController) getParent()).fireDataNodeEvent(new 
DataNodeEvent(MainDataNodeEditor.this, node));
+               });
 
                // one way bindings
                view.getConfigLocalDataSources().addActionListener(e -> 
dataSourceConfigAction());
@@ -243,8 +248,14 @@ public class MainDataNodeEditor extends CayenneController {
                String[] dataSources = sources.keySet().toArray(new String[0]);
         System.arraycopy(dataSources, 0, keys, 1, dataSources.length);
 
-               view.getLocalDataSources().setModel(new 
DefaultComboBoxModel<>(keys));
-               localDataSourceBinding.updateView();
+               refreshing = true;
+               try {
+                       view.getLocalDataSources().setModel(new 
DefaultComboBoxModel<>(keys));
+                       String localDs = ((ProjectController) 
getParent()).getDataNodePreferences().getLocalDataSource();
+                       view.getLocalDataSources().setSelectedItem(localDs != 
null ? localDs : NO_LOCAL_DATA_SOURCE);
+               } finally {
+                       refreshing = false;
+               }
        }
 
        /**
@@ -262,8 +273,12 @@ public class MainDataNodeEditor extends CayenneController {
 
                view.getDataNodeName().setText(getNodeName());
                view.getCustomAdapter().setText(getAdapterName());
-               for (ObjectBinding binding : bindings) {
-                       binding.updateView();
+               refreshing = true;
+               try {
+                       view.getFactories().setSelectedItem(getFactoryName());
+                       
view.getSchemaUpdateStrategy().setSelectedItem(getSchemaUpdateStrategy());
+               } finally {
+                       refreshing = false;
                }
 
                showDataSourceSubview(getFactoryName());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ActionDelegate.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ActionDelegate.java
deleted file mode 100644
index 6d3b341d8..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ActionDelegate.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.swing;
-
-import java.util.Collections;
-
-/**
- * An implementation of BindingDelegate that invokes a no-argument context 
action on every
- * model update.
- * 
- */
-public class ActionDelegate implements BindingDelegate {
-
-    protected BindingExpression expression;
-
-    public ActionDelegate(String expression) {
-        this.expression = new BindingExpression(expression);
-    }
-
-    public void modelUpdated(ObjectBinding binding, Object oldValue, Object 
newValue) {
-        // TODO: might add new and old value as variables...
-        expression.getValue(binding.getContext(), Collections.EMPTY_MAP);
-    }
-}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingBuilder.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingBuilder.java
index fc71fcba1..6addce267 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingBuilder.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingBuilder.java
@@ -19,11 +19,6 @@
 
 package org.apache.cayenne.swing;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * A builder for component bindings that delegates the creation of the binding 
to the
  * underlying factory, and itself configures a number of binding parameters.
@@ -34,7 +29,6 @@ public class BindingBuilder {
     protected BindingFactory factory;
     protected BindingDelegate delegate;
     protected Object context;
-    protected Map actionsMap;
 
     /**
      * Constructs BindingBuilder with a BindingFactory and a root model object 
(or
@@ -73,68 +67,10 @@ public class BindingBuilder {
         return factory;
     }
 
-    public ObjectBinding bindToStateChange(AbstractButton button, String 
property) {
-        ObjectBinding binding = factory.bindToStateChange(button, property);
-        return initBinding(binding, delegate);
-    }
-
-    public ObjectBinding bindToStateChangeAndAction(
-            AbstractButton button,
-            String property,
-            String action) {
-        ObjectBinding binding = factory.bindToStateChange(button, property);
-        return initBinding(binding, getActionDelegate(action));
-    }
-
-    public ObjectBinding bindToComboSelection(JComboBox component, String 
property) {
-        ObjectBinding binding = factory.bindToComboSelection(component, 
property, null);
-        return initBinding(binding, delegate);
-    }
-
-    public ObjectBinding bindToComboSelection(
-            JComboBox component,
-            String property,
-            String noSelectionValue) {
-        ObjectBinding binding = factory.bindToComboSelection(
-                component,
-                property,
-                noSelectionValue);
-        return initBinding(binding, delegate);
-    }
-
-    public ObjectBinding bindToComboSelection(
-            JComboBox component,
-            String property,
-            String action,
-            String noSelectionValue) {
-        ObjectBinding binding = factory.bindToComboSelection(
-                component,
-                property,
-                noSelectionValue);
-        return initBinding(binding, getActionDelegate(action));
-    }
 
     protected ObjectBinding initBinding(ObjectBinding binding, BindingDelegate 
delegate) {
         binding.setDelegate(delegate);
         binding.setContext(context);
         return binding;
     }
-
-    protected BindingDelegate getActionDelegate(String action) {
-        BindingDelegate delegate = null;
-
-        if (actionsMap == null) {
-            actionsMap = new HashMap();
-        }
-        else {
-            delegate = (BindingDelegate) actionsMap.get(action);
-        }
-
-        if (delegate == null) {
-            delegate = new ActionDelegate(action);
-            actionsMap.put(action, delegate);
-        }
-
-        return delegate;
-    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingFactory.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingFactory.java
index 1164bd32a..1b3973373 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingFactory.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BindingFactory.java
@@ -57,26 +57,6 @@ public class BindingFactory {
         return prepareBinding(binding);
     }
 
-    /**
-     * Binds to AbstractButton item state change events. Most common 
AbstractButton
-     * subclasses are JButton, JCheckBox, JRadioButton.
-     */
-    public ObjectBinding bindToStateChange(AbstractButton button, String 
property) {
-        ItemEventBinding binding = new ItemEventBinding(button, property);
-        return prepareBinding(binding);
-    }
-
-    public ObjectBinding bindToComboSelection(
-            JComboBox component,
-            String property,
-            String noSelectionValue) {
-        ComboSelectionBinding binding = new ComboSelectionBinding(
-                component,
-                property,
-                noSelectionValue);
-        return prepareBinding(binding);
-    }
-
     /**
      * Configures binding with factory default settings.
      */
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ComboSelectionBinding.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ComboSelectionBinding.java
deleted file mode 100644
index a74a97d31..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ComboSelectionBinding.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.swing;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemListener;
-
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-
-import org.apache.cayenne.modeler.dialog.validator.ValidatorDialog;
-import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
-import org.apache.cayenne.validation.ValidationException;
-
-/**
- */
-public class ComboSelectionBinding extends BindingBase {
-
-    protected JComboBox comboBox;
-
-    protected Color defaultBGColor;
-    protected Color errorColor;
-    protected String defaultToolTip;
-    protected String noSelectionValue;
-
-    /**
-     * Binds to update model for a combo box selection events. For editable 
combo boxes
-     * model is updated whenever a new value is entered.
-     */
-    public ComboSelectionBinding(JComboBox comboBox, String expression,
-            String noSelectionValue) {
-        super(expression);
-        this.comboBox = comboBox;
-        this.noSelectionValue = noSelectionValue;
-
-        // insert no selection value as first item in the combobox if it is 
not there
-        if (noSelectionValue != null
-                && (comboBox.getItemCount() == 0 || comboBox.getItemAt(0) != 
noSelectionValue)) {
-
-            comboBox.insertItemAt(noSelectionValue, 0);
-        }
-
-        comboBox.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                if (!modelUpdateDisabled) {
-                    updateModel();
-                }
-            }
-        });
-
-        // init error colors
-        initComponentDefaults();
-    }
-
-    protected void initComponentDefaults() {
-        this.errorColor = ValidatorDialog.WARNING_COLOR;
-
-        if (comboBox.getEditor() != null) {
-
-            Component editor = comboBox.getEditor().getEditorComponent();
-            if (editor instanceof JComponent) {
-                JComponent jEditor = (JComponent) editor;
-                this.defaultBGColor = jEditor.getBackground();
-                this.defaultToolTip = jEditor.getToolTipText();
-            }
-        }
-    }
-
-    public void updateView() {
-        Object value = getValue();
-        modelUpdateDisabled = true;
-        try {
-            clear();
-            ItemListener[] listeners = comboBox.getItemListeners();
-            for (ItemListener itemListener : listeners) {
-                if (itemListener instanceof JComboBoxUndoListener) {
-                    //in order not to add event to undo list
-                    ((JComboBoxUndoListener) 
itemListener).setIsUserAction(false);
-                }
-            }
-            if (value != null) {
-                this.comboBox.setSelectedItem(value.toString());
-            }
-            else if (noSelectionValue != null) {
-                this.comboBox.setSelectedItem(noSelectionValue);
-            }
-            else {
-                this.comboBox.setSelectedIndex(-1);
-            }
-        }
-        finally {
-            modelUpdateDisabled = false;
-        }
-    }
-
-    protected void updateModel() {
-        try {
-            Object value = comboBox.getSelectedItem();
-            if (noSelectionValue != null && noSelectionValue.equals(value)) {
-                value = null;
-            }
-            setValue(value);
-            clear();
-        }
-        catch (ValidationException vex) {
-            initWarning(vex.getLocalizedMessage());
-        }
-    }
-
-    public Component getView() {
-        return comboBox;
-    }
-
-    protected void clear() {
-        if (comboBox.getEditor() != null) {
-
-            Component editor = comboBox.getEditor().getEditorComponent();
-            if (editor instanceof JComponent) {
-                JComponent jEditor = (JComponent) editor;
-                jEditor.setBackground(defaultBGColor);
-                jEditor.setToolTipText(defaultToolTip);
-            }
-        }
-    }
-
-    protected void initWarning(String message) {
-        if (comboBox.getEditor() != null) {
-
-            Component editor = comboBox.getEditor().getEditorComponent();
-            if (editor instanceof JComponent) {
-                JComponent jEditor = (JComponent) editor;
-                jEditor.setBackground(errorColor);
-                jEditor.setToolTipText(message);
-            }
-        }
-    }
-}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ItemEventBinding.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ItemEventBinding.java
deleted file mode 100644
index 370cd3ec6..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/ItemEventBinding.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.swing;
-
-import java.awt.Component;
-
-import javax.swing.AbstractButton;
-
-/**
- * Binds a checkbox state to an int or boolean property.
- * 
- */
-public class ItemEventBinding extends BindingBase {
-
-    protected AbstractButton boundItem;
-
-    public ItemEventBinding(AbstractButton boundItem, String expression) {
-        super(expression);
-        this.boundItem = boundItem;
-
-        boundItem.addItemListener(e -> updateModel());
-    }
-
-    public Component getView() {
-        return boundItem;
-    }
-
-    public void updateView() {
-        Object value = getValue();
-        boolean b = false;
-
-        // convert to boolean
-        if (value != null) {
-            if (value instanceof Boolean) {
-                b = (Boolean) value;
-            } else if (value instanceof Number) {
-                b = ((Number) value).intValue() != 0;
-            }
-        }
-
-        modelUpdateDisabled = true;
-        try {
-            boundItem.setSelected(b);
-        } finally {
-            modelUpdateDisabled = false;
-        }
-    }
-
-    protected void updateModel() {
-        setValue(boundItem.isSelected() ? Boolean.TRUE : Boolean.FALSE);
-    }
-}

Reply via email to