main.java.info.jtrac.wicket.yui.YuiCalendar.java Source code

Java tutorial

Introduction

Here is the source code for main.java.info.jtrac.wicket.yui.YuiCalendar.java

Source

/*
 * Copyright 2002-2005 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package main.java.info.jtrac.wicket.yui;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import main.java.info.jtrac.wicket.ErrorHighlighter;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.IHeaderContributor;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.FormComponentPanel;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;
import org.apache.wicket.util.convert.converters.AbstractConverter;

/**
 * yui date picker panel 
 */
public class YuiCalendar extends FormComponentPanel implements IHeaderContributor {

    private TextField dateField;
    private WebMarkupContainer container;

    public YuiCalendar(String id, IModel model, boolean required) {

        super(id, null);

        add(HeaderContributor.forJavaScript("resources/yui/yahoo/yahoo-min.js"));
        add(HeaderContributor.forJavaScript("resources/yui/event/event-min.js"));
        add(HeaderContributor.forJavaScript("resources/yui/dom/dom-min.js"));
        add(HeaderContributor.forJavaScript("resources/yui/calendar/calendar-min.js"));
        add(HeaderContributor.forJavaScript("resources/yui/calendar/calendar-utils.js"));
        add(HeaderContributor.forCss("resources/yui/calendar/assets/calendar.css"));

        dateField = new TextField("field", model, Date.class) {
            @Override
            public IConverter getConverter(Class clazz) {
                return new AbstractConverter() {
                    private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

                    public Object convertToObject(String s, Locale locale) {
                        if (s == null || s.trim().length() == 0) {
                            return null;
                        }
                        try {
                            return df.parse(s);
                        } catch (Exception e) {
                            throw new ConversionException(e);
                        }
                    }

                    protected Class getTargetType() {
                        return Date.class;
                    }

                    @Override
                    public String convertToString(Object o, Locale locale) {
                        Date d = (Date) o;
                        return df.format(d);
                    }
                };
            }

            @Override
            public IModel getLabel() {
                return YuiCalendar.this.getLabel();
            }
        };
        dateField.setOutputMarkupId(true);
        dateField.setRequired(required);
        dateField.add(new ErrorHighlighter());
        add(dateField);

        final WebMarkupContainer button = new WebMarkupContainer("button");
        button.setOutputMarkupId(true);
        button.add(new AttributeModifier("onclick", true, new AbstractReadOnlyModel() {
            public Object getObject() {
                return "showCalendar(" + getCalendarId() + ", '" + getInputId() + "');";
            }
        }));
        add(button);

        container = new WebMarkupContainer("container");
        container.setOutputMarkupId(true);
        add(container);
    }

    @Override
    public void updateModel() {
        dateField.updateModel();
    }

    private String getCalendarId() {
        return getMarkupId();
    }

    private String getInputId() {
        return dateField.getMarkupId();
    }

    private String getContainerId() {
        return container.getMarkupId();
    }

    public void renderHead(IHeaderResponse response) {
        String calendarId = getCalendarId();
        response.renderOnDomReadyJavascript("init" + calendarId + "()");
        response.renderJavascript("function init" + calendarId + "() { " + calendarId
                + " = new YAHOO.widget.Calendar('" + calendarId + "', '" + getContainerId() + "'); " + calendarId
                + ".selectEvent.subscribe(handleSelect, [ " + calendarId + ", '" + getInputId() + "' ], true); }",
                null);
    }
}