/*
* Copyright 2008 Jeff Dwyer
*
* 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.
*/
/*
* Simple Date Picker Widget for GWT library of Google, Inc.
*
* Copyright (c) 2006 Parvinder Thapar
* http://psthapar.googlepages.com/
*
* This library is free software; you can redistribute
* it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software
* Foundation; either version 2.1 of the License, or
* (at your option) any later version. This library is
* distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNULesser General Public License for more details.
* You should have received a copy of the GNU Lesser General
* PublicLicense along with this library; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.apress.progwt.client.widget.datepicker;
import java.util.Date;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.Widget;
/*
* CalendarPanel extends AbsolutePanel and is the main panel which
* displays the current month and its days. All the weekdays are
* selectable items. Clicking on any weekday makes the selection and the
* date is displayed in the textbox. All the weekends are grayed out and
* doesnot allow selection
*/
public class CalendarPanel extends AbsolutePanel {
DatePicker datePicker = null;
FlexTable currentMonth = new FlexTable();
String cellValues[][] = new String[7][7];
// Holds whether or not the weekends be allowed to be selected
private boolean isWeekendSelectable = false;
// Holds the date format needed to be displayed
private DateFormatter dateFormatter = new DateFormatter(
DateFormatter.DATE_FORMAT_MMDDYYYY);
/*
* Constructor
*
* @param DatePicker
*/
public CalendarPanel(DatePicker datePicker) {
this.datePicker = datePicker;
init();
}
/*
* init
*
* Does the initialization of the panel and all its children widgets
*/
private void init() {
this.setHeight("100%");
setPixelSize(168, 153);
this.setStyleName("calendarPanel");
currentMonth.addTableListener(new DateClickListener(this));
this.add(this.drawCalendar());
}
/*
* redrawCalendar
*
* Shows new dates per the month or year selected by the user
*/
public void redrawCalendar() {
// Log.debug("REDRAWING");
this.clearCalendar(this.currentMonth);
// JD
this.buildMonthBody(this.datePicker.getCurrentDate(),
this.currentMonth);
// this.buildMonthBody(this.datePicker.getSelectedDate(),
// this.currentMonth);
}
/*
* drawCalendar
*
* Displays the dates for the current date
*/
private Widget drawCalendar() {
this.currentMonth.setStyleName("monthDates");
this.buildMonthHeader(currentMonth);
this.buildMonthBody(datePicker.getCurrentDate(), currentMonth);
return currentMonth;
}
/*
* clearCalendar
*
* Clears out the dates in the month
*/
protected void clearCalendar(FlexTable monthBody) {
for (int row = 1; row < 6; row++) {
for (int col = 0; col < 7; col++) {
monthBody.setText(row, col, "");
}
}
}
/*
* buildMonthHeader
*
* Displays the header of the month with all the days of the week
* spelled out
*/
protected void buildMonthHeader(FlexTable monthHeader) {
monthHeader.setHTML(0, 0,
"<font class='monthHeaderHoliday'>Sun</font>");
monthHeader.setHTML(0, 1, "<font class='monthHeader'>Mon</font>");
monthHeader.setHTML(0, 2, "<font class='monthHeader'>Tue</font>");
monthHeader.setHTML(0, 3, "<font class='monthHeader'>Wed</font>");
monthHeader.setHTML(0, 4, "<font class='monthHeader'>Thu</font>");
monthHeader.setHTML(0, 5, "<font class='monthHeader'>Fri</font>");
monthHeader.setHTML(0, 6,
"<font class='monthHeaderHoliday'>Sat</font>");
}
/*
* buildMonthBody
*
* Calculates the number of days in the current month and the first
* start day. Then displays all the dates of that month. Weekdays are
* made selectable while weekends are grayed out and cannot be
* selected
*/
protected void buildMonthBody(Date date, FlexTable monthBody) {
int startWeekDay = DateUtil.getStartWeekDay(date);
int numDays = DateUtil.getNumDaysInMonth(date.getMonth(),
DateUtil.isLeapYear(date));
int dayCount = 0;
for (int row = 1; row < 7; row++) {
for (int col = 0; col < 7; col++) {
if (row == 1 && col < startWeekDay) {
monthBody.setText(row, col, "");
cellValues[row][col] = "";
} else {
if (numDays > dayCount) {
int selectedDate = ++dayCount;
cellValues[row][col] = selectedDate + "";
if (col == 0 || col == 6) {
if (true == isSelectedDate(date, selectedDate)) {
monthBody.setHTML(row, col,
"<font class='selectedDate'>"
+ selectedDate
+ "</font>");
} else {
if (this.isWeekendSelectable()) {
monthBody.setHTML(row, col,
"<font class='holidaySelectable'>"
+ selectedDate
+ "</font>");
} else {
monthBody.setHTML(row, col,
"<font class='holiday'>"
+ selectedDate
+ "</font>");
}
}
} else {
if (true == isSelectedDate(date, selectedDate)) {
monthBody
.setHTML(row, col,
"<font class='selectedDate'>"
+ selectedDate
+ "<font>");
} else {
monthBody
.setHTML(row, col,
"<font class='calendarDate'>"
+ selectedDate
+ "<font>");
}
}
} else {
monthBody.setText(row, col, "");
cellValues[row][col] = "";
}
}
}
}
}
/*
* DateClickListener is a Listener class which implementes the
* TableListener.
*
* The main panel uses FlexTable to display the dates of the month.
* This Listener is for the whole Table
*/
protected class DateClickListener implements TableListener {
CalendarPanel calPanel;
public DateClickListener(CalendarPanel calPanel) {
this.calPanel = calPanel;
}
public void onCellClicked(SourcesTableEvents sender, int row,
int col) {
if (!calPanel.isWeekendSelectable() && (col == 0 || col == 6)) {
return;
}
String cellValue = this.calPanel.cellValues[row][col];
if (null == cellValue || "null".equals(cellValue)
|| cellValue.trim().length() == 0) {
return;
}
Date currentDate = this.calPanel.datePicker.getCurrentDate();
/*
* String dateStr = DateFormatter.formatDate( new Date(
* currentDate.getYear(), currentDate.getMonth(),
* Integer.parseInt(this.calPanel.cellValues[row][col]) ),
* //DateFormatter.MMDDYYYY calPanel.getDateFormat() );
*/
Date newDate = new Date(currentDate.getYear(), currentDate
.getMonth(), Integer
.parseInt(this.calPanel.cellValues[row][col]));
this.calPanel.datePicker.setSelectedDate(newDate);
// this.calPanel.datePicker.setText(dateStr);
this.calPanel.datePicker.hide();
}
}
/*
* isSelecteDate
*
* Checks whether or not the date being printed is the selected date
* or current date
*/
private boolean isSelectedDate(Date date, int printedDate) {
boolean isCurrentDate = false;// pessimistic
Date selectedDate = this.datePicker.getSelectedDate();
if (selectedDate.getMonth() == date.getMonth()
&& selectedDate.getYear() == date.getYear()
&& selectedDate.getDate() == printedDate) {
isCurrentDate = true;
}
return isCurrentDate;
}
/*
* getWeekendSelectable Getter method for isWeekendSelectable
*
* @return boolean
*/
public boolean isWeekendSelectable() {
return isWeekendSelectable;
}
/*
* setWeekendSelectable Setter method for isWeekendSelectable
*
* @param boolean
*/
public void setWeekendSelectable(boolean isWeekendSelectable) {
this.isWeekendSelectable = isWeekendSelectable;
}
/*
* setDateFormatter Getter method for DateFormat
*
* @return DateFormat
*/
public DateFormatter getDateFormatter() {
return dateFormatter;
}
/*
* setDateFormatter Setter method for DateFormat
*
* @param DateFormat
*/
public void setDateFormatter(DateFormatter dateFormatter) {
this.dateFormatter = dateFormatter;
}
}