/**
Simple Calendar Widget for GWT
Copyright (C) 2006 Alexei Sokolov http://gwt.components.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 GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License 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.openkm.frontend.client.widget.searchin;
import java.util.Date;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.openkm.frontend.client.Main;
/**
* CalendarWidget
*/
public class CalendarWidget extends Composite implements ClickHandler, HasChangeHandlers {
private class NavBar extends Composite implements ClickHandler {
public final DockPanel bar = new DockPanel();
public final Button prevMonth = new Button("<", this);
public final Button prevYear = new Button("<<", this);
public final Button nextYear = new Button(">>", this);
public final Button nextMonth = new Button(">", this);
public final HTML title = new HTML();
private final CalendarWidget calendar;
public NavBar(CalendarWidget calendar) {
initWidget(bar);
this.calendar = calendar;
bar.setStyleName("navbar");
title.setStyleName("header");
HorizontalPanel prevButtons = new HorizontalPanel();
prevButtons.add(prevMonth);
prevButtons.add(prevYear);
HorizontalPanel nextButtons = new HorizontalPanel();
nextButtons.add(nextYear);
nextButtons.add(nextMonth);
prevMonth.addStyleName("okm-Input");
prevYear.addStyleName("okm-Input");
nextYear.addStyleName("okm-Input");
nextMonth.addStyleName("okm-Input");
bar.add(prevButtons, DockPanel.WEST);
bar.setCellHorizontalAlignment(prevButtons, DockPanel.ALIGN_LEFT);
bar.add(nextButtons, DockPanel.EAST);
bar.setCellHorizontalAlignment(nextButtons, DockPanel.ALIGN_RIGHT);
bar.add(title, DockPanel.CENTER);
bar.setVerticalAlignment(DockPanel.ALIGN_MIDDLE);
bar.setCellHorizontalAlignment(title, HasAlignment.ALIGN_CENTER);
bar.setCellVerticalAlignment(title, HasAlignment.ALIGN_MIDDLE);
bar.setCellWidth(title, "100%");
}
/* (non-Javadoc)
* @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent)
*/
@Override
public void onClick(ClickEvent event) {
Widget sender = (Widget) event.getSource();
if (sender == prevMonth) {
calendar.prevMonth();
} else if (sender == prevYear) {
calendar.prevYear();
} else if (sender == nextYear) {
calendar.nextYear();
} else if (sender == nextMonth) {
calendar.nextMonth();
}
}
}
private static class CellHTML extends HTML {
private int day;
public CellHTML(String text, int day) {
super(text);
this.day = day;
}
public int getDay() {
return day;
}
}
private final NavBar navbar = new NavBar(this);
private final DockPanel outer = new DockPanel();
private final Grid grid = new Grid(7, 7) {
public boolean clearCell(int row, int column) {
boolean retValue = super.clearCell(row, column);
Element td = getCellFormatter().getElement(row, column);
DOM.setInnerHTML(td, "");
return retValue;
}
};
private Date date = new Date();
private String[] days = new String[] { "", "", "", "", "", "", "" };
private String[] months = new String[] { "", "", "", "", "", "", "", "", "", "", "", "" };
/**
* CalendarWidget
*/
public CalendarWidget() {
initWidget(outer);
grid.setStyleName("table");
grid.setCellSpacing(0);
outer.add(navbar, DockPanel.NORTH);
outer.add(grid, DockPanel.CENTER);
langRefresh(); // Sets language translations
drawCalendar();
setStyleName("CalendarWidget");
}
/**
* drawCalendar
*/
@SuppressWarnings("deprecation")
private void drawCalendar() {
int year = getYear();
int month = getMonth();
setHeaderText(year, month);
grid.getRowFormatter().setStyleName(0, "weekheader");
for (int i = 0; i < days.length; i++) {
grid.getCellFormatter().setStyleName(0, i, "days");
grid.setText(0, i, days[i].substring(0, 3));
}
Date now = new Date();
int sameDay = now.getDate();
int today = (now.getMonth() == month && now.getYear()+1900 == year) ? sameDay : 0;
int firstDay = new Date(year - 1900, month, 1).getDay();
int numOfDays = getDaysInMonth(year, month);
int j = 0;
for (int i = 1; i < 7; i++) {
for (int k = 0; k < 7; k++, j++) {
int displayNum = (j - firstDay + 1);
if (j < firstDay || displayNum > numOfDays) {
grid.getCellFormatter().setStyleName(i, k, "empty");
grid.setHTML(i, k, " ");
} else {
HTML html = new CellHTML("<span>" + String.valueOf(displayNum) + "</span>",displayNum);
html.addClickHandler(this);
grid.getCellFormatter().setStyleName(i, k, "cell");
if (displayNum == today) {
grid.getCellFormatter().addStyleName(i, k, "today");
grid.getCellFormatter().addStyleName(i, k, "day");
} else if (displayNum == sameDay) {
// not marks the day
// grid.getCellFormatter().addStyleName(i, k, "day");
}
grid.setWidget(i, k, html);
}
}
}
}
/**
* setHeaderText
*
* @param year The year
* @param month The month
*/
protected void setHeaderText(int year, int month) {
navbar.title.setText(months[month] + ", " + year);
}
/**
* getDaysInMonth
*
* @param year The year
* @param month The month
* @return Number of day on a month
*/
private int getDaysInMonth(int year, int month) {
switch (month) {
case 1:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 29; // leap year
else
return 28;
case 3:
return 30;
case 5:
return 30;
case 8:
return 30;
case 10:
return 30;
default:
return 31;
}
}
/**
* prevMonth
*/
public void prevMonth() {
int month = getMonth() - 1;
if (month < 0) {
setDate(getYear() - 1, 11, getDay());
} else {
setMonth(month);
}
drawCalendar();
}
/**
* nextMonth
*/
public void nextMonth() {
int month = getMonth() + 1;
if (month > 11) {
setDate(getYear() + 1, 0, getDay());
} else {
setMonth(month);
}
drawCalendar();
}
/**
* prevYear
*/
public void prevYear() {
setYear(getYear() - 1);
drawCalendar();
}
/**
* nextYear
*/
public void nextYear() {
setYear(getYear() + 1);
drawCalendar();
}
/**
* setDate
*
* @param year The year
* @param month The month
* @param day The day
*/
@SuppressWarnings("deprecation")
private void setDate(int year, int month, int day) {
date = new Date(year - 1900, month, day);
}
/**
* setYear
*
* @param year The year
*/
@SuppressWarnings("deprecation")
private void setYear(int year) {
date.setYear(year - 1900);
}
/**
* setMonth
*
* @param month The month
*/
@SuppressWarnings("deprecation")
private void setMonth(int month) {
date.setMonth(month);
}
/**
* getYear
*
* @return The year
*/
@SuppressWarnings("deprecation")
public int getYear() {
return 1900 + date.getYear();
}
/**
* getMonth
*
* @return The month
*/
@SuppressWarnings("deprecation")
public int getMonth() {
return date.getMonth();
}
/**
* getDay
*
* @return The day
*/
@SuppressWarnings("deprecation")
public int getDay() {
return date.getDate();
}
/**
* getDate
*
* @return The date
*/
public Date getDate() {
return date;
}
/* (non-Javadoc)
* @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent)
*/
@Override
public void onClick(ClickEvent event) {
CellHTML cell = (CellHTML) event.getSource();
setDate(getYear(), getMonth(), cell.getDay());
drawCalendar();
if (getHandlerCount(ChangeEvent.getType())>0) {
fireChange();
}
}
/**
* fire a change event
*/
private void fireChange() {
NativeEvent nativeEvent = Document.get().createChangeEvent();
ChangeEvent.fireNativeEvent(nativeEvent, this);
}
/* (non-Javadoc)
* @see com.google.gwt.event.dom.client.HasChangeHandlers#addChangeHandler(com.google.gwt.event.dom.client.ChangeHandler)
*/
@Override
public HandlerRegistration addChangeHandler(ChangeHandler handler) {
return addDomHandler(handler, ChangeEvent.getType());
}
/**
* langRefresh
*/
public void langRefresh() {
days[0] = Main.i18n("calendar.day.sunday");
days[1] = Main.i18n("calendar.day.monday");
days[2] = Main.i18n("calendar.day.tuesday");
days[3] = Main.i18n("calendar.day.wednesday");
days[4] = Main.i18n("calendar.day.thursday");
days[5] = Main.i18n("calendar.day.friday");
days[6] = Main.i18n("calendar.day.saturday");
months[0] = Main.i18n("calendar.month.january");
months[1] = Main.i18n("calendar.month.february");
months[2] = Main.i18n("calendar.month.march");
months[3] = Main.i18n("calendar.month.april");
months[4] = Main.i18n("calendar.month.may");
months[5] = Main.i18n("calendar.month.june");
months[6] = Main.i18n("calendar.month.july");
months[7] = Main.i18n("calendar.month.august");
months[8] = Main.i18n("calendar.month.september");
months[9] = Main.i18n("calendar.month.october");
months[10] = Main.i18n("calendar.month.november");
months[11] = Main.i18n("calendar.month.december");
}
}