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 2017/05/15 15:07:49 UTC

[13/19] isis git commit: ISIS-1613: refactors the ActionParameters and PropertyEdit forms and panels

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties
new file mode 100644
index 0000000..71edcd9
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties
@@ -0,0 +1,22 @@
+#
+#  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.
+#
+
+okLabel=OK
+cancelLabel=Cancel
+editLabel=Edit

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
index f4732fd..6424753 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
@@ -30,9 +30,13 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersPanel;
 import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
+/**
+ * Corresponding component to prompt for action (parameters) is {@link ActionParametersPanel}.
+ */
 public class PropertyEditPanel extends PanelAbstract<ScalarModel> {
 
     private static final long serialVersionUID = 1L;
@@ -42,14 +46,17 @@ public class PropertyEditPanel extends PanelAbstract<ScalarModel> {
     private static final String ID_PROPERTY_NAME = "propertyName";
 
     /**
-     * Gives a chance to hide the header part of this action panel, e.g. when shown in an action prompt
+     * Gives a chance to hide the header part of this panel.
      */
     private boolean showHeader = true;
 
-    public PropertyEditPanel(final String id, final ScalarModel scalarModel) {
+    public PropertyEditPanel(
+            final String id,
+            final ScalarModel scalarModel) {
         super(id, new ScalarModel(scalarModel.getParentEntityModel(), scalarModel.getPropertyMemento()));
-        getScalarModel().setFormExecutor(new PropertyEditFormExecutor(this, getModel()));
-        buildGui(getScalarModel());
+        final PropertyEditFormExecutor formExecutor = new PropertyEditFormExecutor(this, scalarModel);
+        scalarModel.setFormExecutor(formExecutor);
+        buildGui(scalarModel);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html
deleted file mode 100644
index 173b259..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-         http://www.apache.org/licenses/LICENSE-2.0
-         
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:wicket="http://wicket.apache.org"
-      xml:lang="en"
-      lang="en">
-    <body>
-        <wicket:panel>
-            <div class="iconAndTitle propertyPanelHeaderNew">
-                <span wicket:enclosure="entityIconAndTitle"><span wicket:id="entityIconAndTitle">[icon and title]</span> :</span> <span wicket:id="propertyName" class="propertyName">[property name]</span>
-            </div>
-        </wicket:panel>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java
deleted file mode 100644
index 0156674..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.viewer.wicket.ui.components.property;
-
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.AbstractReadOnlyModel;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-
-/**
- * A panel used as a title for the action prompts
- */
-public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarModel> {
-
-    private static final String ID_PROPERTY_NAME = "propertyName";
-
-    public PropertyEditPromptHeaderPanel(String id, final ScalarModel model) {
-        super(id, model);
-
-        ObjectAdapter targetAdapter = model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
-
-        getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
-
-        final Label label = new Label(ID_PROPERTY_NAME, new AbstractReadOnlyModel<String>() {
-            @Override
-            public String getObject() {
-                final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
-                return property.getName();
-            }
-        });
-        final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
-        final NamedFacet namedFacet = property.getFacet(NamedFacet.class);
-        if(namedFacet != null) {
-            label.setEscapeModelStrings(namedFacet.escaped());
-        }
-        add(label);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.html
new file mode 100644
index 0000000..173b259
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.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.
+-->
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:wicket="http://wicket.apache.org"
+      xml:lang="en"
+      lang="en">
+    <body>
+        <wicket:panel>
+            <div class="iconAndTitle propertyPanelHeaderNew">
+                <span wicket:enclosure="entityIconAndTitle"><span wicket:id="entityIconAndTitle">[icon and title]</span> :</span> <span wicket:id="propertyName" class="propertyName">[property name]</span>
+            </div>
+        </wicket:panel>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
new file mode 100644
index 0000000..e3d5df0
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
@@ -0,0 +1,59 @@
+/*
+ *  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.propertyheader;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarModel> {
+
+    private static final String ID_PROPERTY_NAME = "propertyName";
+
+    public PropertyEditPromptHeaderPanel(String id, final ScalarModel model) {
+        super(id, model);
+
+        ObjectAdapter targetAdapter = model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+
+        getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
+
+        final Label label = new Label(ID_PROPERTY_NAME, new AbstractReadOnlyModel<String>() {
+            @Override
+            public String getObject() {
+                final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
+                return property.getName();
+            }
+        });
+        final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
+        final NamedFacet namedFacet = property.getFacet(NamedFacet.class);
+        if(namedFacet != null) {
+            label.setEscapeModelStrings(namedFacet.escaped());
+        }
+        add(label);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index cea8ea7..d6b9fe8 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -51,7 +51,7 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPanel;
-import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPromptHeaderPanel;
+import org.apache.isis.viewer.wicket.ui.components.propertyheader.PropertyEditPromptHeaderPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Components;
@@ -291,44 +291,6 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
     protected abstract Component addComponentForCompact();
 
-    protected void addFeedbackOnlyTo(final MarkupContainer markupContainer, final Component component) {
-        markupContainer.addOrReplace(new NotificationPanel(ID_FEEDBACK, component, new ComponentFeedbackMessageFilter(component)));
-    }
-
-    protected void addEditPropertyTo(final MarkupContainer markupContainer) {
-        final String disableReasonIfAny = scalarModel.disable(getRendering().getWhere());
-        if (disableReasonIfAny == null && scalarModel.isViewMode()) {
-            final WebMarkupContainer editProperty = new WebMarkupContainer(ID_EDIT_PROPERTY);
-
-            editProperty.setOutputMarkupId(true);
-
-            editProperty.add(new AjaxEventBehavior("click") {
-                protected void onEvent(AjaxRequestTarget target) {
-
-                    final ActionPrompt prompt = ActionPromptProvider.Util
-                            .getFrom(ScalarPanelAbstract.this).getActionPrompt();
-
-                    PropertyEditPromptHeaderPanel titlePanel = new PropertyEditPromptHeaderPanel(prompt.getTitleId(),
-                            scalarModel);
-
-                    final PropertyEditPanel propertyEditPanel =
-                            (PropertyEditPanel) getComponentFactoryRegistry().createComponent(
-                                    ComponentType.PROPERTY_EDIT_PROMPT, prompt.getContentId(), scalarModel);
-
-                    propertyEditPanel.setShowHeader(false);
-
-                    prompt.setTitle(titlePanel, target);
-                    prompt.setPanel(propertyEditPanel, target);
-                    prompt.showPrompt(target);
-
-                }
-            });
-
-            markupContainer.addOrReplace(editProperty);
-        } else {
-            Components.permanentlyHide(markupContainer, ID_EDIT_PROPERTY);
-        }
-    }
 
     /**
      * Optional hook.

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/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 f2e2e4a..7f7a61a 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
@@ -56,7 +56,7 @@ import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.Link
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormExecutor;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormPanel;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPanel;
-import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPromptHeaderPanel;
+import org.apache.isis.viewer.wicket.ui.components.propertyheader.PropertyEditPromptHeaderPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisBlobOrClobPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BooleanPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanel;

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index d60d672..2b01ea3 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -46,7 +46,7 @@ import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
 import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptHeaderPanel;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersPanel;
 import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormExecutor;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
 import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
@@ -136,7 +136,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
 
     private static AjaxDeferredBehaviour determineDeferredBehaviour(final ObjectAction action,
             final ActionModel actionModel) {
-        // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+        // TODO: should unify with ActionResultResponseType (as used in ActionParametersPanel)
         if (isNoArgReturnTypeRedirect(action)) {
             /**
              * adapted from:
@@ -177,14 +177,14 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
         return null;
     }
 
-    // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+    // TODO: should unify with ActionResultResponseType (as used in ActionParametersPanel)
     private static boolean isNoArgReturnTypeRedirect(final ObjectAction action) {
         return action.getParameterCount() == 0 &&
                 action.getReturnType() != null &&
                 action.getReturnType().getCorrespondingClass() == java.net.URL.class;
     }
 
-    // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+    // TODO: should unify with ActionResultResponseType (as used in ActionParametersPanel)
     private static boolean isNoArgReturnTypeDownload(final ObjectAction action) {
         return action.getParameterCount() == 0 && action.getReturnType() != null &&
                 (action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Blob.class ||
@@ -220,15 +220,15 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
                                     return new ActionPromptHeaderPanel(titleId, actionModel);
                                 }
                             });
-            final ActionPanel actionPanel =
-                    (ActionPanel) getComponentFactoryRegistry().createComponent(
+            final ActionParametersPanel actionParametersPanel =
+                    (ActionParametersPanel) getComponentFactoryRegistry().createComponent(
                             ComponentType.ACTION_PROMPT, prompt.getContentId(), actionModel);
 
-            actionPanel.setShowHeader(false);
+            actionParametersPanel.setShowHeader(false);
 
             prompt.setTitle(titlePanel, target);
-            prompt.setPanel(actionPanel, target);
-            actionPanel.setActionPrompt(prompt);
+            prompt.setPanel(actionParametersPanel, target);
+            actionParametersPanel.setActionPrompt(prompt);
             prompt.showPrompt(target);
 
         } else {

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
index 2722129..a9c96e6 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
@@ -65,7 +65,7 @@ public class ActionPromptPage extends PageAbstract {
         super(pageParameters, model.getActionMemento().getAction(model.getSpecificationLoader()).getName(), ComponentType.ACTION_PROMPT);
         addChildComponents(themeDiv, model);
         
-        // no need to bookmark because the ActionPanel will have done so for us
+        // no need to bookmark because the ActionParametersPanel will have done so for us
         addBookmarkedPages(themeDiv);
     }
     

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
index 581effb..acc44f4 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
@@ -19,9 +19,6 @@
 
 package org.apache.isis.viewer.wicket.ui.panels;
 
-import org.apache.wicket.markup.html.IHeaderContributor;
-import java.util.List;
-
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.IFormSubmitter;
 import org.apache.wicket.model.IModel;
@@ -29,6 +26,8 @@ import org.apache.wicket.model.IModel;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
@@ -114,6 +113,14 @@ public abstract class FormAbstract<T> extends Form<T>
         return getIsisSessionFactory().getDeploymentCategory();
     }
 
+    public SpecificationLoader getSpecificationLoader() {
+        return getIsisSessionFactory().getSpecificationLoader();
+    }
+
+    protected ServicesInjector getServicesInjector() {
+        return getIsisSessionFactory().getServicesInjector();
+    }
+
     protected IsisSessionFactory getIsisSessionFactory() {
         return IsisContext.getSessionFactory();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
new file mode 100644
index 0000000..4133818
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
@@ -0,0 +1,330 @@
+package org.apache.isis.viewer.wicket.ui.panels;
+
+import java.util.List;
+
+import com.google.common.base.Throwables;
+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.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
+import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
+import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
+import org.apache.isis.viewer.wicket.model.models.FormExecutor;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
+import org.apache.isis.viewer.wicket.ui.util.Components;
+
+public abstract class FormExecutorAbstract<M extends BookmarkableModel<ObjectAdapter>> implements FormExecutor {
+
+    protected final MarkupContainer panel;
+    protected final M model;
+
+    public FormExecutorAbstract(final MarkupContainer panel, final M model) {
+        this.panel = panel;
+        this.model = model;
+    }
+
+    @Override
+    public boolean executeAndProcessResults(
+            final AjaxRequestTarget target,
+            final Form<?> feedbackForm,
+            final PromptStyle promptStyle) {
+
+        Components.permanentlyHide(panel, ComponentType.ENTITY_ICON_AND_TITLE);
+
+        ObjectAdapter targetAdapter = null;
+        try {
+            targetAdapter = obtainTargetAdapter();
+
+            // no concurrency exception, so continue...
+            return doExecuteAndProcessResults(target, feedbackForm, promptStyle);
+
+        } catch (ConcurrencyException ex) {
+
+            // second attempt should succeed, because the Oid would have
+            // been updated in the attempt
+            if (targetAdapter == null) {
+                targetAdapter = obtainTargetAdapter();
+            }
+
+            forwardOnConcurrencyException(targetAdapter, ex);
+
+            getMessageBroker().addWarning(ex.getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * @param target
+     * @return whether to clear args or not (they aren't if there was a validation exception)
+     */
+    private boolean doExecuteAndProcessResults(
+            final AjaxRequestTarget target,
+            final Form<?> feedbackForm,
+            final PromptStyle promptStyle) {
+
+        // validate the action parameters (if any)
+        final String invalidReasonIfAny = getReasonInvalidIfAny();
+
+        if (invalidReasonIfAny != null) {
+            raiseWarning(target, feedbackForm, invalidReasonIfAny);
+            return false;
+        }
+
+        final CommandContext commandContext = getServicesInjector().lookupService(CommandContext.class);
+        final Command command;
+        if (commandContext != null) {
+            command = commandContext.getCommand();
+            command.setExecutor(Command.Executor.USER);
+        } else {
+            command = null;
+        }
+
+        // the object store could raise an exception (eg uniqueness constraint)
+        // so we handle it here.
+        try {
+            // could be programmatic flushing, so must include in the try... finally
+            final ObjectAdapter resultAdapter = obtainResultAdapter();
+
+            // flush any queued changes, so concurrency or violation exceptions (if any)
+            // will be thrown here
+            getTransactionManager().flushTransaction();
+
+
+            if(promptStyle == PromptStyle.INLINE) {
+
+                final Page page = feedbackForm.getPage();
+                addComponentsToRedraw(target, page);
+
+            } else {
+                forwardOntoResult(resultAdapter, target);
+
+            }
+
+            onExecuteAndProcessResults(target);
+
+            return true;
+
+        } catch (RuntimeException ex) {
+
+            String message = recognizeException(ex, target, feedbackForm);
+
+            if (message != null) {
+                // no need to add to message broker, should already have been added...
+
+                if (feedbackForm == null) {
+                    // forward on instead to void page
+                    // (otherwise, we'll have rendered an action parameters page
+                    // and so we'll be staying on that page)
+                    ActionResultResponseHandlingStrategy.REDIRECT_TO_VOID
+                            .handleResults(panel, null, getIsisSessionFactory());
+                }
+
+                return false;
+            }
+
+            // not handled, so capture and propagate
+            if (command != null) {
+                command.setException(Throwables.getStackTraceAsString(ex));
+            }
+
+            throw ex;
+        }
+    }
+
+    private void addComponentsToRedraw(final AjaxRequestTarget target, final Page page) {
+        final List<Component> componentsToRedraw = Lists.newArrayList();
+        final List<Component> componentsNotToRedraw = Lists.newArrayList();
+
+        page.visitChildren(new IVisitor<Component, Object>() {
+            @Override
+            public void component(final Component component, final IVisit<Object> visit) {
+                if (component.getOutputMarkupId() && !(component instanceof Page)) {
+                    List<Component> listToAddTo =
+                            shouldRedraw(component)
+                                    ? componentsToRedraw
+                                    : componentsNotToRedraw;
+                    listToAddTo.add(component);
+                }
+            }
+
+            private boolean shouldRedraw(final Component component) {
+
+                // hmm... this doesn't work, because I think that the components
+                // get removed after they've been added to target.
+                // so.. still getting WARN log messages from XmlPartialPageUpdate
+
+//                final Page page = component.findParent(Page.class);
+//                if(page == null) {
+//                    // as per logic in XmlPartialPageUpdate, this has already been
+//                    // removed from page so don't attempt to redraw it
+//                    return false;
+//                }
+
+                final Object defaultModel = component.getDefaultModel();
+                if (!(defaultModel instanceof ScalarModel)) {
+                    return true;
+                }
+                final ScalarModel scalarModel = (ScalarModel) defaultModel;
+                final UnchangingFacet unchangingFacet = scalarModel.getFacet(UnchangingFacet.class);
+                return unchangingFacet == null || ! unchangingFacet.value() ;
+            }
+        });
+
+        for (Component componentNotToRedraw : componentsNotToRedraw) {
+            MarkupContainer parent = componentNotToRedraw.getParent();
+            while(parent != null) {
+                parent = parent.getParent();
+            }
+
+            componentNotToRedraw.visitParents(MarkupContainer.class, new IVisitor<MarkupContainer, Object>() {
+                @Override
+                public void component(final MarkupContainer parent, final IVisit<Object> visit) {
+                    componentsToRedraw.remove(parent); // no-op if not in that list
+                }
+            });
+            if(componentNotToRedraw instanceof MarkupContainer) {
+                final MarkupContainer containerNotToRedraw = (MarkupContainer) componentNotToRedraw;
+                containerNotToRedraw.visitChildren(new IVisitor<Component, Object>() {
+                    @Override
+                    public void component(final Component parent, final IVisit<Object> visit) {
+                        componentsToRedraw.remove(parent); // no-op if not in that list
+                    }
+                });
+            }
+        }
+
+        // debug(componentsToRedraw, componentsNotToRedraw);
+
+        for (Component component : componentsToRedraw) {
+            target.add(component);
+        }
+    }
+
+    private void debug(
+            final List<Component> componentsToRedraw,
+            final List<Component> componentsNotToRedraw) {
+        debug("Not redrawing", componentsNotToRedraw);
+        debug("Redrawing", componentsToRedraw);
+    }
+
+    private void debug(final String title, final List<Component> list) {
+        System.out.println(">>> " + title + ":");
+        for (Component component : list) {
+            System.out.println(
+                    String.format("%30s: %s",
+                            component.getClass().getSimpleName(),
+                            component.getPath()));
+
+        }
+    }
+
+    private String recognizeException(RuntimeException ex, AjaxRequestTarget target, Form<?> feedbackForm) {
+
+        // REVIEW: this code is similar to stuff in EntityPropertiesForm, perhaps move up to superclass?
+        // REVIEW: similar code also in WebRequestCycleForIsis; combine?
+
+        // see if the exception is recognized as being a non-serious error
+        // (nb: similar code in WebRequestCycleForIsis, as a fallback)
+        List<ExceptionRecognizer> exceptionRecognizers = getServicesInjector()
+                .lookupServices(ExceptionRecognizer.class);
+        String recognizedErrorIfAny = new ExceptionRecognizerComposite(exceptionRecognizers).recognize(ex);
+        if (recognizedErrorIfAny != null) {
+
+            // recognized
+            raiseWarning(target, feedbackForm, recognizedErrorIfAny);
+
+            getTransactionManager().getCurrentTransaction().clearAbortCause();
+
+            // there's no need to abort the transaction, it will have already been done
+            // (in IsisTransactionManager#executeWithinTransaction(...)).
+        }
+        return recognizedErrorIfAny;
+    }
+
+    private void raiseWarning(AjaxRequestTarget target, Form<?> feedbackForm, String error) {
+        if(target != null && feedbackForm != null) {
+            target.add(feedbackForm);
+            feedbackForm.error(error);
+        } else {
+            getMessageBroker().addWarning(error);
+        }
+    }
+
+
+    // ///////////////////////////////////////////////////////////////////
+    // Dependencies (from IsisContext)
+    // ///////////////////////////////////////////////////////////////////
+
+    protected PersistenceSession getPersistenceSession() {
+        return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
+    }
+
+    protected ServicesInjector getServicesInjector() {
+        return getIsisSessionFactory().getServicesInjector();
+    }
+
+    protected SpecificationLoader getSpecificationLoader() {
+        return getIsisSessionFactory().getSpecificationLoader();
+    }
+
+    private IsisTransactionManager getTransactionManager() {
+        return getPersistenceSession().getTransactionManager();
+    }
+
+    private MessageBroker getMessageBroker() {
+        return getAuthenticationSession().getMessageBroker();
+    }
+
+    protected IsisSessionFactory getIsisSessionFactory() {
+        return IsisContext.getSessionFactory();
+    }
+
+    protected AuthenticationSession getAuthenticationSession() {
+        return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+    }
+
+
+    ///////////////////////////////////////////////////////////////////////////////
+
+    protected abstract ObjectAdapter obtainTargetAdapter();
+
+    protected abstract String getReasonInvalidIfAny();
+
+    protected abstract void onExecuteAndProcessResults(final AjaxRequestTarget target);
+
+    protected abstract ObjectAdapter obtainResultAdapter();
+
+    protected abstract void forwardOnConcurrencyException(
+            final ObjectAdapter targetAdapter,
+            final ConcurrencyException ex);
+
+    protected abstract void forwardOntoResult(
+            final ObjectAdapter resultAdapter,
+            final AjaxRequestTarget target);
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
index 4b43e78..c6d0dac 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
@@ -24,26 +24,19 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.IsisSystem;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationConfig;
-
 /**
  * Convenience adapter for {@link Panel}s built up using {@link ComponentType}s.
  */
@@ -158,32 +151,12 @@ public abstract class PanelAbstract<T extends IModel<?>> extends Panel {
 
 
     protected void addConfirmationDialogIfAreYouSureSemantics(final Component component, final SemanticsOf semanticsOf) {
-        if (!semanticsOf.isAreYouSure()) {
-            return;
-        }
-
-        final TranslationService translationService =
-                getPersistenceSession().getServicesInjector().lookupService(TranslationService.class);
-
-        ConfirmationConfig confirmationConfig = new ConfirmationConfig();
 
-        final String context = IsisSessionFactoryBuilder.class.getName();
-        final String areYouSure = translationService.translate(context, IsisSystem.MSG_ARE_YOU_SURE);
-        final String confirm = translationService.translate(context, IsisSystem.MSG_CONFIRM);
-        final String cancel = translationService.translate(context, IsisSystem.MSG_CANCEL);
+        final ServicesInjector servicesInjector = getPersistenceSession().getServicesInjector();
 
-        confirmationConfig
-                .withTitle(areYouSure)
-                .withBtnOkLabel(confirm)
-                .withBtnCancelLabel(cancel)
-                .withPlacement(TooltipConfig.Placement.right)
-                .withBtnOkClass("btn btn-danger")
-                .withBtnCancelClass("btn btn-default");
-
-        component.add(new ConfirmationBehavior(confirmationConfig));
+        PanelUtil.addConfirmationDialogIfAreYouSureSemantics(component, semanticsOf, servicesInjector);
     }
 
-
     public DeploymentCategory getDeploymentCategory() {
         return getIsisSessionFactory().getDeploymentCategory();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
index 324c593..174a599 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
@@ -28,6 +28,16 @@ import org.apache.wicket.markup.head.CssReferenceHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.request.resource.CssResourceReference;
 
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.runtime.system.IsisSystem;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationConfig;
+
 public final class PanelUtil {
 
     private PanelUtil(){}
@@ -79,4 +89,32 @@ public final class PanelUtil {
                 .onBefore("$('#" + ajaxButtonOrLink.getMarkupId() + "').prop('disabled',true);")
                 .onComplete("$('#" + ajaxButtonOrLink.getMarkupId() + "').prop('disabled',false);"));
     }
+
+    public static void addConfirmationDialogIfAreYouSureSemantics(
+            final Component component,
+            final SemanticsOf semanticsOf,
+            final ServicesInjector servicesInjector) {
+        final TranslationService translationService =
+                servicesInjector.lookupService(TranslationService.class);
+
+        if (!semanticsOf.isAreYouSure()) {
+            return;
+        }
+        ConfirmationConfig confirmationConfig = new ConfirmationConfig();
+
+        final String context = IsisSessionFactoryBuilder.class.getName();
+        final String areYouSure = translationService.translate(context, IsisSystem.MSG_ARE_YOU_SURE);
+        final String confirm = translationService.translate(context, IsisSystem.MSG_CONFIRM);
+        final String cancel = translationService.translate(context, IsisSystem.MSG_CANCEL);
+
+        confirmationConfig
+                .withTitle(areYouSure)
+                .withBtnOkLabel(confirm)
+                .withBtnCancelLabel(cancel)
+                .withPlacement(TooltipConfig.Placement.right)
+                .withBtnOkClass("btn btn-danger")
+                .withBtnCancelClass("btn btn-default");
+
+        component.add(new ConfirmationBehavior(confirmationConfig));
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
new file mode 100644
index 0000000..a328b89
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -0,0 +1,392 @@
+package org.apache.isis.viewer.wicket.ui.panels;
+
+import java.util.List;
+
+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;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptContentHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.util.string.AppendingStringBuffer;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+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.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.model.models.ScalarModel;
+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;
+
+public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormExecutorContext>
+        extends FormAbstract<ObjectAdapter>
+        implements ScalarModelSubscriber2 {
+
+    private static final String ID_OK_BUTTON = "okButton";
+    private static final String ID_CANCEL_BUTTON = "cancelButton";
+
+    private static final String ID_FEEDBACK = "feedback";
+
+    protected final List<ScalarPanelAbstract2> paramPanels = Lists.newArrayList();
+
+    private final Component parentPanel;
+    private final WicketViewerSettings settings;
+    private final T formExecutorContext;
+
+    private final AjaxButton okButton;
+    private final AjaxButton cancelButton;
+
+    public PromptFormAbstract(
+            final String id,
+            final Component parentPanel,
+            final WicketViewerSettings settings,
+            final T model) {
+        super(id, model);
+        this.parentPanel = parentPanel;
+        this.settings = settings;
+        this.formExecutorContext = model;
+
+        setOutputMarkupId(true); // for ajax button
+        addParameters();
+
+        FormFeedbackPanel formFeedback = new FormFeedbackPanel(ID_FEEDBACK);
+        addOrReplace(formFeedback);
+
+        okButton = addOkButton();
+        cancelButton = addCancelButton();
+        configureButtons(okButton, cancelButton);
+    }
+
+    @Override
+    public void renderHead(final IHeaderResponse response) {
+        super.renderHead(response);
+
+        response.render(OnDomReadyHeaderItem.forScript(
+                String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PARAMETER, '%s')", getMarkupId())));
+
+    }
+
+    protected abstract void addParameters();
+
+    protected AjaxButton addOkButton() {
+
+        final IModel<ObjectAdapter> model = getModel();
+
+        AjaxButton okButton = settings.isUseIndicatorForFormSubmit()
+                ? new IndicatingAjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onSubmit(AjaxRequestTarget target, Form<?> form) {
+                final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel)
+                        .getActionPrompt();
+                if (actionPromptIfAny != null) {
+                    actionPromptIfAny.closePrompt(target);
+                }
+
+                final ObjectAdapter targetAdapter = model.getObject();
+
+                onSubmitOf(target, form, this);
+
+                IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().flush();
+                IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().getPersistenceManager()
+                        .flush();
+                // update target, since version updated (concurrency checks)
+                final Page page = target.getPage();
+                if (page instanceof EntityPage) {
+                    final EntityPage entityPage = (EntityPage) page;
+                    final EntityModel pageModel = entityPage.getUiHintContainerIfAny();
+                    pageModel.setObject(targetAdapter);
+
+                    page.visitChildren(new IVisitor<Component, Object>() {
+                        @Override
+                        public void component(
+                                final Component component,
+                                final IVisit<Object> visit) {
+
+                            final IModel<?> componentModel = component.getDefaultModel();
+                            if (componentModel instanceof ScalarModel) {
+                                final ScalarModel scalarModel = (ScalarModel) componentModel;
+                                scalarModel.reset();
+                            }
+                        }
+                    });
+                }
+            }
+
+            @Override
+            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
+                super.updateAjaxAttributes(attributes);
+                if (settings.isPreventDoubleClickForFormSubmit()) {
+                    PanelUtil.disableBeforeReenableOnComplete(attributes, this);
+                }
+            }
+
+            @Override
+            protected void onError(AjaxRequestTarget target, Form<?> form) {
+                super.onError(target, form);
+                target.add(form);
+            }
+        }
+                : new AjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onSubmit(AjaxRequestTarget target, Form<?> form) {
+                onSubmitOf(target, form, this);
+            }
+
+            @Override
+            protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
+                super.updateAjaxAttributes(attributes);
+                if (settings.isPreventDoubleClickForFormSubmit()) {
+                    PanelUtil.disableBeforeReenableOnComplete(attributes, this);
+                }
+            }
+
+            @Override
+            protected void onError(AjaxRequestTarget target, Form<?> form) {
+                super.onError(target, form);
+                target.add(form);
+            }
+        };
+        okButton.add(new JGrowlBehaviour());
+        setDefaultButton(okButton);
+        add(okButton);
+        return okButton;
+    }
+
+    protected AjaxButton addCancelButton() {
+        final AjaxButton cancelButton = new AjaxButton(ID_CANCEL_BUTTON, new ResourceModel("cancelLabel")) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onSubmit(final AjaxRequestTarget target, Form<?> form) {
+                final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel)
+                        .getActionPrompt();
+                if (actionPromptIfAny != null) {
+                    actionPromptIfAny.closePrompt(target);
+                }
+
+                onCancel(target, this);
+
+            }
+        };
+        // so can submit with invalid content (eg mandatory params missing)
+        cancelButton.setDefaultFormProcessing(false);
+
+        add(cancelButton);
+
+        return cancelButton;
+    }
+
+    protected void configureButtons(final AjaxButton okButton, final AjaxButton cancelButton) {
+
+        if (formExecutorContext.getPromptStyle() == PromptStyle.INLINE) {
+            cancelButton.add(new AbstractDefaultAjaxBehavior() {
+
+                private static final String PRE_JS =
+                        "" + "$(document).ready( function() { \n"
+                                + "  $(document).bind('keyup', function(evt) { \n"
+                                + "    if (evt.keyCode == 27) { \n";
+                private static final String POST_JS =
+                        "" + "      evt.preventDefault(); \n   "
+                                + "    } \n"
+                                + "  }); \n"
+                                + "});";
+
+                @Override
+                public void renderHead(final Component component, final IHeaderResponse response) {
+                    super.renderHead(component, response);
+
+                    final String javascript = PRE_JS + getCallbackScript() + POST_JS;
+                    response.render(
+                            JavaScriptContentHeaderItem.forScript(javascript, null, null));
+                }
+
+                @Override
+                protected void respond(final AjaxRequestTarget 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 okButton) {
+
+        setLastFocusHint(target, okButton);
+
+        final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
+        boolean succeeded = formExecutorContext.getFormExecutor()
+                .executeAndProcessResults(target, form, promptStyle);
+        if (succeeded) {
+            if (promptStyle == PromptStyle.DIALOG) {
+                // the Wicket ajax callbacks will have just started to hide the veil
+                // we now show it once more, so that a veil continues to be shown until the
+                // new page is rendered.
+                target.appendJavaScript("isisShowVeil();\n");
+            }
+
+            okButton.send(getPage(), Broadcast.EXACT, newCompletedEvent(target, form));
+
+        } else {
+
+            final StringBuilder builder = new StringBuilder();
+
+            // ensure any jGrowl errors are shown
+            // (normally would be flushed when traverse to next page).
+            String errorMessagesIfAny = JGrowlUtil.asJGrowlCalls(getAuthenticationSession().getMessageBroker());
+            builder.append(errorMessagesIfAny);
+
+            // append the JS to the response.
+            String buf = builder.toString();
+            target.appendJavaScript(buf);
+        }
+
+        rebuildGuiAfterInlinePromptDoneIfNec(target);
+
+        target.add(form);
+
+    }
+
+    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());
+        }
+    }
+
+    protected abstract Object newCompletedEvent(
+            final AjaxRequestTarget target,
+            final Form<?> form);
+
+    @Override
+    public void onError(AjaxRequestTarget target, ScalarPanelAbstract2 scalarPanel) {
+        if (scalarPanel != null) {
+            // ensure that any feedback error associated with the providing component is shown.
+            target.add(scalarPanel);
+        }
+    }
+
+    public void onCancel(
+            final AjaxRequestTarget target,
+            final AjaxButton cancelButton) {
+
+        setLastFocusHint(target, cancelButton);
+
+        rebuildGuiAfterInlinePromptDoneIfNec(target);
+
+    }
+
+    private void rebuildGuiAfterInlinePromptDoneIfNec(final AjaxRequestTarget target) {
+        final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
+        if (promptStyle == PromptStyle.INLINE &&
+                formExecutorContext.getInlinePromptContext() != null) {
+
+            formExecutorContext.reset();
+
+            rebuildGuiAfterInlinePromptDone(target);
+        }
+    }
+
+    private void rebuildGuiAfterInlinePromptDone(final AjaxRequestTarget target) {
+        // replace
+        final String id = parentPanel.getId();
+        final MarkupContainer parent = parentPanel.getParent();
+
+        final WebMarkupContainer replacementPropertyEditFormPanel = new WebMarkupContainer(id);
+        replacementPropertyEditFormPanel.setVisible(false);
+
+        parent.addOrReplace(replacementPropertyEditFormPanel);
+
+        // change visibility of inline components
+        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.add(parent);
+    }
+
+    private AjaxButton defaultSubmittingComponent() {
+        return okButton;
+    }
+
+    // workaround for https://issues.apache.org/jira/browse/WICKET-6364
+    @Override
+    protected void appendDefaultButtonField() {
+        AppendingStringBuffer buffer = new AppendingStringBuffer();
+        buffer.append(
+                "<div style=\"width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden\">");
+        buffer.append("<input type=\"text\" tabindex=\"-1\" autocomplete=\"off\"/>");
+        Component submittingComponent = (Component) this.defaultSubmittingComponent();
+        buffer.append("<input type=\"submit\" tabindex=\"-1\" name=\"");
+        buffer.append(this.defaultSubmittingComponent().getInputName());
+        buffer.append("\" onclick=\" var b=document.getElementById(\'");
+        buffer.append(submittingComponent.getMarkupId());
+        buffer.append(
+                "\'); if (b!=null&amp;&amp;b.onclick!=null&amp;&amp;typeof(b.onclick) != \'undefined\') {  var r = Wicket.bind(b.onclick, b)(); if (r != false) b.click(); } else { b.click(); };  return false;\" ");
+        buffer.append(" />");
+        buffer.append("</div>");
+        this.getResponse().write(buffer);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/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 7279da3..f1aa71e 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
@@ -19,48 +19,10 @@
 
 package org.apache.isis.viewer.wicket.ui.panels;
 
-import java.util.List;
-
-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;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.event.Broadcast;
-import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptContentHeaderItem;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.util.string.AppendingStringBuffer;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
 
-import org.apache.isis.applib.annotation.PromptStyle;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-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.model.models.ScalarModel;
-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
@@ -68,365 +30,12 @@ import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
  */
 public abstract class PromptFormPanelAbstract<T extends IModel<?> & FormExecutorContext> extends PanelAbstract<T> {
 
-    private static final String ID_OK_BUTTON = "okButton";
-    private static final String ID_CANCEL_BUTTON = "cancelButton";
-
 
 
     public PromptFormPanelAbstract(final String id, final T model) {
         super(id, model);
     }
 
-    public static abstract class FormAbstract<T extends IModel<ObjectAdapter> & FormExecutorContext> extends Form<ObjectAdapter>
-            implements ScalarModelSubscriber2 {
-
-        protected static final String ID_FEEDBACK = "feedback";
-
-        protected final List<ScalarPanelAbstract2> paramPanels = Lists.newArrayList();
-        protected final Component parentPanel;
-        private final WicketViewerSettings settings;
-        private final T formExecutorContext;
-
-        private final AjaxButton okButton;
-        private final AjaxButton cancelButton;
-
-        public FormAbstract(
-                final String id,
-                final Component parentPanel,
-                final WicketViewerSettings settings,
-                final T model) {
-            super(id, model);
-            this.parentPanel = parentPanel;
-            this.settings = settings;
-            this.formExecutorContext = model;
-
-            setOutputMarkupId(true); // for ajax button
-            addParameters();
-
-            FormFeedbackPanel formFeedback = new FormFeedbackPanel(ID_FEEDBACK);
-            addOrReplace(formFeedback);
-
-            okButton = addOkButton();
-            cancelButton = addCancelButton();
-            configureButtons(okButton, cancelButton);
-        }
-
-
-        protected abstract void addParameters();
-
-        protected AjaxButton addOkButton() {
-
-            final IModel<ObjectAdapter> model = getModel();
-
-            AjaxButton okButton = settings.isUseIndicatorForFormSubmit()
-                    ? new IndicatingAjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
-                        private static final long serialVersionUID = 1L;
-
-                        @Override
-                        public void onSubmit(AjaxRequestTarget target, Form<?> form) {
-                            final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel).getActionPrompt();
-                            if(actionPromptIfAny != null) {
-                                actionPromptIfAny.closePrompt(target);
-                            }
-
-                            final ObjectAdapter targetAdapter = model.getObject();
-
-                            onSubmitOf(target, form, this);
-
-                            IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().flush();
-                            IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().getPersistenceManager().flush();
-                            // update target, since version updated (concurrency checks)
-                            final Page page = target.getPage();
-                            if(page instanceof EntityPage) {
-                                final EntityPage entityPage = (EntityPage) page;
-                                final EntityModel pageModel = entityPage.getUiHintContainerIfAny();
-                                pageModel.setObject(targetAdapter);
-
-                                page.visitChildren(new IVisitor<Component, Object>() {
-                                    @Override
-                                    public void component(
-                                            final Component component,
-                                            final IVisit<Object> visit) {
-
-                                        final IModel<?> componentModel = component.getDefaultModel();
-                                        if(componentModel instanceof ScalarModel) {
-                                            final ScalarModel scalarModel = (ScalarModel) componentModel;
-                                            scalarModel.reset();
-                                        }
-                                    }
-                                });
-
-                            }
-
-                        }
-
-                        @Override
-                        protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
-                            super.updateAjaxAttributes(attributes);
-                            if(settings.isPreventDoubleClickForFormSubmit()) {
-                                PanelUtil.disableBeforeReenableOnComplete(attributes, this);
-                            }
-                        }
-
-                        @Override
-                        protected void onError(AjaxRequestTarget target, Form<?> form) {
-                            super.onError(target, form);
-                            target.add(form);
-                        }
-                    }
-                    : new AjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
-                        private static final long serialVersionUID = 1L;
-
-                        @Override
-                        public void onSubmit(AjaxRequestTarget target, Form<?> form) {
-                            onSubmitOf(target, form, this);
-                        }
-
-                        @Override
-                        protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
-                            super.updateAjaxAttributes(attributes);
-                            if(settings.isPreventDoubleClickForFormSubmit()) {
-                                PanelUtil.disableBeforeReenableOnComplete(attributes, this);
-                            }
-                        }
-
-                        @Override
-                        protected void onError(AjaxRequestTarget target, Form<?> form) {
-                            super.onError(target, form);
-                            target.add(form);
-                        }
-                    };
-            okButton.add(new JGrowlBehaviour());
-            setDefaultButton(okButton);
-            add(okButton);
-            return okButton;
-        }
-
-
-        protected AjaxButton addCancelButton() {
-            final AjaxButton cancelButton = new AjaxButton(ID_CANCEL_BUTTON, new ResourceModel("cancelLabel")) {
-                private static final long serialVersionUID = 1L;
-
-                @Override
-                public void onSubmit(final AjaxRequestTarget target, Form<?> form) {
-                    final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel).getActionPrompt();
-                    if(actionPromptIfAny != null) {
-                        actionPromptIfAny.closePrompt(target);
-                    }
-
-                    onCancel(target, this);
-
-                }
-            };
-            // so can submit with invalid content (eg mandatory params missing)
-            cancelButton.setDefaultFormProcessing(false);
-
-            add(cancelButton);
-
-            return cancelButton;
-        }
-
-        protected void configureButtons(final AjaxButton okButton, final AjaxButton cancelButton) {
-
-            if(formExecutorContext.getPromptStyle() == PromptStyle.INLINE) {
-                cancelButton.add(new AbstractDefaultAjaxBehavior() {
-
-                    private static final String PRE_JS =
-                            ""+"$(document).ready( function() { \n"
-                                    +  "  $(document).bind('keyup', function(evt) { \n"
-                                    +  "    if (evt.keyCode == 27) { \n";
-                    private static final String POST_JS =
-                            ""+"      evt.preventDefault(); \n   "
-                                    +  "    } \n"
-                                    +  "  }); \n"
-                                    +  "});";
-
-                    @Override
-                    public void renderHead(final Component component, final IHeaderResponse response) {
-                        super.renderHead(component, response);
-
-                        final String javascript = PRE_JS + getCallbackScript() + POST_JS;
-                        response.render(
-                                JavaScriptContentHeaderItem.forScript(javascript, null, null));
-                    }
-
-                    @Override
-                    protected void respond(final AjaxRequestTarget 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 okButton) {
-
-            setLastFocusHint(target, okButton);
-
-            final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
-            boolean succeeded = formExecutorContext.getFormExecutor().executeAndProcessResults(target, form, promptStyle);
-            if(succeeded) {
-                if(promptStyle == PromptStyle.DIALOG) {
-                    // the Wicket ajax callbacks will have just started to hide the veil
-                    // we now show it once more, so that a veil continues to be shown until the
-                    // new page is rendered.
-                    target.appendJavaScript("isisShowVeil();\n");
-                }
-
-                okButton.send(getPage(), Broadcast.EXACT, newCompletedEvent(target, form));
-
-            } else {
-
-                final StringBuilder builder = new StringBuilder();
-
-                // ensure any jGrowl errors are shown
-                // (normally would be flushed when traverse to next page).
-                String errorMessagesIfAny = JGrowlUtil.asJGrowlCalls(getAuthenticationSession().getMessageBroker());
-                builder.append(errorMessagesIfAny);
-
-                // append the JS to the response.
-                String buf = builder.toString();
-                target.appendJavaScript(buf);
-            }
-
-            rebuildGuiAfterInlinePromptDoneIfNec(target);
-
-            target.add(form);
-
-        }
-
-        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();
-        }
-
-        protected IsisSessionFactory getIsisSessionFactory() {
-            return IsisContext.getSessionFactory();
-        }
-
-
-        protected abstract Object newCompletedEvent(
-                final AjaxRequestTarget target,
-                final Form<?> form);
-
-        @Override
-        public void onError(AjaxRequestTarget target, ScalarPanelAbstract2 scalarPanel) {
-            if(scalarPanel != null) {
-                // ensure that any feedback error associated with the providing component is shown.
-                target.add(scalarPanel);
-            }
-        }
-
-        public void onCancel(
-                final AjaxRequestTarget target, final AjaxButton cancelButton) {
-
-//            String lastFocusedElementId = target.getLastFocusedElementId();
-//            System.out.println("onCancel, lastFocusedElementId = " + lastFocusedElementId);
-
-            setLastFocusHint(target, cancelButton);
-
-            rebuildGuiAfterInlinePromptDoneIfNec(target);
-
-        }
-
-        private void rebuildGuiAfterInlinePromptDoneIfNec(final AjaxRequestTarget target) {
-            final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
-            if(promptStyle == PromptStyle.INLINE &&
-               formExecutorContext.getInlinePromptContext() != null) {
-
-                formExecutorContext.reset();
-
-                rebuildGuiAfterInlinePromptDone(target);
-            }
-        }
-
-        private void rebuildGuiAfterInlinePromptDone(final AjaxRequestTarget target) {
-            // replace
-            final String id = parentPanel.getId();
-            final MarkupContainer parent = parentPanel.getParent();
-
-            final WebMarkupContainer replacementPropertyEditFormPanel = new WebMarkupContainer(id);
-            replacementPropertyEditFormPanel.setVisible(false);
-
-            parent.addOrReplace(replacementPropertyEditFormPanel);
-
-            // change visibility of inline components
-            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);
-        }
-
-        private AjaxButton defaultSubmittingComponent() {
-            return okButton;
-        }
-
-        // workaround for https://issues.apache.org/jira/browse/WICKET-6364
-        @Override
-        protected void appendDefaultButtonField() {
-            AppendingStringBuffer buffer = new AppendingStringBuffer();
-            buffer.append("<div style=\"width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden\">");
-            buffer.append("<input type=\"text\" tabindex=\"-1\" autocomplete=\"off\"/>");
-            Component submittingComponent = (Component)this.defaultSubmittingComponent();
-            buffer.append("<input type=\"submit\" tabindex=\"-1\" name=\"");
-            buffer.append(this.defaultSubmittingComponent().getInputName());
-            buffer.append("\" onclick=\" var b=document.getElementById(\'");
-            buffer.append(submittingComponent.getMarkupId());
-            buffer.append("\'); if (b!=null&amp;&amp;b.onclick!=null&amp;&amp;typeof(b.onclick) != \'undefined\') {  var r = Wicket.bind(b.onclick, b)(); if (r != false) b.click(); } else { b.click(); };  return false;\" ");
-            buffer.append(" />");
-            buffer.append("</div>");
-            this.getResponse().write(buffer);
-        }
-
-
-    }
-
-
     //region > dependencies
     @com.google.inject.Inject
     WicketViewerSettings settings;