Hi,

I am trying to make a ComboDatePicker component composed of three
DropDownChoices (day, month and year).

I overloaded convertInput to combine the year, month and day dropdown
choices into a Date, but I am unable to get proper values..

When I ask for ModelObject, I got null and when I ask for converted input I
got the option index instead of the real date..

I am missing something?

Thank you!
Stéphane


public class ComboDatePicker extends FormComponentPanel {
    private Logger log = LoggerFactory.getLogger( ComboDatePicker.class );
    private DropDownChoice dayPicker;
    private DropDownChoice monthPicker;
    private DropDownChoice yearPicker;

    private IModel day = new Model();
    private IModel month = new Model();
    private IModel year = new Model();

    public ComboDatePicker(String id) {
        super( id );
        init();
    }

    public ComboDatePicker(String id, IModel model) {
        super( id, model );
        init();
    }

    private void init() {
        setType( Date.class );

        add( dayPicker = newDropDownChoice( "day", day, getListDate() ) );
        add( monthPicker = newDropDownChoice( "month", month, getListMonth()
) );
        add( yearPicker = newDropDownChoice( "year", year, getListYears() )
);
    }

    private DropDownChoice newDropDownChoice( String id, IModel model,
List<Integer> values ) {
        DropDownChoice menu = new DropDownChoice( id, model, values );
        menu.setType( Integer.class );
        menu.setRequired( true );
        return menu;
    }

    @Override
    public boolean checkRequired() {
        return true;
    }

    @Override
    protected void onAttach() {
        log.debug( "Attaching" );
        super.onAttach();

        Date date = (Date)getModelObject();
        if( date != null ) {
            DateTime current = new DateTime( date );
            year.setObject ( current.getYear() );
            month.setObject( current.getMonthOfYear() );
            day.setObject( current.getDayOfMonth() );
        }
    }

    @Override
    protected void convertInput() {
        log.debug( "Getting converted value" );

        // I got null with this
        //Integer dayHs = (Integer) dayPicker.getModelObject();
        //Integer monthHs = (Integer) monthPicker.getModelObject ();
        //Integer yearHs = (Integer) yearPicker.getModelObject();

        // I got indexes and not values
        Integer dayHs = (Integer) dayPicker.getConvertedInput();
        Integer monthHs = (Integer) monthPicker.getConvertedInput();
        Integer yearHs = (Integer) yearPicker.getConvertedInput ();

        log.debug( "Selected {}-{}-{}", new Integer[]{ yearHs, monthHs,
dayHs } );

        try {
            DateTime date = new DateTime( yearHs, monthHs, dayHs, 12, 0, 0,
0 );
            log.debug( "Selected date={}", date );
            setConvertedInput( date.toDate() );
        }
        catch( Exception e ) {
            setConvertedInput( null );
            log.warn( "Unable to convert date", e );
//            error( getString( " error.badDateFormat" ) );
        }
    }

    // TODO Optimize!
    public List<Integer> getListDate() {
        List<Integer> days = new ArrayList<Integer>(31);

        for( int i = 1; i <= 31; i++ ) {
            days.add( Integer.valueOf( i ) );
        }

        return days;
    }

    // TODO Optimize!
    public List<Integer> getListMonth() {
        List<Integer> months = new ArrayList<Integer>(12);

        for( int i = 1; i <= 12; i++ ) {
            months.add( Integer.valueOf( i ) );
        }

        return months;
    }

    // TODO Optimize!
    public List<Integer> getListYears() {
        List<Integer> years = new ArrayList<Integer>(120);

        int currentYear = new DateTime().getYear();

        for( int i = 12; i <= 120; i++ ) {
            years.add( Integer.valueOf( currentYear - i ) );
        }

        return years;
    }

}

Reply via email to