In your case, you want a method to be called after Tapestry calls setDay(), setYear() and setMonth() during rewind.

You can do it in the cleanupAfterRender() method (As Daniel suggested), or you can use the http://tapestry.apache.org/tapestry4/ tapestry/ComponentReference/InvokeListener.html component (sorry, I was not clear last time). Here's an example...

Say this is your components template -

******

<input type="text" jwcid="[EMAIL PROTECTED]" value="..."/>
<input type="text" jwcid="[EMAIL PROTECTED]" value="..."/>
<input type="text" jwcid="[EMAIL PROTECTED]" value="..."/>

<span jwcid="@InvokeListener" listener="listener:calculateDate"/>

******

As you can see, I have added an InvokeListener component at the end. So when Tapestry renders/rewinds, it will render/rewind each of the 3 textfields and then call the listener "calculateDate". In this listener, you can check for isRewinding() and calculate the date and set it into the parameter.

- Navin

On 25-Oct-06, at 10:45 AM, Matt Kerr wrote:

Navin -

Thanks very much for the reply.

You can use templates for components too (similar to page templates), by extending the component class from "BaseComponent". Then you just add an HTML with the same name as the component and that's all.

Sorry if original post is confusing.

I'm ok with using templates on components (BaseComponent, etc), I think.

Except for a specific case where I'm not sure when/how the component would perform it's primary task.

An example of this might be a "Date Chooser" component -- where the generated HTML is 3 popups for YYYY / MM / DD .. and the caller binding passes in/out a Date object. eg,

FooPage.html
~~~~~~~~~~~~~~~~
        ..
        <span jwcid="@DateChooser" date="startDate" />
        ..
        <span jwcid="@DateChooser" date="endDate" />
        ..
~~~~~~~~~~~~~~~~

If I pretend I'm the DateChooser component, and the application accepts a form submit from FooPage..

My question is:

When do I call this.setDate() ?

I don't know what guarantees the behavior of DateInput.java (below). Maybe that's what I'm missing? Something simple like call setDate() (or equivalent) in the set'er of the last form bound ivar(?), eg. DateInput.setYear(). I suppose that seems kind of cheezy vs. a notification or something more formal .. which is why I'd be surprised if that was the trick, but I could definitely work with that.

If I don't call ~setDate() in the last set'er for the last input bound ivar .. then when is the appropriate time to call it?

I don't have the app in front of me at the minute .. :-/

But maybe something like PageEndRenderListener ? by implementing pageEndRender() - and checking for isRewinding() ?

http://tapestry.apache.org/tapestry4/tapestry/apidocs/org/apache/ tapestry/event/PageEndRenderListener.html



And you can use the "InvokeListener" component part of the core Tapestry framework. Just add this component in your custom component's template at the point where you want the listener invoked. The parameters for this component are very much similar to the DirectLink component. I think this will serve your purpose.

Sorry - I wasn't more clear about 'listener' -doh!
eg. - ?

<form jwcid="@shared:SimpleForm" listener="ognl:listeners.castBallotAction" stateful="ognl:false" focus="ognl:false">

I think you're just reminding me about form's listener & the .java's action method .. eg. castBallotAction() .. I guess what's important here is that the "Date Chooser" call setDate() before the action method is invoked. (Or better - at what point is the DateChooser.date available to the Page ?)

I hope this is more clear.

Ok, Thanks-Matt



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package ws.sundraw.tapestry.components;

import java.util.Calendar;

import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IBinding;
import org.apache.tapestry.form.IPropertySelectionModel;

/**
 *  Implements a component that accepts date input and is rendered
 *  as three HTML &lt;select&gt; elements, for day, month and year.
 *  Months are shown by their names (January, February etc.) and are
* automatically localized according to the preferred locale of the page
 *  where the component is used
 *
 *  @author Alexander Kolesnikov (www.sundraw.ws)
 *  @version 1.0
 *
 **/

public abstract class DateInput extends BaseComponent {
        
        private int d, m, y;
        private Calendar c;
        
        protected void initialize() {
                d = m = 1;
                y = 2000;
                c = null;
        }
        
        public IPropertySelectionModel getDaysModel() {
                return new DayModel();
        }
        
        public IPropertySelectionModel getMonthsModel() {
                return new LocalizedMonthsModel(getPage().getLocale());
        }
        
        public IPropertySelectionModel getYearsModel() {
                return new YearModel();
        }
        
        public int getDay() {
                c = readDate();
                d = c.get(Calendar.DATE);
                return d;
        }
        
        public void setDay(int day) {
                d = day;
        }
        
        public int getMonth() {
                m = c.get(Calendar.MONTH) + 1;
                return m;
        }
        
        public void setMonth(int month) {
                m = month;
        }
        
        public int getYear() {
                y = c.get(Calendar.YEAR);
                return y;
        }
        
        public void setYear(int year) {
                y = year;
                c.set(y, m - 1, d);
                upDate(c);
        }
        
        public Calendar readDate() {
                return (Calendar)getDateBinding().getObject("date", 
Calendar.class);
        }
        
        public void upDate(Calendar c) {
                getDateBinding().setObject(c);
        }
        
        public abstract IBinding getDateBinding();

}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to