/****************************************************************************
 **
 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
 ** This file is part of the examples of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:BSD$
 ** You may use this file under the terms of the BSD license as follows:
 **
 ** "Redistribution and use in source and binary forms, with or without
 ** modification, are permitted provided that the following conditions are
 ** met:
 **   * Redistributions of source code must retain the above copyright
 **     notice, this list of conditions and the following disclaimer.
 **   * Redistributions in binary form must reproduce the above copyright
 **     notice, this list of conditions and the following disclaimer in
 **     the documentation and/or other materials provided with the
 **     distribution.
 **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
 **     the names of its contributors may be used to endorse or promote
 **     products derived from this software without specific prior written
 **     permission.
 **
 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/

 #include <QComboBox>
 #include <QGridLayout>
 #include <QLabel>
 #include <QGroupBox>
 #include <QCheckBox>
 #include <QDateEdit>
 #include <QCalendarWidget>
 #include <QTextCharFormat>

 #include "calwidget.h"

 #include "ui_calwidget.h"

 Window::Window()
  : ui(new Ui::Window)
 {
     createPreviewGroupBox();
     createGeneralOptionsGroupBox();
     createDatesGroupBox();
     createTextFormatsGroupBox();

     QGridLayout *layout = new QGridLayout;
     layout->addWidget(previewGroupBox, 0, 0);
     layout->addWidget(generalOptionsGroupBox, 0, 1);
     layout->addWidget(datesGroupBox, 1, 0);
     layout->addWidget(textFormatsGroupBox, 1, 1);
     layout->setSizeConstraint(QLayout::SetFixedSize);
     setLayout(layout);

     previewLayout->setRowMinimumHeight(0, calendar->sizeHint().height());
     previewLayout->setColumnMinimumWidth(0, calendar->sizeHint().width());

     setWindowTitle(tr("Calendar Widget"));
 }

 void Window::localeChanged(int index)
 {
     calendar->setLocale(localeCombo->itemData(index).toLocale());
 }

 void Window::firstDayChanged(int index)
 {
     calendar->setFirstDayOfWeek(Qt::DayOfWeek(
                                 firstDayCombo->itemData(index).toInt()));
 }

 void Window::selectionModeChanged(int index)
 {
     calendar->setSelectionMode(QCalendarWidget::SelectionMode(
                                selectionModeCombo->itemData(index).toInt()));
 }

 void Window::horizontalHeaderChanged(int index)
 {
     calendar->setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat(
         horizontalHeaderCombo->itemData(index).toInt()));
 }

 void Window::verticalHeaderChanged(int index)
 {
     calendar->setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat(
         verticalHeaderCombo->itemData(index).toInt()));
 }

 void Window::selectedDateChanged()
 {
     currentDateEdit->setDate(calendar->selectedDate());
 }

 void Window::minimumDateChanged(const QDate &date)
 {
     calendar->setMinimumDate(date);
     maximumDateEdit->setDate(calendar->maximumDate());
 }

 void Window::maximumDateChanged(const QDate &date)
 {
     calendar->setMaximumDate(date);
     minimumDateEdit->setDate(calendar->minimumDate());
 }

 void Window::weekdayFormatChanged()
 {
     QTextCharFormat format;

     format.setForeground(qvariant_cast<QColor>(
         weekdayColorCombo->itemData(weekdayColorCombo->currentIndex())));
     calendar->setWeekdayTextFormat(Qt::Monday, format);
     calendar->setWeekdayTextFormat(Qt::Tuesday, format);
     calendar->setWeekdayTextFormat(Qt::Wednesday, format);
     calendar->setWeekdayTextFormat(Qt::Thursday, format);
     calendar->setWeekdayTextFormat(Qt::Friday, format);
 }

 void Window::weekendFormatChanged()
 {
     QTextCharFormat format;

     format.setForeground(qvariant_cast<QColor>(
         weekendColorCombo->itemData(weekendColorCombo->currentIndex())));
     calendar->setWeekdayTextFormat(Qt::Saturday, format);
     calendar->setWeekdayTextFormat(Qt::Sunday, format);
 }

 void Window::reformatHeaders()
 {
     QString text = headerTextFormatCombo->currentText();
     QTextCharFormat format;

     if (text == tr("Bold")) {
         format.setFontWeight(QFont::Bold);
     } else if (text == tr("Italic")) {
         format.setFontItalic(true);
     } else if (text == tr("Green")) {
         format.setForeground(Qt::green);
     }
     calendar->setHeaderTextFormat(format);
 }

 void Window::reformatCalendarPage()
 {
     if (firstFridayCheckBox->isChecked()) {
         QDate firstFriday(calendar->yearShown(), calendar->monthShown(), 1);
         while (firstFriday.dayOfWeek() != Qt::Friday)
             firstFriday = firstFriday.addDays(1);
         QTextCharFormat firstFridayFormat;
         firstFridayFormat.setForeground(Qt::blue);
         calendar->setDateTextFormat(firstFriday, firstFridayFormat);
     }

     //May First in Red takes precedence
     if (mayFirstCheckBox->isChecked()) {
         const QDate mayFirst(calendar->yearShown(), 5, 1);
         QTextCharFormat mayFirstFormat;
         mayFirstFormat.setForeground(Qt::red);
         calendar->setDateTextFormat(mayFirst, mayFirstFormat);
     }
 }

 void Window::createPreviewGroupBox()
 {
     previewGroupBox = new QGroupBox(tr("Preview"));

     calendar = new QCalendarWidget;
     calendar->setMinimumDate(QDate(1900, 1, 1));
     calendar->setMaximumDate(QDate(3000, 1, 1));
     calendar->setGridVisible(true);

     connect(calendar, SIGNAL(currentPageChanged(int,int)),
             this, SLOT(reformatCalendarPage()));

     previewLayout = new QGridLayout;
     previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter);
     previewGroupBox->setLayout(previewLayout);
 }

 void Window::createGeneralOptionsGroupBox()
 {
     generalOptionsGroupBox = new QGroupBox(tr("General Options"));

     localeCombo = new QComboBox;
     int curLocaleIndex = -1;
     int index = 0;
     for (int _lang = QLocale::C; _lang <= QLocale::LastLanguage; ++_lang) {
         QLocale::Language lang = static_cast<QLocale::Language>(_lang);
         QList<QLocale::Country> countries = QLocale::countriesForLanguage(lang);
         for (int i = 0; i < countries.count(); ++i) {
             QLocale::Country country = countries.at(i);
             QString label = QLocale::languageToString(lang);
             label += QLatin1Char('/');
             label += QLocale::countryToString(country);
             QLocale locale(lang, country);
             if (this->locale().language() == lang && this->locale().country() == country)
                 curLocaleIndex = index;
             localeCombo->addItem(label, locale);
             ++index;
         }
     }
     if (curLocaleIndex != -1)
         localeCombo->setCurrentIndex(curLocaleIndex);
     localeLabel = new QLabel(tr("&Locale"));
     localeLabel->setBuddy(localeCombo);

     firstDayCombo = new QComboBox;
     firstDayCombo->addItem(tr("Sunday"), Qt::Sunday);
     firstDayCombo->addItem(tr("Monday"), Qt::Monday);
     firstDayCombo->addItem(tr("Tuesday"), Qt::Tuesday);
     firstDayCombo->addItem(tr("Wednesday"), Qt::Wednesday);
     firstDayCombo->addItem(tr("Thursday"), Qt::Thursday);
     firstDayCombo->addItem(tr("Friday"), Qt::Friday);
     firstDayCombo->addItem(tr("Saturday"), Qt::Saturday);

     firstDayLabel = new QLabel(tr("Wee&k starts on:"));
     firstDayLabel->setBuddy(firstDayCombo);

     selectionModeCombo = new QComboBox;
     selectionModeCombo->addItem(tr("Single selection"),
                                 QCalendarWidget::SingleSelection);
     selectionModeCombo->addItem(tr("None"), QCalendarWidget::NoSelection);

     selectionModeLabel = new QLabel(tr("&Selection mode:"));
     selectionModeLabel->setBuddy(selectionModeCombo);

     gridCheckBox = new QCheckBox(tr("&Grid"));
     gridCheckBox->setChecked(calendar->isGridVisible());

     navigationCheckBox = new QCheckBox(tr("&Navigation bar"));
     navigationCheckBox->setChecked(true);

     horizontalHeaderCombo = new QComboBox;
     horizontalHeaderCombo->addItem(tr("Single letter day names"),
                                    QCalendarWidget::SingleLetterDayNames);
     horizontalHeaderCombo->addItem(tr("Short day names"),
                                    QCalendarWidget::ShortDayNames);
     horizontalHeaderCombo->addItem(tr("None"),
                                    QCalendarWidget::NoHorizontalHeader);
     horizontalHeaderCombo->setCurrentIndex(1);

     horizontalHeaderLabel = new QLabel(tr("&Horizontal header:"));
     horizontalHeaderLabel->setBuddy(horizontalHeaderCombo);

     verticalHeaderCombo = new QComboBox;
     verticalHeaderCombo->addItem(tr("ISO week numbers"),
                                  QCalendarWidget::ISOWeekNumbers);
     verticalHeaderCombo->addItem(tr("None"), QCalendarWidget::NoVerticalHeader);

     verticalHeaderLabel = new QLabel(tr("&Vertical header:"));
     verticalHeaderLabel->setBuddy(verticalHeaderCombo);

     connect(localeCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(localeChanged(int)));
     connect(firstDayCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(firstDayChanged(int)));
     connect(selectionModeCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(selectionModeChanged(int)));
     connect(gridCheckBox, SIGNAL(toggled(bool)),
             calendar, SLOT(setGridVisible(bool)));
     connect(navigationCheckBox, SIGNAL(toggled(bool)),
             calendar, SLOT(setNavigationBarVisible(bool)));
     connect(horizontalHeaderCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(horizontalHeaderChanged(int)));
     connect(verticalHeaderCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(verticalHeaderChanged(int)));

     QHBoxLayout *checkBoxLayout = new QHBoxLayout;
     checkBoxLayout->addWidget(gridCheckBox);
     checkBoxLayout->addStretch();
     checkBoxLayout->addWidget(navigationCheckBox);

     QGridLayout *outerLayout = new QGridLayout;
     outerLayout->addWidget(localeLabel, 0, 0);
     outerLayout->addWidget(localeCombo, 0, 1);
     outerLayout->addWidget(firstDayLabel, 1, 0);
     outerLayout->addWidget(firstDayCombo, 1, 1);
     outerLayout->addWidget(selectionModeLabel, 2, 0);
     outerLayout->addWidget(selectionModeCombo, 2, 1);
     outerLayout->addLayout(checkBoxLayout, 3, 0, 1, 2);
     outerLayout->addWidget(horizontalHeaderLabel, 4, 0);
     outerLayout->addWidget(horizontalHeaderCombo, 4, 1);
     outerLayout->addWidget(verticalHeaderLabel, 5, 0);
     outerLayout->addWidget(verticalHeaderCombo, 5, 1);
     generalOptionsGroupBox->setLayout(outerLayout);

     firstDayChanged(firstDayCombo->currentIndex());
     selectionModeChanged(selectionModeCombo->currentIndex());
     horizontalHeaderChanged(horizontalHeaderCombo->currentIndex());
     verticalHeaderChanged(verticalHeaderCombo->currentIndex());
 }

 void Window::createDatesGroupBox()
 {
     datesGroupBox = new QGroupBox(tr("Dates"));

     minimumDateEdit = new QDateEdit;
     minimumDateEdit->setDisplayFormat("MMM d yyyy");
     minimumDateEdit->setDateRange(calendar->minimumDate(),
                                   calendar->maximumDate());
     minimumDateEdit->setDate(calendar->minimumDate());

     minimumDateLabel = new QLabel(tr("&Minimum Date:"));
     minimumDateLabel->setBuddy(minimumDateEdit);

     currentDateEdit = new QDateEdit;
     currentDateEdit->setDisplayFormat("MMM d yyyy");
     currentDateEdit->setDate(calendar->selectedDate());
     currentDateEdit->setDateRange(calendar->minimumDate(),
                                   calendar->maximumDate());

     currentDateLabel = new QLabel(tr("&Current Date:"));
     currentDateLabel->setBuddy(currentDateEdit);

     maximumDateEdit = new QDateEdit;
     maximumDateEdit->setDisplayFormat("MMM d yyyy");
     maximumDateEdit->setDateRange(calendar->minimumDate(),
                                   calendar->maximumDate());
     maximumDateEdit->setDate(calendar->maximumDate());

     maximumDateLabel = new QLabel(tr("Ma&ximum Date:"));
     maximumDateLabel->setBuddy(maximumDateEdit);

     connect(currentDateEdit, SIGNAL(dateChanged(QDate)),
             calendar, SLOT(setSelectedDate(QDate)));
     connect(calendar, SIGNAL(selectionChanged()),
             this, SLOT(selectedDateChanged()));
     connect(minimumDateEdit, SIGNAL(dateChanged(QDate)),
             this, SLOT(minimumDateChanged(QDate)));
     connect(maximumDateEdit, SIGNAL(dateChanged(QDate)),
             this, SLOT(maximumDateChanged(QDate)));

     QGridLayout *dateBoxLayout = new QGridLayout;
     dateBoxLayout->addWidget(currentDateLabel, 1, 0);
     dateBoxLayout->addWidget(currentDateEdit, 1, 1);
     dateBoxLayout->addWidget(minimumDateLabel, 0, 0);
     dateBoxLayout->addWidget(minimumDateEdit, 0, 1);
     dateBoxLayout->addWidget(maximumDateLabel, 2, 0);
     dateBoxLayout->addWidget(maximumDateEdit, 2, 1);
     dateBoxLayout->setRowStretch(3, 1);

     datesGroupBox->setLayout(dateBoxLayout);
 }

 void Window::createTextFormatsGroupBox()
 {
     textFormatsGroupBox = new QGroupBox(tr("Text Formats"));

     weekdayColorCombo = createColorComboBox();
     weekdayColorCombo->setCurrentIndex(
             weekdayColorCombo->findText(tr("Black")));

     weekdayColorLabel = new QLabel(tr("&Weekday color:"));
     weekdayColorLabel->setBuddy(weekdayColorCombo);

     weekendColorCombo = createColorComboBox();
     weekendColorCombo->setCurrentIndex(
             weekendColorCombo->findText(tr("Red")));

     weekendColorLabel = new QLabel(tr("Week&end color:"));
     weekendColorLabel->setBuddy(weekendColorCombo);

     headerTextFormatCombo = new QComboBox;
     headerTextFormatCombo->addItem(tr("Bold"));
     headerTextFormatCombo->addItem(tr("Italic"));
     headerTextFormatCombo->addItem(tr("Plain"));

     headerTextFormatLabel = new QLabel(tr("&Header text:"));
     headerTextFormatLabel->setBuddy(headerTextFormatCombo);

     firstFridayCheckBox = new QCheckBox(tr("&First Friday in blue"));

     mayFirstCheckBox = new QCheckBox(tr("May &1 in red"));

     connect(weekdayColorCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(weekdayFormatChanged()));
     connect(weekendColorCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(weekendFormatChanged()));
     connect(headerTextFormatCombo, SIGNAL(currentIndexChanged(QString)),
             this, SLOT(reformatHeaders()));
     connect(firstFridayCheckBox, SIGNAL(toggled(bool)),
             this, SLOT(reformatCalendarPage()));
     connect(mayFirstCheckBox, SIGNAL(toggled(bool)),
             this, SLOT(reformatCalendarPage()));

     QHBoxLayout *checkBoxLayout = new QHBoxLayout;
     checkBoxLayout->addWidget(firstFridayCheckBox);
     checkBoxLayout->addStretch();
     checkBoxLayout->addWidget(mayFirstCheckBox);

     QGridLayout *outerLayout = new QGridLayout;
     outerLayout->addWidget(weekdayColorLabel, 0, 0);
     outerLayout->addWidget(weekdayColorCombo, 0, 1);
     outerLayout->addWidget(weekendColorLabel, 1, 0);
     outerLayout->addWidget(weekendColorCombo, 1, 1);
     outerLayout->addWidget(headerTextFormatLabel, 2, 0);
     outerLayout->addWidget(headerTextFormatCombo, 2, 1);
     outerLayout->addLayout(checkBoxLayout, 3, 0, 1, 2);
     textFormatsGroupBox->setLayout(outerLayout);

     weekdayFormatChanged();
     weekendFormatChanged();
     reformatHeaders();
     reformatCalendarPage();
 }

QComboBox *Window::createColorComboBox()
 {
     QComboBox *comboBox = new QComboBox;
     comboBox->addItem(tr("Red"), QColor(Qt::red));
     comboBox->addItem(tr("Blue"), QColor(Qt::blue));
     comboBox->addItem(tr("Black"), QColor(Qt::black));
     comboBox->addItem(tr("Magenta"), QColor(Qt::magenta));
     return comboBox;
 }

//#include "moc_calwidget.cpp"
