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

Reply via email to