package org.japura.gui.calendar.components;
import java.awt.Color;
import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.BorderFactory;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import org.japura.gui.PopupMenuBuilder;
import org.japura.gui.calendar.Calendar;
import org.japura.gui.calendar.CalendarComponent;
import org.japura.gui.calendar.CalendarComponentType;
import org.japura.gui.calendar.DayOfWeek;
/**
* <P>
* Copyright (C) 2011 Carlos Eduardo Leite de Andrade
* <P>
* 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 3 of the License, or (at your option) any
* later version.
* <P>
* This program 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.
* <P>
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <A
* HREF="www.gnu.org/licenses/">www.gnu.org/licenses/</A>
* <P>
* For more information, contact: <A HREF="www.japura.org">www.japura.org</A>
* <P>
*
* @author Carlos Eduardo Leite de Andrade
*/
public class DayOfMonthSlot extends CalendarSlot implements MouseListener{
private static final long serialVersionUID = 2647751815341515373L;
private int day;
private int month;
private int year;
private boolean currentMonth;
private boolean selected;
public DayOfMonthSlot(Calendar calendar) {
super(calendar, CalendarComponentType.DAY_MONTH);
setBorder(buildBorder());
addMouseListener(this);
setFont(getCalendar().getPropertiesProvider().getDayOfMonthFont());
}
private Border buildBorder() {
Insets margin = getCalendar().getPropertiesProvider().getDayOfMonthMargin();
int t = margin.top;
int l = margin.left;
int b = margin.bottom;
int r = margin.right;
return BorderFactory.createEmptyBorder(t, l, b, r);
}
public void setDate(int day, int month, int year) {
this.day = day;
this.month = month;
this.year = year;
setText(day + "");
}
@Override
public Color getBackground() {
Calendar calendar = getCalendar();
if (calendar == null) {
return super.getBackground();
}
return calendar.getPropertiesProvider().getBackground(this);
}
@Override
public Color getForeground() {
Calendar calendar = getCalendar();
if (calendar == null) {
return super.getForeground();
}
return calendar.getPropertiesProvider().getForeground(this);
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
Calendar calendar = getCalendar();
if (calendar.isEnabled() == false) {
return;
}
if (SwingUtilities.isRightMouseButton(e)) {
PopupMenuBuilder<CalendarComponent> pmb = calendar.getPopupMenuBuilder();
if (pmb != null) {
JPopupMenu pm = pmb.buildPopupMenu(this);
if (pm != null) {
pm.show(this, e.getX(), e.getY());
}
}
return;
}
if (getCalendar().isDialogMode() == false && selected) {
return;
}
long time = getDate().getTime();
if (currentMonth && getCalendar().isDialogMode()) {
getCalendar().disposeDialog(time);
} else {
getCalendar().setDate(time);
}
}
@Override
public void mouseReleased(MouseEvent e) {}
public void setSelected(boolean selected) {
this.selected = selected;
}
public DayOfWeek getDayOfWeek() {
GregorianCalendar gc = new GregorianCalendar();
gc.set(GregorianCalendar.YEAR, year);
gc.set(GregorianCalendar.MONTH, month);
gc.set(GregorianCalendar.DAY_OF_MONTH, day);
gc.set(GregorianCalendar.HOUR_OF_DAY, 0);
gc.set(GregorianCalendar.MINUTE, 0);
gc.set(GregorianCalendar.SECOND, 0);
gc.set(GregorianCalendar.MILLISECOND, 0);
int dow = gc.get(GregorianCalendar.DAY_OF_WEEK);
return DayOfWeek.getDayOfWeek(dow);
}
public Date getDate() {
GregorianCalendar gc = new GregorianCalendar();
gc.set(GregorianCalendar.YEAR, year);
gc.set(GregorianCalendar.MONTH, month);
gc.set(GregorianCalendar.DAY_OF_MONTH, day);
gc.set(GregorianCalendar.HOUR_OF_DAY, 0);
gc.set(GregorianCalendar.MINUTE, 0);
gc.set(GregorianCalendar.SECOND, 0);
gc.set(GregorianCalendar.MILLISECOND, 0);
return gc.getTime();
}
public boolean isSelected() {
return selected;
}
public boolean isCurrentMonth() {
return currentMonth;
}
public int getDay() {
return day;
}
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public void setCurrentMonth(boolean currentMonth) {
this.currentMonth = currentMonth;
}
}