Hello Ian,
> Given HasData, it might be possible to write some really generic
> implementations of Editor and Viewer that wrap an instance of HasData
> to make it easier for developers to come up with an instance of Editor
> to bind to, but I'm a little squirrelly about binding to arbitrary
> widgets.
I think requiring the HasData interface isn't a bad thing, but this
might frustrate developers in the short term as standard GWT widgets
don't implement the HasData interface.
> Thoughts?
Overall it looks good. I like the new API idea.
P.S. Are you going to create a new Google Code project? It'd be easier
to track issues and contribute code. Thanks!
P.P.S. Nice to have a fellow Torontonian here :)
Regards,
--
Arthur Kalmenson
On Wed, Oct 15, 2008 at 5:16 PM, Ian Petersen <[EMAIL PROTECTED]> wrote:
>
> Hi Ray,
>
> On Wed, Oct 8, 2008 at 6:24 PM, Ray Cromwell <[EMAIL PROTECTED]> wrote:
> > Something struck me about the way you are approaching things, that
> > is, letting the BoundField's return widgets. With the new HasData
> > stuff being proposed, why not let the programmer create the widget,
> > and bind the field to an already created widget? (if the widgets
> > export an interface like HasData which permits wiring them up.) That
> > seems to provide more flexibility, since people tend to design the
> > look and layout of the widgets and wire up the logic separately.
> >
> > Couldn't the API look more like this?
> >
> > PersonForm form = GWT.create(PersonForm.class);
> >
> > form.getFirstName().bind(existingWidget, personInstance);
> > form.getLastName().bind(anotherExistingWidget, personInstance);
> >
> > or perhaps
> >
> > form.bindInstance(personInstance).
> > getFirstName().bind(widget1).
> > getLastName().bind(widget2);
> >
> > I realize there may be issues making this work with arbitrary
> > subclasses of Widget, but let's leave that aside for a moment and
> > assume the proper support can be added to the widgets. This would
> > also seem to work alot better with the proposed UI Templating system
> > being proposed.
>
> Sorry for the long delay--it's taking a while to come back to the real
> world after a weekend that included about 45 hours in a car and a fair
> amount of turkey.
>
> Anyway, I've thought some more about your suggestion here (that
> widgets be passed into the binding framework, rather than defining
> them on the form), and I think I agree with you. Given that the same
> value could be displayed/edited in more than one kind of widget, the
> choice of _which_ widget seems like a presentation issue while the
> business logic in the binding itself seems like a model issue. I
> think that's enough argument for me that you're right. (As a bonus,
> your suggestion also cleans up the smell of defining constructor
> arguments in string form on the @UseEditor and @UseViewer
> annotations.)
>
> I do disagree with the particular APIs you suggested, though. To me,
> a Form is to a class as a BoundForm is to an instance. I think it
> should be possible to use the same form in multiple places at once,
> and each "place" should be relatively independent, sharing only
> definitions and not "instances". I'd therefore suggest something like
> the following:
>
> BeanForm form = GWT.create(BeanForm.class);
>
> BoundForm<BeanType> boundForm = form.bindTo(beanInstance);
>
> panel.add(boundForm.bind(form.getFieldOne(), new
> TextBoxEditor(CurrencyConverter.INSTANCE));
> panel.add(boundForm.bind(form.getFieldTwo(), new
> LabelViewer(DefaultToString.INSTANCE));
> panel.add(boundForm.bind(form.getFieldThree(), new CreditCardEditor());
>
> The above code could be shortened if you assume it was in the context
> of a DataComposite<BeanType> instead of in some random UI code:
>
> public class BeanComposite extends DataComposite<BeanType> {
>
> private static final BeanForm form = GWT.create(BeanForm.class);
>
> // in retrospect, I really like this code--there's hardly any
> // generic type cheese in the _use_ of the binding library
> // anywhere except the definition of the form itself.
> public BeanComposite() {
> super(form);
>
> FlowPanel panel = new FlowPanel();
>
> panel.add(bind(form.getFieldOne(), new
> TextBoxEditor(CurrencyConverter.INSTANCE)));
> panel.add(bind(form.getFieldTwo(), new
> LabelViewer(DefaultToString.INSTANCE)));
> panel.add(bind(form.getFieldThree(), new CreditCardEditor()));
>
> initWidget(panel);
> }
> }
>
> // in random UI code
> BeanComposite bc = new BeanComposite();
>
> RootWidget.get().add(bc);
>
> bc.setBean(new BeanType());
>
> Regarding implementing widgets with "proper support" for a databinding
> library like mine, I think that's a bad idea. At the moment, I still
> like the declaration of intent implied by the Viewer and Editor
> interfaces, so I'd expect BoundForm.bind() to be declared something
> like this:
>
> public interface BoundForm<B> {
>
> /**
> * Binds editor to field and returns editor. <code>P</code> is
> field's value type.
> */
> <P, W extends Widget & Editor<P>> W bind(Field<B, P> field, W editor);
>
> /**
> * Binds viewer to formula and returns viewer. <code>P</code> is
> formula's value type.
> */
> <P, W extends Widget & Viewer<P>> W bind(Formula<B, P> formula, W viewer);
> }
>
> Given HasData, it might be possible to write some really generic
> implementations of Editor and Viewer that wrap an instance of HasData
> to make it easier for developers to come up with an instance of Editor
> to bind to, but I'm a little squirrelly about binding to arbitrary
> widgets.
>
> Thoughts?
>
> Ian
>
> PS I intend to look at the XForms spec as soon as I have some
> time--I'm not ignoring your exhortations. :)
>
> >
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---