package gui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Time;
import java.util.Calendar;
import java.util.Date;
import javax.swing.*;
import util.HourFilter;
/**
* DateCalendar : c'est une classe qui d�finit les composants du calendrier
*
* @author Kasandra
*
*/
public class DateCalendar implements ActionListener{
private String[] mois = { " janvier ", " f�vrier ", " mars ", " avril ", " mai ", " juin ", " juillet ", " aout ", " septembre", " octobre", " novembre", " decembre" };
private int i, j, nbrJours;
private int moisChoisi, jourChoisi;
private Calendar dateChoisie, maintenant, mx;
private JDialog aDialog;
private JComboBox comboBoxAnnee, comboBoxMois;
private JLabel[] tJours = new JLabel[31];
private JPanel affJours;
private boolean testFLAG;
public boolean okFlag;
JLabel labHrFin;
JButton boutonOK, boutonAnnuler;
private JTextField txtFilterHourFin;
/**
* <p>Mode: est un type �num�r�, il d�finit les diff�rents mode d'affichage d'une date</p>
* <ul>
* <li>HEURE_SEULEMENT : affiche l'heure seulement</li>
* <li>DATE_SEULEMENT : affiche la date seulement</li>
* <li>DATE_ET_HEURE : affiche la date et l'heure</li>
* </ul>
* @author Kasandra
*
*/
public enum Mode {
HEURE_SEULEMENT,
DATE_SEULEMENT,
DATE_ET_HEURE
}
final Mode mode;
public JTextField getTxtFilterHourFin() {
if (txtFilterHourFin == null) {
txtFilterHourFin = new JTextField();
txtFilterHourFin.setForeground(Color.blue);
txtFilterHourFin.setDocument(new HourFilter());
}
return txtFilterHourFin;
}
/**
* Constructeur Aucune condition sur la date choisie...
* @param parentFrame TODO
*/
public DateCalendar(JFrame parentFrame, DateCalendar.Mode mode) {
this.mode = mode;
aDialog = new JDialog((Frame)null, "---DATE---", true);
aDialog.setBounds(550, 280, 300, 300);
maintenant = Calendar.getInstance();
dateChoisie = Calendar.getInstance();
testFLAG = false;
okFlag = false;
}
/**
* Constructeur de la classe DateCalendar
*
* @param parentFrame TODO
* @param delais
* Condition de validit� de la date porte sur un delais de x
* jours � partir de la date courante.
*
*/
public DateCalendar(JFrame parentFrame, int delais, DateCalendar.Mode mode) {
this.mode = mode;
aDialog = new JDialog(parentFrame, "DATE...", true);
aDialog.setBounds(750, 370, 300, 300);
maintenant = Calendar.getInstance();
dateChoisie = Calendar.getInstance();
testFLAG = true;
MaxDelais(delais);
okFlag = false;
}
/**
* d�finit le d�lai maximum
* @param delais
*/
private void MaxDelais(int delais) {
int jrMax;// Jour maximum sur le mois
mx = Calendar.getInstance();
jrMax = mx.getActualMaximum(Calendar.DATE);
int crrAN = mx.get(Calendar.YEAR);
int mxmois = mx.get(Calendar.MONTH);
int jr = mx.get(Calendar.DATE);
for (int cpt = 0; cpt < delais; cpt++) {
if (jr > jrMax) {
jr = 1;
mxmois = mxmois + 1;
if (mxmois > 11) {
mxmois = 0;
crrAN++;
}
mx.set(crrAN, mxmois, jr);
jrMax = mx.getActualMaximum(Calendar.DATE);
} else {
jr++;
}
}
mx.set(crrAN, mxmois, jr);
mxmois = mx.get(Calendar.MONTH) + 1;
String aSTR = mx.get(Calendar.DATE)+ "-" + mxmois + "-" + mx.get(Calendar.YEAR) ;
aDialog.setTitle("Limite: " + aSTR);
System.out.println(aSTR.length());
System.out.println(aSTR.indexOf("-"));
System.out.println(aSTR.lastIndexOf("-"));
}
/**
* Cr�e le panel ann�e
*
* @return parameterPane
*/
private JPanel creeAnneePanel() {
JPanel parameterPane = new JPanel(false);
parameterPane.setLayout(new GridLayout());
int pos = 0;
int cpt = 1940;
comboBoxAnnee = new JComboBox();
while (cpt < 2050) {
comboBoxAnnee.addItem(Integer.toString(cpt));
cpt = cpt + 1;
if (maintenant.get(Calendar.YEAR) == cpt)
pos = cpt - 1940;
}
comboBoxAnnee.setSelectedIndex(pos);
parameterPane.add(comboBoxAnnee);
return parameterPane;
}
/**
* Cr�e le panel mois
*
* @return parameterPane
*/
private JPanel creeMoisPanel() {
JPanel parameterPane = new JPanel(false);
parameterPane.setLayout(new GridLayout());
comboBoxMois = new JComboBox(mois);
comboBoxMois.setSelectedIndex(maintenant.get(Calendar.MONTH));
moisChoisi = comboBoxMois.getSelectedIndex();
parameterPane.add(comboBoxMois);
return parameterPane;
}
/**
* Cr�e le panel jour
*
* @return parameterPane
*/
private JPanel creeJoursPanel() {
JPanel parameterPane = new JPanel(false);
parameterPane.setLayout(new GridLayout());
parameterPane.setPreferredSize(new Dimension(300, 200));
nbrJours = maintenant.getActualMaximum(Calendar.DAY_OF_MONTH);
affJours = new JPanel();
affJours.setLayout(new GridLayout(6, 6, 2, 2));
for (i = 0; i < 31; i++) {
tJours[i] = new JLabel(String.valueOf(i + 1));
Font font = tJours[i].getFont();
Font newFont = new Font(font.getFontName(),font.getStyle(),20);
tJours[i].setFont(newFont);
tJours[i].addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
for (j = 0; j < nbrJours; j++) {
tJours[j].setBackground(new Color(238,238,238));
tJours[j].setOpaque(true);
}
JLabel jour = (JLabel) me.getSource();
jourChoisi = Integer.parseInt(jour.getText());
jour.setBackground(Color.red);
jour.setOpaque(true);
dateChoisie.set(Calendar.DATE, jourChoisi);
}
});
if (i <= nbrJours) {
affJours.add(tJours[i]);
}
;
}
;
parameterPane.add(affJours);
return affJours;
}
/**
* Cr�e le panel heure
*
* @return parameterPane
*/
private JPanel hrFinPane()
{
JPanel parameterPane = new JPanel(false);
parameterPane.setLayout(new GridLayout());
parameterPane.setPreferredSize(new Dimension(100, 25));
labHrFin = new JLabel("Heure :");
parameterPane.add(labHrFin);
parameterPane.add(getTxtFilterHourFin());
return parameterPane;
}
/**
* affiche les composants du calendrier
*/
public void affiche() {
JToolBar toolBar = new JToolBar("Outils...");
boutonOK= new JButton("Ok");
boutonAnnuler= new JButton("Annuler");
JPanel tempsPanel = new JPanel(false);
int dt = maintenant.get(Calendar.DAY_OF_MONTH) - 1;
if ( mode != Mode.HEURE_SEULEMENT ) {
JPanel parameterPane = new JPanel(false);
parameterPane.setLayout(new FlowLayout());
parameterPane.setPreferredSize(new Dimension(300, 300));
parameterPane.add(creeJoursPanel());
tJours[dt].setBackground(Color.RED);
tJours[dt].setOpaque(true);
aDialog.getContentPane().add(parameterPane);
aDialog.getContentPane().add(toolBar, BorderLayout.PAGE_START);
toolBar.add(creeMoisPanel());
comboBoxMois.addItemListener(comboBoxItemListener);
toolBar.add(creeAnneePanel());
}
if (mode != Mode.DATE_SEULEMENT) {
tempsPanel.add(hrFinPane());
}
tempsPanel.add(boutonOK);
tempsPanel.add(boutonAnnuler);
aDialog.getContentPane().add(tempsPanel, BorderLayout.SOUTH);
boutonOK.addActionListener(this);
boutonAnnuler.addActionListener(this);
aDialog.setVisible(true);
}
/**
* v�rifie la validit� d'une date
* @return true or false
*/
private boolean DateValidite() {
boolean returnValue = false;
if (mode != Mode.HEURE_SEULEMENT) {
Integer anChoisi = new Integer(comboBoxAnnee.getSelectedItem().toString());
Integer msChoisi = new Integer(moisChoisi);
Integer jrChoisi = new Integer(jourChoisi);
if (anChoisi.intValue() <= mx.get(Calendar.YEAR)) {
if (anChoisi.intValue() < mx.get(Calendar.YEAR)) {
returnValue = true;
} else {
if (msChoisi.intValue() <= mx.get(Calendar.MONTH)) {
if (msChoisi.intValue() < mx.get(Calendar.MONTH)) {
returnValue = true;
} else {
if (jrChoisi.intValue() <= mx.get(Calendar.DATE))
returnValue = true;
}
}
}
}
} else {
returnValue = true;
}
return returnValue;
}
/**
* Renvoie la date valide
*
* @return
*/
private boolean DateOK() {
if (testFLAG)
return DateValidite();
else
return true;
}
/**
* retourne heure d'�cran
* @return
*/
public String RenvoiHrFin(){
return getTxtFilterHourFin().getText();
}
/**
* retourne la date dans l'heure
* @return
*/
public Date retourDateSansTime() {
Calendar cal = Calendar.getInstance();
cal.set(
Integer.parseInt(comboBoxAnnee.getSelectedItem().toString()),
moisChoisi,
jourChoisi);
return cal.getTime();
}
/**
* retourne la date et l'heure
* @return dateHeure
*
*
*/
public Date retourDate() {
Calendar cal = Calendar.getInstance();
String heure= RenvoiHrFin();
int tailleHeure= heure.length();
int ps = heure.lastIndexOf(":");
if (mode != Mode.DATE_SEULEMENT) {
final int longueurHeureTexte = heure.length();
int hr1= 0;
int hr2= 0;
int hr3= 0;
if (longueurHeureTexte > 0) {
hr1= Integer.parseInt(heure.substring(0,2));
}
cal.set(Calendar.HOUR_OF_DAY, hr1);
if (longueurHeureTexte > 3) {
hr2= Integer.parseInt(heure.substring(3,ps));
}
cal.set(Calendar.MINUTE, hr2);
if (longueurHeureTexte > 6) {
hr3= Integer.parseInt(heure.substring(ps+1,tailleHeure));
}
cal.set(Calendar.SECOND, hr3);
}
if (mode != Mode.HEURE_SEULEMENT) {
cal.set(Calendar.YEAR, Integer.parseInt(comboBoxAnnee.getSelectedItem().toString()));
cal.set(Calendar.MONTH, moisChoisi);
cal.set(Calendar.DAY_OF_MONTH, jourChoisi);
}
return cal.getTime();
}
private ItemListener comboBoxItemListener = new ItemListener() {
public void itemStateChanged(ItemEvent ev) {
try {
moisChoisi = comboBoxMois.getSelectedIndex();
if (moisChoisi < maintenant.get(Calendar.MONTH)) {
dateChoisie.add(Calendar.YEAR, 1);
}
;
dateChoisie.set(Calendar.MONTH, moisChoisi);
nbrJours = dateChoisie.getActualMaximum(Calendar.DAY_OF_MONTH);
affJours.removeAll();
for (i = 0; i < nbrJours; i++) {
tJours[i].setBackground(Color.white);
affJours.add(tJours[i]);
}
tJours[dateChoisie.get(Calendar.DAY_OF_MONTH)].setBackground(Color.RED);
tJours[dateChoisie.get(Calendar.DAY_OF_MONTH)].setOpaque(true);
aDialog.repaint();
}
catch (Exception e) {
System.out.println("Error in valueChanged Calendar" + e.getCause());
}
}
};
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==boutonAnnuler){
aDialog.setVisible(false);
}
else if (e.getSource() == boutonOK){
if (DateOK())
okFlag = true;
aDialog.setVisible(false);
}
}
}