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