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/04/23 13:48:16 UTC

[2/2] isis git commit: ISIS-1603: provides first-cut impl of rendering property inline edit form for ScalarPanelTextFieldAbstract.

ISIS-1603: provides first-cut impl of rendering property inline edit form for ScalarPanelTextFieldAbstract.

Main (obvious in retrospect) insight is that the edit Link and the inline edit form are not together in the markup

Also:
- renamed HasExecutingPanel to HasFormExecutor, and simplified way that this is setup

Still need to:
- handle the cancel button
- get focus handling working correctly
- style textarea correctly
- do the other subtypes of ScalarPanelAbstract (ReferencePanel, ValueChoicesSelect2Panel, BooleanPanel, IsisBlobOrClobPanelAbstract)
  - need to figure out how to render reference...


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

Branch: refs/heads/ISIS-1603-no-xeditable
Commit: 160797389ebd67720f4a7c4047d620e5767138a6
Parents: 9c9ff86
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun Apr 23 14:48:03 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun Apr 23 14:48:03 2017 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/models/ActionModel.java |   2 +-
 .../wicket/model/models/HasExecutingPanel.java  |  24 ----
 .../wicket/model/models/HasFormExecutor.java    |  24 ++++
 .../viewer/wicket/model/models/ScalarModel.java |   2 +-
 .../components/actions/ActionPanelFactory.java  |   3 +-
 .../actions/ActionParametersFormPanel.java      |  15 +--
 .../property/PropertyEditFormPanel.java         |  12 +-
 .../components/property/PropertyEditPanel.java  |  31 +----
 .../components/scalars/ScalarPanelAbstract.html |  34 ++---
 .../components/scalars/ScalarPanelAbstract.java |  61 ++++++---
 .../scalars/ScalarPanelTextFieldAbstract.java   | 128 ++++++++++---------
 .../isisapplib/IsisBlobOrClobPanelAbstract.java |   2 +-
 .../scalars/primitive/BooleanPanel.java         |   2 +-
 .../scalars/reference/ReferencePanel.java       |   2 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  |   2 +-
 .../wicket/ui/pages/bootstrap-overrides.css     |   9 +-
 .../ui/panels/PromptFormPanelAbstract.java      |  60 +++++----
 17 files changed, 216 insertions(+), 197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 981026b..d4f46b4 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -79,7 +79,7 @@ import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
  * action's {@link Mode#PARAMETERS parameters}, or the handling of the
  * {@link Mode#RESULTS results} once invoked.
  */
-public class ActionModel extends BookmarkableModel<ObjectAdapter> implements HasExecutingPanel {
+public class ActionModel extends BookmarkableModel<ObjectAdapter> implements HasFormExecutor {
 
     private static final long serialVersionUID = 1L;
     

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasExecutingPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasExecutingPanel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasExecutingPanel.java
deleted file mode 100644
index 33b376d..0000000
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasExecutingPanel.java
+++ /dev/null
@@ -1,24 +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.model.models;
-
-public interface HasExecutingPanel  {
-    FormExecutor getFormExecutor();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java
new file mode 100644
index 0000000..7d75e16
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/HasFormExecutor.java
@@ -0,0 +1,24 @@
+/*
+ *  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.model.models;
+
+public interface HasFormExecutor {
+    FormExecutor getFormExecutor();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 18e2830..17c32be 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -68,7 +68,7 @@ import org.apache.isis.viewer.wicket.model.mementos.SpecUtils;
  * Is the backing model to each of the fields that appear in forms (for entities
  * or action dialogs).
  */
-public class ScalarModel extends EntityModel implements LinksProvider,HasExecutingPanel, ActionArgumentModel {
+public class ScalarModel extends EntityModel implements LinksProvider,HasFormExecutor, ActionArgumentModel {
 
     private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanelFactory.java
index 30af5e9..5d33fea 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanelFactory.java
@@ -46,7 +46,8 @@ public class ActionPanelFactory extends ComponentFactoryAbstract {
     @Override
     public Component createComponent(final String id, final IModel<?> model) {
         final ActionModel actionModel = (ActionModel) model;
-        return new ActionPanel(id, actionModel);
+        final ActionPanel actionPanel = new ActionPanel(id, actionModel);
+        return actionPanel;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index 4d97d24..7a7d16c 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -33,6 +33,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.hints.IsisActionCompletedEvent;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.ActionArgumentModel;
@@ -62,28 +63,22 @@ public class ActionParametersFormPanel extends PromptFormPanelAbstract<ActionMod
         buildGui();
     }
 
-//    @Override
-//    protected void onConfigure() {
-//        buildGui();
-//    }
-
     private void buildGui() {
         ActionModel model = getModel();
         model.clearArguments();  // in case previously used, eg prompt displayed then cancelled
-        add(new ActionParameterForm("inputForm", this, model));
-//        addOrReplace(new ActionParameterForm("inputForm", this, model));
+        add(new ActionParameterForm("inputForm", this, this.getSettings(), model));
     }
 
     class ActionParameterForm extends PropertyEditFormPanel.FormAbstract<ActionModel> implements ScalarModelSubscriber  {
 
         private static final long serialVersionUID = 1L;
 
-
         public ActionParameterForm(
                 final String id,
-                final PromptFormPanelAbstract<?> parentPanel,
+                final Component parentPanel,
+                final WicketViewerSettings settings,
                 final ActionModel actionModel) {
-            super(id, parentPanel, actionModel);
+            super(id, parentPanel, settings, actionModel);
         }
 
         private ActionModel getActionModel() {

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/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 107b7e0..6b94d41 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
@@ -25,6 +25,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 
 import org.apache.isis.viewer.wicket.model.hints.IsisPropertyEditCompletedEvent;
+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.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber;
@@ -50,7 +51,7 @@ public class PropertyEditFormPanel extends PromptFormPanelAbstract<ScalarModel>
 
     private void buildGui() {
         ScalarModel model = getModel();
-        add(new PropertyEditForm("inputForm", this, model));
+        add(new PropertyEditForm("inputForm", this, this.getSettings(), model));
     }
 
     class PropertyEditForm extends FormAbstract<ScalarModel> implements ScalarModelSubscriber  {
@@ -59,9 +60,10 @@ public class PropertyEditFormPanel extends PromptFormPanelAbstract<ScalarModel>
 
         public PropertyEditForm(
                 final String id,
-                final PromptFormPanelAbstract<?> parentPanel,
+                final Component parentPanel,
+                final WicketViewerSettings settings,
                 final ScalarModel propertyModel) {
-            super(id, parentPanel, propertyModel);
+            super(id, parentPanel, settings, propertyModel);
         }
 
         private ScalarModel getScalarModel() {
@@ -75,7 +77,8 @@ public class PropertyEditFormPanel extends PromptFormPanelAbstract<ScalarModel>
             final WebMarkupContainer container = new WebMarkupContainer(ID_PROPERTY);
             add(container);
 
-            final Component component = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
+            final Component component =
+                    getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
             final ScalarPanelAbstract paramPanel = component instanceof ScalarPanelAbstract ? (ScalarPanelAbstract) component : null;
             if(paramPanel != null) {
                 paramPanel.setOutputMarkupId(true);
@@ -94,7 +97,6 @@ public class PropertyEditFormPanel extends PromptFormPanelAbstract<ScalarModel>
                 final AjaxRequestTarget target, final ScalarModelProvider provider) {
 
         }
-
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/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 146b4d0..f4804ad 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
@@ -19,10 +19,8 @@
 
 package org.apache.isis.viewer.wicket.ui.components.property;
 
-import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.core.commons.authentication.MessageBroker;
@@ -31,16 +29,13 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
-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.pages.entity.EntityPage;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
-public class PropertyEditPanel extends PanelAbstract<ScalarModel>
-        implements FormExecutor {
+public class PropertyEditPanel extends PanelAbstract<ScalarModel> {
 
     private static final long serialVersionUID = 1L;
 
@@ -55,7 +50,7 @@ public class PropertyEditPanel extends PanelAbstract<ScalarModel>
 
     public PropertyEditPanel(final String id, final ScalarModel scalarModel) {
         super(id, new ScalarModel(scalarModel.getParentObjectAdapterMemento(), scalarModel.getPropertyMemento()));
-        getScalarModel().setFormExecutor(this);
+        getScalarModel().setFormExecutor(new PropertyEditFormExecutor(this, getModel()));
         buildGui(getScalarModel());
     }
 
@@ -63,7 +58,7 @@ public class PropertyEditPanel extends PanelAbstract<ScalarModel>
     protected void onConfigure() {
         super.onConfigure();
 
-        buildGui(getModel());
+        buildGui(getScalarModel());
     }
 
     private void buildGui(final ScalarModel scalarModel) {
@@ -136,32 +131,12 @@ public class PropertyEditPanel extends PanelAbstract<ScalarModel>
         return header;
     }
 
-    /**
-     * @param feedbackForm - for feedback messages.
-     * @return
-     */
-    @Override
-    public boolean executeAndProcessResults(AjaxRequestTarget target, Form<?> feedbackForm) {
-
-        return new PropertyEditFormExecutor(this, getModel()).executeAndProcessResults(target, feedbackForm);
-
-
-    }
-
-
-
-
-
 
 
     ///////////////////////////////////////////////////////
     // Dependencies (from context)
     ///////////////////////////////////////////////////////
     
-    protected IsisTransactionManager getTransactionManager() {
-        return getPersistenceSession().getTransactionManager();
-    }
-
     protected MessageBroker getMessageBroker() {
         return getAuthenticationSession().getMessageBroker();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
index 8029649..6238772 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
@@ -26,11 +26,14 @@
         <wicket:panel>
             <div wicket:id="scalarTypeContainer"
                  class="scalarNameAndValueComponentType" >
+
                 <div wicket:id="scalarIfRegular"
                      class="form-group" >
+
                     <label wicket:id="scalarName"
                            class="scalarName control-label"
                     >[Label text]</label>
+
                     <span class="scalarValueWrapper">
                         <div class="scalarPlaceholder">
                             <span class="scalarValueInput">
@@ -38,22 +41,17 @@
                                     <wicket:child/>
                                     <a wicket:id="editProperty"
                                        href="#"
-                                       class="edit fa fa-pencil-square-o"/>
-                                    <div wicket:id="scalarValueEditInlineContainer">
-                                        <a
-                                                href="#"
-                                                name="scalarValueEditInline"
-                                                class="form-control input-sm scalarValueEditInline"
-                                                wicket:id="scalarValueEditInline">
-                                            <span wicket:id="scalarValueEditInlineLabel"></span>
-                                        </a>
-
-                                        <div wicket:id="propertyEditForm">
-                                            <div><span>property edit form</span></div>
-                                        </div>
-                                    </div>
+                                       class="edit fa fa-pencil-square-o"></a>
+                                    <a
+                                            href="#"
+                                            name="scalarValueEditInline"
+                                            class="form-control input-sm scalarValueEditInline"
+                                            wicket:id="scalarValueEditInline">
+                                        <span wicket:id="scalarValueEditInlineLabel"></span>
+                                    </a>
                                 </span>
                             </span>
+
                             <span wicket:id="associatedActionLinksRight"
                                   class="associatedActionLinksRight"
                             >[drop down]</span>
@@ -61,8 +59,14 @@
                         <span wicket:id="feedback" class="help-block"></span>
                         <span wicket:id="associatedActionLinksBelow"></span>
                     </span>
-                    <div class="clearfix"/>
+                    <div class="clearfix"></div>
+
+                </div>
+
+                <div wicket:id="scalarIfRegularInlineEditForm" class="inlineEditForm" >
+                    <div><span>property edit form</span></div>
                 </div>
+
                 <wicket:container wicket:id="scalarIfCompact"></wicket:container>
             </div>
 

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/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 853d8a2..da08bc1 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,6 +51,7 @@ import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
 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.PropertyEditFormExecutor;
 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.scalars.TextFieldValueModel.ScalarModelProvider;
@@ -77,9 +78,12 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     protected static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular";
     protected static final String ID_SCALAR_NAME = "scalarName";
     protected static final String ID_SCALAR_VALUE = "scalarValue";
+
     protected static final String ID_SCALAR_VALUE_EDIT_INLINE = "scalarValueEditInline";
     protected static final String ID_SCALAR_VALUE_EDIT_INLINE_LABEL = "scalarValueEditInlineLabel";
 
+    protected static final String ID_SCALAR_IF_REGULAR_INLINE_EDIT_FORM = "scalarIfRegularInlineEditForm";
+
     protected static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
 
     private static final String ID_ASSOCIATED_ACTION_LINKS_BELOW = "associatedActionLinksBelow";
@@ -144,10 +148,16 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         }
     }
 
-    protected Component componentIfCompact;
-    private Component componentIfRegular;
     protected final ScalarModel scalarModel;
 
+    protected WebMarkupContainer scalarTypeContainer;
+
+    protected Component scalarIfCompact;
+    protected Component scalarIfRegular;
+    protected WebMarkupContainer scalarIfRegularInlineEditForm;
+
+    protected WebMarkupContainer editInlineLink;
+
 
     public ScalarPanelAbstract(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
@@ -173,11 +183,11 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     }
 
     protected Component getLabelForCompact() {
-        return componentIfCompact;
+        return scalarIfCompact;
     }
 
     public Component getComponentForRegular() {
-        return componentIfRegular;
+        return scalarIfRegular;
     }
 
     @Override
@@ -225,8 +235,8 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         
         // REVIEW: this is nasty, both write to the same entityLink field
         // even though only one is used
-        componentIfCompact = addComponentForCompact();
-        componentIfRegular = addComponentForRegular();
+        scalarIfCompact = addComponentForCompact();
+        scalarIfRegular = addComponentForRegular();
         
         getRendering().buildGui(this);
         addCssForMetaModel();
@@ -293,17 +303,13 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     }
 
     protected void addEditPropertyTo(
-            final MarkupContainer markupContainer,
-            final WebMarkupContainer editInlineLink,
-            final Component scalarValueEditInlineContainer,
-            final Component propertyEditForm) {
+            final MarkupContainer scalarIfRegularFormGroup) {
 
-        final PropertyEditStyle editStyle = this.scalarModel.getEditStyle();
-        if(editStyle == PropertyEditStyle.DIALOG) {
+        if(scalarModel.isEditable() && scalarModel.getEditStyle() == PropertyEditStyle.DIALOG) {
 
             final WebMarkupContainer editProperty = new WebMarkupContainer(ID_EDIT_PROPERTY);
-
             editProperty.setOutputMarkupId(true);
+            scalarIfRegularFormGroup.addOrReplace(editProperty);
 
             editProperty.add(new AjaxEventBehavior("click") {
                 protected void onEvent(AjaxRequestTarget target) {
@@ -327,18 +333,36 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
                 }
             });
+        } else {
+            Components.permanentlyHide(scalarIfRegularFormGroup, ID_EDIT_PROPERTY);
+        }
 
-            markupContainer.addOrReplace(editProperty);
+    }
 
-        } else {
+    protected void configureInlineEditCallback() {
+
+        final PropertyEditStyle editStyle = this.scalarModel.getEditStyle();
+        if(editStyle == PropertyEditStyle.INLINE) {
 
             if(editInlineLink != null) {
                 editInlineLink.add(new AjaxEventBehavior("click") {
                     @Override
                     protected void onEvent(final AjaxRequestTarget target) {
+
+                        scalarModel.toEditMode();
                         editInlineLink.setVisible(false);
-                        propertyEditForm.setVisible(true);
-                        target.add(scalarValueEditInlineContainer);
+
+                        // dynamically update the edit form.
+                        final PropertyEditFormExecutor formExecutor =
+                                new PropertyEditFormExecutor(ScalarPanelAbstract.this, scalarModel);
+                        scalarModel.setFormExecutor(formExecutor);
+                        scalarIfRegularInlineEditForm = (WebMarkupContainer) getComponentFactoryRegistry().addOrReplaceComponent(
+                                scalarTypeContainer, ID_SCALAR_IF_REGULAR_INLINE_EDIT_FORM, ComponentType.PROPERTY_EDIT_FORM, scalarModel);
+
+                        scalarIfRegular.setVisible(false);
+                        scalarIfRegularInlineEditForm.setVisible(true);
+
+                        target.add(scalarTypeContainer);
                     }
 
                     @Override
@@ -347,9 +371,6 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
                     }
                 });
             }
-
-
-            Components.permanentlyHide(markupContainer, ID_EDIT_PROPERTY);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/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 7e91968..ba6f4d2 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
@@ -74,12 +74,8 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         }
     }
 
-    protected WebMarkupContainer scalarTypeContainer;
     private AbstractTextComponent<T> textField;
 
-    private WebMarkupContainer scalarValueEditInlineContainer;
-    private WebMarkupContainer editInlineLink;
-    private Component propertyEditForm;
 
     public ScalarPanelTextFieldAbstract(final String id, final ScalarModel scalarModel, final Class<T> cls) {
         super(id, scalarModel);
@@ -91,26 +87,12 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         super.onInitialize();
 
         scalarTypeContainer = new WebMarkupContainer(ID_SCALAR_TYPE_CONTAINER);
+        scalarTypeContainer.setOutputMarkupId(true);
         scalarTypeContainer.add(new CssClassAppender(getScalarPanelType()));
         addOrReplace(scalarTypeContainer);
 
     }
 
-    private Component getEditComponent() {
-        return scalarModel.getEditStyle() == PropertyEditStyle.INLINE
-                ? scalarValueEditInlineContainer
-                : textField;
-    }
-
-    /**
-     * Opposite of {@link #getEditComponent()}.
-     */
-    private Component getOtherComponent() {
-        return scalarModel.getEditStyle() == PropertyEditStyle.INLINE
-                ? textField
-                : scalarValueEditInlineContainer;
-    }
-
 
     AbstractTextComponent<T> getTextField() {
         return textField;
@@ -143,69 +125,80 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         final IModel<T> textFieldModel = textField.getModel();
 
 
-        this.scalarValueEditInlineContainer = new WebMarkupContainer("scalarValueEditInlineContainer");
-        scalarValueEditInlineContainer.setOutputMarkupId(true);
-        this.editInlineLink = new WebMarkupContainer(ID_SCALAR_VALUE_EDIT_INLINE);
-        editInlineLink.setOutputMarkupId(true);
-        scalarValueEditInlineContainer.add(editInlineLink);
 
-        propertyEditForm = new WebMarkupContainer("propertyEditForm");
-        //propertyEditForm = getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.PROPERTY_EDIT_FORM, scalarModel);
 
-        scalarValueEditInlineContainer.add(propertyEditForm);
-
-        final Label editInlineLinkLabel = new Label(ID_SCALAR_VALUE_EDIT_INLINE_LABEL, textFieldModel);
-        editInlineLink.add(editInlineLinkLabel);
-
-        propertyEditForm.setVisible(false);
+        //
+        // read-only/dialog edit
+        //
 
         final MarkupContainer scalarIfRegularFormGroup = createScalarIfRegularFormGroup();
 
-        scalarTypeContainer.add(scalarIfRegularFormGroup);
-
-        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(textField));
-        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            scalarName.setEscapeModelStrings(namedFacet.escaped());
-        }
 
         // find the links...
-
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+        final List<LinkAndLabel> entityActions =
+                EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
 
         addPositioningCssTo(scalarIfRegularFormGroup, entityActions);
 
-        if(getModel().isRequired()) {
-            final String label = scalarName.getDefaultModelObjectAsString();
-            if(!Strings.isNullOrEmpty(label)) {
-                scalarName.add(new CssClassAppender("mandatory"));
-            }
-        }
-
-        scalarIfRegularFormGroup.add(scalarName);
 
         final String describedAs = getModel().getDescribedAs();
         if(describedAs != null) {
             scalarIfRegularFormGroup.add(new AttributeModifier("title", Model.of(describedAs)));
         }
 
-        addFeedbackOnlyTo(scalarIfRegularFormGroup, getEditComponent());
-        addEditPropertyTo(scalarIfRegularFormGroup, editInlineLink, scalarValueEditInlineContainer, propertyEditForm);
+        addFeedbackOnlyTo(scalarIfRegularFormGroup, textField);
 
         // ... add entity links to panel (below and to right)
         addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);
 
+        scalarTypeContainer.add(scalarIfRegularFormGroup);
 
 
 
-        getOtherComponent().setVisibilityAllowed(false);
 
+        //
+        // inline edit
+        //
+
+        this.editInlineLink = new WebMarkupContainer(ID_SCALAR_VALUE_EDIT_INLINE);
+        editInlineLink.setOutputMarkupId(true);
+
+        final Label editInlineLinkLabel = new Label(ID_SCALAR_VALUE_EDIT_INLINE_LABEL, textFieldModel);
+        editInlineLink.add(editInlineLinkLabel);
+
+
+        scalarIfRegularFormGroup.add(editInlineLink);
+
+
+
+        //
+        // inline edit form
+        // (placeholder initially, create dynamically when needed - otherwise infinite loop because form references regular)
+        //
+
+        scalarIfRegularInlineEditForm = new WebMarkupContainer(ID_SCALAR_IF_REGULAR_INLINE_EDIT_FORM);
+        scalarIfRegularInlineEditForm.setOutputMarkupId(true);
+        scalarTypeContainer.add(scalarIfRegularInlineEditForm);
 
-        return scalarIfRegularFormGroup;
-    }
 
-    private String asString(final IModel<T> textFieldModel) {
-        return textFieldModel != null && textFieldModel.getObject() != null ? textFieldModel.getObject().toString() : null;
+
+
+
+        //
+        // configure dialog edit vs inline edit
+        //
+
+        addEditPropertyTo(scalarIfRegularFormGroup);
+        configureInlineEditCallback();
+
+        if (scalarModel.isEditable() && scalarModel.getEditStyle() == PropertyEditStyle.INLINE) {
+            textField.setVisibilityAllowed(false);
+        } else {
+            editInlineLink.setVisibilityAllowed(false);
+        }
+        scalarIfRegularInlineEditForm.setVisible(false);
+
+        return scalarIfRegularFormGroup;
     }
 
     protected abstract IModel<String> getScalarPanelType();
@@ -227,13 +220,25 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         Fragment textFieldFragment = createTextFieldFragment("scalarValueContainer");
         final String name = getModel().getName();
         textField.setLabel(Model.of(name));
-        
-        final FormGroup formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, this.textField);
 
+        final FormGroup formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, this.textField);
         textFieldFragment.add(this.textField);
         formGroup.add(textFieldFragment);
 
-        formGroup.add(this.scalarValueEditInlineContainer);
+        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(textField));
+        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
+        if (namedFacet != null) {
+            scalarName.setEscapeModelStrings(namedFacet.escaped());
+        }
+
+        if(getModel().isRequired()) {
+            final String label = scalarName.getDefaultModelObjectAsString();
+            if(!Strings.isNullOrEmpty(label)) {
+                scalarName.add(new CssClassAppender("mandatory"));
+            }
+        }
+
+        formGroup.add(scalarName);
 
         return formGroup;
     }
@@ -351,9 +356,8 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
     @Override
     protected void addFormComponentBehavior(Behavior behavior) {
 
-        // some behaviours can only be attached to one component
-        // so we check as to which will actually be visible.
-        getEditComponent().add(behavior);
+        textField.add(behavior);
+
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
index ba54edf..0c69b8f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
@@ -116,7 +116,7 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         
         addOrReplace(scalarIfRegularFormGroup);
         addFeedbackOnlyTo(scalarIfRegularFormGroup, fileUploadField);
-        addEditPropertyTo(scalarIfRegularFormGroup, null, null, null);
+        addEditPropertyTo(scalarIfRegularFormGroup);
 
         // ... add entity links to panel (below and to right)
         addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
index 1e27073..78e2a21 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
@@ -96,7 +96,7 @@ public class BooleanPanel extends ScalarPanelAbstract {
 
         addOrReplace(scalarIfRegularFormGroup);
         addFeedbackOnlyTo(scalarIfRegularFormGroup, checkBox);
-        addEditPropertyTo(scalarIfRegularFormGroup, null, null, null);
+        addEditPropertyTo(scalarIfRegularFormGroup);
 
         // ... add entity links to panel (below and to right)
         addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/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 114f3dd..3b5fa18 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
@@ -160,7 +160,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
         addOrReplace(scalarIfRegularFormGroup);
         addFeedbackOnlyTo(scalarIfRegularFormGroup, select2.component()); // this is a placeholder; when select2.component() is available, we use that instead
-        addEditPropertyTo(scalarIfRegularFormGroup, null, null, null);
+        addEditPropertyTo(scalarIfRegularFormGroup);
 
         // ... add entity links to panel (below and to right)
         addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/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 75d8ed7..7fb8a56 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
@@ -106,7 +106,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
         addPositioningCssTo(scalarIfRegularFormGroup, entityActions);
 
         addFeedbackOnlyTo(scalarIfRegularFormGroup, select2.component());
-        addEditPropertyTo(scalarIfRegularFormGroup, null, null, null);
+        addEditPropertyTo(scalarIfRegularFormGroup);
 
         // ... add entity links to panel (below and to right)
         addEntityActionLinksBelowAndRight(scalarIfRegularFormGroup, entityActions);

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
index b3465b3..a4c1881 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
@@ -869,4 +869,11 @@ tr.headers th form input {
 
 .select2-container-multi.input-sm {
     height: inherit;
-}
\ No newline at end of file
+}
+
+.scalarNameAndValueComponentType .inlineEditForm {
+    border: 2px solid;
+    padding: 10px;
+    margin-bottom: 20px
+}
+

http://git-wip-us.apache.org/repos/asf/isis/blob/16079738/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 6447940..762baa3 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
@@ -33,13 +33,16 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 
-import org.apache.isis.core.commons.ensure.Ensure;
+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.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
 import org.apache.isis.viewer.wicket.model.models.FormExecutor;
-import org.apache.isis.viewer.wicket.model.models.HasExecutingPanel;
+import org.apache.isis.viewer.wicket.model.models.HasFormExecutor;
+import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormExecutor;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
@@ -47,39 +50,40 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFee
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-
 /**
  * {@link PanelAbstract Panel} to capture the arguments for an action
  * invocation.
  */
-public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasExecutingPanel> extends PanelAbstract<T> {
-
-    protected final FormExecutor formExecutor;
+public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasFormExecutor> 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);
-        Ensure.ensureThatArg(model.getFormExecutor(), is(not(nullValue())));
-        this.formExecutor = model.getFormExecutor();
     }
 
-    public static abstract class FormAbstract<T extends IModel<?>> extends Form<ObjectAdapter>
+    public static abstract class FormAbstract<T extends IModel<ObjectAdapter> & HasFormExecutor> extends Form<ObjectAdapter>
             implements ScalarModelSubscriber {
 
         protected static final String ID_FEEDBACK = "feedback";
 
         protected final List<ScalarPanelAbstract> paramPanels = Lists.newArrayList();
-        protected final PromptFormPanelAbstract<?> parentPanel;
-
-        public FormAbstract(final String id, final PromptFormPanelAbstract<?> parentPanel, final IModel<ObjectAdapter> model) {
+        protected final Component parentPanel;
+        private final WicketViewerSettings settings;
+        private final FormExecutor formExecutor;
+
+        public FormAbstract(
+                final String id,
+                final Component parentPanel,
+                final WicketViewerSettings settings,
+                final T model) {
             super(id, model);
             this.parentPanel = parentPanel;
+            this.settings = settings;
+            this.formExecutor = model.getFormExecutor();
 
             setOutputMarkupId(true); // for ajax button
             addParameters();
@@ -95,19 +99,19 @@ public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasExecuting
         protected abstract void addParameters();
 
         protected AjaxButton addOkButton() {
-            AjaxButton okButton = parentPanel.getSettings().isUseIndicatorForFormSubmit()
+            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) {
-                            onSubmitOf(target, form, this, FormAbstract.this.parentPanel);
+                            onSubmitOf(target, form, this);
                         }
 
                         @Override
                         protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                             super.updateAjaxAttributes(attributes);
-                            if(parentPanel.getSettings().isPreventDoubleClickForFormSubmit()) {
+                            if(settings.isPreventDoubleClickForFormSubmit()) {
                                 PanelUtil.disableBeforeReenableOnComplete(attributes, this);
                             }
                         }
@@ -123,13 +127,13 @@ public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasExecuting
 
                         @Override
                         public void onSubmit(AjaxRequestTarget target, Form<?> form) {
-                            onSubmitOf(target, form, this, FormAbstract.this.parentPanel);
+                            onSubmitOf(target, form, this);
                         }
 
                         @Override
                         protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
                             super.updateAjaxAttributes(attributes);
-                            if(parentPanel.getSettings().isPreventDoubleClickForFormSubmit()) {
+                            if(settings.isPreventDoubleClickForFormSubmit()) {
                                 PanelUtil.disableBeforeReenableOnComplete(attributes, this);
                             }
                         }
@@ -171,9 +175,8 @@ public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasExecuting
         private void onSubmitOf(
                 final AjaxRequestTarget target,
                 final Form<?> form,
-                final AjaxButton ajaxButton,
-                final PromptFormPanelAbstract<?> parentPanel) {
-            boolean succeeded = parentPanel.formExecutor.executeAndProcessResults(target, form);
+                final AjaxButton ajaxButton) {
+            boolean succeeded = formExecutor.executeAndProcessResults(target, form);
             if(succeeded) {
                 // 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
@@ -189,7 +192,7 @@ public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasExecuting
 
                 // ensure any jGrowl errors are shown
                 // (normally would be flushed when traverse to next page).
-                String errorMessagesIfAny = JGrowlUtil.asJGrowlCalls(parentPanel.getAuthenticationSession().getMessageBroker());
+                String errorMessagesIfAny = JGrowlUtil.asJGrowlCalls(getAuthenticationSession().getMessageBroker());
                 builder.append(errorMessagesIfAny);
 
                 // append the JS to the response.
@@ -199,6 +202,14 @@ public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasExecuting
             }
         }
 
+        private AuthenticationSession getAuthenticationSession() {
+            return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+        }
+
+        protected IsisSessionFactory getIsisSessionFactory() {
+            return IsisContext.getSessionFactory();
+        }
+
 
         protected abstract Object newCompletedEvent(
                 final AjaxRequestTarget target,
@@ -211,7 +222,6 @@ public abstract class PromptFormPanelAbstract<T extends IModel<?> & HasExecuting
                 target.add((Component)provider);
             }
         }
-
     }
 
     //region > dependencies