[Seaside] WACompound: creating Seaside Widgets

Ryan Simmons ryan.craig.simmons at gmail.com
Sat Nov 8 07:59:35 UTC 2008


Components

Descending from WAComponent produces a seaside component this can be
called from or embeded into another seaside component. If you embed a
component into another one you have to add it to the children array.
Advantages each component has its own state that is maintained, uses
#renderContentOn: which is very easy to understand.
Disadvantage must use the children collection to embed it

Tags

Descending from WACompound produces a seaside tag that can be embeded
into a seaside component this would be typically called like html
latLongInput on: #postition of: self.
Advantages can easly be added multiple times to a component. Has a
nice interface.
Disadvantages has no state, a new instance is created each time the
page is refreshed.

The added complexity on WADateInput comes from it trying to maintain
the standard tag interface allowing you to use #on:of, #callback:,
#value etc.
Tags use the same canvas to render themselves on as a component but
this is done in the #with: method not in #renderContentOn: you also
use canvas instead of html so for you you could have a #with: method
something like.
with: aBlock
     canvas text: 'latitiude: '.
     canvas textInput on: #latitude of: self value.
     canvas text: 'longitude: '.
     canvas textInput on: #longitude of: self value.
     canvas hiddenInput callback: [callbackBlock value: self value]

The hidden callback is used to answer the origional callback defined
on your component either through #on:of: or #callback:
To get a working tag you would probalbly want to redefine #value  to
something like
value
    ^value ifNil: [value := MyLongitudeLatitudeClass new]

This is not very bulletproof (you have to privide a callback when
rendering (#on:of: is just a shortcut for #value: #callback)) but
should work

On Sat, Nov 8, 2008 at 7:53 AM, Nick Ager <nick.ager at gmail.com> wrote:
> Hi,
>
> I want to build a widget for latitude, longitude entry ([N|S], lat
> degrees, lat minutes; [E|W] long degrees, long minutes). Looking at
> examples in Seaside it appears I have at least two ways of proceeding:
> 1) Derive from WAComponent eg WADateSelector
> 2) Derive from WACompound eg WADateInput
>
> In my application I'll be using the latitude and longitude entry in
> multiple places and like the idea of being able to use it directly as
> a brush on the canvas as:
>
> RenderContentOn: html
>  html latLongInput on: #position of: self
>
> However WADateInput appears to be significantly more complex than
> WADateSelector and I don't entirely understand what is going on. For
> example why in WADateInput>>addCallback is a hiddenInput added? I also
> guess I'd have to modify WARenderCanvas to add something like:
>
> WARenderCanvas>>latitudeLongitudeInput
>   ^ self brush: NALatitudeLongitudeInput new
>
> Any thoughts on the relative merits of the two approaches and why are
> there two Date input widgets?
>
> Thanks in advance
>
> Nick
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>


More information about the seaside mailing list