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 2014/11/11 09:24:59 UTC

[36/44] isis git commit: ISIS-537: continuing to pull out BulkActionsHelper (move bulk actions to panel header for standalone collection panel)

ISIS-537: continuing to pull out BulkActionsHelper (move bulk actions to panel header for standalone collection panel)


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

Branch: refs/heads/master
Commit: 9bad91796ccba1ebca747a387b48fee8213c78a1
Parents: 276472f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Nov 10 19:56:22 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Nov 10 19:56:22 2014 +0000

----------------------------------------------------------------------
 .../selector/CollectionSelectorHelper.java      |  26 +--
 .../selector/CollectionSelectorPanel.java       |   4 +-
 .../ajaxtable/BulkActionsHelper.java            |   5 +-
 .../ajaxtable/BulkActionsLinkFactory.java       |  18 +-
 .../ajaxtable/BulkActionsProvider.java          |   6 +-
 .../CollectionContentsAsAjaxTablePanel.html     |   8 +-
 .../CollectionContentsAsAjaxTablePanel.java     | 223 ++++++++-----------
 .../columns/ObjectAdapterToggleboxColumn.java   |  20 +-
 .../CollectionContentsMultipleViewsPanel.java   |   6 +-
 .../collections/EntityCollectionsPanel.java     |   4 +-
 .../StandaloneCollectionPanel.html              |   5 +-
 .../StandaloneCollectionPanel.java              | 143 +++++++++++-
 12 files changed, 286 insertions(+), 182 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
index dfcdbf5..eed5607 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.viewer.wicket.ui.components.collection.selector;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import com.google.common.base.Predicate;
@@ -38,30 +39,29 @@ import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.multiple.CollectionContentsMultipleViewsPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.unresolved.CollectionContentsAsUnresolvedPanelFactory;
 
-public class CollectionSelectorHelper {
+public class CollectionSelectorHelper implements Serializable {
+
+    private static final long serialVersionUID = 1L;
 
     static final String UIHINT_EVENT_VIEW_KEY = "view";
 
-    private final ComponentType componentType;
-    private final ComponentFactoryRegistry componentFactoryRegistry;
+    private static final ComponentFactory ignoreFactory = new CollectionContentsMultipleViewsPanelFactory();
+    private static final ComponentType componentType = ComponentType.COLLECTION_CONTENTS; // this.ignoreFactory.getComponentType();;
+
     private final EntityCollectionModel model;
-    private final ComponentFactory ignoreFactory;
     private final List<ComponentFactory> componentFactories;
 
-
     public CollectionSelectorHelper(
             final EntityCollectionModel model,
-            final ComponentFactoryRegistry componentFactoryRegistry,
-            final ComponentFactory ignoreFactory) {
-        this.componentFactoryRegistry = componentFactoryRegistry;
+            final ComponentFactoryRegistry componentFactoryRegistry) {
         this.model = model;
-        this.ignoreFactory = ignoreFactory;
-        this.componentType = ignoreFactory.getComponentType();
-
-        componentFactories = findOtherComponentFactories();
+        this.componentFactories = findOtherComponentFactories(componentFactoryRegistry);
     }
 
-    public List<ComponentFactory> findOtherComponentFactories() {
+    public List<ComponentFactory> findOtherComponentFactories(ComponentFactoryRegistry componentFactoryRegistry) {
+        if(componentFactories != null) {
+            return componentFactories;
+        }
         final List<ComponentFactory> componentFactories = componentFactoryRegistry.findComponentFactories(componentType, model);
         ArrayList<ComponentFactory> otherFactories = Lists.newArrayList(Collections2.filter(componentFactories, new Predicate<ComponentFactory>() {
             @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
index cb8d0f2..8cdc710 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
@@ -74,7 +74,7 @@ public class CollectionSelectorPanel
     public CollectionSelectorPanel(final String id, final EntityCollectionModel model, final ComponentFactory ignoreFactory) {
         super(id, model);
         this.componentType = ignoreFactory.getComponentType();
-        selectorHelper = new CollectionSelectorHelper(model, getComponentFactoryRegistry(), ignoreFactory);
+        selectorHelper = new CollectionSelectorHelper(model, getComponentFactoryRegistry());
     }
 
     /**
@@ -88,7 +88,7 @@ public class CollectionSelectorPanel
 
 
     private void addDropdown() {
-        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
+        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories(getComponentFactoryRegistry());
         final int selected = selectorHelper.honourViewHintElseDefault(this);
 
         // selector

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsHelper.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsHelper.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsHelper.java
index e7b1b66..0c2822f 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsHelper.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsHelper.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
 import com.google.common.base.Predicate;
@@ -31,10 +32,12 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 
-public class BulkActionsHelper {
+public class BulkActionsHelper implements Serializable {
 
     private final EntityCollectionModel model;
 
+    private static final long serialVersionUID = 1L;
+
     public BulkActionsHelper(final EntityCollectionModel model) {
         this.model = model;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
index 826aebf..efc68c1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
@@ -23,7 +23,6 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.apache.wicket.Session;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.isis.applib.RecoverableException;
@@ -54,26 +53,21 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFac
 import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuItem;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
 
-final class BulkActionsLinkFactory implements ActionLinkFactory {
+public final class BulkActionsLinkFactory implements ActionLinkFactory {
     
     private static final long serialVersionUID = 1L;
     private final EntityCollectionModel model;
     
-    @SuppressWarnings("unused")
-    private final DataTable<ObjectAdapter,String> dataTable;
-    private ObjectAdapterToggleboxColumn toggleboxColumn;
+    private final ObjectAdapterToggleboxColumn toggleboxColumn;
 
-    BulkActionsLinkFactory(
-            final EntityCollectionModel model, 
-            final DataTable<ObjectAdapter,String> dataTable) {
+    public BulkActionsLinkFactory(
+            final EntityCollectionModel model,
+            final ObjectAdapterToggleboxColumn toggleboxColumn) {
         this.model = model;
-        this.dataTable = dataTable;
-    }
-
-    public void setToggleboxColumn(ObjectAdapterToggleboxColumn toggleboxColumn) {
         this.toggleboxColumn = toggleboxColumn;
     }
 
+
     @Override
     public LinkAndLabel newLink(
             final ObjectAdapterMemento serviceAdapterMemento,

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
index 697f556..2ab87a3 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsProvider.java
@@ -18,11 +18,11 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
-import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
-import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactory;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterToggleboxColumn;
 
 public interface BulkActionsProvider {
 
-    public void configureBulkActionsProvider(ActionLinkFactory linkFactory, ActionPromptProvider actionPromptProvider);
+    void configureBulkActionsProvider(ObjectAdapterToggleboxColumn toggleboxColumn);
 
+    ObjectAdapterToggleboxColumn createToggleboxColumn();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.html
index 31c0121..694f262 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.html
@@ -21,12 +21,16 @@
     <body>
         <wicket:panel>
             <div class="collectionContentsAsAjaxTablePanel collectionContentsComponentType">
-                <div class="entityActions" wicket:id="entityActions"></div>
+                <!--
+                <div class="entityActions" xxxwicket:id="entityActions"></div>
+                -->
                 <div class="clearfix"></div>
                 <div class="table-responsive">
                     <table class="contents table table-striped table-condensed table-hover table-bordered" cellspacing="0" wicket:id="table">[table]</table>
                 </div>
-                <div wicket:id="actionPromptModalWindow"></div>
+                <!--
+                <div xxxwicket:id="actionPromptModalWindow"></div>
+                -->
             </div>
         </wicket:panel>
     </body>

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 74ec5d9..b53427b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -20,7 +20,6 @@
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
 import java.util.List;
-import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import org.apache.wicket.Component;
@@ -40,25 +39,17 @@ import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 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.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.viewer.wicket.model.common.SelectionHandler;
 import org.apache.isis.viewer.wicket.model.hints.UiHintPathSignificant;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-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.ActionPrompt;
-import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
-import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow;
 import org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ColumnAbstract;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterPropertyColumn;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterTitleColumn;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterToggleboxColumn;
-import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactory;
-import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuBuilder;
-import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuPanel;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
 
@@ -66,19 +57,16 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
  * {@link PanelAbstract Panel} that represents a {@link EntityCollectionModel
  * collection of entity}s rendered using {@link AjaxFallbackDefaultDataTable}.
  */
-public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityCollectionModel> implements CollectionCountProvider, ActionPromptProvider, BulkActionsProvider, UiHintPathSignificant {
+public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityCollectionModel> implements CollectionCountProvider /*, ActionPromptProvider, BulkActionsProvider */, UiHintPathSignificant {
 
     private static final long serialVersionUID = 1L;
 
     private static final String ID_TABLE = "table";
     private static final String ID_ACTION_PROMPT_MODAL_WINDOW = "actionPromptModalWindow";
-
     private static final String ID_ENTITY_ACTIONS = "entityActions";
 
-    @SuppressWarnings("deprecation")
-    private static final Predicate<ObjectAction> BULK = Filters.asPredicate(ObjectAction.Filters.bulk());
-    
     private IsisAjaxFallbackDataTable<ObjectAdapter,String> dataTable;
+
     private final BulkActionsHelper bulkActionsHelper;
 
 
@@ -94,14 +82,51 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
     }
 
     private void buildGui() {
-        final EntityCollectionModel model = getModel();
 
         final List<IColumn<ObjectAdapter,String>> columns = Lists.newArrayList();
 
-        List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions();
+        // bulkactions
+        final BulkActionsProvider bulkActionsProvider = getBulkActionsProvider();
+
+        ObjectAdapterToggleboxColumn toggleboxColumn = null;
+        if(bulkActionsProvider != null) {
+
+//            List<ObjectAction> bulkActions = bulkActionsProvider.getBulkActions();
+//            if(!bulkActions.isEmpty()) {
+
+            toggleboxColumn = bulkActionsProvider.createToggleboxColumn();
+            if(toggleboxColumn != null) {
+                columns.add(toggleboxColumn);
+            }
+            bulkActionsProvider.configureBulkActionsProvider(toggleboxColumn);
+
+//            }
+
+        }
+
+//        } else {
+//        if(bulkActions.isEmpty() || getModel().isParented()) {
+//            //permanentlyHide(ID_ENTITY_ACTIONS);
+//            getBulkActionsProvider().configureBulkActionsProvider(null, null);
+//        } else {
+
+//            actionLinkFactoryDelegating = new ActionLinkFactoryDelegating();
+//            actionPromptProviderDelegating = new ActionPromptProviderDelegating();
+
+            //getBulkActionsProvider().configureBulkActionsProvider(linkFactory, this);
+//            getBulkActionsProvider().configureBulkActionsProvider(linkFactory, null);
+
+//            final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(null, bulkActions, actionLinkFactoryDelegating, actionPromptProviderDelegating, null);
+//            final CssMenuPanel cssMenuPanel = cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions");
+//
+//            this.addOrReplace(cssMenuPanel);
 
-        final ObjectAdapterToggleboxColumn toggleboxColumn = addToggleboxColumnIfRequired(columns, bulkActions);
+  //      }
 
+        //List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions();
+
+
+        final EntityCollectionModel model = getModel();
         addTitleColumn(columns, model.getParentObjectAdapterMemento(), getSettings().getMaxTitleLengthInStandaloneTables(), getSettings().getMaxTitleLengthInStandaloneTables());
         addPropertyColumnsIfRequired(columns);
 
@@ -110,71 +135,55 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
         addOrReplace(dataTable);
         dataTable.honourHints();
 
-        addActionPromptModalWindow();
-
-        // bulkactions
-        if(bulkActions.isEmpty() || getModel().isParented()) {
-            permanentlyHide(ID_ENTITY_ACTIONS);
-        } else {
-            BulkActionsLinkFactory linkFactory = new BulkActionsLinkFactory(getModel(), dataTable);
-            linkFactory.setToggleboxColumn(toggleboxColumn);
+        if(toggleboxColumn != null) {
+            final SelectionHandler handler = new SelectionHandler() {
 
-            actionLinkFactoryDelegating = new ActionLinkFactoryDelegating();
-            actionPromptProviderDelegating = new ActionPromptProviderDelegating();
+                private static final long serialVersionUID = 1L;
 
-            getBulkActionsProvider().configureBulkActionsProvider(linkFactory, this);
+                @Override
+                public void onSelected(
+                        final Component context,
+                        final ObjectAdapter selectedAdapter,
+                        final AjaxRequestTarget ajaxRequestTarget) {
+                    model.toggleSelectionOn(selectedAdapter);
+                }
 
-            final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(null, bulkActions, actionLinkFactoryDelegating, actionPromptProviderDelegating, null);
-            final CssMenuPanel cssMenuPanel = cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions");
+                @Override
+                public void onConcurrencyException(
+                        final Component context,
+                        final ObjectAdapter selectedAdapter,
+                        final ConcurrencyException ex,
+                        final AjaxRequestTarget ajaxRequestTarget) {
 
-            this.addOrReplace(cssMenuPanel);
+                    // this causes the row to be repainted
+                    // but it isn't possible (yet) to raise any warning
+                    // because that only gets flushed on page refresh.
+                    //
 
+                    // perhaps something to tackle in a separate ticket....
+                    ajaxRequestTarget.add(dataTable);
+                }
+            };
+            toggleboxColumn.setHandler(handler);
         }
-    }
 
-    private BulkActionsProvider getBulkActionsProvider() {
-        return this;
-    }
-
-    private ObjectAdapterToggleboxColumn addToggleboxColumnIfRequired(
-            final List<IColumn<ObjectAdapter,String>> columns,
-            final List<ObjectAction> bulkActions) {
-        final EntityCollectionModel entityCollectionModel = getModel();
-        if(bulkActions.isEmpty() || entityCollectionModel.isParented()) {
-            return null;
-        }
-        
-        ObjectAdapterToggleboxColumn toggleboxColumn = new ObjectAdapterToggleboxColumn(new SelectionHandler() {
-            
-            private static final long serialVersionUID = 1L;
+        //addActionPromptModalWindow();
 
-            @Override
-            public void onSelected(
-                    final Component context, final ObjectAdapter selectedAdapter,
-                    AjaxRequestTarget ajaxRequestTarget) {
-                entityCollectionModel.toggleSelectionOn(selectedAdapter);
-            }
+    }
 
-            @Override
-            public void onConcurrencyException(
-                    final Component context, ObjectAdapter selectedAdapter, 
-                    ConcurrencyException ex,
-                    AjaxRequestTarget ajaxRequestTarget) {
-                
-                // this causes the row to be repainted
-                // but it isn't possible (yet) to raise any warning
-                // because that only gets flushed on page refresh.
-                //
-                
-                // perhaps something to tackle in a separate ticket....
-                ajaxRequestTarget.add(dataTable);
+    private BulkActionsProvider getBulkActionsProvider() {
+        Component component = this;
+        while(component != null) {
+            if(component instanceof BulkActionsProvider) {
+                return (BulkActionsProvider) component;
             }
-        });
-        columns.add(toggleboxColumn);
-        return toggleboxColumn;
+            component = component.getParent();
+        }
+        return null;
     }
 
 
+
     private void addTitleColumn(final List<IColumn<ObjectAdapter,String>> columns, ObjectAdapterMemento parentAdapterMementoIfAny, int maxTitleParented, int maxTitleStandalone) {
         int maxTitleLength = getModel().isParented()? maxTitleParented: maxTitleStandalone;
         columns.add(new ObjectAdapterTitleColumn(parentAdapterMementoIfAny, maxTitleLength));
@@ -249,19 +258,19 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
     //endregion
 
 
-    //region > ActionPromptModalWindowProvider
-    
-    private ActionPromptModalWindow actionPromptModalWindow;
-    public ActionPromptModalWindow getActionPrompt() {
-        return ActionPromptModalWindow.getActionPromptModalWindowIfEnabled(actionPromptModalWindow);
-    }
-    
-    private void addActionPromptModalWindow() {
-        this.actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW); 
-        addOrReplace(actionPromptModalWindow);
-    }
-
-    //endregion
+//    //region > ActionPromptModalWindowProvider
+//
+//    private ActionPromptModalWindow actionPromptModalWindow;
+//    public ActionPromptModalWindow getActionPrompt() {
+//        return ActionPromptModalWindow.getActionPromptModalWindowIfEnabled(actionPromptModalWindow);
+//    }
+//
+//    private void addActionPromptModalWindow() {
+//        this.actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW);
+//        addOrReplace(actionPromptModalWindow);
+//    }
+//
+//    //endregion
 
     // //////////////////////////////////////
     
@@ -287,56 +296,6 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
     // //////////////////////////////////////
 
 
-    private ActionPromptProviderDelegating actionPromptProviderDelegating;
-    private ActionLinkFactoryDelegating actionLinkFactoryDelegating;
-
-    @Override
-    public void configureBulkActionsProvider(
-            final ActionLinkFactory linkFactory,
-            final ActionPromptProvider actionPromptProvider) {
-        actionLinkFactoryDelegating.setDelegate(linkFactory);
-        actionPromptProviderDelegating.setDelegate(actionPromptProvider);
-    }
-
-    public static class ActionLinkFactoryDelegating implements ActionLinkFactory {
-
-        private ActionLinkFactory delegate;
-
-        public ActionLinkFactory getDelegate() {
-            return delegate;
-        }
-
-        public void setDelegate(ActionLinkFactory delegate) {
-            this.delegate = delegate;
-        }
-
-        @Override
-        public LinkAndLabel newLink(
-                final ObjectAdapterMemento adapter,
-                final ObjectAction noAction,
-                final String linkId,
-                final ActionPromptProvider actionPromptProvider) {
-            return delegate.newLink(adapter, noAction, linkId, actionPromptProvider);
-        }
-    }
-
-    public static class ActionPromptProviderDelegating implements ActionPromptProvider {
-
-        private ActionPromptProvider delegate;
-
-        public ActionPromptProvider getDelegate() {
-            return delegate;
-        }
-
-        public void setDelegate(ActionPromptProvider delegate) {
-            this.delegate = delegate;
-        }
-
-        @Override
-        public ActionPrompt getActionPrompt() {
-            return delegate.getActionPrompt();
-        }
-    }
 
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
index 954a25a..31bb8ce 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
@@ -39,13 +39,21 @@ public final class ObjectAdapterToggleboxColumn extends ColumnAbstract<ObjectAda
 
     private static final long serialVersionUID = 1L;
 
-    private final SelectionHandler handler;
+    private SelectionHandler handler;
 
+    public ObjectAdapterToggleboxColumn() {
+        this(null);
+    }
+    
     public ObjectAdapterToggleboxColumn(final SelectionHandler handler) {
         super("");
         this.handler = handler;
     }
-    
+
+    public void setHandler(SelectionHandler handler) {
+        this.handler = handler;
+    }
+
     @Override
     public Component getHeader(String componentId) {
         
@@ -82,12 +90,16 @@ public final class ObjectAdapterToggleboxColumn extends ColumnAbstract<ObjectAda
                 ObjectAdapter selectedAdapter = null;
                 try {
                     selectedAdapter = entityModel.load(ConcurrencyChecking.CHECK);
-                    handler.onSelected(this, selectedAdapter, target);
+                    if(handler != null) {
+                        handler.onSelected(this, selectedAdapter, target);
+                    }
                 } catch(ConcurrencyException ex) {
 
                     // should work second time, because the previous attempt will have updated the OAM's OIDs version.
                     selectedAdapter = entityModel.load(ConcurrencyChecking.CHECK);
-                    handler.onConcurrencyException(this, selectedAdapter, ex, target);
+                    if(handler != null) {
+                        handler.onConcurrencyException(this, selectedAdapter, ex, target);
+                    }
                     
                     entityModel.setException(ex);
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java
index 49db84a..e4a37b3 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/multiple/CollectionContentsMultipleViewsPanel.java
@@ -75,7 +75,7 @@ public class CollectionContentsMultipleViewsPanel
         this.ignoreFactory = ignoreFactory;
         this.underlyingIdPrefix = ComponentType.COLLECTION_CONTENTS.toString();
         this.componentType = ignoreFactory.getComponentType();
-        selectorHelper = new CollectionSelectorHelper(model, getComponentFactoryRegistry(), ignoreFactory);
+        selectorHelper = new CollectionSelectorHelper(model, getComponentFactoryRegistry());
 
     }
 
@@ -92,7 +92,7 @@ public class CollectionContentsMultipleViewsPanel
         final EntityCollectionModel model = getModel();
 
         final int selected = selectorHelper.honourViewHintElseDefault(getSelectorDropdownPanel());
-        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
+        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories(getComponentFactoryRegistry());
 
         // create all, hide the one not selected
         underlyingViews = new Component[MAX_NUM_UNDERLYING_VIEWS];
@@ -140,7 +140,7 @@ public class CollectionContentsMultipleViewsPanel
         int underlyingViewNum = 0;
         String viewStr = uiHintContainer.getHint(this.getSelectorDropdownPanel(), UIHINT_VIEW);
 
-        List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
+        List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories(getComponentFactoryRegistry());
 
         if(viewStr != null) {
             try {

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
index 876177d..beee965 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collections/EntityCollectionsPanel.java
@@ -128,9 +128,9 @@ public class EntityCollectionsPanel extends PanelAbstract<EntityModel> {
         AdditionalLinksPanel additionalLinks = new AdditionalLinksPanel(ID_ADDITIONAL_LINKS, links);
         fieldset.addOrReplace(additionalLinks);
 
-        final CollectionSelectorHelper selectorHelper = new CollectionSelectorHelper(entityCollectionModel, getComponentFactoryRegistry(), new CollectionContentsMultipleViewsPanelFactory());
+        final CollectionSelectorHelper selectorHelper = new CollectionSelectorHelper(entityCollectionModel, getComponentFactoryRegistry());
 
-        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
+        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories(getComponentFactoryRegistry());
 
         if (componentFactories.size() <= 1) {
             permanentlyHide(ID_SELECTOR_DROPDOWN);

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html
index d09c0bd..194d8fa 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.html
@@ -25,17 +25,16 @@
     <body>
         <wicket:panel>
 
+            <div wicket:id="actionPromptModalWindow"></div>
             <div class="standaloneCollectionPanel actionComponentType myBlockContainer panel panel-default">
                 <div class="iconAndTitle panel-heading actionPanelHeaderNew">
                      <div wicket:id="actionName" class="actionName panel-title">[action name]</div>
 
                     <div class="pull-right">
 
-                        <!--
                         <div class="btn-group">
-                            <div xxxwicket:id="additionalLinks"></div>
+                            <div class="entityActions" wicket:id="entityActions"></div>
                         </div>
-                        -->
                         <div class="btn-group">
                             <span wicket:id="selectorDropdown"/>
                         </div>

http://git-wip-us.apache.org/repos/asf/isis/blob/9bad9179/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
index 7ac4640..a4e76ce 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/standalonecollection/StandaloneCollectionPanel.java
@@ -22,33 +22,48 @@ package org.apache.isis.viewer.wicket.ui.components.standalonecollection;
 import java.util.List;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
-
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
+import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
+import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow;
 import org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
 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.collection.selector.CollectionSelectorProvider;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.BulkActionsHelper;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.BulkActionsLinkFactory;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.BulkActionsProvider;
+import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterToggleboxColumn;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.multiple.CollectionContentsMultipleViewsPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactory;
+import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuBuilder;
+import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuPanel;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
 public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionModel>
-        implements CollectionCountProvider, CollectionSelectorProvider {
+        implements CollectionCountProvider, CollectionSelectorProvider, BulkActionsProvider, ActionPromptProvider {
 
     private static final long serialVersionUID = 1L;
 
     private static final String ID_ACTION_NAME = "actionName";
-    private static final String ID_ADDITIONAL_LINKS = "additionalLinks";
+
+    private static final String ID_ACTION_PROMPT_MODAL_WINDOW = "actionPromptModalWindow";
+    private static final String ID_ENTITY_ACTIONS = "entityActions";
+
     private static final String ID_SELECTOR_DROPDOWN = "selectorDropdown";
     private CollectionSelectorPanel selectorDropdownPanel;
 
+    private final BulkActionsHelper bulkActionsHelper;
+
     public StandaloneCollectionPanel(final String id, final EntityCollectionModel entityCollectionModel) {
         super(id, entityCollectionModel);
         buildGui(entityCollectionModel);
+
+        bulkActionsHelper = new BulkActionsHelper(entityCollectionModel);
     }
 
     private void buildGui(final EntityCollectionModel entityCollectionModel) {
@@ -57,9 +72,24 @@ public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionMod
         ObjectAction action = actionModel.getActionMemento().getAction();
         addOrReplace(new Label(StandaloneCollectionPanel.ID_ACTION_NAME, Model.of(action.getName())));
 
-        final CollectionSelectorHelper selectorHelper = new CollectionSelectorHelper(entityCollectionModel, getComponentFactoryRegistry(), new CollectionContentsMultipleViewsPanelFactory());
+        final CollectionSelectorHelper selectorHelper = new CollectionSelectorHelper(entityCollectionModel, getComponentFactoryRegistry());
+
+        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories(getComponentFactoryRegistry());
+
+
+
+        addActionPromptModalWindow();
+
+        // bulkactions ... in configureBulkActionsProvider
+
+//        List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions();
+//
+//        if(bulkActions.isEmpty() || getModel().isParented()) {
+//            permanentlyHide(ID_ENTITY_ACTIONS);
+//        } else {
+//
+//        }
 
-        final List<ComponentFactory> componentFactories = selectorHelper.findOtherComponentFactories();
 
         if (componentFactories.size() <= 1) {
             permanentlyHide(ID_SELECTOR_DROPDOWN);
@@ -94,4 +124,107 @@ public class StandaloneCollectionPanel extends PanelAbstract<EntityCollectionMod
     public CollectionSelectorPanel getSelectorDropdownPanel() {
         return selectorDropdownPanel;
     }
+
+
+
+    //region > ActionPromptModalWindowProvider
+
+    private ActionPromptModalWindow actionPromptModalWindow;
+    public ActionPromptModalWindow getActionPrompt() {
+        return ActionPromptModalWindow.getActionPromptModalWindowIfEnabled(actionPromptModalWindow);
+    }
+
+    private void addActionPromptModalWindow() {
+        this.actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW);
+        addOrReplace(actionPromptModalWindow);
+    }
+
+    //endregion
+
+
+
+
+    @Override
+    public void configureBulkActionsProvider(ObjectAdapterToggleboxColumn toggleboxColumn) {
+        BulkActionsLinkFactory linkFactory = new BulkActionsLinkFactory(getModel(), toggleboxColumn);
+        configureBulkActionsProvider(linkFactory, this);
+    }
+
+    private void configureBulkActionsProvider(
+            final ActionLinkFactory linkFactory,
+            final ActionPromptProvider actionPromptProvider) {
+
+        if(linkFactory != null) {
+            final List<ObjectAction> bulkActions = bulkActionsHelper.getBulkActions();
+
+            final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(null, bulkActions, linkFactory, actionPromptProvider != null? actionPromptProvider: this, null);
+            final CssMenuPanel cssMenuPanel = cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions");
+
+            addOrReplace(cssMenuPanel);
+
+        } else {
+            permanentlyHide(ID_ENTITY_ACTIONS);
+
+        }
+    }
+
+
+    private List<ObjectAction> getBulkActions() {
+        return bulkActionsHelper.getBulkActions();
+    }
+
+//    public static class ActionLinkFactoryDelegating implements ActionLinkFactory {
+//
+//        private ActionLinkFactory delegate;
+//
+//        public ActionLinkFactory getDelegate() {
+//            return delegate;
+//        }
+//
+//        public void setDelegate(ActionLinkFactory delegate) {
+//            this.delegate = delegate;
+//        }
+//
+//        @Override
+//        public LinkAndLabel newLink(
+//                final ObjectAdapterMemento adapter,
+//                final ObjectAction noAction,
+//                final String linkId,
+//                final ActionPromptProvider actionPromptProvider) {
+//            return delegate.newLink(adapter, noAction, linkId, actionPromptProvider);
+//        }
+//    }
+//
+//    public static class ActionPromptProviderDelegating implements ActionPromptProvider {
+//
+//        private ActionPromptProvider delegate;
+//
+//        public ActionPromptProvider getDelegate() {
+//            return delegate;
+//        }
+//
+//        public void setDelegate(ActionPromptProvider delegate) {
+//            this.delegate = delegate;
+//        }
+//
+//        @Override
+//        public ActionPrompt getActionPrompt() {
+//            return delegate.getActionPrompt();
+//        }
+//    }
+
+
+    @Override
+    public ObjectAdapterToggleboxColumn createToggleboxColumn() {
+
+        final List<ObjectAction> bulkActions = getBulkActions();
+
+        final EntityCollectionModel entityCollectionModel = getModel();
+        if(bulkActions.isEmpty() || entityCollectionModel.isParented()) {
+            return null;
+        }
+
+        return new ObjectAdapterToggleboxColumn();
+    }
+
 }