com.google.gwt.user.datepicker.client.CalendarModel.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.user.datepicker.client.CalendarModel.java

Source

/*
 * Copyright 2008 Google Inc.
 * 
 * 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 com.google.gwt.user.datepicker.client;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;

import java.util.Date;

/**
 * Model used to get calendar information for {@link DatePicker} and its
 * subclasses.
 */
@SuppressWarnings(/* Required to use Date API in gwt */{ "deprecation" })
public class CalendarModel {

    /**
     * The number of weeks normally displayed in a month.
     */
    public static final int WEEKS_IN_MONTH = 6;

    /**
     * Number of days normally displayed in a week.
     */
    public static final int DAYS_IN_WEEK = 7;

    private static final String[] dayOfWeekNames = new String[7];

    private static String[] dayOfMonthNames = new String[32];

    private final Date currentMonth;

    /**
     * Constructor.
     */
    public CalendarModel() {
        currentMonth = new Date();

        CalendarUtil.setToFirstDayOfMonth(currentMonth);

        // Finding day of week names
        Date date = new Date();
        for (int i = 1; i <= 7; i++) {
            date.setDate(i);
            int dayOfWeek = date.getDay();
            dayOfWeekNames[dayOfWeek] = getDayOfWeekFormatter().format(date);
        }

        // Finding day of month names
        date.setMonth(0);

        for (int i = 1; i < 32; ++i) {
            date.setDate(i);
            dayOfMonthNames[i] = getDayOfMonthFormatter().format(date);
        }
    }

    /**
     * Formats the current specified month. For example "Sep".
     * 
     * @return the formatted month
     */
    public String formatCurrentMonth() {
        return getMonthAndYearFormatter().format(currentMonth);
    }

    /**
     * Formats a date's day of month. For example "1".
     * 
     * @param date the date
     * @return the formated day of month
     */
    public String formatDayOfMonth(Date date) {
        return dayOfMonthNames[date.getDate()];
    }

    /**
     * Format a day in the week. So, for example "Monday".
     * 
     * @param dayInWeek the day in week to format
     * @return the formatted day in week
     */
    public String formatDayOfWeek(int dayInWeek) {
        return dayOfWeekNames[dayInWeek];
    }

    /**
     * Gets the first day of the first week in the currently specified month.
     * 
     * @return the first day
     */
    public Date getCurrentFirstDayOfFirstWeek() {
        int wkDayOfMonth1st = currentMonth.getDay();
        int start = CalendarUtil.getStartingDayOfWeek();
        if (wkDayOfMonth1st == start) {
            // always return a copy to allow SimpleCalendarView to adjust first
            // display date
            return new Date(currentMonth.getTime());
        } else {
            Date d = new Date(currentMonth.getTime());
            int offset = wkDayOfMonth1st - start > 0 ? wkDayOfMonth1st - start
                    : DAYS_IN_WEEK - (start - wkDayOfMonth1st);
            CalendarUtil.addDaysToDate(d, -offset);
            return d;
        }
    }

    /**
     * Gets the date representation of the currently specified month. Used to
     * access both the month and year information.
     * 
     * @return the month and year
     */
    public Date getCurrentMonth() {
        return currentMonth;
    }

    /**
     * Is a date in the currently specified month?
     * 
     * @param date the date
     * @return date
     */
    public boolean isInCurrentMonth(Date date) {
        return currentMonth.getMonth() == date.getMonth();
    }

    /**
     * Sets the currently specified date.
     * 
     * @param currentDate the currently specified date
     */
    public void setCurrentMonth(Date currentDate) {
        this.currentMonth.setYear(currentDate.getYear());
        this.currentMonth.setMonth(currentDate.getMonth());
    }

    /**
     * Shifts the currently specified date by the given number of months. The day
     * of the month will be pinned to the original value as far as possible.
     * 
     * @param deltaMonths - number of months to be added to the current date
     */
    public void shiftCurrentMonth(int deltaMonths) {
        CalendarUtil.addMonthsToDate(currentMonth, deltaMonths);
        refresh();
    }

    /**
     * Gets the date of month formatter.
     * 
     * @return the day of month formatter
     */
    protected DateTimeFormat getDayOfMonthFormatter() {
        return DateTimeFormat.getFormat(PredefinedFormat.DAY);
    }

    /**
     * Gets the day of week formatter.
     * 
     * @return the day of week formatter
     */
    protected DateTimeFormat getDayOfWeekFormatter() {
        return DateTimeFormat.getFormat("ccccc");
    }

    /**
     * Gets the month and year formatter.
     * 
     * @return the month and year formatter
     */
    protected DateTimeFormat getMonthAndYearFormatter() {
        return DateTimeFormat.getFormat(PredefinedFormat.YEAR_MONTH_ABBR);
    }

    /**
     * Refresh the current model as needed.
     */
    protected void refresh() {
    }

}