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.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 8 11:14:24 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003