ISIS-1603: uses hints to reset focus after OK or Cancel (requiring extension to 
HintStore to accommodate); also fixes the model used to render edit link for 
dates and numbers etc (use same as textfield).


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

Branch: refs/heads/master
Commit: 41f626b3b7793178a0b027141df81e46a924732b
Parents: 4966f59
Author: Dan Haywood <[email protected]>
Authored: Tue May 2 07:25:33 2017 +0200
Committer: Dan Haywood <[email protected]>
Committed: Tue May 2 07:25:33 2017 +0200

----------------------------------------------------------------------
 .../isis/applib/services/bookmark/Bookmark.java |  6 +-
 .../isis/applib/services/hint/HintStore.java    | 26 ++++++++
 .../services/HintStoreUsingWicketSession.java   |  6 +-
 .../model/mementos/ObjectAdapterMemento.java    | 17 +++++
 .../viewer/wicket/model/models/EntityModel.java | 10 +--
 .../selector/CollectionSelectorHelper.java      | 18 +++---
 .../selector/CollectionSelectorPanel.java       |  2 +-
 .../layout/bs3/tabs/TabGroupPanel.java          |  9 ++-
 .../property/PropertyEditFormPanel.java         |  5 +-
 .../scalars/ScalarPanelAbstract2.java           | 20 +++---
 .../scalars/ScalarPanelTextFieldAbstract.java   |  8 ++-
 .../ScalarPanelTextFieldDatePickerAbstract.java | 25 +++++--
 .../scalars/ScalarPanelTextFieldNumeric.java    | 20 +++++-
 .../datepicker/TextFieldWithDateTimePicker.java |  3 +
 .../jdkmath/JavaMathBigDecimalPanel.java        |  8 ++-
 .../scalars/reference/ReferencePanel.java       |  2 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  |  6 +-
 .../viewer/wicket/ui/pages/PageAbstract.java    | 25 ++++++-
 .../wicket/ui/pages/entity/EntityPage.java      | 20 ++++--
 .../ui/pages/jquery.isis.wicket.viewer.js       | 12 ++--
 .../ui/panels/PromptFormPanelAbstract.java      | 68 ++++++++++++++++++--
 21 files changed, 249 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
----------------------------------------------------------------------
diff --git 
a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
 
b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
index a152824..7d976a0 100644
--- 
a/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
+++ 
b/core/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
@@ -38,7 +38,7 @@ public class Bookmark implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    private static final char SEPARATOR = ':';
+    protected static final char SEPARATOR = ':';
 
     public OidDto toOidDto() {
         final OidDto oidDto = new OidDto();
@@ -124,9 +124,9 @@ public class Bookmark implements Serializable {
         }
     }
 
-    private final String objectType;
+    protected final String objectType;
     private final String identifier;
-    private final ObjectState state;
+    protected final ObjectState state;
 
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java
----------------------------------------------------------------------
diff --git 
a/core/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java 
b/core/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java
index ebfca9b..5c274a4 100644
--- 
a/core/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java
+++ 
b/core/applib/src/main/java/org/apache/isis/applib/services/hint/HintStore.java
@@ -25,6 +25,32 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 
 public interface HintStore {
 
+    public static class BookmarkWithHintId extends Bookmark {
+
+        private final String hintId;
+
+        public BookmarkWithHintId(final Bookmark bookmark, final String 
hintId) {
+            super(bookmark.toString());
+            this.hintId = hintId;
+        }
+
+        public String getHintId() {
+            return hintId;
+        }
+
+        /**
+         * Similar to {@link #toString()}, but using {@link #hintId} rather 
than {@link #identifier}.
+         */
+        public String toStringUsingHintId() {
+            return state.getCode() + objectType + SEPARATOR + hintId;
+        }
+    }
+
+    interface HintIdProvider {
+        @Programmatic
+        String hintId();
+    }
+
     @Programmatic
     String get(final Bookmark bookmark, String hintKey);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
 
b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
index dd3a27d..f7f4b53 100644
--- 
a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
+++ 
b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
@@ -99,7 +99,11 @@ public class HintStoreUsingWicketSession implements 
HintStore {
     }
 
     protected String sessionAttributeFor(final Bookmark bookmark) {
-        return "hint-" + bookmark.toString();
+        return "hint-" + (
+                bookmark instanceof BookmarkWithHintId
+                        ? ((BookmarkWithHintId) bookmark).toStringUsingHintId()
+                        : bookmark.toString()
+        );
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index 8a68331..3f2bc86 100644
--- 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -31,6 +31,7 @@ import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.hint.HintStore;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import 
org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
@@ -380,6 +381,11 @@ public class ObjectAdapterMemento implements Serializable {
     private Bookmark bookmark;
 
     /**
+     * Only populated for {@link ObjectAdapter#getObject() domain object}s 
that implement {@link HintStore.HintIdProvider}.
+     */
+    private String hintId;
+
+    /**
      * The current value, if {@link Type#TRANSIENT}, will be <tt>null</tt> 
otherwise.
      *
      * <p>
@@ -441,6 +447,10 @@ public class ObjectAdapterMemento implements Serializable {
 
         persistentOidStr = oid.enString();
         bookmark = oid.asBookmark();
+        if(adapter.getObject() instanceof HintStore.HintIdProvider) {
+            HintStore.HintIdProvider provider = (HintStore.HintIdProvider) 
adapter.getObject();
+            this.hintId = provider.hintId();
+        }
         type = Type.PERSISTENT;
     }
 
@@ -467,6 +477,13 @@ public class ObjectAdapterMemento implements Serializable {
         return bookmark;
     }
 
+    public Bookmark asHintingBookmark() {
+        Bookmark bookmark = asBookmark();
+        return hintId != null && bookmark != null
+                ? new HintStore.BookmarkWithHintId(bookmark, hintId)
+                : bookmark;
+    }
+
     /**
      * Lazily looks up {@link ObjectAdapter} if required.
      * 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index a51bed6..8b2bca3 100644
--- 
a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ 
b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -211,7 +211,7 @@ public class EntityModel extends 
BookmarkableModel<ObjectAdapter> implements UiH
         public void hintStoreToPageParameters(
                 final PageParameters pageParameters) {
             final HintStore hintStore = getHintStore();
-            final Bookmark bookmark= 
entityModel.getObjectAdapterMemento().asBookmark();
+            final Bookmark bookmark= 
entityModel.getObjectAdapterMemento().asHintingBookmark();
             Set<String> hintKeys = hintStore.findHintKeys(bookmark);
             for (String hintKey : hintKeys) {
                 ComponentHintKey.create(hintKey).hintTo(bookmark, 
pageParameters, PREFIX);
@@ -222,7 +222,7 @@ public class EntityModel extends 
BookmarkableModel<ObjectAdapter> implements UiH
                 final PageParameters pageParameters) {
             Set<String> namedKeys = pageParameters.getNamedKeys();
             if(namedKeys.contains("no-hints")) {
-                
getHintStore().removeAll(entityModel.getObjectAdapterMemento().asBookmark());
+                
getHintStore().removeAll(entityModel.getObjectAdapterMemento().asHintingBookmark());
                 return;
             }
             List<ComponentHintKey> newComponentHintKeys = Lists.newArrayList();
@@ -232,7 +232,7 @@ public class EntityModel extends 
BookmarkableModel<ObjectAdapter> implements UiH
                     String key = namedKey.substring(5);
                     final ComponentHintKey componentHintKey = 
ComponentHintKey.create(key);
                     newComponentHintKeys.add(componentHintKey);
-                    final Bookmark bookmark = 
entityModel.getObjectAdapterMemento().asBookmark();
+                    final Bookmark bookmark = 
entityModel.getObjectAdapterMemento().asHintingBookmark();
                     componentHintKey.set(bookmark, value);
                 }
             }
@@ -251,7 +251,7 @@ public class EntityModel extends 
BookmarkableModel<ObjectAdapter> implements UiH
     public String getHint(final Component component, final String keyName) {
         final ComponentHintKey componentHintKey = 
ComponentHintKey.create(component, keyName);
         if(componentHintKey != null) {
-            return 
componentHintKey.get(getObjectAdapterMemento().asBookmark());
+            return 
componentHintKey.get(getObjectAdapterMemento().asHintingBookmark());
         }
         return null;
     }
@@ -259,7 +259,7 @@ public class EntityModel extends 
BookmarkableModel<ObjectAdapter> implements UiH
     @Override
     public void setHint(Component component, String keyName, String hintValue) 
{
         ComponentHintKey componentHintKey = ComponentHintKey.create(component, 
keyName);
-        componentHintKey.set(this.getObjectAdapterMemento().asBookmark(), 
hintValue);
+        
componentHintKey.set(this.getObjectAdapterMemento().asHintingBookmark(), 
hintValue);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
index e09817b..80de447 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
@@ -19,9 +19,16 @@
 
 package org.apache.isis.viewer.wicket.ui.components.collection.selector;
 
+import java.io.Serializable;
+import java.util.List;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
 import org.apache.isis.applib.annotation.Render;
 import org.apache.isis.applib.layout.component.CollectionLayoutData;
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -38,11 +45,6 @@ import 
org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import 
org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.CollectionContentsAsAjaxTablePanelFactory;
 import 
org.apache.isis.viewer.wicket.ui.components.collectioncontents.multiple.CollectionContentsMultipleViewsPanelFactory;
 import 
org.apache.isis.viewer.wicket.ui.components.collectioncontents.unresolved.CollectionContentsHiddenPanelFactory;
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-
-import java.io.Serializable;
-import java.util.List;
 
 public class CollectionSelectorHelper implements Serializable {
 
@@ -114,7 +116,7 @@ public class CollectionSelectorHelper implements 
Serializable {
     private String determineInitialFactory() {
 
         // try to load from session, if can
-        final Bookmark bookmark = domainObjectBookmarkIfAny();
+        final Bookmark bookmark = bookmarkHintIfAny();
         final String sessionAttribute = componentHintKey.get(bookmark);
         if(sessionAttribute != null) {
             return sessionAttribute;
@@ -148,10 +150,10 @@ public class CollectionSelectorHelper implements 
Serializable {
 
     }
 
-    private Bookmark domainObjectBookmarkIfAny() {
+    private Bookmark bookmarkHintIfAny() {
         final EntityModel entityModel = this.model.getEntityModel();
         return entityModel != null
-                ? entityModel.getObjectAdapterMemento().asBookmark()
+                ? entityModel.getObjectAdapterMemento().asHintingBookmark()
                 : null;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
index b0d65ba..5fc1bc7 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
@@ -150,7 +150,7 @@ public class CollectionSelectorPanel extends 
PanelAbstract<EntityCollectionModel
                             final EntityCollectionModel entityCollectionModel 
= CollectionSelectorPanel.this.getModel();
                             final EntityModel entityModel = 
entityCollectionModel.getEntityModel();
                             return entityModel != null
-                                    ? 
entityModel.getObjectAdapterMemento().asBookmark()
+                                    ? 
entityModel.getObjectAdapterMemento().asHintingBookmark()
                                     : null;
                         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
index d74b8c5..f23de75 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
@@ -24,9 +24,6 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
 import org.apache.wicket.extensions.markup.html.tabs.ITab;
 import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
@@ -35,6 +32,8 @@ import org.apache.wicket.model.Model;
 
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3Tab;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3TabGroup;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.util.ComponentHintKey;
 import 
org.apache.isis.viewer.wicket.ui.components.layout.bs3.col.RepeatingViewWithDynamicallyVisibleContent;
@@ -100,13 +99,13 @@ public class TabGroupPanel extends 
AjaxBootstrapTabbedPanel  {
 
     @Override
     public TabbedPanel setSelectedTab(final int index) {
-        
selectedTabHintKey.set(entityModel.getObjectAdapterMemento().asBookmark(), 
""+index);
+        
selectedTabHintKey.set(entityModel.getObjectAdapterMemento().asHintingBookmark(),
 ""+index);
         return super.setSelectedTab(index);
     }
 
     private void setSelectedTabFromSessionIfAny(
             final AjaxBootstrapTabbedPanel ajaxBootstrapTabbedPanel) {
-        final String selectedTabStr = 
selectedTabHintKey.get(entityModel.getObjectAdapterMemento().asBookmark());
+        final String selectedTabStr = 
selectedTabHintKey.get(entityModel.getObjectAdapterMemento().asHintingBookmark());
         final Integer tabIndex = parse(selectedTabStr);
         if (tabIndex != null) {
             final int numTabs = ajaxBootstrapTabbedPanel.getTabs().size();

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.java
index 64c4b16..f9441a8 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.java
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.ui.components.property;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -117,7 +118,7 @@ public class PropertyEditFormPanel extends 
PromptFormPanelAbstract<ScalarModel>
         // which is called in the superclass.
         @Override
         public void onCancel(
-                final AjaxRequestTarget target) {
+                final AjaxRequestTarget target, final AjaxButton cancelButton) 
{
 
             final PromptStyle promptStyle = getScalarModel().getPromptStyle();
 
@@ -127,7 +128,7 @@ public class PropertyEditFormPanel extends 
PromptFormPanelAbstract<ScalarModel>
                 getScalarModel().clearPending();
             }
 
-            super.onCancel(target);
+            super.onCancel(target, cancelButton);
         }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index 28e13f3..ea816e8 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -79,6 +79,7 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
     protected static final String ID_SCALAR_VALUE = "scalarValue";
 
 
+
     /**
      * as per {@link #inlinePromptLink}
      */
@@ -237,6 +238,7 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
 
         final InlinePromptConfig inlinePromptConfig = getInlinePromptConfig();
         if(inlinePromptConfig.isSupported()) {
+
             this.scalarIfRegularInlinePromptForm = createInlinePromptForm();
             scalarTypeContainer.addOrReplace(scalarIfRegularInlinePromptForm);
             inlinePromptLink = createInlinePromptLink();
@@ -264,7 +266,9 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
                 }
             }
         }
-        if(scalarModel.getKind() == ScalarModel.Kind.PROPERTY && 
scalarModel.getPromptStyle() != PromptStyle.INLINE) {
+        if(scalarModel.getKind() == ScalarModel.Kind.PROPERTY &&
+           scalarModel.getMode() == EntityModel.Mode.VIEW     &&
+           scalarModel.getPromptStyle() != PromptStyle.INLINE) {
             getScalarValueComponent().add(new AttributeAppender("tabindex", 
"-1"));
         }
 
@@ -276,7 +280,6 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
         addEditPropertyTo(scalarIfRegular);
         addFeedbackOnlyTo(scalarIfRegular, getScalarValueComponent());
 
-
         getRendering().buildGui(this);
         addCssFromMetaModel();
 
@@ -374,8 +377,10 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
     public void onUpdate(
             final AjaxRequestTarget target, final ScalarPanelAbstract2 
scalarPanel) {
 
-        target.appendJavaScript(
-                
String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PARAMETER, '%s')", 
getMarkupId()));
+        if(getModel().getKind() == ScalarModel.Kind.PARAMETER) {
+            target.appendJavaScript(
+                    
String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PARAMETER, '%s')", 
getMarkupId()));
+        }
     }
 
 
@@ -479,8 +484,8 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
 
         // (placeholder initially, create dynamically when needed - otherwise 
infinite loop because form references regular)
 
-        WebMarkupContainer scalarIfRegularInlinePromptForm = new 
WebMarkupContainer(
-                ID_SCALAR_IF_REGULAR_INLINE_PROMPT_FORM);
+        WebMarkupContainer scalarIfRegularInlinePromptForm =
+                new WebMarkupContainer( 
ID_SCALAR_IF_REGULAR_INLINE_PROMPT_FORM);
         scalarIfRegularInlinePromptForm.setOutputMarkupId(true);
         scalarIfRegularInlinePromptForm.setVisible(false);
 
@@ -507,7 +512,7 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
     /**
      * Components returning true for {@link #getInlinePromptConfig()} are 
required to override and return a non-null value.
      */
-    protected IModel<?> obtainPromptInlineLinkModel() {
+    protected IModel<String> obtainPromptInlineLinkModel() {
         return null;
     }
 
@@ -661,7 +666,6 @@ public abstract class ScalarPanelAbstract2 extends 
PanelAbstract<ScalarModel> im
         return false;
     }
 
-
     // ///////////////////////////////////////////////////////////////////
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 4f8b049..144a975 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -91,7 +91,7 @@ public abstract class ScalarPanelTextFieldAbstract<T extends 
Serializable> exten
     // ///////////////////////////////////////////////////////////////////
 
 
-    AbstractTextComponent<T> getTextField() {
+    protected AbstractTextComponent<T> getTextField() {
         return textField;
     }
 
@@ -284,8 +284,10 @@ public abstract class ScalarPanelTextFieldAbstract<T 
extends Serializable> exten
     }
 
     @Override
-    protected IModel<T> obtainPromptInlineLinkModel() {
-        return textField.getModel();
+    protected IModel<String> obtainPromptInlineLinkModel() {
+        IModel<T> model = textField.getModel();
+        final T modelObject = model.getObject();
+        return Model.of(modelObject != null ? modelObject.toString() : null);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
index 404f872..619b843 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
@@ -24,17 +24,16 @@ import java.io.Serializable;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.validation.IValidatable;
-import org.apache.wicket.validation.IValidator;
-import org.apache.wicket.validation.ValidationError;
 
+import org.apache.isis.applib.services.i18n.LocaleProvider;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import 
org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacet;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.TextFieldWithDateTimePicker;
@@ -98,7 +97,17 @@ public abstract class 
ScalarPanelTextFieldDatePickerAbstract<T extends Serializa
 
         return label;
     }
-    
+
+    protected IModel<String> obtainPromptInlineLinkModel() {
+        ObjectAdapter object = scalarModel.getObject();
+        final T value = object != null ? (T) object.getObject() : null;
+        final String str =
+                value != null
+                        ? converter.convertToString(value, 
getLocaleProvider().getLocale())
+                        : null;
+        return Model.of(str);
+    }
+
     /**
      * Optional override for subclasses to explicitly indicate desired amount 
to adjust compact form of textField
      */
@@ -109,10 +118,14 @@ public abstract class 
ScalarPanelTextFieldDatePickerAbstract<T extends Serializa
 
     
     @com.google.inject.Inject
-    private WicketViewerSettings settings;
+    WicketViewerSettings settings;
     protected WicketViewerSettings getSettings() {
         return settings;
     }
 
+    private LocaleProvider getLocaleProvider() {
+        return 
IsisContext.getSessionFactory().getServicesInjector().lookupService(LocaleProvider.class);
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
index d9c35b6..318fced 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
@@ -24,8 +24,13 @@ import java.io.Serializable;
 import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.util.convert.IConverter;
 
+import org.apache.isis.applib.services.i18n.LocaleProvider;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 
 /**
@@ -63,7 +68,18 @@ public abstract class ScalarPanelTextFieldNumeric<T extends 
Serializable> extend
         return label;
     }
 
-    public IConverter<T> getConverter() {
-        return converter;
+    protected IModel<String> obtainPromptInlineLinkModel() {
+        ObjectAdapter object = scalarModel.getObject();
+        final T value = object != null ? (T) object.getObject() : null;
+        final String str =
+                value != null
+                        ? converter.convertToString(value, 
getLocaleProvider().getLocale())
+                        : null;
+        return Model.of(str);
     }
+
+    private LocaleProvider getLocaleProvider() {
+        return 
IsisContext.getSessionFactory().getServicesInjector().lookupService(LocaleProvider.class);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
index a432553..2d270bb 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
@@ -89,6 +89,9 @@ public class TextFieldWithDateTimePicker<T> extends 
TextField<T> implements ICon
         config.calendarWeeks(true);
         config.useCurrent(false);
 
+        // seems not to do anything...
+        //config.allowKeyboardNavigation(true);
+
         final String datePickerMinDate = 
getConfiguration().getString(KEY_DATE_PICKER_MIN_DATE, 
KEY_DATE_PICKER_MIN_DATE_DEFAULT);
         final String datePickerMaxDate = 
getConfiguration().getString(KEY_DATE_PICKER_MAX_DATE, 
KEY_DATE_PICKER_MAX_DATE_DEFAULT);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
index af21ffa..03fa38a 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
@@ -23,6 +23,8 @@ import java.math.BigDecimal;
 
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
 
+import org.apache.isis.applib.services.i18n.LocaleProvider;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
@@ -36,7 +38,10 @@ public class JavaMathBigDecimalPanel extends 
ScalarPanelTextFieldNumeric<BigDeci
 
     private final BigDecimalConverterWithScale converter;
 
-    public JavaMathBigDecimalPanel(final String id, final ScalarModel 
scalarModel, final BigDecimalConverterWithScale converter) {
+    public JavaMathBigDecimalPanel(
+            final String id,
+            final ScalarModel scalarModel,
+            final BigDecimalConverterWithScale converter) {
         super(id, scalarModel, BigDecimal.class, converter.forViewMode());
         this.converter = converter;
     }
@@ -47,6 +52,7 @@ public class JavaMathBigDecimalPanel extends 
ScalarPanelTextFieldNumeric<BigDeci
         return new BigDecimalTextField(id, textFieldValueModel, cls, model, 
converter);
     }
 
+
     @Override
     protected String getScalarPanelType() {
         return "javaMathBigDecimalPanel";

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index e083670..1faf411 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -203,7 +203,7 @@ public class ReferencePanel extends 
ScalarPanelSelect2Abstract implements PanelW
     }
 
     @Override
-    protected IModel<?> obtainPromptInlineLinkModel() {
+    protected IModel<String> obtainPromptInlineLinkModel() {
         final IModel<ObjectAdapterMemento> model = select2.getModel();
         return new IModel<String>() {
             @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 6c46b4d..db0f47f 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -103,8 +103,10 @@ public class ValueChoicesSelect2Panel extends 
ScalarPanelSelect2Abstract impleme
     }
 
     @Override
-    protected IModel<?> obtainPromptInlineLinkModel() {
-        return select2.getModel();
+    protected IModel<String> obtainPromptInlineLinkModel() {
+        ObjectAdapterMemento modelObject = select2.getModelObject();
+        String str = modelObject != null ? modelObject.asString(): null;
+        return Model.of(str);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 779d5db..23ea2b3 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -120,6 +120,8 @@ public abstract class PageAbstract extends WebPage 
implements ActionPromptProvid
 
     public static final String ID_MENU_LINK = "menuLink";
 
+    public static final String UIHINT_FOCUS = "focus";
+
     /**
      * This is a bit hacky, but best way I've found to pass an exception over 
to the WicketSignInPage
      * if there is a problem rendering this page.
@@ -281,9 +283,28 @@ public abstract class PageAbstract extends WebPage 
implements ActionPromptProvid
             addBootLint(response);
         }
 
-        response.render(OnDomReadyHeaderItem.forScript(
-                "Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PROPERTY)"));
+        String markupId = null;
+        EntityModel entityModel = getUiHintContainerIfAny();
+        if(entityModel != null) {
+            String path = entityModel.getHint(getPage(), 
PageAbstract.UIHINT_FOCUS);
+            if(path != null) {
+                Component childComponent = get(path);
+                if(childComponent != null) {
+                    markupId = childComponent.getMarkupId();
+                }
+
+            }
+        }
+        String javaScript = markupId != null
+            ? 
String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PROPERTY, '%s')", 
markupId)
+            : "Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PROPERTY)";
+
+        response.render(OnDomReadyHeaderItem.forScript(javaScript));
+
+    }
 
+    protected EntityModel getUiHintContainerIfAny() {
+        return null;
     }
 
     private void addBootLint(final IHeaderResponse response) {

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index f4d9bb0..f19c7c7 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -19,6 +19,14 @@
 
 package org.apache.isis.viewer.wicket.ui.pages.entity;
 
+import org.apache.wicket.Application;
+import org.apache.wicket.RestartResponseException;
+import 
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.string.Strings;
+
 import org.apache.isis.applib.layout.component.Grid;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import 
org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
@@ -36,13 +44,6 @@ import 
org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.Breadcrum
 import 
org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModelProvider;
 import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-import org.apache.wicket.Application;
-import org.apache.wicket.RestartResponseException;
-import 
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.util.string.Strings;
 
 /**
  * Web page representing an entity.
@@ -126,6 +127,11 @@ public class EntityPage extends PageAbstract {
         breadcrumbModel.remove(entityModel);
     }
 
+    @Override
+    public EntityModel getUiHintContainerIfAny() {
+        return model;
+    }
+
     /**
      * A rather crude way of intercepting the redirect-and-post strategy.
      * 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
index 01401d3..92d9e53 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/jquery.isis.wicket.viewer.js
@@ -99,15 +99,19 @@ $(function() {
         }, 0);
     });
 
-    Wicket.Event.subscribe(Isis.Topic.FOCUS_FIRST_PARAMETER, function(jqEvent, 
modalWindowId) {
+    Wicket.Event.subscribe(Isis.Topic.FOCUS_FIRST_PARAMETER, function(jqEvent, 
elementId) {
         setTimeout(function() {
-            
$('#'+modalWindowId).find('.inputFormTable.parameters').find('input,textarea,select,div.cbx').filter(':visible:first').focus();
+            
$('#'+elementId).find('.inputFormTable.parameters').find('input,textarea,select,div.cbx').filter(':visible:first').focus();
         }, 0);
     });
 
-    Wicket.Event.subscribe(Isis.Topic.FOCUS_FIRST_PROPERTY, function(jqEvent) {
+    Wicket.Event.subscribe(Isis.Topic.FOCUS_FIRST_PROPERTY, function(jqEvent, 
elementId) {
         setTimeout(function() {
-            
$(document).find('a.scalarValueInlinePromptLink').filter(':visible:first').focus();
+            if(elementId) {
+                $("#" + 
elementId).find('a.scalarValueInlinePromptLink').filter(':visible:first').focus();
+            } else {
+                
$(document).find('a.scalarValueInlinePromptLink').filter(':visible:first').focus();
+            }
         }, 0);
     });
 

http://git-wip-us.apache.org/repos/asf/isis/blob/41f626b3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
----------------------------------------------------------------------
diff --git 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
index 2ed2bdb..c7373d5 100644
--- 
a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
+++ 
b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
@@ -25,6 +25,7 @@ import com.google.common.collect.Lists;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.Page;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
@@ -45,14 +46,18 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber2;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
 import 
org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
+import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 
 /**
  * {@link PanelAbstract Panel} to capture the arguments for an action
@@ -160,7 +165,7 @@ public abstract class PromptFormPanelAbstract<T extends 
IModel<?> & FormExecutor
 
 
         protected AjaxButton addCancelButton() {
-            AjaxButton cancelButton = new AjaxButton(ID_CANCEL_BUTTON, new 
ResourceModel("cancelLabel")) {
+            final AjaxButton cancelButton = new AjaxButton(ID_CANCEL_BUTTON, 
new ResourceModel("cancelLabel")) {
                 private static final long serialVersionUID = 1L;
 
                 @Override
@@ -170,7 +175,7 @@ public abstract class PromptFormPanelAbstract<T extends 
IModel<?> & FormExecutor
                         actionPromptIfAny.closePrompt(target);
                     }
 
-                    onCancel(target);
+                    onCancel(target, this);
 
                 }
             };
@@ -208,17 +213,28 @@ public abstract class PromptFormPanelAbstract<T extends 
IModel<?> & FormExecutor
 
                     @Override
                     protected void respond(final AjaxRequestTarget target) {
-                        onCancel(target);
+                        onCancel(target, cancelButton);
                     }
 
                 });
             }
         }
 
+        private EntityModel getPageUiHintContainerIfAny() {
+            Page page = getPage();
+            if(page instanceof EntityPage) {
+                EntityPage entityPage = (EntityPage) page;
+                return entityPage.getUiHintContainerIfAny();
+            }
+            return null;
+        }
+
         private void onSubmitOf(
                 final AjaxRequestTarget target,
                 final Form<?> form,
-                final AjaxButton ajaxButton) {
+                final AjaxButton okButton) {
+
+            setLastFocusHint(target, okButton);
 
             boolean succeeded = 
formExecutorContext.getFormExecutor().executeAndProcessResults(target, form);
             if(succeeded) {
@@ -227,7 +243,7 @@ public abstract class PromptFormPanelAbstract<T extends 
IModel<?> & FormExecutor
                 // new page is rendered.
                 target.appendJavaScript("isisShowVeil();\n");
 
-                ajaxButton.send(getPage(), Broadcast.EXACT, 
newCompletedEvent(target, form));
+                okButton.send(getPage(), Broadcast.EXACT, 
newCompletedEvent(target, form));
 
                 target.add(form);
             } else {
@@ -246,6 +262,27 @@ public abstract class PromptFormPanelAbstract<T extends 
IModel<?> & FormExecutor
             }
         }
 
+        private void setLastFocusHint(final AjaxRequestTarget target, final 
AjaxButton ajaxButton) {
+
+            String lastFocusedElementId = target.getLastFocusedElementId();
+            System.out.println("onSubmitOf, lastFocusedElementId = " + 
lastFocusedElementId);
+            System.out.println("onSubmitOf, ajaxButton.getPath() = " + 
ajaxButton.getPath());
+
+            final EntityModel entityModel = getPageUiHintContainerIfAny();
+            if (entityModel == null) {
+                return;
+            }
+            ObjectAdapterMemento oam = entityModel.getObjectAdapterMemento();
+            if(oam == null) {
+                return;
+            }
+            Component parentPanel = this.parentPanel;
+            MarkupContainer parent = parentPanel.getParent();
+            if(parent != null) {
+                entityModel.setHint(getPage(), PageAbstract.UIHINT_FOCUS, 
parent.getPageRelativePath());
+            }
+        }
+
         private AuthenticationSession getAuthenticationSession() {
             return 
getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
         }
@@ -268,7 +305,12 @@ public abstract class PromptFormPanelAbstract<T extends 
IModel<?> & FormExecutor
         }
 
         public void onCancel(
-                final AjaxRequestTarget target) {
+                final AjaxRequestTarget target, final AjaxButton cancelButton) 
{
+
+            String lastFocusedElementId = target.getLastFocusedElementId();
+            System.out.println("onCancel, lastFocusedElementId = " + 
lastFocusedElementId);
+
+            setLastFocusHint(target, cancelButton);
 
             final PromptStyle promptStyle = 
formExecutorContext.getPromptStyle();
 
@@ -290,7 +332,21 @@ public abstract class PromptFormPanelAbstract<T extends 
IModel<?> & FormExecutor
                 formExecutorContext.getInlinePromptContext().onCancel();
 
                 // redraw
+                MarkupContainer scalarTypeContainer = 
formExecutorContext.getInlinePromptContext()
+                        .getScalarTypeContainer();
+
+                if(scalarTypeContainer != null) {
+                    String markupId = scalarTypeContainer.getMarkupId();
+                    target.appendJavaScript(
+                            
String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PROPERTY, '%s')",
+                                    markupId));
+                }
+//                target.appendJavaScript(
+//                        String.format("var $parent = 
$('%s').parent().parent().parent().parent().parent().parent(); 
Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PARAMETER, $parent[0].id)",
+//                                parentPanel.getMarkupId()));
+
                 target.add(parent);
+
             }
 
         }

Reply via email to