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);
- }
-}