You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Jeremy Quinn <je...@media.demon.co.uk> on 2003/11/27 14:42:37 UTC
[woody] using on-activate handlers
Hi All
I am having problems using on-activate handlers.
I have them attached to several buttons, but they do not really help.
I have one attached to a <wd:row-action id="delete"
action-command="delete"/>, but it appears to get called after the
delete, so I do not appear to be able to find out which row was
deleted, so I cannot remove that object from the persistence layer.
(the returned index is '-1').
I have one attached to a <wd:row-action id="down"
action-command="move-down"/> and a <wd:row-action id="up"
action-command="move-up"> button, but my handler gets called AFTER
woody has moved them, complicating the issue of replicating the move in
the BizData (the binding does not replicate the row order, so moves
have no effect on BizData, if it is a Bean.)
ie. calling event.getSourceWidget ().getParent ().getId () gives you
the index of the row AFTER the move has already taken place.
Furthermore, because the Up button incorrectly shows on the top row,
and the down button incorrectly shows on the bottom row, if the User
clicks them, the row cannot be moved, so you get the 'correct' index of
those rows. =:-0
IMHO, this is making things a lot more difficult than they really need
to be .....
Would it break Woody terribly if on-activate handlers could be called
BEFORE the row-action's action-command?
Thanks for any suggestions.
regards Jeremy
Re: [woody] using on-activate handlers
Posted by Jeremy Quinn <je...@media.demon.co.uk>.
On 28 Nov 2003, at 13:12, Jeremy Quinn wrote:
>
> On 27 Nov 2003, at 23:41, Sylvain Wallez wrote:
>
>> Jeremy Quinn wrote:
>
<snip/>
>
> As an aside, I attempted last night to begin to implement some custom
> event-handlers (to implement the above) in JavaScript. My handlers
> obviously need access to the Bean being edited, to apply the
> workarounds.
>
> I found, as soon as I passed my Bean via showForm (screen, {bean:
> bean}) as viewData to my event handlers, I started getting some very
> strange exceptions. I have highlighted the issue in a post to Cocoon
> Users (not available in the Archives yet). The subject is: 'Re:
> deleting repeater-rows'. Unfortunately this problem appears to make
> all of the above pretty academic ;)
My apologies .... this issue is erroneous .... I found the fault, it
was mine.
regards Jeremy
Re: [woody] using on-activate handlers
Posted by Jeremy Quinn <je...@media.demon.co.uk>.
On 27 Nov 2003, at 23:41, Sylvain Wallez wrote:
> Jeremy Quinn wrote:
Thanks for your response Sylvain.
>> Hi All
>>
>> I am having problems using on-activate handlers.
>>
>> I have them attached to several buttons, but they do not really help.
>>
>> I have one attached to a <wd:row-action id="delete"
>> action-command="delete"/>, but it appears to get called after the
>> delete, so I do not appear to be able to find out which row was
>> deleted, so I cannot remove that object from the persistence layer.
>> (the returned index is '-1').
>
> Yep. Row actions are particular actions that have a built-in event
> handler that is always called first. For this kind of application,
> you'll need to use a "normal" action and remove the repeater row by
> yourself as part of the event handler (a few lines of code, actually).
It worries me that I have to muck around with the internals of Woody to
make this work.
Would I not be relying on the particular way this aspect of Woody is
implemented?
What if that implementation changes in some way? It does not feel very
robust.
>> I have one attached to a <wd:row-action id="down"
>> action-command="move-down"/> and a <wd:row-action id="up"
>> action-command="move-up"> button, but my handler gets called AFTER
>> woody has moved them, complicating the issue of replicating the move
>> in the BizData (the binding does not replicate the row order, so
>> moves have no effect on BizData, if it is a Bean.)
>>
>> ie. calling event.getSourceWidget ().getParent ().getId () gives you
>> the index of the row AFTER the move has already taken place.
>
> Same problem here...
What did you think of Ricardo's suggestion, the ability to specify
whether the custom action is called before or after the built-in
action?
>> Furthermore, because the Up button incorrectly shows on the top row,
>> and the down button incorrectly shows on the bottom row, if the User
>> clicks them, the row cannot be moved, so you get the 'correct' index
>> of those rows. =:-0
>
>
> Sorry, I lost you here...
I can see from the code in
RowAction.Move[Up|Down]Action.generateSaxFragment that the code
attempts to ensure that it does not place an Up Button on the top row,
or a Down Button on the bottom row.
I was referring to the fact that this does not work in my circumstances
(reason unknown, is it because I am using Beans?) because I do indeed
see an Up Button on the top row and a Down Button on the bottom row.
Because the Binding code makes (in my case) the wrong assumption about
the importance of ordering in my Bean's Collection, and fails to
maintain that ordering when it copies updated row-data back to my
Collection, I have to work behind Woody's back to replicate the move
action on my Collection, by hand. (This in itself feels very strange,
if you have a move action, why ignore the new order?).
Because I have to replicate the same move, and I need to know which row
was moved, and my handler is called after the move has already
happened; when I ask for the index of the moved row, I get the index of
the row's destination, not the index of the starting point.
Because the the Up/Down Buttons are inadvertently shown on the Top and
Bottom rows, handling those buttons becomes a special case ..... the
index I get back from them will represent the starting point, not the
destination, because Woody obviously could not move them.
This appears a bit fragile, if the underlying implementation changes,
my work-arounds will break.
>> IMHO, this is making things a lot more difficult than they really
>> need to be .....
>>
>> Would it break Woody terribly if on-activate handlers could be called
>> BEFORE the row-action's action-command?
>
>
> You're the first one to report this kind of problems.
Sorry !!!
But I do believe I have a valid use-case ..... if I am finding these
problems now, others will find them too ...
I only want to to see Woody as widely accepted, and useful as possible,
please do not take what I say as criticisms.
> Two solutions come to mind:
> - change the order as you suggest it. It seems to make sense at first,
> but won't someone come tomorrow with good reasons for doing it the
> other way?
Allow the call-order to be specified with a new attribute, with 'after'
being the default?
> - use a regular action and "manually" use the row-action's event
> listener using its java class name, i.e.
> <on-action>
> <... your event listener here ...>
> <java class="o.a.c...DeleteRowListener"/>
> </on-action>
BTW. I cannot find o.a.c...DeleteRowListener, were you referring to a
built-in class?
> What do you think?
Interesting ....
In the case of needing special Application-Specific handling of
deletion, because I am using a particular back-end that has special
requirements, it is *not* too much to expect me to provide that special
treatment myself ;)
But in the case of Move-Up, Move-Down buttons, it seems I have to give
them special treatment, because I am using a List of Beans, instead of
an XML nodeset, and this seems wrong. If you have move buttons, the
implication is that the order is important ;)
Should Woody behave so differently depending on whether your model is
XML or Bean?
So, I think there are two issues here .....
1) It would make certain use-cases easier to handle if we could specify
on built-in action buttons that the custom-action should happen
'before' or 'after' the built-in action.
2) It does not make sense to have built-in Move Buttons, if the new
ordering is not maintained for a List of Beans in
RepeaterJXPathBinding.saveFormToModel.
As an aside, I attempted last night to begin to implement some custom
event-handlers (to implement the above) in JavaScript. My handlers
obviously need access to the Bean being edited, to apply the
workarounds.
I found, as soon as I passed my Bean via showForm (screen, {bean:
bean}) as viewData to my event handlers, I started getting some very
strange exceptions. I have highlighted the issue in a post to Cocoon
Users (not available in the Archives yet). The subject is: 'Re:
deleting repeater-rows'. Unfortunately this problem appears to make all
of the above pretty academic ;)
Many thanks for your feedback.
regards Jeremy
Re: [woody] using on-activate handlers
Posted by Sylvain Wallez <sy...@apache.org>.
Jeremy Quinn wrote:
> Hi All
>
> I am having problems using on-activate handlers.
>
> I have them attached to several buttons, but they do not really help.
>
> I have one attached to a <wd:row-action id="delete"
> action-command="delete"/>, but it appears to get called after the
> delete, so I do not appear to be able to find out which row was
> deleted, so I cannot remove that object from the persistence layer.
> (the returned index is '-1').
Yep. Row actions are particular actions that have a built-in event
handler that is always called first. For this kind of application,
you'll need to use a "normal" action and remove the repeater row by
yourself as part of the event handler (a few lines of code, actually).
> I have one attached to a <wd:row-action id="down"
> action-command="move-down"/> and a <wd:row-action id="up"
> action-command="move-up"> button, but my handler gets called AFTER
> woody has moved them, complicating the issue of replicating the move
> in the BizData (the binding does not replicate the row order, so moves
> have no effect on BizData, if it is a Bean.)
>
> ie. calling event.getSourceWidget ().getParent ().getId () gives you
> the index of the row AFTER the move has already taken place.
Same problem here...
> Furthermore, because the Up button incorrectly shows on the top row,
> and the down button incorrectly shows on the bottom row, if the User
> clicks them, the row cannot be moved, so you get the 'correct' index
> of those rows. =:-0
Sorry, I lost you here...
> IMHO, this is making things a lot more difficult than they really need
> to be .....
>
> Would it break Woody terribly if on-activate handlers could be called
> BEFORE the row-action's action-command?
You're the first one to report this kind of problems. Two solutions come
to mind:
- change the order as you suggest it. It seems to make sense at first,
but won't someone come tomorrow with good reasons for doing it the other
way?
- use a regular action and "manually" use the row-action's event
listener using its java class name, i.e.
<on-action>
<... your event listener here ...>
<java class="o.a.c...DeleteRowListener"/>
</on-action>
What do you think?
Sylvain
--
Sylvain Wallez Anyware Technologies
http://www.apache.org/~sylvain http://www.anyware-tech.com
{ XML, Java, Cocoon, OpenSource }*{ Training, Consulting, Projects }
Orixo, the opensource XML business alliance - http://www.orixo.com
Re: [woody] using on-activate handlers
Posted by Jeremy Quinn <je...@media.demon.co.uk>.
On 27 Nov 2003, at 14:17, Ricardo Rocha wrote:
>
> Jeremy Quinn wrote:
>
>> I am having problems using on-activate handlers.
>> <snip/>
>> Would it break Woody terribly if on-activate handlers could
>> be called BEFORE the row-action's action-command?
>
> Or, even better, two handlers: BEFORE and AFTER.
>
>> I have one attached to a <wd:row-action id="delete"
>> action-command="delete"/>, but it appears to get called after the
>> delete, so I do not appear to be able to find out which row was
>> deleted, so I cannot remove that object from the persistence layer.
>> (the returned index is '-1').
>
> With the before/after event model you could determine which row is
> about to
> be deleted "before" and synchronize with the persistence layer "after".
>
> This could be generalized further to provide support for "before",
> "on" and
> "after" handlers for a other types of events...
That sounds like a good idea
WDOT?
regards Jeremy
RE: [woody] using on-activate handlers
Posted by Ricardo Rocha <ri...@apache.org>.
Jeremy Quinn wrote:
> I am having problems using on-activate handlers.
> <snip/>
> Would it break Woody terribly if on-activate handlers could
> be called BEFORE the row-action's action-command?
Or, even better, two handlers: BEFORE and AFTER.
> I have one attached to a <wd:row-action id="delete"
> action-command="delete"/>, but it appears to get called after the
> delete, so I do not appear to be able to find out which row was
> deleted, so I cannot remove that object from the persistence layer.
> (the returned index is '-1').
With the before/after event model you could determine which row is about to
be deleted "before" and synchronize with the persistence layer "after".
This could be generalized further to provide support for "before", "on" and
"after" handlers for a other types of events...