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 a93ee00bc CAY-2918 Remove OGNL Binding Architecture from CayenneModeler
a93ee00bc is described below

commit a93ee00bc35a6225b92372768516e68883affaed
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 TableBinder
---
 .../InferRelationshipsControllerBase.java          |  16 +++
 .../InferRelationshipsTabController.java           | 119 ++++++++---------
 .../dialog/db/gen/TableSelectorController.java     | 147 +++++++--------------
 .../modeler/dialog/db/gen/TableSelectorView.java   |  20 +--
 .../db/merge/MergerTokenSelectorController.java    |   2 -
 .../cgen/CgenArtefactSelectorController.java       |  96 ++++++--------
 .../modeler/editor/cgen/CgenController.java        |  11 ++
 .../apache/cayenne/modeler/util/TableSizer.java    |  62 +++++++++
 8 files changed, 239 insertions(+), 234 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
index e321d0e97..9c05338ef 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
@@ -261,6 +261,10 @@ public class InferRelationshipsControllerBase extends 
CayenneController {
         return currentEntity != null && 
selectedEntities.contains(currentEntity);
     }
 
+    public boolean isSelected(InferredRelationship entity) {
+        return selectedEntities.contains(entity);
+    }
+
     public void setSelected(boolean selectedFlag) {
         if (currentEntity == null) {
             return;
@@ -278,6 +282,18 @@ public class InferRelationshipsControllerBase extends 
CayenneController {
         }
     }
 
+    public void setSelected(InferredRelationship entity, boolean selectedFlag) 
{
+        if (selectedFlag) {
+            if (selectedEntities.add(entity)) {
+                firePropertyChange(SELECTED_PROPERTY, null, null);
+            }
+        } else {
+            if (selectedEntities.remove(entity)) {
+                firePropertyChange(SELECTED_PROPERTY, null, null);
+            }
+        }
+    }
+
     public int getSelectedEntitiesSize() {
         return selectedEntities.size();
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
index cf4ef657c..0f2be106e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
@@ -18,23 +18,28 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog.autorelationship;
 
-import java.awt.Component;
-
 import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.swing.TableBindingBuilder;
+import org.apache.cayenne.modeler.util.TableSizer;
+
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
+import java.awt.*;
+import java.util.List;
 
 public class InferRelationshipsTabController extends CayenneController {
 
     public static final String GENERATE_PROPERTY = "generate";
 
+    private static final String[] COLUMN_HEADERS = {"", "Source", "Target", 
"Join", "Name", "To Many"};
+    private static final Class<?>[] COLUMN_CLASSES = {
+            Boolean.class, String.class, String.class, String.class, 
String.class, String.class
+    };
+
     protected InferRelationshipsPanel view;
-    protected ObjectBinding tableBinding;
+    protected AbstractTableModel tableModel;
 
     public InferRelationshipsTabController(InferRelationshipsControllerBase 
parent) {
         super(parent);
-
         this.view = new InferRelationshipsPanel();
         initBindings();
     }
@@ -48,61 +53,48 @@ public class InferRelationshipsTabController extends 
CayenneController {
     }
 
     protected void initBindings() {
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
         view.getCheckAll().addActionListener(e -> checkAllAction());
 
-        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-
-        tableBuilder.addColumn(
-                "",
-                "parent.setCurrentEntity(#item), selected",
-                Boolean.class,
-                true,
-                Boolean.TRUE);
-        tableBuilder.addColumn(
-                "Source",
-                "#item.getSource().getName()",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-
-        tableBuilder.addColumn(
-                "Target",
-                "#item.getTarget().getName()",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-        tableBuilder.addColumn(
-                "Join",
-                "parent.getJoin(#item)",
-                String.class,
-                false,
-                
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-        tableBuilder.addColumn(
-                "Name",
-                "#item.getName()",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-        tableBuilder.addColumn(
-                "To Many",
-                "parent.getToMany(#item)",
-                String.class,
-                false,
+        tableModel = new AbstractTableModel() {
+            public int getRowCount() {
+                List<?> entities = getParentController().getEntities();
+                return entities != null ? entities.size() : 0;
+            }
+            public int getColumnCount() { return COLUMN_HEADERS.length; }
+            public String getColumnName(int col) { return COLUMN_HEADERS[col]; 
}
+            public Class<?> getColumnClass(int col) { return 
COLUMN_CLASSES[col]; }
+            public boolean isCellEditable(int row, int col) { return col == 0; 
}
+
+            public Object getValueAt(int row, int col) {
+                InferredRelationship item = getItem(row);
+                if (col == 0) return getParentController().isSelected(item);
+                if (col == 1) return item.getSource().getName();
+                if (col == 2) return item.getTarget().getName();
+                if (col == 3) return getParentController().getJoin(item);
+                if (col == 4) return item.getName();
+                return getParentController().getToMany(item);
+            }
+
+            public void setValueAt(Object value, int row, int col) {
+                if (col == 0) {
+                    getParentController().setSelected(getItem(row), (Boolean) 
value);
+                    entitySelectedAction();
+                }
+            }
+
+            private InferredRelationship getItem(int row) {
+                return (InferredRelationship) 
getParentController().getEntities().get(row);
+            }
+        };
+
+        view.getTable().setModel(tableModel);
+        TableSizer.sizeColumns(view.getTable(),
+                Boolean.TRUE,
+                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+                
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-        this.tableBinding = tableBuilder.bindToTable(view.getTable(), 
"parent.entities");
-    }
-
-    public boolean isSelected() {
-        return getParentController().isSelected();
-    }
-
-    public void setSelected(boolean selected) {
-        getParentController().setSelected(selected);
-        entitySelectedAction();
     }
 
     /**
@@ -110,7 +102,6 @@ public class InferRelationshipsTabController extends 
CayenneController {
      */
     public void entitySelectedAction() {
         int selectedCount = getParentController().getSelectedEntitiesSize();
-
         if (selectedCount == 0) {
             view.getCheckAll().setSelected(false);
         } else if (selectedCount == 
getParentController().getEntities().size()) {
@@ -118,13 +109,11 @@ public class InferRelationshipsTabController extends 
CayenneController {
         }
     }
 
-    /**
-     * An action that updates entity check boxes in response to the Select All 
state
-     * change.
-     */
     public void checkAllAction() {
         if 
(getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> 
true : o -> false)) {
-            tableBinding.updateView();
+            tableModel.fireTableDataChanged();
         }
     }
+
 }
+
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
index 816feb0b1..8d7316ea4 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
@@ -25,35 +25,33 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.modeler.util.TableSizer;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.validation.ProjectValidator;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.swing.TableBindingBuilder;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import java.awt.Component;
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
+import java.awt.*;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-/**
- */
-@SuppressWarnings("unused") // setTable(), included, problem are referenced by 
name in TableBindingBuilder column expressions
 public class TableSelectorController extends CayenneController {
 
+    private static final String[] COLUMN_HEADERS = {"", "Table", "Problems"};
+    private static final Class<?>[] COLUMN_CLASSES = {Boolean.class, 
String.class, String.class};
+
     protected TableSelectorView view;
-    protected ObjectBinding tableBinding;
+    protected AbstractTableModel tableModel;
 
-    protected DbEntity table;
     protected List<DbEntity> tables;
     protected int permanentlyExcludedCount;
     protected Map<String, DbEntity> excludedTables;
     protected List<DbEntity> selectableTablesList;
-
     protected Map<String, String> validationMessages;
 
     public TableSelectorController(ProjectController parent) {
@@ -69,16 +67,6 @@ public class TableSelectorController extends 
CayenneController {
         return view;
     }
 
-    /**
-     * Called by table binding script to set current table.
-     */
-    public void setTable(DbEntity table) {
-        this.table = table;
-    }
-
-    /**
-     * Returns DbEntities that are excluded from DB generation.
-     */
     public Collection<DbEntity> getExcludedTables() {
         return excludedTables.values();
     }
@@ -87,88 +75,60 @@ public class TableSelectorController extends 
CayenneController {
         return tables;
     }
 
-    public boolean isIncluded() {
-        if (table == null) {
-            return false;
-        }
-
-        return !excludedTables.containsKey(table.getName());
+    public boolean isIncluded(DbEntity entity) {
+        return !excludedTables.containsKey(entity.getName());
     }
 
-    public void setIncluded(boolean b) {
-        if (table == null) {
-            return;
-        }
-
+    public void setIncluded(DbEntity entity, boolean b) {
         if (b) {
-            excludedTables.remove(table.getName());
+            excludedTables.remove(entity.getName());
+        } else {
+            excludedTables.put(entity.getName(), entity);
         }
-        else {
-            excludedTables.put(table.getName(), table);
-        }
-
         tableSelectedAction();
     }
 
-    /**
-     * A callback action that updates the state of Select All checkbox.
-     */
+    public String getProblem(DbEntity entity) {
+        return validationMessages.get(entity.getName());
+    }
+
     public void tableSelectedAction() {
         int unselectedCount = excludedTables.size() - permanentlyExcludedCount;
-
         if (unselectedCount == selectableTablesList.size()) {
             view.getCheckAll().setSelected(false);
-        }
-        else if (unselectedCount == 0) {
+        } else if (unselectedCount == 0) {
             view.getCheckAll().setSelected(true);
         }
     }
 
-    public Object getProblem() {
-        return (table != null) ? validationMessages.get(table.getName()) : 
null;
-    }
-
-    // ------ other stuff ------
-
     protected void initController() {
+        view.getCheckAll().addActionListener(e -> checkAllAction());
 
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
+        tableModel = new AbstractTableModel() {
+            public int getRowCount() { return tables != null ? tables.size() : 
0; }
+            public int getColumnCount() { return COLUMN_HEADERS.length; }
+            public String getColumnName(int col) { return COLUMN_HEADERS[col]; 
}
+            public Class<?> getColumnClass(int col) { return 
COLUMN_CLASSES[col]; }
+            public boolean isCellEditable(int row, int col) { return col == 0; 
}
+
+            public Object getValueAt(int row, int col) {
+                DbEntity entity = tables.get(row);
+                if (col == 0) return isIncluded(entity);
+                if (col == 1) return entity.getName();
+                return getProblem(entity);
+            }
 
-        view.getCheckAll().addActionListener(e -> checkAllAction());
+            public void setValueAt(Object value, int row, int col) {
+                if (col == 0) setIncluded(tables.get(row), (Boolean) value);
+            }
+        };
 
-        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-
-        tableBuilder.addColumn(
-                "",
-                "setTable(#item), included",
-                Boolean.class,
-                true,
-                Boolean.TRUE);
-        tableBuilder.addColumn(
-                "Table",
-                "#item.name",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXX");
-        tableBuilder.addColumn(
-                "Problems",
-                "setTable(#item), problem",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-
-        this.tableBinding = tableBuilder.bindToTable(view.getTables(), 
"tables");
+        view.getTables().setModel(tableModel);
+        TableSizer.sizeColumns(view.getTables(), Boolean.TRUE, 
"XXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
     }
 
-    /**
-     * Performs validation of DbEntities in the current DataMap. Returns a 
collection of
-     * ValidationInfo objects describing the problems.
-     */
     public void updateTables(Collection<DataMap> dataMaps) {
         this.tables = new ArrayList<>();
-
         for (DataMap dataMap : dataMaps) {
             this.tables.addAll(dataMap.getDbEntities());
         }
@@ -176,30 +136,19 @@ public class TableSelectorController extends 
CayenneController {
         excludedTables.clear();
         validationMessages.clear();
 
-        // if there were errors, filter out those related to non-derived 
DbEntities...
-
-        // TODO: this is inefficient.. we need targeted validation
-        //       instead of doing it on the whole project
-
         Project project = getApplication().getProject();
-
         ProjectValidator projectValidator = 
getApplication().getInjector().getInstance(ProjectValidator.class);
         ValidationResult validationResult = 
projectValidator.validate(project.getRootNode());
 
         if (validationResult.getFailures().size() > 0) {
-
             for (ValidationFailure nextProblem : 
validationResult.getFailures()) {
                 DbEntity failedEntity = null;
 
                 if (nextProblem.getSource() instanceof DbAttribute) {
-                    DbAttribute failedAttribute = (DbAttribute) 
nextProblem.getSource();
-                    failedEntity = failedAttribute.getEntity();
-                }
-                else if (nextProblem.getSource() instanceof DbRelationship) {
-                    DbRelationship failedRelationship = (DbRelationship) 
nextProblem.getSource();
-                    failedEntity = failedRelationship.getSourceEntity();
-                }
-                else if (nextProblem.getSource() instanceof DbEntity) {
+                    failedEntity = ((DbAttribute) 
nextProblem.getSource()).getEntity();
+                } else if (nextProblem.getSource() instanceof DbRelationship) {
+                    failedEntity = ((DbRelationship) 
nextProblem.getSource()).getSourceEntity();
+                } else if (nextProblem.getSource() instanceof DbEntity) {
                     failedEntity = (DbEntity) nextProblem.getSource();
                 }
 
@@ -212,7 +161,6 @@ public class TableSelectorController extends 
CayenneController {
             }
         }
 
-        // Find selectable tables
         permanentlyExcludedCount = excludedTables.size();
         selectableTablesList.clear();
         for (DbEntity table : tables) {
@@ -221,20 +169,18 @@ public class TableSelectorController extends 
CayenneController {
             }
         }
 
-        tableBinding.updateView();
+        tableModel.fireTableDataChanged();
         tableSelectedAction();
     }
 
     public void checkAllAction() {
-
         boolean isCheckAllSelected = view.getCheckAll().isSelected();
 
         if (isCheckAllSelected) {
             selectableTablesList.clear();
             selectableTablesList.addAll(tables);
             excludedTables.clear();
-        }
-        else {
+        } else {
             excludedTables.clear();
             for (DbEntity table : tables) {
                 excludedTables.put(table.getName(), table);
@@ -242,6 +188,7 @@ public class TableSelectorController extends 
CayenneController {
             selectableTablesList.clear();
         }
 
-        tableBinding.updateView();
+        tableModel.fireTableDataChanged();
     }
+
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
index 4f676f770..785b97c51 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
@@ -19,27 +19,19 @@
 
 package org.apache.cayenne.modeler.dialog.db.gen;
 
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
 import com.jgoodies.forms.builder.PanelBuilder;
 import com.jgoodies.forms.layout.CellConstraints;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.util.CayenneTable;
 
-/**
- */
+import javax.swing.*;
+import java.awt.*;
+
 public class TableSelectorView extends JPanel {
 
-    protected JTable tables;
-    protected JCheckBox checkAll;
-    protected JLabel checkAllLabel;
+    private final JTable tables;
+    private final JCheckBox checkAll;
+    private final JLabel checkAllLabel;
 
     public TableSelectorView() {
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
index 792493b59..599c8746a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
@@ -25,7 +25,6 @@ import 
org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.ModelerUtil;
-import org.apache.cayenne.swing.ObjectBinding;
 
 import javax.swing.DefaultCellEditor;
 import javax.swing.JComboBox;
@@ -47,7 +46,6 @@ import java.util.Set;
 public class MergerTokenSelectorController extends CayenneController {
 
     protected MergerTokenSelectorView view;
-    protected ObjectBinding tableBinding;
 
     protected MergerToken token;
     protected int permanentlyExcludedCount;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenArtefactSelectorController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenArtefactSelectorController.java
index f683c911b..fb4dac618 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenArtefactSelectorController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenArtefactSelectorController.java
@@ -27,17 +27,15 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.modeler.util.CheckBoxHeader;
 import org.apache.cayenne.modeler.util.ModelerUtil;
-import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.modeler.util.TableSizer;
 import org.apache.cayenne.swing.ImageRendererColumn;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.swing.TableBindingBuilder;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.Icon;
-import javax.swing.JLabel;
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
 import javax.swing.table.TableColumnModel;
-import java.awt.Component;
+import java.awt.*;
 import java.util.Collection;
 import java.util.List;
 
@@ -47,17 +45,19 @@ import java.util.List;
 public class CgenArtefactSelectorController extends CayenneController {
 
     private static final Icon ERROR_ICON = 
ModelerUtil.buildIcon("icon-error.png");
+
+    private static final String[] COLUMN_HEADERS = {"", "  Class", ""};
+    private static final Class<?>[] COLUMN_CLASSES = {Boolean.class, 
JLabel.class, String.class};
+
     protected CgenArtefactSelectorPanel view;
-    protected ObjectBinding tableBinding;
+    protected AbstractTableModel tableModel;
     private ValidationResult lastValidationResult;
-    private final BindingBuilder builder;
     private final CheckBoxHeader checkBoxHeader;
 
     public CgenArtefactSelectorController(CgenController parent) {
         super(parent);
         this.checkBoxHeader = new CheckBoxHeader();
         this.view = new CgenArtefactSelectorPanel();
-        this.builder = new 
BindingBuilder(getApplication().getBindingFactory(), this);
     }
 
     public void startup() {
@@ -75,43 +75,43 @@ public class CgenArtefactSelectorController extends 
CayenneController {
 
     protected void initBindings() {
         checkBoxHeader.addActionListener(e -> checkAllAction());
-        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-
-        tableBuilder.addColumn(
-                "",
-                "parent.setCurrentClass(#item), selected",
-                Boolean.class,
-                true,
-                Boolean.TRUE);
-
-        tableBuilder.addColumn(
-                "  Class",
-                "getItemName(#item)",
-                JLabel.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXX");
-
-        tableBuilder.addColumn(
-                "",
-                "getProblem(#item)",
-                String.class,
-                false,
-                "XX");
-
-        this.tableBinding = tableBuilder.bindToTable(view.getTable(), 
"parent.classes");
+
+        tableModel = new AbstractTableModel() {
+            public int getRowCount() {
+                return getParentController().getClasses().size();
+            }
+            public int getColumnCount() { return COLUMN_HEADERS.length; }
+            public String getColumnName(int col) { return COLUMN_HEADERS[col]; 
}
+            public Class<?> getColumnClass(int col) { return 
COLUMN_CLASSES[col]; }
+            public boolean isCellEditable(int row, int col) { return col == 0; 
}
+
+            public Object getValueAt(int row, int col) {
+                Object item = getItem(row);
+                if (col == 0) return getParentController().isSelected(item);
+                if (col == 1) return getItemName(item);
+                return getProblem(item);
+            }
+
+            public void setValueAt(Object value, int row, int col) {
+                if (col == 0) {
+                    getParentController().setSelected(getItem(row), (Boolean) 
value);
+                    classSelectedAction();
+                }
+            }
+
+            private Object getItem(int row) {
+                return getParentController().getClasses().toArray()[row];
+            }
+        };
+
+        view.getTable().setModel(tableModel);
+
         TableColumnModel columnModel = view.getTable().getColumnModel();
         columnModel.getColumn(0).setHeaderRenderer(checkBoxHeader);
         columnModel.getColumn(1).setCellRenderer(new ImageRendererColumn());
         columnModel.getColumn(2).setCellRenderer(new ImageRendererColumn());
-    }
 
-    public boolean isSelected() {
-        return getParentController().isSelected();
-    }
-
-    public void setSelected(boolean selected) {
-        getParentController().setSelected(selected);
-        classSelectedAction();
+        TableSizer.sizeColumns(view.getTable(), Boolean.TRUE, 
"XXXXXXXXXXXXXXXXXXXXXXXXXX", "XX");
     }
 
     /**
@@ -129,14 +129,9 @@ public class CgenArtefactSelectorController extends 
CayenneController {
         view.repaint();
     }
 
-
-    /**
-     * An action that updates entity check boxes in response to the Select All 
state
-     * change.
-     */
     public void checkAllAction() {
         if (getParentController().updateSelection(checkBoxHeader.isSelected() 
? o -> true : o -> false)) {
-            tableBinding.updateView();
+            tableModel.fireTableDataChanged();
             getParentController().updateSelectedEntities();
             getParentController().updateGenerateButton();
             
getParentController().getStandardModeController().updateTemplateEditorButtons();
@@ -148,10 +143,6 @@ public class CgenArtefactSelectorController extends 
CayenneController {
         this.lastValidationResult = validator.getValidationResult(classes);
     }
 
-    /**
-     * Returns the first encountered validation problem for an antity matching 
the name or
-     * null if the entity is valid or the entity is not present.
-     */
     public JLabel getProblem(Object obj) {
         String name = null;
         if (obj instanceof ObjEntity) {
@@ -177,14 +168,13 @@ public class CgenArtefactSelectorController extends 
CayenneController {
         return labelIcon;
     }
 
-    @SuppressWarnings("unused")
     public JLabel getItemName(Object obj) {
         String className;
         Icon icon;
         if (obj instanceof Embeddable) {
             className = ((Embeddable) obj).getClassName();
             icon = CellRenderers.iconForObject(new Embeddable());
-        } else if(obj instanceof ObjEntity) {
+        } else if (obj instanceof ObjEntity) {
             className = ((ObjEntity) obj).getName();
             icon = CellRenderers.iconForObject(new ObjEntity());
         } else {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenController.java
index b8a3216ea..2b6146c1e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CgenController.java
@@ -336,6 +336,10 @@ public class CgenController extends CayenneController 
implements ObjEntityListen
         return selectionModel.isSelected(currentClass);
     }
 
+    public boolean isSelected(Object item) {
+        return selectionModel.isSelected(item);
+    }
+
     public void setSelected(boolean selectedFlag) {
         if (currentClass instanceof DataMap) {
             updateArtifactGenerationMode(selectedFlag);
@@ -343,6 +347,13 @@ public class CgenController extends CayenneController 
implements ObjEntityListen
         selectionModel.setSelected(currentClass, selectedFlag);
     }
 
+    public void setSelected(Object item, boolean selectedFlag) {
+        if (item instanceof DataMap) {
+            updateArtifactGenerationMode(selectedFlag);
+        }
+        selectionModel.setSelected(item, selectedFlag);
+    }
+
     public void setCurrentClass(Object currentClass) {
         this.currentClass = currentClass;
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableSizer.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableSizer.java
new file mode 100644
index 000000000..da712cda2
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableSizer.java
@@ -0,0 +1,62 @@
+/*****************************************************************
+ *   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.modeler.util;
+
+import javax.swing.*;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+import java.awt.*;
+
+/**
+ * Utility for sizing JTable columns based on sample values.
+ *
+ * @since 5.0
+ */
+public final class TableSizer {
+
+    private TableSizer() {
+    }
+
+    /**
+     * Sets the preferred width of each column to fit either its header label 
or the
+     * rendered width of the corresponding sample value, whichever is wider.
+     * Pass {@code null} for any column whose width should only be sized to 
its header.
+     *
+     * @param table        the table whose columns to resize
+     * @param sampleValues one sample value per column; may be shorter than 
the column count
+     */
+    public static void sizeColumns(JTable table, Object... sampleValues) {
+        TableCellRenderer headerRenderer = 
table.getTableHeader().getDefaultRenderer();
+        TableColumnModel columnModel = table.getColumnModel();
+        for (int i = 0; i < columnModel.getColumnCount(); i++) {
+            TableColumn column = columnModel.getColumn(i);
+            Component header = headerRenderer.getTableCellRendererComponent(
+                    null, column.getHeaderValue(), false, false, 0, 0);
+            int width = header.getPreferredSize().width;
+            if (i < sampleValues.length && sampleValues[i] != null) {
+                Component cell = 
table.getDefaultRenderer(table.getModel().getColumnClass(i))
+                        .getTableCellRendererComponent(table, sampleValues[i], 
false, false, 0, i);
+                width = Math.max(width, cell.getPreferredSize().width);
+            }
+            column.setPreferredWidth(width);
+        }
+    }
+}

Reply via email to