From dff905227d388dc33eeed809c4155fa3f6257f93 Mon Sep 17 00:00:00 2001
From: sb <sb>
Date: Thu, 15 May 2008 16:29:24 +0000
Subject: [PATCH] Spent a lot of time trying to get Andrew's (very clever)
 automatic type resolution to widgets working, but without good success, so
 I've backed out a lot of code. It may still be the right approach, but will
 take much more work to get working.

---
 transforms01/adl2controllerclasses.xslt | 46 +++++++++++++++++++------
 transforms01/adl2views.xslt             | 38 +++++++++++++-------
 2 files changed, 61 insertions(+), 23 deletions(-)

diff --git a/transforms01/adl2controllerclasses.xslt b/transforms01/adl2controllerclasses.xslt
index ba79c6d..9941d90 100755
--- a/transforms01/adl2controllerclasses.xslt
+++ b/transforms01/adl2controllerclasses.xslt
@@ -9,8 +9,8 @@
     Transform ADL into (partial) controller classes
     
     $Author: sb $
-    $Revision: 1.25 $
-    $Date: 2008-05-13 10:36:46 $
+    $Revision: 1.26 $
+    $Date: 2008-05-15 16:29:24 $
   -->
 
   <!-- WARNING WARNING WARNING: Do NOT reformat this file! 
@@ -71,7 +71,7 @@
 //
 //  Controller for auto-generated forms for editing <xsl:value-of select="@name"/>s
 //  Automatically generated from application description using
-//  adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.25 $', 10)"/>
+//  adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.26 $', 10)"/>
 //
 //  This file is automatically generated; DO NOT EDIT IT.
 //
@@ -128,7 +128,7 @@ namespace <xsl:value-of select="$controllerns"/> {
 //
 //  Controller for auto-generated forms for editing <xsl:value-of select="@name"/>s
 //  Automatically generated from application description using
-//  adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.25 $', 10)"/>
+//  adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.26 $', 10)"/>
 //
 //  This file is automatically generated; DO NOT EDIT IT.
 //
@@ -148,6 +148,7 @@ using Castle.MonoRail.Framework.Helpers;
 using Cygnet.Exceptions;
 using Cygnet.Web.Helpers;
 using Cygnet.Web.Controllers;
+using Cygnet.Web.SmartControls;
 using NHibernate;
 using NHibernate.Expression;
 using Castle.MonoRail.Framework;
@@ -164,13 +165,38 @@ namespace <xsl:value-of select="$controllerns"/> {
 	///
 	/// DO NOT EDIT THIS FILE!
 	/// &lt;/summary&gt;
-	[	Layout("<xsl:value-of select="$layout-name"/>"), 
-		Rescue("<xsl:value-of select="$rescue-name"/>"), 
-		ControllerDetails("<xsl:value-of select="@name"/>", 
-		Area = "<xsl:value-of select="$area-name"/>")]
-	public partial class <xsl:value-of select="@name"/>Controller : <xsl:value-of select="concat( 'Abstract', /adl:application/@name, 'Controller')"/> {
+	[	
+	Layout("<xsl:value-of select="$layout-name"/>"), 
+	Rescue("<xsl:value-of select="$rescue-name"/>"), 
+	ControllerDetails("<xsl:value-of select="@name"/>",	Area = "<xsl:value-of select="$area-name"/>"),
+	Helper(typeof(<xsl:value-of select="concat( @name, 'FieldHelper')"/>), "<xsl:value-of select="concat( @name, 'FieldHelper')"/>")
+	]
+	public partial class <xsl:value-of select="concat( @name, 'Controller')"/>Controller : <xsl:value-of select="concat( 'Abstract', /adl:application/@name, 'Controller')"/> {
 
-      <xsl:if test="adl:form">
+		/* The SmartFormHelper stuff in generated controller classes does not yet work. There is some
+		 * hope that in future it will offer definite benefits and in the mean time it is doing no harm.
+		 * However if you are looking for bugs look elsewhere - this is not currently used */
+		protected class <xsl:value-of select="concat( @name, 'FieldHelper')"/> : SmartFormHelper {
+			public <xsl:value-of select="concat( @name, 'FieldHelper')"/>() {
+        <xsl:for-each select="descendant::adl:property[@type='entity']">
+          <xsl:variable name="entityname" select="@entity"/>
+          <xsl:variable name="entity" select="//adl:entity[@name=$entityname]"/>
+          <xsl:choose>
+            <xsl:when test="$entity/@foreign='true'">
+				/* Entity <xsl:value-of select="$entityname"/> is foreign..? */
+				<xsl:variable name="foreignkey" select="$entity/adl:key/adl:property[position()=1]/@name"/>
+				Register&lt;<xsl:value-of select="concat( $entityns, '.', $entityname)"/>&gt;( "", 
+					new TypeMenuControl&lt;<xsl:value-of select="concat( $entityns, '.', $entityname)"/>&gt;( "<xsl:value-of select="$foreignkey"/>","<xsl:value-of select="$foreignkey"/>"));
+			</xsl:when>
+            <xsl:otherwise>
+				Register&lt;<xsl:value-of select="concat( $entityns, '.', $entityname)"/>&gt;( "", EntityMenuControl&lt;<xsl:value-of select="concat( $entityns, '.', $entityname)"/>&gt;.Instance);
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:for-each>
+			}
+		}
+
+          <xsl:if test="adl:form">
         <!-- unless there's at least one form, we won't generate a 'store' method -->
 		/// &lt;summary&gt;
 		/// Store the record represented by the parameters passed in an HTTP service
diff --git a/transforms01/adl2views.xslt b/transforms01/adl2views.xslt
index 02de96c..71154d4 100755
--- a/transforms01/adl2views.xslt
+++ b/transforms01/adl2views.xslt
@@ -12,8 +12,8 @@
     Transform ADL into velocity view templates
     
     $Author: sb $
-    $Revision: 1.16 $
-    $Date: 2008-05-09 16:12:12 $
+    $Revision: 1.17 $
+    $Date: 2008-05-15 16:30:25 $
   -->
 	<!-- WARNING WARNING WARNING: Do NOT reformat this file! 
 		Whitespace (or lack of it) is significant! -->
@@ -104,7 +104,7 @@
         Auto generated Velocity maybe-delete form for <xsl:value-of select="@name"/>,
         generated from ADL.
 
-        Generated using adl2views.xslt <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>
+        Generated using adl2views.xslt <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>
       </xsl:comment>
       <xsl:call-template name="maybe-delete">
         <xsl:with-param name="entity" select="."/>
@@ -141,7 +141,7 @@
 						Auto generated Velocity maybe-delete form for <xsl:value-of select="@name"/>,
 						generated from ADL.
 
-						Generated using adl2views.xslt <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>
+						Generated using adl2views.xslt <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>
 					</xsl:comment>
 					<xsl:call-template name="install-scripts"/>
 				</head>
@@ -227,7 +227,7 @@
         Auto generated Velocity <xsl:value-of select="@name"/> form for <xsl:value-of select="ancestor::adl:entity/@name"/>,
         generated from ADL.
 
-        Generated using adl2views.xslt <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>
+        Generated using adl2views.xslt <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>
       </xsl:comment>
       #capturefor( title)
         #if ( $instance)
@@ -351,7 +351,7 @@
             Auto generated Velocity form for <xsl:value-of select="ancestor::adl:entity/@name"/>,
             generated from ADL.
 
-            Generated using adl2views.xsl <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>
+            Generated using adl2views.xsl <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>
           </xsl:comment>
           <xsl:call-template name="install-scripts"/>
           <script type='text/javascript' language='JavaScript1.2'>
@@ -482,7 +482,9 @@
 						</xsl:when>
 						<xsl:otherwise>
 							<!-- create a hidden widget for the natural primary key -->
+							#if ( $instance)
 							${FormHelper.HiddenField( "instance.<xsl:value-of select="$keyname"/>")}
+							#end
 						</xsl:otherwise>
 					</xsl:choose>
 				</xsl:for-each>
@@ -994,35 +996,45 @@
             <xsl:choose>
               <xsl:when test="@type='entity'">
                 <xsl:value-of select="concat('$instance.', @name, '.UserIdentifier')"/>
-                ${FormHelper.HiddenField( <xsl:value-of select="concat('$instance.', @name, '.KeyString')"/>)}
+				  #if ( $instance)
+					${FormHelper.HiddenField( "<xsl:value-of select="concat('instance.', @name, '.KeyString')"/>")}
+				  #end
               </xsl:when>
               <!-- TODO: if @type='list' or 'link', should generate Velocity to generate ul list
                 of UserIdentifiers
               -->
               <xsl:otherwise>
                 <xsl:value-of select="concat('$instance.', @name)"/>
-                ${FormHelper.HiddenField( <xsl:value-of select="concat('$instance.', @name)"/>)}
+				  #if ( $instance)
+					${FormHelper.HiddenField( "<xsl:value-of select="concat('instance.', @name)"/>")}
+				  #end
               </xsl:otherwise>
             </xsl:choose>
           </xsl:when>
           <xsl:when test="$permission='insert' or $permission='noedit'">
+			#if ( $instance)
             #if ($instance.<xsl:value-of select="@name"/>)
             <xsl:choose>
               <xsl:when test="@type='entity'">
                 <xsl:value-of select="concat('$instance.', @name, '.UserIdentifier')"/>
-                ${FormHelper.HiddenField( <xsl:value-of select="concat('$instance.', @name, '.KeyString')"/>)}
+                ${FormHelper.HiddenField( "<xsl:value-of select="concat('instance.', @name, '.KeyString')"/>")}
               </xsl:when>
               <xsl:otherwise>
                 <xsl:value-of select="concat('$instance.', @name)"/>
-                ${FormHelper.HiddenField( <xsl:value-of select="concat('$instance.', @name)"/>)}
+                ${FormHelper.HiddenField( "<xsl:value-of select="concat('instance.', @name)"/>")}
               </xsl:otherwise>
             </xsl:choose>
             #else
             <xsl:call-template name="widget">
               <xsl:with-param name="property" select="."/>
             </xsl:call-template>
-            #end
-          </xsl:when>
+			#end
+			#else
+			<xsl:call-template name="widget">
+			  <xsl:with-param name="property" select="."/>
+			</xsl:call-template>
+			#end
+		  </xsl:when>
           <!-- TODO: if $permission='insert', then you should get an editable widget if there 
           is no current value, else a 'not authorised' message -->
           <!-- TODO: if $permission='noedit', then you should get an editable widget if there 
@@ -1347,7 +1359,7 @@
             Auto generated Velocity list for <xsl:value-of select="ancestor::adl:entity/@name"/>,
             generated from ADL.
 
-            Generated using adl2listview.xsl <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>
+            Generated using adl2listview.xsl <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>
           </xsl:comment>
           <xsl:call-template name="install-scripts"/>
         </head>