This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new 0ae0d771c CAY-3000 Modeler: unifying the main views of all model
objects
0ae0d771c is described below
commit 0ae0d771c470f40bc37fcd68fa4e47462bc67ff3
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sat Aug 29 15:49:16 2026 -0400
CAY-3000 Modeler: unifying the main views of all model objects
---
RELEASE-NOTES.txt | 1 +
.../modeler/ui/project/editor/EditorForm.java | 103 +++++++++++++++++++++
.../modeler/ui/project/editor/EditorPanelView.java | 4 +-
.../editor/datadomain/DataDomainGeneratorsTab.java | 2 +-
.../project/editor/datadomain/DataDomainView.java | 2 +-
.../editor/datadomain/main/DataDomainMainView.java | 19 ++--
.../editor/datamap/main/DataMapMainView.java | 19 ++--
.../editor/dbentity/main/DbEntityMainView.java | 47 ++++++++--
.../main/PKCustomSequenceGeneratorPanel.java | 5 +-
.../editor/dbentity/main/PKDBGeneratorPanel.java | 7 +-
.../dbentity/main/PKDefaultGeneratorPanel.java | 5 +
.../editor/embeddable/main/EmbeddableMainView.java | 9 +-
.../editor/objentity/main/ObjEntityMainView.java | 17 ++--
.../ProcedureQueryTabbedView.java} | 26 +++---
.../editor/procedure/ProcedureQueryView.java | 42 ++++++---
.../ui/project/editor/procedure/ProcedureTab.java | 11 ++-
.../editor/query/ObjectQueryPropertiesPanel.java | 32 +++----
.../editor/query/RawQueryPropertiesPanel.java | 34 +++----
.../editor/query/SelectPropertiesPanel.java | 8 +-
.../editor/query/ejbql/EjbqlQueryMainTab.java | 37 +++++---
.../query/ejbql/EjbqlQueryPropertiesPanel.java | 28 +++---
.../editor/query/ejbql/EjbqlTabbedView.java | 4 +-
.../query/selectquery/SelectQueryMainTab.java | 50 ++++++----
.../query/selectquery/SelectQueryTabbedView.java | 2 +-
.../query/sqltemplate/SQLTemplateMainTab.java | 43 ++++++---
.../query/sqltemplate/SQLTemplateTabbedView.java | 2 +-
.../ui/project/querytype/QueryTypeDialog.java | 8 +-
27 files changed, 386 insertions(+), 181 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 0810d989c..6a42f675b 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -14,6 +14,7 @@ Date:
Changes/New Features:
CAY-2998 Modeler: clickabe "Target" column to navigate relationships
+CAY-3000 Modeler: unifying the main views of all model objects
----------------------------------
Release: 5.0-M3
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorForm.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorForm.java
new file mode 100644
index 000000000..1362696cf
--- /dev/null
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorForm.java
@@ -0,0 +1,103 @@
+/*****************************************************************
+ * 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.ui.project.editor;
+
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.layout.ConstantSize;
+import com.jgoodies.forms.layout.Sizes;
+import com.jgoodies.forms.util.LayoutStyle;
+import org.apache.cayenne.modeler.toolkit.AppAction;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JToolBar;
+import javax.swing.border.Border;
+import java.awt.image.BufferedImage;
+
+/**
+ * Shared measurements of the editor forms: the column the labels line up in,
the borders that let a
+ * form span more than one panel, and the spacer that lines up an editor
without a toolbar with the
+ * editors that have one. Used by the editor main views and by the panels
nested in their forms.
+ */
+public final class EditorForm {
+
+ /**
+ * Label column of the editor forms. Pinned to a fixed width instead of
"pref", so that labels line
+ * up across editors and in the panels nested in them. Just wide enough
for the longest label in
+ * any of the forms, which is the DataMap editor's "Default Java Package:".
+ */
+ public static final String LABEL_COLUMN = "right:67dlu";
+
+ private EditorForm() {
+ }
+
+ /**
+ * An empty stand-in for the toolbar of the editors that have one, so that
a form in an editor
+ * without a toolbar still starts at the same height on the screen.
+ */
+ public static JToolBar toolBarSpacer() {
+ // toolbar icons are 16x16, and it is the button around one that sets
the toolbar height
+ JButton probe = new AppAction.CayenneToolbarButton(null, 0);
+ probe.setIcon(new ImageIcon(new BufferedImage(16, 16,
BufferedImage.TYPE_INT_ARGB)));
+
+ JToolBar toolBar = new JToolBar();
+ toolBar.setBorder(BorderFactory.createEmptyBorder());
+ toolBar.setFloatable(false);
+ toolBar.add(Box.createVerticalStrut(probe.getPreferredSize().height));
+ return toolBar;
+ }
+
+ /**
+ * Border of a form panel that another section of the same form follows:
the standard dialog
+ * border without the bottom margin, which is left to the section below.
+ */
+ public static Border formBorder() {
+ return border(LayoutStyle.getCurrent().getDialogMarginY(), Sizes.ZERO);
+ }
+
+ /**
+ * Border of a form section that continues the panel above it: dialog side
margins, so that the
+ * labels line up, the form row gap on top, so that the rows read as one
list across the panel
+ * boundary, and no bottom margin, as another section may follow.
+ */
+ public static Border sectionBorder() {
+ return border(LayoutStyle.getCurrent().getLinePad(), Sizes.ZERO);
+ }
+
+ /**
+ * Border of the section that closes a form: like {@link
#sectionBorder()}, plus the dialog
+ * bottom margin.
+ */
+ public static Border lastSectionBorder() {
+ return border(LayoutStyle.getCurrent().getLinePad(),
LayoutStyle.getCurrent().getDialogMarginY());
+ }
+
+ /**
+ * Assembles a form border out of dialog units. The sizes are resolved by
the border itself, once
+ * it knows the component it applies to, as the same amount in dialog
units is a different number
+ * of pixels depending on the component font.
+ */
+ private static Border border(ConstantSize top, ConstantSize bottom) {
+ ConstantSize sides = LayoutStyle.getCurrent().getDialogMarginX();
+ return Borders.createEmptyBorder(top, sides, bottom, sides);
+ }
+}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java
index fe8776b87..acfb438f9 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java
@@ -28,7 +28,7 @@ import
org.apache.cayenne.modeler.ui.project.editor.datamap.DataMapView;
import org.apache.cayenne.modeler.ui.project.editor.dbentity.DbEntityView;
import org.apache.cayenne.modeler.ui.project.editor.embeddable.EmbeddableView;
import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjEntityView;
-import
org.apache.cayenne.modeler.ui.project.editor.procedure.ProcedureQueryView;
+import
org.apache.cayenne.modeler.ui.project.editor.procedure.ProcedureQueryTabbedView;
import
org.apache.cayenne.modeler.ui.project.editor.procedure.ProcedureTabbedView;
import
org.apache.cayenne.modeler.ui.project.editor.query.ejbql.EjbqlTabbedView;
import
org.apache.cayenne.modeler.ui.project.editor.query.selectquery.SelectQueryTabbedView;
@@ -94,7 +94,7 @@ public class EditorPanelView extends ProjectPanel {
add(procedureView, PROCEDURE_VIEW);
add(new SelectQueryTabbedView(session), SELECT_QUERY_VIEW);
add(sqlTemplateView, SQL_TEMPLATE_VIEW);
- add(new JScrollPane(new ProcedureQueryView(session)),
PROCEDURE_QUERY_VIEW);
+ add(new ProcedureQueryTabbedView(session), PROCEDURE_QUERY_VIEW);
add(ejbqlQueryView, EJBQL_QUERY_VIEW);
add(embeddableView, EMBEDDABLE_VIEW);
add(objDetailView, OBJ_VIEW);
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainGeneratorsTab.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainGeneratorsTab.java
index b468c0a40..85ef542e6 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainGeneratorsTab.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainGeneratorsTab.java
@@ -91,7 +91,7 @@ public abstract class DataDomainGeneratorsTab<T> extends
ProjectPanel implements
builder.setDefaultDialogBorder();
if (generatorsPanels.isEmpty()) {
- this.add(new JLabel("There are no datamaps."), BorderLayout.NORTH);
+ this.add(new JLabel("There are no datamaps.",
SwingConstants.CENTER), BorderLayout.CENTER);
return;
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
index 9df940669..739f68140 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
@@ -53,7 +53,7 @@ public class DataDomainView extends ProjectTabbedPane {
private void initLayout() {
setTabPlacement(JTabbedPane.TOP);
- addTab("Main", new JScrollPane(new DataDomainMainView(session)));
+ addTab("Data Domain", new JScrollPane(new
DataDomainMainView(session)));
addTab("Db Import", dbImportView);
addTab("Class Generation", cgenView);
addTab("Validation", validationTab);
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/main/DataDomainMainView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/main/DataDomainMainView.java
index 5f9958727..364346d22 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/main/DataDomainMainView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/main/DataDomainMainView.java
@@ -31,6 +31,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
import org.apache.cayenne.modeler.toolkit.ProjectPanel;
import org.apache.cayenne.modeler.toolkit.checkbox.CMCheckBox;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.validation.ValidationException;
import javax.swing.*;
@@ -69,23 +70,23 @@ public class DataDomainMainView extends ProjectPanel
implements DomainDisplayLis
// assemble
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:pref, $lcgap, fill:50dlu, $lcgap, fill:47dlu, $lcgap,
fill:100",
- "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap,
p, $rgap, p");
+ EditorForm.LABEL_COLUMN + ", $lcgap, fill:50dlu, $lcgap,
fill:47dlu, $lcgap, fill:100",
+ "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap,
p");
PanelBuilder builder = new PanelBuilder(layout);
builder.setDefaultDialogBorder();
- builder.addSeparator("DataDomain Configuration", cc.xywh(1, 1, 7, 1));
- builder.addLabel("Name:", cc.xy(1, 3));
- builder.add(name, cc.xywh(3, 3, 5, 1));
+ builder.addLabel("Name:", cc.xy(1, 1));
+ builder.add(name, cc.xywh(3, 1, 5, 1));
- builder.addLabel("Object Validation:", cc.xy(1, 5));
- builder.add(objectValidation, cc.xy(3, 5));
+ builder.addLabel("Object Validation:", cc.xy(1, 3));
+ builder.add(objectValidation, cc.xy(3, 3));
- builder.addLabel("Use Shared Cache:", cc.xy(1, 7));
- builder.add(sharedCache, cc.xy(3, 7));
+ builder.addLabel("Shared Cache:", cc.xy(1, 5));
+ builder.add(sharedCache, cc.xy(3, 5));
this.setLayout(new BorderLayout());
+ this.add(EditorForm.toolBarSpacer(), BorderLayout.NORTH);
this.add(builder.getPanel(), BorderLayout.CENTER);
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
index 26aef0a1d..92c9c7351 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
@@ -30,6 +30,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
import org.apache.cayenne.modeler.toolkit.ProjectPanel;
import org.apache.cayenne.modeler.toolkit.checkbox.CMCheckBox;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import
org.apache.cayenne.modeler.ui.project.editor.datamap.main.catalog.CatalogUpdateDialog;
import
org.apache.cayenne.modeler.ui.project.editor.datamap.main.locking.LockingUpdateDialog;
import
org.apache.cayenne.modeler.ui.project.editor.datamap.main.pkg.PackageUpdateDialog;
@@ -85,24 +86,22 @@ public class DataMapMainView extends ProjectPanel {
private void initLayout() {
FormLayout layout = new FormLayout(
- "right:70dlu, $lcgap, fill:180dlu, $lcgap, fill:120",
+ EditorForm.LABEL_COLUMN + ", $lcgap, fill:180dlu, $lcgap,
fill:120",
"");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
- builder.appendSeparator("DataMap Configuration");
builder.append("Name:", name, 2);
- builder.append("Quote SQL Identifiers:", quoteSQLIdentifiers, 3);
+ builder.append("SQL Quotes:", quoteSQLIdentifiers, 3);
+ builder.append("Default Catalog:", defaultCatalog,
updateDefaultCatalog);
+ builder.append("Default Schema:", defaultSchema, updateDefaultSchema);
+ builder.append("Default Java Package:", defaultPackage,
updateDefaultPackage);
+ builder.append("Default Superclass:", defaultSuperclass,
updateDefaultSuperclass);
+ builder.append("Lock by Default:", defaultLockType,
updateDefaultLockType);
builder.append("Comment:", comment, 2);
- builder.appendSeparator("Entity Defaults");
- builder.append("DB Catalog:", defaultCatalog, updateDefaultCatalog);
- builder.append("DB Schema:", defaultSchema, updateDefaultSchema);
- builder.append("Java Package:", defaultPackage, updateDefaultPackage);
- builder.append("Custom Superclass:", defaultSuperclass,
updateDefaultSuperclass);
- builder.append("Optimistic Locking:", defaultLockType,
updateDefaultLockType);
-
setLayout(new BorderLayout());
+ add(EditorForm.toolBarSpacer(), BorderLayout.NORTH);
add(builder.getPanel(), BorderLayout.CENTER);
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
index 8deea13ad..280d7f080 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
@@ -36,6 +36,7 @@ import
org.apache.cayenne.modeler.ui.action.CreateObjEntityFromDbAction;
import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
import org.apache.cayenne.modeler.ui.action.DbEntityCounterpartAction;
import org.apache.cayenne.modeler.ui.action.DbEntitySyncAction;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
import
org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
import org.apache.cayenne.project.extension.info.ObjectInfo;
@@ -81,7 +82,20 @@ public class DbEntityMainView extends ProjectPanel
implements ExistingSelectionP
comment = new CMUndoableTextField(app.getUndoManager());
pkGeneratorType = new JComboBox<>();
pkGeneratorDetailLayout = new CardLayout();
- pkGeneratorDetail = new JPanel(pkGeneratorDetailLayout);
+
+ // unlike a plain CardLayout panel, this one takes the height of the
visible card only, so that
+ // the comment row below it follows the PK fields instead of leaving a
gap under the short cards
+ pkGeneratorDetail = new JPanel(pkGeneratorDetailLayout) {
+ @Override
+ public Dimension getPreferredSize() {
+ for (Component card : getComponents()) {
+ if (card.isVisible()) {
+ return card.getPreferredSize();
+ }
+ }
+ return super.getPreferredSize();
+ }
+ };
initLayout();
initBindings();
}
@@ -103,27 +117,40 @@ public class DbEntityMainView extends ProjectPanel
implements ExistingSelectionP
pkGeneratorDetail.add(new PKDBGeneratorPanel(session),
PK_DB_GENERATOR);
pkGeneratorDetail.add(new PKCustomSequenceGeneratorPanel(session),
PK_CUSTOM_SEQUENCE_GENERATOR);
- FormLayout layout = new FormLayout("right:pref, $lcgap, fill:200dlu",
"");
+ FormLayout layout = new FormLayout(EditorForm.LABEL_COLUMN + ",
$lcgap, fill:200dlu", "");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
- builder.setDefaultDialogBorder();
- builder.appendSeparator("DbEntity Configuration");
+ builder.setBorder(EditorForm.formBorder());
builder.append("Name:", name);
builder.append(catalogLabel, catalog);
builder.append(schemaLabel, schema);
builder.append("Qualifier:", qualifier);
- builder.append("Comment:", comment);
- builder.appendSeparator("Primary Key");
- builder.append("PK Generation Strategy:", pkGeneratorType);
+ builder.append("PK Strategy:", pkGeneratorType);
+
+ // the comment goes last, below the PK generator panel, which varies
with the selected strategy
+ DefaultFormBuilder commentBuilder = new DefaultFormBuilder(
+ new FormLayout(EditorForm.LABEL_COLUMN + ", $lcgap,
fill:200dlu", ""));
+ commentBuilder.setBorder(EditorForm.lastSectionBorder());
+ commentBuilder.append("Comment:", comment);
+
+ JPanel pkAndComment = new JPanel(new BorderLayout());
+ pkAndComment.add(pkGeneratorDetail, BorderLayout.NORTH);
+ pkAndComment.add(commentBuilder.getPanel(), BorderLayout.CENTER);
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(builder.getPanel(), BorderLayout.NORTH);
- mainPanel.add(pkGeneratorDetail, BorderLayout.CENTER);
+ mainPanel.add(pkAndComment, BorderLayout.CENTER);
setLayout(new BorderLayout());
add(toolBar, BorderLayout.NORTH);
add(mainPanel, BorderLayout.CENTER);
}
+ private void showPKGeneratorDetail(String type) {
+ pkGeneratorDetailLayout.show(pkGeneratorDetail, type);
+ // cards differ in height, so the panels below have to be laid out
again
+ pkGeneratorDetail.revalidate();
+ }
+
private void initBindings() {
name.addCommitListener(this::setEntityName);
catalog.addCommitListener(this::setCatalog);
@@ -132,7 +159,7 @@ public class DbEntityMainView extends ProjectPanel
implements ExistingSelectionP
comment.addCommitListener(this::setComment);
session.addDbEntityDisplayListener(this);
pkGeneratorType.addItemListener(e -> {
- pkGeneratorDetailLayout.show(pkGeneratorDetail, (String)
pkGeneratorType.getSelectedItem());
+ showPKGeneratorDetail((String) pkGeneratorType.getSelectedItem());
for (int i = 0; i < pkGeneratorDetail.getComponentCount(); i++) {
if (pkGeneratorDetail.getComponent(i).isVisible()) {
DbEntity entity = session.getSelectedDbEntity();
@@ -192,7 +219,7 @@ public class DbEntityMainView extends ProjectPanel
implements ExistingSelectionP
pkGeneratorType.setVisible(true);
pkGeneratorType.setSelectedItem(type);
- pkGeneratorDetailLayout.show(pkGeneratorDetail, type);
+ showPKGeneratorDetail(type);
if(entity.getDataMap().getMappedEntities(entity).isEmpty()) {
toolBar.getComponentAtIndex(4).setEnabled(false);
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
index f34099f57..c4dbb5130 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
@@ -27,6 +27,7 @@ import org.apache.cayenne.modeler.event.model.DbEntityEvent;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
import org.apache.cayenne.modeler.project.ProjectSession;
import java.util.Objects;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.validation.ValidationException;
import javax.swing.*;
@@ -56,10 +57,10 @@ public class PKCustomSequenceGeneratorPanel extends
PKGeneratorPanel {
// assemble
DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout(
- "right:70dlu, $lcgap, 20dlu, $lcgap, fill:177dlu",
+ EditorForm.LABEL_COLUMN + ", $lcgap, 20dlu, $lcgap,
fill:177dlu",
""));
- builder.setDefaultDialogBorder();
+ builder.setBorder(EditorForm.sectionBorder());
builder.append("Sequence Name:", customPKName, 3);
builder.append("Cached PK Size:", customPKSize);
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDBGeneratorPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDBGeneratorPanel.java
index a58e662c3..15ecefae8 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDBGeneratorPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDBGeneratorPanel.java
@@ -26,6 +26,7 @@ import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.modeler.event.model.DbEntityEvent;
import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
@@ -49,10 +50,10 @@ public class PKDBGeneratorPanel extends PKGeneratorPanel {
attributes.setRenderer(new AttributeRenderer());
DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout(
- "right:70dlu, $lcgap, fill:200dlu",
+ EditorForm.LABEL_COLUMN + ", $lcgap, fill:200dlu",
""));
- builder.setDefaultDialogBorder();
- builder.append("Auto Incremented:", attributes);
+ builder.setBorder(EditorForm.sectionBorder());
+ builder.append("Auto Increment:", attributes);
setLayout(new BorderLayout());
add(builder.getPanel(), BorderLayout.CENTER);
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
index d350ee91d..cb93f0664 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
@@ -22,10 +22,15 @@ package
org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.modeler.project.ProjectSession;
+import java.awt.Dimension;
+
public class PKDefaultGeneratorPanel extends PKGeneratorPanel {
public PKDefaultGeneratorPanel(ProjectSession session) {
super(session);
+
+ // nothing to show for the default strategy, so the panel must not
take up any space either
+ setPreferredSize(new Dimension(0, 0));
}
public void setDbEntity(DbEntity entity) {
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
index 37cb4df59..f6fe53631 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
@@ -35,6 +35,7 @@ import
org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
import org.apache.cayenne.modeler.event.display.EmbeddableDisplayListener;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
import org.apache.cayenne.modeler.project.ProjectComparators;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.project.extension.info.ObjectInfo;
import java.util.Objects;
import org.apache.cayenne.validation.ValidationException;
@@ -76,13 +77,11 @@ public class EmbeddableMainView extends ProjectPanel
implements EmbeddableDispla
comment = new CMUndoableTextField(app.getUndoManager());
comment.addCommitListener(this::setComment);
- FormLayout layout = new FormLayout(
- "right:50dlu, $lcgap, fill:150dlu, $lcgap, fill:100",
- "");
+ FormLayout layout = new FormLayout(EditorForm.LABEL_COLUMN + ",
$lcgap, fill:200dlu", "");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
- builder.append("Class Name:", className, 3);
- builder.append("Comment:", comment, 3);
+ builder.append("Java Class:", className);
+ builder.append("Comment:", comment);
add(builder.getPanel(), BorderLayout.CENTER);
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index feee3bc60..2dbf64881 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -44,6 +44,7 @@ import
org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
import org.apache.cayenne.modeler.ui.action.ObjEntityCounterpartAction;
import org.apache.cayenne.modeler.ui.action.ObjEntitySyncAction;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
import
org.apache.cayenne.modeler.ui.project.editor.objentity.classname.ClassNameUpdaterController;
import
org.apache.cayenne.modeler.ui.project.editor.objentity.duplicates.DuplicatedAttributesDialog;
@@ -117,21 +118,25 @@ public class ObjEntityMainView extends ProjectPanel
implements ObjEntityDisplayL
tableLabel.setMargin(new Insets(0, 0, 0, 0));
tableLabel.setBorder(null);
- FormLayout layout = new FormLayout("right:pref, $lcgap, fill:200dlu",
"");
+ FormLayout layout = new FormLayout(EditorForm.LABEL_COLUMN + ",
$lcgap, fill:200dlu", "");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
- builder.appendSeparator("ObjEntity Configuration");
+ JPanel flags = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0));
+ flags.add(readOnly);
+ flags.add(Box.createHorizontalStrut(20));
+ flags.add(new JLabel("Optimistic Locking:"));
+ flags.add(Box.createHorizontalStrut(6));
+ flags.add(optimisticLocking);
+
builder.append("Name:", name);
builder.append("Inheritance:", superEntityCombo);
builder.append(tableLabel, dbEntityCombo);
- builder.append("Comment:", comment);
- builder.appendSeparator();
builder.append("Java Class:", className);
superclassLabel = builder.append("Superclass:", superClassName);
builder.append("Qualifier:", qualifier);
- builder.append("Read-Only:", readOnly);
- builder.append("Optimistic Locking:", optimisticLocking);
+ builder.append("Read-Only:", flags);
+ builder.append("Comment:", comment);
add(builder.getPanel(), BorderLayout.CENTER);
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryTabbedView.java
similarity index 63%
copy from
cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
copy to
cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryTabbedView.java
index d350ee91d..c947d871e 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryTabbedView.java
@@ -16,23 +16,23 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
+package org.apache.cayenne.modeler.ui.project.editor.procedure;
-package org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
-
-import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.ProjectTabbedPane;
-public class PKDefaultGeneratorPanel extends PKGeneratorPanel {
-
- public PKDefaultGeneratorPanel(ProjectSession session) {
- super(session);
- }
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
- public void setDbEntity(DbEntity entity) {
- // noop
- }
+/**
+ * A single-tab container for the {@link ProcedureQueryView}, so that the
editor looks like the other
+ * query editors, which are tabbed.
+ */
+public class ProcedureQueryTabbedView extends ProjectTabbedPane {
- protected void onInitInternal(DbEntity entity) {
- resetStrategy(entity, true, true);
+ public ProcedureQueryTabbedView(ProjectSession session) {
+ super(session);
+ setTabPlacement(JTabbedPane.TOP);
+ addTab("ProcedureQuery", new JScrollPane(new
ProcedureQueryView(session)));
}
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
index 2363981aa..b2ce9e375 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
@@ -19,6 +19,7 @@
package org.apache.cayenne.modeler.ui.project.editor.procedure;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import
org.apache.cayenne.modeler.ui.project.editor.query.RawQueryPropertiesPanel;
import
org.apache.cayenne.modeler.ui.project.editor.query.SelectPropertiesPanel;
import com.jgoodies.forms.builder.PanelBuilder;
@@ -98,22 +99,35 @@ public class ProcedureQueryView extends ProjectPanel {
// assemble
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:max(80dlu;pref), $lcgap, fill:max(200dlu;pref)",
- "p, $rgap, p, $rgap, p, $rgap, p");
+ EditorForm.LABEL_COLUMN + ", $lcgap, fill:max(200dlu;pref)",
+ "p, $rgap, p");
PanelBuilder builder = new PanelBuilder(layout);
- builder.setDefaultDialogBorder();
+ builder.setBorder(EditorForm.formBorder());
- builder.addSeparator("ProcedureQuery Settings", cc.xywh(1, 1, 3, 1));
- builder.addLabel("Name:", cc.xy(1, 3));
- builder.add(name, cc.xy(3, 3));
- builder.addLabel("Procedure:", cc.xy(1, 5));
- builder.add(queryRoot, cc.xy(3, 5));
- builder.addLabel("Comment:", cc.xy(1, 7));
- builder.add(comment, cc.xy(3, 7));
+ builder.addLabel("Name:", cc.xy(1, 1));
+ builder.add(name, cc.xy(3, 1));
+ builder.addLabel("Procedure:", cc.xy(1, 3));
+ builder.add(queryRoot, cc.xy(3, 3));
+ // the comment closes the form, below the query properties
+ PanelBuilder commentBuilder = new PanelBuilder(
+ new FormLayout(EditorForm.LABEL_COLUMN + ", $lcgap,
fill:max(200dlu;pref)", "p"));
+ commentBuilder.setBorder(EditorForm.lastSectionBorder());
+ commentBuilder.addLabel("Comment:", cc.xy(1, 1));
+ commentBuilder.add(comment, cc.xy(3, 1));
+
+ JPanel propertiesAndComment = new JPanel(new BorderLayout());
+ propertiesAndComment.add(properties, BorderLayout.NORTH);
+ propertiesAndComment.add(commentBuilder.getPanel(),
BorderLayout.CENTER);
+
+ JPanel sections = new JPanel(new BorderLayout());
+ sections.add(builder.getPanel(), BorderLayout.NORTH);
+ sections.add(propertiesAndComment, BorderLayout.CENTER);
+
+ // no toolbar in this editor, but its form should still start where
the other editors' forms do
this.setLayout(new BorderLayout());
- this.add(builder.getPanel(), BorderLayout.NORTH);
- this.add(properties, BorderLayout.CENTER);
+ this.add(EditorForm.toolBarSpacer(), BorderLayout.NORTH);
+ this.add(sections, BorderLayout.CENTER);
}
private void initBindings() {
@@ -288,8 +302,8 @@ public class ProcedureQueryView extends ProjectPanel {
}
CellConstraints cc = new CellConstraints();
- builder.addLabel("Row Label Case:", cc.xy(1, 17));
- builder.add(labelCase, cc.xywh(3, 17, 5, 1));
+ builder.addLabel("Row Label Case:", cc.xy(1, 13));
+ builder.add(labelCase, cc.xywh(3, 13, 5, 1));
return builder;
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
index 0f7d9192e..6ce83a153 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
@@ -20,6 +20,7 @@
package org.apache.cayenne.modeler.ui.project.editor.procedure;
import org.apache.cayenne.modeler.toolkit.ProjectPanel;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import
org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
@@ -33,6 +34,7 @@ import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.MappingNamespace;
import org.apache.cayenne.modeler.event.model.ProcedureEvent;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
+import org.apache.cayenne.modeler.ui.action.CreateProcedureParameterAction;
import org.apache.cayenne.project.extension.info.ObjectInfo;
import org.apache.cayenne.modeler.toolkit.checkbox.CMCheckBox;
import java.util.Objects;
@@ -79,18 +81,23 @@ public class ProcedureTab extends ProjectPanel implements
ProcedureDisplayListen
this.returnsValue = new CMCheckBox(app.getUndoManager());
this.returnsValue.setToolTipText("first parameter will be used as
return value");
- FormLayout layout = new FormLayout("right:pref, $lcgap, fill:200dlu",
"");
+ FormLayout layout = new FormLayout(EditorForm.LABEL_COLUMN + ",
$lcgap, fill:200dlu", "");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
- builder.appendSeparator("Stored Procedure Configuration");
builder.append("Name:", name);
builder.append("Catalog:", catalog);
builder.append("Schema:", schema);
builder.append("Returns Value:", returnsValue);
builder.append("Comment:", comment);
+ JToolBar toolBar = new JToolBar();
+ toolBar.setBorder(BorderFactory.createEmptyBorder());
+ toolBar.setFloatable(false);
+
toolBar.add(app.getActionManager().getAction(CreateProcedureParameterAction.class).buildButton());
+
this.setLayout(new BorderLayout());
+ this.add(toolBar, BorderLayout.NORTH);
this.add(builder.getPanel(), BorderLayout.CENTER);
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
index 15da994ee..3bc6ccd85 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
@@ -26,6 +26,7 @@ import javax.swing.JCheckBox;
import org.apache.cayenne.modeler.toolkit.checkbox.CMCheckBox;
import org.apache.cayenne.modeler.project.ProjectSession;
import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.query.QueryMetadata;
import com.jgoodies.forms.builder.PanelBuilder;
@@ -53,23 +54,22 @@ public class ObjectQueryPropertiesPanel extends
SelectPropertiesPanel {
// assemble
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:max(80dlu;pref), $lcgap, left:max(50dlu;pref),
fill:max(150dlu;pref)",
- "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap,
p, $rgap, p, $rgap, p");
+ EditorForm.LABEL_COLUMN + ", $lcgap, left:max(50dlu;pref),
fill:max(150dlu;pref)",
+ "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p");
PanelBuilder builder = new PanelBuilder(layout);
- builder.setDefaultDialogBorder();
- builder.addSeparator("", cc.xywh(1, 1, 4, 1));
- builder.addLabel("Result Caching:", cc.xy(1, 3));
- builder.add(cacheStrategy, cc.xywh(3, 3, 2, 1));
- cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 7));
- builder.add(cacheGroups, cc.xywh(3, 7, 2, 1));
- builder.addLabel("Fetch Data Rows:", cc.xy(1, 9));
- builder.add(dataRows, cc.xy(3, 9));
- builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 11));
- builder.add(fetchOffset, cc.xy(3, 11));
- builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 13));
- builder.add(fetchLimit, cc.xy(3, 13));
- builder.addLabel("Page Size:", cc.xy(1, 15));
- builder.add(pageSize, cc.xy(3, 15));
+ builder.setBorder(EditorForm.sectionBorder());
+ builder.addLabel("Result Caching:", cc.xy(1, 1));
+ builder.add(cacheStrategy, cc.xywh(3, 1, 2, 1));
+ cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 3));
+ builder.add(cacheGroups, cc.xywh(3, 3, 2, 1));
+ builder.addLabel("Fetch Data Rows:", cc.xy(1, 5));
+ builder.add(dataRows, cc.xy(3, 5));
+ builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 7));
+ builder.add(fetchOffset, cc.xy(3, 7));
+ builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 9));
+ builder.add(fetchLimit, cc.xy(3, 9));
+ builder.addLabel("Page Size:", cc.xy(1, 11));
+ builder.add(pageSize, cc.xy(3, 11));
this.setLayout(new BorderLayout());
this.add(builder.getPanel(), BorderLayout.CENTER);
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
index 209af2c5f..eee5afd5c 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
@@ -39,6 +39,7 @@ import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.query.QueryMetadata;
/**
@@ -68,26 +69,25 @@ public abstract class RawQueryPropertiesPanel extends
SelectPropertiesPanel {
protected PanelBuilder createPanelBuilder() {
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:max(80dlu;pref), $lcgap, left:max(10dlu;pref), "
+ EditorForm.LABEL_COLUMN + ", $lcgap, left:max(10dlu;pref), "
+ "$lcgap, left:max(37dlu;pref), $lcgap,
fill:max(147dlu;pref)",
- "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap,
p, $rgap, p");
+ "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p");
PanelBuilder builder = new PanelBuilder(layout);
- builder.setDefaultDialogBorder();
- builder.addSeparator("Select Properties", cc.xywh(1, 1, 7, 1));
- builder.addLabel("Result Caching:", cc.xy(1, 3));
- builder.add(cacheStrategy, cc.xywh(3, 3, 5, 1));
- cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 7));
- builder.add(cacheGroups, cc.xywh(3, 7, 5, 1));
- builder.addLabel("Fetch Persistent Objects:", cc.xy(1, 9));
- builder.add(persistentObjects, cc.xy(3, 9));
- builder.add(entities, cc.xywh(5, 9, 3, 1));
- builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 11));
- builder.add(fetchOffset, cc.xywh(3, 11, 3, 1));
- builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 13));
- builder.add(fetchLimit, cc.xywh(3, 13, 3, 1));
- builder.addLabel("Page Size:", cc.xy(1, 15));
- builder.add(pageSize, cc.xywh(3, 15, 3, 1));
+ builder.setBorder(EditorForm.sectionBorder());
+ builder.addLabel("Result Caching:", cc.xy(1, 1));
+ builder.add(cacheStrategy, cc.xywh(3, 1, 5, 1));
+ cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 3));
+ builder.add(cacheGroups, cc.xywh(3, 3, 5, 1));
+ builder.addLabel("Fetch Objects:", cc.xy(1, 5));
+ builder.add(persistentObjects, cc.xy(3, 5));
+ builder.add(entities, cc.xywh(5, 5, 3, 1));
+ builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 7));
+ builder.add(fetchOffset, cc.xywh(3, 7, 3, 1));
+ builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 9));
+ builder.add(fetchLimit, cc.xywh(3, 9, 3, 1));
+ builder.addLabel("Page Size:", cc.xy(1, 11));
+ builder.add(pageSize, cc.xywh(3, 11, 3, 1));
return builder;
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
index 140f4a807..2e295a07a 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
@@ -29,9 +29,9 @@ import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JList;
-import javax.swing.JPanel;
import org.apache.cayenne.modeler.event.model.QueryEvent;
+import org.apache.cayenne.modeler.toolkit.ProjectPanel;
import org.apache.cayenne.modeler.toolkit.combobox.CMUndoableComboBox;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
import org.apache.cayenne.modeler.project.ProjectSession;
@@ -48,7 +48,7 @@ import org.slf4j.LoggerFactory;
* A panel that supports editing the properties of a GenericSelectQuery.
*
*/
-public abstract class SelectPropertiesPanel extends JPanel {
+public abstract class SelectPropertiesPanel extends ProjectPanel {
private static final Logger LOGGER =
LoggerFactory.getLogger(SelectPropertiesPanel.class);
@@ -79,10 +79,8 @@ public abstract class SelectPropertiesPanel extends JPanel {
protected CMUndoableTextField cacheGroups;
protected JComponent cacheGroupsLabel;
- protected ProjectSession session;
-
public SelectPropertiesPanel(ProjectSession session) {
- this.session = session;
+ super(session);
initView();
initController();
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
index bc1622f08..d9c88b99f 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
@@ -29,10 +29,12 @@ import org.apache.cayenne.modeler.event.model.QueryEvent;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
import org.apache.cayenne.modeler.toolkit.ProjectPanel;
import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.project.extension.info.ObjectInfo;
import java.util.Objects;
import org.apache.cayenne.validation.ValidationException;
+import javax.swing.JPanel;
import java.awt.BorderLayout;
@@ -59,19 +61,32 @@ public class EjbqlQueryMainTab extends ProjectPanel {
// assemble
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:max(80dlu;pref), $lcgap, fill:max(200dlu;pref)",
- "p, $rgap, p, $rgap, p");
+ EditorForm.LABEL_COLUMN + ", $lcgap, fill:max(200dlu;pref)",
+ "p");
PanelBuilder builder = new PanelBuilder(layout);
- builder.setDefaultDialogBorder();
- builder.addSeparator("EJBQL Query Settings", cc.xywh(1, 1, 3, 1));
- builder.addLabel("Name:", cc.xy(1, 3));
- builder.add(name, cc.xy(3, 3));
- builder.addLabel("Comment:", cc.xy(1, 5));
- builder.add(comment, cc.xy(3, 5));
-
+ builder.setBorder(EditorForm.formBorder());
+ builder.addLabel("Name:", cc.xy(1, 1));
+ builder.add(name, cc.xy(3, 1));
+
+ // the comment closes the form, below the query properties
+ PanelBuilder commentBuilder = new PanelBuilder(
+ new FormLayout(EditorForm.LABEL_COLUMN + ", $lcgap,
fill:max(200dlu;pref)", "p"));
+ commentBuilder.setBorder(EditorForm.lastSectionBorder());
+ commentBuilder.addLabel("Comment:", cc.xy(1, 1));
+ commentBuilder.add(comment, cc.xy(3, 1));
+
+ JPanel propertiesAndComment = new JPanel(new BorderLayout());
+ propertiesAndComment.add(properties, BorderLayout.NORTH);
+ propertiesAndComment.add(commentBuilder.getPanel(),
BorderLayout.CENTER);
+
+ JPanel sections = new JPanel(new BorderLayout());
+ sections.add(builder.getPanel(), BorderLayout.NORTH);
+ sections.add(propertiesAndComment, BorderLayout.CENTER);
+
+ // no toolbar in this editor, but its form should still start where
the other editors' forms do
this.setLayout(new BorderLayout());
- this.add(builder.getPanel(), BorderLayout.NORTH);
- this.add(properties, BorderLayout.CENTER);
+ this.add(EditorForm.toolBarSpacer(), BorderLayout.NORTH);
+ this.add(sections, BorderLayout.CENTER);
}
/**
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
index daeff60e8..a91f5ce79 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
@@ -18,6 +18,7 @@
****************************************************************/
package org.apache.cayenne.modeler.ui.project.editor.query.ejbql;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import
org.apache.cayenne.modeler.ui.project.editor.query.SelectPropertiesPanel;
import java.awt.BorderLayout;
@@ -37,23 +38,22 @@ public class EjbqlQueryPropertiesPanel extends
SelectPropertiesPanel {
protected PanelBuilder createPanelBuilder() {
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:max(80dlu;pref), $lcgap, left:max(10dlu;pref), "
+ EditorForm.LABEL_COLUMN + ", $lcgap, left:max(10dlu;pref), "
+ "$lcgap, left:max(37dlu;pref), $lcgap,
fill:max(147dlu;pref)",
- "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap,
p, $rgap, p");
+ "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p");
PanelBuilder builder = new PanelBuilder(layout);
- builder.setDefaultDialogBorder();
- builder.addSeparator("Select Properties", cc.xywh(1, 1, 7, 1));
- builder.addLabel("Result Caching:", cc.xy(1, 3));
- builder.add(cacheStrategy, cc.xywh(3, 3, 5, 1));
- cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 7));
- builder.add(cacheGroups, cc.xywh(3, 7, 5, 1));
- builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 9));
- builder.add(fetchOffset, cc.xywh(3, 9, 3, 1));
- builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 11));
- builder.add(fetchLimit, cc.xywh(3, 11, 3, 1));
- builder.addLabel("Page Size:", cc.xy(1, 13));
- builder.add(pageSize, cc.xywh(3, 13, 3, 1));
+ builder.setBorder(EditorForm.sectionBorder());
+ builder.addLabel("Result Caching:", cc.xy(1, 1));
+ builder.add(cacheStrategy, cc.xywh(3, 1, 5, 1));
+ cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 3));
+ builder.add(cacheGroups, cc.xywh(3, 3, 5, 1));
+ builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 5));
+ builder.add(fetchOffset, cc.xywh(3, 5, 3, 1));
+ builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 7));
+ builder.add(fetchLimit, cc.xywh(3, 7, 3, 1));
+ builder.addLabel("Page Size:", cc.xy(1, 9));
+ builder.add(pageSize, cc.xywh(3, 9, 3, 1));
return builder;
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
index d44424f21..13825fae7 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
@@ -42,8 +42,8 @@ public class EjbqlTabbedView extends ProjectTabbedPane {
private void initLayout() {
setTabPlacement(JTabbedPane.TOP);
- addTab("General", new JScrollPane(mainTab));
- addTab("EJBQL", scriptsTab);
+ addTab("EJBQLQuery", new JScrollPane(mainTab));
+ addTab("QL", scriptsTab);
}
private void initBindings() {
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
index f1dc03c92..2dec4af64 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
@@ -34,6 +34,7 @@ import org.apache.cayenne.modeler.event.model.QueryEvent;
import org.apache.cayenne.modeler.toolkit.checkbox.CMCheckBox;
import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
import org.apache.cayenne.modeler.ui.project.editor.query.BaseQueryMainTab;
import
org.apache.cayenne.modeler.ui.project.editor.query.ObjectQueryPropertiesPanel;
@@ -85,26 +86,39 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
// assemble
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:max(80dlu;pref), $lcgap, fill:200dlu",
- "p, $rgap, p, $rgap, p, $rgap, p, $rgap, p, $rgap, p");
+ EditorForm.LABEL_COLUMN + ", $lcgap, fill:200dlu",
+ "p, $rgap, p, $rgap, p, $rgap, p");
PanelBuilder builder = new PanelBuilder(layout);
- builder.setDefaultDialogBorder();
-
- builder.addSeparator("ObjectSelect Settings", cc.xywh(1, 1, 3, 1));
- builder.addLabel("Name:", cc.xy(1, 3));
- builder.add(name, cc.xy(3, 3));
- builder.addLabel("Root:", cc.xy(1, 5));
- builder.add(queryRoot, cc.xy(3, 5));
- builder.addLabel("Qualifier:", cc.xy(1, 7));
- builder.add(qualifier, cc.xy(3, 7));
- builder.addLabel("Distinct:", cc.xy(1, 9));
- builder.add(distinct, cc.xy(3, 9));
- builder.addLabel("Comment:", cc.xy(1, 11));
- builder.add(comment, cc.xy(3, 11));
-
+ builder.setBorder(EditorForm.formBorder());
+
+ builder.addLabel("Name:", cc.xy(1, 1));
+ builder.add(name, cc.xy(3, 1));
+ builder.addLabel("Root:", cc.xy(1, 3));
+ builder.add(queryRoot, cc.xy(3, 3));
+ builder.addLabel("Qualifier:", cc.xy(1, 5));
+ builder.add(qualifier, cc.xy(3, 5));
+ builder.addLabel("Distinct:", cc.xy(1, 7));
+ builder.add(distinct, cc.xy(3, 7));
+
+ // the comment closes the form, below the query properties
+ PanelBuilder commentBuilder = new PanelBuilder(
+ new FormLayout(EditorForm.LABEL_COLUMN + ", $lcgap,
fill:200dlu", "p"));
+ commentBuilder.setBorder(EditorForm.lastSectionBorder());
+ commentBuilder.addLabel("Comment:", cc.xy(1, 1));
+ commentBuilder.add(comment, cc.xy(3, 1));
+
+ JPanel propertiesAndComment = new JPanel(new BorderLayout());
+ propertiesAndComment.add(properties, BorderLayout.NORTH);
+ propertiesAndComment.add(commentBuilder.getPanel(),
BorderLayout.CENTER);
+
+ JPanel sections = new JPanel(new BorderLayout());
+ sections.add(builder.getPanel(), BorderLayout.NORTH);
+ sections.add(propertiesAndComment, BorderLayout.CENTER);
+
+ // no toolbar in this editor, but its form should still start where
the other editors' forms do
this.setLayout(new BorderLayout());
- this.add(builder.getPanel(), BorderLayout.NORTH);
- this.add(properties, BorderLayout.CENTER);
+ this.add(EditorForm.toolBarSpacer(), BorderLayout.NORTH);
+ this.add(sections, BorderLayout.CENTER);
}
private void initController() {
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
index 147afc680..f03013fae 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
@@ -44,7 +44,7 @@ public class SelectQueryTabbedView extends ProjectTabbedPane {
private void initLayout() {
setTabPlacement(JTabbedPane.TOP);
- addTab("General", new JScrollPane(mainTab));
+ addTab("ObjectSelect", new JScrollPane(mainTab));
addTab("Orderings", orderingTab);
addTab("Prefetches", prefetchTab);
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
index 03beca40a..db594fc44 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
@@ -19,6 +19,7 @@
package org.apache.cayenne.modeler.ui.project.editor.query.sqltemplate;
+import org.apache.cayenne.modeler.ui.project.editor.EditorForm;
import org.apache.cayenne.modeler.ui.project.editor.query.BaseQueryMainTab;
import
org.apache.cayenne.modeler.ui.project.editor.query.RawQueryPropertiesPanel;
import
org.apache.cayenne.modeler.ui.project.editor.query.SelectPropertiesPanel;
@@ -43,6 +44,7 @@ import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JList;
+import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.Arrays;
@@ -94,22 +96,35 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
// assemble
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
- "right:max(80dlu;pref), $lcgap, fill:max(200dlu;pref)",
- "p, $rgap, p, $rgap, p, $rgap, p");
+ EditorForm.LABEL_COLUMN + ", $lcgap, fill:max(200dlu;pref)",
+ "p, $rgap, p");
PanelBuilder builder = new PanelBuilder(layout);
- builder.setDefaultDialogBorder();
+ builder.setBorder(EditorForm.formBorder());
- builder.addSeparator("SQLTemplate Settings", cc.xywh(1, 1, 3, 1));
- builder.addLabel("Name:", cc.xy(1, 3));
- builder.add(name, cc.xy(3, 3));
- builder.addLabel("Root:", cc.xy(1, 5));
- builder.add(queryRoot, cc.xy(3, 5));
- builder.addLabel("Comment:", cc.xy(1, 7));
- builder.add(comment, cc.xy(3, 7));
+ builder.addLabel("Name:", cc.xy(1, 1));
+ builder.add(name, cc.xy(3, 1));
+ builder.addLabel("Root:", cc.xy(1, 3));
+ builder.add(queryRoot, cc.xy(3, 3));
+ // the comment closes the form, below the query properties
+ PanelBuilder commentBuilder = new PanelBuilder(
+ new FormLayout(EditorForm.LABEL_COLUMN + ", $lcgap,
fill:max(200dlu;pref)", "p"));
+ commentBuilder.setBorder(EditorForm.lastSectionBorder());
+ commentBuilder.addLabel("Comment:", cc.xy(1, 1));
+ commentBuilder.add(comment, cc.xy(3, 1));
+
+ JPanel propertiesAndComment = new JPanel(new BorderLayout());
+ propertiesAndComment.add(properties, BorderLayout.NORTH);
+ propertiesAndComment.add(commentBuilder.getPanel(),
BorderLayout.CENTER);
+
+ JPanel sections = new JPanel(new BorderLayout());
+ sections.add(builder.getPanel(), BorderLayout.NORTH);
+ sections.add(propertiesAndComment, BorderLayout.CENTER);
+
+ // no toolbar in this editor, but its form should still start where
the other editors' forms do
this.setLayout(new BorderLayout());
- this.add(builder.getPanel(), BorderLayout.NORTH);
- this.add(properties, BorderLayout.CENTER);
+ this.add(EditorForm.toolBarSpacer(), BorderLayout.NORTH);
+ this.add(sections, BorderLayout.CENTER);
}
/**
@@ -219,8 +234,8 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
}
CellConstraints cc = new CellConstraints();
- builder.addLabel("Row Label Case:", cc.xy(1, 17));
- builder.add(labelCase, cc.xywh(3, 17, 5, 1));
+ builder.addLabel("Row Label Case:", cc.xy(1, 13));
+ builder.add(labelCase, cc.xywh(3, 13, 5, 1));
return builder;
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
index 0d0bb40f3..f590d6003 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
@@ -45,7 +45,7 @@ public class SQLTemplateTabbedView extends ProjectTabbedPane {
private void initLayout() {
setTabPlacement(JTabbedPane.TOP);
- addTab("General", new JScrollPane(mainTab));
+ addTab("SQLTemplate", new JScrollPane(mainTab));
addTab("SQL Scripts", scriptsTab);
addTab("Prefetches", prefetchTab);
}
diff --git
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
index bca8b4ad7..1d50e20d4 100644
---
a/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
+++
b/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/querytype/QueryTypeDialog.java
@@ -59,10 +59,10 @@ public class QueryTypeDialog extends ProjectDialog {
this.dataMap = session.getSelectedDataMap();
this.domain = (DataChannelDescriptor) session.project().getRootNode();
- this.objectSelect = new JRadioButton("Object Select Query");
- this.sqlSelect = new JRadioButton("SQLTemplate Query");
- this.procedureSelect = new JRadioButton("Stored Procedure Query");
- this.ejbqlSelect = new JRadioButton("EJBQL Query");
+ this.objectSelect = new JRadioButton("ObjectSelect");
+ this.sqlSelect = new JRadioButton("SQLTemplate");
+ this.procedureSelect = new JRadioButton("ProcedureQuery");
+ this.ejbqlSelect = new JRadioButton("EJBQLQuery");
objectSelect.setSelected(true);
ButtonGroup buttonGroup = new ButtonGroup();