[Seaside] Updating non Smallfaces component.

Timothy James Ziebart timothy at churchmilitant.org
Fri Aug 28 20:17:58 UTC 2009


Thank you Hernán and Juan.

I Implemented the GoogleMap as a subclass of SFObject and did as Juan 
suggested.  And you were right in that while the pane was updated 
correctly I still need the javascript to update the client  So I am one 
step away.  I am a not sure what is the best way to implement the 
script.  I have the updateButtonPressed message replace the panes.  How 
would evaluateJavacript and the updater get triggered?

Tim


Hernán Morales Durand wrote:
> Hi Tim
>
> 2009/8/27 Timothy James Ziebart <timothy at churchmilitant.org>:
>   
>> Hi Juan,  thanks for responding.
>> The google map is an object that implements a renderOn method.  It is the
>> GoogleMaps package by James Foster.
>>  http://seaside.gemstone.com/ss/GoogleMaps.
>> I have created WAComponent and non WAComponent versions.  I do not have a
>> SmallFace equivalent widget.   Maybe that is my question - is it possible to
>> build a SmallFaces widget that will take advantage of the features
>> available?
>>     
>
> Yes, it is possible. There are several ways, we could add to SF a
> wrapper with the necessary protocol to refresh some non SF component.
> The necessary protocol is:
>
> #name , #name:
> #styleId , #styleId:
> #refreshOn:
>
> Or you can make a GoogleMap's subclass with this protocol.
>
> Anyway, in your case and from what I've seen of the GoogleMap
> component, I think it works evaluating Javascript, I don't know if it
> will be enough just redrawing the component, maybe you need to
> evaluate javascript too. In SF, each control knows how to redraw
> itself with #refreshOn:. In the next SmallFaces version (available
> this weekend in SqS) we updated this message to take as argument a
> SUScript, to do such things.
>
> Cheers
>
> Hernán
>
>   
>> Tim
>>
>> Burella Juan M. wrote:
>>     
>>> Hi Tim,
>>>  Let me see if I've understood what are you doing. You need to:
>>>
>>> -Create (or modify?) a LBCGoogleMap when a ListBox changes
>>> -Render or update the LBCGoogleMap when a Button is clicked.
>>>
>>> You said LBCGoogleMap is not a WAComponent, what it is? If it's a
>>> SFObject, then you can add to your SearcherInterface sending as
>>> argument of #addSubpane: message, as already knows how to answer
>>> #name (remember, it must answer #name properly, that is, not the #name
>>> method in Object).
>>>
>>> Then you can have:
>>>
>>>       
>>>>> initialize
>>>>>           
>>> ....
>>>  self addSubpane: self map
>>> ...
>>>
>>>
>>>       
>>>>> map
>>>>>           
>>>  ^LBCGoogleMap new
>>>    name: 'mapDisplay';  " configure the mapDisplay's name"
>>>    setCenter: model coordinates zoom: model zoom;
>>>    addControl: GControl largeMapControl;
>>>    setUIToDefault;
>>>    yourself.
>>>
>>> If when the list changes, you have to re-create the mapDisplay, in the
>>> #regionSelectionChanged "callback" (the message sent when the list is
>>> #changed) you should replace it as follows:
>>>
>>>  oldMap := self paneNamed: 'mapDisplay'.
>>>  self replacePane: oldMap with: self map
>>>
>>> And to refresh properly the mapDisplay it should be rendered inside a
>>> tag with id equals to its styleId, like this:
>>>
>>> LBCGoogleMap >>renderContentOn: aRenderer
>>>
>>>           aRenderer div
>>>                    id: self styleId;
>>>                with: [ "render your component" ]
>>>
>>> and must answer #refreshOn: (please see #when:send:to:refresh: section
>>> in http://wiki.squeak.org/squeak/6093). You can implement it this way:
>>>
>>> refreshOn: aRenderer
>>>      "Support for the events"
>>>
>>>      self renderContentOn: aRenderer
>>>
>>>
>>> You will need to preserve the same #styleId, to do this simply send
>>> the message styleId: 'anyId' to the mapDisplay. Another way to solve
>>> this is adding a SFPanel which contains the mapDisplay and refresh it
>>> when the button is clicked.
>>>  Regards
>>> Juan M.
>>>
>>> On Thu, Aug 27, 2009 at 1:02 PM, Timothy James Ziebart
>>> <timothy at churchmilitant.org <mailto:timothy at churchmilitant.org>> wrote:
>>>
>>>    Hi All,
>>>
>>>    I have an object SearchInterface, a subclass of
>>>    WASmallFacesComposite.  On SearchInterface there are rendered a
>>>    number of SFListBoxes and SFButtons.  Included are three listboxes
>>>    that are cascaded and the control was created like this:
>>>
>>>    createRegionListBox
>>>      |pane panes list|
>>>        list := self session findCodeByParent: 'region'.
>>>        panes := OrderedCollection
>>>          with: ( self paneNamed: 'nhoodList')
>>>          with: ( self paneNamed: 'cityList').
>>>            pane := SFListBox new.
>>>      pane
>>>          name: 'regionList';
>>>          items: list;
>>>          lines: 5;
>>>          printSelector: #asString;
>>>          owner: self;
>>>          when: #changed:
>>>              send: #regionSelectionChanged:
>>>              to: self
>>>              refresh: panes.
>>>      ^pane
>>>
>>>    The listboxes work correctly.  What I need to do is have a
>>>    GoogleMap rendered on SearchInterfaces as well.  The map will not
>>>    be a WAComponent as I need to render it as new whenever the
>>>    listbox contents change.  But not before an Update button is
>>>    pressed.  Such as:
>>>
>>>    createUpdateButton
>>>
>>>      | pane panes |
>>>        panes := OrderedCollection with: (*self paneNamed: 'mapDisplay')*.
>>>      pane := SFButton new.
>>>      pane
>>>          label: 'Update Map';
>>>          name: 'updateButton';
>>>          when: #clicked
>>>              send: #updateButtonPressed
>>>              to: self
>>>              refresh: panes.
>>>      ^pane
>>>
>>>    The question is how do I create *mapDisplay*?  mapDisplay is
>>>    rendered like this everytime the update button is pressed.
>>>
>>>    map
>>>
>>>      ^LBCGoogleMap new
>>>          setCenter: model coordinates zoom: model zoom;
>>>          addControl: GControl largeMapControl;
>>>          setUIToDefault;
>>>          yourself.
>>>
>>>    Can I place it on a SmallFace component that will render as I
>>>    desire or do I replace it with non SmallFace components?  Thank
>>>    you for any assistance.
>>>
>>>    Tim
>>>    _______________________________________________
>>>    seaside mailing list
>>>    seaside at lists.squeakfoundation.org
>>>    <mailto:seaside at lists.squeakfoundation.org>
>>>    http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> seaside mailing list
>>> seaside at lists.squeakfoundation.org
>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>
>>>       
>> _______________________________________________
>> seaside mailing list
>> seaside at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>
>>     
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
>   



More information about the seaside mailing list