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 2013/12/20 21:36:03 UTC

git commit: ISIS-638: clipboard panel now subscribes for itself...

Updated Branches:
  refs/heads/master bb2d31e1d -> f031f27b9


ISIS-638: clipboard panel now subscribes for itself...

... rather than relying on the EntityIconAndTitlePanel.

This latter now strips off any UI hints.

In addition:
* any out-of-range or non-parseable/invalid hints are ignored.


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

Branch: refs/heads/master
Commit: f031f27b92f710539a706c9d52f27777e2e355dd
Parents: bb2d31e
Author: Dan Haywood <da...@apache.org>
Authored: Fri Dec 20 18:37:15 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Fri Dec 20 18:37:15 2013 +0000

----------------------------------------------------------------------
 .../model/hints/UiHintsBroadcastEvent.java      |  15 ++-
 .../model/hints/UiHintsEventAbstract.java       |  24 +++++
 .../wicket/model/hints/UiHintsSetEvent.java     |  15 ++-
 .../model/mementos/PageParameterNames.java      |   2 +-
 .../viewer/wicket/model/models/EntityModel.java |   8 +-
 .../CollectionContentsAsAjaxTablePanel.java     |  22 ++--
 .../CollectionContentsSortableDataProvider.java |  16 ++-
 .../IsisAjaxFallbackOrderByBorder.java          |   2 +-
 .../IsisAjaxPagingNavigationIncrementLink.java  |   2 +-
 .../ajaxtable/IsisAjaxPagingNavigationLink.java |   2 +-
 .../icontitle/EntityIconAndTitlePanel.java      |  38 +++----
 .../widgets/zclip/ZeroClipboardPanel.css        |  23 +++++
 .../widgets/zclip/ZeroClipboardPanel.html       |  32 ++++++
 .../widgets/zclip/ZeroClipboardPanel.java       | 101 +++++++++++++++++++
 .../viewer/wicket/ui/pages/PageAbstract.java    |   5 +-
 .../links/LinksSelectorPanelAbstract.java       |  26 +++--
 .../isis/viewer/wicket/ui/util/Links.java       |   6 +-
 17 files changed, 264 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsBroadcastEvent.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsBroadcastEvent.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsBroadcastEvent.java
index 0aa05f3..afe237d 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsBroadcastEvent.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsBroadcastEvent.java
@@ -2,16 +2,13 @@ package org.apache.isis.viewer.wicket.model.hints;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 
-public class UiHintsBroadcastEvent
-{
-    private final AjaxRequestTarget target;
-    
-    public UiHintsBroadcastEvent(AjaxRequestTarget target) {
-        this.target = target;
-    }
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
 
-    public AjaxRequestTarget getTarget() {
-        return target;
+public class UiHintsBroadcastEvent extends UiHintsEventAbstract {
+    
+    public UiHintsBroadcastEvent(UiHintsEventAbstract ev) {
+        super(ev.getUiHintContainer(), ev.getTarget());
     }
+    
 }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsEventAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsEventAbstract.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsEventAbstract.java
new file mode 100644
index 0000000..f3ece16
--- /dev/null
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsEventAbstract.java
@@ -0,0 +1,24 @@
+package org.apache.isis.viewer.wicket.model.hints;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+
+public abstract class UiHintsEventAbstract {
+    
+    private final UiHintContainer uiHintContainer;
+    private final AjaxRequestTarget target;
+    
+    public UiHintsEventAbstract(UiHintContainer uiHintContainer, AjaxRequestTarget target) {
+        this.uiHintContainer = uiHintContainer;
+        this.target = target;
+    }
+
+    public UiHintContainer getUiHintContainer() {
+        return uiHintContainer;
+    }
+    public AjaxRequestTarget getTarget() {
+        return target;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsSetEvent.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsSetEvent.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsSetEvent.java
index fe51798..22286f3 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsSetEvent.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/hints/UiHintsSetEvent.java
@@ -2,16 +2,13 @@ package org.apache.isis.viewer.wicket.model.hints;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 
-public class UiHintsSetEvent
-{
-    private final AjaxRequestTarget target;
-    
-    public UiHintsSetEvent(AjaxRequestTarget target) {
-        this.target = target;
-    }
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
 
-    public AjaxRequestTarget getTarget() {
-        return target;
+public class UiHintsSetEvent extends UiHintsEventAbstract {
+    
+    public UiHintsSetEvent(UiHintContainer uiHintContainer, AjaxRequestTarget target) {
+        super(uiHintContainer, target);
     }
+    
 }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java
index f9c52af..75f1a64 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/PageParameterNames.java
@@ -43,7 +43,7 @@ public enum PageParameterNames {
     /**
      * Hints for the rendering of an entity.
      */
-    HINTS,
+    ANCHOR,
     
     /**
      * Owning type of an action.

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index b503db2..a2b53cf 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -193,6 +193,10 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
         return pageParameters;
     }
 
+    public PageParameters getPageParametersWithoutUiHints() {
+        return createPageParameters(getObject());
+    }
+
 
     static interface HintPageParameterSerializer {
         public void hintsToPageParameters(Map<String,String> hints, PageParameters pageParameters);
@@ -240,11 +244,11 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
                 memento.set(safeKey, value);
             }
             String serializedHints = memento.asString();
-            PageParameterNames.HINTS.addStringTo(pageParameters, serializedHints);
+            PageParameterNames.ANCHOR.addStringTo(pageParameters, serializedHints);
         }
 
         public void pageParametersToHints(final PageParameters pageParameters, Map<String,String> hints) {
-            String hintsStr = PageParameterNames.HINTS.getStringFrom(pageParameters);
+            String hintsStr = PageParameterNames.ANCHOR.getStringFrom(pageParameters);
             if(hintsStr != null) {
                 try {
                     Memento memento = new ViewModelSupportDefault().parse(hintsStr);

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 03e3a96..4792714 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -78,6 +78,8 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
     private static final String ID_TABLE = "table";
     private static final String ID_ENTITY_ACTIONS = "entityActions";
     private static final String ID_ACTION_PROMPT_MODAL_WINDOW = "actionPromptModalWindow";
+    
+    private static final String UIHINT_PAGE_NUMBER = "pageNumber";
 
     private static final Predicate<ObjectAction> BULK = Filters.asPredicate(ObjectAction.Filters.bulk());
     
@@ -85,11 +87,8 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
 
     public CollectionContentsAsAjaxTablePanel(final String id, final EntityCollectionModel model) {
         super(id, model);
-    }
-
-    @Override
-    protected void onInitialize() {
-        super.onInitialize();
+        // build eagerly rather than onInitialize...
+        // want to ensure that set sorting hints prior to pageNumber hint
         buildGui();
     }
 
@@ -119,17 +118,20 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
         if(uiHintContainer == null) {
             return;
         }
-        final String pageNumber = uiHintContainer.getHint(dataTable, "pageNumber");
-        if(pageNumber != null) {
+        final String pageNumberStr = uiHintContainer.getHint(dataTable, UIHINT_PAGE_NUMBER);
+        if(pageNumberStr != null) {
             try {
-                long parseLong = Long.parseLong(pageNumber);
-                dataTable.setCurrentPage(parseLong);
+                long pageNumber = Long.parseLong(pageNumberStr);
+                if(pageNumber >= 0) {
+                    // dataTable is clever enough to deal with too-large numbers
+                    dataTable.setCurrentPage(pageNumber);
+                }
             } catch(Exception ex) {
                 // ignore.
             }
         }
         final long currentPage = dataTable.getCurrentPage();
-        uiHintContainer.setHint(dataTable, "pageNumber", ""+currentPage);
+        uiHintContainer.setHint(dataTable, UIHINT_PAGE_NUMBER, ""+currentPage);
     }
 
     private void addToggleboxColumnIfRequired(final List<IColumn<ObjectAdapter,String>> columns, List<ObjectAction> bulkActions) {

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
index cc6f35e..15cf18b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
@@ -31,6 +31,7 @@ import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.ObjectSpecificationException;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
@@ -80,13 +81,18 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
         final ObjectSpecification elementSpec = model.getTypeOfSpecification();
         
         final String sortPropertyId = sort.getProperty();
-        final ObjectAssociation sortProperty = elementSpec.getAssociation(sortPropertyId);
-        if(sortProperty == null) {
+        try {
+            final ObjectAssociation sortProperty = elementSpec.getAssociation(sortPropertyId);
+            if(sortProperty == null) {
+                return adapters;
+            }
+            
+            Ordering<ObjectAdapter> ordering = orderingBy(sortProperty, sort.isAscending());
+            return ordering.sortedCopy(adapters);
+        } catch(ObjectSpecificationException ex) {
+            // eg invalid propertyId
             return adapters;
         }
-
-        Ordering<ObjectAdapter> ordering = orderingBy(sortProperty, sort.isAscending());
-        return ordering.sortedCopy(adapters);
     }
 
     public static Ordering<ObjectAdapter> orderingBy(final ObjectAssociation sortProperty, final boolean ascending) {

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackOrderByBorder.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackOrderByBorder.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackOrderByBorder.java
index 0f9f476..8030bf1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackOrderByBorder.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxFallbackOrderByBorder.java
@@ -53,7 +53,7 @@ public class IsisAjaxFallbackOrderByBorder<T> extends AjaxFallbackOrderByBorder<
         if(uiHintContainer != null) {
             String hintKey = sortOrderName();
             uiHintContainer.setHint(dataTable, hintKey, sortProperty.toString());
-            send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(target));
+            send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(uiHintContainer, target));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationIncrementLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationIncrementLink.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationIncrementLink.java
index 019dfd4..cf6358b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationIncrementLink.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationIncrementLink.java
@@ -41,7 +41,7 @@ public class IsisAjaxPagingNavigationIncrementLink extends AjaxPagingNavigationI
         final UiHintContainer uiHintContainer = getUiHintContainer();
         if(uiHintContainer != null) {
             uiHintContainer.setHint(component, "pageNumber", ""+pageable.getCurrentPage());
-            send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(target));
+            send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(uiHintContainer, target));
         }
     }
     

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationLink.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationLink.java
index 62776f5..b2a38ab 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationLink.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/IsisAjaxPagingNavigationLink.java
@@ -41,7 +41,7 @@ public class IsisAjaxPagingNavigationLink extends AjaxPagingNavigationLink {
         final UiHintContainer uiHintContainer = getUiHintContainer();
         if(uiHintContainer != null) {
             uiHintContainer.setHint(component, "pageNumber", ""+pageable.getCurrentPage());
-            send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(target));
+            send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(uiHintContainer, target));
         }
     }
     

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
index c230924..cc4b8ab 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
@@ -20,6 +20,7 @@
 package org.apache.isis.viewer.wicket.ui.components.entity.icontitle;
 
 import java.net.ResponseCache;
+import java.util.Set;
 
 import com.google.common.base.Strings;
 import com.google.inject.Inject;
@@ -111,27 +112,33 @@ public class EntityIconAndTitlePanel extends PanelAbstract<EntityModel> {
     private WebMarkupContainer addOrReplaceLinkWrapper(final EntityModel entityModel) {
         final ObjectAdapter adapter = entityModel.getObject();
 
-        final PageParameters pageParameters = entityModel.getPageParameters();
-        
-        final Class<? extends Page> pageClass = getPageClassRegistry().getPageClass(PageType.ENTITY);
-        
         final WebMarkupContainer entityLinkWrapper = new WebMarkupContainer(ID_ENTITY_LINK_WRAPPER);
-        final AbstractLink link = createIconAndTitle(adapter, pageParameters, pageClass);
+        
+        final AbstractLink link = createIconAndTitle(adapter);
         entityLinkWrapper.addOrReplace(link);
         
         return entityLinkWrapper;
     }
 
-    private AbstractLink createIconAndTitle(final ObjectAdapter adapter, final PageParameters pageParameters, final Class<? extends Page> pageClass) {
-        final AbstractLink link = Links.newBookmarkablePageLinkWithHints(ID_ENTITY_LINK, pageParameters, pageClass);
+    private AbstractLink createIconAndTitle(final ObjectAdapter adapter) {
+        final AbstractLink link = createLinkWrapper();
         
         link.addOrReplace(this.label = newLabel(ID_ENTITY_TITLE));
         link.addOrReplace(this.image = newImage(ID_ENTITY_ICON, adapter));
         
-        link.add(new AttributeModifier("title", adapter.getSpecification().getSingularName()));
+        String entityTypeName = adapter.getSpecification().getSingularName();
+        link.add(new AttributeModifier("title", entityTypeName));
+        
         return link;
     }
 
+    private AbstractLink createLinkWrapper() {
+        final PageParameters pageParameters = getModel().getPageParametersWithoutUiHints();
+        
+        final Class<? extends Page> pageClass = getPageClassRegistry().getPageClass(PageType.ENTITY);
+        return Links.newBookmarkablePageLink(ID_ENTITY_LINK, pageParameters, pageClass);
+    }
+
     protected Label newLabel(final String id) {
         final String title = determineTitle();
         return new Label(id, title);
@@ -187,21 +194,6 @@ public class EntityIconAndTitlePanel extends PanelAbstract<EntityModel> {
     }
 
     
-    // ///////////////////////////////////////////////////////////////////
-    // UI Hints
-    // ///////////////////////////////////////////////////////////////////
-    
-    /* (non-Javadoc)
-     * @see org.apache.wicket.Component#onEvent(org.apache.wicket.event.IEvent)
-     */
-    @Override
-    public void onEvent(IEvent<?> event) {
-        if(event.getPayload() instanceof UiHintsBroadcastEvent) {
-            UiHintsBroadcastEvent ev = (UiHintsBroadcastEvent) event.getPayload();
-            buildGui();
-            ev.getTarget().add(this);
-        }
-    }
     
     // ///////////////////////////////////////////////////////////////////
     // Convenience

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.css
new file mode 100644
index 0000000..3fbc5c3
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.css
@@ -0,0 +1,23 @@
+/*
+ *  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.
+ */
+
+.zeroClipboardPanel .subscribingLink {
+	display: none;
+}
+

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.html
new file mode 100644
index 0000000..de48ded
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.html
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<html>
+	<body>
+		<wicket:panel>
+            <div class="zeroClipboardPanel">
+                <a wicket:id="copyLink" href="#">
+                    <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                </a>
+                <a wicket:id="subscribingLink" id="subscribingLink" class="subscribingLink" href="#">&nbsp;</a>
+            </div>
+		</wicket:panel>
+	</body>
+</html>
+

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.java
new file mode 100644
index 0000000..07d1950
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/zclip/ZeroClipboardPanel.java
@@ -0,0 +1,101 @@
+/**
+ *  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.zclip;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
+import org.apache.isis.viewer.wicket.model.hints.UiHintsBroadcastEvent;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.PageType;
+import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
+import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistryAccessor;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.Links;
+
+public class ZeroClipboardPanel extends PanelAbstract<IModel<Void>> {
+
+    private static final long serialVersionUID = 1L;
+    
+    private static final String ID_SUBSCRIBING_LINK = "subscribingLink";
+    private static final String ID_COPY_LINK = "copyLink";
+
+    private AbstractLink subscribingLink;
+    private AjaxLink<ObjectAdapter> copyLink;
+
+    public ZeroClipboardPanel(String id) {
+        super(id);
+    }
+    
+    @Override
+    protected void onInitialize() {
+        super.onInitialize();
+        if(copyLink == null) {
+            copyLink = new ZeroClipboardLink(ID_COPY_LINK, "#subscribingLink");
+            addOrReplace(copyLink);
+        }
+        addSubscribingLink(null);
+    }
+
+    private void addSubscribingLink(UiHintContainer uiHintContainer) {
+        subscribingLink = createSubscribingLink(uiHintContainer);
+        addOrReplace(subscribingLink);
+        subscribingLink.setOutputMarkupId(true);
+    }
+
+    private AbstractLink createSubscribingLink(UiHintContainer uiHintContainer) {
+        if(uiHintContainer == null || !(uiHintContainer instanceof EntityModel)) {
+            // return a no-op
+            AbstractLink link = new AbstractLink(ID_SUBSCRIBING_LINK) {
+                private static final long serialVersionUID = 1L;
+            };
+            return link;
+        } else {
+            final EntityModel entityModel = (EntityModel) uiHintContainer;
+            final PageParameters pageParameters = entityModel.getPageParameters();
+            final Class<? extends Page> pageClass = getPageClassRegistry().getPageClass(PageType.ENTITY);
+            return Links.newBookmarkablePageLink(ID_SUBSCRIBING_LINK, pageParameters, pageClass);
+        }
+    }
+
+    // //////////////////////////////////////
+    
+    @Override
+    public void onEvent(IEvent<?> event) {
+        super.onEvent(event);
+        if(event.getPayload() instanceof UiHintsBroadcastEvent) {
+            UiHintsBroadcastEvent ev = (UiHintsBroadcastEvent) event.getPayload();
+            addSubscribingLink(ev.getUiHintContainer());
+            ev.getTarget().add(subscribingLink);
+        }
+    }
+    
+    // //////////////////////////////////////
+
+    protected PageClassRegistry getPageClassRegistry() {
+        final PageClassRegistryAccessor pcra = (PageClassRegistryAccessor) getApplication();
+        return pcra.getPageClassRegistry();
+    }
+
+    
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/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 578aa50..05c60bc 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
@@ -72,6 +72,7 @@ import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
 import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptModalWindow;
 import org.apache.isis.viewer.wicket.ui.components.widgets.zclip.ZeroClipboardLink;
+import org.apache.isis.viewer.wicket.ui.components.widgets.zclip.ZeroClipboardPanel;
 import org.apache.isis.viewer.wicket.ui.errors.ExceptionModel;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
 import org.apache.isis.viewer.wicket.ui.pages.about.AboutPage;
@@ -262,7 +263,7 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     }
 
     private void addCopyLink() {
-        AjaxLink<ObjectAdapter> zClipCopyLink = new ZeroClipboardLink(ID_COPY_LINK, ".entityHeaderPanel a.entityUrlSource");
+        ZeroClipboardPanel zClipCopyLink = new ZeroClipboardPanel(ID_COPY_LINK);
         addOrReplace(zClipCopyLink);
     }
     
@@ -365,7 +366,7 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
         Object payload = event.getPayload();
         if(payload instanceof UiHintsSetEvent) {
             UiHintsSetEvent setEv = (UiHintsSetEvent)payload;
-            UiHintsBroadcastEvent broadcastEv = new UiHintsBroadcastEvent(setEv.getTarget());
+            UiHintsBroadcastEvent broadcastEv = new UiHintsBroadcastEvent(setEv);
             send(this, Broadcast.BREADTH, broadcastEv);
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
index f8003b5..cac47e4 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.viewer.wicket.ui.selector.links;
 
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -72,6 +73,8 @@ public abstract class LinksSelectorPanelAbstract<T extends IModel<?>> extends Pa
     private static final String ID_VIEW_LINK = "viewLink";
     private static final String ID_VIEW_ITEM = "viewItem";
     private static final String ID_VIEW_TITLE = "viewTitle";
+    
+    private static final String UIHINT_VIEW = "view";
 
     private final ComponentType componentType;
     private final String underlyingIdPrefix;
@@ -184,10 +187,10 @@ public abstract class LinksSelectorPanelAbstract<T extends IModel<?>> extends Pa
                         @Override
                         public void onClick(AjaxRequestTarget target) {
                             LinksSelectorPanelAbstract<T> linksSelectorPanel = LinksSelectorPanelAbstract.this;
-                            UiHintContainer hintContainer = linksSelectorPanel.getUiHintContainer();
-                            if(hintContainer != null) {
-                                hintContainer.setHint(LinksSelectorPanelAbstract.this, "view", ""+underlyingViewNum);
-                                send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(target));
+                            UiHintContainer uiHintContainer = linksSelectorPanel.getUiHintContainer();
+                            if(uiHintContainer != null) {
+                                uiHintContainer.setHint(LinksSelectorPanelAbstract.this, UIHINT_VIEW, ""+underlyingViewNum);
+                                send(getPage(), Broadcast.EXACT, new UiHintsSetEvent(uiHintContainer, target));
                             }
                             
                             final T dummyModel = dummyOf(model);
@@ -262,15 +265,22 @@ public abstract class LinksSelectorPanelAbstract<T extends IModel<?>> extends Pa
     protected int determineView(final List<ComponentFactory> componentFactories, final IModel<?> model) {
         UiHintContainer hintContainer = getUiHintContainer();
         if(hintContainer != null) {
-            String hintValue = hintContainer.getHint(this, "view");
-            if(hintValue != null) {
-                return Integer.parseInt(hintValue);
+            String viewStr = hintContainer.getHint(this, UIHINT_VIEW);
+            if(viewStr != null) {
+                try {
+                    int view = Integer.parseInt(viewStr);
+                    if(view >= 0 && view < componentFactories.size()) {
+                        return view;
+                    }
+                } catch(NumberFormatException ex) {
+                    // ignore
+                }
             }
         }
 
         int initialFactory = determineInitialFactory(componentFactories, model);
         if(hintContainer != null) {
-            hintContainer.setHint(this, "view", ""+initialFactory);
+            hintContainer.setHint(this, UIHINT_VIEW, ""+initialFactory);
         }
         return initialFactory;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/f031f27b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Links.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Links.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Links.java
index 5225c70..97c7fd0 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Links.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Links.java
@@ -59,12 +59,12 @@ public final class Links {
         return new BookmarkablePageLink<T>(linkId, pageClass, pageParameters);
     }
 
-    public static <T extends Page> AbstractLink newBookmarkablePageLinkWithHints(
+    public static <T extends Page> AbstractLink newBookmarkablePageLinkWithAnchor(
             final String linkId, final PageParameters pageParameters, final Class<T> pageClass) {
 
-        final String hints = PageParameterNames.HINTS.getStringFrom(pageParameters);
+        final String hints = PageParameterNames.ANCHOR.getStringFrom(pageParameters);
         if(hints != null) {
-            PageParameterNames.HINTS.removeFrom(pageParameters);
+            PageParameterNames.ANCHOR.removeFrom(pageParameters);
             return new BookmarkablePageLink<T>(linkId, pageClass, pageParameters) {
                 private static final long serialVersionUID = 1L;