http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
new file mode 100644
index 0000000..49be8db
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
@@ -0,0 +1,204 @@
+/*
+ *  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.collectioncontents.summary;
+
+import 
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collections;
+import java.util.List;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.list.AbstractItem;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.Model;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectAdapterUtils;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+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.EntityCollectionModel;
+import 
org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+/**
+ * {@link PanelAbstract Panel} that represents a {@link EntityCollectionModel
+ * collection of entity}s rendered using as a table of summary values with a
+ * chart alongside.
+ */
+public class CollectionContentsAsSummary extends 
PanelAbstract<EntityCollectionModel> implements CollectionCountProvider {
+
+    private static final String ID_MAX = "max";
+
+    private static final String ID_MIN = "min";
+
+    private static final String ID_AVG = "avg";
+
+    private static final String ID_SUM = "sum";
+
+    private static final String ID_PROPERTY_NAME = "propertyName";
+
+    private static final String ID_REPEATING_SUMMARY = "repeatingSummary";
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_FEEDBACK = "feedback";
+
+    public CollectionContentsAsSummary(final String id, final 
EntityCollectionModel model) {
+        super(id, model);
+
+        buildGui();
+    }
+
+    private void buildGui() {
+
+        final EntityCollectionModel model = getModel();
+
+        final ObjectSpecification elementSpec = model.getTypeOfSpecification();
+
+        final NotificationPanel feedback = new NotificationPanel(ID_FEEDBACK);
+        feedback.setOutputMarkupId(true);
+        addOrReplace(feedback);
+
+        List<ObjectAssociation> numberAssociations = 
elementSpec.getAssociations(Contributed.EXCLUDED, 
CollectionContentsAsSummaryFactory.OF_TYPE_BIGDECIMAL);
+
+        RepeatingView repeating = new RepeatingView(ID_REPEATING_SUMMARY);
+        addOrReplace(repeating);
+
+        for (ObjectAssociation numberAssociation : numberAssociations) {
+            AbstractItem item = new AbstractItem(repeating.newChildId());
+
+            repeating.add(item);
+
+            String propertyName = numberAssociation.getName();
+            item.add(new Label(ID_PROPERTY_NAME, new 
Model<String>(propertyName)));
+
+
+            List<ObjectAdapter> adapters = model.getObject();
+            Summary summary = new Summary(propertyName, adapters, 
numberAssociation);
+            addItem(item, ID_SUM, summary.getTotal());
+            addItem(item, ID_AVG, summary.getAverage());
+            addItem(item, ID_MIN, summary.getMin());
+            addItem(item, ID_MAX, summary.getMax());
+        }
+    }
+    
+    public static class Summary {
+
+        private BigDecimal sum = BigDecimal.ZERO;
+        private BigDecimal min = null;
+        private BigDecimal max = null;
+        private final List<String> titles = Lists.newArrayList();
+        private final List<BigDecimal> values = Lists.newArrayList();
+        private BigDecimal average;
+        private String propertyName;
+
+        public Summary(List<ObjectAdapter> adapters, ObjectAssociation 
numberAssociation) {
+            this(null, adapters, numberAssociation);
+        }
+
+        public Summary(String propertyName, List<ObjectAdapter> adapters, 
ObjectAssociation numberAssociation) {
+            this.propertyName = propertyName;
+            int nonNullCount = 0;
+            for (ObjectAdapter objectAdapter : adapters) {
+                titles.add(objectAdapter.titleString(null));
+                final ObjectAdapter valueAdapter = 
numberAssociation.get(objectAdapter);
+                if (valueAdapter == null) {
+                    values.add(null);
+                    continue;
+                }
+                final Object valueObj = 
ObjectAdapterUtils.unwrapObject(valueAdapter);
+                if (valueObj == null) {
+                    values.add(null);
+                    continue;
+                }
+                
+                nonNullCount++;
+                BigDecimal value = (BigDecimal) valueObj;
+                sum = sum.add(value);
+                min = min != null && min.compareTo(value) < 0 ? min : value;
+                max = max != null && max.compareTo(value) > 0 ? max : value;
+                values.add(value);
+            }
+            average = nonNullCount != 0 ? 
sum.divide(BigDecimal.valueOf(nonNullCount), 2, RoundingMode.HALF_UP) : null;
+        }
+        
+        public String getPropertyName() {
+            return propertyName;
+        }
+        public BigDecimal getTotal() {
+            return sum;
+        }
+        public BigDecimal getAverage() {
+            return average;
+        }
+        public BigDecimal getMax() {
+            return max;
+        }
+        public BigDecimal getMin() {
+            return min;
+        }
+        public List<String> getTitles() {
+            return Collections.unmodifiableList(titles);
+        }
+        public List<BigDecimal> getValues() {
+            return Collections.unmodifiableList(values);
+        }
+        public List<Number> getValuesAsNumbers() {
+            return asNumbers(getValues());
+        }
+        
+        private static List<Number> asNumbers(List<BigDecimal> values) {
+            return Lists.newArrayList(Iterables.transform(values, 
BIGDECIMAL_TO_NUMBER));
+        }
+
+        private static final com.google.common.base.Function<BigDecimal, 
Number> BIGDECIMAL_TO_NUMBER = new com.google.common.base.Function<BigDecimal, 
Number>(){
+            public Number apply(BigDecimal value) {
+                return value;
+            }
+        };
+
+        
+    }
+
+    private void addItem(AbstractItem item, String id, BigDecimal amt) {
+        TextField<String> textField = new TextField<String>(id, new 
Model<String>(format(amt)));
+        item.add(textField);
+    }
+
+    private String format(BigDecimal amt) {
+        return amt != null ? amt.setScale(2, 
RoundingMode.HALF_UP).toPlainString() : "";
+    }
+
+    @Override
+    protected void onModelChanged() {
+        buildGui();
+    }
+
+    @Override
+    public Integer getCount() {
+        final EntityCollectionModel model = getModel();
+        return model.getCount();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
new file mode 100644
index 0000000..1c75d2a
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
@@ -0,0 +1,94 @@
+/*
+ *  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.collectioncontents.summary;
+
+import java.util.List;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.resource.CssResourceReference;
+
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import 
org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.CollectionContentsAsFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+
+/**
+ * {@link ComponentFactory} for {@link CollectionContentsAsSummary}.
+ */
+public class CollectionContentsAsSummaryFactory extends 
ComponentFactoryAbstract implements CollectionContentsAsFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String NAME = "summary";
+
+    final static Filter<ObjectAssociation> OF_TYPE_BIGDECIMAL = new 
Filter<ObjectAssociation>(){
+        public boolean accept(final ObjectAssociation objectAssoc) {
+            ObjectSpecification objectSpec = objectAssoc.getSpecification();
+            return objectSpec.containsDoOpFacet(BigDecimalValueFacet.class);
+        }};
+
+    // //////////////////////////////////////
+
+    public CollectionContentsAsSummaryFactory() {
+        super(ComponentType.COLLECTION_CONTENTS, NAME, 
CollectionContentsAsSummary.class);
+    }
+
+    @Override
+    public ApplicationAdvice appliesTo(final IModel<?> model) {
+        if(!(model instanceof EntityCollectionModel)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        final EntityCollectionModel entityCollectionModel = 
(EntityCollectionModel) model;
+        final ObjectSpecification elementSpec = 
entityCollectionModel.getTypeOfSpecification();
+        List<ObjectAssociation> associations = 
elementSpec.getAssociations(Contributed.EXCLUDED, OF_TYPE_BIGDECIMAL);
+        return appliesIf(!associations.isEmpty());
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityCollectionModel collectionModel = (EntityCollectionModel) 
model;
+        return new CollectionContentsAsSummary(id, collectionModel);
+    }
+    
+    @Override
+    public CssResourceReference getCssResourceReference() {
+        // do not bundle, because of relative CSS images...
+        return null;
+    }
+
+    @Override
+    public IModel<String> getTitleLabel() {
+        return Model.of("Summary");
+    }
+
+    @Override
+    public IModel<String> getCssClass() {
+        return Model.of("fa fa-fw fa-usd");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.html
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.html
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.html
new file mode 100644
index 0000000..8a1f128
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.html
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml";  
+      
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd";  
+      xml:lang="en"  
+      lang="en">
+       <body>
+               <wicket:panel>
+                       <div class="collectionContentsAsUnresolvedPanel 
collectionContentsComponentType"></div>
+               </wicket:panel>
+       </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.java
new file mode 100644
index 0000000..fd36e9a
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanel.java
@@ -0,0 +1,43 @@
+/*
+ *  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.collectioncontents.unresolved;
+
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+/**
+ * {@link PanelAbstract Panel} that represents a placeholder for a
+ * {@link EntityCollectionModel collection of entity}s so that they can be only
+ * lazily resolved.
+ */
+public class CollectionContentsAsUnresolvedPanel extends 
PanelAbstract<EntityCollectionModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    public CollectionContentsAsUnresolvedPanel(final String id, final 
EntityCollectionModel model) {
+        super(id, model);
+        buildGui();
+    }
+
+    private void buildGui() {
+        // nothing
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanelFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanelFactory.java
new file mode 100644
index 0000000..d2f340b
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/unresolved/CollectionContentsAsUnresolvedPanelFactory.java
@@ -0,0 +1,69 @@
+/*
+ *  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.collectioncontents.unresolved;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.ui.CollectionContentsAsFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+
+/**
+ * {@link ComponentFactory} for {@link CollectionContentsAsUnresolvedPanel}.
+ */
+public class CollectionContentsAsUnresolvedPanelFactory extends 
ComponentFactoryAbstract implements CollectionContentsAsFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String NAME = "show...";
+
+    public CollectionContentsAsUnresolvedPanelFactory() {
+        super(ComponentType.COLLECTION_CONTENTS, NAME, 
CollectionContentsAsUnresolvedPanel.class);
+    }
+
+    @Override
+    public ApplicationAdvice appliesTo(final IModel<?> model) {
+        if (!(model instanceof EntityCollectionModel)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        final EntityCollectionModel entityCollectionModel = 
(EntityCollectionModel) model;
+        return appliesIf(entityCollectionModel.isParented());
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityCollectionModel collectionModel = (EntityCollectionModel) 
model;
+        return new CollectionContentsAsUnresolvedPanel(id, collectionModel);
+    }
+
+    @Override
+    public IModel<String> getTitleLabel() {
+        return Model.of("Hide");
+    }
+
+    @Override
+    public IModel<String> getCssClass() {
+        return Model.of("fa fa-fw fa-eye-slash");
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.html
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.html
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.html
new file mode 100644
index 0000000..f9e6a25
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.html
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
+<html xmlns="http://www.w3.org/1999/xhtml";  
+      
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd";  
+      xml:lang="en"  
+      lang="en">
+    <body>
+        <wicket:panel>
+            <div class="emptyCollectionPanel">
+                <form>
+                    <p>No objects returned</p>
+                </form>
+            </div>
+        </wicket:panel>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.java
new file mode 100644
index 0000000..0bc44f3
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanel.java
@@ -0,0 +1,38 @@
+/*
+ *  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.empty;
+
+import org.apache.isis.viewer.wicket.model.models.ActionModel;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class EmptyCollectionPanel extends PanelAbstract<ActionModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    public EmptyCollectionPanel(final String id, final ActionModel model) {
+        super(id, model);
+        buildGui(id);
+    }
+
+    private void buildGui(final String id) {
+        // nothing to do...
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanelFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanelFactory.java
new file mode 100644
index 0000000..0fc2fde
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/empty/EmptyCollectionPanelFactory.java
@@ -0,0 +1,52 @@
+/*
+ *  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.empty;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.ActionModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+
+public class EmptyCollectionPanelFactory extends ComponentFactoryAbstract 
implements ComponentFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    public EmptyCollectionPanelFactory() {
+        super(ComponentType.EMPTY_COLLECTION, EmptyCollectionPanel.class);
+    }
+
+    @Override
+    protected ApplicationAdvice appliesTo(final IModel<?> model) {
+        if (!(model instanceof ActionModel)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        return ApplicationAdvice.APPLIES;
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final ActionModel actionModel = (ActionModel) model;
+        return new EmptyCollectionPanel(id, actionModel);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
new file mode 100644
index 0000000..717caf3
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
@@ -0,0 +1,65 @@
+/*
+ *  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;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+
+/**
+ * Convenience adapter for a number of {@link ComponentFactoryAbstract 
component
+ * factory}s that where the created {@link Component} are backed by an
+ * {@link EntityModel}.
+ */
+public abstract class EntityComponentFactoryAbstract extends 
ComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public EntityComponentFactoryAbstract(final ComponentType componentType, 
final @SuppressWarnings("rawtypes") Class componentClass) {
+        super(componentType, componentClass);
+    }
+
+    public EntityComponentFactoryAbstract(final ComponentType componentType, 
final String name, final @SuppressWarnings("rawtypes") Class componentClass) {
+        super(componentType, name, componentClass);
+    }
+
+    @Override
+    protected ApplicationAdvice appliesTo(final IModel<?> model) {
+        if (!(model instanceof EntityModel)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        final EntityModel entityModel = (EntityModel) model;
+        final ObjectAdapter adapter = entityModel.getObject();
+        if (adapter == null) {
+            // is ok;
+        }
+        final ObjectSpecification specification = 
entityModel.getTypeOfSpecification();
+        final boolean isObject = specification.isNotCollection();
+        final boolean isValue = specification.containsFacet(ValueFacet.class);
+        return appliesIf(isObject && !isValue);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.html
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.html
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.html
new file mode 100644
index 0000000..2d39517
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.html
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+    <body>
+        <wicket:panel>
+            <div class="entityCollectionsPanel entityCollectionsComponentType">
+                <div wicket:id="collections" class="myBlockContainer">
+                    <div wicket:id="collectionGroup" class="panel 
panel-default">
+
+                        <div class="panel-heading">
+                            <span wicket:id="collectionName" 
class="panel-title">[collection name]</span>
+                            <div class="additionalLinksAndSelectorDropDown 
pull-right">
+
+                                <div class="btn-group">
+                                    <div wicket:id="additionalLinks"></div>
+                                </div>
+                                <div class="btn-group">
+                                    <span wicket:id="selectorDropdown"/>
+                                </div>
+
+                            </div>
+                        </div>
+
+                        <div wicket:id="collection" class="collection 
panel-body">
+                            [collection]
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </wicket:panel>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
new file mode 100644
index 0000000..5b50367
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
@@ -0,0 +1,174 @@
+/*
+ *  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.collections;
+
+import java.util.List;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.Model;
+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.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import 
org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.collection.CollectionPanel;
+import 
org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorHelper;
+import 
org.apache.isis.viewer.wicket.ui.components.collection.selector.CollectionSelectorPanel;
+import 
org.apache.isis.viewer.wicket.ui.components.widgets.containers.UiHintPathSignificantWebMarkupContainer;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+/**
+ * {@link PanelAbstract Panel} representing the properties of an entity, as per
+ * the provided {@link EntityModel}.
+ */
+public class EntityCollectionsPanel extends PanelAbstract<EntityModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_ENTITY_COLLECTIONS = "entityCollections";
+    private static final String ID_COLLECTION_GROUP = "collectionGroup";
+    private static final String ID_COLLECTION_NAME = "collectionName";
+    private static final String ID_COLLECTIONS = "collections";
+    private static final String ID_COLLECTION = "collection";
+
+    private static final String ID_ADDITIONAL_LINKS = "additionalLinks";
+    private static final String ID_SELECTOR_DROPDOWN = "selectorDropdown";
+
+    public EntityCollectionsPanel(final String id, final EntityModel 
entityModel) {
+        super(id, entityModel);
+
+        buildGui();
+    }
+
+    private void buildGui() {
+        buildEntityPropertiesAndOrCollectionsGui();
+        setOutputMarkupId(true); // so can repaint via ajax
+    }
+
+    private void buildEntityPropertiesAndOrCollectionsGui() {
+        final EntityModel model = getModel();
+        final ObjectAdapter adapter = model.getObject();
+        if (adapter != null) {
+            addCollections();
+        } else {
+            permanentlyHide(ID_ENTITY_COLLECTIONS);
+        }
+    }
+
+    private void addCollections() {
+        final EntityModel entityModel = getModel();
+        final ObjectAdapter adapter = entityModel.getObject();
+        final ObjectSpecification noSpec = adapter.getSpecification();
+        final List<ObjectAssociation> associations = 
visibleCollections(adapter, noSpec);
+
+        final RepeatingView collectionRv = new RepeatingView(ID_COLLECTIONS);
+        add(collectionRv);
+
+        for (final ObjectAssociation association : associations) {
+
+            final WebMarkupContainer collectionRvContainer = new 
UiHintPathSignificantWebMarkupContainer(collectionRv.newChildId());
+            collectionRv.add(collectionRvContainer);
+            
+            addCollectionToForm(entityModel, association, 
collectionRvContainer);
+        }
+    }
+
+    private void addCollectionToForm(final EntityModel entityModel,
+            final ObjectAssociation association,
+            final WebMarkupContainer collectionRvContainer) {
+
+        final CssClassFacet facet = association.getFacet(CssClassFacet.class);
+        if(facet != null) {
+            final ObjectAdapter objectAdapter = entityModel.getObject();
+            final String cssClass = facet.cssClass(objectAdapter);
+            CssClassAppender.appendCssClassTo(collectionRvContainer, cssClass);
+        }
+        final WebMarkupContainer fieldset = new 
WebMarkupContainer(ID_COLLECTION_GROUP);
+        collectionRvContainer.add(fieldset);
+
+        final OneToManyAssociation otma = (OneToManyAssociation) association;
+
+        final CollectionPanel collectionPanel = new 
CollectionPanel(ID_COLLECTION, entityModel, otma);
+        fieldset.addOrReplace(collectionPanel);
+
+        Label labelComponent = collectionPanel.createLabel(ID_COLLECTION_NAME, 
association.getName());
+        final NamedFacet namedFacet = association.getFacet(NamedFacet.class);
+        labelComponent.setEscapeModelStrings(namedFacet == null || 
namedFacet.escaped());
+
+        final String description = association.getDescription();
+        if(description != null) {
+            labelComponent.add(new AttributeAppender("title", 
Model.of(description)));
+        }
+
+        fieldset.add(labelComponent);
+
+        final EntityCollectionModel entityCollectionModel = 
collectionPanel.getModel();
+        List<LinkAndLabel> links = entityCollectionModel.getLinks();
+
+        AdditionalLinksPanel.addAdditionalLinks (fieldset,ID_ADDITIONAL_LINKS, 
links, AdditionalLinksPanel.Style.INLINE_LIST);
+
+        final CollectionSelectorHelper selectorHelper = new 
CollectionSelectorHelper(entityCollectionModel, getComponentFactoryRegistry());
+
+        final List<ComponentFactory> componentFactories = 
selectorHelper.getComponentFactories();
+
+        if (componentFactories.size() <= 1) {
+            permanentlyHide(ID_SELECTOR_DROPDOWN);
+        } else {
+            CollectionSelectorPanel selectorDropdownPanel;
+            selectorDropdownPanel = new 
CollectionSelectorPanel(ID_SELECTOR_DROPDOWN, entityCollectionModel);
+
+            final Model<ComponentFactory> componentFactoryModel = new 
Model<>();
+
+            final int selected = 
selectorHelper.honourViewHintElseDefault(selectorDropdownPanel);
+
+            ComponentFactory selectedComponentFactory = 
componentFactories.get(selected);
+            componentFactoryModel.setObject(selectedComponentFactory);
+
+            this.setOutputMarkupId(true);
+            fieldset.addOrReplace(selectorDropdownPanel);
+
+            collectionPanel.setSelectorDropdownPanel(selectorDropdownPanel);
+        }
+
+    }
+
+    private List<ObjectAssociation> visibleCollections(final ObjectAdapter 
adapter, final ObjectSpecification noSpec) {
+        return noSpec.getAssociations(Contributed.INCLUDED, 
visibleCollectionsFilter(adapter));
+    }
+
+    @SuppressWarnings("unchecked")
+    private Filter<ObjectAssociation> visibleCollectionsFilter(final 
ObjectAdapter adapter) {
+        return Filters.and(ObjectAssociation.Filters.COLLECTIONS, 
ObjectAssociation.Filters.dynamicallyVisible(getAuthenticationSession(), 
adapter, Where.PARENTED_TABLES));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanelFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanelFactory.java
new file mode 100644
index 0000000..e2947a0
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanelFactory.java
@@ -0,0 +1,49 @@
+/*
+ *  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.collections;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import 
org.apache.isis.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
+
+/**
+ * {@link ComponentFactory} for {@link EntityCollectionsPanel}.
+ */
+public class EntityCollectionsPanelFactory extends 
EntityComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public EntityCollectionsPanelFactory() {
+        super(ComponentType.ENTITY_COLLECTIONS, EntityCollectionsPanel.class);
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityModel entityModel = (EntityModel) model;
+        return new EntityCollectionsPanel(id, entityModel);
+    }
+}
+
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
new file mode 100644
index 0000000..540bb11
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.html
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+<body>
+<wicket:panel>
+       <div class="entityCombined">
+        <div wicket:id="entitySummary"></div>
+               <div wicket:id="entityPropertiesAndCollections"></div>
+       </div>
+</wicket:panel>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
new file mode 100644
index 0000000..ee26581
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanel.java
@@ -0,0 +1,60 @@
+/*
+ *  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.combined;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+/**
+ * {@link PanelAbstract Panel} to represent an entity on a single page made up
+ * of several &lt;div&gt; regions.
+ */
+public class EntityCombinedPanel extends PanelAbstract<EntityModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_ENTITY_PROPERTIES_AND_COLLECTIONS = 
"entityPropertiesAndCollections";
+
+    
+    public EntityCombinedPanel(final String id, final EntityModel entityModel) 
{
+        super(id, entityModel);
+        buildGui();
+    }
+
+    private void buildGui() {
+        final EntityModel model = getModel();
+        final ObjectAdapter objectAdapter = model.getObject();
+        final CssClassFacet facet = 
objectAdapter.getSpecification().getFacet(CssClassFacet.class);
+        if(facet != null) {
+            final String cssClass = facet.cssClass(objectAdapter);
+            CssClassAppender.appendCssClassTo(this, cssClass);
+        }
+
+        addOrReplace(ComponentType.ENTITY_SUMMARY, model);
+        
+        getComponentFactoryRegistry().addOrReplaceComponent(this, 
ID_ENTITY_PROPERTIES_AND_COLLECTIONS, ComponentType.ENTITY_PROPERTIES, model);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java
new file mode 100644
index 0000000..a42f062
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/combined/EntityCombinedPanelFactory.java
@@ -0,0 +1,48 @@
+/*
+ *  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.combined;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import 
org.apache.isis.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
+
+/**
+ * {@link ComponentFactory} for {@link EntityCombinedPanel}.
+ */
+public class EntityCombinedPanelFactory extends EntityComponentFactoryAbstract 
{
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String NAME = "combined";
+
+    public EntityCombinedPanelFactory() {
+        super(ComponentType.ENTITY, NAME, EntityCombinedPanel.class);
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityModel entityModel = (EntityModel) model;
+        return new EntityCombinedPanel(id, entityModel);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.html
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.html
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.html
new file mode 100644
index 0000000..76d70e6
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.html
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+    <body>
+        <wicket:panel>
+            <div class="entityHeaderPanel">
+                <h4 class="iconAndTitle">
+                    <div wicket:id="entityIconTitleAndCopylink" 
class="iconAndTitleLabel entityIconTitleAndCopylink">[icon and title]</div>
+                    <div class="entityActions" wicket:id="entityActions"></div>
+                    <div class="clearfix"></div>
+                </h4>
+            </div>
+        </wicket:panel>
+    </body>
+</html>
+

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
new file mode 100644
index 0000000..e1ab0c1
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
@@ -0,0 +1,106 @@
+/*
+ *  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.header;
+
+import java.util.List;
+import org.apache.wicket.Component;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.runtime.system.DeploymentType;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import 
org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
+import 
org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
+import 
org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionLinkFactory;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+/**
+ * {@link PanelAbstract Panel} representing the summary details (title, icon 
and
+ * actions) of an entity, as per the provided {@link EntityModel}.
+ */
+public class EntityHeaderPanel extends PanelAbstract<EntityModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_ENTITY_ACTIONS = "entityActions";
+
+    private final EntityActionLinkFactory linkFactory;
+
+
+    public EntityHeaderPanel(final String id, final EntityModel entityModel) {
+        super(id, entityModel);
+        linkFactory = new EntityActionLinkFactory(getEntityModel());
+    }
+
+    /**
+     * For the {@link EntityActionLinkFactory}.
+     */
+    public EntityModel getEntityModel() {
+        return getModel();
+    }
+
+    @Override
+    protected void onBeforeRender() {
+        buildGui();
+        super.onBeforeRender();
+    }
+
+    private void buildGui() {
+        addOrReplaceIconAndTitle();
+        buildEntityActionsGui();
+    }
+
+    private void addOrReplaceIconAndTitle() {
+        final ComponentFactory componentFactory = 
getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_TITLE_AND_COPYLINK,
 getEntityModel());
+        final Component component = 
componentFactory.createComponent(getEntityModel());
+        addOrReplace(component);
+    }
+
+
+    private void buildEntityActionsGui() {
+        final EntityModel model = getModel();
+        final ObjectAdapter adapter = model.getObject();
+        final ObjectAdapterMemento adapterMemento = 
model.getObjectAdapterMemento();
+        if (adapter != null) {
+            final List<ObjectAction> topLevelActions = 
EntityActionUtil.getTopLevelActions(adapter, getDeploymentType(), 
getAuthenticationSession());
+
+            final List<LinkAndLabel> entityActionLinks = 
EntityActionUtil.asLinkAndLabelsForAdditionalLinksPanel(model, topLevelActions);
+
+            AdditionalLinksPanel.addAdditionalLinks(this, ID_ENTITY_ACTIONS, 
entityActionLinks, AdditionalLinksPanel.Style.INLINE_LIST);
+        } else {
+            permanentlyHide(ID_ENTITY_ACTIONS);
+        }
+    }
+
+
+    // ///////////////////////////////////////////////
+    // Dependency Injection
+    // ///////////////////////////////////////////////
+
+    protected DeploymentType getDeploymentType() {
+        return IsisContext.getDeploymentType();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanelFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanelFactory.java
new file mode 100644
index 0000000..d9bef9b
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanelFactory.java
@@ -0,0 +1,46 @@
+/*
+ *  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.header;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import 
org.apache.isis.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
+
+/**
+ * {@link ComponentFactory} for {@link EntityHeaderPanel}.
+ */
+public class EntityHeaderPanelFactory extends EntityComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public EntityHeaderPanelFactory() {
+        super(ComponentType.ENTITY_SUMMARY, EntityHeaderPanel.class);
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityModel entityModel = (EntityModel) model;
+        return new EntityHeaderPanel(id, entityModel);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.html
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.html
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.html
new file mode 100644
index 0000000..4c919af
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.html
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+    <body>
+        <wicket:panel>
+             <span wicket:id="entityLinkWrapper" 
class="entityIconAndTitlePanel entityIconAndTitleComponentType">
+                 <a href="#" wicket:id="entityLink" class="entityUrlSource">
+                     <span wicket:id="entityFontAwesome"></span>
+                     <img wicket:id="entityImage" class="entityImage"/>
+                     <span wicket:id="entityTitle" 
class="entityTitle">[title]</span>
+                 </a>
+                 <wicket:child/>
+            </span>
+        </wicket:panel>
+    </body>
+</html>
+

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
new file mode 100644
index 0000000..54f64f4
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
@@ -0,0 +1,217 @@
+/*
+ *  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.icontitle;
+
+import com.google.inject.Inject;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.Page;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.image.Image;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import 
org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import 
org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ImageResourceCache;
+import org.apache.isis.viewer.wicket.model.models.PageType;
+import 
org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionLinkFactory;
+import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
+import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.Components;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+import org.apache.isis.viewer.wicket.ui.util.Links;
+
+/**
+ * {@link PanelAbstract Panel} representing the icon and title of an entity,
+ * as per the provided {@link EntityModel}.
+ */
+public class EntityIconAndTitlePanel extends PanelAbstract<EntityModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_ENTITY_LINK_WRAPPER = "entityLinkWrapper";
+    private static final String ID_ENTITY_FONT_AWESOME = "entityFontAwesome";
+    private static final String ID_ENTITY_LINK = "entityLink";
+    private static final String ID_ENTITY_TITLE = "entityTitle";
+    private static final String ID_ENTITY_ICON = "entityImage";
+
+    @SuppressWarnings("unused")
+    private Label label;
+    @SuppressWarnings("unused")
+    private Image image;
+
+    public EntityIconAndTitlePanel(final String id, final EntityModel 
entityModel) {
+        super(id, entityModel);
+    }
+
+    /**
+     * For the {@link EntityActionLinkFactory}.
+     */
+    public EntityModel getEntityModel() {
+        return getModel();
+    }
+
+    @Override
+    protected void onBeforeRender() {
+        buildGui();
+        super.onBeforeRender();
+    }
+
+    private void buildGui() {
+        addOrReplaceLinkWrapper();
+        setOutputMarkupId(true);
+    }
+
+    private void addOrReplaceLinkWrapper() {
+        EntityModel entityModel = getModel();
+        final WebMarkupContainer entityLinkWrapper = 
addOrReplaceLinkWrapper(entityModel);
+        addOrReplace(entityLinkWrapper);
+    }
+
+    protected WebMarkupContainer addOrReplaceLinkWrapper(final EntityModel 
entityModel) {
+        final ObjectAdapter adapter = entityModel.getObject();
+
+        final WebMarkupContainer entityLinkWrapper = new 
WebMarkupContainer(ID_ENTITY_LINK_WRAPPER);
+
+        final AbstractLink link = createIconAndTitle(adapter);
+        entityLinkWrapper.addOrReplace(link);
+        
+        return entityLinkWrapper;
+    }
+
+    private AbstractLink createIconAndTitle(final ObjectAdapter adapter) {
+        final AbstractLink link = createLinkWrapper();
+        
+        final String title = determineTitle();
+
+        final String iconName = adapter.getIconName();
+        final CssClassFaFacet cssClassFaFacet = 
adapter.getSpecification().getFacet(CssClassFaFacet.class);
+        if (iconName != null || cssClassFaFacet == null) {
+            link.addOrReplace(this.image = newImage(ID_ENTITY_ICON, adapter));
+            Components.permanentlyHide(link, ID_ENTITY_FONT_AWESOME);
+        } else {
+            Label dummy = new Label(ID_ENTITY_FONT_AWESOME, "");
+            link.addOrReplace(dummy);
+            dummy.add(new CssClassAppender(cssClassFaFacet.value() + " 
fa-2x"));
+            Components.permanentlyHide(link, ID_ENTITY_ICON);
+        }
+
+        link.addOrReplace(this.label = newLabel(ID_ENTITY_TITLE, 
titleAbbreviated(title)));
+
+        String entityTypeName = adapter.getSpecification().getSingularName();
+        link.add(new AttributeModifier("title", entityTypeName + ": " + 
title));
+        
+        return link;
+    }
+
+    private AbstractLink createLinkWrapper() {
+        final PageParameters pageParameters = 
getModel().getPageParametersWithoutUiHints();
+        
+        final Class<? extends Page> pageClass = 
getPageClassRegistry().getPageClass(PageType.ENTITY);
+        return Links.newBookmarkablePageLink(ID_ENTITY_LINK, pageParameters, 
pageClass);
+    }
+
+    private Label newLabel(final String id, final String title) {
+        return new Label(id, title);
+    }
+
+    private String titleAbbreviated(String titleString) {
+        int maxTitleLength = abbreviateTo(getModel(), titleString);
+        return abbreviated(titleString, maxTitleLength);
+    }
+
+    private String determineTitle() {
+        EntityModel model = getModel();
+        final ObjectAdapter adapter = model.getObject();
+        return adapter != null ? adapter.titleString(getContextAdapterIfAny()) 
: "(no object)";
+    }
+
+    private int abbreviateTo(EntityModel model, String titleString) {
+        if(model.getRenderingHint().isInStandaloneTableTitleColumn()) {
+            return getSettings().getMaxTitleLengthInStandaloneTables();
+        } 
+        if(model.getRenderingHint().isInParentedTableTitleColumn()) {
+            return getSettings().getMaxTitleLengthInParentedTables();
+        }
+        return titleString.length();
+    }
+
+    protected Image newImage(final String id, final ObjectAdapter adapter) {
+        final ResourceReference imageResource = 
imageCache.resourceReferenceFor(adapter);
+         
+        final Image image = new Image(id, imageResource) {
+            private static final long serialVersionUID = 1L;
+            @Override
+            protected boolean shouldAddAntiCacheParameter() {
+                return false;
+            }
+        };
+        return image;
+    }
+
+    public ObjectAdapter getContextAdapterIfAny() {
+        EntityModel model = getModel();
+        ObjectAdapterMemento contextAdapterMementoIfAny = 
model.getContextAdapterIfAny();
+        return contextAdapterMementoIfAny != null? 
contextAdapterMementoIfAny.getObjectAdapter(ConcurrencyChecking.NO_CHECK): null;
+    }
+    
+    static String abbreviated(final String str, final int maxLength) {
+        int length = str.length();
+        if (length <= maxLength) {
+            return str;
+        }
+        return maxLength <= 3 ? "" : str.substring(0, maxLength - 3) + "...";
+    }
+
+    
+    
+    // ///////////////////////////////////////////////////////////////////
+    // Convenience
+    // ///////////////////////////////////////////////////////////////////
+
+    protected PageClassRegistry getPageClassRegistry() {
+        final PageClassRegistryAccessor pcra = (PageClassRegistryAccessor) 
getApplication();
+        return pcra.getPageClassRegistry();
+    }
+
+
+    // ///////////////////////////////////////////////
+    // Dependency Injection
+    // ///////////////////////////////////////////////
+
+    @Inject
+    private ImageResourceCache imageCache;
+    protected ImageResourceCache getImageCache() {
+        return imageCache;
+    }
+    
+    @Inject
+    private WicketViewerSettings settings;
+    protected WicketViewerSettings getSettings() {
+        return settings;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanelFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanelFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanelFactory.java
new file mode 100644
index 0000000..9a2db9b
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanelFactory.java
@@ -0,0 +1,46 @@
+/*
+ *  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.icontitle;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import 
org.apache.isis.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
+
+/**
+ * {@link ComponentFactory} for {@link EntityIconAndTitlePanel}.
+ */
+public class EntityIconAndTitlePanelFactory extends 
EntityComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public EntityIconAndTitlePanelFactory() {
+        super(ComponentType.ENTITY_ICON_AND_TITLE, 
EntityIconAndTitlePanel.class);
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityModel entityModel = (EntityModel) model;
+        return new EntityIconAndTitlePanel(id, entityModel);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.html
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.html
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.html
new file mode 100644
index 0000000..18b0521
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.html
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+    <body>
+        <wicket:extend>
+             <span wicket:id="copyLink"></span>
+        </wicket:extend>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.java
new file mode 100644
index 0000000..e6500b9
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanel.java
@@ -0,0 +1,49 @@
+/*
+ *  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.icontitle;
+
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import 
org.apache.isis.viewer.wicket.ui.components.widgets.zclip.ZeroClipboardPanel;
+
+/**
+ * An extension of {@link 
org.apache.isis.viewer.wicket.ui.components.entity.icontitle.EntityIconAndTitlePanel}
+ * that additionally has a link allowing to copy the url to the shown entity
+ */
+public class EntityIconTitleAndCopyLinkPanel extends EntityIconAndTitlePanel {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String ID_COPY_LINK = "copyLink";
+
+    public EntityIconTitleAndCopyLinkPanel(final String id, final EntityModel 
entityModel) {
+        super(id, entityModel);
+    }
+
+    @Override
+    protected WebMarkupContainer addOrReplaceLinkWrapper(final EntityModel 
entityModel) {
+        WebMarkupContainer linkWrapper = 
super.addOrReplaceLinkWrapper(entityModel);
+
+        ZeroClipboardPanel zClipCopyLink = new 
ZeroClipboardPanel(ID_COPY_LINK, entityModel);
+        linkWrapper.add(zClipCopyLink);
+
+        return linkWrapper;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d84c6609/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanelFactory.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanelFactory.java
 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanelFactory.java
new file mode 100644
index 0000000..a13e1dd
--- /dev/null
+++ 
b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconTitleAndCopyLinkPanelFactory.java
@@ -0,0 +1,44 @@
+/*
+ *  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.icontitle;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import 
org.apache.isis.viewer.wicket.ui.components.entity.EntityComponentFactoryAbstract;
+
+/**
+ * {@link org.apache.isis.viewer.wicket.ui.ComponentFactory} for {@link 
org.apache.isis.viewer.wicket.ui.components.entity.icontitle.EntityIconAndTitlePanel}.
+ */
+public class EntityIconTitleAndCopyLinkPanelFactory extends 
EntityComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public EntityIconTitleAndCopyLinkPanelFactory() {
+        super(ComponentType.ENTITY_ICON_TITLE_AND_COPYLINK, 
EntityIconTitleAndCopyLinkPanel.class);
+    }
+
+    @Override
+    public Component createComponent(final String id, final IModel<?> model) {
+        final EntityModel entityModel = (EntityModel) model;
+        return new EntityIconTitleAndCopyLinkPanel(id, entityModel);
+    }
+}

Reply via email to