00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
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
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);
00125 setNumCols(7);
00126 setHScrollBarMode(AlwaysOff);
00127 setVScrollBarMode(AlwaysOff);
00128 viewport()->setEraseColor(KGlobalSettings::baseColor());
00129 setDate(date_);
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
00144
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
00158
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 QFont font=KGlobalSettings::generalFont();
00175
00176
00177 if(row==0)
00178 {
00179 font.setBold(true);
00180 painter->setFont(font);
00181 bool normalday = true;
00182 int firstWeekDay = KGlobal::locale()->weekStartDay();
00183 int daynum = ( col+firstWeekDay < 8 ) ? col+firstWeekDay :
00184 col+firstWeekDay-7;
00185 if ( daynum == calendar->weekDayOfPray() ||
00186 ( daynum == 6 && calendar->calendarName() == "gregorian" ) )
00187 normalday=false;
00188
00189 QBrush brushTitle();
00190 QBrush brushInvertTitle(colorGroup().base());
00191 QColor titleColor(isEnabled()?( KGlobalSettings::activeTitleColor() ):( KGlobalSettings::inactiveTitleColor() ) );
00192 QColor textColor(isEnabled()?( KGlobalSettings::activeTextColor() ):( KGlobalSettings::inactiveTextColor() ) );
00193 if (!normalday)
00194 {
00195 painter->setPen(textColor);
00196 painter->setBrush(textColor);
00197 painter->drawRect(0, 0, w, h);
00198 painter->setPen(titleColor);
00199 } else {
00200 painter->setPen(titleColor);
00201 painter->setBrush(titleColor);
00202 painter->drawRect(0, 0, w, h);
00203 painter->setPen(textColor);
00204 }
00205 painter->drawText(0, 0, w, h-1, AlignCenter,
00206 calendar->weekDayName(daynum, true), -1, &rect);
00207 painter->setPen(colorGroup().text());
00208 painter->moveTo(0, h-1);
00209 painter->lineTo(w-1, h-1);
00210
00211 } else {
00212 bool paintRect=true;
00213 painter->setFont(font);
00214 int pos=7*(row-1)+col;
00215
00216 QDate pCellDate = dateFromPos( pos );
00217
00218 text = calendar->dayString(pCellDate, true);
00219 if( calendar->month(pCellDate) != calendar->month(date) )
00220 {
00221
00222
00223
00224 painter->setPen( colorGroup().mid() );
00225
00226 } else {
00227 if ( d->useCustomColors )
00228 {
00229 KDateTablePrivate::DatePaintingMode *mode=d->customPaintingModes[pCellDate.toString()];
00230 if (mode)
00231 {
00232 if (mode->bgMode != NoBgMode)
00233 {
00234 QBrush oldbrush=painter->brush();
00235 painter->setBrush( mode->bgColor );
00236 switch(mode->bgMode)
00237 {
00238 case(CircleMode) : painter->drawEllipse(0,0,w,h);break;
00239 case(RectangleMode) : painter->drawRect(0,0,w,h);break;
00240 case(NoBgMode) :
00241
00242 default: break;
00243 }
00244 painter->setBrush( oldbrush );
00245 paintRect=false;
00246 }
00247 painter->setPen( mode->fgColor );
00248 } else
00249 painter->setPen(colorGroup().text());
00250 } else
00251 painter->setPen(colorGroup().text());
00252 }
00253
00254 pen=painter->pen();
00255 int firstWeekDay=KGlobal::locale()->weekStartDay();
00256 int offset=firstday-firstWeekDay;
00257 if(offset<1)
00258 offset+=7;
00259 int d = calendar->day(date);
00260 if( (offset+d) == (pos+1))
00261 {
00262
00263 if (isEnabled())
00264 {
00265 painter->setPen(colorGroup().highlight());
00266 painter->setBrush(colorGroup().highlight());
00267 }
00268 else
00269 {
00270 painter->setPen(colorGroup().text());
00271 painter->setBrush(colorGroup().text());
00272 }
00273 pen=colorGroup().highlightedText();
00274 } else {
00275 painter->setBrush(paletteBackgroundColor());
00276 painter->setPen(paletteBackgroundColor());
00277
00278
00279 }
00280
00281 if ( pCellDate == QDate::currentDate() )
00282 {
00283 painter->setPen(colorGroup().text());
00284 }
00285
00286 if ( paintRect ) painter->drawRect(0, 0, w, h);
00287 painter->setPen(pen);
00288 painter->drawText(0, 0, w, h, AlignCenter, text, -1, &rect);
00289 }
00290 if(rect.width()>maxCell.width()) maxCell.setWidth(rect.width());
00291 if(rect.height()>maxCell.height()) maxCell.setHeight(rect.height());
00292 }
00293
00294 void
00295 KDateTable::keyPressEvent( QKeyEvent *e )
00296 {
00297 const KCalendarSystem * calendar = KGlobal::locale()->calendar();
00298 QDate temp = date;
00299
00300 switch( e->key() ) {
00301 case Key_Prior:
00302 temp = calendar->addMonths( date, -1 );
00303 setDate(temp);
00304 return;
00305 case Key_Next:
00306 temp = calendar->addMonths( date, 1 );
00307 setDate(temp);
00308 return;
00309 case Key_Up:
00310 if ( calendar->day(date) > 7 ) {
00311 setDate(date.addDays(-7));
00312 return;
00313 }
00314 break;
00315 case Key_Down:
00316 if ( calendar->day(date) <= calendar->daysInMonth(date)-7 ) {
00317 setDate(date.addDays(7));
00318 return;
00319 }
00320 break;
00321 case Key_Left:
00322 if ( calendar->day(date) > 1 ) {
00323 setDate(date.addDays(-1));
00324 return;
00325 }
00326 break;
00327 case Key_Right:
00328 if ( calendar->day(date) < calendar->daysInMonth(date) ) {
00329 setDate(date.addDays(1));
00330 return;
00331 }
00332 break;
00333 case Key_Minus:
00334 setDate(date.addDays(-1));
00335 return;
00336 case Key_Plus:
00337 setDate(date.addDays(1));
00338 return;
00339 case Key_N:
00340 setDate(QDate::currentDate());
00341 return;
00342 case Key_Return:
00343 case Key_Enter:
00344 emit tableClicked();
00345 return;
00346 default:
00347 break;
00348 }
00349
00350 KNotifyClient::beep();
00351 }
00352
00353 void
00354 KDateTable::viewportResizeEvent(QResizeEvent * e)
00355 {
00356 QGridView::viewportResizeEvent(e);
00357
00358 setCellWidth(viewport()->width()/7);
00359 setCellHeight(viewport()->height()/7);
00360 }
00361
00362 void
00363 KDateTable::setFontSize(int size)
00364 {
00365 int count;
00366 QFontMetrics metrics(fontMetrics());
00367 QRect rect;
00368
00369 fontsize=size;
00370
00371 maxCell.setWidth(0);
00372 maxCell.setHeight(0);
00373 for(count=0; count<7; ++count)
00374 {
00375 rect=metrics.boundingRect(KGlobal::locale()->calendar()
00376 ->weekDayName(count+1, true));
00377 maxCell.setWidth(QMAX(maxCell.width(), rect.width()));
00378 maxCell.setHeight(QMAX(maxCell.height(), rect.height()));
00379 }
00380
00381 rect=metrics.boundingRect(QString::fromLatin1("88"));
00382 maxCell.setWidth(QMAX(maxCell.width()+2, rect.width()));
00383 maxCell.setHeight(QMAX(maxCell.height()+4, rect.height()));
00384 }
00385
00386 void
00387 KDateTable::wheelEvent ( QWheelEvent * e )
00388 {
00389 setDate(date.addMonths( -(int)(e->delta()/120)) );
00390 e->accept();
00391 }
00392
00393 void
00394 KDateTable::contentsMousePressEvent(QMouseEvent *e)
00395 {
00396
00397 if(e->type()!=QEvent::MouseButtonPress)
00398 {
00399 return;
00400 }
00401 if(!isEnabled())
00402 {
00403 KNotifyClient::beep();
00404 return;
00405 }
00406
00407
00408 int row, col, pos, temp;
00409 QPoint mouseCoord;
00410
00411 mouseCoord = e->pos();
00412 row=rowAt(mouseCoord.y());
00413 col=columnAt(mouseCoord.x());
00414 if(row<1 || col<0)
00415 {
00416 return;
00417 }
00418
00419
00420
00421
00422
00423 temp = posFromDate( date );
00424
00425 pos = (7 * (row - 1)) + col;
00426 QDate clickedDate = dateFromPos( pos );
00427
00428
00429
00430 setDate( clickedDate );
00431
00432
00433
00434 updateCell( temp/7+1, temp%7 );
00435 updateCell( row, col );
00436
00437 emit tableClicked();
00438
00439 if ( e->button() == Qt::RightButton && d->popupMenuEnabled )
00440 {
00441 KPopupMenu *menu = new KPopupMenu();
00442 menu->insertTitle( KGlobal::locale()->formatDate(clickedDate) );
00443 emit aboutToShowContextMenu( menu, clickedDate );
00444 menu->popup(e->globalPos());
00445 }
00446 }
00447
00448 bool
00449 KDateTable::setDate(const QDate& date_)
00450 {
00451 bool changed=false;
00452 QDate temp;
00453
00454 if(!date_.isValid())
00455 {
00456 kdDebug() << "KDateTable::setDate: refusing to set invalid date." << endl;
00457 return false;
00458 }
00459 if(date!=date_)
00460 {
00461 emit(dateChanged(date, date_));
00462 date=date_;
00463 emit(dateChanged(date));
00464 changed=true;
00465 }
00466 const KCalendarSystem * calendar = KGlobal::locale()->calendar();
00467
00468 calendar->setYMD(temp, calendar->year(date), calendar->month(date), 1);
00469
00470
00471 firstday=temp.dayOfWeek();
00472 numdays=calendar->daysInMonth(date);
00473
00474 temp = calendar->addMonths(temp, -1);
00475 numDaysPrevMonth=calendar->daysInMonth(temp);
00476 if(changed)
00477 {
00478 repaintContents(false);
00479 }
00480 return true;
00481 }
00482
00483 const QDate&
00484 KDateTable::getDate() const
00485 {
00486 return date;
00487 }
00488
00489
00490 void KDateTable::focusInEvent( QFocusEvent *e )
00491 {
00492
00493 QGridView::focusInEvent( e );
00494 }
00495
00496 void KDateTable::focusOutEvent( QFocusEvent *e )
00497 {
00498
00499 QGridView::focusOutEvent( e );
00500 }
00501
00502 QSize
00503 KDateTable::sizeHint() const
00504 {
00505 if(maxCell.height()>0 && maxCell.width()>0)
00506 {
00507 return QSize(maxCell.width()*numCols()+2*frameWidth(),
00508 (maxCell.height()+2)*numRows()+2*frameWidth());
00509 } else {
00510 kdDebug() << "KDateTable::sizeHint: obscure failure - " << endl;
00511 return QSize(-1, -1);
00512 }
00513 }
00514
00515 void KDateTable::setPopupMenuEnabled( bool enable )
00516 {
00517 d->popupMenuEnabled=enable;
00518 }
00519
00520 bool KDateTable::popupMenuEnabled() const
00521 {
00522 return d->popupMenuEnabled;
00523 }
00524
00525 void KDateTable::setCustomDatePainting(const QDate &date, const QColor &fgColor, BackgroundMode bgMode, const QColor &bgColor)
00526 {
00527 if (!fgColor.isValid())
00528 {
00529 unsetCustomDatePainting( date );
00530 return;
00531 }
00532
00533 KDateTablePrivate::DatePaintingMode *mode=new KDateTablePrivate::DatePaintingMode;
00534 mode->bgMode=bgMode;
00535 mode->fgColor=fgColor;
00536 mode->bgColor=bgColor;
00537
00538 d->customPaintingModes.replace( date.toString(), mode );
00539 d->useCustomColors=true;
00540 update();
00541 }
00542
00543 void KDateTable::unsetCustomDatePainting( const QDate &date )
00544 {
00545 d->customPaintingModes.remove( date.toString() );
00546 }
00547
00548 KDateInternalWeekSelector::KDateInternalWeekSelector
00549 (QWidget* parent, const char* name)
00550 : QLineEdit(parent, name),
00551 val(new QIntValidator(this)),
00552 result(0)
00553 {
00554 QFont font;
00555
00556 font=KGlobalSettings::generalFont();
00557 setFont(font);
00558 setFrameStyle(QFrame::NoFrame);
00559 setValidator(val);
00560 connect(this, SIGNAL(returnPressed()), SLOT(weekEnteredSlot()));
00561 }
00562
00563 void
00564 KDateInternalWeekSelector::weekEnteredSlot()
00565 {
00566 bool ok;
00567 int week;
00568
00569 week=text().toInt(&ok);
00570 if(!ok)
00571 {
00572 KNotifyClient::beep();
00573 return;
00574 }
00575 result=week;
00576 emit(closeMe(1));
00577 }
00578
00579 int
00580 KDateInternalWeekSelector::getWeek()
00581 {
00582 return result;
00583 }
00584
00585 void
00586 KDateInternalWeekSelector::setWeek(int week)
00587 {
00588 QString temp;
00589
00590 temp.setNum(week);
00591 setText(temp);
00592 }
00593
00594 void
00595 KDateInternalWeekSelector::setMaxWeek(int max)
00596 {
00597 val->setRange(1, max);
00598 }
00599
00600
00601
00602
00603 class KDateInternalMonthPicker::KDateInternalMonthPrivate {
00604 public:
00605 KDateInternalMonthPrivate (int y, int m, int d)
00606 : year(y), month(m), day(d)
00607 {};
00608 int year;
00609 int month;
00610 int day;
00611 };
00612
00613 KDateInternalMonthPicker::~KDateInternalMonthPicker() {
00614 delete d;
00615 }
00616
00617 KDateInternalMonthPicker::KDateInternalMonthPicker
00618 (const QDate & date, QWidget* parent, const char* name)
00619 : QGridView(parent, name),
00620 result(0)
00621 {
00622 QRect rect;
00623 QFont font;
00624
00625 activeCol = -1;
00626 activeRow = -1;
00627 font=KGlobalSettings::generalFont();
00628 setFont(font);
00629 setHScrollBarMode(AlwaysOff);
00630 setVScrollBarMode(AlwaysOff);
00631 setFrameStyle(QFrame::NoFrame);
00632 setNumCols(3);
00633 d = new KDateInternalMonthPrivate(date.year(), date.month(), date.day());
00634
00635 setNumRows( (KGlobal::locale()->calendar()->monthsInYear(date) + 2) / 3);
00636
00637
00638 viewport()->setEraseColor(KGlobalSettings::baseColor());
00639
00640
00641 QFontMetrics metrics(font);
00642 for(int i = 1; ; ++i)
00643 {
00644 QString str = KGlobal::locale()->calendar()->monthName(i,
00645 KGlobal::locale()->calendar()->year(date), false);
00646 if (str.isNull()) break;
00647 rect=metrics.boundingRect(str);
00648 if(max.width()<rect.width()) max.setWidth(rect.width());
00649 if(max.height()<rect.height()) max.setHeight(rect.height());
00650 }
00651 }
00652
00653 QSize
00654 KDateInternalMonthPicker::sizeHint() const
00655 {
00656 return QSize((max.width()+6)*numCols()+2*frameWidth(),
00657 (max.height()+6)*numRows()+2*frameWidth());
00658 }
00659
00660 int
00661 KDateInternalMonthPicker::getResult() const
00662 {
00663 return result;
00664 }
00665
00666 void
00667 KDateInternalMonthPicker::setupPainter(QPainter *p)
00668 {
00669 p->setPen(KGlobalSettings::textColor());
00670 }
00671
00672 void
00673 KDateInternalMonthPicker::viewportResizeEvent(QResizeEvent*)
00674 {
00675 setCellWidth(width() / numCols());
00676 setCellHeight(height() / numRows());
00677 }
00678
00679 void
00680 KDateInternalMonthPicker::paintCell(QPainter* painter, int row, int col)
00681 {
00682 int index;
00683 QString text;
00684
00685 index=3*row+col+1;
00686 text=KGlobal::locale()->calendar()->monthName(index,
00687 KGlobal::locale()->calendar()->year(QDate(d->year, d->month,
00688 d->day)), false);
00689 painter->drawText(0, 0, cellWidth(), cellHeight(), AlignCenter, text);
00690 if ( activeCol == col && activeRow == row )
00691 painter->drawRect( 0, 0, cellWidth(), cellHeight() );
00692 }
00693
00694 void
00695 KDateInternalMonthPicker::contentsMousePressEvent(QMouseEvent *e)
00696 {
00697 if(!isEnabled() || e->button() != LeftButton)
00698 {
00699 KNotifyClient::beep();
00700 return;
00701 }
00702
00703 int row, col;
00704 QPoint mouseCoord;
00705
00706 mouseCoord = e->pos();
00707 row=rowAt(mouseCoord.y());
00708 col=columnAt(mouseCoord.x());
00709
00710 if(row<0 || col<0)
00711 {
00712 activeCol = -1;
00713 activeRow = -1;
00714 } else {
00715 activeCol = col;
00716 activeRow = row;
00717 updateCell( row, col );
00718 }
00719 }
00720
00721 void
00722 KDateInternalMonthPicker::contentsMouseMoveEvent(QMouseEvent *e)
00723 {
00724 if (e->state() & LeftButton)
00725 {
00726 int row, col;
00727 QPoint mouseCoord;
00728
00729 mouseCoord = e->pos();
00730 row=rowAt(mouseCoord.y());
00731 col=columnAt(mouseCoord.x());
00732 int tmpRow = -1, tmpCol = -1;
00733 if(row<0 || col<0)
00734 {
00735 if ( activeCol > -1 )
00736 {
00737 tmpRow = activeRow;
00738 tmpCol = activeCol;
00739 }
00740 activeCol = -1;
00741 activeRow = -1;
00742 } else {
00743 bool differentCell = (activeRow != row || activeCol != col);
00744 if ( activeCol > -1 && differentCell)
00745 {
00746 tmpRow = activeRow;
00747 tmpCol = activeCol;
00748 }
00749 if ( differentCell)
00750 {
00751 activeRow = row;
00752 activeCol = col;
00753 updateCell( row, col );
00754 }
00755 }
00756 if ( tmpRow > -1 )
00757 updateCell( tmpRow, tmpCol );
00758 }
00759 }
00760
00761 void
00762 KDateInternalMonthPicker::contentsMouseReleaseEvent(QMouseEvent *e)
00763 {
00764 if(!isEnabled())
00765 {
00766 return;
00767 }
00768
00769 int row, col, pos;
00770 QPoint mouseCoord;
00771
00772 mouseCoord = e->pos();
00773 row=rowAt(mouseCoord.y());
00774 col=columnAt(mouseCoord.x());
00775 if(row<0 || col<0)
00776 {
00777 emit(closeMe(0));
00778 }
00779
00780 pos=3*row+col+1;
00781 result=pos;
00782 emit(closeMe(1));
00783 }
00784
00785
00786
00787 KDateInternalYearSelector::KDateInternalYearSelector
00788 (QWidget* parent, const char* name)
00789 : QLineEdit(parent, name),
00790 val(new QIntValidator(this)),
00791 result(0)
00792 {
00793 QFont font;
00794
00795 font=KGlobalSettings::generalFont();
00796 setFont(font);
00797 setFrameStyle(QFrame::NoFrame);
00798
00799 val->setRange(0, 8000);
00800 setValidator(val);
00801 connect(this, SIGNAL(returnPressed()), SLOT(yearEnteredSlot()));
00802 }
00803
00804 void
00805 KDateInternalYearSelector::yearEnteredSlot()
00806 {
00807 bool ok;
00808 int year;
00809 QDate date;
00810
00811 year=text().toInt(&ok);
00812 if(!ok)
00813 {
00814 KNotifyClient::beep();
00815 return;
00816 }
00817
00818 KGlobal::locale()->calendar()->setYMD(date, year, 1, 1);
00819 if(!date.isValid())
00820 {
00821 KNotifyClient::beep();
00822 return;
00823 }
00824 result=year;
00825 emit(closeMe(1));
00826 }
00827
00828 int
00829 KDateInternalYearSelector::getYear()
00830 {
00831 return result;
00832 }
00833
00834 void
00835 KDateInternalYearSelector::setYear(int year)
00836 {
00837 QString temp;
00838
00839 temp.setNum(year);
00840 setText(temp);
00841 }
00842
00843 KPopupFrame::KPopupFrame(QWidget* parent, const char* name)
00844 : QFrame(parent, name, WType_Popup),
00845 result(0),
00846 main(0)
00847 {
00848 setFrameStyle(QFrame::Box|QFrame::Raised);
00849 setMidLineWidth(2);
00850 }
00851
00852 void
00853 KPopupFrame::keyPressEvent(QKeyEvent* e)
00854 {
00855 if(e->key()==Key_Escape)
00856 {
00857 result=0;
00858 qApp->exit_loop();
00859 }
00860 }
00861
00862 void
00863 KPopupFrame::close(int r)
00864 {
00865 result=r;
00866 qApp->exit_loop();
00867 }
00868
00869 void
00870 KPopupFrame::setMainWidget(QWidget* m)
00871 {
00872 main=m;
00873 if(main!=0)
00874 {
00875 resize(main->width()+2*frameWidth(), main->height()+2*frameWidth());
00876 }
00877 }
00878
00879 void
00880 KPopupFrame::resizeEvent(QResizeEvent*)
00881 {
00882 if(main!=0)
00883 {
00884 main->setGeometry(frameWidth(), frameWidth(),
00885 width()-2*frameWidth(), height()-2*frameWidth());
00886 }
00887 }
00888
00889 void
00890 KPopupFrame::popup(const QPoint &pos)
00891 {
00892
00893 QRect d = KGlobalSettings::desktopGeometry(pos);
00894
00895 int x = pos.x();
00896 int y = pos.y();
00897 int w = width();
00898 int h = height();
00899 if (x+w > d.x()+d.width())
00900 x = d.width() - w;
00901 if (y+h > d.y()+d.height())
00902 y = d.height() - h;
00903 if (x < d.x())
00904 x = 0;
00905 if (y < d.y())
00906 y = 0;
00907
00908
00909 move(x, y);
00910 show();
00911 }
00912
00913 int
00914 KPopupFrame::exec(QPoint pos)
00915 {
00916 popup(pos);
00917 repaint();
00918 qApp->enter_loop();
00919 hide();
00920 return result;
00921 }
00922
00923 int
00924 KPopupFrame::exec(int x, int y)
00925 {
00926 return exec(QPoint(x, y));
00927 }
00928
00929 void KPopupFrame::virtual_hook( int, void* )
00930 { }
00931
00932 void KDateTable::virtual_hook( int, void* )
00933 { }
00934
00935 #include "kdatetbl.moc"