You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2016/01/09 10:10:50 UTC

[4/5] isis git commit: ISIS-993: further refactoring, working towards factoring out EntityColumnMembers. However getting an exception when there are two tab groups (with the id/feedback... not sure why yet).

ISIS-993: further refactoring, working towards factoring out EntityColumnMembers.  However getting an exception when there are two tab groups (with the id/feedback... not sure why yet).


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/9ff3c29d
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/9ff3c29d
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/9ff3c29d

Branch: refs/heads/ISIS-993
Commit: 9ff3c29d8d5c03a9bb4c6d1d605222cca83731e6
Parents: cd82ef8
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sat Jan 9 09:07:21 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sat Jan 9 09:07:21 2016 +0000

----------------------------------------------------------------------
 .../apache/isis/applib/layout/v1_0/Column.java  |  24 ++++
 .../json/LayoutMetadataReaderFromJson.java      |  10 +-
 .../metamodel/spec/ObjectSpecifications.java    |  28 +---
 .../viewer/wicket/model/models/EntityModel.java |  19 ++-
 .../entity/properties/EntityColumnMembers.java  |  50 ++++++++
 .../entity/properties/EntityPropertiesForm.java | 128 ++++++++++---------
 .../components/entity/properties/PropUtil.java  |  25 +++-
 .../dom/simple/SimpleObject.layout.xml          |  10 +-
 8 files changed, 194 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java
index f208a7f..fc8ec6d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java
@@ -28,6 +28,8 @@ import javax.xml.bind.annotation.XmlType;
 
 import com.google.common.collect.Lists;
 
+import org.apache.isis.applib.annotation.MemberGroupLayout;
+
 @XmlType(
         propOrder = {
                 "propertyGroups"
@@ -101,5 +103,27 @@ public class Column implements Serializable {
         this.owner = owner;
     }
 
+    public enum Hint {
+        LEFT,
+        MIDDLE,
+        RIGHT;
+
+        public int from(MemberGroupLayout.ColumnSpans columnSpans) {
+            if(this == LEFT) return columnSpans.getLeft();
+            if(this == MIDDLE) return columnSpans.getMiddle();
+            if(this == RIGHT) return columnSpans.getRight();
+            throw new IllegalStateException();
+        }
+
+        public Column from(final Tab tab) {
+            if(tab == null) {
+                return null;
+            }
+            if(this == LEFT) return tab.getLeft();
+            if(this == MIDDLE) return tab.getMiddle();
+            if(this == RIGHT) return tab.getRight();
+            throw new IllegalStateException();
+        }
 
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index 215c202..0a29c6f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -81,7 +81,7 @@ import org.apache.isis.core.metamodel.layoutmetadata.TypicalLengthFacetRepr;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecifications;
-import org.apache.isis.core.metamodel.spec.ObjectSpecifications.MemberGroupLayoutHint;
+import org.apache.isis.applib.layout.v1_0.Column.Hint;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -462,13 +462,13 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader2 {
         ColumnRepr columnRepr;
         
         columnRepr = addColumnWithSpan(metadata, columnSpans.getLeft());
-        updateColumnMemberGroups(objectSpec, MemberGroupLayoutHint.LEFT, columnRepr, actionIdsForAssociations);
+        updateColumnMemberGroups(objectSpec, Hint.LEFT, columnRepr, actionIdsForAssociations);
         
         columnRepr = addColumnWithSpan(metadata, columnSpans.getMiddle());
-        updateColumnMemberGroups(objectSpec, MemberGroupLayoutHint.MIDDLE, columnRepr, actionIdsForAssociations);
+        updateColumnMemberGroups(objectSpec, Hint.MIDDLE, columnRepr, actionIdsForAssociations);
         
         columnRepr = addColumnWithSpan(metadata, columnSpans.getRight());
-        updateColumnMemberGroups(objectSpec, MemberGroupLayoutHint.RIGHT, columnRepr, actionIdsForAssociations);
+        updateColumnMemberGroups(objectSpec, Hint.RIGHT, columnRepr, actionIdsForAssociations);
         
         columnRepr = addColumnWithSpan(metadata, columnSpans.getCollections());
         updateCollectionColumnRepr(objectSpec, columnRepr, actionIdsForAssociations);
@@ -479,7 +479,7 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader2 {
         return gson.toJson(metadata);
     }
 
-    private static void updateColumnMemberGroups(final ObjectSpecification objectSpec, final MemberGroupLayoutHint hint, final ColumnRepr columnRepr, final Set<String> actionIdsForAssociations) {
+    private static void updateColumnMemberGroups(final ObjectSpecification objectSpec, final Hint hint, final ColumnRepr columnRepr, final Set<String> actionIdsForAssociations) {
         final List<ObjectAssociation> objectAssociations = propertiesOf(objectSpec);
         final Map<String, List<ObjectAssociation>> associationsByGroup = ObjectAssociation.Util.groupByMemberOrderName(objectAssociations
         );

http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
index 2c24f0d..b184d35 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecifications.java
@@ -25,9 +25,7 @@ import java.util.Set;
 
 import com.google.common.collect.Lists;
 
-import org.apache.isis.applib.annotation.MemberGroupLayout.ColumnSpans;
 import org.apache.isis.applib.layout.v1_0.Column;
-import org.apache.isis.applib.layout.v1_0.Tab;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 
 
@@ -36,30 +34,10 @@ public final class ObjectSpecifications {
     private ObjectSpecifications() {
     }
 
-    public enum MemberGroupLayoutHint {
-        LEFT,
-        MIDDLE,
-        RIGHT;
-
-        public int from(ColumnSpans columnSpans) {
-            if(this == LEFT) return columnSpans.getLeft();
-            if(this == MIDDLE) return columnSpans.getMiddle();
-            if(this == RIGHT) return columnSpans.getRight();
-            throw new IllegalStateException();
-        }
-
-        public Column from(final Tab tab) {
-            if(this == LEFT) {return tab.getLeft();}
-            if(this == MIDDLE) return tab.getMiddle();
-            if(this == RIGHT) return tab.getRight();
-            throw new IllegalStateException();
-        }
-    }
-
     public static List<String> orderByMemberGroups(
             final ObjectSpecification objSpec,
             final Set<String> groupNamesToOrder,
-            final MemberGroupLayoutHint hint) {
+            final Column.Hint hint) {
 
         final MemberGroupLayoutFacet facet = objSpec.getFacet(MemberGroupLayoutFacet.class);
         final List<String> leftColumnGroupNames = Lists.newArrayList(groupNamesToOrder);
@@ -69,10 +47,10 @@ public final class ObjectSpecifications {
             return leftColumnGroupNames;
         }
         
-        if(hint == MemberGroupLayoutHint.MIDDLE) {
+        if(hint == Column.Hint.MIDDLE) {
             return facet.getColumnSpans().getMiddle()>0? facet.getMiddle(): Collections.<String>emptyList();
         }
-        if(hint == MemberGroupLayoutHint.RIGHT) {
+        if(hint == Column.Hint.RIGHT) {
             return facet.getColumnSpans().getRight()>0? facet.getRight(): Collections.<String>emptyList();
         }
         

http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 53b6bd1..bebb67c 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -44,7 +44,7 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolic
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.ObjectSpecifications.MemberGroupLayoutHint;
+import org.apache.isis.applib.layout.v1_0.Column.Hint;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.services.memento.MementoServiceDefault;
@@ -130,7 +130,7 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
     private Mode mode = Mode.VIEW;
     private RenderingHint renderingHint = RenderingHint.REGULAR;
     private final Map<PropertyMemento, ScalarModel> propertyScalarModels = Maps.newHashMap();
-    private MemberGroupLayoutHint memberGroupLayoutHint;
+    private Hint hint;
 
     /**
      * Toggled by 'entityDetailsButton'.
@@ -451,11 +451,11 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
         entityDetailsVisible = !entityDetailsVisible;
     }
 
-    public MemberGroupLayoutHint getMemberGroupLayoutHint() {
-        return memberGroupLayoutHint;
+    public Hint getHint() {
+        return hint;
     }
-    public void setMemberGroupLayoutHint(MemberGroupLayoutHint memberGroupLayoutHint) {
-        this.memberGroupLayoutHint = memberGroupLayoutHint;
+    public void setHint(Hint hint) {
+        this.hint = hint;
     }
 
     
@@ -649,15 +649,20 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
 
 
     private Column columnMetadata;
+    private Column.Hint columnHint;
 
-    public EntityModel withColumnMetadata(final Column columnMetadata) {
+    public EntityModel withColumnMetadata(final Column columnMetadata, final Column.Hint columnHint) {
         this.columnMetadata = columnMetadata;
+        this.columnHint = columnHint;
         return this;
     }
 
     public Column getColumnMetadata() {
         return columnMetadata;
     }
+    public Column.Hint getColumnHint() {
+        return columnHint;
+    }
 
 
     // //////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityColumnMembers.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityColumnMembers.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityColumnMembers.java
new file mode 100644
index 0000000..805a904
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityColumnMembers.java
@@ -0,0 +1,50 @@
+/*
+ *  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
+ *
+ *        http://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.isis.viewer.wicket.ui.components.entity.properties;
+
+import org.apache.wicket.Component;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.panels.FormAbstract;
+
+public class EntityColumnMembers extends FormAbstract<ObjectAdapter> {
+
+    private static final long serialVersionUID = 1L;
+
+
+    private final Component owningPanel;
+
+    public EntityColumnMembers(
+            final String id,
+            final EntityModel entityModel,
+            final Component owningPanel) {
+
+        super(id, entityModel);
+        this.owningPanel = owningPanel; // for repainting
+
+        buildGui();
+    }
+
+    private void buildGui() {
+
+        final EntityModel entityModel = (EntityModel) getModel();
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
index f0ba38d..1f8792a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
@@ -64,7 +64,7 @@ import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayo
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecifications;
-import org.apache.isis.core.metamodel.spec.ObjectSpecifications.MemberGroupLayoutHint;
+import org.apache.isis.applib.layout.v1_0.Column.Hint;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -151,7 +151,6 @@ public class EntityPropertiesForm extends FormAbstract<ObjectAdapter> implements
     private void buildGui() {
 
         final EntityModel entityModel = (EntityModel) getModel();
-
         final Tab tabMetaDataIfAny = entityModel.getTabMetadata();
 
         final ColumnSpans columnSpans;
@@ -169,71 +168,71 @@ public class EntityPropertiesForm extends FormAbstract<ObjectAdapter> implements
         }
 
         renderedFirstField = false;
-        
+
         // left column
+        // (unlike middle and right columns, the left column is always added to hold the edit buttons and feedback)
         MarkupContainer leftColumn = new WebMarkupContainer(ID_LEFT_COLUMN);
         add(leftColumn);
-        
-        boolean addedProperties;
-        if(columnSpans.getLeft() > 0) {
-            final MemberGroupLayoutHint hint = MemberGroupLayoutHint.LEFT;
-
-            final Column columnMetaDataIfAny = tabMetaDataIfAny != null ? hint
-                    .from(tabMetaDataIfAny) : null;
-            addPropertiesAndCollections(leftColumn, hint, entityModel,
-                    columnSpans, columnMetaDataIfAny);
-
-            final ObjectAdapter adapter = entityModel.getObject();
-            final ObjectSpecification objSpec = adapter.getSpecification();
 
-            final Map<String, List<ObjectAssociation>> associationsByGroup =
-                    PropUtil
-                    .propertiesByMemberOrder(adapter);
+        if(columnSpans.getLeft() > 0) {
 
-            final List<String> groupNames = columnMetaDataIfAny != null
-                    ? FluentIterable
-                    .from(columnMetaDataIfAny.getPropertyGroups())
-                    .transform(PropertyGroup.Util.nameOf())
-                    .toList()
-                    : ObjectSpecifications.orderByMemberGroups(objSpec, associationsByGroup.keySet(),
-                    hint);
+            addPropertiesAndCollections(leftColumn, entityModel, tabMetaDataIfAny, Hint.LEFT);
 
-            addedProperties = !groupNames.isEmpty();
-            addButtons(leftColumn);
-            addFeedbackGui(leftColumn);
         } else {
             Components.permanentlyHide(this, ID_LEFT_COLUMN);
-            addedProperties = false;
         }
-        if(!addedProperties) {
-            // a bit hacky...
-            Components.permanentlyHide(this,
-                    ID_EDIT_BUTTON, ID_OK_BUTTON, ID_CANCEL_BUTTON,
-                    ID_FEEDBACK);
-        }
-        
+
         // middle column
+        MarkupContainer middleColumn;
         if(columnSpans.getMiddle() > 0) {
-            MarkupContainer middleColumn = new WebMarkupContainer(ID_MIDDLE_COLUMN);
+            middleColumn = new WebMarkupContainer(ID_MIDDLE_COLUMN);
             add(middleColumn);
-            final Column columnMetaDataIfAny = tabMetaDataIfAny != null ? MemberGroupLayoutHint.MIDDLE
-                    .from(tabMetaDataIfAny) : null;
-            addPropertiesAndCollections(middleColumn, MemberGroupLayoutHint.MIDDLE, entityModel, columnSpans, columnMetaDataIfAny);
+
+            addPropertiesAndCollections(middleColumn, entityModel, tabMetaDataIfAny, Hint.MIDDLE);
         } else {
+            middleColumn = null;
             Components.permanentlyHide(this, ID_MIDDLE_COLUMN);
         }
 
         // right column
+        MarkupContainer rightColumn;
         if(columnSpans.getRight() > 0) {
-            MarkupContainer rightColumn = new WebMarkupContainer(ID_RIGHT_COLUMN);
+            rightColumn = new WebMarkupContainer(ID_RIGHT_COLUMN);
             add(rightColumn);
-            final Column columnMetaDataIfAny = tabMetaDataIfAny != null ? MemberGroupLayoutHint.RIGHT
-                    .from(tabMetaDataIfAny) : null;
-            addPropertiesAndCollections(rightColumn, MemberGroupLayoutHint.RIGHT, entityModel, columnSpans, columnMetaDataIfAny);
+
+            addPropertiesAndCollections(rightColumn, entityModel, tabMetaDataIfAny, Hint.RIGHT);
         } else {
+            rightColumn = null;
             Components.permanentlyHide(this, ID_RIGHT_COLUMN);
         }
 
+        // column spans
+        if(columnSpans.getLeft() > 0) {
+            addClassForSpan(leftColumn, Hint.LEFT.from(columnSpans));
+        }
+        if(columnSpans.getMiddle() > 0) {
+            addClassForSpan(middleColumn, Hint.MIDDLE.from(columnSpans));
+        }
+        if(columnSpans.getRight() > 0) {
+            addClassForSpan(rightColumn, Hint.RIGHT.from(columnSpans));
+        }
+
+        // edit buttons and feedback
+        final Hint leftHint = Hint.LEFT;
+        final Column leftColumnMetaDataIfAny = leftHint.from(tabMetaDataIfAny);
+        final List<String> groupNames = PropUtil.propertyGroupNames(entityModel, leftHint, leftColumnMetaDataIfAny);
+        final boolean hasProperties = !groupNames.isEmpty();
+        if (hasProperties) {
+            addButtons(leftColumn);
+            addFeedbackGui(leftColumn);
+
+        } else {
+            Components.permanentlyHide(this,
+                    ID_EDIT_BUTTON, ID_OK_BUTTON, ID_CANCEL_BUTTON,
+                    ID_FEEDBACK);
+        }
+
+
         // collections (only if not being added to a tab)
         if(tabMetaDataIfAny == null && columnSpans.getCollections() > 0) {
             final String idCollectionsToShow;
@@ -262,20 +261,31 @@ public class EntityPropertiesForm extends FormAbstract<ObjectAdapter> implements
     }
 
     private void addPropertiesAndCollections(
-            final MarkupContainer col,
-            final MemberGroupLayoutHint hint,
+            final MarkupContainer middleColumn,
             final EntityModel entityModel,
-            final ColumnSpans columnSpans, final Column columnMetaDataIfAny) {
-        addPropertiesInColumn(col, hint, entityModel, columnSpans, columnMetaDataIfAny);
-        addCollectionsIfRequired(col, entityModel, columnMetaDataIfAny);
+            final Tab tabMetaDataIfAny, final Hint hint) {
+        final Column columnMetaDataIfAny = hint.from(tabMetaDataIfAny);
+
+        final EntityModel entityModelWithHints =
+                new EntityModel(entityModel.getPageParameters())
+                        .withColumnMetadata(columnMetaDataIfAny, hint);
+
+        addPropertiesAndCollections(middleColumn, entityModelWithHints);
+    }
+
+    private void addPropertiesAndCollections(
+            final MarkupContainer col,
+            final EntityModel entityModel) {
+        addPropertiesInColumn(col, entityModel);
+        addCollectionsIfRequired(col, entityModel);
     }
 
     private void addPropertiesInColumn(
             final MarkupContainer markupContainer,
-            final MemberGroupLayoutHint hint,
-            final EntityModel entityModel,
-            final ColumnSpans columnSpans, final Column columnMetaDataIfAny) {
-        final int span = hint.from(columnSpans);
+            final EntityModel entityModel) {
+
+        final Column columnMetaDataIfAny = entityModel.getColumnMetadata();
+        final Hint hint = entityModel.getColumnHint();
         final ObjectAdapter adapter = entityModel.getObject();
         final ObjectSpecification objSpec = adapter.getSpecification();
 
@@ -327,19 +337,17 @@ public class EntityPropertiesForm extends FormAbstract<ObjectAdapter> implements
                     actionsPanelDropDown,
                     AdditionalLinksPanel.Style.DROPDOWN);
         }
-
-        addClassForSpan(markupContainer, span);
     }
 
     private void addCollectionsIfRequired(
             final MarkupContainer column,
-            final EntityModel entityModel,
-            final Column columnMetaDataIfAny) {
+            final EntityModel entityModel) {
+
+        final Column columnMetaDataIfAny = entityModel.getColumnMetadata();
+
         if(columnMetaDataIfAny != null) {
-            final EntityModel modelWithMetadata = new EntityModel(entityModel.getPageParameters()).withColumnMetadata(
-                    columnMetaDataIfAny);
             getComponentFactoryRegistry()
-                    .addOrReplaceComponent(column, "collections", ComponentType.ENTITY_COLLECTIONS, modelWithMetadata);
+                    .addOrReplaceComponent(column, "collections", ComponentType.ENTITY_COLLECTIONS, entityModel);
         } else {
             Components.permanentlyHide(column, "collections");
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/PropUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/PropUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/PropUtil.java
index 23a9a8d..ff0d5b8 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/PropUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/PropUtil.java
@@ -21,20 +21,44 @@ package org.apache.isis.viewer.wicket.ui.components.entity.properties;
 import java.util.List;
 import java.util.Map;
 
+import com.google.common.collect.FluentIterable;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.applib.layout.v1_0.Column;
+import org.apache.isis.applib.layout.v1_0.PropertyGroup;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.ObjectSpecifications;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
 
 public final class PropUtil {
 
     private PropUtil() {
     }
 
+    static List<String> propertyGroupNames(
+            final EntityModel entityModel,
+            final Column.Hint hint, final Column columnMetaDataIfAny) {
+        final ObjectAdapter adapter = entityModel.getObject();
+        final ObjectSpecification objSpec = adapter.getSpecification();
+
+        final Map<String, List<ObjectAssociation>> associationsByGroup =
+                propertiesByMemberOrder(adapter);
+
+        return columnMetaDataIfAny != null
+                ? FluentIterable
+                .from(columnMetaDataIfAny.getPropertyGroups())
+                .transform(PropertyGroup.Util.nameOf())
+                .toList()
+                : ObjectSpecifications.orderByMemberGroups(objSpec, associationsByGroup.keySet(),
+                hint);
+    }
+
     static Map<String, List<ObjectAssociation>> propertiesByMemberOrder(final ObjectAdapter adapter) {
         final List<ObjectAssociation> properties = visibleProperties(adapter);
         return ObjectAssociation.Util.groupByMemberOrderName(properties);
@@ -64,5 +88,4 @@ public final class PropUtil {
                 filter);
     }
 
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9ff3c29d/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
index c9e7ac8..7d4f0e4 100644
--- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
+++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml
@@ -15,8 +15,6 @@
                 </propertyGroup>
             </left>
             <right span="6">
-                <collection id="similarTo" defaultView="table"/>
-                <collection id="others" defaultView="hide"/>
             </right>
         </tab>
         <tab name="Metadata">
@@ -31,4 +29,12 @@
             </left>
         </tab>
     </tabGroup>
+    <tabGroup>
+        <tab name="Collections">
+            <left span="6">
+                <collection id="similarTo" defaultView="table"/>
+                <collection id="others" defaultView="hide"/>
+            </left>
+        </tab>
+    </tabGroup>
 </objectLayout>
\ No newline at end of file