# DatePicker

> Seleção de data num calendário mensal, com intervalo permitido opcional e retorno do dia escolhido.

Source: https://crossfly.dev/pt/docs/ui/widgets/datepicker — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# DatePicker

`DatePicker` seleciona uma **data** num calendário mensal, com navegação por mês, por ano e grades de seleção rápida de mês/ano. Segue o padrão dos pickers: devolve o valor via `getAnswer()` consumido por `show(onAnswer)` ao fechar (ver [`Picker`](/docs/ui/widgets/picker)).

> 🟡 · **Pacote:** `dev.crossfly.ui.picker` · **Estende:** `Picker` · **Estilo:** `DatePickerStyle`

## Quando usar
- Coletar uma data (aniversário, agendamento, vencimento) com UI de calendário.

## Quando NÃO usar
- Coletar hora → use [`TimePicker`](/docs/ui/widgets/timepicker).

## Aparência
Cartão com barra de título, linha de mês (`< Nome >`), linha de ano (`< 2026 >`) e uma grade de 6×7 células de dias. Dimensiona-se em ~90% de `Screen.minSize`.

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.picker.*;

/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Button abrir = new Button("Escolher data");
      abrir.onAction(c ->
      {
         DatePicker dp = new DatePicker().title("Data de nascimento");
         dp.show(answer -> Hint.show("Data: " + (String) answer, 2000));
      });
      add(LAY_AUTO, abrir);
   }
}
```

> Os trechos abaixo mostram **só o miolo** (o que vai dentro de `onShow()`). Para rodar, coloque-os no esqueleto `MainWindow` acima.

## Uso básico
```java
DatePicker dp = new DatePicker();
dp.show(answer -> campoData.setText((String) answer));
```

## Construtores
| Construtor | Descrição |
|---|---|
| `DatePicker()` | Sem parâmetros; inicia na data de hoje. |

## Propriedades e personalização (fluentes)
| Método | Tipo | Default | O que faz |
|---|---|---|---|
| `setDate(int year, int month, int day)` | ano, mês **0-based**, dia 1-based | hoje | Pré-seleciona a data. |
| `title(String)` | `String` | `"Date Picker"` | Texto da barra de título. |
| `yearRange(int before, int after)` | `int`, `int` | 30, 10 | Anos antes/depois para a grade de anos. |
| `style(DatePickerStyle)` | estilo | skin | Estilo customizado. |
| `getSelectedDay()` | `int` | — | Dia selecionado (1-based). |
| `getDisplayYear()` / `getDisplayMonth()` | `int` | — | Ano / mês exibidos (mês 0-based). |

## Callbacks e eventos
| Callback | Quando dispara |
|---|---|
| `onSelect(Action)` | ao tocar num dia (recebe o próprio `DatePicker`). |
| `show(onAnswer)` | ao fechar, entrega a `String` da data (se confirmada). |

`getAnswer()` retorna a data no formato de `DateTimeUtils.formatDate` — **a ordem (DMY/MDY/YMD) e o separador dependem de `LocaleFormats`**, não é fixo `dd/MM/yyyy`.

## Estados
- Navegar entre meses zera `selectedDay` para `-1` (nenhum dia marcado até o usuário escolher).
- Estilos por estado: hoje, selecionado, outro mês, normal (via `DatePickerStyle`).

### Data de nascimento
```java
DatePicker dp = new DatePicker()
   .title("Data de nascimento")
   .yearRange(100, 0)     // até 100 anos atrás, nenhum no futuro
   .setDate(2000, 0, 1);  // 01/Jan/2000 (mês 0-based!)

dp.onSelect(p ->
{
   DatePicker d = (DatePicker) p;
   Debug.log("dia=" + d.getSelectedDay() + " mes=" + (d.getDisplayMonth() + 1));
});

dp.show(answer ->
{
   String data = (String) answer; // ex.: "01/01/2000" conforme LocaleFormats
   campoData.setText(data);
});
```

## Boas práticas
- Lembre que **`month` é 0-based** em `setDate`.
- Para localizar nomes de meses/dias, reatribua as constantes públicas `MONTH_NAMES`/`MONTH_SHORT`.

## Erros comuns
- **Passar mês 1-based em `setDate`** — janeiro é `0`.
- **Esperar formato fixo** — a saída segue `LocaleFormats.dateFormat`/`dateSeparator`.
- **`yearRange` como clamp de seleção** — ele só limita a *navegação* de anos; qualquer dia do mês exibido é selecionável.

## Veja também
- Guia da área: [`ui/`](/docs/ui) · Receitas: [`cookbook/`](/docs/cookbook)
- Base do padrão: [`Picker`](/docs/ui/widgets/picker)
- Componentes relacionados: [`TimePicker`](/docs/ui/widgets/timepicker)
