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