Calendar and Calcilator muved into src/lib.
authorDmintriy L. Kruglikov <master@shadow.breg.pl.ua>
Mon, 23 Jun 2008 15:30:25 +0000 (18:30 +0300)
committerDmintriy L. Kruglikov <master@shadow.breg.pl.ua>
Mon, 23 Jun 2008 15:30:25 +0000 (18:30 +0300)
Patched bugs in Calendar.
Added Menu->Tools-> Calendar and Calculator

src/ananas/ananas.pro
src/ananas/ananasmainform.cpp
src/ananas/ananasmainform.h
src/ananas/images/calendar.png [new file with mode: 0644]
src/lib/acalendar.cpp [new file with mode: 0644]
src/lib/acalendar.h [new file with mode: 0644]
src/lib/aminicalc.cpp [moved from src/ananas/aminicalc.cpp with 100% similarity]
src/lib/aminicalc.h [moved from src/ananas/aminicalc.h with 100% similarity]
src/plugins/wfield.cpp

index e9a7575..9888838 100644 (file)
@@ -3,10 +3,8 @@ TARGET = ananas
 include ( ../ananas.pri )
 
 SOURCES        += main.cpp \
-       ananasmainform.cpp \
-       aminicalc.cpp
-HEADERS        += ananasmainform.h \
-          aminicalc.h
+       ananasmainform.cpp
+HEADERS        += ananasmainform.h
 
 #load(qsa)
 
@@ -29,7 +27,8 @@ INSTALLS += ananas
 
 #FORMS = qadocjournal.ui
 IMAGES = images/a-system.png \
-       images/calc.png \
+         images/calc.png \
+         images/calendar.png \
        images/msg_info.png \
        images/msg_warning.png \
        images/msg_error.png \
index 1fec864..6a72de1 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "ananas.h"
 #include "aminicalc.h"
+#include "ananas.h"
 
 MainForm *mainform=NULL;
 QWorkspace *mainformws=NULL;
@@ -132,6 +133,7 @@ MainForm::initMenuBar()
             this, SLOT( windowsMenuAboutToShow() ) );
        m->insertItem(rcIcon("ananas-32x32.png"), tr( "About" ), this, SLOT( helpAbout() ), Key_F11);
        s->insertItem(rcIcon("calc.png"), tr( "Calculator" ), this, SLOT( miniCalc() ), Key_F10);
+       s->insertItem(rcIcon("calendar.png"), tr( "Calendar" ), this, SLOT( ShowCalendar() ), Key_F12);
        //windowsMenu->insertItem(rcIcon("ananas-32x32.png"), tr( "Windows" ), this, SLOT( windowsMenuAboutToShow() ));
         menubar = new AMenuBar( md, this, "menubar");
        InsertMainMenu( tr("&Tools"), s );
@@ -322,3 +324,14 @@ MainForm::miniCalc()
        MiniCalc *calc = new MiniCalc(ws, "MiniCalc", false, 0);
        calc->show();
 }
+
+/*
+ *  Open a Calendar
+ */
+void
+MainForm::ShowCalendar()
+{
+       PopupCalendar *calendar = new PopupCalendar(QDate::currentDate(),
+                              QPoint(ws->width() / 2, ws->height() / 2 ), ws, "");
+       calendar->show();
+}
index 189f614..f4af300 100644 (file)
@@ -46,7 +46,8 @@
 #include "atoolbar.h"
 #include "awindowslist.h"
 #include "engine.h"
-
+#include "aminicalc.h"
+#include "acalendar.h"
 
 class QVBoxLayout;
 class QHBoxLayout;
@@ -76,6 +77,8 @@ public:
        QPopupMenu *windowsMenu;
        QWorkspace* ws;
        aWindowsList* wl;
+       MiniCalc* calc;
+       PopupCalendar* calendar;
        QString rcfile;
 
 public slots:
@@ -88,6 +91,8 @@ public slots:
        void Exit(int code);
        void close();
        void helpAbout();
+       void miniCalc();
+       void ShowCalendar();
        void statusMessage( const QString &msg );
        void windowsMenuAboutToShow();
        void windowsMenuActivated( int id );
diff --git a/src/ananas/images/calendar.png b/src/ananas/images/calendar.png
new file mode 100644 (file)
index 0000000..cb1f845
Binary files /dev/null and b/src/ananas/images/calendar.png differ
diff --git a/src/lib/acalendar.cpp b/src/lib/acalendar.cpp
new file mode 100644 (file)
index 0000000..240e571
--- /dev/null
@@ -0,0 +1,246 @@
+/****************************************************************************
+** $Id: acalendar.dkr,v 1.73 2008/06/09 11:45:27 app Exp $
+**
+**********************************************************************/
+
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <qdom.h>
+#include <qvalidator.h>
+#include <qlabel.h>
+#include <qsizepolicy.h>
+#include <qevent.h>
+#include <qpainter.h>
+
+#include "ananas.h"
+#include "alog.h"
+#include "acalendar.h"
+
+
+/**
+ * \ru
+ *     \brief Запрашивает дату у пользователя, показав ему календарик.
+ *     \return дату, указанную пользователем.
+ * \_ru
+ */
+QDate
+PopupCalendar::getDate(QWidget *parent, const QDate &day, QPoint pos)
+{
+       PopupCalendar *calendar = new PopupCalendar(day, pos, parent);
+       calendar->exec();
+       QDate date = calendar->day();
+       delete calendar;
+       return date;
+}
+
+
+/**
+ * \ru
+ *     \brief Осуществляет отрисовку календарика, обрабатывая событие PaintEvent виджета PopupCalendar.
+ * \_ru
+ */
+void
+PopupCalendar::paintEvent(QPaintEvent *event)
+{
+       QPainter painter(this);
+       painter.setClipRegion(event->region());
+       painter.setFont(smallFont);
+       int w = width();// Ширина окна
+       int h = height(); // Высота окна
+       int dayw = w / COLS; // Ширина ячейки
+       int dayh = h / (ROWS + 2); // Высота ячейки
+
+       QRect rect;
+       QColor color = colorGroup().light();
+       QColor f_color = "red";
+       QColor g_color = "green";
+       QColor b_color = "blue";
+       // Формируем строку с годом и месяцем
+       painter.fillRect(1, 1, dayw - 2, dayh - 1, color);
+       painter.drawText(1, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString("<< "), -1, &rect);
+       painter.fillRect(dayw, 1, dayw - 2, dayh - 1, color);
+       painter.drawText(dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" < "), -1, &rect);
+       painter.drawText(dayw*2+1, 1, dayw*3- 1, dayh - 1, AlignHCenter, today.toString("MMM, yyyy"), -1, &rect);
+       painter.fillRect(w-(dayw*2), 1, dayw - 2, dayh - 1, color);
+       painter.drawText(w-(dayw*2), 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" > "), -1, &rect);
+       painter.fillRect(w-dayw, 1, dayw - 2, dayh - 1, color);
+       painter.drawText(w-dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" >>"), -1, &rect);
+
+// Формируем строку с днями недели
+       int i;
+       int y = dayh;
+       for (i = 0; i < 7; i++) {
+
+               painter.drawText(dayw * i + 1, y, dayw, dayh - 1,
+                                AlignHCenter, QDate::shortDayName(i+1), -1, &rect);
+       }
+
+       // Заплняем таблицу календаря
+       QDate day(today.year(), today.month(), 1);
+       int day_pos = day.dayOfWeek()-1;
+       day = day.addDays(-day_pos);
+       y += dayh;
+       for (int j = 0; j < ROWS-1; ++j)
+               for (i = 0; i < COLS; ++i) {
+               color = (day == today) ? colorGroup().light() : ( ( i < 5 ) ? colorGroup().light() : colorGroup().midlight());
+               if (day == today){
+                       painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, b_color);
+                       painter.fillRect(dayw * i + 3, dayh * j + y + 3, dayw - 5, dayh - 5, color);
+               }else{
+                       painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, color);
+               }
+               (today.month() != day.month() )?  painter.setPen(colorGroup().mid()): ( ( i < 5 ) ? painter.setPen(colorGroup().foreground()):painter.setPen(f_color));
+               painter.drawText(dayw * i + 2, dayh * j + y + 2, dayw, dayh, AlignTop|AlignHCenter, day.toString("d"));
+               day = day.addDays(1);
+               }
+       // Формируем последнюю строку
+               painter.fillRect(1, h - dayh - 1, dayw*2, dayh - 1, b_color);
+               painter.fillRect(3, h - dayh + 1, dayw*2-4, dayh - 5, color);
+               painter.setPen(colorGroup().foreground());
+               painter.drawText(2, h - dayh, dayw*2-2, dayh - 3, AlignTop|AlignHCenter, "Now");
+               painter.drawText(w - dayw*3, h - dayh, dayw*3-2, dayh - 1, AlignTop|AlignHCenter, QString(tr("Week: %1").arg(today.weekNumber())));
+}
+
+/**
+ * \ru
+ *     \brief  Обрабатывает пользовательские действия по выбору даты в календарике.
+ *
+ *     Записывает значение выбранной пользователем даты в свойство виджета.
+ *
+ * \_ru
+ */
+void
+PopupCalendar::keyPressEvent(QKeyEvent *event)
+{
+       int days = 0;
+       switch (event->key()) {
+               case Key_Left: days = -1; break;
+               case Key_Right: days = 1; break;
+               case Key_Up: days = -COLS; break;
+               case Key_Down: days = COLS; break;
+               case Key_PageUp: days = today.daysTo(today.addMonths(-1)); break;
+               case Key_PageDown: days = today.daysTo(today.addMonths(1)); break;
+               case Key_Home: days = today.daysTo(today.addYears(-1)); break;
+               case Key_End: days = today.daysTo(today.addYears(1)); break;
+               case Key_Escape: today = original; accept(); break;
+               case Key_Space: // fallthrough
+                       case Key_Enter: // fallthrough
+                               case Key_Return: accept(); return;
+                               default: QDialog::keyPressEvent(event); return;
+       }
+
+       QDate day = today.addDays(days);
+       if (day != today)
+               setDay(day);
+}
+
+/**
+ * \ru
+ *     \brief  Обрабатывает пользовательские действия мышкой по выбору даты в календарике.
+ *     Записывает значение выбранной пользователем даты в свойство виджета.
+ *
+ * \_ru
+ */
+void
+PopupCalendar::mousePressEvent(QMouseEvent *event)
+{
+       QDate day = today;
+       int w = width();
+       int h = height();
+       int dayh2 = (h / (ROWS + 2)) * 2;
+       int dayh = h / (ROWS + 2); // Высота строки
+       int dayw = w / COLS; // Ширина колонки
+       if (event->y() < dayh) {
+               if (event->x() > 1 && event->x() < dayw) day = day.addYears(-1);
+               if (event->x() > dayw && event->x() < dayw*2 )  day = day.addMonths(-1);
+               if (event->x() > (w - dayw*2) && event->x() < (w - dayw) ) day = day.addMonths(1);
+               if (event->x() > (w - dayw) ) day = day.addYears(1);
+       } else {
+               if (event->y() > dayh2 && event->y() < h - dayh) {
+                       int xday = event->x() / (width() / (COLS) );
+                       int yday = (event->y() - dayh2) / ((h - dayh2) / ROWS);
+                       day = QDate(today.year(), today.month(), 1);
+                       int day_pos = day.dayOfWeek()-1;
+                       day = day.addDays(xday + (COLS * yday) - (day_pos));
+               }else{
+                       if (event->x() > 1 && event->x() < dayw*2) {
+                               day = today.currentDate();
+                       }
+               }
+       }
+       if (day != today) setDay(day);
+}
+
+/**
+ * \ru
+ *     \brief  Обрабатывает двойной клик мышкой в календарике.
+ *
+ *     Записывает значение выбранной пользователем даты в свойство виджета.
+ *
+ * \_ru
+ */
+void
+PopupCalendar::mouseDoubleClickEvent(QMouseEvent *event)
+{
+       QDate day = today;
+       int w = width();
+       int h = height();
+       int dayh2 = (h / (ROWS + 2)) * 2;
+       int dayh = h / (ROWS + 2); // Высота строки
+       int dayw = w / COLS; // Ширина колонки
+
+       if (event->y() > dayh2 && event->y() < h - dayh) {
+               int xday = event->x() / (width() / (COLS) );
+               int yday = (event->y() - dayh2) / ((h - dayh2) / ROWS);
+               day = QDate(today.year(), today.month(), 1);
+               int day_pos = day.dayOfWeek()-1;
+               day = day.addDays(xday + (COLS * yday) - (day_pos));
+               if (day != today) setDay(day);
+               accept();
+       }
+}
+
+QSize
+PopupCalendar::sizeHint() const
+{
+       QFontMetrics fm(smallFont);
+       return QSize(COLS * (fm.width(tr("Wed"))+2), (ROWS + 2) * fm.height() * 1.2);
+}
+
+/**
+ * \ru
+ *     \brief  Сеттер задающий дату виджету.
+ *
+ *     Вызывает перерисовку виджета.
+ *
+ * \_ru
+ */
+void
+PopupCalendar::setDay(const QDate &day)
+{
+       today = day;
+       update();
+}
+
+
+/**
+ * \ru
+ *     \brief  Конструктор. Инициализирует свойства виджета, задает надпись в шапке виджета.
+ *
+ * \_ru
+ */
+PopupCalendar::PopupCalendar(const QDate &day, QPoint pos,
+                            QWidget *parent, const char *name)
+       : QDialog(parent, name), today(day), original(day)
+{
+       setCaption(tr("A-Calendar"));
+       if (!pos.isNull()) move(pos);
+       smallFont = font();
+       if (smallFont.pointSize() >= 10) {
+               smallFont.setPointSize(smallFont.pointSize() - 2);
+               smallFont.setBold(true);
+       }
+
+       setFixedSize(sizeHint());
+       setFocusPolicy(StrongFocus);
+}
diff --git a/src/lib/acalendar.h b/src/lib/acalendar.h
new file mode 100644 (file)
index 0000000..fcf98e0
--- /dev/null
@@ -0,0 +1,53 @@
+/****************************************************************************
+** $Id: acalendar.h,v 1.37 2008/06/09 11:44:27 dkr Exp $
+**
+**
+**********************************************************************/
+
+#ifndef CALENDAR_H
+#define CALENDAR_H
+
+#include <qwidget.h>
+#include <qwidgetplugin.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include "ananas.h"
+
+/*!
+ * \en PopupCalendar for DateEdit field editor. \_en
+ * \ru
+ *     \brief Всплывающий календарь для выбора даты.
+ *
+ *     Используется как дополнение к виджету поля ввода/редактирования
+ *     атрибута типа Дата бизнес объекта Ананаса.
+ *
+ * \_ru
+ */
+class PopupCalendar : public QDialog
+{
+Q_OBJECT
+public:
+       PopupCalendar(const QDate &day = QDate::currentDate(),
+               QPoint pos = QPoint(), QWidget *parent = 0, const char *name = 0);
+
+       static QDate    getDate(QWidget *parent = 0, const QDate &day = QDate::currentDate(),
+       QPoint          pos = QPoint());
+
+       const QDate&    day() const { return today; }
+       void            setDay(const QDate &day);
+       QSize           sizeHint() const;
+
+protected:
+       void mousePressEvent(QMouseEvent *event);
+       void mouseDoubleClickEvent(QMouseEvent *event);
+       void keyPressEvent(QKeyEvent *event);
+       void paintEvent(QPaintEvent *event);
+
+private:
+       enum { ROWS = 7, COLS = 7 };
+       QFont smallFont;
+       QDate today;
+       const QDate original;
+};
+
+#endif
similarity index 100%
rename from src/ananas/aminicalc.h
rename to src/lib/aminicalc.h
index 628a93d..bb63c9a 100644 (file)
@@ -146,13 +146,13 @@ wField::widgetInit()
     checkBox->hide();
        disconnect( checkBox, SIGNAL( valueChanged ( const QString & ) ),
                                this, SLOT( setValue( const QString & ) ) );
-               
+
        disconnect( checkBox, SIGNAL( toggled (bool) ), checkBox, SLOT( on_toggled() ) );
 //     checkBox->disconnect();
     layout()->remove(checkBox);
     //TODO: need rewrite
     if (!vFieldType.isEmpty()) sscanf((const char *)vFieldType,"%s %i %i", s1, &n1, &n2);
-    
+
     switch (vEditorType)
     {
     case Numberic:
@@ -184,12 +184,12 @@ wField::widgetInit()
                connect( lineEdit, SIGNAL( textChanged( const QString & ) ),
                                this, SLOT( setValue( const QString & ) ) );
                connect( lineEdit, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) );
-               
+
                setFocusProxy(lineEdit);
                layout()->add( lineEdit );
                lineEdit->show();
                break;
-       
+
        case String:
                if(vFieldType.isEmpty())
                {
@@ -204,12 +204,12 @@ wField::widgetInit()
                connect( lineEdit, SIGNAL( textChanged( const QString & ) ),
                                this, SLOT( setValue( const QString & ) ) );
                connect( lineEdit, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) );
-               
+
                setFocusProxy(lineEdit);
                layout()->add( lineEdit );
                lineEdit->show();
                break;
-               
+
        case Date:
        case DateTime:
        // used object wDateTime, inherits QDateTime
@@ -231,7 +231,7 @@ wField::widgetInit()
                objButton->show();
                dateEdit->show();
                break;
-               
+
        case Catalogue:
                md_oid = n1;
                objLabel->setFrameShape( QFrame::Box );
@@ -242,7 +242,7 @@ wField::widgetInit()
                objButton->setPixmap( QPixmap::fromMimeSource( "wcatalogue.png" ) );
                connect( objButton,     SIGNAL( clicked() ),
                         this, SLOT( fieldSelect() ) );
-               
+
                setFocusProxy(objButton);
                layout()->add( objLabel );
                layout()->add( objButton );
@@ -268,18 +268,18 @@ wField::widgetInit()
                objLabel->show();
                objButton->show();
                break;
-               
+
        case Boolean:
 //             connect( checkBox, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) );
                connect( checkBox, SIGNAL( valueChanged ( const QString & ) ),
                                this, SLOT( setValue( const QString & ) ) );
-               
+
                connect( checkBox, SIGNAL( toggled (bool) ), checkBox, SLOT( on_toggled() ) );
                setFocusProxy(checkBox);
                layout()->add(checkBox);
                checkBox->show();
                break;
-               
+
     default:
                objLabel->setText("UnknownField");
                objLabel->setFrameShape(QFrame::Box);
@@ -389,7 +389,7 @@ wField::setValue(const QString &newvalue)
        // conventering date-time to date, and if new value is NULL set up current locale date.
        // date must be stored in server in format ISO
         str = newvalue;
-        if(newvalue.isEmpty()) 
+        if(newvalue.isEmpty())
         {
                 str= QDateTime::currentDateTime(Qt::LocalTime).toString(Qt::ISODate);
         }
@@ -404,11 +404,11 @@ wField::setValue(const QString &newvalue)
        break;
     case Boolean:
        vValue = newvalue;
-       if(newvalue == "1") 
+       if(newvalue == "1")
        {
                checkBox->setChecked(true);
        }
-       else 
+       else
        {
                checkBox->setChecked(false);
        }
@@ -481,7 +481,7 @@ wField::fieldSelect()
        switch (vEditorType)
        {
                case Catalogue:
-               if ( engine ) 
+               if ( engine )
                {
                        int fid = md->getDefaultFormId( md->find( md_oid ), md_action_view);
                        if ( !fid )
@@ -490,13 +490,13 @@ wField::fieldSelect()
                                return;
                        }
                        f = engine->openForm( md_oid, 0, md_action_view, 0, false );
-                       if ( f ) 
+                       if ( f )
                        {
                                connect(f, SIGNAL(selected( Q_ULLONG )), this, SLOT(on_selected( Q_ULLONG )));
                                f->closeAfterSelect = true;
                        }
                }
-               else 
+               else
                {
                        aLog::print(aLog::MT_ERROR, tr("wField::fieldSelect no engine"));
                }
@@ -520,7 +520,7 @@ wField::fieldSelect()
                                connect(f, SIGNAL(selected( Q_ULLONG )), this, SLOT(on_selected( Q_ULLONG )));
                                f->closeAfterSelect = true;
                        }
-                       
+
                }
                else
                {
@@ -601,12 +601,16 @@ wField::SetReadOnly(bool fl)
 {
        switch (vEditorType) {
        case Numberic:
+               lineEdit->setReadOnly(fl);
+               objButton->setDisabled( fl );
+               break;
        case String:
                lineEdit->setReadOnly(fl);
                break;
        case Date:
        case DateTime:
                dateEdit->setDisabled(fl);
+               objButton->setDisabled( fl );
                break;
        case Catalogue:
                objButton->setDisabled( fl );
@@ -614,7 +618,7 @@ wField::SetReadOnly(bool fl)
        case Document:
                objButton->setDisabled( fl );
                break;
-       case Boolean: 
+       case Boolean:
                checkBox->setDisabled( fl );
                break;
        default:
@@ -690,7 +694,7 @@ wCheckBox::on_toggled()
 
 
 /**
- * \ru 
+ * \ru
  *     \brief Задает значение полю dateEdit запросив его у пользователя.
  * \_ru
  */
@@ -703,203 +707,3 @@ wField::popupCalendar()
        dateEdit->setDate(date);
        dateEdit->setFocus();
 }
-
-/**
- * \ru 
- *     \brief Запрашивает дату у пользователя, показав ему календарик.
- *     \return дату, указанную пользователем.
- * \_ru
- */
-QDate
-PopupCalendar::getDate(QWidget *parent, const QDate &day, QPoint pos)
-{
-       PopupCalendar *calendar = new PopupCalendar(day, pos, parent);
-       calendar->exec();
-       QDate date = calendar->day();
-       delete calendar;
-       return date;
-}
-
-
-/**
- * \ru
- *     \brief Осуществляет отрисовку календарика, обрабатывая событие PaintEvent виджета PopupCalendar.
- * \_ru
- */
-void
-PopupCalendar::paintEvent(QPaintEvent *event)
-{
-       QPainter painter(this);
-       painter.setClipRegion(event->region());
-       painter.setFont(smallFont);
-       int w = width();// Ширина окна
-       int h = height(); // Высота окна
-       int dayw = w / COLS; // Ширина ячейки
-       int dayh = h / (ROWS + 2); // Высота ячейки
-
-       QRect rect;
-       QColor color = colorGroup().light();
-       QColor f_color = "red";
-       QColor g_color = "green";
-       QColor b_color = "blue";
-       // Формируем строку с годом и месяцем
-       painter.fillRect(1, 1, dayw - 2, dayh - 1, color);
-       painter.drawText(1, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString("<< "), -1, &rect);
-       painter.fillRect(dayw, 1, dayw - 2, dayh - 1, color);
-       painter.drawText(dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" < "), -1, &rect);
-       painter.drawText(dayw*2+1, 1, dayw*3- 1, dayh - 1, AlignHCenter, today.toString("MMM, yyyy"), -1, &rect);
-       painter.fillRect(w-(dayw*2), 1, dayw - 2, dayh - 1, color);
-       painter.drawText(w-(dayw*2), 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" > "), -1, &rect);
-       painter.fillRect(w-dayw, 1, dayw - 2, dayh - 1, color);
-       painter.drawText(w-dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" >>"), -1, &rect);
-
-// Формируем строку с днями недели
-       int i;
-       int y = dayh;
-       for (i = 0; i < 7; i++) {
-
-               painter.drawText(dayw * i + 1, y, dayw, dayh - 1,
-                                AlignHCenter, QDate::shortDayName(i+1), -1, &rect);
-       }
-
-       // Заплняем таблицу календаря
-       QDate day(today.year(), today.month(), 1);
-       int day_pos = day.dayOfWeek()-1;
-       day = day.addDays(-day_pos);
-       y += dayh;
-       for (int j = 0; j < ROWS-1; ++j)
-               for (i = 0; i < COLS; ++i) {
-               color = (day == today) ? colorGroup().light() : ( ( i < 5 ) ? colorGroup().light() : colorGroup().midlight());
-               if (day == today){
-                       painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, b_color);
-                       painter.fillRect(dayw * i + 3, dayh * j + y + 3, dayw - 5, dayh - 5, color);
-               }else{
-                       painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, color);
-               }
-               (today.month() != day.month() )?  painter.setPen(colorGroup().mid()): ( ( i < 5 ) ? painter.setPen(colorGroup().foreground()):painter.setPen(f_color));
-               painter.drawText(dayw * i + 2, dayh * j + y + 2, dayw, dayh, AlignTop|AlignHCenter, day.toString("d"));
-               day = day.addDays(1);
-               }
-       // Формируем последнюю строку
-               painter.fillRect(1, h - dayh - 1, dayw*2, dayh - 1, b_color);
-               painter.fillRect(3, h - dayh + 1, dayw*2-4, dayh - 5, color);
-               painter.setPen(colorGroup().foreground());
-               painter.drawText(2, h - dayh, dayw*2-2, dayh - 3, AlignTop|AlignHCenter, "Now");
-               painter.drawText(w - dayw*3, h - dayh, dayw*3-2, dayh - 1, AlignTop|AlignHCenter, QString(tr("Week: %1").arg(today.weekNumber())));
-}
-
-/**
- * \ru
- *     \brief  Обрабатывает пользовательские действия по выбору даты в календарике.
- *     
- *     Записывает значение выбранной пользователем даты в свойство виджета.
- * 
- * \_ru
- */
-void
-PopupCalendar::keyPressEvent(QKeyEvent *event)
-{
-       int days = 0;
-       switch (event->key()) {
-               case Key_Left: days = -1; break;
-               case Key_Right: days = 1; break;
-               case Key_Up: days = -COLS; break;
-               case Key_Down: days = COLS; break;
-               case Key_PageUp: days = today.daysTo(today.addMonths(-1)); break;
-               case Key_PageDown: days = today.daysTo(today.addMonths(1)); break;
-               case Key_Home: days = today.daysTo(today.addYears(-1)); break;
-               case Key_End: days = today.daysTo(today.addYears(1)); break;
-               case Key_Escape: today = original; accept(); break;
-               case Key_Space: // fallthrough
-                       case Key_Enter: // fallthrough
-                               case Key_Return: accept(); return;
-                               default: QDialog::keyPressEvent(event); return;
-       }
-
-       QDate day = today.addDays(days);
-       if (day != today)
-               setDay(day);
-}
-
-/**
- * \ru
- *     \brief  Обрабатывает пользовательские действия мышкой по выбору даты в календарике.
- *     
- *     Записывает значение выбранной пользователем даты в свойство виджета.
- * 
- * \_ru
- */
-void
-PopupCalendar::mousePressEvent(QMouseEvent *event)
-{
-       QDate day = today;
-       int w = width();
-       int h = height();
-       int dayh2 = (h / (ROWS + 2)) * 2;
-       int dayh = h / (ROWS + 2); // Высота строки
-       int dayw = w / COLS; // Ширина колонки
-       if (event->y() < dayh) {
-               if (event->x() > 1 && event->x() < dayw)                day = day.addYears(-1);
-               if (event->x() > dayw && event->x() < dayw*2 )  day = day.addMonths(-1);
-               if (event->x() > (w - dayw*2) && event->x() < (w - dayw) ) day = day.addMonths(1);
-               if (event->x() > (w - dayw) ) day = day.addYears(1);
-       } else {
-               if (event->y() > dayh2 && event->y() < h - dayh) {
-                       int xday = event->x() / (width() / (COLS) );
-                       int yday = (event->y() - dayh2) / ((h - dayh2) / ROWS);
-                       day = QDate(today.year(), today.month(), 1);
-                       int day_pos = day.dayOfWeek()-1;
-                       day = day.addDays(xday + (COLS * yday) - (day_pos));
-               }else{
-                       if (event->x() > 1 && event->x() < dayw*2) {
-                               day = today.currentDate();
-                       }
-               }
-       }
-       if (day != today) setDay(day);
-}
-
-QSize
-PopupCalendar::sizeHint() const
-{
-       QFontMetrics fm(smallFont);
-       return QSize(COLS * (fm.width(tr("Wed"))+2), (ROWS + 2) * fm.height() * 1.2);
-}
-
-/**
- * \ru
- *     \brief  Сеттер задающий дату виджету.
- *     
- *     Вызывает перерисовку виджета.
- * 
- * \_ru
- */
-void
-PopupCalendar::setDay(const QDate &day)
-{
-       today = day;
-       update();
-}
-
-
-/**
- * \ru
- *     \brief  Конструктор. Инициализирует свойства виджета, задает надпись в шапке виджета.
- *     
- * \_ru
- */
-PopupCalendar::PopupCalendar(const QDate &day, QPoint pos,
-                            QWidget *parent, const char *name)
-       : QDialog(parent, name), today(day), original(day)
-{
-       setCaption(tr("A-Calendar"));
-       if (!pos.isNull()) move(pos);
-       smallFont = font();
-       if (smallFont.pointSize() >= 10) {
-               smallFont.setPointSize(smallFont.pointSize() - 2);
-               smallFont.setBold(true);
-       }
-
-       setFixedSize(sizeHint());
-       setFocusPolicy(StrongFocus);
-}