kdateedit.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <qevent.h>
00026 #include <qlineedit.h>
00027 #include <qapplication.h>
00028 #include <qlistbox.h>
00029
00030 #include <kdatepicker.h>
00031 #include <knotifyclient.h>
00032 #include <kdebug.h>
00033 #include <kglobal.h>
00034 #include <klocale.h>
00035
00036 #include "kdateedit.moc"
00037
00038
00039 KDateEdit::KDateEdit(QWidget *parent, const char *name)
00040 : QComboBox(true, parent, name),
00041 defaultValue(QDate::currentDate()),
00042 mDiscardNextMousePress(false)
00043 {
00044 setMaxCount(1);
00045 value = defaultValue;
00046 QString today = KGlobal::locale()->formatDate(value, true);
00047 insertItem(today);
00048 setCurrentItem(0);
00049 changeItem(today, 0);
00050 setMinimumSize(sizeHint());
00051
00052 mDateFrame = new QVBox(0,0,WType_Popup);
00053 mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised);
00054 mDateFrame->setLineWidth(3);
00055 mDateFrame->hide();
00056 mDateFrame->installEventFilter(this);
00057
00058 mDatePicker = new KDatePicker(mDateFrame, value);
00059
00060 connect(lineEdit(),SIGNAL(returnPressed()),SLOT(lineEnterPressed()));
00061 connect(this,SIGNAL(textChanged(const QString &)),
00062 SLOT(slotTextChanged(const QString &)));
00063
00064 connect(mDatePicker,SIGNAL(dateEntered(QDate)),SLOT(dateEntered(QDate)));
00065 connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(dateSelected(QDate)));
00066
00067
00068
00069 mKeywordMap[i18n("tomorrow")] = 1;
00070 mKeywordMap[i18n("today")] = 0;
00071 mKeywordMap[i18n("yesterday")] = -1;
00072
00073 QString dayName;
00074 for (int i = 1; i <= 7; ++i)
00075 {
00076 dayName = KGlobal::locale()->weekDayName(i).lower();
00077 mKeywordMap[dayName] = i + 100;
00078 }
00079 lineEdit()->installEventFilter(this);
00080
00081 mTextChanged = false;
00082 mHandleInvalid = false;
00083 }
00084
00085 KDateEdit::~KDateEdit()
00086 {
00087 delete mDateFrame;
00088 }
00089
00090 void KDateEdit::setDate(const QDate& newDate)
00091 {
00092 if (!newDate.isValid() && !mHandleInvalid)
00093 return;
00094
00095 QString dateString = "";
00096 if(newDate.isValid())
00097 dateString = KGlobal::locale()->formatDate( newDate, true );
00098
00099 mTextChanged = false;
00100
00101
00102
00103 bool b = signalsBlocked();
00104 blockSignals(true);
00105 changeItem(dateString, 0);
00106 blockSignals(b);
00107
00108 value = newDate;
00109 }
00110
00111 void KDateEdit::setHandleInvalid(bool handleInvalid)
00112 {
00113 mHandleInvalid = handleInvalid;
00114 }
00115
00116 bool KDateEdit::validate( const QDate & )
00117 {
00118 return true;
00119 }
00120
00121 QDate KDateEdit::date() const
00122 {
00123 QDate dt;
00124 if (readDate(dt) && (mHandleInvalid || dt.isValid())) {
00125 return dt;
00126 }
00127 return defaultValue;
00128 }
00129
00130 QDate KDateEdit::defaultDate() const
00131 {
00132 return defaultValue;
00133 }
00134
00135 void KDateEdit::setDefaultDate(const QDate& date)
00136 {
00137 defaultValue = date;
00138 }
00139
00140 void KDateEdit::popup()
00141 {
00142 QPoint popupPoint = mapToGlobal( QPoint( 0,0 ) );
00143 if ( popupPoint.x() < 0 ) popupPoint.setX( 0 );
00144
00145 int desktopHeight = QApplication::desktop()->height();
00146 int dateFrameHeight = mDateFrame->sizeHint().height();
00147
00148 if ( popupPoint.y() + height() + dateFrameHeight > desktopHeight ) {
00149 popupPoint.setY( popupPoint.y() - dateFrameHeight );
00150 } else {
00151 popupPoint.setY( popupPoint.y() + height() );
00152 }
00153
00154 mDateFrame->move( popupPoint );
00155
00156 QDate date;
00157 readDate(date);
00158 if (date.isValid()) {
00159 mDatePicker->setDate( date );
00160 } else {
00161 mDatePicker->setDate( defaultValue );
00162 }
00163
00164 mDateFrame->show();
00165
00166
00167
00168 QListBox *lb = listBox();
00169 if (lb) {
00170 lb->setCurrentItem(0);
00171 QKeyEvent* keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, 0, 0);
00172 QApplication::postEvent(lb, keyEvent);
00173 }
00174 }
00175
00176 void KDateEdit::dateSelected(QDate newDate)
00177 {
00178 if ((mHandleInvalid || newDate.isValid()) && validate(newDate)) {
00179 setDate(newDate);
00180 emit dateChanged(newDate);
00181 mDateFrame->hide();
00182 }
00183 }
00184
00185 void KDateEdit::dateEntered(QDate newDate)
00186 {
00187 if ((mHandleInvalid || newDate.isValid()) && validate(newDate)) {
00188 setDate(newDate);
00189 emit dateChanged(newDate);
00190 }
00191 }
00192
00193 void KDateEdit::lineEnterPressed()
00194 {
00195 QDate date;
00196 if (readDate(date) && (mHandleInvalid || date.isValid()) && validate(date))
00197 {
00198
00199
00200 setDate(date);
00201 emit(dateChanged(date));
00202 }
00203 else {
00204
00205 KNotifyClient::beep();
00206 setDate(value);
00207 emit invalidDateEntered();
00208 }
00209 }
00210
00211 bool KDateEdit::inputIsValid() const
00212 {
00213 QDate date;
00214 return readDate(date) && date.isValid();
00215 }
00216
00217
00218
00219
00220
00221
00222 bool KDateEdit::readDate(QDate& result) const
00223 {
00224 QString text = currentText();
00225
00226 if (text.isEmpty()) {
00227 result = QDate();
00228 }
00229 else if (mKeywordMap.contains(text.lower()))
00230 {
00231 QDate today = QDate::currentDate();
00232 int i = mKeywordMap[text.lower()];
00233 if (i >= 100)
00234 {
00235
00236
00237
00238
00239
00240
00241
00242
00243 i -= 100;
00244 int currentDay = today.dayOfWeek();
00245 if (i >= currentDay)
00246 i -= currentDay;
00247 else
00248 i += 7 - currentDay;
00249 }
00250 result = today.addDays(i);
00251 }
00252 else
00253 {
00254 result = KGlobal::locale()->readDate(text);
00255 return result.isValid();
00256 }
00257
00258 return true;
00259 }
00260
00261
00262
00263
00264 bool KDateEdit::eventFilter(QObject *obj, QEvent *e)
00265 {
00266 if (obj == lineEdit()) {
00267
00268
00269 if ((e->type() == QEvent::FocusOut) && mTextChanged)
00270 {
00271 lineEnterPressed();
00272 mTextChanged = false;
00273 }
00274 else if (e->type() == QEvent::KeyPress)
00275 {
00276
00277 QKeyEvent* ke = (QKeyEvent*)e;
00278 int step = 0;
00279 if (ke->key() == Qt::Key_Up)
00280 step = 1;
00281 else if (ke->key() == Qt::Key_Down)
00282 step = -1;
00283 if (step)
00284 {
00285 QDate date;
00286 if (readDate(date) && date.isValid()) {
00287 date = date.addDays(step);
00288 if (validate(date)) {
00289 setDate(date);
00290 emit(dateChanged(date));
00291 return true;
00292 }
00293 }
00294 }
00295 }
00296 }
00297 else {
00298
00299 switch (e->type()) {
00300 case QEvent::MouseButtonDblClick:
00301 case QEvent::MouseButtonPress: {
00302 QMouseEvent *me = (QMouseEvent*)e;
00303 if (!mDateFrame->rect().contains(me->pos())) {
00304 QPoint globalPos = mDateFrame->mapToGlobal(me->pos());
00305 if (QApplication::widgetAt(globalPos, true) == this) {
00306
00307
00308 mDiscardNextMousePress = true;
00309 }
00310 }
00311 break;
00312 }
00313 default:
00314 break;
00315 }
00316 }
00317
00318 return false;
00319 }
00320
00321 void KDateEdit::mousePressEvent(QMouseEvent *e)
00322 {
00323 if (e->button() == Qt::LeftButton && mDiscardNextMousePress) {
00324 mDiscardNextMousePress = false;
00325 return;
00326 }
00327 QComboBox::mousePressEvent(e);
00328 }
00329
00330 void KDateEdit::slotTextChanged(const QString &)
00331 {
00332 mTextChanged = true;
00333 }
This file is part of the documentation for kdelibs Version 3.1.4.