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/12/03 08:53:09 UTC

[3/5] isis git commit: ISIS-963: primary, secondary and tertiary menu support.

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
index aa40774..b7f1127 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesForm.java
@@ -75,8 +75,8 @@ import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.AdditionalLinksPanel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+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.widgets.containers.UiHintPathSignificantWebMarkupContainer;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
index ed4389a..2bd7cf1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/selector/links/EntityLinksSelectorPanel.java
@@ -50,7 +50,7 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.CollectionContentsAsFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 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;

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index ad93822..5aaeddc 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -43,7 +43,7 @@ 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.models.EntityModel.RenderingHint;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
@@ -168,7 +168,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
      * Bit of a hack, but is an API to force the eager building of this component such that focus can be placed on it.
      *
      * <p>
-     *     This is used in {@link org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.ActionLinkFactoryAbstract}
+     *     This is used in {@link org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLinkFactoryAbstract}
      *     when creating the action prompt parameters panel.
      * </p>
      */

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index f47e54d..6e41fd5 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -38,7 +38,7 @@ import org.apache.isis.core.metamodel.facets.objpropparam.typicallen.TypicalLeng
 import org.apache.isis.core.metamodel.facets.propparam.maxlen.MaxLengthFacet;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
index b6c6c8e..617f24d 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
@@ -51,7 +51,7 @@ import org.apache.isis.core.commons.lang.CloseableExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.util.Components;

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
index cd57534..ff670f9 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
@@ -33,7 +33,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index e580d77..7f925dc 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -46,7 +46,7 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.additionallinks.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/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 89e7b50..101f26e 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
@@ -37,7 +37,7 @@ 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.additionallinks.AdditionalLinksPanel;
+import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsHelper;
 import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsLinkFactory;
 import org.apache.isis.viewer.wicket.ui.components.collection.bulk.BulkActionsProvider;

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java
deleted file mode 100644
index 9e3ca0a..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  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.widgets.cssmenu;
-
-import java.io.Serializable;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-public interface ActionLinkFactory extends Serializable {
-
-    LinkAndLabel newLink(
-            final ObjectAdapterMemento adapter,
-            final ObjectAction noAction,
-            final String linkId);
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java
deleted file mode 100644
index 1142d14..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ActionLinkFactoryAbstract.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- *  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.widgets.cssmenu;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
-import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
-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.app.registry.ComponentFactoryRegistryAccessor;
-import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptHeaderPanel;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.AjaxDeferredBehaviour.OpenUrlStrategy;
-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.util.CssClassAppender;
-
-public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
-
-    private static final long serialVersionUID = 1L;
-
-    protected AbstractLink newLink(
-            final String linkId,
-            final ObjectAdapter objectAdapter,
-            final ObjectAction action) {
-        
-        final ActionModel actionModel = ActionModel.create(objectAdapter, action);
-
-        final AjaxDeferredBehaviour ajaxDeferredBehaviour = determineDeferredBehaviour(action, actionModel);
-
-        final AbstractLink link = new AjaxLink<Object>(linkId) {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public void onClick(AjaxRequestTarget target) {
-
-                if(ajaxDeferredBehaviour != null) {
-                    ajaxDeferredBehaviour.initiate(target);
-                } else {
-                    final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(getPage());
-                    final ActionPrompt actionPrompt = promptProvider.getActionPrompt();
-                    ActionPromptHeaderPanel titlePanel = new ActionPromptHeaderPanel(actionPrompt.getTitleId(), actionModel);
-                    final ActionPanel actionPanel =
-                            (ActionPanel) getComponentFactoryRegistry().createComponent(
-                                    ComponentType.ACTION_PROMPT, actionPrompt.getContentId(), actionModel);
-
-                    actionPanel.setShowHeader(false);
-
-                    actionPrompt.setTitle(titlePanel, target);
-                    actionPrompt.setPanel(actionPanel, target);
-                    actionPanel.setActionPrompt(actionPrompt);
-                    actionPrompt.showPrompt(target);
-
-                    focusOnFirstParameter(target, actionPanel);
-                }
-            }
-
-            private void focusOnFirstParameter(AjaxRequestTarget target, ActionPanel actionPanel) {
-
-                // first, force all parameters to build themselves...
-                actionPanel.visitChildren(new IVisitor<Component, Component>() {
-                    @Override
-                    public void component(Component object, IVisit<Component> visit) {
-                        if (object instanceof ScalarPanelAbstract) {
-                            ScalarPanelAbstract spa = (ScalarPanelAbstract) object;
-                            spa.forceBuildGui();
-                            visit.dontGoDeeper();
-                        }
-                    }
-                });
-
-                // second, go searching for the first <input> in the action panel.
-                final Component actionPanelFirstParam = actionPanel.visitChildren(new IVisitor<Component, Component>() {
-                    @Override
-                    public void component(Component object, IVisit<Component> visit) {
-                        if (object instanceof FormComponent &&
-                            !"scalarIfCompact".equals(object.getId()) &&
-                            object.getOutputMarkupId()) {
-                            // there are components for 'compact' and 'regular'; we want the 'regular' one
-                            // also double check that has outputMarkupId enabled (prereq for setting focus)
-                            visit.stop(object);
-                        }
-                    }
-                });
-
-                // third, if found then use Wicket API to focus on this component
-                if(actionPanelFirstParam != null) {
-                    target.focusComponent(actionPanelFirstParam);
-                }
-            }
-
-            @Override
-            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
-                super.updateAjaxAttributes(attributes);
-
-                // allow the event to bubble so the menu is hidden after click on an item
-                attributes.setEventPropagation(AjaxRequestAttributes.EventPropagation.BUBBLE);
-            }
-
-            @Override
-            protected void onComponentTag(ComponentTag tag) {
-                super.onComponentTag(tag);
-
-                Buttons.fixDisabledState(this, tag);
-            }
-        };
-
-        if(ajaxDeferredBehaviour != null) {
-            link.add(ajaxDeferredBehaviour);
-        }
-
-        link.add(new CssClassAppender("noVeil"));
-
-        return link;
-    }
-
-    private static AjaxDeferredBehaviour determineDeferredBehaviour(final ObjectAction action, final ActionModel actionModel) {
-        // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
-        if(isNoArgReturnTypeRedirect(action)) {
-            /**
-             * adapted from:
-             * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
-             */
-            return new AjaxDeferredBehaviour(OpenUrlStrategy.NEW_WINDOW) {
-                
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                protected IRequestHandler getRequestHandler() {
-                    ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
-                    final Object value = resultAdapter.getObject();
-                    return ActionModel.redirectHandler(value);
-                }
-            };
-        } 
-        if(isNoArgReturnTypeDownload(action)) {
-
-            /**
-             * adapted from:
-             * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
-             */
-            return new AjaxDeferredBehaviour(OpenUrlStrategy.SAME_WINDOW) {
-                
-                private static final long serialVersionUID = 1L;
-   
-                @Override
-                protected IRequestHandler getRequestHandler() {
-                    final ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
-                    final Object value = resultAdapter.getObject();
-                    return ActionModel.downloadHandler(value);
-                }
-            };
-        } 
-        return null;
-    }
-
-    // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
-    private static boolean isNoArgReturnTypeRedirect(final ObjectAction action) {
-        return action.getParameterCount() == 0 &&
-               action.getReturnType() != null && 
-               action.getReturnType().getCorrespondingClass() == java.net.URL.class;
-    }
-
-    // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
-    private static boolean isNoArgReturnTypeDownload(final ObjectAction action) {
-        return action.getParameterCount() == 0 && action.getReturnType() != null && 
-                (action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Blob.class ||
-                action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Clob.class);
-    }
-
-    protected LinkAndLabel newLinkAndLabel(final ObjectAction objectAction, final AbstractLink link, final String disabledReasonIfAny) {
-
-        final String label = ObjectAction.Utils.nameFor(objectAction);
-        final boolean blobOrClob = ObjectAction.Utils.returnsBlobOrClob(objectAction);
-        final boolean prototype = ObjectAction.Utils.isExplorationOrPrototype(objectAction);
-        final String actionIdentifier = ObjectAction.Utils.actionIdentifierFor(objectAction);
-        final String description = ObjectAction.Utils.descriptionOf(objectAction);
-        final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
-        final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
-        final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
-
-        return new LinkAndLabel(link, label, disabledReasonIfAny, description, blobOrClob, prototype, actionIdentifier, cssClass, cssClassFa, position);
-    }
-
-
-    // ////////////////////////////////////////////////////////////
-    // Dependencies
-    // ////////////////////////////////////////////////////////////
-    
-    protected ComponentFactoryRegistry getComponentFactoryRegistry() {
-        return ((ComponentFactoryRegistryAccessor)Application.get()).getComponentFactoryRegistry();
-    }
-    
-    protected PageClassRegistry getPageClassRegistry() {
-        return ((PageClassRegistryAccessor) Application.get()).getPageClassRegistry();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java
deleted file mode 100644
index cdf06ca..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/AjaxDeferredBehaviour.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  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.widgets.cssmenu;
-
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.behavior.AbstractAjaxBehavior;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.UrlRenderer;
-import org.apache.wicket.request.cycle.RequestCycle;
-
-import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
-
-public abstract class AjaxDeferredBehaviour extends AbstractAjaxBehavior {
-    private static final long serialVersionUID = 1L;
-
-    public static enum OpenUrlStrategy {
-        NEW_WINDOW {
-            @Override
-            public String javascriptFor(AjaxDeferredBehaviour deferredBehaviour, String url) {
-                final Url parsedUrl = Url.parse(url);
-                final RequestCycle requestCycle = deferredBehaviour.getComponent().getRequestCycle();
-                final UrlRenderer urlRenderer = requestCycle.getUrlRenderer();
-                String fullUrl = urlRenderer.renderFullUrl(parsedUrl);
-                return "function(){Wicket.Event.publish(Isis.Topic.OPEN_IN_NEW_TAB, '" + fullUrl + "');}";
-            }
-        },
-        SAME_WINDOW {
-            @Override
-            public String javascriptFor(AjaxDeferredBehaviour deferredBehaviour, String url) {
-                return "\"window.location.href='" + url + "'\"";
-            }
-        };
-
-        public abstract String javascriptFor(AjaxDeferredBehaviour deferredBehaviour, String url);
-    }
-    
-    private final OpenUrlStrategy openUrlStrategy;
-    
-    protected AjaxDeferredBehaviour(final OpenUrlStrategy openUrlStrategy) {
-        this.openUrlStrategy = openUrlStrategy;
-    }
-
-    /**
-     * Call this method to initiate the download.
-     */
-    public void initiate(AjaxRequestTarget target) {
-        String url = getCallbackUrl().toString();
-
-        url = ActionResultResponseHandlingStrategy.expanded(url);
-        String func = openUrlStrategy.javascriptFor(this, url);
-
-        // the timeout is needed to let Wicket release the channel
-        String javascriptFor = "setTimeout(" + func + ", 100);";
-        target.appendJavaScript(javascriptFor);
-    }
-
-    @Override
-    public void onRequest() {
-        IRequestHandler handler = getRequestHandler();
-        if(handler != null) {
-            getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
-        }
-    }
-
-    protected abstract IRequestHandler getRequestHandler();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css
deleted file mode 100644
index 87a8864..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.css
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- *  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.
- */
-
-
-/* copied from CssMenuPanel.css (since deleted that panel */
-
-
-
-.cssMenuPanel span.clear {
-    line-height: 3px;
-}
-
-.cssMenuPanel .menuh .small {
-    float: none;
-    display: inline;
-}
-
-.cssMenuPanel .menuh p .small {
-    float: none;
-    display: inline;
-}
-
-.menuh a,.menuh p {
-    text-align: left;
-    display: block;
-    white-space: nowrap;
-    margin: 0;
-    padding: 1px;
-    padding-right: 1.6em;
-    padding-left: 0.4em;
-    font-weight: normal;
-    cursor: default;
-}
-
-.cssMenuPanel .menuh a:hover {
-    text-decoration: underline;
-}
-
-.cssMenuPanel .menuh a.top-parent,.cssMenuPanel .menuh p.top-parent {
-    background-position: right center;
-    background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh a.top-parent:hover,.cssMenuPanel .menuh p.top-parent:hover	{
-    background-position: right center;
-    background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh a.parent,.cssMenuPanel .menuh p.parent {
-    background-position: right center;
-    background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh a.parent:hover,.cssMenuPanel .menuh p.parent:hover	{
-    background-position: right center;
-    background-repeat: no-repeat;
-}
-
-.cssMenuPanel .menuh ul {
-    list-style: none;
-    margin: 0;
-    padding: 0;
-    float: left;
-    display: inline;
-}
-
-.cssMenuPanel .menuh li {
-    position: relative;
-    min-height: 1px;
-}
-
-.cssMenuPanel .menuh ul ul {
-    position: absolute;
-    z-index: 500;
-    top: auto;
-    display: none;
-    padding: 1em;
-    margin: -1em 0 0 -1em;
-}
-
-.cssMenuPanel .menuh ul ul ul {
-    top: 0;
-    left: 100%;
-}
-
-.cssMenuPanel span.menuh a:hover {
-    cursor: pointer;
-    z-index: 100;
-}
-
-.cssMenuPanel span.menuh li:hover ul ul,.cssMenuPanel span.menuh li li:hover ul ul,.cssMenuPanel span.menuh li li li:hover ul ul,.cssMenuPanel span.menuh li li li li:hover ul ul {
-    display: none;
-}
-
-.cssMenuPanel span.menuh li:hover ul,.cssMenuPanel span.menuh li li:hover ul,.cssMenuPanel span.menuh li li li:hover ul,.cssMenuPanel span.menuh li li li li:hover ul {
-    display: block;
-}
-
-.cssMenuPanel li.cssSubMenuItem p.disabled {
-    cursor: not-allowed;
-}
-
-.cssMenuPanel li.cssSubMenuItem {
-    margin-left:0;
-}
-
-/******** overrides for grouped actions and entity actions ***************/
-.groupedActions .cssMenuPanel li.cssMenuItemPanel>p.top-parent {
-    display: none;
-}
-
-.groupedActions .cssMenuPanel .menuh ul {
-    position: relative;
-    display: block;
-    float: right;
-    margin: 0;
-    padding: 0;
-}
-
-.groupedActions .cssMenuPanel .menuh ul ul {
-    position: relative;
-    display: block;
-    float: right;
-    margin: 0;
-    padding: 0;
-}
-
-.groupedActions .cssMenuPanel .menuh li,
-.groupedActions .cssMenuPanel .menuh li p	{
-    float:left;
-    display:block;
-    margin-left:10px;
-}
-
-.groupedActions .cssMenuPanel .menuh a,.groupedActions .cssMenuPanel .menuh p
-{
-    display: inline-block;
-    border: none;
-}
-
-.groupedActions .cssMenuPanel .menuh a:link,
-.groupedActions .cssMenuPanel .menuh a:visited,
-.groupedActions .cssMenuPanel .menuh a:active,
-.groupedActions .cssMenuPanel .menuh p {
-    display: block;
-    float: left;
-    height: 30px;
-    line-height: 30px;
-    padding: 0 10px;
-    font-weight: bold;
-    /*font-size: 0.85em;*/
-    border-radius: 4px;
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    text-decoration: none;
-}
-
-.entityActions .cssMenuPanel li.cssMenuItemPanel>p.top-parent {
-    display: none;
-}
-
-.entityActions .cssMenuPanel .menuh ul {
-    position: relative;
-    display: block;
-    float: right;
-    margin: 0 0 10px;
-    padding: 0;
-}
-
-.entityActions .cssMenuPanel .menuh ul ul {
-    position: relative;
-    display: block;
-    float: right;
-    margin: 0;
-    padding: 0;
-}
-
-.entityActions .cssMenuPanel .menuh li {
-    float:left;
-    display:block;
-    margin-left:10px;
-}
-
-.entityActions .cssMenuPanel .menuh li p {
-    float:left;
-    display:block;
-    margin-left:0;
-}
-
-.entityActions .cssMenuPanel .menuh a,
-.entityActions .cssMenuPanel .menuh p {
-    display: inline-block;
-    /*border: none;*/
-}
-
-.entityActions .cssMenuPanel .menuh a,
-.entityActions .cssMenuPanel .menuh a:link,
-.entityActions .cssMenuPanel .menuh a:visited,
-.entityActions .cssMenuPanel .menuh a:active,
-.entityActions .cssMenuPanel .menuh p {
-    display: block;
-    float: left;
-    height: 30px;
-    /*line-height: 30px;*/
-    padding: 4px 10px 0;
-    /*font-size:0.85em;*/
-    border-radius:4px;
-    -moz-border-radius:4px;
-    -webkit-border-radius:4px;
-    text-decoration:none;
-}
-
-.additionalLinkList {
-    float:left;
-    margin:0;
-    padding:0;
-    list-style:none;
-}
-
-.entityCollectionsPanel .panel-heading .additionalLinkList {
-    margin-right: 10px;
-}
-
-.additionalLinkList li {
-    float:left;
-    margin-right:10px;
-    /*	margin-bottom: 2px;*/
-}
-.entityPropertiesPanel .additionalLinkList li {
-    margin-right:0px;
-}
-.entityPropertiesPanel .properties .panel-heading .additionalLinkList {
-    margin-right: -5px;
-}
-
-
-
-
-
-/**
- * Borrowed from http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3
- */
-
-.dropdown-submenu {
-    position: relative;
-}
-
-.dropdown-submenu>.dropdown-menu {
-    top: 0;
-    left: 100%;
-    margin-top: -6px;
-    margin-left: -1px;
-    -webkit-border-radius: 0 6px 6px 6px;
-    -moz-border-radius: 0 6px 6px;
-    border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover>.dropdown-menu {
-    display: block;
-}
-
-.dropdown-submenu>a:after {
-    display: block;
-    content: " ";
-    float: right;
-    width: 0;
-    height: 0;
-    border-color: transparent;
-    border-style: solid;
-    border-width: 5px 0 5px 5px;
-    border-left-color: #ccc;
-    margin-top: 5px;
-    margin-right: -10px;
-}
-
-.dropdown-submenu:hover>a:after {
-    border-left-color: #fff;
-}
-
-.dropdown-submenu.pull-left {
-    float: none;
-}
-
-.dropdown-submenu.pull-left>.dropdown-menu {
-    left: -100%;
-    margin-left: 10px;
-    -webkit-border-radius: 6px 0 6px 6px;
-    -moz-border-radius: 6px 0 6px 6px;
-    border-radius: 6px 0 6px 6px;
-}
-
-.dropdown-menu > li > a.menuLink {
-    padding-left: 0;
-}
-
-.dropdown-menu > li > span.fa {
-    padding-left: 3px;
-}
-
-.dropdown-menu .fontAwesomeIcon {
-    min-width: 20px;
-}
-
-.dropdown-menu > li > a.menuLink.btn-warning:hover {
-    background-color: inherit;
-    background-image: inherit;
-}
-
-.dropdown-menu > li > a.menuLink.menuLinkSpacer {
-    padding-left: 24px;
-}
-
-.dropdown-menu > li > a.btn.btn-warning {
-    text-align: start;
-    border-radius: 0;
-    color: initial;
-}
-
-.scrollable-menu {
-    min-width: 250px;
-    height: auto;
-    max-height: 600px;
-    overflow-x: hidden;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html
deleted file mode 100644
index 3a6dd5d..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org">
-    <body>
-        <wicket:panel>
-            <li class="dropdown" wicket:id="menuItems">
-                <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"><span wicket:id="name"></span> <span class="caret"></span></a>
-                <ul wicket:id="topMenu" class="dropdown-menu scrollable-menu multi-level" role="menu">
-                    <li wicket:id="subMenuItems">
-                        <wicket:container wicket:id="content"></wicket:container>
-                    </li>
-                </ul>
-            </li>
-
-            <wicket:fragment wicket:id="leafItem">
-                <a class="menuLink" wicket:id="menuLink">
-                    <span class="fontAwesomeIcon" wicket:id="menuLinkFontAwesome"></span> <span class="menuLinkLabel" wicket:id="menuLinkLabel"></span>
-                </a>
-            </wicket:fragment>
-
-            <wicket:fragment wicket:id="folderItem">
-                <a wicket:id="folderName" tabindex="-1"></a>
-                <ul class="dropdown-menu">
-                    <li wicket:id="subMenuItems">
-                        <wicket:container wicket:id="content"></wicket:container>
-                    </li>
-                </ul>
-            </wicket:fragment>
-
-            <wicket:fragment wicket:id="empty">
-            </wicket:fragment>
-
-
-        </wicket:panel>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java
deleted file mode 100644
index 5208189..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/ApplicationActionsPanel.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu;
-
-import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipBehavior;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.button.DropdownAutoOpenJavaScriptReference;
-
-import java.util.List;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.head.CssHeaderItem;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.markup.html.link.ExternalLink;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Fragment;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.request.resource.CssResourceReference;
-import org.apache.isis.viewer.wicket.ui.util.Components;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-/**
- * A panel responsible to render the application actions as menu in a navigation bar.
- *
- * <p>
- *     The multi-level sub menu support is borrowed from
- *     <a href="http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3">Bootsnip</a>
- * </p>
- */
-public class ApplicationActionsPanel extends Panel {
-
-    /**
-     * Constructor.
-     *
-     * @param id
-     *          the Wicket component id
-     * @param menuItems
-     *          the menu items with their sub menu items
-     */
-    public ApplicationActionsPanel(String id, List<CssMenuItem> menuItems) {
-        super(id);
-
-        ListView<CssMenuItem> menuItemsView = new ListView<CssMenuItem>("menuItems", menuItems) {
-
-            @Override
-            protected void populateItem(ListItem<CssMenuItem> listItem) {
-                CssMenuItem menuItem = listItem.getModelObject();
-                listItem.add(new Label("name", menuItem.getName()));
-
-                MarkupContainer topMenu = new WebMarkupContainer("topMenu");
-
-                topMenu.add(new CssClassAppender("top-menu-" + CssClassAppender.asCssStyle(menuItem.getName())));
-                listItem.add(topMenu);
-                List<CssMenuItem> subMenuItems = withSeparators(menuItem);
-
-// fake data to test multi-level menus
-//                if (menuItem.getName().equals("ToDos")) {
-//                    CssMenuItem fakeItem = menuItem.newSubMenuItem("Fake item").build();
-//
-//                    fakeItem.newSubMenuItem("Fake item 1").link(new ExternalLink("menuLink", "http://abv.bg")).build();
-//                    CssMenuItem fakeMenu12 = fakeItem.newSubMenuItem("Fake item 2").link(new ExternalLink("menuLink", "http://google.com")).build();
-//
-//                    fakeMenu12.newSubMenuItem("Fake item 2.1").link(new ExternalLink("menuLink", "http://web.de")).build();
-//                }
-
-                ListView<CssMenuItem> subMenuItemsView = new ListView<CssMenuItem>("subMenuItems", subMenuItems) {
-                    @Override
-                    protected void populateItem(ListItem<CssMenuItem> listItem) {
-                        CssMenuItem subMenuItem = listItem.getModelObject();
-
-                        if (subMenuItem.hasSubMenuItems()) {
-                            addFolderItem(subMenuItem, listItem);
-                        } else {
-                            addLeafItem(subMenuItem, listItem);
-                        }
-                    }
-                };
-                topMenu.add(subMenuItemsView);
-            }
-        };
-        add(menuItemsView);
-    }
-
-    private void addFolderItem(CssMenuItem subMenuItem, ListItem<CssMenuItem> listItem) {
-
-        listItem.add(new CssClassAppender("dropdown-submenu"));
-
-        Fragment folderItem = new Fragment("content", "folderItem", ApplicationActionsPanel.this);
-        listItem.add(folderItem);
-
-        folderItem.add(new Label("folderName", subMenuItem.getName()));
-        final List<CssMenuItem> menuItems = withSeparators(subMenuItem);
-        ListView<CssMenuItem> subMenuItemsView = new ListView<CssMenuItem>("subMenuItems",
-                menuItems) {
-            @Override
-            protected void populateItem(ListItem<CssMenuItem> listItem) {
-                CssMenuItem subMenuItem = listItem.getModelObject();
-
-                if (subMenuItem.hasSubMenuItems()) {
-                    addFolderItem(subMenuItem, listItem);
-                } else {
-                    addLeafItem(subMenuItem, listItem);
-                }
-            }
-        };
-        folderItem.add(subMenuItemsView);
-    }
-
-    private List<CssMenuItem> withSeparators(CssMenuItem subMenuItem) {
-        final List<CssMenuItem> subMenuItems = subMenuItem.getSubMenuItems();
-        final List<CssMenuItem> itemsWithSeparators = Lists.newArrayList();
-        for (CssMenuItem menuItem : subMenuItems) {
-            if(menuItem.isSeparator() ) {
-                if(!itemsWithSeparators.isEmpty()) {
-                    // bit nasty... we add a new separator item
-                    itemsWithSeparators.add(
-                            CssMenuItem.newMenuItem(menuItem.getName() + "-separator")
-                                    .separator(menuItem.isSeparator())
-                                    .prototyping(menuItem.isPrototyping())
-                                    .build());
-                }
-                menuItem.setSeparator(false);
-            }
-            itemsWithSeparators.add(menuItem);
-        }
-        return itemsWithSeparators;
-    }
-
-    private void addLeafItem(
-            final CssMenuItem menuItem,
-            final ListItem<CssMenuItem> listItem) {
-
-        Fragment leafItem;
-        if (!menuItem.isSeparator()) {
-            leafItem = new Fragment("content", "leafItem", ApplicationActionsPanel.this);
-
-            AbstractLink subMenuItemLink = menuItem.getLink();
-
-            Label menuItemLabel = new Label("menuLinkLabel", menuItem.getName());
-            subMenuItemLink.addOrReplace(menuItemLabel);
-
-            if (!menuItem.isEnabled()) {
-                listItem.add(new CssClassAppender("disabled"));
-                subMenuItemLink.setEnabled(false);
-                TooltipBehavior tooltipBehavior = new TooltipBehavior(Model.of(menuItem.getDisabledReason()));
-                listItem.add(tooltipBehavior);
-            }
-            if (menuItem.isPrototyping()) {
-                subMenuItemLink.add(new CssClassAppender("prototype"));
-            }
-            leafItem.add(subMenuItemLink);
-
-            String cssClassFa = menuItem.getCssClassFa();
-            if (Strings.isNullOrEmpty(cssClassFa)) {
-                Components.permanentlyHide(subMenuItemLink, "menuLinkFontAwesome");
-                subMenuItemLink.add(new CssClassAppender("menuLinkSpacer"));
-            } else {
-                Label dummy = new Label("menuLinkFontAwesome", "");
-                dummy.add(new CssClassAppender(cssClassFa));
-                subMenuItemLink.addOrReplace(dummy);
-            }
-        } else {
-            leafItem = new Fragment("content", "empty", ApplicationActionsPanel.this);
-            listItem.add(new CssClassAppender("divider"));
-        }
-        listItem.add(leafItem);
-
-    }
-
-    @Override
-    public void renderHead(IHeaderResponse response) {
-        super.renderHead(response);
-
-        response.render(CssHeaderItem.forReference(new CssResourceReference(ApplicationActionsPanel.class, "ApplicationActionsPanel.css")));
-        response.render(JavaScriptHeaderItem.forReference(DropdownAutoOpenJavaScriptReference.instance()));
-        response.render(OnDomReadyHeaderItem.forScript("$('.dropdown-toggle').dropdownHover();"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
deleted file mode 100644
index 88caef5..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- *  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.widgets.cssmenu;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.List;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.SubmitLink;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.model.Model;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.ensure.Ensure;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
-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.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
-import org.apache.isis.viewer.wicket.ui.util.Components;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-import static org.hamcrest.CoreMatchers.is;
-
-;
-
-public class CssMenuItem implements Serializable {
-
-
-    private static final long serialVersionUID = 1L;
-
-    public static final String ID_MENU_LINK = "menuLink";
-
-    public static class Builder {
-        private final CssMenuItem cssMenuItem;
-
-        private Builder(final String name) {
-            cssMenuItem = new CssMenuItem(name);
-        }
-
-        public Builder parent(final CssMenuItem parent) {
-            cssMenuItem.setParent(parent);
-            return this;
-        }
-
-        public <T extends Page> Builder link() {
-            final AbstractLink link = new SubmitLink(ID_MENU_LINK); 
-            return link(link);
-        }
-
-        public <T extends Page> Builder link(final AbstractLink link) {
-            Ensure.ensureThatArg(link.getId(), is(ID_MENU_LINK));
-            cssMenuItem.setLink(link);
-            return this;
-        }
-
-        public <T extends Page> Builder enabled(final String disabledReasonIfAny) {
-            cssMenuItem.setEnabled(disabledReasonIfAny == null);
-            cssMenuItem.setDisabledReason(disabledReasonIfAny);
-            return this;
-        }
-
-        public Builder describedAs(String descriptionIfAny) {
-            cssMenuItem.setDescription(descriptionIfAny);
-            return this;
-        }
-
-        public Builder returnsBlobOrClob(boolean blobOrClob) {
-            cssMenuItem.setReturnsBlobOrClob(blobOrClob);
-            return this;
-        }
-
-        public Builder prototyping(boolean prototype) {
-            cssMenuItem.setPrototyping(prototype);
-            return this;
-        }
-
-        public Builder separator(boolean separator) {
-            cssMenuItem.setSeparator(separator);
-            return this;
-        }
-
-        public Builder withActionIdentifier(String actionIdentifier) {
-            cssMenuItem.setActionIdentifier(actionIdentifier);
-            return this;
-        }
-
-        public Builder withFacet(CssClassFacet facet) {
-            if(facet != null) {
-                withCssClass(facet.value());
-            }
-            return this;
-        }
-
-        public Builder withCssClass(String cssClass) {
-            cssMenuItem.setCssClass(cssClass);
-            return this;
-        }
-
-        public Builder withFacet(CssClassFaFacet facet) {
-            if(facet != null) {
-                withCssClassFa(facet.value());
-            }
-            return this;
-        }
-
-        public Builder withCssClassFa(String cssClassFa) {
-            cssMenuItem.setCssClassFa(cssClassFa);
-            return this;
-        }
-
-        /**
-         * Returns the built {@link CssMenuItem}, associating with
-         * {@link #parent(CssMenuItem) parent} (if specified).
-         */
-        public CssMenuItem build() {
-            if (cssMenuItem.parent != null) {
-                cssMenuItem.parent.subMenuItems.add(cssMenuItem);
-            }
-            return cssMenuItem;
-        }
-
-    }
-
-    private final String name;
-    private final List<CssMenuItem> subMenuItems = Lists.newArrayList();
-    private CssMenuItem parent;
-
-    private AbstractLink link;
-    private boolean enabled = true; // unless disabled
-    private String disabledReason;
-    private boolean blobOrClob = false; // unless set otherwise
-    private boolean prototype = false; // unless set otherwise
-    private boolean separator = false; // unless set otherwise
-
-    static final String ID_MENU_LABEL = "menuLabel";
-
-    static final String ID_SUB_MENU_ITEMS = "subMenuItems";
-
-    private String actionIdentifier;
-    private String cssClass;
-    private String cssClassFa;
-
-    private String description;
-
-
-
-    /**
-     * Factory method returning {@link Builder builder}.
-     */
-    public static Builder newMenuItem(final String name) {
-        return new Builder(name);
-    }
-
-
-    public void setActionIdentifier(String actionIdentifier) {
-        this.actionIdentifier = actionIdentifier;
-    }
-
-    public void setPrototyping(boolean prototype) {
-        this.prototype = prototype;
-    }
-
-    public boolean isPrototyping() {
-        return prototype;
-    }
-
-    public void setSeparator(boolean separator) {
-        this.separator = separator;
-    }
-
-    /**
-     * Requires a separator before it
-     * @return
-     */
-    public boolean isSeparator() {
-        return separator;
-    }
-
-    private CssMenuItem(final String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public boolean hasParent() {
-        return parent != null;
-    }
-
-    private void setParent(final CssMenuItem parent) {
-        this.parent = parent;
-    }
-
-    public Builder newSubMenuItem(final String name) {
-        return CssMenuItem.newMenuItem(name).parent(this);
-    }
-
-    public List<CssMenuItem> getSubMenuItems() {
-        return Collections.unmodifiableList(subMenuItems);
-    }
-
-    public boolean hasSubMenuItems() {
-        return subMenuItems.size() > 0;
-    }
-
-    public AbstractLink getLink() {
-        return link;
-    }
-
-    private void setLink(final AbstractLink link) {
-        this.link = link;
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    private void setEnabled(final boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public void setReturnsBlobOrClob(boolean blobOrClob) {
-        this.blobOrClob = blobOrClob;
-    }
-
-    public void setCssClass(String cssClass) {
-        this.cssClass = cssClass;
-    }
-
-    public void setCssClassFa(String cssClassFa) {
-        this.cssClassFa = cssClassFa;
-    }
-
-    public String getCssClassFa() {
-        return cssClassFa;
-    }
-
-
-    /**
-     * Only populated if not {@link #isEnabled() enabled}.
-     */
-    public String getDisabledReason() {
-        return disabledReason;
-    }
-
-    public void setDisabledReason(final String disabledReason) {
-        this.disabledReason = disabledReason;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // To add submenu items
-    // //////////////////////////////////////////////////////////////
-
-    /**
-     * Creates a {@link Builder} for a submenu item invoking an action on the provided
-     * {@link ObjectAdapterMemento target adapter}.
-     */
-    public Builder newSubMenuItem(
-            final ObjectAdapterMemento targetAdapterMemento,
-            final ObjectAction objectAction,
-            final boolean separator,
-            final ActionLinkFactory actionLinkFactory) {
-
-        // check visibility
-        final AuthenticationSession session = getAuthenticationSession();
-        final ObjectAdapter adapter = targetAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
-        final Consent visibility = objectAction.isVisible(session, adapter, ActionModel.WHERE_FOR_ACTION_INVOCATION);
-        if (visibility.isVetoed()) {
-            return null;
-        }
-
-        // build the link
-        final LinkAndLabel linkAndLabel = actionLinkFactory.newLink(
-                targetAdapterMemento, objectAction, PageAbstract.ID_MENU_LINK
-        );
-        if(linkAndLabel==null) {
-            // can only get a null if invisible, so this should not happen given guard above
-            return null;
-        }
-        final AbstractLink link = linkAndLabel.getLink();
-        final String actionLabel = linkAndLabel.getLabel();
-
-        final Consent usability = objectAction.isUsable(session, adapter, ActionModel.WHERE_FOR_ACTION_INVOCATION);
-        final String reasonDisabledIfAny = usability.getReason();
-        
-        final DescribedAsFacet describedAsFacet = objectAction.getFacet(DescribedAsFacet.class);
-        final String descriptionIfAny = describedAsFacet != null? describedAsFacet.value(): null;
-
-        Builder builder = newSubMenuItem(actionLabel)
-                .link(link)
-                .describedAs(descriptionIfAny)
-                .enabled(reasonDisabledIfAny)
-                .returnsBlobOrClob(ObjectAction.Utils.returnsBlobOrClob(objectAction))
-                .prototyping(ObjectAction.Utils.isExplorationOrPrototype(objectAction))
-                .separator(separator)
-                .withActionIdentifier(ObjectAction.Utils.actionIdentifierFor(objectAction))
-                .withCssClass(ObjectAction.Utils.cssClassFor(objectAction))
-                .withCssClassFa(ObjectAction.Utils.cssClassFaFor(objectAction));
-
-        return builder;
-    }
-
-
-    // //////////////////////////////////////////////////////////////
-    // Build wicket components from the menu item.
-    // //////////////////////////////////////////////////////////////
-
-    void addTo(final MarkupContainer markupContainer) {
-
-        final Component menuItemComponent = addMenuItemComponentTo(markupContainer);
-        addSubMenuItemComponentsIfAnyTo(markupContainer);
-
-        addCssClassAttributesIfRequired(menuItemComponent);
-    }
-
-    private Component addMenuItemComponentTo(final MarkupContainer markupContainer) {
-        final AbstractLink link = getLink();
-        final Label label = new Label(CssMenuItem.ID_MENU_LABEL, Model.of(this.getName()));
-
-        if (link != null) {
-
-            // show link...
-            markupContainer.add(link);
-            link.add(label);
-
-            if(this.description != null) {
-                label.add(new AttributeModifier("title", Model.of(description)));
-            }
-            if(this.blobOrClob) {
-                link.add(new CssClassAppender("noVeil"));
-            }
-            if(this.prototype) {
-                link.add(new CssClassAppender("prototype"));
-            }
-
-
-            if(this.cssClass != null) {
-                link.add(new CssClassAppender(this.cssClass));
-            }
-            link.add(new CssClassAppender(this.actionIdentifier));
-
-            String cssClassFa = getCssClassFa();
-            if (Strings.isNullOrEmpty(cssClassFa)) {
-                Components.permanentlyHide(link, "menuLinkFontAwesome");
-            } else {
-                Label dummy = new Label("menuLinkFontAwesome", "");
-                dummy.add(new CssClassAppender(cssClassFa));
-                link.add(dummy);
-            }
-
-            if(! this.isEnabled()) {
-                link.add(new AttributeModifier("title", Model.of(this.getDisabledReason())));
-                link.add(new CssClassAppender("disabled"));
-
-                link.setEnabled(false);
-            }
-
-            // .. and hide label
-            Components.permanentlyHide(markupContainer, CssMenuItem.ID_MENU_LABEL);
-            return link;
-        } else {
-            // hide link...
-            Components.permanentlyHide(markupContainer, ID_MENU_LINK);
-            // ... and show label, along with disabled reason
-            label.add(new AttributeModifier("title", Model.of(this.getDisabledReason())));
-            label.add(new AttributeModifier("class", Model.of("disabled")));
-
-            markupContainer.add(label);
-
-            return label;
-        }
-    }
-
-    private void addSubMenuItemComponentsIfAnyTo(final MarkupContainer menuItemMarkup) {
-        final List<CssMenuItem> subMenuItems = getSubMenuItems();
-        if (subMenuItems.isEmpty()) {
-            Components.permanentlyHide(menuItemMarkup, CssMenuItem.ID_SUB_MENU_ITEMS);
-        } else {
-            menuItemMarkup.add(new CssSubMenuItemsPanel(CssMenuItem.ID_SUB_MENU_ITEMS, subMenuItems));
-        }
-    }
-
-    private void addCssClassAttributesIfRequired(final Component linkComponent) {
-        if (!hasSubMenuItems()) {
-            return;
-        }
-        if (this.hasParent()) {
-            linkComponent.add(new CssClassAppender("parent"));
-        } else {
-            linkComponent.add(new CssClassAppender("top-parent"));
-        }
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // dependencies
-    // //////////////////////////////////////////////////////////////
-
-    protected AuthenticationSession getAuthenticationSession() {
-        return IsisContext.getAuthenticationSession();
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java
deleted file mode 100644
index 832515b..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItemPanelAbstract.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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.widgets.cssmenu;
-
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.viewer.wicket.ui.ComponentFactory;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
-
-/**
- * Package-level adapter for menu items and submenu-items.
- */
-abstract class CssMenuItemPanelAbstract<T extends IModel<?>> extends PanelAbstract<T> {
-
-    private static final long serialVersionUID = 1L;
-
-    public CssMenuItemPanelAbstract(final String id, final T model) {
-        super(id, model);
-        setRenderBodyOnly(true);
-    }
-
-    protected void addSubMenuItems(final WebMarkupContainer markupContainer, final CssMenuItem cssMenuItem) {
-        cssMenuItem.addTo(markupContainer);
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html
deleted file mode 100644
index 9c1e14f..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<?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>
-    <ul class="cssSubMenuItemsPanel">
-        <li wicket:id="subMenuItems" class="cssSubMenuItem">
-            <a wicket:id="menuLink" class="btn btn-primary btn-sm">
-                <span class="fontAwesomeIcon" wicket:id="menuLinkFontAwesome"></span>
-                <span class="menuLabel" wicket:id="menuLabel">[menu label]</span>
-            </a>
-            <p wicket:id="menuLabel">[menu label]</p>
-            <span wicket:id="subMenuItems">[subMenuItems]</span>
-        </li>
-    </ul>
-</wicket:panel>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java
deleted file mode 100644
index 092e1fe..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssSubMenuItemsPanel.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  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.widgets.cssmenu;
-
-import java.util.List;
-
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.repeater.RepeatingView;
-import org.apache.wicket.model.util.ListModel;
-
-/**
- * Panel containing a list of {@link CssMenuItem}s acting as submenus of a
- * parent {@link CssMenuItem}.
- */
-public class CssSubMenuItemsPanel extends CssMenuItemPanelAbstract<CssSubMenuItemsPanel.MyModel> {
-
-    private static final long serialVersionUID = 1L;
-
-    static class MyModel extends ListModel<CssMenuItem> {
-
-        private static final long serialVersionUID = 1L;
-
-        public MyModel(final List<CssMenuItem> cssMenuItems) {
-            super(cssMenuItems);
-        }
-    }
-
-    public CssSubMenuItemsPanel(final String id, final List<CssMenuItem> subMenuItems) {
-        super(id, new MyModel(subMenuItems));
-        setRenderBodyOnly(true);
-
-        final RepeatingView menuItemRv = new RepeatingView(getId());
-        add(menuItemRv);
-        for (final CssMenuItem cssMenuItem : getModel().getObject()) {
-            final WebMarkupContainer menuItemMarkup = new WebMarkupContainer(menuItemRv.newChildId());
-            menuItemRv.add(menuItemMarkup);
-
-            addSubMenuItems(menuItemMarkup, cssMenuItem);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java
new file mode 100644
index 0000000..6c07221
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactory.java
@@ -0,0 +1,33 @@
+/*
+ *  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.widgets.linkandlabel;
+
+import java.io.Serializable;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+public interface ActionLinkFactory extends Serializable {
+
+    LinkAndLabel newLink(
+            final ObjectAdapterMemento adapter,
+            final ObjectAction noAction,
+            final String linkId);
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
new file mode 100644
index 0000000..dff6cd9
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -0,0 +1,232 @@
+/*
+ *  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.widgets.linkandlabel;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.models.ActionModel;
+import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
+import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
+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.app.registry.ComponentFactoryRegistryAccessor;
+import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptHeaderPanel;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+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.util.CssClassAppender;
+
+public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    protected AbstractLink newLink(
+            final String linkId,
+            final ObjectAdapter objectAdapter,
+            final ObjectAction action) {
+        
+        final ActionModel actionModel = ActionModel.create(objectAdapter, action);
+
+        final AjaxDeferredBehaviour ajaxDeferredBehaviour = determineDeferredBehaviour(action, actionModel);
+
+        final AbstractLink link = new AjaxLink<Object>(linkId) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onClick(AjaxRequestTarget target) {
+
+                if(ajaxDeferredBehaviour != null) {
+                    ajaxDeferredBehaviour.initiate(target);
+                } else {
+                    final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(getPage());
+                    final ActionPrompt actionPrompt = promptProvider.getActionPrompt();
+                    ActionPromptHeaderPanel titlePanel = new ActionPromptHeaderPanel(actionPrompt.getTitleId(), actionModel);
+                    final ActionPanel actionPanel =
+                            (ActionPanel) getComponentFactoryRegistry().createComponent(
+                                    ComponentType.ACTION_PROMPT, actionPrompt.getContentId(), actionModel);
+
+                    actionPanel.setShowHeader(false);
+
+                    actionPrompt.setTitle(titlePanel, target);
+                    actionPrompt.setPanel(actionPanel, target);
+                    actionPanel.setActionPrompt(actionPrompt);
+                    actionPrompt.showPrompt(target);
+
+                    focusOnFirstParameter(target, actionPanel);
+                }
+            }
+
+            private void focusOnFirstParameter(AjaxRequestTarget target, ActionPanel actionPanel) {
+
+                // first, force all parameters to build themselves...
+                actionPanel.visitChildren(new IVisitor<Component, Component>() {
+                    @Override
+                    public void component(Component object, IVisit<Component> visit) {
+                        if (object instanceof ScalarPanelAbstract) {
+                            ScalarPanelAbstract spa = (ScalarPanelAbstract) object;
+                            spa.forceBuildGui();
+                            visit.dontGoDeeper();
+                        }
+                    }
+                });
+
+                // second, go searching for the first <input> in the action panel.
+                final Component actionPanelFirstParam = actionPanel.visitChildren(new IVisitor<Component, Component>() {
+                    @Override
+                    public void component(Component object, IVisit<Component> visit) {
+                        if (object instanceof FormComponent &&
+                            !"scalarIfCompact".equals(object.getId()) &&
+                            object.getOutputMarkupId()) {
+                            // there are components for 'compact' and 'regular'; we want the 'regular' one
+                            // also double check that has outputMarkupId enabled (prereq for setting focus)
+                            visit.stop(object);
+                        }
+                    }
+                });
+
+                // third, if found then use Wicket API to focus on this component
+                if(actionPanelFirstParam != null) {
+                    target.focusComponent(actionPanelFirstParam);
+                }
+            }
+
+            @Override
+            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
+                super.updateAjaxAttributes(attributes);
+
+                // allow the event to bubble so the menu is hidden after click on an item
+                attributes.setEventPropagation(AjaxRequestAttributes.EventPropagation.BUBBLE);
+            }
+
+            @Override
+            protected void onComponentTag(ComponentTag tag) {
+                super.onComponentTag(tag);
+
+                Buttons.fixDisabledState(this, tag);
+            }
+        };
+
+        if(ajaxDeferredBehaviour != null) {
+            link.add(ajaxDeferredBehaviour);
+        }
+
+        link.add(new CssClassAppender("noVeil"));
+
+        return link;
+    }
+
+    private static AjaxDeferredBehaviour determineDeferredBehaviour(final ObjectAction action, final ActionModel actionModel) {
+        // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+        if(isNoArgReturnTypeRedirect(action)) {
+            /**
+             * adapted from:
+             * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
+             */
+            return new AjaxDeferredBehaviour(AjaxDeferredBehaviour.OpenUrlStrategy.NEW_WINDOW) {
+                
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                protected IRequestHandler getRequestHandler() {
+                    ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
+                    final Object value = resultAdapter.getObject();
+                    return ActionModel.redirectHandler(value);
+                }
+            };
+        } 
+        if(isNoArgReturnTypeDownload(action)) {
+
+            /**
+             * adapted from:
+             * @see https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
+             */
+            return new AjaxDeferredBehaviour(AjaxDeferredBehaviour.OpenUrlStrategy.SAME_WINDOW) {
+                
+                private static final long serialVersionUID = 1L;
+   
+                @Override
+                protected IRequestHandler getRequestHandler() {
+                    final ObjectAdapter resultAdapter = actionModel.executeHandlingApplicationExceptions();
+                    final Object value = resultAdapter.getObject();
+                    return ActionModel.downloadHandler(value);
+                }
+            };
+        } 
+        return null;
+    }
+
+    // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+    private static boolean isNoArgReturnTypeRedirect(final ObjectAction action) {
+        return action.getParameterCount() == 0 &&
+               action.getReturnType() != null && 
+               action.getReturnType().getCorrespondingClass() == java.net.URL.class;
+    }
+
+    // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+    private static boolean isNoArgReturnTypeDownload(final ObjectAction action) {
+        return action.getParameterCount() == 0 && action.getReturnType() != null && 
+                (action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Blob.class ||
+                action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Clob.class);
+    }
+
+    protected LinkAndLabel newLinkAndLabel(final ObjectAction objectAction, final AbstractLink link, final String disabledReasonIfAny) {
+
+        final String label = ObjectAction.Utils.nameFor(objectAction);
+        final boolean blobOrClob = ObjectAction.Utils.returnsBlobOrClob(objectAction);
+        final boolean prototype = ObjectAction.Utils.isExplorationOrPrototype(objectAction);
+        final String actionIdentifier = ObjectAction.Utils.actionIdentifierFor(objectAction);
+        final String description = ObjectAction.Utils.descriptionOf(objectAction);
+        final ActionLayout.Position position = ObjectAction.Utils.actionLayoutPositionOf(objectAction);
+        final String cssClass = ObjectAction.Utils.cssClassFor(objectAction);
+        final String cssClassFa = ObjectAction.Utils.cssClassFaFor(objectAction);
+
+        return new LinkAndLabel(link, label, disabledReasonIfAny, description, blobOrClob, prototype, actionIdentifier, cssClass, cssClassFa, position);
+    }
+
+
+    // ////////////////////////////////////////////////////////////
+    // Dependencies
+    // ////////////////////////////////////////////////////////////
+    
+    protected ComponentFactoryRegistry getComponentFactoryRegistry() {
+        return ((ComponentFactoryRegistryAccessor)Application.get()).getComponentFactoryRegistry();
+    }
+    
+    protected PageClassRegistry getPageClassRegistry() {
+        return ((PageClassRegistryAccessor) Application.get()).getPageClassRegistry();
+    }
+
+}