/**
   * JCalendar constructor with month spinner parameter.
   *
   * @param date the date
   * @param locale the locale
   * @param monthSpinner false, if no month spinner should be used
   * @param weekOfYearVisible true, if weeks of year shall be visible
   */
  public JCalendar(Date date, Locale locale, boolean monthSpinner, boolean weekOfYearVisible) {
    // needed for setFont() etc.
    dayChooser = null;
    monthChooser = null;
    yearChooser = null;
    this.weekOfYearVisible = weekOfYearVisible;

    this.locale = locale;

    if (locale == null) {
      this.locale = Locale.getDefault();
    }

    Locale.setDefault(new Locale("ru", "RU"));
    calendar = Calendar.getInstance();

    setLayout(new BorderLayout());

    monthYearPanel = new JPanel();
    monthYearPanel.setLayout(new BorderLayout());

    monthChooser = new JMonthChooser(monthSpinner);
    yearChooser = new JYearChooser();
    monthChooser.setYearChooser(yearChooser);
    monthYearPanel.add(monthChooser, BorderLayout.WEST);
    monthYearPanel.add(yearChooser, BorderLayout.CENTER);
    monthYearPanel.setBorder(BorderFactory.createEmptyBorder());

    dayChooser = new JDayChooser(weekOfYearVisible);
    dayChooser.addPropertyChangeListener(this);
    monthChooser.setDayChooser(dayChooser);
    monthChooser.addPropertyChangeListener(this);
    yearChooser.setDayChooser(dayChooser);
    yearChooser.addPropertyChangeListener(this);
    add(monthYearPanel, BorderLayout.NORTH);
    add(dayChooser, BorderLayout.CENTER);

    // Set the initialized flag before setting the calendar. This will
    // cause the other components to be updated properly.
    if (date != null) {
      calendar.setTime(date);
    }

    initialized = true;
    setCalendar(calendar);
  }
  /**
   * Sets the foreground color.
   *
   * @param fg the new foreground
   */
  public void setForeground(Color fg) {
    super.setForeground(fg);

    if (dayChooser != null) {
      dayChooser.setForeground(fg);
      monthChooser.setForeground(fg);
      yearChooser.setForeground(fg);
    }
  }
  /**
   * Sets the font property.
   *
   * @param font the new font
   */
  public void setFont(Font font) {
    super.setFont(font);

    if (dayChooser != null) {
      dayChooser.setFont(font);
      monthChooser.setFont(font);
      yearChooser.setFont(font);
    }
  }
  /**
   * Enable or disable the JCalendar.
   *
   * @param enabled the new enabled value
   */
  public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);

    if (dayChooser != null) {
      dayChooser.setEnabled(enabled);
      monthChooser.setEnabled(enabled);
      yearChooser.setEnabled(enabled);
    }
  }
  /**
   * Sets the date. Fires the property change "date".
   *
   * @param date the new date.
   */
  public void setDate(Date date) {
    Date oldDate = calendar.getTime();
    calendar.setTime(date);

    yearChooser.setYear(calendar.get(Calendar.YEAR));
    monthChooser.setMonth(calendar.get(Calendar.MONTH));
    dayChooser.setDay(calendar.get(Calendar.DATE));

    firePropertyChange("date", oldDate, date);
  }
  /**
   * Sets the calendar attribute of the JCalendar object
   *
   * @param c the new calendar value
   * @param update the new calendar value
   */
  private void setCalendar(Calendar c, boolean update) {
    Calendar oldCalendar = calendar;
    calendar = c;

    if (update) {
      // Thanks to Jeff Ulmer for correcting a bug in the sequence :)
      yearChooser.setYear(c.get(Calendar.YEAR));
      monthChooser.setMonth(c.get(Calendar.MONTH));
      dayChooser.setDay(c.get(Calendar.DATE));
    }

    firePropertyChange("calendar", oldCalendar, calendar);
  }