Here is a less intrusive patch.

-Igor
 
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] On Behalf 
> Of Jonathan 
> > Locke
> > Sent: Friday, July 29, 2005 10:03 PM
> > To: wicket-user@lists.sourceforge.net
> > Subject: Re: [Wicket-user] FieldLabel component
> > 
> > 
> > well, i don't know what's happened to the feedback interface stuff 
> > recently, but it was originally designed to be general enough to 
> > support what you're
> > trying to do.   seems like what you're writing is more or less a 
> > FormComponentFeedbackLabel.  and the link is simply implementing 
> > IFeedback (or it used to be... i'm not sure what's 
> changed... it looks 
> > unfamiliar now).
> > the form code then finds the associated feedback elements for each 
> > form component.
> > 
> > Igor Vaynberg wrote:
> > 
> > >I've seen the error border, it doesn't do what I want - in 
> our app a 
> > >red asterisk indicates a required field and field labels
> > with errors turn red.
> > >What I am looking for is a way to link the label to the
> > component not
> > >the other way around. My primary interest was the validator
> > stuff, the
> > >decoration of the label was a bonus.
> > >
> > >-Igor
> > >
> > >
> > >  
> > >
> > >>-----Original Message-----
> > >>From: [EMAIL PROTECTED]
> > >>[mailto:[EMAIL PROTECTED] On Behalf
> > Of Jonathan
> > >>Locke
> > >>Sent: Friday, July 29, 2005 8:14 PM
> > >>To: wicket-user@lists.sourceforge.net
> > >>Subject: Re: [Wicket-user] FieldLabel component
> > >>
> > >>
> > >>if you just want to show an error indicator like a red
> > asterisk, see
> > >>FormComponentFeedbackBorder.
> > >>i personally don't like the idea of changing field label
> > contents on
> > >>users.  so instead, i've emphasized FeedbackPanel and IFeedback.
> > >>however, you should be able to implement what you're 
> talking about 
> > >>though by implementing IFeedback on a subclass of Label.
> > >>
> > >>Igor Vaynberg wrote:
> > >>
> > >>    
> > >>
> > >>>Hi Guys,
> > >>>
> > >>>Ive been working on forms a lot lately, and what ive been
> > >>>      
> > >>>
> > >>missing from
> > >>    
> > >>
> > >>>tapestry is a fieldlabel component. Basically a fieldlabel
> > >>>      
> > >>>
> > >>is a label
> > >>    
> > >>
> > >>>that is linked to a form component.
> > >>>
> > >>>This allows to do cool things like:
> > >>>
> > >>>1) FieldLabel can change its apperance based on the form 
> component
> > >>>
> > >>>TextField tf=new RequiredTextField(...) FieldLabel lb=new 
> > >>>FieldLabel("label1","First Name", tf) {
> > >>> public void initialize() {
> > >>>         add(new AttributeModifier("style", true, new
> > >>>Model("color:red;")) {
> > >>>                 public boolean isEnabled()
> > >>>                 {
> > >>>                         return !getFieldComponent().isValid();
> > >>>                 }
> > >>>         });
> > >>> }
> > >>>};
> > >>>
> > >>>This will create a field label that will turn red when the
> > >>>      
> > >>>
> > >>linked form
> > >>    
> > >>
> > >>>component has an error.
> > >>>
> > >>>Another good use is to prepand an asterisk to the
> > >>>      
> > >>>
> > >>fieldlabel's label if
> > >>    
> > >>
> > >>>the linked form component has a requiredvalidator added.
> > >>>
> > >>>2) FieldLabel's label can participate in validator messages
> > >>>
> > >>>With this patch it is possible to create generic error
> > >>>      
> > >>>
> > >>messages of form :
> > >>    
> > >>
> > >>>"'${label}' is required" or "'${label}' contains an invalid
> > >>>      
> > >>>
> > >>email address"
> > >>    
> > >>
> > >>>I am looking for feedback and ideas on how to make this
> > >>>      
> > >>>
> > >>better before I
> > >>    
> > >>
> > >>>submit this as a patch.
> > >>>
> > >>>Thank you!
> > >>>Igor
> > >>> 
> > >>>
> > >>>-------------------------------------------------------------
> > >>>      
> > >>>
> > >>----------
> > >>    
> > >>
> > >>>-
> > >>>
> > >>>Index: wicket/markup/html/form/FormComponent.java
> > 
> >>>===================================================================
> > >>>RCS file: 
> > >>>/cvsroot/wicket/wicket/src/java/wicket/markup/html/form/FormC
> > >>>      
> > >>>
> > >>omponent.j
> > >>    
> > >>
> > >>>ava,v
> > >>>retrieving revision 1.43
> > >>>diff -u -r1.43 FormComponent.java
> > >>>--- wicket/markup/html/form/FormComponent.java   28 Jul 
> > >>>      
> > >>>
> > >>2005 11:56:51 -0000       1.43
> > >>    
> > >>
> > >>>+++ wicket/markup/html/form/FormComponent.java   30 Jul 
> > >>>      
> > >>>
> > >>2005 02:32:19 -0000
> > >>    
> > >>
> > >>>@@ -30,6 +30,7 @@
> > >>>import wicket.model.IModel;
> > >>>import wicket.util.lang.Classes;
> > >>>import wicket.util.string.StringList;
> > >>>+import wicket.version.undo.Change;
> > >>>
> > >>>/**
> > >>> * An html form component knows how to validate itself. 
> Validators 
> > >>>that @@ -71,6 +72,9 @@
> > >>> /** The validator or validator list for this component. */
> > >>> private IValidator validator = IValidator.NULL;
> > >>>
> > >>>+        /** The field label for this component */
> > >>>+        private FieldLabel fieldLabel;
> > >>>+        
> > >>> /**
> > >>>  * Typesafe interface to code that is called when
> > >>>      
> > >>>
> > >>visiting a form component
> > >>    
> > >>
> > >>>  *
> > >>>@@ -575,4 +579,24 @@
> > >>> {
> > >>>         validator.validate(this);
> > >>> }
> > >>>+        
> > >>>+        protected FormComponent 
> setFieldLabel(FieldLabel label) {
> > >>>+                if (fieldLabel!=null) {
> > >>>+                        
> > >>>+                        addStateChange(new Change() {
> > >>>+                                private final FieldLabel
> > >>>+oldFieldLabel=FormComponent.this.fieldLabel;
> > >>>+
> > >>>+                                public void undo()
> > >>>+                                {
> > >>>+                                        
> > >>>      
> > >>>
> > >>FormComponent.this.fieldLabel=oldFieldLabel;
> > >>    
> > >>
> > >>>+                                }
> > >>>+                        });
> > >>>+                }
> > >>>+                this.fieldLabel=label;
> > >>>+                return this;
> > >>>+        }
> > >>>+        
> > >>>+        public FieldLabel getFieldLabel() {
> > >>>+                return fieldLabel;
> > >>>+        }
> > >>>}
> > >>>\ No newline at end of file
> > >>>Index: wicket/markup/html/form/validation/AbstractValidator.java
> > 
> >>>===================================================================
> > >>>RCS file: 
> > >>>/cvsroot/wicket/wicket/src/java/wicket/markup/html/form/valid
> > >>>      
> > >>>
> > >>ation/Abst
> > >>    
> > >>
> > >>>ractValidator.java,v
> > >>>retrieving revision 1.31
> > >>>diff -u -r1.31 AbstractValidator.java
> > >>>---
> > >>>      
> > >>>
> > >>wicket/markup/html/form/validation/AbstractValidator.java 
> > >>21 Jul 2005 10:46:36 -0000        1.31
> > >>    
> > >>
> > >>>+++ 
> > >>>      
> > >>>
> > >>wicket/markup/html/form/validation/AbstractValidator.java 
> > >>30 Jul 2005 02:32:19 -0000
> > >>    
> > >>
> > >>>@@ -21,6 +21,7 @@
> > >>>import java.util.Map;
> > >>>
> > >>>import wicket.Localizer;
> > >>>+import wicket.markup.html.form.FieldLabel;
> > >>>import wicket.markup.html.form.FormComponent;
> > >>>import wicket.model.IModel;
> > >>>import wicket.model.Model;
> > >>>@@ -139,6 +140,21 @@
> > >>>         final Map resourceModel = new HashMap(4);
> > >>>         resourceModel.put("input", formComponent.getInput());
> > >>>         resourceModel.put("name", formComponent.getId());
> > >>>+                
> > >>>+                // try to retrieve the label from field label,
> > >>>      
> > >>>
> > >>default to empty string
> > >>    
> > >>
> > >>>+                String labelValue = "";
> > >>>+                FieldLabel label = 
> formComponent.getFieldLabel();
> > >>>+                if (label != null)
> > >>>+                {
> > >>>+                        Object modelObject = 
> label.getModelObject();
> > >>>+                        if (modelObject != null)
> > >>>+                        {
> > >>>+                                labelValue = 
> modelObject.toString();
> > >>>+                        }
> > >>>+                }
> > >>>+                resourceModel.put("label", labelValue);
> > >>>+                
> > >>>+                
> > >>>         return resourceModel;
> > >>> }
> > >>>}
> > >>>Index: wicket/markup/html/form/FieldLabel.java
> > 
> >>>===================================================================
> > >>>RCS file: wicket/markup/html/form/FieldLabel.java
> > >>>diff -N wicket/markup/html/form/FieldLabel.java
> > >>>--- /dev/null    1 Jan 1970 00:00:00 -0000
> > >>>+++ wicket/markup/html/form/FieldLabel.java      1 Jan 1970 
> > >>>      
> > >>>
> > >>00:00:00 -0000
> > >>    
> > >>
> > >>>@@ -0,0 +1,55 @@
> > >>>+package wicket.markup.html.form;
> > >>>+
> > >>>+import wicket.AttributeModifier;
> > >>>+import wicket.Component;
> > >>>+import wicket.markup.html.WebMarkupContainer;
> > >>>+import wicket.markup.html.basic.Label; import 
> > >>>+wicket.markup.html.panel.Panel; import
> > wicket.model.IModel; import
> > >>>+wicket.model.Model; import wicket.model.PropertyModel;
> > >>>+
> > >>>+public class FieldLabel extends Label {
> > >>>+        protected FormComponent fc;
> > >>>+        
> > >>>+        public FieldLabel(String id, FormComponent 
> formComponent)
> > >>>+        {
> > >>>+                super(id);
> > >>>+                internalInitialize(formComponent);
> > >>>+        }
> > >>>+
> > >>>+        public FieldLabel(String id, String string,
> > >>>      
> > >>>
> > >>FormComponent formComponent)
> > >>    
> > >>
> > >>>+        {
> > >>>+                super(id, string);
> > >>>+                internalInitialize(formComponent);
> > >>>+        }
> > >>>+        
> > >>>+        public FieldLabel(String id, IModel model,
> > >>>      
> > >>>
> > >>FormComponent formComponent)
> > >>    
> > >>
> > >>>+        {
> > >>>+                super(id, model);
> > >>>+                internalInitialize(formComponent);
> > >>>+        }
> > >>>+
> > >>>+        private void internalInitialize(FormComponent 
> formComponent)
> > >>>+        {
> > >>>+                if (fc==null) throw new
> > >>>      
> > >>>
> > >>IllegalArgumentException("formComponent cannot be null");
> > >>    
> > >>
> > >>>+                this.fc=fc;
> > >>>+
> > >>>+                fc.setFieldLabel(this);
> > >>>+                setRenderBodyOnly(true);
> > >>>+                
> > >>>+                initialize();
> > >>>+        }
> > >>>+
> > >>>+        public final FormComponent getFormComponent() {
> > >>>+                return fc;
> > >>>+        }
> > >>>+        
> > >>>+        public void initialize() {
> > >>>+                
> > >>>+        }
> > >>>+        
> > >>>+
> > >>>+        
> > >>>+}
> > >>> 
> > >>>
> > >>>      
> > >>>
> > >>-------------------------------------------------------
> > >>SF.Net email is sponsored by: Discover Easy Linux Migration
> > Strategies
> > >>from IBM. Find simple to follow Roadmaps, straightforward 
> articles, 
> > >>informative Webcasts and more! Get everything you need to 
> get up to 
> > >>speed, fast.
> > >>http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
> > >>_______________________________________________
> > >>Wicket-user mailing list
> > >>Wicket-user@lists.sourceforge.net
> > >>https://lists.sourceforge.net/lists/listinfo/wicket-user
> > >>
> > >>
> > >>
> > >>    
> > >>
> > >
> > >
> > >
> > >
> > >-------------------------------------------------------
> > >SF.Net email is sponsored by: Discover Easy Linux Migration
> > Strategies
> > >from IBM. Find simple to follow Roadmaps, straightforward 
> articles, 
> > >informative Webcasts and more! Get everything you need to 
> get up to 
> > >speed, fast. 
> http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
> > >_______________________________________________
> > >Wicket-user mailing list
> > >Wicket-user@lists.sourceforge.net
> > >https://lists.sourceforge.net/lists/listinfo/wicket-user
> > >
> > >  
> > >
> > 
> > 
> > -------------------------------------------------------
> > SF.Net email is sponsored by: Discover Easy Linux Migration 
> Strategies 
> > from IBM. Find simple to follow Roadmaps, straightforward articles, 
> > informative Webcasts and more! Get everything you need to get up to 
> > speed, fast.
> > http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
> > _______________________________________________
> > Wicket-user mailing list
> > Wicket-user@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/wicket-user
> > 
> > 
> > 
> 
> 
> 
> 
> -------------------------------------------------------
> SF.Net email is sponsored by: Discover Easy Linux Migration 
> Strategies from IBM. Find simple to follow Roadmaps, 
> straightforward articles, informative Webcasts and more! Get 
> everything you need to get up to speed, fast. 
> http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
> _______________________________________________
> Wicket-user mailing list
> Wicket-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wicket-user
> 
> 
> 
Index: FormComponent.java
===================================================================
RCS file: 
/cvsroot/wicket/wicket/src/java/wicket/markup/html/form/FormComponent.java,v
retrieving revision 1.43
diff -u -r1.43 FormComponent.java
--- FormComponent.java  28 Jul 2005 11:56:51 -0000      1.43
+++ FormComponent.java  30 Jul 2005 06:11:17 -0000
@@ -22,6 +22,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import wicket.Component;
 import wicket.WicketRuntimeException;
 import wicket.markup.ComponentTag;
 import wicket.markup.html.WebMarkupContainer;
@@ -30,6 +31,7 @@
 import wicket.model.IModel;
 import wicket.util.lang.Classes;
 import wicket.util.string.StringList;
+import wicket.version.undo.Change;
 
 /**
  * An html form component knows how to validate itself. Validators that
@@ -71,6 +73,9 @@
        /** The validator or validator list for this component. */
        private IValidator validator = IValidator.NULL;
 
+       /** The field label for this component */
+       private Component fieldLabel;
+       
        /**
         * Typesafe interface to code that is called when visiting a form 
component
         * 
@@ -575,4 +580,24 @@
        {
                validator.validate(this);
        }
+       
+       public FormComponent setFieldLabel(Component label) {
+               if (fieldLabel!=null) {
+                       
+                       addStateChange(new Change() {
+                               private final Component 
oldFieldLabel=FormComponent.this.fieldLabel;
+
+                               public void undo()
+                               {
+                                       
FormComponent.this.fieldLabel=oldFieldLabel;
+                               }
+                       });
+               }
+               this.fieldLabel=label;
+               return this;
+       }
+       
+       public Component getFieldLabel() {
+               return fieldLabel;
+       }
 }
\ No newline at end of file
Index: validation/AbstractValidator.java
===================================================================
RCS file: 
/cvsroot/wicket/wicket/src/java/wicket/markup/html/form/validation/AbstractValidator.java,v
retrieving revision 1.31
diff -u -r1.31 AbstractValidator.java
--- validation/AbstractValidator.java   21 Jul 2005 10:46:36 -0000      1.31
+++ validation/AbstractValidator.java   30 Jul 2005 06:11:17 -0000
@@ -20,6 +20,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import wicket.Component;
 import wicket.Localizer;
 import wicket.markup.html.form.FormComponent;
 import wicket.model.IModel;
@@ -139,6 +140,21 @@
                final Map resourceModel = new HashMap(4);
                resourceModel.put("input", formComponent.getInput());
                resourceModel.put("name", formComponent.getId());
+               
+               // try to retrieve the label from field label, default to empty 
string
+               String labelValue = "";
+               Component label = formComponent.getFieldLabel();
+               if (label != null)
+               {
+                       Object modelObject = label.getModelObject();
+                       if (modelObject != null)
+                       {
+                               labelValue = modelObject.toString();
+                       }
+               }
+               resourceModel.put("label", labelValue);
+               
+               
                return resourceModel;
        }
 }

Reply via email to