View Javadoc

1   /**
2    * Copyright 2008 WebPhotos
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package net.sf.webphotos.gui;
17  
18  import java.awt.GridLayout;
19  import java.text.SimpleDateFormat;
20  import java.util.Calendar;
21  import java.util.Date;
22  import java.util.GregorianCalendar;
23  import javax.swing.JLabel;
24  import javax.swing.JPanel;
25  import javax.swing.JToggleButton;
26  import org.apache.log4j.Logger;
27  
28  /**
29   * Gera um calendário.
30   * Usa um GridLayout para fazer o formato.
31   * Pode formatar a data em dois tipos diferentes.
32   */
33  public class Calendario extends JPanel {
34  
35      private String[] dias = {"dom", "seg", "ter", "qua", "qui", "sex", "sab"};
36      private String[] meses = {"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"};
37      private int[] diasNoMes = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
38      private GregorianCalendar calendario = new GregorianCalendar();
39      
40      private Logger log = Logger.getLogger(Calendario.class);
41  
42      /**
43       * Construtor da classe.
44       * Não recebe parâmetros.
45       * Simplesmente seta a data atual.
46       */
47      public Calendario() {
48          calendario.setTime(new Date());
49      }
50  
51      /**
52       * Construtor da classe.
53       * Recebe o formato da data como parâmetro. Formato dd/mm/aa ou dd/mm/aaaa.
54       * Inicia um objeto Date e checa o tamanho da String recebida, para armazenar a data no formato pedido.
55       * Após descobrir o tipo selecionado, seta o valor do calendario.
56       * @param formato_ddmmaa Formato da data.
57       */
58      public Calendario(String formato_ddmmaa) {
59          Date data = null;
60          SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
61          if (formato_ddmmaa.length() == 10) {
62              sdf.applyPattern("dd/MM/yyyy");
63          }
64  
65          try {
66              data = sdf.parse(formato_ddmmaa);
67          } catch (Exception e) {
68              log.warn("Erro na conversão de data: " + formato_ddmmaa, e);
69              data = new Date();
70          }
71          calendario.setTime(data);
72      }
73  
74      /**
75       * Imprime a saída com os dados da data, montando um calendário em um {@link java.awt.GridLayout GridLayout}.
76       * Apresentando dados como ano, mês, dia, número de dias no mês e primeiro dia da semana.
77       */
78      public void mostrar() {
79          int indiceMes = calendario.get(Calendar.MONTH); // começa 0-Janeiro, 1-Fevereiro...
80          int ano = calendario.get(Calendar.YEAR);
81          // ano é bissexto ?
82          if (calendario.isLeapYear(ano)) {
83              diasNoMes[1] = 29;
84          }
85  
86          String nomeMes = meses[indiceMes];
87          int numDias = diasNoMes[indiceMes];
88  
89          calendario.set(Calendar.DATE, 1);
90          int numPrimeiroDiaMes = calendario.get(Calendar.DAY_OF_WEEK);
91  
92          int numLinhas = (numDias + numPrimeiroDiaMes - 1) / 7;
93          float resto = (numDias + numPrimeiroDiaMes - 1) % 7;
94          if (resto > 0) {
95              numLinhas++;
96          }
97  
98          log.debug(nomeMes + " " + ano);
99          log.debug("numero de dias do mês: " + numDias);
100         log.debug("primeiro dia da semana: " + numPrimeiroDiaMes);
101         log.debug("Linhas: " + numLinhas);
102 
103         setLayout(new GridLayout(numLinhas + 1, 7, 1, 1));
104         // adiciona ao grid o nome dos dias
105         for (int i = 0; i < 7; i++) {
106             add(new JLabel(dias[i]));
107         }
108 
109         // adiciona os dias "vazios"
110         if (numPrimeiroDiaMes > 1) {
111             for (int i = 0; i < numPrimeiroDiaMes - 1; i++) {
112                 add(new JLabel(""));
113             }
114         }
115         // adiciona os dias
116         for (int i = 0; i < numDias; i++) {
117             add(new JToggleButton(Integer.toString(i + 1)));
118         }
119 
120         setVisible(true);
121     }
122 }