This is probably hopelessly broken but it seems to work for me:

Add the rule "shouldEditTime" for the property.

****************
RSD2WDatePicker.html
<webobject name="ChooseDate"/><webobject
name="ShouldEditTime"><webobject name="Hours"/><webobject
name="Minutes"/></webobject>

****************
RSD2WDatePicker.wod
ChooseDate: AjaxDatePicker {
        value = objectPropertyValue;
        format = format;        
}

ShouldEditTime: WOConditional {
        condition = shouldEditTime;
}

Hours: WOPopUpButton {
        list = hoursList;
        selection = hours;
}
Minutes: WOPopUpButton {
        list = minutesList;
        selection = minutes;
}

****************
RSD2WDatePicker.java

package com.eldrix.rsd2w;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import com.webobjects.appserver.WOContext;
import com.webobjects.appserver.WORequest;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSMutableArray;
import com.webobjects.foundation.NSTimestamp;
import com.webobjects.foundation.NSValidation;

import er.directtoweb.components.ERDCustomEditComponent;
import er.extensions.formatters.ERXTimestampFormatter;

/**
 * D2W component to edit a date.
 * Uses Chuck Hill's AjaxDatePicker
 *
 * @binding formatter : a text string (format) for the date format
 * @binding shouldEditTime : whether to edit the time as well?
 *
 * FIXME: This doesn't use localisation...
 *
 * @author mark
 * @see er.ajax.AjaxDatePicker
 */
public class RSD2WDatePicker extends ERDCustomEditComponent {
        protected String _format;
        protected GregorianCalendar _calendar;
        protected static final NSArray<String> _hoursList = new
NSMutableArray<String>() {{
                        for(int i=0; i < 24; i++) {
                                add(String.format("%02d", i));
                        }
        }};
        protected static final NSArray<String> _minutesList = new
NSMutableArray<String>() {{
                for (int i=0; i < 60; i++) {
                        add(String.format("%02d", i));
                }
        }};
        
        public interface Keys extends ERDCustomEditComponent.Keys {
                public static final String formatter = "formatter";
                public static final String shouldEditTime = "shouldEditTime";
        }

        public RSD2WDatePicker(WOContext context) {
                super(context);
        }
        
        public NSArray<String> hoursList() {
                return _hoursList;
        }
        public NSArray<String> minutesList() {
                return _minutesList;
        }

        /**
         * Initialises calendar from the current property value.
         * @return
         */
        public GregorianCalendar calendar() {
                if (_calendar == null) {
                        _calendar = new GregorianCalendar();
                        _calendar.setLenient(true);
                        if (date() != null) {
                                _calendar.setTime(date());
                        }
                }
                return _calendar;
        }
        
        public String hours() {
                return String.format("%02d", 
calendar().get(Calendar.HOUR_OF_DAY));
        }
        public String minutes() {
                return String.format("%02d", calendar().get(Calendar.MINUTE));
        }
        
        public void setHours(String hours) {
                calendar().set(Calendar.HOUR_OF_DAY, Integer.parseInt(hours));
        }
        public void setMinutes(String minutes) {
                calendar().set(Calendar.MINUTE, Integer.parseInt(minutes));
        }
        
        /**
         * We try to keep our calendar object up to date with property changes.
         */
        @Override public void setObjectPropertyValue(Object value) {
                if (value == null || value instanceof Date) {
                        if (value != null) {
                                calendar().setTime((Date)value);
                        }
                        super.setObjectPropertyValue(value);
                }
                else throw new IllegalArgumentException("RSD2WDatePicker must be
used with an NSTimestamp");
        }
        
        public NSTimestamp date() {
                Object o = objectPropertyValue();
                if (o == null || o instanceof NSTimestamp) {
                        return (NSTimestamp) o;
                }
                throw new IllegalArgumentException("RSD2WDatePicker must be used
with an NSTimestamp");
        }

        @Override public boolean synchronizesVariablesWithBindings() {
                return false;
        }

        public String format() {
                if(_format == null) {
                        _format = (String)valueForBinding("formatter");
                }
                if(_format == null || _format.length() == 0) {
                        _format = ERXTimestampFormatter.DEFAULT_PATTERN;
                }
                return _format;
        }

        public void setFormatter(String format) {
                _format = format;
        }

        public boolean shouldEditTime() {
                return booleanValueForBinding(Keys.shouldEditTime);
        }

        public void takeValuesFromRequest (WORequest request, WOContext 
context) {
                super.takeValuesFromRequest (request,context);
                if (_calendar != null && objectPropertyValue() != null) {
                        NSTimestamp date = new 
NSTimestamp(calendar().getTime());
                        try {   
                                object().validateTakeValueForKeyPath(date, 
key());
                        } catch (NSValidation.ValidationException v) {
                                
parent().validationFailedWithException(v,date,key());
                        } catch(Exception e) {
                                
parent().validationFailedWithException(e,date,key());
                        }
                }
        }
}
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to