001    package org.apache.myfaces.tobago.model;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     *      http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    /*
021     * Created: Nov 20, 2002 10:05:10 PM
022     * $Id: CalendarModel.java,v 1.1.1.1 2004/04/15 18:41:00 idus Exp $
023     */
024    
025    
026    import java.text.DecimalFormat;
027    import java.text.SimpleDateFormat;
028    import java.util.Calendar;
029    
030    public class CalendarModel {
031    
032      private DateModel[][] calendarArray;
033      private int firstDayOffset;
034      //private int firstDayOfWeek;
035    
036      public CalendarModel(Calendar calendar) {
037    //    int weekCount = CalendarUtils.weekCount(calendar);
038        int weekCount = 6; // switching off dynamic weekCount!
039        calendarArray = new DateModel[weekCount][7];
040        Calendar c = (Calendar) calendar.clone();
041        c.clear(Calendar.DAY_OF_MONTH);
042        c.set(Calendar.DAY_OF_MONTH, 1);
043        // assert c.isLenient() : "'add -x days' may not work in a non-lenient calendar";
044        firstDayOffset = firstDayOffset(c);
045        //firstDayOfWeek = c.getFirstDayOfWeek();
046        c.add(Calendar.DAY_OF_WEEK, -firstDayOffset);
047        for (int week = 0; week < weekCount; ++week) {
048          for (int day = 0; day < 7; ++day) {
049            calendarArray[week][day] = new DateModel(c);
050            c.add(Calendar.DAY_OF_MONTH, 1);
051          }
052        }
053      }
054    
055      public int getWeekCount() {
056        return calendarArray.length;
057      }
058    
059      public int getMonth() {
060        return calendarArray[0][firstDayOffset].getMonth();
061      }
062    
063      public int getYear() {
064        return calendarArray[0][firstDayOffset].getYear();
065      }
066    
067      public DateModel getDate(int week, int day) {
068        return calendarArray[week][day];
069      }
070    
071      private int firstDayOffset(Calendar calendar) {
072        Calendar c = (Calendar) calendar.clone();
073        c.clear(Calendar.DAY_OF_MONTH);
074        c.set(Calendar.DAY_OF_MONTH, 1);
075        int day = c.get(Calendar.DAY_OF_WEEK);
076        int firstDayOfWeek = c.getFirstDayOfWeek();
077        // Fails: assertEquals((1+7-3)%7, (1-3)%7);
078        return (day + 7 - firstDayOfWeek) % 7;
079      }
080    
081      public String toString() {
082        StringBuilder buffer = new StringBuilder();
083        buffer.append("Month: ").append(getMonth()).append("\n");
084        int weekCount = getWeekCount();
085        DecimalFormat format = new DecimalFormat("00");
086        SimpleDateFormat dateFormat = new SimpleDateFormat("E");
087        for (int day = 0; day < 7; ++day) {
088          DateModel date = getDate(0, day);
089          String dayName = dateFormat.format(date.getCalendar().getTime());
090          buffer.append(dayName.substring(0, 2)).append(" ");
091        }
092        buffer.append("\n");
093        for (int week = 0; week < weekCount; ++week) {
094          for (int day = 0; day < 7; ++day) {
095            DateModel date = getDate(week, day);
096            buffer.append(format.format(date.getDay())).append(" ");
097          }
098          buffer.append("\n");
099        }
100        return buffer.toString();
101      }
102    
103    }