public void init() {
// int hauteur = Integer.parseInt(getParameter("height"));
// int largeur = Integer.parseInt(getParameter("width"));
// modeleMois = new ModeleMois(largeur,hauteur-60);
modeleMois = new ModeleMois(250,190);
modeleMois.addMouseListener(this);
add(modeleMois);
anneePrec = new Button(" << ");
anneePrec.addActionListener(this);
add(anneePrec);
moisPrec = new Button(" < ");
add(moisPrec);
moisPrec.addActionListener(this);
moisSuiv = new Button(" > ");
add(moisSuiv);
moisSuiv.addActionListener(this);
anneeSuiv = new Button(" >> ");
add(anneeSuiv);
anneeSuiv.addActionListener(this);
add(labelDate);
}
public static void main(String args[]) {
fenetre = new Frame("MonCal");
MonCal applet = new MonCal();
fenetre.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
applet.init();
applet.start();
fenetre.add("Center",applet);
fenetre.setSize(250,250);
fenetre.setVisible(true);
}
/** AppletCalendrier gère deux types d'événements:
* 1) L'appui sur les boutons qui permettent de passer
* au mois suivant ou au mois précédent
* 2) Les clics de souris à l'écran
*/
public void actionPerformed(
java.awt.event.ActionEvent evenement) {
if (evenement.getSource() == anneePrec) {
modeleMois.decrementeAnnee();
}
else if (evenement.getSource() == moisPrec) {
modeleMois.decrementeMois();
}
else if (evenement.getSource() == moisSuiv) {
modeleMois.incrementeMois();
}
else if (evenement.getSource() == anneeSuiv) {
modeleMois.incrementeAnnee();
}
else if (evenement.getSource() == modeleMois) {
}
}
// Interface MouseListener:
public void mouseClicked(java.awt.event.MouseEvent me) {
Calendar d =
modeleMois.positionToDate(me.getX(), me.getY());
labelDate.setText("Sélectionnée: " +
DateFormat.getDateInstance().format(d.getTime()));
}
public void mousePressed(java.awt.event.MouseEvent me) {
}
public void mouseReleased(java.awt.event.MouseEvent me) {
}
public void mouseEntered(java.awt.event.MouseEvent me) {
}
public void mouseExited(java.awt.event.MouseEvent me) {
}
}
/** ModeleMois est un composant permettant d'afficher
* des dates dans une interface de type calendrier
*/
class ModeleMois extends Canvas {
final static byte LIGNES = 8; // nombre de lignes du calendrier
final static byte COLONNES = 7; // nombre de colonnes du calendrier
final static Calendar dateInit = new GregorianCalendar();
private cferie dateFerie = new cferie (new GregorianCalendar());
/*
static Calendar j8mai = new GregorianCalendar(2000,4,8);
static Calendar j1mai = new GregorianCalendar(2000,4,1);
*/
private Calendar dateCourante = new GregorianCalendar();
private Calendar dateTemp = new GregorianCalendar();
// private cferie dateFerie = new cferie (dateCourante);
// date du premier lundi (éventuellement du mois précédent)
// dans cette vue du calendrier
private Calendar premierJourDuMois =
new GregorianCalendar();
private int hauteurLigne;
private int largeurColonne;
private Rectangle r;
private Dimension dimension = new Dimension(150,150);
public ModeleMois() {
initialize();
}
public ModeleMois(int largeur, int hauteur) {
setBounds(0,0,largeur,hauteur);
initialize();
}
/** Tous les constructeurs appellent cette routine d'initialisation */
private void initialize() {
setBackground(Color.white);
setForeground(Color.gray);
r = getBounds();
largeurColonne = r.width / COLONNES;
hauteurLigne = r.height / LIGNES;
//redimensionnement afin que la taille des lignes
//et des colonnes s'ajustent manière égale
setBounds( 0, 0, (largeurColonne * COLONNES),
(hauteurLigne * LIGNES));
r = getBounds();
//sauvegarde la hauteur et la largeur dans un objet
//Dimension afin de pouvoir les utiliser avec les
//méthodes getPreferredSize() et getMinimumSize()
dimension.width = r.width;
dimension.height = r.height;
}
public void incrementeMois() {
dateCourante.add(Calendar.MONTH,1);
repaint();
}
public void decrementeMois() {
dateCourante.add(Calendar.MONTH,-1);
repaint();
}
public void incrementeAnnee() {
dateCourante.add(Calendar.YEAR,1);
repaint();
}
public void decrementeAnnee() {
dateCourante.add(Calendar.YEAR,-1);
repaint();
}
public void paint(Graphics g) {
// nouvel objet ferie
cferie dateFerie = new cferie (dateCourante);
// dessine les séparateurs de lignes
for (int i=hauteurLigne; i<r.height; i+=hauteurLigne) {
g.drawLine(0, i, r.width, i);
}
// dessine les séparateurs de colonnes
for (int i=largeurColonne; i<r.width; i+=largeurColonne){
g.drawLine(i, hauteurLigne, i, r.height);
}
//affiche le nom du mois
SimpleDateFormat reformateur =
new SimpleDateFormat ("MMMM yyyy");
String chaineDate =
reformateur.format(dateCourante.getTime());
g.drawString(chaineDate, 10, (hauteurLigne/2));
// retrouve le premier jour de cette vue du calendrier
dateTemp.setTime(dateCourante.getTime());
int moisCourant = dateCourante.get(Calendar.MONTH);
dateCourante.add(Calendar.DATE,
-(dateCourante.get(Calendar.DATE)));
dateCourante.add(Calendar.DATE,
-(dateCourante.get(Calendar.DAY_OF_WEEK))+2);
premierJourDuMois.setTime(dateCourante.getTime());
g.drawString(("Lu" ),3, hauteurLigne + hauteurLigne / 2);
g.drawString(("Ma" ),largeurColonne + 3, hauteurLigne + hauteurLigne / 2);
g.drawString(("Me" ),2 * largeurColonne + 3, hauteurLigne + hauteurLigne / 2);
g.drawString(("Je" ),3 * largeurColonne + 3, hauteurLigne + hauteurLigne / 2);
g.drawString(("Ve" ),4 * largeurColonne + 3, hauteurLigne + hauteurLigne / 2);
g.drawString(("Sa" ),5 * largeurColonne + 3, hauteurLigne + hauteurLigne / 2);
g.setColor(Color.red);
g.drawString(("Di" ),6 * largeurColonne + 3, hauteurLigne + hauteurLigne / 2);
g.setColor(Color.gray);
// affiche les dates
// pour chaque ligne...
for (int ligne=2; ligne<LIGNES; ligne++) {
// et pour chaque colonne...
for (int colonne=0; colonne<COLONNES; colonne++) {
// les dimanches en rouge
if (dateCourante.get(Calendar.DAY_OF_WEEK) == 1) {
g.setColor(Color.red);
}
// la date initiale en bleu
if (dateCourante.get(Calendar.DAY_OF_YEAR) == dateInit.get(Calendar.DAY_OF_YEAR)) {
if (dateCourante.get(Calendar.YEAR) == dateInit.get(Calendar.YEAR)) {
g.setColor(Color.blue);
}
}
// les autres jours...
if (dateCourante.get(Calendar.MONTH) == moisCourant) {
// les jours feries
for (int rng=1; rng<=11; rng++) {
if (dateCourante.get(Calendar.MONTH) ==
dateFerie.aFerie(rng).get(Calendar.MONTH)){
if (dateCourante.get(Calendar.DATE) ==
dateFerie.aFerie(rng).get(Calendar.DATE)){
g.setColor(Color.magenta);
}
}
}
g.drawString(
("" + dateCourante.get(Calendar.DATE)),
(colonne * largeurColonne) + 3,
(ligne * hauteurLigne) + (hauteurLigne / 2));
}
dateCourante.add(Calendar.DATE, 1);
g.setColor(Color.gray);
}
}
// rétablit la date
dateCourante.setTime(dateTemp.getTime());
}
/** retourne la date correspondant à une
* position (les coordonnées x et y) dans
* la vue courante du calendrier
*/
public Calendar positionToDate(int x, int y) {
int colonne = x / largeurColonne;
int ligne = (y / hauteurLigne) - 2;
Calendar returnDate = new GregorianCalendar();
returnDate.setTime(premierJourDuMois.getTime());
returnDate.add(Calendar.DATE,
(ligne * COLONNES) + colonne);
return returnDate;
}
/** Retourne la taille préférée pour le calendrier */
public Dimension getPreferredSize() {
return dimension;
}
/** Retourne la taille minimale pour le calendrier */
public Dimension getMinimumSize() {
return dimension;
}