Immediate validation of editor field

155 views
Skip to first unread message

RickL

unread,
Oct 7, 2012, 4:38:05 PM10/7/12
to google-we...@googlegroups.com
I have a problem.  I want to force the editor framework to immediately validate a field when the user changes its value.  The most obvious and simple case is a numeric field.  If the user enters an invalid number, I want the error to be reported as soon as the user leaves the field.  I don't want to wait for the user to initiate a save to detect that error (and other errors like it that don't need to go to the server).

This seems like it should be very easy, but I sure can't seem to find a clean solution.

Thanks


RickL

unread,
Oct 8, 2012, 8:40:29 AM10/8/12
to google-we...@googlegroups.com
I found the solution.  I was using an editor decorator to wrap the number validating editor.  In this case it appears that you must forward the setDelegate from the editor decorator to its sub-editor as in:

  @Override
  public void setDelegate(EditorDelegate<T> delegate) {
    if (editor instanceof HasEditorDelegate) {
      ((HasEditorDelegate<T>) editor).setDelegate(delegate);
    }
  }

It works now.

RickL

unread,
Oct 8, 2012, 8:44:28 AM10/8/12
to google-we...@googlegroups.com
Actually, that only fixed part of my problem: the fact that the editor was not reporting errors at all (because it was not getting a delegate).  I still do not have a good solution to the original question.

Sorry about the confusion.

RickL

unread,
Oct 8, 2012, 9:56:57 AM10/8/12
to google-we...@googlegroups.com
There is a workaround, but it is not very elegant.  You can do a driver.flush() in a change handler for the field you want to validate on-the-fly which, of course, re-validates (i.e. calls getValue()) on all fields.  That seems to me a bit like swatting a fly with a sledgehammer.

It would seem better to have, perhaps, another recordError method signature like:

void recordError(String message, Object value, Object userData, boolean immediate);

When immediate is true, the driver would immediately post the error to the nearest super-Editor that implements the HasEditorErrors interface, rather than waiting for a driver flush().

Thoughts?

Thomas Broyer

unread,
Oct 8, 2012, 10:33:33 AM10/8/12
to google-we...@googlegroups.com


On Monday, October 8, 2012 3:56:57 PM UTC+2, RickL wrote:
There is a workaround, but it is not very elegant.  You can do a driver.flush() in a change handler for the field you want to validate on-the-fly which, of course, re-validates (i.e. calls getValue()) on all fields.  That seems to me a bit like swatting a fly with a sledgehammer.

It would seem better to have, perhaps, another recordError method signature like:

void recordError(String message, Object value, Object userData, boolean immediate);

When immediate is true, the driver would immediately post the error to the nearest super-Editor that implements the HasEditorErrors interface, rather than waiting for a driver flush().

Thoughts?


Don't try to abuse the Editor framework for use-cases it's not meant to fulfill. What you actually want is some widget that validate the field "as soon as possible" and displays the error if any, and integrate with the Editor framework so that any detected error will also be reported to the EditorDelegate.
Either that or flush() at each change.

RickL

unread,
Oct 9, 2012, 11:00:44 PM10/9/12
to google-we...@googlegroups.com
Thomas,

Thank you, as always, for your thoughtful reply.  I wonder how you get any real work done with your dedication to this forum.  I suspect you get a bit less sleep than me.  

The flush technique works fine.  I even managed to craft a little editor visitor that passes a flush command to editors that want it (those that implement HasFlushCommand) so that they can request a driver flush (on a value change) without knowing anything about the driver.  With that, I can have generic UiBinder-compatible validating editors that are capable of displaying immediate errors, like:

<e:ValueBoxEditorDecorator ui:field="priorityEditor" >
  <e:valuebox>
    <v:ValidatingIntegerBox ui:field="priorityValidator" />  <!-- so that the app can set properties (min, max, immediate or whatever) -->
  </e:valuebox>
</e:ValueBoxEditorDecorator>

I don't think it strays too much from the spirit of the editor framework.

Thanks again.
Reply all
Reply to author
Forward
0 new messages