00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "mkdatepicker.h"
00022 #include "mkdatepicker.moc"
00023 #include <kglobal.h>
00024 #include <kapplication.h>
00025 #include <klocale.h>
00026 #include <kiconloader.h>
00027 #include <qframe.h>
00028 #include <qpainter.h>
00029 #include <qdialog.h>
00030 #include <qtoolbutton.h>
00031 #include <qfont.h>
00032 #include <qlineedit.h>
00033 #include <qvalidator.h>
00034 #include <kdebug.h>
00035 #include <knotifyclient.h>
00036 #include "mkdatetbl.h"
00037
00038
00039 #include "kcalendarsystem.h"
00040
00041
00042 KDatePicker::KDatePicker(const QString& calType, QWidget *parent, QDate dt, const char *name)
00043 : QFrame(parent,name),
00044
00045 calendarSystem(KCalendarSystemFactory::create(calType)),
00046 yearForward(new QToolButton(this)),
00047 yearBackward(new QToolButton(this)),
00048 monthForward(new QToolButton(this)),
00049 monthBackward(new QToolButton(this)),
00050 selectMonth(new QToolButton(this)),
00051 selectYear(new QToolButton(this)),
00052 line(new QLineEdit(this)),
00053
00054
00055
00056 val(new KDateValidator(calType, this)),
00057 table(new KDateTable(calType, this)),
00058 fontsize(10)
00059 {
00060 kdDebug(5400) << "Iniciado";
00061
00062 setFontSize(10);
00063 line->setValidator(val);
00064 yearForward->setPixmap(BarIcon(QString::fromLatin1("2rightarrow")));
00065 yearBackward->setPixmap(BarIcon(QString::fromLatin1("2leftarrow")));
00066 monthForward->setPixmap(BarIcon(QString::fromLatin1("1rightarrow")));
00067 monthBackward->setPixmap(BarIcon(QString::fromLatin1("1leftarrow")));
00068 setDate(dt);
00069 connect(table, SIGNAL(dateChanged(QDate)), SLOT(dateChangedSlot(QDate)));
00070 connect(table, SIGNAL(tableClicked()), SLOT(tableClickedSlot()));
00071 connect(monthForward, SIGNAL(clicked()), SLOT(monthForwardClicked()));
00072 connect(monthBackward, SIGNAL(clicked()), SLOT(monthBackwardClicked()));
00073 connect(yearForward, SIGNAL(clicked()), SLOT(yearForwardClicked()));
00074 connect(yearBackward, SIGNAL(clicked()), SLOT(yearBackwardClicked()));
00075 connect(selectMonth, SIGNAL(clicked()), SLOT(selectMonthClicked()));
00076 connect(selectYear, SIGNAL(clicked()), SLOT(selectYearClicked()));
00077 connect(line, SIGNAL(returnPressed()), SLOT(lineEnterPressed()));
00078
00079 kdDebug(5400) << "KDatePicker with different calendar systems support" << endl;
00080
00081 }
00082
00083 KDatePicker::~KDatePicker()
00084 {
00085 }
00086
00087 void
00088 KDatePicker::resizeEvent(QResizeEvent*)
00089 {
00090 QWidget *buttons[] = {
00091 yearBackward,
00092 monthBackward,
00093 selectMonth,
00094 selectYear,
00095 monthForward,
00096 yearForward };
00097 const int NoOfButtons=sizeof(buttons)/sizeof(buttons[0]);
00098 QSize sizes[NoOfButtons];
00099 int buttonHeight=0;
00100 int count;
00101 int w;
00102 int x=0;
00103
00104 for(count=0; count<NoOfButtons; ++count) {
00105 sizes[count]=buttons[count]->sizeHint();
00106 buttonHeight=QMAX(buttonHeight, sizes[count].height());
00107 }
00108
00109 w=0;
00110 for(count=0; count<NoOfButtons; ++count) {
00111 if(buttons[count]!=selectMonth)
00112 {
00113 w+=sizes[count].width();
00114 } else {
00115 x=count;
00116 }
00117 }
00118 sizes[x].setWidth(width()-w);
00119
00120 x=0;
00121 for(count=0; count<NoOfButtons; ++count)
00122 {
00123 w=sizes[count].width();
00124 buttons[count]->setGeometry(x, 0, w, buttonHeight);
00125 x+=w;
00126 }
00127
00128 sizes[0]=line->sizeHint();
00129 line->setGeometry(0, height()-sizes[0].height(), width(), sizes[0].height());
00130
00131 table->setGeometry(0, buttonHeight, width(),
00132 height()-buttonHeight-sizes[0].height());
00133 }
00134
00135 void
00136 KDatePicker::dateChangedSlot(QDate date)
00137 {
00138 kdDebug(5400) << "KDatePicker::dateChangedSlot: date changed (" << date.year() << "/" << date.month() << "/" << date.day() << ")." << endl;
00139
00140 line->setText(calendarSystem->formatDate(date));
00141 emit(dateChanged(date));
00142 }
00143
00144 void
00145 KDatePicker::tableClickedSlot()
00146 {
00147 kdDebug(5400) << "KDatePicker::tableClickedSlot: table clicked." << endl;
00148 emit(dateSelected(table->getDate()));
00149 emit(tableClicked());
00150 }
00151
00152 const QDate&
00153 KDatePicker::getDate() const
00154 {
00155 return table->getDate();
00156 }
00157
00158 const QDate &
00159 KDatePicker::date() const
00160 {
00161 return table->getDate();
00162 }
00163
00164 bool
00165 KDatePicker::setDate(const QDate& date)
00166 {
00167 if(date.isValid()) {
00168 QString temp;
00169
00170 table->setDate(date);
00171
00172
00173
00174
00175 selectMonth->setText(calendarSystem->monthName(date));
00176 temp.setNum(calendarSystem->year(date));
00177
00178 selectYear->setText(temp);
00179
00180
00181 line->setText(calendarSystem->formatDate(date));
00182
00183 return true;
00184 } else {
00185 kdDebug(5400) << "KDatePicker::setDate: refusing to set invalid date." << endl;
00186 return false;
00187 }
00188 }
00189
00190 void
00191 KDatePicker::monthForwardClicked()
00192 {
00193 QDate temp=table->getDate();
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 calendarSystem->nextMonthDate(temp);
00209
00210 setDate(temp);
00211 }
00212
00213 void
00214 KDatePicker::monthBackwardClicked()
00215 {
00216 QDate temp=table->getDate();
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 calendarSystem->previousMonthDate(temp);
00235
00236 setDate(temp);
00237 }
00238
00239 void
00240 KDatePicker::yearForwardClicked()
00241 {
00242 QDate temp=table->getDate();
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 calendarSystem->nextYearDate(temp);
00255
00256 setDate(temp);
00257 }
00258
00259 void
00260 KDatePicker::yearBackwardClicked()
00261 {
00262 QDate temp=table->getDate();
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 calendarSystem->previousYearDate(temp);
00275
00276 setDate(temp);
00277 }
00278
00279 void
00280 KDatePicker::selectMonthClicked()
00281 {
00282 int month;
00283
00284
00285 QDate temp = table->getDate();
00286 int year = calendarSystem->year(temp);
00287
00288 KPopupFrame* popup = new KPopupFrame(this);
00289
00290
00291 KDateInternalMonthPicker* picker = new KDateInternalMonthPicker( fontsize, popup, year, calendarSystem );
00292
00293
00294 picker->resize(picker->sizeHint());
00295 popup->setMainWidget(picker);
00296 picker->setFocus();
00297 connect(picker, SIGNAL(closeMe(int)), popup, SLOT(close(int)));
00298 if(popup->exec(selectMonth->mapToGlobal(QPoint(0, selectMonth->height()))))
00299 {
00300 QDate date;
00301
00302
00303 month=picker->getResult();
00304 date=table->getDate();
00305
00306
00307 calendarSystem->constructDateInMonth(date, month);
00308
00309
00310
00311
00312
00313
00314 setDate(date);
00315 } else {
00316 KNotifyClient::beep();
00317 }
00318 delete popup;
00319 }
00320
00321 void
00322 KDatePicker::selectYearClicked()
00323 {
00324 int year;
00325 KPopupFrame* popup = new KPopupFrame(this);
00326
00327
00328 KDateInternalYearSelector* picker = new KDateInternalYearSelector(fontsize, calendarSystem, popup);
00329
00330
00331
00332 picker->resize(picker->sizeHint());
00333 popup->setMainWidget(picker);
00334 connect(picker, SIGNAL(closeMe(int)), popup, SLOT(close(int)));
00335 picker->setFocus();
00336 if(popup->exec(selectYear->mapToGlobal(QPoint(0, selectMonth->height()))))
00337 {
00338 QDate date;
00339
00340
00341
00342
00343 year=picker->getYear();
00344 date=table->getDate();
00345
00346
00347 calendarSystem->constructDateInYear(date, year);
00348
00349
00350
00351
00352
00353 setDate(date);
00354 } else {
00355 KNotifyClient::beep();
00356 }
00357 delete popup;
00358 }
00359
00360 void
00361 KDatePicker::setEnabled(bool enable)
00362 {
00363 QWidget *widgets[]= {
00364 yearForward, yearBackward, monthForward, monthBackward,
00365 selectMonth, selectYear,
00366 line, table };
00367 const int Size=sizeof(widgets)/sizeof(widgets[0]);
00368 int count;
00369
00370 for(count=0; count<Size; ++count)
00371 {
00372 widgets[count]->setEnabled(enable);
00373 }
00374 }
00375
00376 void
00377 KDatePicker::lineEnterPressed()
00378 {
00379 QDate temp;
00380
00381 if(val->date(line->text(), temp)==QValidator::Acceptable)
00382 {
00383 kdDebug(5400) << "KDatePicker::lineEnterPressed: valid date entered." << endl;
00384 emit(dateEntered(temp));
00385 setDate(temp);
00386 } else {
00387 KNotifyClient::beep();
00388 kdDebug(5400) << "KDatePicker::lineEnterPressed: invalid date entered." << endl;
00389 }
00390 }
00391
00392 QSize
00393 KDatePicker::sizeHint() const
00394 {
00395 QSize tableSize=table->sizeHint();
00396 QWidget *buttons[]={
00397 yearBackward,
00398 monthBackward,
00399 selectMonth,
00400 selectYear,
00401 monthForward,
00402 yearForward };
00403 const int NoOfButtons=sizeof(buttons)/sizeof(buttons[0]);
00404 QSize sizes[NoOfButtons];
00405 int cx=0, cy=0, count;
00406
00407 for(count=0; count<NoOfButtons; ++count)
00408 {
00409 sizes[count]=buttons[count]->sizeHint();
00410 if(buttons[count]==selectMonth)
00411 {
00412 cx+=maxMonthRect.width();
00413 } else {
00414 cx+=sizes[count].width();
00415 }
00416 cy=QMAX(sizes[count].height(), cy);
00417 }
00418
00419 cx=QMAX(cx, tableSize.width());
00420
00421 cy+=tableSize.height()+line->sizeHint().height();
00422 return QSize(cx, cy);
00423 }
00424
00425 void
00426 KDatePicker::setFontSize(int s)
00427 {
00428 QWidget *buttons[]= {
00429
00430
00431 selectMonth,
00432 selectYear,
00433
00434
00435 };
00436 const int NoOfButtons=sizeof(buttons)/sizeof(buttons[0]);
00437 int count;
00438 QFont font;
00439 QRect r;
00440
00441 fontsize=s;
00442 for(count=0; count<NoOfButtons; ++count)
00443 {
00444 font=buttons[count]->font();
00445 font.setPointSize(s);
00446 buttons[count]->setFont(font);
00447 }
00448 QFontMetrics metrics(selectMonth->fontMetrics());
00449 for(int i=1; i <= 12; ++i)
00450 {
00451
00452 r = metrics.boundingRect( calendarSystem->monthName(i) );
00453 maxMonthRect.setWidth(QMAX(r.width(), maxMonthRect.width()));
00454 maxMonthRect.setHeight(QMAX(r.height(), maxMonthRect.height()));
00455 }
00456 table->setFontSize(s);
00457 }
00458
00459 void KDatePicker::virtual_hook( int id, void* data )
00460 { }
00461