FileDocCategorySizeDatePackage
MonthCalendarTag.javaAPI DocExample5547Tue Feb 28 11:34:06 GMT 2006com.ora.jsp.tags

MonthCalendarTag.java

package com.ora.jsp.tags;

import java.util.*;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class MonthCalendarTag extends SimpleTagSupport {
    private Date date;
    private String var;
    private JspFragment padPattern;
    private JspFragment beforePattern;
    private JspFragment afterPattern;
    private JspFragment dayNamePattern;
    private JspFragment weekdayPattern;
    private JspFragment weekendPattern;

    public void setDate(Date  date) {
        this.date = date;
    }
    
    public void setVar(String  var) {
        this.var = var;
    }

    public void setBeforePattern(JspFragment beforePattern) {
        this.beforePattern = beforePattern;
    }
    
    public void setAfterPattern(JspFragment afterPattern) {
        this.afterPattern = afterPattern;
    }
    
    public void setPadPattern(JspFragment padPattern) {
        this.padPattern = padPattern;
    }
    
    public void setDayNamePattern(JspFragment dayNamePattern) {
        this.dayNamePattern = dayNamePattern;
    }
    
    public void setWeekdayPattern(JspFragment weekdayPattern) {
        this.weekdayPattern = weekdayPattern;
    }
    
    public void setWeekendPattern(JspFragment weekendPattern) {
        this.weekendPattern = weekendPattern;
    }
    
    public void doTag() throws JspException, IOException {
        Calendar calendar = new GregorianCalendar();
        int firstDayOfWeek = calendar.getFirstDayOfWeek();

        // Evaluate the day name pattern, if any, once for each week day.
        if (dayNamePattern != null) {
            evalDayNamePattern(calendar, firstDayOfWeek);
        }

        // Set the calendar to the first day of the month.        
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 1);

        /* 
         * If padding is needed before the first of the month, evaluate
         * the padding pattern for each day of the previous month in the
         * first week.
         */
        if (padPattern != null) {
            evalPrePadPattern(calendar, firstDayOfWeek);
        }

        // Evaluate the weekday and weekend patterns
        evalDayPatterns(calendar, firstDayOfWeek);

        /*
         * If padding is needed after the last of the month, evaluate
         * the padding pattern for each day of the next month in the
         * last week.
         */
        if (padPattern != null) {
            evalPostPattern(calendar, firstDayOfWeek);
        }
    }

    private void evalDayNamePattern(Calendar calendar, int firstDayOfWeek) 
        throws JspException, IOException {
        if (beforePattern != null) {
            beforePattern.invoke(null);
        }
        for (int i = 0, day = firstDayOfWeek; i < 7; i++, day++) {
            calendar.set(Calendar.DAY_OF_WEEK, day);
            if (var != null) {
                getJspContext().setAttribute(var, calendar.getTime());
            }
            dayNamePattern.invoke(null);
        }
        if (afterPattern != null) {
            afterPattern.invoke(null);
        }
    }

    private void evalPrePadPattern(Calendar calendar, int firstDayOfWeek)  
        throws JspException, IOException {
        // Reset to start of week, possibly in the previous month
        int firstDayOfMonth = calendar.get(Calendar.DAY_OF_WEEK);
        calendar.add(Calendar.DATE, firstDayOfWeek - firstDayOfMonth);

        if (beforePattern != null) {
            beforePattern.invoke(null);
        }

        int padDays = firstDayOfMonth - firstDayOfWeek;
        for (int i = 0; i < padDays; i++) {
            if (var != null) {
                getJspContext().setAttribute(var, calendar.getTime());
            }
            padPattern.invoke(null);
            calendar.add(Calendar.DAY_OF_WEEK, 1);
        }
    }

    private void evalDayPatterns(Calendar calendar, int firstDayOfWeek) 
        throws JspException, IOException {

        int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int lastDayOfWeek = firstDayOfWeek - 1 == 0 ? 7 : firstDayOfWeek - 1;
        for (int i = 0; i < daysInMonth; i++) {
            if (var != null) {
                getJspContext().setAttribute(var, calendar.getTime());
            }
            int day = calendar.get(Calendar.DAY_OF_WEEK);
            if (day == firstDayOfWeek && beforePattern != null) {
                beforePattern.invoke(null);
            }

            if ((day == Calendar.SATURDAY || day == Calendar.SUNDAY) &&
                weekendPattern != null) {
                weekendPattern.invoke(null);
            }
            else {
                weekdayPattern.invoke(null);
            }

            if (day == lastDayOfWeek && afterPattern != null) {
                afterPattern.invoke(null);
            }            
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
    }

    private void evalPostPattern(Calendar calendar, int firstDayOfWeek) 
        throws JspException, IOException {
        while (calendar.get(Calendar.DAY_OF_WEEK) != firstDayOfWeek) {
            if (var != null) {
                getJspContext().setAttribute(var, calendar.getTime());
            }
            padPattern.invoke(null);
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        if (afterPattern != null) {
            afterPattern.invoke(null);
        }
    }
}