kdeui Library API Documentation

kdatetbl.cpp

00001 /*  -*- C++ -*-
00002     This file is part of the KDE libraries
00003     Copyright (C) 1997 Tim D. Gilman (tdgilman@best.org)
00004               (C) 1998-2001 Mirko Boehm (mirko@kde.org)
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018     Boston, MA 02111-1307, USA.
00019 */
00020 
00022 //
00023 // Copyright (C) 1997 Tim D. Gilman
00024 //           (C) 1998-2001 Mirko Boehm
00025 // Written using Qt (http://www.troll.no) for the
00026 // KDE project (http://www.kde.org)
00027 //
00028 // This is a support class for the KDatePicker class.  It just
00029 // draws the calender table without titles, but could theoretically
00030 // be used as a standalone.
00031 //
00032 // When a date is selected by the user, it emits a signal:
00033 //      dateSelected(QDate)
00034 
00035 #include <kconfig.h>
00036 #include <kglobal.h>
00037 #include <kglobalsettings.h>
00038 #include <kapplication.h>
00039 #include <klocale.h>
00040 #include <kdebug.h>
00041 #include <knotifyclient.h>
00042 #include <kcalendarsystem.h>
00043 #include "kdatepicker.h"
00044 #include "kdatetbl.h"
00045 #include "kpopupmenu.h"
00046 #include <qdatetime.h>
00047 #include <qstring.h>
00048 #include <qpen.h>
00049 #include <qpainter.h>
00050 #include <qdialog.h>
00051 #include <qdict.h>
00052 #include <assert.h>
00053 
00054 
00055 class KDateTable::KDateTablePrivate
00056 {
00057 public:
00058    KDateTablePrivate()
00059    {
00060       popupMenuEnabled=false;
00061       useCustomColors=false;
00062    }
00063 
00064    ~KDateTablePrivate()
00065    {
00066    }
00067 
00068    bool popupMenuEnabled;
00069    bool useCustomColors;
00070 
00071    struct DatePaintingMode
00072    {
00073      QColor fgColor;
00074      QColor bgColor;
00075      BackgroundMode bgMode;
00076    };
00077    QDict <DatePaintingMode> customPaintingModes;
00078 
00079 };
00080 
00081 
00082 KDateValidator::KDateValidator(QWidget* parent, const char* name)
00083     : QValidator(parent, name)
00084 {
00085 }
00086 
00087 QValidator::State
00088 KDateValidator::validate(QString& text, int&) const
00089 {
00090   QDate temp;
00091   // ----- everything is tested in date():
00092   return date(text, temp);
00093 }
00094 
00095 QValidator::State
00096 KDateValidator::date(const QString& text, QDate& d) const
00097 {
00098   QDate tmp = KGlobal::locale()->readDate(text);
00099   if (!tmp.isNull())
00100     {
00101       d = tmp;
00102       return Acceptable;
00103     } else
00104       return Valid;
00105 }
00106 
00107 void
00108 KDateValidator::fixup( QString& ) const
00109 {
00110 
00111 }
00112 
00113 KDateTable::KDateTable(QWidget *parent, QDate date_, const char* name, WFlags f)
00114   : QGridView(parent, name, f)
00115 {
00116   d = new KDateTablePrivate;
00117   setFontSize(10);
00118   if(!date_.isValid())
00119     {
00120       kdDebug() << "KDateTable ctor: WARNING: Given date is invalid, using current date." << endl;
00121       date_=QDate::currentDate();
00122     }
00123   setFocusPolicy( QWidget::StrongFocus );
00124   setNumRows(7); // 6 weeks max + headline
00125   setNumCols(7); // 7 days a week
00126   setHScrollBarMode(AlwaysOff);
00127   setVScrollBarMode(AlwaysOff);
00128   viewport()->setEraseColor(KGlobalSettings::baseColor());
00129   setDate(date_); // this initializes firstday, numdays, numDaysPrevMonth
00130 }
00131 
00132 KDateTable::~KDateTable()
00133 {
00134   delete d;
00135 }
00136 
00137 int KDateTable::posFromDate( const QDate &dt )
00138 {
00139   const KCalendarSystem * calendar = KGlobal::locale()->calendar();
00140   const int firstWeekDay = KGlobal::locale()->weekStartDay();
00141   int pos = calendar->day( dt );
00142   int offset = (firstday - firstWeekDay + 7) % 7;
00143   // make sure at least one day of the previous month is visible.
00144   // adjust this <1 if more days should be forced visible:
00145   if ( offset < 1 ) offset += 7;
00146   return pos + offset;
00147 }
00148 
00149 QDate KDateTable::dateFromPos( int pos )
00150 {
00151   QDate pCellDate;
00152   const KCalendarSystem * calendar = KGlobal::locale()->calendar();
00153   calendar->setYMD(pCellDate, calendar->year(date), calendar->month(date), 1);
00154 
00155   int firstWeekDay = KGlobal::locale()->weekStartDay();
00156   int offset = (firstday - firstWeekDay + 7) % 7;
00157   // make sure at least one day of the previous month is visible.
00158   // adjust this <1 if more days should be forced visible:
00159   if ( offset < 1 ) offset += 7;
00160   pCellDate = calendar->addDays( pCellDate, pos - offset );
00161   return pCellDate;
00162 }
00163 
00164 void
00165 KDateTable::paintCell(QPainter *painter, int row, int col)
00166 {
00167   const KCalendarSystem * calendar = KGlobal::locale()->calendar();
00168 
00169   QRect rect;
00170   QString text;
00171   QPen pen;
00172   int w=cellWidth();
00173   int h=cellHeight();
00174   QBrush brushBlue(KGlobalSettings::activeTitleColor());
00175   QBrush brushLightblue(KGlobalSettings::baseColor());
00176   QFont font=KGlobalSettings::generalFont();
00177   // -----
00178 
00179   if(row==0)
00180     { // we are drawing the headline
00181       font.setBold(true);
00182       painter->setFont(font);
00183       bool normalday = true;
00184       int firstWeekDay = KGlobal::locale()->weekStartDay();
00185       int daynum = ( col+firstWeekDay < 8 ) ? col+firstWeekDay :
00186                                               col+firstWeekDay-7;
00187       if ( daynum == calendar->weekDayOfPray() ||
00188          ( daynum == 6 && calendar->calendarName() == "gregorian" ) )
00189           normalday=false;
00190 
00191       if (!normalday)
00192         {
00193           painter->setPen(KGlobalSettings::baseColor());
00194           painter->setBrush(brushLightblue);
00195           painter->drawRect(0, 0, w, h);
00196           painter->setPen(KGlobalSettings::activeTitleColor());
00197         } else {
00198           painter->setPen(KGlobalSettings::activeTitleColor());
00199           painter->setBrush(brushBlue);
00200           painter->drawRect(0, 0, w, h);
00201           painter->setPen(KGlobalSettings::activeTextColor());
00202         }
00203       painter->drawText(0, 0, w, h-1, AlignCenter,
00204                         calendar->weekDayName(daynum, true), -1, &rect);
00205       painter->setPen(KGlobalSettings::textColor());
00206       painter->moveTo(0, h-1);
00207       painter->lineTo(w-1, h-1);
00208       // ----- draw the weekday:
00209     } else {
00210       bool paintRect=true;
00211       painter->setFont(font);
00212       int pos=7*(row-1)+col;
00213 
00214       QDate pCellDate = dateFromPos( pos );
00215       // First day of month
00216       text = calendar->dayString(pCellDate, true);
00217       if( calendar->month(pCellDate) != calendar->month(date) )
00218         { // we are either
00219           // ° painting a day of the previous month or
00220           // ° painting a day of the following month
00221           painter->setPen(gray);
00222         } else { // paint a day of the current month
00223           if ( d->useCustomColors )
00224           {
00225             KDateTablePrivate::DatePaintingMode *mode=d->customPaintingModes[pCellDate.toString()];
00226             if (mode)
00227             {
00228               if (mode->bgMode != NoBgMode)
00229               {
00230                 QBrush oldbrush=painter->brush();
00231                 painter->setBrush( mode->bgColor );
00232                 switch(mode->bgMode)
00233                 {
00234                   case(CircleMode) : painter->drawEllipse(0,0,w,h);break;
00235                   case(RectangleMode) : painter->drawRect(0,0,w,h);break;
00236                   case(NoBgMode) : // Should never be here, but just to get one
00237                                    // less warning when compiling
00238                   default: break;
00239                 }
00240                 painter->setBrush( oldbrush );
00241                 paintRect=false;
00242               }
00243               painter->setPen( mode->fgColor );
00244             } else
00245               painter->setPen(KGlobalSettings::textColor());
00246           } else //if ( firstWeekDay < 4 ) // <- this doesn' make sense at all!
00247           painter->setPen(KGlobalSettings::textColor());
00248         }
00249 
00250       pen=painter->pen();
00251       int firstWeekDay=KGlobal::locale()->weekStartDay();
00252       int offset=firstday-firstWeekDay;
00253       if(offset<1)
00254         offset+=7;
00255       int d = calendar->day(date);
00256       if( (offset+d) == (pos+1) )
00257         {
00258           if(hasFocus())
00259             { // draw the currently selected date
00260               painter->setPen(KGlobalSettings::highlightColor());
00261               painter->setBrush(KGlobalSettings::highlightColor());
00262               pen=white;
00263             } else {
00264               painter->setPen(KGlobalSettings::calculateAlternateBackgroundColor(KGlobalSettings::highlightColor()));
00265               painter->setBrush(KGlobalSettings::calculateAlternateBackgroundColor(KGlobalSettings::highlightColor()));
00266               pen=white;
00267             }
00268         } else {
00269           painter->setBrush(KGlobalSettings::baseColor());
00270           painter->setPen(KGlobalSettings::baseColor());
00271         }
00272 
00273       if ( pCellDate == QDate::currentDate() )
00274       {
00275          painter->setPen(KGlobalSettings::textColor());
00276       }
00277 
00278       if ( paintRect ) painter->drawRect(0, 0, w, h);
00279       painter->setPen(pen);
00280       painter->drawText(0, 0, w, h, AlignCenter, text, -1, &rect);
00281     }
00282   if(rect.width()>maxCell.width()) maxCell.setWidth(rect.width());
00283   if(rect.height()>maxCell.height()) maxCell.setHeight(rect.height());
00284 }
00285 
00286 void
00287 KDateTable::keyPressEvent( QKeyEvent *e )
00288 {
00289     const KCalendarSystem * calendar = KGlobal::locale()->calendar();
00290     QDate temp = date;
00291 
00292     switch( e->key() ) {
00293     case Key_Prior:
00294         temp = calendar->addMonths( date, -1 );
00295         setDate(temp);
00296         return;
00297     case Key_Next:
00298         temp = calendar->addMonths( date, 1 );
00299         setDate(temp);
00300         return;
00301     case Key_Up:
00302         if ( calendar->day(date) > 7 ) {
00303             setDate(date.addDays(-7));
00304             return;
00305         }
00306         break;
00307     case Key_Down:
00308         if ( calendar->day(date) <= calendar->daysInMonth(date)-7 ) {
00309             setDate(date.addDays(7));
00310             return;
00311         }
00312         break;
00313     case Key_Left:
00314         if ( calendar->day(date) > 1 ) {
00315             setDate(date.addDays(-1));
00316             return;
00317         }
00318         break;
00319     case Key_Right:
00320         if ( calendar->day(date) < calendar->daysInMonth(date) ) {
00321             setDate(date.addDays(1));
00322             return;
00323         }
00324         break;
00325     case Key_Minus:
00326         setDate(date.addDays(-1));
00327         return;
00328     case Key_Plus:
00329         setDate(date.addDays(1));
00330         return;
00331     case Key_N:
00332         setDate(QDate::currentDate());
00333         return;
00334     case Key_Return:
00335     case Key_Enter:
00336         emit tableClicked();
00337         return;
00338     default:
00339         break;
00340     }
00341 
00342     KNotifyClient::beep();
00343 }
00344 
00345 void
00346 KDateTable::viewportResizeEvent(QResizeEvent * e)
00347 {
00348   QGridView::viewportResizeEvent(e);
00349 
00350   setCellWidth(viewport()->width()/7);
00351   setCellHeight(viewport()->height()/7);
00352 }
00353 
00354 void
00355 KDateTable::setFontSize(int size)
00356 {
00357   int count;
00358   QFontMetrics metrics(fontMetrics());
00359   QRect rect;
00360   // ----- store rectangles:
00361   fontsize=size;
00362   // ----- find largest day name:
00363   maxCell.setWidth(0);
00364   maxCell.setHeight(0);
00365   for(count=0; count<7; ++count)
00366     {
00367       rect=metrics.boundingRect(KGlobal::locale()->calendar()
00368                                 ->weekDayName(count+1, true));
00369       maxCell.setWidth(QMAX(maxCell.width(), rect.width()));
00370       maxCell.setHeight(QMAX(maxCell.height(), rect.height()));
00371     }
00372   // ----- compare with a real wide number and add some space:
00373   rect=metrics.boundingRect(QString::fromLatin1("88"));
00374   maxCell.setWidth(QMAX(maxCell.width()+2, rect.width()));
00375   maxCell.setHeight(QMAX(maxCell.height()+4, rect.height()));
00376 }
00377 
00378 void
00379 KDateTable::wheelEvent ( QWheelEvent * e )
00380 {
00381     setDate(date.addMonths( -(int)(e->delta()/120)) );
00382     e->accept();
00383 }
00384 
00385 void
00386 KDateTable::contentsMousePressEvent(QMouseEvent *e)
00387 {
00388 
00389   if(e->type()!=QEvent::MouseButtonPress)
00390     { // the KDatePicker only reacts on mouse press events:
00391       return;
00392     }
00393   if(!isEnabled())
00394     {
00395       KNotifyClient::beep();
00396       return;
00397     }
00398 
00399   // -----
00400   int row, col, pos, temp;
00401   QPoint mouseCoord;
00402   // -----
00403   mouseCoord = e->pos();
00404   row=rowAt(mouseCoord.y());
00405   col=columnAt(mouseCoord.x());
00406   if(row<1 || col<0)
00407     { // the user clicked on the frame of the table
00408       return;
00409     }
00410 
00411   // Rows and columns are zero indexed.  The (row - 1) below is to avoid counting
00412   // the row with the days of the week in the calculation.
00413 
00414   // old selected date:
00415   temp = posFromDate( date );
00416   // new position and date
00417   pos = (7 * (row - 1)) + col; 
00418   QDate clickedDate = dateFromPos( pos );
00419 
00420   // set the new date. If it is in the previous or next month, the month will
00421   // automatically be changed, no need to do that manually...
00422   setDate( clickedDate );
00423 
00424   // call updateCell on the old and new selection. If setDate switched to a different 
00425   // month, these cells will be painted twice, but that's no problem.
00426   updateCell( temp/7+1, temp%7 );
00427   updateCell( row, col );
00428 
00429   emit tableClicked();
00430 
00431   if (  e->button() == Qt::RightButton && d->popupMenuEnabled )
00432   {
00433         KPopupMenu *menu = new KPopupMenu();
00434         menu->insertTitle( KGlobal::locale()->formatDate(clickedDate) );
00435         emit aboutToShowContextMenu( menu, clickedDate );
00436         menu->popup(e->globalPos());
00437   }
00438 }
00439 
00440 bool
00441 KDateTable::setDate(const QDate& date_)
00442 {
00443   bool changed=false;
00444   QDate temp;
00445   // -----
00446   if(!date_.isValid())
00447     {
00448       kdDebug() << "KDateTable::setDate: refusing to set invalid date." << endl;
00449       return false;
00450     }
00451   if(date!=date_)
00452     {
00453       emit(dateChanged(date, date_));
00454       date=date_;
00455       emit(dateChanged(date));
00456       changed=true;
00457     }
00458   const KCalendarSystem * calendar = KGlobal::locale()->calendar();
00459 
00460   calendar->setYMD(temp, calendar->year(date), calendar->month(date), 1);
00461   //temp.setYMD(date.year(), date.month(), 1);
00462   //kdDebug() << "firstDayInWeek: " << temp.toString() << endl;
00463   firstday=temp.dayOfWeek();
00464   numdays=calendar->daysInMonth(date);
00465 
00466   temp = calendar->addMonths(temp, -1);
00467   numDaysPrevMonth=calendar->daysInMonth(temp);
00468   if(changed)
00469     {
00470       repaintContents(false);
00471     }
00472   return true;
00473 }
00474 
00475 const QDate&
00476 KDateTable::getDate() const
00477 {
00478   return date;
00479 }
00480 
00481 // what are those repaintContents() good for? (pfeiffer)
00482 void KDateTable::focusInEvent( QFocusEvent *e )
00483 {
00484 //    repaintContents(false);
00485     QGridView::focusInEvent( e );
00486 }
00487 
00488 void KDateTable::focusOutEvent( QFocusEvent *e )
00489 {
00490 //    repaintContents(false);
00491     QGridView::focusOutEvent( e );
00492 }
00493 
00494 QSize
00495 KDateTable::sizeHint() const
00496 {
00497   if(maxCell.height()>0 && maxCell.width()>0)
00498     {
00499       return QSize(maxCell.width()*numCols()+2*frameWidth(),
00500              (maxCell.height()+2)*numRows()+2*frameWidth());
00501     } else {
00502       kdDebug() << "KDateTable::sizeHint: obscure failure - " << endl;
00503       return QSize(-1, -1);
00504     }
00505 }
00506 
00507 void KDateTable::setPopupMenuEnabled( bool enable )
00508 {
00509    d->popupMenuEnabled=enable;
00510 }
00511 
00512 bool KDateTable::popupMenuEnabled() const
00513 {
00514    return d->popupMenuEnabled;
00515 }
00516 
00517 void KDateTable::setCustomDatePainting(const QDate &date, const QColor &fgColor, BackgroundMode bgMode, const QColor &bgColor)
00518 {
00519     if (!fgColor.isValid())
00520     {
00521         unsetCustomDatePainting( date );
00522         return;
00523     }
00524 
00525     KDateTablePrivate::DatePaintingMode *mode=new KDateTablePrivate::DatePaintingMode;
00526     mode->bgMode=bgMode;
00527     mode->fgColor=fgColor;
00528     mode->bgColor=bgColor;
00529 
00530     d->customPaintingModes.replace( date.toString(), mode );
00531     d->useCustomColors=true;
00532     update();
00533 }
00534 
00535 void KDateTable::unsetCustomDatePainting( const QDate &date )
00536 {
00537     d->customPaintingModes.remove( date.toString() );
00538 }
00539 
00540 KDateInternalWeekSelector::KDateInternalWeekSelector
00541 (QWidget* parent, const char* name)
00542   : QLineEdit(parent, name),
00543     val(new QIntValidator(this)),
00544     result(0)
00545 {
00546   QFont font;
00547   // -----
00548   font=KGlobalSettings::generalFont();
00549   setFont(font);
00550   setFrameStyle(QFrame::NoFrame);
00551   setValidator(val);
00552   connect(this, SIGNAL(returnPressed()), SLOT(weekEnteredSlot()));
00553 }
00554 
00555 void
00556 KDateInternalWeekSelector::weekEnteredSlot()
00557 {
00558   bool ok;
00559   int week;
00560   // ----- check if this is a valid week:
00561   week=text().toInt(&ok);
00562   if(!ok)
00563     {
00564       KNotifyClient::beep();
00565       return;
00566     }
00567   result=week;
00568   emit(closeMe(1));
00569 }
00570 
00571 int
00572 KDateInternalWeekSelector::getWeek()
00573 {
00574   return result;
00575 }
00576 
00577 void
00578 KDateInternalWeekSelector::setWeek(int week)
00579 {
00580   QString temp;
00581   // -----
00582   temp.setNum(week);
00583   setText(temp);
00584 }
00585 
00586 void
00587 KDateInternalWeekSelector::setMaxWeek(int max)
00588 {
00589   val->setRange(1, max);
00590 }
00591 
00592 // ### CFM To avoid binary incompatibility.
00593 //     In future releases, remove this and replace by  a QDate
00594 //     private member, needed in KDateInternalMonthPicker::paintCell
00595 class KDateInternalMonthPicker::KDateInternalMonthPrivate {
00596 public:
00597         KDateInternalMonthPrivate (int y, int m, int d)
00598         : year(y), month(m), day(d)
00599         {};
00600         int year;
00601         int month;
00602         int day;
00603 };
00604 
00605 KDateInternalMonthPicker::~KDateInternalMonthPicker() {
00606    delete d;
00607 }
00608 
00609 KDateInternalMonthPicker::KDateInternalMonthPicker
00610 (const QDate & date, QWidget* parent, const char* name)
00611   : QGridView(parent, name),
00612     result(0) // invalid
00613 {
00614   QRect rect;
00615   QFont font;
00616   // -----
00617   activeCol = -1;
00618   activeRow = -1;
00619   font=KGlobalSettings::generalFont();
00620   setFont(font);
00621   setHScrollBarMode(AlwaysOff);
00622   setVScrollBarMode(AlwaysOff);
00623   setFrameStyle(QFrame::NoFrame);
00624   setNumCols(3);
00625   d = new KDateInternalMonthPrivate(date.year(), date.month(), date.day());
00626   // For monthsInYear != 12
00627   setNumRows( (KGlobal::locale()->calendar()->monthsInYear(date) + 2) / 3);
00628   // enable to find drawing failures:
00629   // setTableFlags(Tbl_clipCellPainting);
00630   viewport()->setEraseColor(KGlobalSettings::baseColor()); // for consistency with the datepicker
00631   // ----- find the preferred size
00632   //       (this is slow, possibly, but unfortunately it is needed here):
00633   QFontMetrics metrics(font);
00634   for(int i = 1; ; ++i)
00635     {
00636       QString str = KGlobal::locale()->calendar()->monthName(i,
00637          KGlobal::locale()->calendar()->year(date), false);
00638       if (str.isNull()) break;
00639       rect=metrics.boundingRect(str);
00640       if(max.width()<rect.width()) max.setWidth(rect.width());
00641       if(max.height()<rect.height()) max.setHeight(rect.height());
00642     }
00643 }
00644 
00645 QSize
00646 KDateInternalMonthPicker::sizeHint() const
00647 {
00648   return QSize((max.width()+6)*numCols()+2*frameWidth(),
00649          (max.height()+6)*numRows()+2*frameWidth());
00650 }
00651 
00652 int
00653 KDateInternalMonthPicker::getResult() const
00654 {
00655   return result;
00656 }
00657 
00658 void
00659 KDateInternalMonthPicker::setupPainter(QPainter *p)
00660 {
00661   p->setPen(KGlobalSettings::textColor());
00662 }
00663 
00664 void
00665 KDateInternalMonthPicker::viewportResizeEvent(QResizeEvent*)
00666 {
00667   setCellWidth(width() / numCols());
00668   setCellHeight(height() / numRows());
00669 }
00670 
00671 void
00672 KDateInternalMonthPicker::paintCell(QPainter* painter, int row, int col)
00673 {
00674   int index;
00675   QString text;
00676   // ----- find the number of the cell:
00677   index=3*row+col+1;
00678   text=KGlobal::locale()->calendar()->monthName(index,
00679     KGlobal::locale()->calendar()->year(QDate(d->year, d->month,
00680     d->day)), false);
00681   painter->drawText(0, 0, cellWidth(), cellHeight(), AlignCenter, text);
00682   if ( activeCol == col && activeRow == row )
00683       painter->drawRect( 0, 0, cellWidth(), cellHeight() );
00684 }
00685 
00686 void
00687 KDateInternalMonthPicker::contentsMousePressEvent(QMouseEvent *e)
00688 {
00689   if(!isEnabled() || e->button() != LeftButton)
00690     {
00691       KNotifyClient::beep();
00692       return;
00693     }
00694   // -----
00695   int row, col;
00696   QPoint mouseCoord;
00697   // -----
00698   mouseCoord = e->pos();
00699   row=rowAt(mouseCoord.y());
00700   col=columnAt(mouseCoord.x());
00701 
00702   if(row<0 || col<0)
00703     { // the user clicked on the frame of the table
00704       activeCol = -1;
00705       activeRow = -1;
00706     } else {
00707       activeCol = col;
00708       activeRow = row;
00709       updateCell( row, col /*, false */ );
00710   }
00711 }
00712 
00713 void
00714 KDateInternalMonthPicker::contentsMouseMoveEvent(QMouseEvent *e)
00715 {
00716   if (e->state() & LeftButton)
00717     {
00718       int row, col;
00719       QPoint mouseCoord;
00720       // -----
00721       mouseCoord = e->pos();
00722       row=rowAt(mouseCoord.y());
00723       col=columnAt(mouseCoord.x());
00724       int tmpRow = -1, tmpCol = -1;
00725       if(row<0 || col<0)
00726         { // the user clicked on the frame of the table
00727           if ( activeCol > -1 )
00728             {
00729               tmpRow = activeRow;
00730               tmpCol = activeCol;
00731             }
00732           activeCol = -1;
00733           activeRow = -1;
00734         } else {
00735           bool differentCell = (activeRow != row || activeCol != col);
00736           if ( activeCol > -1 && differentCell)
00737             {
00738               tmpRow = activeRow;
00739               tmpCol = activeCol;
00740             }
00741           if ( differentCell)
00742             {
00743               activeRow = row;
00744               activeCol = col;
00745               updateCell( row, col /*, false */ ); // mark the new active cell
00746             }
00747         }
00748       if ( tmpRow > -1 ) // repaint the former active cell
00749           updateCell( tmpRow, tmpCol /*, true */ );
00750     }
00751 }
00752 
00753 void
00754 KDateInternalMonthPicker::contentsMouseReleaseEvent(QMouseEvent *e)
00755 {
00756   if(!isEnabled())
00757     {
00758       return;
00759     }
00760   // -----
00761   int row, col, pos;
00762   QPoint mouseCoord;
00763   // -----
00764   mouseCoord = e->pos();
00765   row=rowAt(mouseCoord.y());
00766   col=columnAt(mouseCoord.x());
00767   if(row<0 || col<0)
00768     { // the user clicked on the frame of the table
00769       emit(closeMe(0));
00770     }
00771 
00772   pos=3*row+col+1;
00773   result=pos;
00774   emit(closeMe(1));
00775 }
00776 
00777 
00778 
00779 KDateInternalYearSelector::KDateInternalYearSelector
00780 (QWidget* parent, const char* name)
00781   : QLineEdit(parent, name),
00782     val(new QIntValidator(this)),
00783     result(0)
00784 {
00785   QFont font;
00786   // -----
00787   font=KGlobalSettings::generalFont();
00788   setFont(font);
00789   setFrameStyle(QFrame::NoFrame);
00790   // we have to respect the limits of QDate here, I fear:
00791   val->setRange(0, 8000);
00792   setValidator(val);
00793   connect(this, SIGNAL(returnPressed()), SLOT(yearEnteredSlot()));
00794 }
00795 
00796 void
00797 KDateInternalYearSelector::yearEnteredSlot()
00798 {
00799   bool ok;
00800   int year;
00801   QDate date;
00802   // ----- check if this is a valid year:
00803   year=text().toInt(&ok);
00804   if(!ok)
00805     {
00806       KNotifyClient::beep();
00807       return;
00808     }
00809   //date.setYMD(year, 1, 1);
00810   KGlobal::locale()->calendar()->setYMD(date, year, 1, 1);
00811   if(!date.isValid())
00812     {
00813       KNotifyClient::beep();
00814       return;
00815     }
00816   result=year;
00817   emit(closeMe(1));
00818 }
00819 
00820 int
00821 KDateInternalYearSelector::getYear()
00822 {
00823   return result;
00824 }
00825 
00826 void
00827 KDateInternalYearSelector::setYear(int year)
00828 {
00829   QString temp;
00830   // -----
00831   temp.setNum(year);
00832   setText(temp);
00833 }
00834 
00835 KPopupFrame::KPopupFrame(QWidget* parent, const char*  name)
00836   : QFrame(parent, name, WType_Popup),
00837     result(0), // rejected
00838     main(0)
00839 {
00840   setFrameStyle(QFrame::Box|QFrame::Raised);
00841   setMidLineWidth(2);
00842 }
00843 
00844 void
00845 KPopupFrame::keyPressEvent(QKeyEvent* e)
00846 {
00847   if(e->key()==Key_Escape)
00848     {
00849       result=0; // rejected
00850       qApp->exit_loop();
00851     }
00852 }
00853 
00854 void
00855 KPopupFrame::close(int r)
00856 {
00857   result=r;
00858   qApp->exit_loop();
00859 }
00860 
00861 void
00862 KPopupFrame::setMainWidget(QWidget* m)
00863 {
00864   main=m;
00865   if(main!=0)
00866     {
00867       resize(main->width()+2*frameWidth(), main->height()+2*frameWidth());
00868     }
00869 }
00870 
00871 void
00872 KPopupFrame::resizeEvent(QResizeEvent*)
00873 {
00874   if(main!=0)
00875     {
00876       main->setGeometry(frameWidth(), frameWidth(),
00877           width()-2*frameWidth(), height()-2*frameWidth());
00878     }
00879 }
00880 
00881 void
00882 KPopupFrame::popup(const QPoint &pos)
00883 {
00884   // Make sure the whole popup is visible.
00885   QRect d = KGlobalSettings::desktopGeometry(pos);
00886 
00887   int x = pos.x();
00888   int y = pos.y();
00889   int w = width();
00890   int h = height();
00891   if (x+w > d.x()+d.width())
00892     x = d.width() - w;
00893   if (y+h > d.y()+d.height())
00894     y = d.height() - h;
00895   if (x < d.x())
00896     x = 0;
00897   if (y < d.y())
00898     y = 0;
00899 
00900   // Pop the thingy up.
00901   move(x, y);
00902   show();
00903 }
00904 
00905 int
00906 KPopupFrame::exec(QPoint pos)
00907 {
00908   popup(pos);
00909   repaint();
00910   qApp->enter_loop();
00911   hide();
00912   return result;
00913 }
00914 
00915 int
00916 KPopupFrame::exec(int x, int y)
00917 {
00918   return exec(QPoint(x, y));
00919 }
00920 
00921 void KPopupFrame::virtual_hook( int, void* )
00922 { /*BASE::virtual_hook( id, data );*/ }
00923 
00924 void KDateTable::virtual_hook( int, void* )
00925 { /*BASE::virtual_hook( id, data );*/ }
00926 
00927 #include "kdatetbl.moc"
KDE Logo
This file is part of the documentation for kdeui Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Mar 3 19:23:09 2005 by doxygen 1.3.6 written by Dimitri van Heesch, © 1997-2003