Преглед на файлове

Add a test for automoc

The files are taken from the Qt examples. They are BSD licensed, so it
should be fine. I only edited main.cpp to use both widgets.

Alex
Alex Neundorf преди 14 години
родител
ревизия
bf8ef778a3
променени са 7 файла, в които са добавени 893 реда и са изтрити 0 реда
  1. 18 0
      Tests/CMakeLists.txt
  2. 20 0
      Tests/QtAutomoc/CMakeLists.txt
  3. 424 0
      Tests/QtAutomoc/calwidget.cpp
  4. 121 0
      Tests/QtAutomoc/calwidget.h
  5. 153 0
      Tests/QtAutomoc/codeeditor.cpp
  6. 99 0
      Tests/QtAutomoc/codeeditor.h
  7. 58 0
      Tests/QtAutomoc/main.cpp

+ 18 - 0
Tests/CMakeLists.txt

@@ -840,6 +840,24 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
     )
   LIST(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Environment")
 
+  IF(NOT QT4_FOUND)
+    FIND_PACKAGE(Qt4)
+    IF(QT4_FOUND)
+      ADD_TEST(QtAutomoc ${CMAKE_CTEST_COMMAND}
+        --build-and-test
+        "${CMake_SOURCE_DIR}/Tests/QtAutomoc"
+        "${CMake_BINARY_DIR}/Tests/QtAutomoc"
+        --build-generator ${CMAKE_TEST_GENERATOR}
+        --build-project QtAutomoc
+        --build-makeprogram ${CMAKE_TEST_MAKEPROGRAM}
+        --build-exe-dir "${CMake_BINARY_DIR}/Tests/QtAutomoc"
+        --force-new-ctest-process
+        --test-command ${CMAKE_CTEST_COMMAND} -V
+        )
+      LIST(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/QtAutomoc")
+    ENDIF()
+  ENDIF(NOT QT4_FOUND)
+
   ADD_TEST(ExternalProject ${CMAKE_CTEST_COMMAND}
     --build-and-test
     "${CMake_SOURCE_DIR}/Tests/ExternalProject"

+ 20 - 0
Tests/QtAutomoc/CMakeLists.txt

@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 2.8)
+
+project(QtAutomoc)
+
+find_package(Qt4 REQUIRED)
+
+include(UseQt4)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+add_definitions(-DFOO)
+
+# create an executable and a library target, both requiring automoc:
+add_library(codeeditorLib STATIC codeeditor.cpp)
+
+add_executable(foo main.cpp calwidget.cpp )
+
+set_target_properties(foo codeeditorLib PROPERTIES AUTOMOC TRUE)
+
+target_link_libraries(foo codeeditorLib ${QT_LIBRARIES} )

+ 424 - 0
Tests/QtAutomoc/calwidget.cpp

@@ -0,0 +1,424 @@
+/****************************************************************************
+ **
+ ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation ([email protected])
+ **
+ ** 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 <QtGui>
+
+ #include "calwidget.h"
+
+ Window::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"), Qt::red);
+     comboBox->addItem(tr("Blue"), Qt::blue);
+     comboBox->addItem(tr("Black"), Qt::black);
+     comboBox->addItem(tr("Magenta"), Qt::magenta);
+     return comboBox;
+ }
+
+//#include "moc_calwidget.cpp"

+ 121 - 0
Tests/QtAutomoc/calwidget.h

@@ -0,0 +1,121 @@
+ /****************************************************************************
+ **
+ ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation ([email protected])
+ **
+ ** 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$
+ **
+ ****************************************************************************/
+
+#ifndef WINDOW_H
+#define WINDOW_H
+
+#include <QWidget>
+
+ class QCalendarWidget;
+ class QCheckBox;
+ class QComboBox;
+ class QDate;
+ class QDateEdit;
+ class QGridLayout;
+ class QGroupBox;
+ class QLabel;
+
+ class Window : public QWidget
+ {
+     Q_OBJECT
+
+ public:
+     Window();
+
+ private slots:
+     void localeChanged(int index);
+     void firstDayChanged(int index);
+     void selectionModeChanged(int index);
+     void horizontalHeaderChanged(int index);
+     void verticalHeaderChanged(int index);
+     void selectedDateChanged();
+     void minimumDateChanged(const QDate &date);
+     void maximumDateChanged(const QDate &date);
+     void weekdayFormatChanged();
+     void weekendFormatChanged();
+     void reformatHeaders();
+     void reformatCalendarPage();
+
+ private:
+     void createPreviewGroupBox();
+     void createGeneralOptionsGroupBox();
+     void createDatesGroupBox();
+     void createTextFormatsGroupBox();
+     QComboBox *createColorComboBox();
+
+     QGroupBox *previewGroupBox;
+     QGridLayout *previewLayout;
+     QCalendarWidget *calendar;
+
+     QGroupBox *generalOptionsGroupBox;
+     QLabel *localeLabel;
+     QLabel *firstDayLabel;
+     QLabel *selectionModeLabel;
+     QLabel *horizontalHeaderLabel;
+     QLabel *verticalHeaderLabel;
+     QComboBox *localeCombo;
+     QComboBox *firstDayCombo;
+     QComboBox *selectionModeCombo;
+     QCheckBox *gridCheckBox;
+     QCheckBox *navigationCheckBox;
+     QComboBox *horizontalHeaderCombo;
+     QComboBox *verticalHeaderCombo;
+
+     QGroupBox *datesGroupBox;
+     QLabel *currentDateLabel;
+     QLabel *minimumDateLabel;
+     QLabel *maximumDateLabel;
+     QDateEdit *currentDateEdit;
+     QDateEdit *minimumDateEdit;
+     QDateEdit *maximumDateEdit;
+
+     QGroupBox *textFormatsGroupBox;
+     QLabel *weekdayColorLabel;
+     QLabel *weekendColorLabel;
+     QLabel *headerTextFormatLabel;
+     QComboBox *weekdayColorCombo;
+     QComboBox *weekendColorCombo;
+     QComboBox *headerTextFormatCombo;
+
+     QCheckBox *firstFridayCheckBox;
+     QCheckBox *mayFirstCheckBox;
+ };
+
+ #endif

+ 153 - 0
Tests/QtAutomoc/codeeditor.cpp

@@ -0,0 +1,153 @@
+/****************************************************************************
+ **
+ ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation ([email protected])
+ **
+ ** 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 <QtGui>
+
+ #include "codeeditor.h"
+
+
+ CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent)
+ {
+     lineNumberArea = new LineNumberArea(this);
+
+     connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
+     connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int)));
+     connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine()));
+
+     updateLineNumberAreaWidth(0);
+     highlightCurrentLine();
+ }
+
+
+
+ int CodeEditor::lineNumberAreaWidth()
+ {
+     int digits = 1;
+     int max = qMax(1, blockCount());
+     while (max >= 10) {
+         max /= 10;
+         ++digits;
+     }
+
+     int space = 3 + fontMetrics().width(QLatin1Char('9')) * digits;
+
+     return space;
+ }
+
+
+
+ void CodeEditor::updateLineNumberAreaWidth(int /* newBlockCount */)
+ {
+     setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
+ }
+
+
+
+ void CodeEditor::updateLineNumberArea(const QRect &rect, int dy)
+ {
+     if (dy)
+         lineNumberArea->scroll(0, dy);
+     else
+         lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height());
+
+     if (rect.contains(viewport()->rect()))
+         updateLineNumberAreaWidth(0);
+ }
+
+
+
+ void CodeEditor::resizeEvent(QResizeEvent *e)
+ {
+     QPlainTextEdit::resizeEvent(e);
+
+     QRect cr = contentsRect();
+     lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
+ }
+
+
+
+ void CodeEditor::highlightCurrentLine()
+ {
+     QList<QTextEdit::ExtraSelection> extraSelections;
+
+     if (!isReadOnly()) {
+         QTextEdit::ExtraSelection selection;
+
+         QColor lineColor = QColor(Qt::yellow).lighter(160);
+
+         selection.format.setBackground(lineColor);
+         selection.format.setProperty(QTextFormat::FullWidthSelection, true);
+         selection.cursor = textCursor();
+         selection.cursor.clearSelection();
+         extraSelections.append(selection);
+     }
+
+     setExtraSelections(extraSelections);
+ }
+
+
+
+ void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event)
+ {
+     QPainter painter(lineNumberArea);
+     painter.fillRect(event->rect(), Qt::lightGray);
+
+
+     QTextBlock block = firstVisibleBlock();
+     int blockNumber = block.blockNumber();
+     int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();
+     int bottom = top + (int) blockBoundingRect(block).height();
+
+     while (block.isValid() && top <= event->rect().bottom()) {
+         if (block.isVisible() && bottom >= event->rect().top()) {
+             QString number = QString::number(blockNumber + 1);
+             painter.setPen(Qt::black);
+             painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
+                              Qt::AlignRight, number);
+         }
+
+         block = block.next();
+         top = bottom;
+         bottom = top + (int) blockBoundingRect(block).height();
+         ++blockNumber;
+     }
+ }
+
+#include "codeeditor.moc"

+ 99 - 0
Tests/QtAutomoc/codeeditor.h

@@ -0,0 +1,99 @@
+ /****************************************************************************
+ **
+ ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation ([email protected])
+ **
+ ** 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$
+ **
+ ****************************************************************************/
+
+ #ifndef CODEEDITOR_H
+ #define CODEEDITOR_H
+
+ #include <QPlainTextEdit>
+ #include <QObject>
+
+ class QPaintEvent;
+ class QResizeEvent;
+ class QSize;
+ class QWidget;
+
+ class LineNumberArea;
+
+
+ class CodeEditor : public QPlainTextEdit
+ {
+     Q_OBJECT
+
+ public:
+     CodeEditor(QWidget *parent = 0);
+
+     void lineNumberAreaPaintEvent(QPaintEvent *event);
+     int lineNumberAreaWidth();
+
+ protected:
+     void resizeEvent(QResizeEvent *event);
+
+ private slots:
+     void updateLineNumberAreaWidth(int newBlockCount);
+     void highlightCurrentLine();
+     void updateLineNumberArea(const QRect &, int);
+
+ private:
+     QWidget *lineNumberArea;
+ };
+
+
+ class LineNumberArea : public QWidget
+ {
+ public:
+     LineNumberArea(CodeEditor *editor) : QWidget(editor) {
+         codeEditor = editor;
+     }
+
+     QSize sizeHint() const {
+         return QSize(codeEditor->lineNumberAreaWidth(), 0);
+     }
+
+ protected:
+     void paintEvent(QPaintEvent *event) {
+         codeEditor->lineNumberAreaPaintEvent(event);
+     }
+
+ private:
+     CodeEditor *codeEditor;
+ };
+
+
+ #endif

+ 58 - 0
Tests/QtAutomoc/main.cpp

@@ -0,0 +1,58 @@
+/****************************************************************************
+ **
+ ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation ([email protected])
+ **
+ ** 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 <QtGui>
+
+#include "codeeditor.h"
+#include "calwidget.h"
+
+int main(int argv, char **args)
+{
+  QApplication app(argv, args);
+
+  CodeEditor editor;
+  editor.setWindowTitle(QObject::tr("Code Editor Example"));
+  editor.show();
+
+  Window w;
+  w.show();
+
+  return app.exec();
+}