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:08 UTC

[2/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/widgets/linkandlabel/AjaxDeferredBehaviour.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/AjaxDeferredBehaviour.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/AjaxDeferredBehaviour.java
new file mode 100644
index 0000000..c9bb75f
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/AjaxDeferredBehaviour.java
@@ -0,0 +1,84 @@
+/*
+ *  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 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/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index 2f6b442..f5b3b17 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -37,7 +37,7 @@ 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.ScalarModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
-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/pages/PageAbstract-old.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract-old.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract-old.css
deleted file mode 100644
index b7e215e..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract-old.css
+++ /dev/null
@@ -1,962 +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.
- */
- 
- 
-/*
-TODO mgrigorov: Remove this file once the new styling based on Bootstrap is finished
-
-
-colors
-------
-
-#E4E4DB - page background
-
-#00477F   rich blue
-          h1,h2,h3 {color}
-          a {color}
-
-#20B5C2 - light blue
-          .ok {background-color}
-          .links{color}
-
-#40C0CB - highlight blue
-          .a:hover {background-color}
-
-#F0EFEA   light (bookmark background)
-          .select2-choice {background-color}
-
-#407098   muted blue
-          th {color}
-
-
-#454545   dark brown/grey
-          body {color}
-
-#413D37   dark brown/banner
-          legend {color}
-
-#E4E4DB   very pale beige
-.cancel {background-color}
-
-#46423C   dark brown
-          .cancel {color}
-
-#888      medium grey
-          p.disabled {color}
-
-#F0EFEA   very light grey
-          p.disabled {background-color}
-
-#E3E3D9   light grey
-          body {background-color}
-
-
-#BF0B0B - jgrowl error
-
-
-
-#46413B   dark brown
-          .scalarName {color}
-
-#7F7F7F   (medium grey)
-          .select2-choice {color}
-
-#46423C - dark (writing?)
-
-
-#CCCBC7   (medium)
-          input[disabled]  {border-top}
-
-#EEEEEE   light grey
-          th{background}
-
-#FFFFFF   white
-          .ok {color}
-
-*/
- 
-/********** ID's **********/
-
-#header {
-	width: 73%;
-	float: left;
-	height: 60px;
-	margin-left: 5px;
-	background: transparent url("images/logo.png") left center no-repeat;
-}
-
-#header .applicationName {
-	display:none;
-}
-.headerContainer {
-	background: url("images/bg_header_brown.png") left top repeat;
-	height: 100px;
-}
-
-.headerContainer .links>span:first-child {
-	background: url("/images/icon_appuser.png") no-repeat scroll left
-		center transparent;
-	line-height: 30px;
-	padding: 5px 0 5px 20px;
-	margin-left: 10px;
-}
-
-.headerContainer .links {
-	font-size: 0.9em;
-}
-
-.headerContainer .links a {
-	margin-left: 10px;
-}
-
-#secondaryMenu {
-    width: 25%;
-}
-
-#tertiaryMenu {
-    width: 3%;
-    float: right;
-    padding-right: 20px;
-}
-#breadcrumbsMenu {
-    width: 18%;
-    float: right;
-}
-#tertiaryMenu .imgLinks {
-	line-height: 30px;
-	font-size: 3em;
-	margin-right:20px;
-}
-
-#tertiaryMenu  a.copyLink:hover,
-#tertiaryMenu  a.copyLink.hover {
-    cursor: pointer;
-}
-
-#tertiaryMenu  a.copyLink:active,
-#tertiaryMenu  a.copyLink.active {
-    cursor: pointer;
-}
-
-
-#secondaryMenu,
-#tertiaryMenu {
-	display: inline-block;
-	float: right;
-	text-align: right;
-    margin-right: 5px;
-}
-
-#tertiaryMenu a {
-	font-size:3em;
-	line-height: 30px;
-}
-
-#header h1 {
-	margin: 10px 10px 10px 0px;
-	font-size: xx-large;
-}
-
-.clear {
-	clear: both; 
-}
-
-.links {
-	clear: both;
-	height: 60px;
-	line-height:60px;
-	color:#20B5C2;
-	text-transform: uppercase;
-	font-size:1.0em;
-    font-weight:bold;
-    padding:0px 20px 0px 0px;
-}
-
-	.links a {
-		color:#FFFFFF;
-    	font-weight:bold;
-	}
-	
-		
-#container {
-	/*width: 800px;*/
-}
-
-
-/* Buttons */
-
-.edit,
-.ok,
-.okButton {
-	display:inline-block;
-	background-color:#20B5C2;
-	color:#FFFFFF;
-	text-transform:uppercase;
-	font-size:0.9em;
-	border:0px;
-	padding:5px 10px;
-	border-radius:4px;
-	cursor:pointer;
-}
-
-.edit:focus,
-.ok:focus,
-.okButton:focus {
-	background-color: #40C0CB;
-	font-style: italic;
-}
-
-.cancel {
-	display:inline-block;
-	background-color:#E4E4DB;
-	color:#46423C;
-	text-transform:uppercase;
-	font-size:0.9em;
-	border:0px;
-	padding:5px 10px;
-	border-radius:4px;
-	cursor:pointer;	
-}
-
-.cancel:focus {
-    font-style: italic;
-}
-
-
-/********** CLASSes **********/
-
-.feedbackPanel li {
-	list-style: none;	
-}
-
-.leftSide {
-	float: left;
-	width: 220px;
-	height: 500px;
-}
-
-.rightSide {
-	float: right;
-	width: 520px;
-}
-
-/**************** APPLICATION MENU **************/
-
-#applicationActions {
-    padding-left: 10px;
-    height:40px;
-    margin-left: 10px;
-    width: 73%;
-    float: left;
-}
-
-#applicationActions .menuh {
-	background-color: transparent;
-	position:relative;
-	z-index:501;
-}
-
-#applicationActions .menuh ul.cssMenuItems {
-	line-height:30px;
-}
-
-#applicationActions .cssMenuPanel .menuh a:link, 
-#applicationActions .cssMenuPanel .menuh a:visited, 
-#applicationActions .cssMenuPanel .menuh a:active, 
-#applicationActions .cssMenuPanel .menuh p {
-	background-color: transparent;
-   	color: #FFFFFF;
-   	text-decoration: none;
-   	text-transform:uppercase;
-   	font-size:0.9em;
-   	font-weight:bold;
-}
-
-#applicationActions .cssMenuPanel .menuh a.prototype span {
-    color: #DBDB4D;
-    font-style: italic;
-}
-
-
-#applicationActions .cssMenuPanel .menuh li a:link, 
-#applicationActions .cssMenuPanel .menuh li a:visited, 
-#applicationActions .cssMenuPanel .menuh li a:active, 
-#applicationActions .cssMenuPanel .menuh li p {
-	border-radius:4px 4px 0px 0px;
-   	-moz-border-radius:4px 4px 0px 0px;
-   	-webkit-border-radius:4px 4px 0px 0px;
-}
-
-#applicationActions .cssMenuPanel .menuh li li a:link, 
-#applicationActions .cssMenuPanel .menuh li li a:visited, 
-#applicationActions .cssMenuPanel .menuh li li a:active, 
-#applicationActions .cssMenuPanel .menuh li li p {
-	border-radius:0px;
-   	-moz-border-radius:0px;
-   	-webkit-border-radius:0px;
-	background-color: #20B5C2;
-}
-
-#applicationActions .cssMenuPanel .menuh li li:last-child a:link, 
-#applicationActions .cssMenuPanel .menuh li li:last-child a:visited, 
-#applicationActions .cssMenuPanel .menuh li li:last-child a:active, 
-#applicationActions .cssMenuPanel .menuh li li:last-child p {
-	border-radius:0px 0px 4px 4px;
-	-webkit-border-radius:0px 0px 4px 4px;
-	-moz-border-radius:0px 0px 4px 4px;
-	background-color: #20B5C2;
-}
-
-#applicationActions .cssMenuPanel .menuh li li:first-child a:link, 
-#applicationActions .cssMenuPanel .menuh li li:first-child a:visited, 
-#applicationActions .cssMenuPanel .menuh li li:first-child a:active, 
-#applicationActions .cssMenuPanel .menuh li li:first-child p {
-	border-radius:0px 4px 0px 0px;
-	-webkit-border-radius:0px 4px 0px 0px;
-	-moz-border-radius:0px 4px 0px 0px;
-	background-color: #20B5C2;
-}
-
-#applicationActions .cssMenuPanel .menuh li li:first-child:last-child a:link, 
-#applicationActions .cssMenuPanel .menuh li li:first-child:last-child a:visited, 
-#applicationActions .cssMenuPanel .menuh li li:first-child:last-child a:active, 
-#applicationActions .cssMenuPanel .menuh li li:first-child:last-child p {
-	border-radius:0px 4px 4px 4px;
-	-webkit-border-radius:0px 4px 4px 4px;
-	-moz-border-radius:0px 4px 4px 4px;
-	background-color: #20B5C2;
-}
-
-
-#applicationActions .menuh a, 
-#applicationActions .menuh p {
-    border: 0px solid #00477F;
-    padding: 0px 1em 0px 1em;
-    background-image:none !important;
-}
-
-#applicationActions .cssMenuPanel .menuh li:hover a, 
-#applicationActions .cssMenuPanel .menuh li:hover p {
-	color: #FFFFFF;
-	background-color: #20B5C2;
-}
-
-#applicationActions .cssMenuPanel .menuh a:hover, 
-#applicationActions .cssMenuPanel .menuh p:hover {
-	color: #FFFFFF;
-	background-color: #20B5C2;
-}
-
-#applicationActions .cssMenuPanel .menuh li li a:hover, 
-#applicationActions .cssMenuPanel .menuh li li p:hover {
-	color: #FFFFFF;
-	background-color: #40C0CB !important;
-}
-
-#applicationActions ul.cssSubMenuItemsPanel {
-	min-width:220px;
-}
-
-   #applicationActions ul.cssSubMenuItemsPanel li.cssSubMenuItem p.disabled {
-       color: lightgray;
-       /*background-color: #F0EFEA;*/
-       
-   } 
-
-
-/**************** ELEMENTS **************/
-
-body {
-	background-color: #E3E3D9;
-	color: #454545;
-	font-family: Arial,'Sans-serif',  'Helvetica', 'Sans-serif', 'sans';
-	font-size: 0.8em;
-	line-height: 1.4em;
-	padding: 0px;
-	margin:0px;
-}
-
-.panel, fieldset {
-	margin: 3px 0px;
-}
-
-.scalarNameAndValueComponentType .panel {
-	padding: 4px;
-}
-
-
-div {
-	margin: 0;
-	padding: 0;
-}
-
-#body {
-	min-height: 400px;
-	margin:20px;
-}
-
-#footer {
-}
-
-	#footer .links {
-		height:auto;
-		padding:0px 20px;
-		line-height:20px;
-		height:20px;
-		color:#46423C;
-	}
-	
-	#footer .links a {
-		color:#20B5C2;
-		text-decoration:none;
-	}
-
-h3 {
-	margin-top: 9px;
-	margin-bottom: 0px;
-}
-
-p {
-	margin-top: 0px;
-	margin-bottom: 0px;
-}
-
-form fieldset .okButton {
-	margin-top: 2em;
-}
-
-.myBlockContainer {
-	background-color:#FFFFFF;
-	padding:10px;
-	border-radius:4px;
-	-moz-border-radius:4px;
-	-webkit-border-radius:4px;
-	margin-bottom:1%;
-	position:relative;
-	clear:both;
-}
-
-.myBlockContainer fieldset {
-	border:0px;
-	margin:0px;
-	padding:0px;
-}
-.myBlockContainer fieldset:not(:first-child) {
-    margin-top: 30px
-}
-
-
-.myBlockContainer legend {
-	color:#423D37;
-	font-size:1.6em;
-	margin-bottom:10px;
-	line-height:120%;
-	padding:0px;
-	float:left;
-	display:block;
-}
-
-
-/************************************************************ *********/
-
-
-
-h1,h2,h3,h4,h5,h6,h7,h8 {
-	color: #00477F;
-	font-weight: normal;
-}
-
-h1,h2 {
-	letter-spacing: -1px;
-}
-
-#extitle {
-	font-size: 12pt;
-	font-weight: bold;
-	color: #454545;
-	padding: 10px 10px 10px 10px;
-}
-
-.mark {
-	background-color: yellow;
-	margin: 5px;	
-}
-
-.nospam {
-	display : none;
-}
-
-.block {
-	padding: 10px;
-}
-
-
-h2 {
-	font-size: 1.25em;
-}
-
-h3 {
-	font-size: 1em;
-}
-
-a {
-	color: #00477F;
-	font-weight: bold;
-	text-decoration: none;
-}
-
-a:hover {
-	text-decoration: underline;
-	cursor: pointer;
-}
-
-img {
-	border: none;
-}
-
-pre {
-	font-family: 'Lucida Sans', 'Helvetica', 'Sans serif', 'sans';
-}
-
-th {
-	background: #EEEEEE;
-	color: #407098;
-	font-weight: bold;
-}
-
-tr.b {
-	background: #EEEEEE;
-}
-
-tr.a {
-	background: #E6E6E5;
-}
-
-tr.none {
-	background: transparent;
-}
-
-a.none {
-	background: transparent;
-	padding-right: 0px;
-}
-
-.inputForm label.non {
-	display: inline !important;
-}
-
-.inputFormTable td {
-	padding: 2px;
-}
-
-div.tabRowContent {
-	border-style: solid;
-	border-width: 1px;
-	margin: 4px;
-	padding: 4px;
-}
-
-tr.section td {
-	padding-top: 0.75em;
-}
-
-table.contents td,
-table.contents th {
-	border-left: 1px solid #DDD;
-	border-right: 1px solid #DDD;
-}
-
-/*************** Styling Entity Forms and Parameters ********************/
-
-
-
-
-.property, .propertyOrCollection, .parameter {
-	clear: both;
-}
-
-.scalarNameAndValueComponentType {
-}
-
-.scalarName {
-	padding:6px 0px;
-	margin-bottom:5px;
-}
-
-
-
-.scalarValue {
-	margin-bottom:10px;
-}
-
-.collectionName, 
-.collectionContents {
-
-}
-
-.scalarName, .collectionName {
-	float: left;
-	font-style: normal;
-	text-align: left;
-	text-transform:uppercase;
-	font-weight:bold !important;
-	font-size:0.9em;
-	color:#46413B;
-}
-
-.mandatory .scalarName:after, 
-.mandatory  .collectionName:after {
-	content: " *";
-	font-weight:bold;
-	color:#20B5C2;
-}
-
-.scalarValue,.collectionContents  {
-	float: left;
-}
-
-.scalarValue  {
-}
-
-.collectionContents {
-	width: 100%;
-}
-
-.scalarName {
-	width: 160px;
-}
-.scalarValue {
-}
-
-div.scalarPanel {
-	display: inline;
-}
-	
-.buttons {
-	padding: 1em 0em 1em 0em;
-	clear: both;
-	display: block;
-}	
-
-.mandatory {
-	font-weight: bold;
-}
-
-.number input {
- 	text-align: right;
-}
-
-
-
-/********************* Select2 component styling *****************************/
-
-
-.actionPromptPage .select2-container .select2-choice,
-.entityPage       .select2-container .select2-choice {
-    padding: 4px;
-}
-
-
-
-.actionPromptPage .select2-container .select2-choice,
-.entityPage       .select2-container .select2-choice {
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-	height: 20px;
-    line-height: 20px;
-	color:#7F7F7F;
-	background:#FFFFFF none;
-	border:1px solid #F0EFEA;
-	border-top:1px solid #CCCBC7;
-}
-
-.actionPromptPage .select2-container .select2-choice span,
-.entityPage       .select2-container .select2-choice span {
-    font-size:13px;
-}
-
-.actionPromptPage .select2-container.select2-drop-above .select2-choice,
-.entityPage       .select2-container.select2-drop-above .select2-choice {
-    -webkit-border-radius:0px;
-    -moz-border-radius:0px;
-    border-radius:0px;
-}
-
-.actionPromptPage .select2-drop,
-.entityPage       .select2-drop {
-    -webkit-border-radius:0px;
-    -moz-border-radius:0px;
-    border-radius:0px;
-}
-
-.actionPromptPage .select2-drop.select2-drop-above,
-.entityPage       .select2-drop.select2-drop-above {
-    -webkit-border-radius:0px;
-    -moz-border-radius:0px;
-    border-radius:0px;
-}
-
-.actionPromptPage .select2-container .select2-choice div,
-.entityPage       .select2-container .select2-choice div {
-    -webkit-border-radius:0px;
-    -moz-border-radius:0px;
-    border-radius:0px;
-    background: #EBEBE4;
-}
-
-.actionPromptPage .select2-container.select2-container-disabled .select2-choice,
-.entityPage       .select2-container.select2-container-disabled .select2-choice {
-	background-color:#F0EFEA;
-	border:1px solid #F0EFEA;
-	border-top:1px solid #CCCBC7;
-}
-
-.actionPromptPage .select2-container a,
-.entityPage       .select2-container a {
-	font-weight: normal;
-}
-
-/******** fix for select2 on ModalWindow ********/
-/* http://osdir.com/ml/users-wicket.apache.org/2013-09/msg00165.html */
-
-div.select2-drop {
-	z-index: 30001
-}
-
-.select2-drop-mask {
-    z-index: 30000
-}
-
-
-/******** action prompt modal dialog ********/
-
-
-.wicket-modal .w_content_container {
-  background-color: #E4E4DB;
-}
-
-.actionPanel {
-    width: 680px;
-}
-
-.actionPanel .myBlockContainer {
-    margin:19px;
-    padding: 20px;
-    width: 600px;
-    min-height: 200px;
-}
-
-.wicket-modal .w_caption {
-	display: none;
-}
-
-div.wicket-modal div.w_content_3 {
-	border: 0px;
-}
-
-div.wicket-modal div.w_content_3,
-div.wicket-modal div.w_content_2,
-div.wicket-modal div.w_content_1,
-div.wicket-modal div.w_content,
-.wicket-modal .w_content_container,
-.w_isis,
-.actionPanel {
-  border-radius:4px;
-  -moz-border-radius:4px;
-  -webkit-border-radius:4px;
-}
-
-/******** FORM STYLES ********/
-
-form input[type=text][disabled] {
-	border-radius:4px;
-	-moz-border-radius:4px;
-	-webkit-border-radius:4px;
-	padding:6px;
-	background-color:#F0EFEA;
-	border:1px solid #F0EFEA;
-	border-top:1px solid #CCCBC7;
-}
-
-form input[type=text] {
-	border-radius:4px;
-	-moz-border-radius:4px;
-	-webkit-border-radius:4px;
-	padding:6px;
-	background-color:#FFFFFF;
-	border:1px solid #F0EFEA;
-	border-top:1px solid #CCCBC7;
-}
-
-
-
-.inputForm {
-	clear:both;
-}
-
-.actionPanelHeaderNew {
-	clear:both;
-	display:block;
-}
-
-.actionPanelHeaderNew .entityIconAndTitlePanel {
-	padding-bottom:10px;
-	line-height:150%;
-	float:left;
-}
-
-div.actionPanelHeaderNew .iconAndTitle {
-	float: left;
-    padding:0em;
-}
-
-div.actionPanelHeaderNew .actions {
-	float: right;
-    padding:0em 0em;
-}
-
-.actionPanelHeaderNew .entityImage {
-	width: 32px;
-	height: 32px;
-	vertical-align:text-bottom;
-	padding-right:5px;
-}
-
-.actionPanelHeaderNew .entityTitle  {
-	font-size: 1.8em;
-	font-weight:normal;
-	color:#413D37;
-	text-decoration:none;
-}
-
-/* Feedback Error Styling */
-
-.feedbackPanel {
-	clear:both;
-	display:block;
-	color:#990000;
-	font-weight:normal;
-	font-size:12px;
-	line-height:150%;
-}
-
-
-.feedbackPanelERROR {
-	color:#CC0000;
-	list-style: none;
-	font-weight: normal;
-}
-
-.feedbackPanelINFO {
-	color: green;
-	list-style: none;
-	font-weight: normal;
-}
-
-
-
-div#jGrowl {
- margin-top: 55px;
- margin-right: 25px;
- color: white;
- font-size: larger;
- opacity: .90;
- filter: alpha(opacity = 90);
-}
-
-div#jGrowl div.jgrowl-ERROR {
- background-color: #BF0B0B;
-}
-div#jGrowl div.jgrowl-WARNING {
- background-color: orange;
-}
-div#jGrowl div.jgrowl-INFO {
- background-color: #20B5C2;
-}
-div#jGrowl div.jgrowl-WARNING {
- background-color: orange;
-}
-div#jGrowl div.jGrowl-closer {
- background-color: #F0EFEA;
- color: #46423C;
- font-size: small;
-}
-
-
-
-
-/* ModalWindow tweaks */
-
-div.wicket-mask-dark {  
-    filter: alpha(opacity=40);
-    opacity: 0.4; 
-}
-
-
-/* action buttons in properties */
-
-.properties .property .additionalLinkList {
-    float:none;
-    padding-top: 5px;
-    padding-bottom: 20px;
-}
-
-.properties .property .isisBlobPanel .additionalLinkList {
-    padding-top: 0px;
-}
-
-
-
-/** general **/
-
-.hidden {
-	display: none;
-}
-
-
-
-
-/**
-zero clipboard
-(for some reason - perhaps to do with Flash - this CSS doesn't seem to 
- do anything if within the ZeroClipboard.css)
-*/
-.zeroClipboardPanel a {
-    background-image: url("copy-26.png"); 
-    background-position: right;
-    background-repeat: no-repeat;
-    cursor: pointer;
-}
-
-
-/**
-for some reason the containedToggleboxPanel.css is not being picked up...
-*/
-.containedToggleboxPanel .containedToggleboxPanelForm {
-    display: inline;
-}
-
-
-
-
-.collectionContentsAsAjaxTablePanel table.contents tbody td div.FixtureResult-className label,
-.collectionContentsAsAjaxTablePanel table.contents tbody td div.FixtureResult-fixtureScriptClassName label {
-    text-transform: none;
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
deleted file mode 100644
index 60c8e2c..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
+++ /dev/null
@@ -1,20 +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.
- */
-
-

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
index 5cd3c10..400cca7 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.html
@@ -50,16 +50,16 @@
                                     <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                                         <i class="fa fa-fw fa-user"></i> <span wicket:id="userName"></span><span class="caret"></span>
                                     </a>
-                                    <ul class="dropdown-menu" role="menu" style="min-width: 0px;">
-                                        <li class="navbar-right">
-                                            <a wicket:id="logoutLink"><i class="fa fa-fw fa-sign-out"></i><wicket:message key="logoutLabel"></wicket:message></a>
-                                        </li>
+                                    <ul wicket:id="tertiaryMenuBar" class="dropdown-menu" role="menu" style="min-width: 0px;">
                                     </ul>
                                 </li>
                             </ul>
                         </div>
+                        <div class="navbar-collapse app-actions collapse navbar-right">
+                            <ul class="nav navbar-nav" wicket:id="secondaryMenuBar"></ul>
+                        </div>
                         <div class="navbar-collapse app-actions collapse">
-                            <ul class="nav navbar-nav" wicket:id="applicationActions"></ul>
+                            <ul class="nav navbar-nav" wicket:id="primaryMenuBar"></ul>
                         </div>
                     </div>
                 </header>

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 0d7b129..424b23f 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -47,7 +47,6 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
@@ -61,6 +60,7 @@ import org.apache.wicket.request.resource.PackageResource;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -74,11 +74,11 @@ import org.apache.isis.viewer.wicket.model.hints.IsisEnvelopeEvent;
 import org.apache.isis.viewer.wicket.model.hints.IsisEventLetterAbstract;
 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.ApplicationActionsModel;
 import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
 import org.apache.isis.viewer.wicket.model.models.BookmarkedPagesModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.PageType;
+import org.apache.isis.viewer.wicket.model.models.ServiceActionsModel;
 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;
@@ -89,7 +89,6 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.themepicker.ThemeChoo
 import org.apache.isis.viewer.wicket.ui.errors.ExceptionModel;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
 import org.apache.isis.viewer.wicket.ui.pages.about.AboutPage;
-import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
@@ -156,6 +155,15 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     @Inject
     private PageClassRegistry pageClassRegistry;
 
+    /**
+     * Top-level &lt;div&gt; to which all content is added.
+     *
+     * <p>
+     *     Has <code>protected</code> visibility so that subclasses can also add directly to this div.
+     * </p>
+     */
+    protected MarkupContainer themeDiv;
+
     public PageAbstract(
             final PageParameters pageParameters,
             final String title,
@@ -172,14 +180,15 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
                 themeDiv.add(new CssClassAppender(CssClassAppender.asCssStyle(applicationName)));
             }
 
-            addApplicationActions(themeDiv);
+            addActionPromptModalWindow(themeDiv);
+            addServiceActionMenuBars(themeDiv);
 
             this.childComponentIds = Collections.unmodifiableList(Arrays.asList(childComponentIds));
             this.pageParameters = pageParameters;
 
             addApplicationName(themeDiv);
             addUserName(themeDiv);
-            addLogoutLink(themeDiv);
+            //addLogoutLink(themeDiv);
             addAboutLink(themeDiv);
 
             addBreadcrumbs();
@@ -237,7 +246,6 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
         response.render(CssHeaderItem.forReference(FontAwesomeCssReference.instance()));
         response.render(CssHeaderItem.forReference(new BootstrapOverridesCssResourceReference()));
         contributeThemeSpecificOverrides(response);
-        PanelUtil.renderHead(response, PageAbstract.class);
 
         response.render(JavaScriptReferenceHeaderItem.forReference(JQUERY_LIVEQUERY_JS));
         response.render(JavaScriptReferenceHeaderItem.forReference(JQUERY_ISIS_WICKET_VIEWER_JS));
@@ -282,17 +290,6 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
         themeDiv.add(userName);
     }
 
-    private void addLogoutLink(MarkupContainer themeDiv) {
-        Link logoutLink = new Link("logoutLink") {
-
-            @Override
-            public void onClick() {
-                getSession().invalidate();
-                setResponsePage(getSignInPage());
-            }
-        };
-        themeDiv.add(logoutLink);
-    }
 
     private void addAboutLink(MarkupContainer themeDiv) {
         BookmarkablePageLink<Void> aboutLink = new BookmarkablePageLink<>("aboutLink", AboutPage.class);
@@ -335,11 +332,15 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
         return pageParameters;
     }
 
-    private void addApplicationActions(MarkupContainer container) {
-        addActionPromptModalWindow();
-        final ApplicationActionsModel model = new ApplicationActionsModel();
-        model.setActionPromptProvider(this);
-        addComponent(container, ComponentType.APPLICATION_ACTIONS, model);
+    private void addServiceActionMenuBars(MarkupContainer container) {
+        addMenuBar(container, "primaryMenuBar", DomainService.MenuBar.PRIMARY);
+        addMenuBar(container, "secondaryMenuBar", DomainService.MenuBar.SECONDARY);
+        addMenuBar(container, "tertiaryMenuBar", DomainService.MenuBar.TERTIARY);
+    }
+
+    private void addMenuBar(MarkupContainer container, String id, DomainService.MenuBar menuBar) {
+        final ServiceActionsModel model = new ServiceActionsModel(menuBar);
+        getComponentFactoryRegistry().addOrReplaceComponent(container, id, ComponentType.SERVICE_ACTIONS, model);
     }
 
     /**
@@ -395,12 +396,11 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     
     private ActionPromptModalWindow actionPromptModalWindow;
 
-    protected MarkupContainer themeDiv;
     public ActionPrompt getActionPrompt() {
         return ActionPromptModalWindow.getActionPromptModalWindowIfEnabled(actionPromptModalWindow);
     }
 
-    private void addActionPromptModalWindow() {
+    private void addActionPromptModalWindow(final MarkupContainer themeDiv) {
         actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW); 
         themeDiv.addOrReplace(actionPromptModalWindow);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
index 064910a..670361f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
@@ -33,12 +33,23 @@ import java.lang.annotation.*;
 @Retention(RetentionPolicy.RUNTIME)
 public @interface DomainService {
 
+    public enum MenuBar {
+        PRIMARY,
+        SECONDARY,
+        TERTIARY
+    }
+
     /**
      * If this domain service acts as a repository for an entity type, specify that entity type.
      */
     Class<?> repositoryFor() default Object.class;
 
     /**
+     * The menubar in which the menu that hold's this service's actions should reside.
+     */
+    MenuBar menuBar() default MenuBar.PRIMARY;
+
+    /**
      * Number in Dewey Decimal format representing the order.
      *
      * <p>
@@ -47,4 +58,5 @@ public @interface DomainService {
      */
     String menuOrder() default "" + Integer.MAX_VALUE;
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
index 73ca140..250aba4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.domainservice;
 
 
+import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 
@@ -28,6 +29,11 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 public interface DomainServiceFacet extends Facet {
 
     /**
+     * Corresponds to {@link org.apache.isis.applib.annotation.DomainService#menuBar()}.
+     */
+    public DomainService.MenuBar getMenuBar();
+
+    /**
      * Corresponds to {@link org.apache.isis.applib.annotation.DomainService#menuOrder()}.
      *
      * <p>

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
index e39bb3b..d1aa190 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.domainservice;
 
 
+import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -32,15 +33,21 @@ public abstract class DomainServiceFacetAbstract
         return DomainServiceFacet.class;
     }
 
+    private final DomainService.MenuBar menuBar;
     private final String menuOrder;
     private final Class<?> repositoryFor;
 
-    public DomainServiceFacetAbstract(final FacetHolder facetHolder, final String menuOrder, final Class<?> repositoryFor) {
+    public DomainServiceFacetAbstract(final FacetHolder facetHolder, final DomainService.MenuBar menuBar, final String menuOrder, final Class<?> repositoryFor) {
         super(DomainServiceFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
+        this.menuBar = menuBar;
         this.menuOrder = menuOrder;
         this.repositoryFor = repositoryFor;
     }
 
+    public DomainService.MenuBar getMenuBar() {
+        return menuBar;
+    }
+
     public String getMenuOrder() {
         return menuOrder;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
index 460b5cd..9448bf8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
@@ -19,13 +19,18 @@
 package org.apache.isis.core.metamodel.facets.object.domainservice.annotation;
 
 
+import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacetAbstract;
 
 
 public class DomainServiceFacetAnnotation extends DomainServiceFacetAbstract {
 
-    public DomainServiceFacetAnnotation(FacetHolder facetHolder, String menuOrder, Class<?> repositoryFor) {
-        super(facetHolder, menuOrder, repositoryFor);
+    public DomainServiceFacetAnnotation(
+            final FacetHolder facetHolder,
+            final DomainService.MenuBar menubar,
+            final String menuOrder,
+            final Class<?> repositoryFor) {
+        super(facetHolder, menubar, menuOrder, repositoryFor);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8aaa166f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index 036ebd8..78f42b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -41,8 +41,8 @@ public class DomainServiceFacetAnnotationFactory extends FacetFactoryAbstract {
         }
         FacetUtil.addFacet(
                 new DomainServiceFacetAnnotation(
-                        processClassContext.getFacetHolder(), 
-                        annotation.menuOrder(), annotation.repositoryFor()));
+                        processClassContext.getFacetHolder(),
+                        annotation.menuBar(), annotation.menuOrder(), annotation.repositoryFor()));
         if(annotation.repositoryFor() != null) {
             FacetUtil.addFacet(
                     new IconFacetDerivedFromDomainServiceAnnotation(