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/05 08:37:34 UTC

isis git commit: ISIS-964: updating todoapp and simpleapp; debugging the new layout hints

Repository: isis
Updated Branches:
  refs/heads/ISIS-964 4495b1a6c -> a39c81586


ISIS-964: updating todoapp and simpleapp; debugging the new layout hints


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

Branch: refs/heads/ISIS-964
Commit: a39c815863e41de354a3b80947e1ab17c9638c09
Parents: 4495b1a
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Dec 5 07:37:08 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Dec 5 07:37:08 2014 +0000

----------------------------------------------------------------------
 .../applib/annotation/CollectionLayout.java     |   5 +
 ...tedByFacetForCollectionLayoutAnnotation.java |   4 +
 ...ByFacetOnCollectionFromLayoutProperties.java |   6 +-
 .../json/LayoutMetadataReaderFromJson.java      |  20 +--
 .../src/main/java/dom/simple/SimpleObjects.java |   4 +-
 .../simple/SimpleObjectsFixturesService.java    |   6 +-
 .../dom/src/main/java/app/ToDoAppDashboard.java |  16 +-
 .../dom/src/main/java/app/ToDoItemAnalysis.java |  18 ++-
 .../java/app/ToDoItemsByCategoryViewModel.java  |  34 ++--
 .../java/app/ToDoItemsByDateRangeViewModel.java |   6 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  10 +-
 .../src/main/java/dom/todo/ToDoItem.layout.json | 158 ++++++++++---------
 .../java/dom/todo/ToDoItemContributions.java    |   6 +-
 .../java/dom/todo/ToDoItemSubscriptions.java    |   9 +-
 .../dom/src/main/java/dom/todo/ToDoItems.java   |  18 ++-
 .../fixture/todo/ToDoItemsFixturesService.java  |  17 +-
 .../prototyping/ExternalLinksService.java       |  14 +-
 .../prototyping/WicketDeveloperUtilities.java   |   6 +-
 18 files changed, 205 insertions(+), 152 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
index f189bd8..007bf4d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
@@ -47,6 +47,11 @@ public @interface CollectionLayout {
 
     /**
      * Indicates where in the UI the collection should <i>not</i>not be visible.
+     *
+     * <p>
+     *      Only {@link Where#NOWHERE NOWHERE} or {@link Where#EVERYWHERE EVERYWHERE}/{@link Where#ANYWHERE ANYWHERE}
+     *      apply for collections.
+     * </p>
      */
     Where hidden() default Where.NOWHERE;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
index 470f7fa..e988062 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
@@ -32,6 +32,10 @@ public class SortedByFacetForCollectionLayoutAnnotation extends SortedByFacetAbs
             return null;
         }
         final Class sortedBy = collectionLayout.sortedBy();
+        if(sortedBy == Comparator.class) {
+            return null;
+        }
+
         return sortedBy != null ? new SortedByFacetForCollectionLayoutAnnotation(sortedBy, holder) : null;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetOnCollectionFromLayoutProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetOnCollectionFromLayoutProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetOnCollectionFromLayoutProperties.java
index 61955af..8a74d02 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetOnCollectionFromLayoutProperties.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetOnCollectionFromLayoutProperties.java
@@ -45,7 +45,11 @@ public class SortedByFacetOnCollectionFromLayoutProperties extends SortedByFacet
         if (sortedBy == null) {
             return null;
         }
-        return ClassUtil.forName(sortedBy);
+        final Class<?> sortedByClass = ClassUtil.forName(sortedBy);
+        if(sortedByClass == Comparator.class) {
+            return null;
+        }
+        return sortedByClass;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index 1e6c579..c135482 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -177,12 +177,12 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
 
             final PropertyLayoutFacetRepr propertyLayout = memberRepr.propertyLayout;
             if(propertyLayout!= null) {
-                props.setProperty("member." + memberName + ".propertyLayout.cssClass", propertyLayout.cssClass);
-                props.setProperty("member." + memberName + ".propertyLayout.describedAs", propertyLayout.describedAs);
+                props.setProperty("member." + memberName + ".propertyLayout.cssClass", ""+propertyLayout.cssClass);
+                props.setProperty("member." + memberName + ".propertyLayout.describedAs", ""+propertyLayout.describedAs);
                 props.setProperty("member." + memberName + ".propertyLayout.hidden", ""+propertyLayout.hidden);
                 props.setProperty("member." + memberName + ".propertyLayout.labelPosition", ""+propertyLayout.labelPosition);
                 props.setProperty("member." + memberName + ".propertyLayout.multiLine", ""+propertyLayout.multiLine);
-                props.setProperty("member." + memberName + ".propertyLayout.named", propertyLayout.named);
+                props.setProperty("member." + memberName + ".propertyLayout.named", ""+propertyLayout.named);
                 props.setProperty("member." + memberName + ".propertyLayout.renderedAsDayBefore", ""+propertyLayout.renderedAsDayBefore);
                 props.setProperty("member." + memberName + ".propertyLayout.typicalLength", ""+propertyLayout.typicalLength);
             }
@@ -190,10 +190,10 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
             // collectionLayout
             final CollectionLayoutFacetRepr collectionLayout = memberRepr.collectionLayout;
             if(collectionLayout!= null) {
-                props.setProperty("member." + memberName + ".collectionLayout.cssClass", collectionLayout.cssClass);
-                props.setProperty("member." + memberName + ".collectionLayout.describedAs", collectionLayout.describedAs);
+                props.setProperty("member." + memberName + ".collectionLayout.cssClass", ""+collectionLayout.cssClass);
+                props.setProperty("member." + memberName + ".collectionLayout.describedAs", ""+collectionLayout.describedAs);
                 props.setProperty("member." + memberName + ".collectionLayout.hidden", ""+collectionLayout.hidden);
-                props.setProperty("member." + memberName + ".collectionLayout.named", collectionLayout.named);
+                props.setProperty("member." + memberName + ".collectionLayout.named", ""+collectionLayout.named);
                 props.setProperty("member." + memberName + ".collectionLayout.paged", ""+collectionLayout.paged);
                 props.setProperty("member." + memberName + ".collectionLayout.render", ""+collectionLayout.render);
                 props.setProperty("member." + memberName + ".collectionLayout.sortedBy", ""+collectionLayout.sortedBy);
@@ -289,11 +289,11 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
 
         final ActionLayoutFacetRepr actionLayout = actionRepr.actionLayout;
         if(actionLayout != null) {
-            props.setProperty(prefix +"." + actionName + ".actionLayout.cssClass", actionLayout.cssClass);
-            props.setProperty(prefix +"." + actionName + ".actionLayout.cssClassFa", actionLayout.cssClassFa);
-            props.setProperty(prefix +"." + actionName + ".actionLayout.describedAs", actionLayout.describedAs);
+            props.setProperty(prefix +"." + actionName + ".actionLayout.cssClass", ""+actionLayout.cssClass);
+            props.setProperty(prefix +"." + actionName + ".actionLayout.cssClassFa", ""+actionLayout.cssClassFa);
+            props.setProperty(prefix +"." + actionName + ".actionLayout.describedAs", ""+actionLayout.describedAs);
             props.setProperty(prefix +"." + actionName + ".actionLayout.hidden", ""+actionLayout.hidden);
-            props.setProperty(prefix +"." + actionName + ".actionLayout.named", actionLayout.named);
+            props.setProperty(prefix +"." + actionName + ".actionLayout.named", ""+actionLayout.named);
             props.setProperty(prefix +"." + actionName + ".actionLayout.position", ""+actionLayout.position);
             props.setProperty(prefix +"." + actionName + ".actionLayout.prototype", ""+actionLayout.prototype);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObjects.java
index 264435c..5540293 100644
--- a/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObjects.java
+++ b/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObjects.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.ParameterLayout;
 
 @DomainService(menuOrder = "10", repositoryFor = SimpleObject.class)
 public class SimpleObjects {
@@ -44,7 +44,7 @@ public class SimpleObjects {
     //region > create (action)
     @MemberOrder(sequence = "2")
     public SimpleObject create(
-            final @Named("Name") String name) {
+            final @ParameterLayout(named="Name") String name) {
         final SimpleObject obj = container.newTransientInstance(SimpleObject.class);
         obj.setName(name);
         container.persistIfNotAlready(obj);

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
index 7868d3c..7f57ab6 100644
--- a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
@@ -21,9 +21,9 @@ package fixture.simple;
 import fixture.simple.scenario.SimpleObjectsFixture;
 
 import java.util.List;
+import org.apache.isis.applib.annotation.ClassLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Prototype;
 import org.apache.isis.applib.fixturescripts.FixtureResult;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
@@ -33,8 +33,8 @@ import org.apache.isis.applib.fixturescripts.SimpleFixtureScript;
 /**
  * Enables fixtures to be installed from the application.
  */
-@Named("Prototyping")
-@DomainService(menuOrder = "20")
+@ClassLayout(named="Prototyping")
+@DomainService(menuBar= DomainService.MenuBar.SECONDARY, menuOrder = "20")
 public class SimpleObjectsFixturesService extends FixtureScripts {
 
     public SimpleObjectsFixturesService() {

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboard.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboard.java b/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboard.java
index 47210ff..b50a50d 100644
--- a/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboard.java
+++ b/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboard.java
@@ -20,10 +20,8 @@ package app;
 
 import java.util.List;
 import org.apache.isis.applib.AbstractViewModel;
+import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.Disabled;
-import org.apache.isis.applib.annotation.Named;
-import org.apache.isis.applib.annotation.Render;
-import org.apache.isis.applib.annotation.Render.Type;
 
 public class ToDoAppDashboard extends AbstractViewModel {
 
@@ -49,8 +47,10 @@ public class ToDoAppDashboard extends AbstractViewModel {
     //endregion
 
     //region > getAnalysisByCategory (collection)
-    @Named("By Category")
-    @Render(Type.EAGERLY)
+    @CollectionLayout(
+            named="By Category",
+            render = CollectionLayout.RenderType.EAGERLY
+    )
     @Disabled
     public List<ToDoItemsByCategoryViewModel> getAnalysisByCategory() {
         return toDoItemAnalysis.toDoItemsByCategory();
@@ -58,8 +58,10 @@ public class ToDoAppDashboard extends AbstractViewModel {
     //endregion
 
     //region > getAnalysisByDateRange (collection)
-    @Named("By Date Range")
-    @Render(Type.EAGERLY)
+    @CollectionLayout(
+            named="By Date Range",
+            render = CollectionLayout.RenderType.EAGERLY
+    )
     @Disabled
     public List<ToDoItemsByDateRangeViewModel> getAnalysisByDateRange() {
         return toDoItemAnalysis.toDoItemsByDateRange();

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/app/ToDoItemAnalysis.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/app/ToDoItemAnalysis.java b/example/application/todoapp/dom/src/main/java/app/ToDoItemAnalysis.java
index ebbcc5d..ba0617f 100644
--- a/example/application/todoapp/dom/src/main/java/app/ToDoItemAnalysis.java
+++ b/example/application/todoapp/dom/src/main/java/app/ToDoItemAnalysis.java
@@ -26,16 +26,16 @@ import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.CssClassFa;
+import org.apache.isis.applib.annotation.ClassLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Programmatic;
 
-@Named("Analysis")
+@ClassLayout(named="Analysis")
 @DomainService(menuOrder = "20")
 public class ToDoItemAnalysis {
 
@@ -52,8 +52,10 @@ public class ToDoItemAnalysis {
 
 
     //region > byCategory (action)
-    @CssClassFa("fa fa-pie-chart")
-    @Named("By Category")
+    @ActionLayout(
+        cssClassFa="fa fa-pie-chart",
+        named="By Category"
+    )
     @Bookmarkable
     @ActionSemantics(Of.SAFE)
     @MemberOrder(sequence = "1")
@@ -83,8 +85,10 @@ public class ToDoItemAnalysis {
         Unknown,
     }
 
-    @CssClassFa("fa fa-calendar")
-    @Named("By Date Range")
+    @ActionLayout(
+        cssClassFa="fa fa-calendar",
+        named="By Date Range"
+    )
     @Bookmarkable
     @ActionSemantics(Of.SAFE)
     @MemberOrder(sequence = "1")

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java b/example/application/todoapp/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
index 19abcac..465d707 100644
--- a/example/application/todoapp/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
+++ b/example/application/todoapp/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
@@ -20,7 +20,6 @@ package app;
 
 import dom.todo.ToDoItem;
 import dom.todo.ToDoItem.Category;
-import dom.todo.ToDoItem.Subcategory;
 import dom.todo.ToDoItems;
 
 import java.util.Arrays;
@@ -30,16 +29,19 @@ import com.google.common.base.Joiner;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.MultiLine;
-import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.ClassLayout;
+import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Render;
 import org.apache.isis.applib.annotation.Render.Type;
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.applib.annotation.ViewModel;
 import org.apache.isis.applib.util.ObjectContracts;
 
-@Named("By Category")
+@ClassLayout(
+        named="By Category"
+)
 @Bookmarkable
 @ViewModel
 public class ToDoItemsByCategoryViewModel 
@@ -68,14 +70,18 @@ public class ToDoItemsByCategoryViewModel
     //endregion
 
     //region > notYetComplete (property), complete (property)
-    @MultiLine(numberOfLines=5)
+    @PropertyLayout(
+        multiLine=5
+    )
     public String getNotYetComplete() {
         final List<ToDoItem> notYetComplete = getItemsNotYetComplete();
         return Joiner.on(", ").join(
             Iterables.transform(subcategories(), summarizeBySubcategory(notYetComplete)));
     }
 
-    @MultiLine(numberOfLines=5)
+    @PropertyLayout(
+        multiLine=5
+    )
     public String getComplete() {
         final List<ToDoItem> completeInCategory = getItemsComplete();
         return Joiner.on(", ").join(
@@ -84,20 +90,20 @@ public class ToDoItemsByCategoryViewModel
 
     // //////////////////////////////////////
 
-    private Iterable<Subcategory> subcategories() {
-        return Iterables.filter(Arrays.asList(Subcategory.values()), Subcategory.thoseFor(getCategory()));
+    private Iterable<ToDoItem.Subcategory> subcategories() {
+        return Iterables.filter(Arrays.asList(ToDoItem.Subcategory.values()), ToDoItem.Subcategory.thoseFor(getCategory()));
     }
 
-    private Function<Subcategory, String> summarizeBySubcategory(final Iterable<ToDoItem> itemsInCategory) {
-        return new Function<Subcategory, String>() {
+    private Function<ToDoItem.Subcategory, String> summarizeBySubcategory(final Iterable<ToDoItem> itemsInCategory) {
+        return new Function<ToDoItem.Subcategory, String>() {
             @Override
-            public String apply(final Subcategory subcategory) {
+            public String apply(final ToDoItem.Subcategory subcategory) {
                 return subcategory + ": " + countIn(itemsInCategory, subcategory);
             }
         };
     }
 
-    private static int countIn(final Iterable<ToDoItem> items, final Subcategory subcategory) {
+    private static int countIn(final Iterable<ToDoItem> items, final ToDoItem.Subcategory subcategory) {
         return Iterables.size(Iterables.filter(items,
                 ToDoItem.Predicates.thoseSubcategorised(subcategory)));
     }
@@ -125,7 +131,9 @@ public class ToDoItemsByCategoryViewModel
     //endregion
 
     //region > deleteCompleted (action)
-    @Named("Delete")
+    @ActionLayout(
+            named="Delete"
+    )
     public ToDoItemsByCategoryViewModel deleteCompleted() {
         for (ToDoItem item : getItemsComplete()) {
             container.removeIfNotAlready(item);

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java b/example/application/todoapp/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
index 12291af..ee72334 100644
--- a/example/application/todoapp/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
+++ b/example/application/todoapp/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
@@ -29,7 +29,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.joda.time.DateTime;
 import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.ClassLayout;
 import org.apache.isis.applib.annotation.Render;
 import org.apache.isis.applib.annotation.Render.Type;
 import org.apache.isis.applib.annotation.Title;
@@ -37,7 +37,9 @@ import org.apache.isis.applib.annotation.ViewModel;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.util.ObjectContracts;
 
-@Named("By Date Range")
+@ClassLayout(
+    named="By Date Range"
+)
 @Bookmarkable
 @ViewModel
 public class ToDoItemsByDateRangeViewModel

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
index c3244fb..6a6aad8 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
@@ -580,11 +580,11 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
     // (a) has different semantics and (b) is in any case automatically ignored
     // by the framework
     public ToDoItem duplicate(
-            final @RegEx(validation = "\\w[@&:\\-\\,\\.\\+ \\w]*") @Named("Description") String description, 
-            final @Named("Category") Category category,
-            final @Named("Subcategory") Subcategory subcategory,
-            final @Optional @Named("Due by") LocalDate dueBy,
-            final @Optional @Named("Cost") BigDecimal cost) {
+            final @RegEx(validation = "\\w[@&:\\-\\,\\.\\+ \\w]*") @ParameterLayout(named="Description") String description,
+            final @ParameterLayout(named="Category") Category category,
+            final @ParameterLayout(named="Subcategory") Subcategory subcategory,
+            final @Optional @ParameterLayout(named="Due by") LocalDate dueBy,
+            final @Optional @ParameterLayout(named="Cost") BigDecimal cost) {
         return toDoItems.newToDo(description, category, subcategory, dueBy, cost);
     }
     public String default0Duplicate() {

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
index 0619d46..9d9f7a8 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.layout.json
@@ -22,54 +22,64 @@
             "General": {
                 "members": {
                     "description": {
-                        "typicalLength": { "value": 50 },
-                        "propertyLayout": { "labelPosition": "TOP" }
+                        "propertyLayout": {
+                            "labelPosition": "TOP",
+                            "typicalLength": 50
+                        }
                     },
                     "category": {
-                        "propertyLayout": { "labelPosition": "TOP" }
+                        "propertyLayout": {
+                            "labelPosition": "TOP"
+                        }
                     },
                     "subcategory": {
-                        "propertyLayout": { "labelPosition": "NONE" },
+                        "propertyLayout": {
+                            "labelPosition": "NONE"
+                        },
                         "actions": {
                             "updateCategory": {
-                                "named": {
-                                    "value": "Update"
+                                "actionLayout": {
+                                    "named": "Update"
                                 }
                             },
                             "analyseCategory": {
-                                "cssClass": { "value": "btn-default" },
-                                "cssClassFa": { "value": "fa fa-pie-chart" }
+                                "actionLayout": {
+                                    "cssClass": "btn-default",
+                                    "cssClassFa": "fa fa-pie-chart"
+                                }
                             }
                         }
                     },
                     "ownedBy": {
-                        "hidden": {}
+                        "propertyLayout": {
+                            "hidden": "EVERYWHERE"
+                        }
                     },
                     "complete": {
+                        "propertyLayout": {
+                            "describedAs": "Whether this todo item has been completed"
+                        },
                         "actions": {
                             "completed": {
-                                "named": { "value": "Done" },
-                                "describedAs": {
-                                    "value": "Update this todo item as complete"
-                                },
-                                "cssClass": { "value": "btn-success" },
-                                "cssClassFa": { "value": "fa fa-thumbs-up" }
+                                "actionLayout": {
+                                    "named": "Done",
+                                    "describedAs": "Update this todo item as complete",
+                                    "cssClass": "btn-success",
+                                    "cssClassFa": "fa fa-thumbs-up"
+                                }
                             },
                             "notYetCompleted": {
-                                "named": { "value": "Not done" },
-                                "describedAs": {
-                                    "value": "Update this todo item as not yet complete"
-                                },
-                                "cssClass": { "value": "btn-info" },
-                                "cssClassFa": { "value": "fa fa-thumbs-down" }
+                                "actionLayout": {
+                                    "named": "Not done",
+                                    "describedAs": "Update this todo item as not yet complete",
+                                    "cssClass": "btn-info",
+                                    "cssClassFa": "fa fa-thumbs-down"
+                                }
                             },
                             "scheduleExplicitly": {
                             },
                             "scheduleImplicitly": {
                             }
-                        },
-                        "describedAs": {
-                            "value": "Whether this todo item has been completed"
                         }
                     }
                 }
@@ -77,13 +87,11 @@
             "Misc": {
                 "members": {
                     "versionSequence": {
-                        "named": {
-                            "value": "Version"
+                        "propertyLayout": {
+                            "named": "Version",
+                            "hidden": "ALL_TABLES"
                         },
-                        "disabled": {},
-                        "hidden": {
-                            "where": "ALL_TABLES"
-                        }
+                        "disabled": {}
                     }
                 }
             }
@@ -97,15 +105,21 @@
                      "relativePriority": {
                         "actions": {
                             "previous": {
-                                "cssClassFa": { "value": "fa fa-step-backward" }
+                                "actionLayout": {
+                                    "cssClassFa": "fa fa-step-backward"
+                                }
                             },
                             "next": {
-                                "cssClassFa": { "value": "fa fa-step-forward" }
+                                "actionLayout": {
+                                    "cssClassFa": "fa fa-step-forward"
+                                }
                             }
                         }
                     },
                     "dueBy": {
-                        "cssClass": { "value": "x-key" }
+                        "propertyLayout": {
+                            "cssClass": "x-key"
+                        }
                     }
                 }
             },
@@ -114,28 +128,28 @@
                     "cost": {
                         "actions": {
                             "updateCost":{
-                                "named": { "value": "Update" },
-                                "cssClassFa": { "value": "fa fa-dollar" }
+                                "actionLayout": {
+                                    "named": "Update",
+                                    "cssClassFa": "fa fa-dollar"
+                                }
                             }
                         }
                     },
                     "notes": {
-                        "multiLine": {
-                            "numberOfLines": 5
-                        },
-                        "hidden": {
-                            "where": "ALL_TABLES"
-                        },
-                        "propertyLayout": { "labelPosition": "TOP" }
+                        "propertyLayout": {
+                            "hidden": "ALL_TABLES",
+                            "labelPosition": "TOP",
+                            "multiLine": 5
+                        }
                     },
                     "attachment": {
-                        "hidden": {
-                            "where": "STANDALONE_TABLES"
+                        "propertyLayout": {
+                            "hidden": "STANDALONE_TABLES"
                         }
                     },
                     "doc": {
-                        "hidden": {
-                            "where": "STANDALONE_TABLES"
+                        "propertyLayout": {
+                            "hidden": "STANDALONE_TABLES"
                         }
                     }
                 }
@@ -149,32 +163,32 @@
         "span": 6,
         "collections": {
             "dependencies": {
+                "collectionLayout": {
+                    "paged": 5,
+                    "render": "EAGERLY"
+                },
                 "disabled": {},
                 "actions": {
                     "add":{
-                        "cssClass": { "value": "btn-default" },
-                        "cssClassFa": { "value": "fa fa-plus-square" }
+                        "actionLayout": {
+                            "cssClass": "btn-default",
+                            "cssClassFa": "fa fa-plus-square"
+                        }
                     },
                     "remove": {
-                        "cssClass": { "value": "x-caution btn-default" },
-                        "cssClassFa": { "value": "fa fa-minus-square" }
+                        "actionLayout": {
+                            "cssClass": "x-caution btn-default",
+                            "cssClassFa": "fa fa-minus-square"
+                        }
                     }
-                },
-                "paged": {
-                    "value": 5
-                },
-                "render": {
-                    "value": "EAGERLY"
                 }
             },
             "similarTo": {
-                "disabled": {},
-                "paged": {
-                    "value": 3
+                "collectionLayout": {
+                    "paged": 3,
+                    "render": "LAZILY"
                 },
-                "render": {
-                    "value": "LAZILY"
-                }
+                "disabled": {}
             }
         }
     }
@@ -182,18 +196,18 @@
     "actions": {
         "totalCost": {},
         "delete": {
-            "cssClass": { "value": "btn btn-danger" },
-            "cssClassFa": { "value": "fa fa-trash fa-lg" }
+            "actionLayout": {
+                "cssClass": "btn btn-danger",
+                "cssClassFa": "fa fa-trash fa-lg"
+            }
         },
         "duplicate": {
-	          "named": {
-	              "value": "Clone"
-	          },
-            "describedAs": {
-                "value": "Create a new todo item from this one"
-            },
-            "cssClass": { "value": "btn-default" },
-            "cssClassFa": { "value": "fa fa-copy fa-lg" }
+            "actionLayout": {
+                "named": "Clone",
+                "describedAs": "Create a new todo item from this one",
+                "cssClass": "btn-default",
+                "cssClassFa": "fa fa-copy fa-lg"
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
index 011ed2b..3ea61ff 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -36,11 +36,11 @@ import org.apache.isis.applib.annotation.DescribedAs;
 import org.apache.isis.applib.annotation.Disabled;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.Hidden;
-import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.NotContributed;
 import org.apache.isis.applib.annotation.NotContributed.As;
 import org.apache.isis.applib.annotation.NotInServiceMenu;
 import org.apache.isis.applib.annotation.Optional;
+import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
@@ -195,8 +195,8 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     @ActionSemantics(Of.IDEMPOTENT)
     public Categorized updateCategory(
             final Categorized item,
-            final @Named("Category") Category category,
-            final @Optional @Named("Subcategory") Subcategory subcategory) {
+            final @ParameterLayout(named="Category") Category category,
+            final @Optional @ParameterLayout(named="Subcategory") Subcategory subcategory) {
         item.setCategory(category);
         item.setSubcategory(subcategory);
         return item;

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
index f68616d..bd81ae7 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
@@ -29,6 +29,7 @@ import com.google.common.eventbus.Subscribe;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
@@ -55,7 +56,7 @@ import static com.google.common.collect.Lists.newArrayList;
  *     vetoing the change).
  * </p>
  */
-@DomainService
+@DomainService(menuBar = DomainService.MenuBar.SECONDARY, menuOrder = "30")
 public class ToDoItemSubscriptions {
 
     //region > LOG
@@ -124,9 +125,11 @@ public class ToDoItemSubscriptions {
     /**
      * To demo/test what occurs if a subscriber that might veto an event.
      */
-    @Prototype
     @MemberOrder(name = "Prototyping", sequence = "80")
-    @Named("Set subscriber behaviour")
+    @ActionLayout(
+        named="Set subscriber behaviour",
+        prototype = true
+    )
     @NotContributed
     @ActionSemantics(ActionSemantics.Of.IDEMPOTENT)
     public void subscriberBehaviour(@Named("Behaviour") Behaviour behaviour) {

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
index bc0aeaa..ac14828 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
@@ -29,18 +29,20 @@ import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.applib.annotation.ClassLayout;
 import org.apache.isis.applib.annotation.CssClassFa;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Optional;
+import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Prototype;
 import org.apache.isis.applib.annotation.RegEx;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.services.clock.ClockService;
 
-@Named("ToDos")
+@ClassLayout(named="ToDos")
 @DomainService(menuOrder = "10", repositoryFor = ToDoItem.class)
 public class ToDoItems {
 
@@ -94,9 +96,9 @@ public class ToDoItems {
     @MemberOrder(sequence = "40")
     @CssClassFa("fa fa-question")
     public List<ToDoItem> categorized(
-    		@Named("Category") final Category category,
-    		@Named("Subcategory") final Subcategory subcategory,
-    		@Named("Completed?") final boolean completed) {
+    		@ParameterLayout(named="Category") final Category category,
+    		@ParameterLayout(named="Subcategory") final Subcategory subcategory,
+    		@ParameterLayout(named="Completed?") final boolean completed) {
     	// an example "naive" implementation (filtered in Java code, not DBMS)
         return container.allMatches(ToDoItem.class, 
                 Predicates.and(
@@ -130,10 +132,10 @@ public class ToDoItems {
     @MemberOrder(sequence = "5")
     public ToDoItem newToDo(
             final @RegEx(validation = "\\w[@&:\\-\\,\\.\\+ \\w]*") @Named("Description") String description, 
-            final @Named("Category") Category category,
-            final @Optional @Named("Subcategory") Subcategory subcategory,
-            final @Optional @Named("Due by") LocalDate dueBy,
-            final @Optional @Named("Cost") BigDecimal cost) {
+            final @ParameterLayout(named="Category") Category category,
+            final @Optional @ParameterLayout(named="Subcategory") Subcategory subcategory,
+            final @Optional @ParameterLayout(named="Due by") LocalDate dueBy,
+            final @Optional @ParameterLayout(named="Cost") BigDecimal cost) {
         return newToDo(description, category, subcategory, currentUserName(), dueBy, cost);
     }
     public Category default1NewToDo() {

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
index 4cb06fa..12305ee 100644
--- a/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
@@ -21,13 +21,12 @@ package fixture.todo;
 import fixture.todo.scenarios.ToDoItemsRecreateAndCompleteSeveral;
 
 import java.util.List;
+import org.apache.isis.applib.annotation.ClassLayout;
 import org.apache.isis.applib.annotation.CssClassFa;
-import org.apache.isis.applib.annotation.DescribedAs;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.MultiLine;
-import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Optional;
+import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Prototype;
 import org.apache.isis.applib.fixturescripts.FixtureResult;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
@@ -36,8 +35,10 @@ import org.apache.isis.applib.fixturescripts.FixtureScripts;
 /**
  * Enables fixtures to be installed from the application.
  */
-@Named("Prototyping")
-@DomainService(menuBar = DomainService.MenuBar.SECONDARY, menuOrder = "40.1")
+@ClassLayout(
+        named = "Prototyping"
+)
+@DomainService(menuBar = DomainService.MenuBar.SECONDARY, menuOrder = "10")
 public class ToDoItemsFixturesService extends FixtureScripts {
 
     public ToDoItemsFixturesService() {
@@ -48,8 +49,10 @@ public class ToDoItemsFixturesService extends FixtureScripts {
     @Override
     public List<FixtureResult> runFixtureScript(
             final FixtureScript fixtureScript,
-            final @Named("Parameters") @DescribedAs("Script-specific parameters (key=value) ")
-            @MultiLine(numberOfLines = 10)
+            final @ParameterLayout(
+                    named="Parameters",
+                    describedAs = "Script-specific parameters (key=value) ",
+                    multiLine = 10)
             @Optional
             String parameters) {
         return super.runFixtureScript(fixtureScript, parameters);

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java b/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
index 6caa244..eb1cc5f 100644
--- a/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
+++ b/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
@@ -18,15 +18,15 @@ package webapp.prototyping;
 
 import java.net.MalformedURLException;
 import java.net.URL;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
-import org.apache.isis.applib.annotation.CssClassFa;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Prototype;
 
-@DomainService(menuOrder = "40.3")
+@DomainService(menuBar = DomainService.MenuBar.SECONDARY, menuOrder = "20")
 public class ExternalLinksService {
 
     public static enum ExternalLink {
@@ -50,11 +50,13 @@ public class ExternalLinksService {
         }
     }
 
-    @CssClassFa("fa-external-link")
-    @Prototype
+    @ActionLayout(
+        cssClassFa = "fa-external-link" ,
+        prototype = true
+    )
     @ActionSemantics(Of.SAFE)
     @MemberOrder(name="Prototyping", sequence="91.1")
-    public URL goToDocs(@Named("Link") ExternalLink link) throws MalformedURLException {
+    public URL goToDocs(@ParameterLayout(named="Link") ExternalLink link) throws MalformedURLException {
         return link.open();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a39c8158/example/application/todoapp/webapp/src/main/java/webapp/prototyping/WicketDeveloperUtilities.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/java/webapp/prototyping/WicketDeveloperUtilities.java b/example/application/todoapp/webapp/src/main/java/webapp/prototyping/WicketDeveloperUtilities.java
index b97d146..f6c2fbc 100644
--- a/example/application/todoapp/webapp/src/main/java/webapp/prototyping/WicketDeveloperUtilities.java
+++ b/example/application/todoapp/webapp/src/main/java/webapp/prototyping/WicketDeveloperUtilities.java
@@ -16,19 +16,19 @@
  */
 package webapp.prototyping;
 
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.viewer.wicket.viewer.applib.WicketDeveloperUtilitiesService;
 
 /**
  * These overrides are simply to 'move' the action underneath the 
  * 'Prototyping' menu.
  */
-@DomainService(menuOrder = "40.3")
+@DomainService(menuBar = DomainService.MenuBar.SECONDARY, menuOrder = "40")
 public class WicketDeveloperUtilities extends WicketDeveloperUtilitiesService {
 
-    @Named("Clear i18n Cache")
+    @ActionLayout(named="Clear i18n Cache")
     @MemberOrder(name="Prototyping", sequence="90.3")
     @Override
     public void resetI18nCache() {