-rw-r--r-- | libkdepim/kdateedit.cpp | 9 | ||||
-rw-r--r-- | libkdepim/kdateedit.h | 2 |
2 files changed, 11 insertions, 0 deletions
diff --git a/libkdepim/kdateedit.cpp b/libkdepim/kdateedit.cpp index 3d9e690..bf38479 100644 --- a/libkdepim/kdateedit.cpp +++ b/libkdepim/kdateedit.cpp | |||
@@ -1,326 +1,335 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of libkdepim. | 2 | This file is part of libkdepim. |
3 | 3 | ||
4 | Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org> | 4 | Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org> |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
8 | the Free Software Foundation; either version 2 of the License, or | 8 | the Free Software Foundation; either version 2 of the License, or |
9 | (at your option) any later version. | 9 | (at your option) any later version. |
10 | 10 | ||
11 | This program is distributed in the hope that it will be useful, | 11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. | 14 | GNU General Public License for more details. |
15 | 15 | ||
16 | You should have received a copy of the GNU General Public License | 16 | You should have received a copy of the GNU General Public License |
17 | along with this program; if not, write to the Free Software | 17 | along with this program; if not, write to the Free Software |
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 | 19 | ||
20 | As a special exception, permission is given to link this program | 20 | As a special exception, permission is given to link this program |
21 | with any edition of Qt, and distribute the resulting executable, | 21 | with any edition of Qt, and distribute the resulting executable, |
22 | without including the source code for Qt in the source distribution. | 22 | without including the source code for Qt in the source distribution. |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <qapplication.h> | 25 | #include <qapplication.h> |
26 | #include <qevent.h> | 26 | #include <qevent.h> |
27 | #include <qlineedit.h> | 27 | #include <qlineedit.h> |
28 | #include <qpixmap.h> | 28 | #include <qpixmap.h> |
29 | #include <qpushbutton.h> | 29 | #include <qpushbutton.h> |
30 | 30 | ||
31 | #include <kdatepicker.h> | 31 | #include <kdatepicker.h> |
32 | #include <kdebug.h> | 32 | #include <kdebug.h> |
33 | #include <kglobal.h> | 33 | #include <kglobal.h> |
34 | #include <kiconloader.h> | 34 | #include <kiconloader.h> |
35 | #include <klocale.h> | 35 | #include <klocale.h> |
36 | #include <kmessagebox.h> | 36 | #include <kmessagebox.h> |
37 | #include <knotifyclient.h> | 37 | #include <knotifyclient.h> |
38 | #include <qpalette.h> | 38 | #include <qpalette.h> |
39 | 39 | ||
40 | #include "kdateedit.h" | 40 | #include "kdateedit.h" |
41 | //#include "kdateedit.moc" | 41 | //#include "kdateedit.moc" |
42 | 42 | ||
43 | KDateEdit::KDateEdit(QWidget *parent, const char *name, bool withoutDP ) | 43 | KDateEdit::KDateEdit(QWidget *parent, const char *name, bool withoutDP ) |
44 | : QHBox(parent, name) | 44 | : QHBox(parent, name) |
45 | { | 45 | { |
46 | dateFormShort = true; | 46 | dateFormShort = true; |
47 | withoutDp = withoutDP; | 47 | withoutDp = withoutDP; |
48 | mDateEdit = new QLineEdit(this); | 48 | mDateEdit = new QLineEdit(this); |
49 | mDateEdit->setText(KGlobal::locale()->formatDate(QDate::currentDate(),dateFormShort)); | 49 | mDateEdit->setText(KGlobal::locale()->formatDate(QDate::currentDate(),dateFormShort)); |
50 | setFocusProxy(mDateEdit); | 50 | setFocusProxy(mDateEdit); |
51 | mDateEdit->installEventFilter(this); | 51 | mDateEdit->installEventFilter(this); |
52 | 52 | ||
53 | // Highlight Background and Textcolor | 53 | // Highlight Background and Textcolor |
54 | QPalette palette = QWidget::palette(); | 54 | QPalette palette = QWidget::palette(); |
55 | unsigned char red, green, blue; | 55 | unsigned char red, green, blue; |
56 | red = palette.color( QPalette::Normal , QColorGroup::Background ).red() - 10; | 56 | red = palette.color( QPalette::Normal , QColorGroup::Background ).red() - 10; |
57 | green = palette.color( QPalette::Normal , QColorGroup::Background ).green() - 10; | 57 | green = palette.color( QPalette::Normal , QColorGroup::Background ).green() - 10; |
58 | blue = palette.color( QPalette::Normal , QColorGroup::Background ).blue() - 10; | 58 | blue = palette.color( QPalette::Normal , QColorGroup::Background ).blue() - 10; |
59 | palette.setColor( QColorGroup::Highlight, QColor(red,green,blue) ); | 59 | palette.setColor( QColorGroup::Highlight, QColor(red,green,blue) ); |
60 | palette.setColor( QColorGroup::HighlightedText, palette.color( QPalette::Normal , QColorGroup::Foreground ) ); | 60 | palette.setColor( QColorGroup::HighlightedText, palette.color( QPalette::Normal , QColorGroup::Foreground ) ); |
61 | mDateEdit->setPalette( palette ); | 61 | mDateEdit->setPalette( palette ); |
62 | 62 | ||
63 | if ( withoutDP ) { | 63 | if ( withoutDP ) { |
64 | mDateFrame = 0; | 64 | mDateFrame = 0; |
65 | mDateButton = 0; | 65 | mDateButton = 0; |
66 | mDatePicker = 0; | 66 | mDatePicker = 0; |
67 | } else { | 67 | } else { |
68 | QPixmap pixmap = SmallIcon("smallcal"); | 68 | QPixmap pixmap = SmallIcon("smallcal"); |
69 | mDateButton = new QPushButton(this); | 69 | mDateButton = new QPushButton(this); |
70 | mDateButton->setPixmap(pixmap); | 70 | mDateButton->setPixmap(pixmap); |
71 | QPixmap pixmap2 = SmallIcon("today_small"); | ||
72 | QPushButton* nowButton = new QPushButton(this); | ||
73 | nowButton->setPixmap(pixmap2); | ||
71 | 74 | ||
72 | mDateFrame = new QVBox(0,0,WType_Popup); | 75 | mDateFrame = new QVBox(0,0,WType_Popup); |
73 | // mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised); | 76 | // mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised); |
74 | mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised ); | 77 | mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised ); |
75 | mDateFrame->setLineWidth(3); | 78 | mDateFrame->setLineWidth(3); |
76 | mDateFrame->hide(); | 79 | mDateFrame->hide(); |
77 | 80 | ||
78 | mDatePicker = new KDatePicker(mDateFrame,QDate::currentDate()); | 81 | mDatePicker = new KDatePicker(mDateFrame,QDate::currentDate()); |
79 | connect(mDatePicker,SIGNAL(dateEntered(QDate)),SLOT(setDate(QDate))); | 82 | connect(mDatePicker,SIGNAL(dateEntered(QDate)),SLOT(setDate(QDate))); |
80 | connect(mDatePicker,SIGNAL(dateEntered(QDate)),SIGNAL(dateChanged(QDate))); | 83 | connect(mDatePicker,SIGNAL(dateEntered(QDate)),SIGNAL(dateChanged(QDate))); |
81 | connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(setDate(QDate))); | 84 | connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(setDate(QDate))); |
82 | connect(mDatePicker,SIGNAL(dateSelected(QDate)),SIGNAL(dateChanged(QDate))); | 85 | connect(mDatePicker,SIGNAL(dateSelected(QDate)),SIGNAL(dateChanged(QDate))); |
83 | connect(mDatePicker,SIGNAL(dateSelected(QDate)),mDateFrame,SLOT(hide())); | 86 | connect(mDatePicker,SIGNAL(dateSelected(QDate)),mDateFrame,SLOT(hide())); |
84 | connect(mDateButton,SIGNAL(clicked()),SLOT(toggleDatePicker())); | 87 | connect(mDateButton,SIGNAL(clicked()),SLOT(toggleDatePicker())); |
88 | connect(nowButton,SIGNAL(clicked()),SLOT(goToNow())); | ||
85 | mDateButton->setFocusPolicy( QWidget::NoFocus ); | 89 | mDateButton->setFocusPolicy( QWidget::NoFocus ); |
86 | mDateButton->setAutoDefault( false ); | 90 | mDateButton->setAutoDefault( false ); |
87 | //mDateFrame->resize( 400, 300 ); | 91 | //mDateFrame->resize( 400, 300 ); |
88 | 92 | ||
89 | } | 93 | } |
90 | connect(mDateEdit,SIGNAL(returnPressed()),SLOT(lineEnterPressed())); | 94 | connect(mDateEdit,SIGNAL(returnPressed()),SLOT(lineEnterPressed())); |
91 | connect(mDateEdit,SIGNAL(textChanged(const QString &)), | 95 | connect(mDateEdit,SIGNAL(textChanged(const QString &)), |
92 | SLOT(textChanged(const QString &))); | 96 | SLOT(textChanged(const QString &))); |
93 | 97 | ||
94 | // Create the keyword list. This will be used to match against when the user | 98 | // Create the keyword list. This will be used to match against when the user |
95 | // enters information. | 99 | // enters information. |
96 | mKeywordMap[i18n("tomorrow")] = 1; | 100 | mKeywordMap[i18n("tomorrow")] = 1; |
97 | mKeywordMap[i18n("today")] = 0; | 101 | mKeywordMap[i18n("today")] = 0; |
98 | mKeywordMap[i18n("yesterday")] = -1; | 102 | mKeywordMap[i18n("yesterday")] = -1; |
99 | 103 | ||
100 | /* | 104 | /* |
101 | * This loop uses some math tricks to figure out the offset in days | 105 | * This loop uses some math tricks to figure out the offset in days |
102 | * to the next date the given day of the week occurs. There | 106 | * to the next date the given day of the week occurs. There |
103 | * are two cases, that the new day is >= the current day, which means | 107 | * are two cases, that the new day is >= the current day, which means |
104 | * the new day has not occured yet or that the new day < the current day, | 108 | * the new day has not occured yet or that the new day < the current day, |
105 | * which means the new day is already passed (so we need to find the | 109 | * which means the new day is already passed (so we need to find the |
106 | * day in the next week). | 110 | * day in the next week). |
107 | */ | 111 | */ |
108 | QString dayName; | 112 | QString dayName; |
109 | int currentDay = QDate::currentDate().dayOfWeek(); | 113 | int currentDay = QDate::currentDate().dayOfWeek(); |
110 | for (int i = 1; i <= 7; ++i) | 114 | for (int i = 1; i <= 7; ++i) |
111 | { | 115 | { |
112 | dayName = KGlobal::locale()->weekDayName(i).lower(); | 116 | dayName = KGlobal::locale()->weekDayName(i).lower(); |
113 | if (i >= currentDay) | 117 | if (i >= currentDay) |
114 | mKeywordMap[dayName] = i - currentDay; | 118 | mKeywordMap[dayName] = i - currentDay; |
115 | else | 119 | else |
116 | mKeywordMap[dayName] = 7 - currentDay + i; | 120 | mKeywordMap[dayName] = 7 - currentDay + i; |
117 | } | 121 | } |
118 | 122 | ||
119 | mTextChanged = false; | 123 | mTextChanged = false; |
120 | mHandleInvalid = false; | 124 | mHandleInvalid = false; |
121 | // QWidget::setTabOrder( mDateEdit, mDateButton ); | 125 | // QWidget::setTabOrder( mDateEdit, mDateButton ); |
122 | } | 126 | } |
123 | 127 | ||
124 | KDateEdit::~KDateEdit() | 128 | KDateEdit::~KDateEdit() |
125 | { | 129 | { |
126 | delete mDateFrame; | 130 | delete mDateFrame; |
127 | } | 131 | } |
128 | void KDateEdit::clear() | 132 | void KDateEdit::clear() |
129 | { | 133 | { |
130 | bool b = mDateEdit->signalsBlocked(); | 134 | bool b = mDateEdit->signalsBlocked(); |
131 | mDateEdit->blockSignals(true); | 135 | mDateEdit->blockSignals(true); |
132 | mDateEdit->setText(""); | 136 | mDateEdit->setText(""); |
133 | mDateEdit->blockSignals(b); | 137 | mDateEdit->blockSignals(b); |
134 | } | 138 | } |
139 | void KDateEdit::goToNow() | ||
140 | { | ||
141 | setDate(QDate::currentDate() ); | ||
142 | emit setTimeTo( QTime::currentTime() ); | ||
143 | } | ||
135 | void KDateEdit::setDate(QDate newDate) | 144 | void KDateEdit::setDate(QDate newDate) |
136 | { | 145 | { |
137 | if (!newDate.isValid() && !mHandleInvalid) | 146 | if (!newDate.isValid() && !mHandleInvalid) |
138 | return; | 147 | return; |
139 | if ( readDate() == newDate ) | 148 | if ( readDate() == newDate ) |
140 | return; | 149 | return; |
141 | QString dateString = ""; | 150 | QString dateString = ""; |
142 | if(newDate.isValid()) | 151 | if(newDate.isValid()) |
143 | dateString = KGlobal::locale()->formatDate( newDate, dateFormShort ); | 152 | dateString = KGlobal::locale()->formatDate( newDate, dateFormShort ); |
144 | 153 | ||
145 | mTextChanged = false; | 154 | mTextChanged = false; |
146 | 155 | ||
147 | // We do not want to generate a signal here, since we explicity setting | 156 | // We do not want to generate a signal here, since we explicity setting |
148 | // the date | 157 | // the date |
149 | bool b = mDateEdit->signalsBlocked(); | 158 | bool b = mDateEdit->signalsBlocked(); |
150 | mDateEdit->blockSignals(true); | 159 | mDateEdit->blockSignals(true); |
151 | mDateEdit->setText(dateString); | 160 | mDateEdit->setText(dateString); |
152 | mDateEdit->blockSignals(b); | 161 | mDateEdit->blockSignals(b); |
153 | } | 162 | } |
154 | 163 | ||
155 | void KDateEdit::setDate( QDate date,int *cpos,const int key ,const bool dateFormShort) | 164 | void KDateEdit::setDate( QDate date,int *cpos,const int key ,const bool dateFormShort) |
156 | { | 165 | { |
157 | QString dateForm = dateFormShort ? | 166 | QString dateForm = dateFormShort ? |
158 | KGlobal::locale()->dateFormatShort() : | 167 | KGlobal::locale()->dateFormatShort() : |
159 | KGlobal::locale()->dateFormat(); | 168 | KGlobal::locale()->dateFormat(); |
160 | 169 | ||
161 | int begin = dateForm.find("%"); | 170 | int begin = dateForm.find("%"); |
162 | int space = 0; | 171 | int space = 0; |
163 | int allStrLength = 0; | 172 | int allStrLength = 0; |
164 | int strLength = 0; | 173 | int strLength = 0; |
165 | int repeat = 0; | 174 | int repeat = 0; |
166 | 175 | ||
167 | // witch? Day, Month or Year switch? | 176 | // witch? Day, Month or Year switch? |
168 | while(1){ | 177 | while(1){ |
169 | switch ( dateForm.at(begin + 1).latin1() ) | 178 | switch ( dateForm.at(begin + 1).latin1() ) |
170 | { | 179 | { |
171 | case 'd':// 16 (month day) | 180 | case 'd':// 16 (month day) |
172 | strLength = 2; //Ok | 181 | strLength = 2; //Ok |
173 | break; | 182 | break; |
174 | case 'm':// 01 (month) | 183 | case 'm':// 01 (month) |
175 | strLength = 2; //Ok | 184 | strLength = 2; //Ok |
176 | break; | 185 | break; |
177 | case 'a':// Mon (Weekday) | 186 | case 'a':// Mon (Weekday) |
178 | strLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), true).length(); | 187 | strLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), true).length(); |
179 | break; | 188 | break; |
180 | case 'A':// Monday (Weekday) | 189 | case 'A':// Monday (Weekday) |
181 | strLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), false).length(); | 190 | strLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), false).length(); |
182 | break; | 191 | break; |
183 | case 'b':// Jan (monthName) | 192 | case 'b':// Jan (monthName) |
184 | strLength = KGlobal::locale()->monthName(date.month(), true).length(); | 193 | strLength = KGlobal::locale()->monthName(date.month(), true).length(); |
185 | break; | 194 | break; |
186 | case 'B':// January (monthName) | 195 | case 'B':// January (monthName) |
187 | strLength = KGlobal::locale()->monthName(date.month(), false).length(); | 196 | strLength = KGlobal::locale()->monthName(date.month(), false).length(); |
188 | break; | 197 | break; |
189 | case 'y':// 04 (year short) | 198 | case 'y':// 04 (year short) |
190 | strLength = 2; //Ok | 199 | strLength = 2; //Ok |
191 | break; | 200 | break; |
192 | case 'Y':// 2004 (year) | 201 | case 'Y':// 2004 (year) |
193 | strLength = 4; //Ok | 202 | strLength = 4; //Ok |
194 | break; | 203 | break; |
195 | default: | 204 | default: |
196 | break; | 205 | break; |
197 | } | 206 | } |
198 | space = begin - (repeat++ * 2); | 207 | space = begin - (repeat++ * 2); |
199 | // all select? then dayswitch | 208 | // all select? then dayswitch |
200 | if( (mDateEdit->text().length() == mDateEdit->markedText().length() ) && | 209 | if( (mDateEdit->text().length() == mDateEdit->markedText().length() ) && |
201 | ( (dateForm.at(begin + 1).latin1() == 'd') || | 210 | ( (dateForm.at(begin + 1).latin1() == 'd') || |
202 | (dateForm.at(begin + 1).latin1() == 'a') || | 211 | (dateForm.at(begin + 1).latin1() == 'a') || |
203 | (dateForm.at(begin + 1).latin1() == 'A') ) ) { | 212 | (dateForm.at(begin + 1).latin1() == 'A') ) ) { |
204 | break; | 213 | break; |
205 | } | 214 | } |
206 | // mDateEdit-StringPos == CursorPosition(cpos) then break and set date | 215 | // mDateEdit-StringPos == CursorPosition(cpos) then break and set date |
207 | if( ( (space + allStrLength) <= *cpos && *cpos <= (space + allStrLength + strLength) ) || *cpos < begin ) { | 216 | if( ( (space + allStrLength) <= *cpos && *cpos <= (space + allStrLength + strLength) ) || *cpos < begin ) { |
208 | break; | 217 | break; |
209 | } | 218 | } |
210 | allStrLength += strLength; | 219 | allStrLength += strLength; |
211 | begin = dateForm.find("%", begin +1); | 220 | begin = dateForm.find("%", begin +1); |
212 | } | 221 | } |
213 | 222 | ||
214 | // set date | 223 | // set date |
215 | switch ( dateForm.at(begin + 1).latin1() ) { | 224 | switch ( dateForm.at(begin + 1).latin1() ) { |
216 | case 'd': | 225 | case 'd': |
217 | case 'a': | 226 | case 'a': |
218 | case 'A': | 227 | case 'A': |
219 | if(key == Key_Up) { | 228 | if(key == Key_Up) { |
220 | setDate( date.addDays( 1 ) ); | 229 | setDate( date.addDays( 1 ) ); |
221 | } | 230 | } |
222 | else if(key == Key_Down) { | 231 | else if(key == Key_Down) { |
223 | setDate( date.addDays( -1 ) ); | 232 | setDate( date.addDays( -1 ) ); |
224 | } | 233 | } |
225 | maxDay = readDate().day(); | 234 | maxDay = readDate().day(); |
226 | break; | 235 | break; |
227 | case 'm': | 236 | case 'm': |
228 | case 'b': | 237 | case 'b': |
229 | case 'B': | 238 | case 'B': |
230 | if(key == Key_Up) { | 239 | if(key == Key_Up) { |
231 | int year = ((date.month()+1)>12)?date.year()+1:date.year(); | 240 | int year = ((date.month()+1)>12)?date.year()+1:date.year(); |
232 | int month = ((date.month()+1)>12)?1:date.month()+1; | 241 | int month = ((date.month()+1)>12)?1:date.month()+1; |
233 | int day = (QDate(year,month,1).daysInMonth()<maxDay)?QDate(year,month,1).daysInMonth():maxDay; | 242 | int day = (QDate(year,month,1).daysInMonth()<maxDay)?QDate(year,month,1).daysInMonth():maxDay; |
234 | setDate( QDate( year, month, day ) ); | 243 | setDate( QDate( year, month, day ) ); |
235 | } else if(key == Key_Down) { | 244 | } else if(key == Key_Down) { |
236 | int year = ((date.month()-1)<1)?date.year()-1:date.year(); | 245 | int year = ((date.month()-1)<1)?date.year()-1:date.year(); |
237 | int month = ((date.month()-1)<1)?12:date.month()-1; | 246 | int month = ((date.month()-1)<1)?12:date.month()-1; |
238 | int day = (QDate(year,month,1).daysInMonth()<maxDay)?QDate(year,month,1).daysInMonth():maxDay; | 247 | int day = (QDate(year,month,1).daysInMonth()<maxDay)?QDate(year,month,1).daysInMonth():maxDay; |
239 | setDate( QDate( year, month, day ) ); | 248 | setDate( QDate( year, month, day ) ); |
240 | } | 249 | } |
241 | break; | 250 | break; |
242 | case 'y': | 251 | case 'y': |
243 | case 'Y': | 252 | case 'Y': |
244 | if(key == Key_Up) { | 253 | if(key == Key_Up) { |
245 | setDate( QDate( date.year() + 1, date.month() , date.day()) ); | 254 | setDate( QDate( date.year() + 1, date.month() , date.day()) ); |
246 | } | 255 | } |
247 | else if(key == Key_Down) { | 256 | else if(key == Key_Down) { |
248 | setDate( QDate( date.year() - 1, date.month() , date.day()) ); | 257 | setDate( QDate( date.year() - 1, date.month() , date.day()) ); |
249 | } | 258 | } |
250 | break; | 259 | break; |
251 | /* default: | 260 | /* default: |
252 | if(key == Key_Up) { | 261 | if(key == Key_Up) { |
253 | setDate( date.addDays( 1 ) ); | 262 | setDate( date.addDays( 1 ) ); |
254 | } else if(key == Key_Down) { | 263 | } else if(key == Key_Down) { |
255 | setDate( date.addDays( -1 ) ); | 264 | setDate( date.addDays( -1 ) ); |
256 | } | 265 | } |
257 | break;*/ | 266 | break;*/ |
258 | } | 267 | } |
259 | 268 | ||
260 | date = readDate(); | 269 | date = readDate(); |
261 | begin = dateForm.find("%"); | 270 | begin = dateForm.find("%"); |
262 | int allSelectStrLength = 0; | 271 | int allSelectStrLength = 0; |
263 | int selectStrLength = 0; | 272 | int selectStrLength = 0; |
264 | 273 | ||
265 | // set selection do new date an set cursor at end of selection | 274 | // set selection do new date an set cursor at end of selection |
266 | for(int i = 0; i < repeat; i++){ | 275 | for(int i = 0; i < repeat; i++){ |
267 | switch ( dateForm.at(begin + 1).latin1() ) | 276 | switch ( dateForm.at(begin + 1).latin1() ) |
268 | { | 277 | { |
269 | case 'd':// 16 (month day) | 278 | case 'd':// 16 (month day) |
270 | selectStrLength = 2; //Ok | 279 | selectStrLength = 2; //Ok |
271 | break; | 280 | break; |
272 | case 'm':// 01 (month) | 281 | case 'm':// 01 (month) |
273 | selectStrLength = 2; //Ok | 282 | selectStrLength = 2; //Ok |
274 | break; | 283 | break; |
275 | case 'a':// Mon (Weekday short) | 284 | case 'a':// Mon (Weekday short) |
276 | selectStrLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), true).length(); | 285 | selectStrLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), true).length(); |
277 | break; | 286 | break; |
278 | case 'A':// Monday (Weekday) | 287 | case 'A':// Monday (Weekday) |
279 | selectStrLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), false).length(); | 288 | selectStrLength = KGlobal::locale()->weekDayName(date.dayOfWeek(), false).length(); |
280 | break; | 289 | break; |
281 | case 'b':// Jan (monthName short) | 290 | case 'b':// Jan (monthName short) |
282 | selectStrLength = KGlobal::locale()->monthName(date.month(), true).length(); | 291 | selectStrLength = KGlobal::locale()->monthName(date.month(), true).length(); |
283 | break; | 292 | break; |
284 | case 'B':// January (monthName) | 293 | case 'B':// January (monthName) |
285 | selectStrLength = KGlobal::locale()->monthName(date.month(), false).length(); | 294 | selectStrLength = KGlobal::locale()->monthName(date.month(), false).length(); |
286 | break; | 295 | break; |
287 | case 'y':// 04 (year short) | 296 | case 'y':// 04 (year short) |
288 | selectStrLength = 2; //Ok | 297 | selectStrLength = 2; //Ok |
289 | break; | 298 | break; |
290 | case 'Y':// 2004 (year) | 299 | case 'Y':// 2004 (year) |
291 | selectStrLength = 4; //Ok | 300 | selectStrLength = 4; //Ok |
292 | break; | 301 | break; |
293 | default: | 302 | default: |
294 | break; | 303 | break; |
295 | } | 304 | } |
296 | space = begin - (i * 2); | 305 | space = begin - (i * 2); |
297 | allSelectStrLength += selectStrLength; | 306 | allSelectStrLength += selectStrLength; |
298 | begin = dateForm.find("%", begin +1); | 307 | begin = dateForm.find("%", begin +1); |
299 | } | 308 | } |
300 | // set selection from begin of date | 309 | // set selection from begin of date |
301 | setSelect( space + allSelectStrLength - selectStrLength , selectStrLength); | 310 | setSelect( space + allSelectStrLength - selectStrLength , selectStrLength); |
302 | *cpos = space + allSelectStrLength; | 311 | *cpos = space + allSelectStrLength; |
303 | emit(dateChanged(date)); | 312 | emit(dateChanged(date)); |
304 | 313 | ||
305 | return; | 314 | return; |
306 | } | 315 | } |
307 | 316 | ||
308 | void KDateEdit::setHandleInvalid(bool handleInvalid) | 317 | void KDateEdit::setHandleInvalid(bool handleInvalid) |
309 | { | 318 | { |
310 | mHandleInvalid = handleInvalid; | 319 | mHandleInvalid = handleInvalid; |
311 | } | 320 | } |
312 | 321 | ||
313 | void KDateEdit::setEnabled(bool on) | 322 | void KDateEdit::setEnabled(bool on) |
314 | { | 323 | { |
315 | mDateEdit->setEnabled(on); | 324 | mDateEdit->setEnabled(on); |
316 | mDateButton->setEnabled(on); | 325 | mDateButton->setEnabled(on); |
317 | } | 326 | } |
318 | 327 | ||
319 | QDate KDateEdit::date() const | 328 | QDate KDateEdit::date() const |
320 | { | 329 | { |
321 | QDate date = readDate(); | 330 | QDate date = readDate(); |
322 | 331 | ||
323 | if (date.isValid() || mHandleInvalid) { | 332 | if (date.isValid() || mHandleInvalid) { |
324 | return date; | 333 | return date; |
325 | } else { | 334 | } else { |
326 | KNotifyClient::beep(); | 335 | KNotifyClient::beep(); |
diff --git a/libkdepim/kdateedit.h b/libkdepim/kdateedit.h index cf3b90a..2d8c452 100644 --- a/libkdepim/kdateedit.h +++ b/libkdepim/kdateedit.h | |||
@@ -1,141 +1,143 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of libkdepim. | 2 | This file is part of libkdepim. |
3 | 3 | ||
4 | Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org> | 4 | Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org> |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify | 6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | 7 | it under the terms of the GNU General Public License as published by |
8 | the Free Software Foundation; either version 2 of the License, or | 8 | the Free Software Foundation; either version 2 of the License, or |
9 | (at your option) any later version. | 9 | (at your option) any later version. |
10 | 10 | ||
11 | This program is distributed in the hope that it will be useful, | 11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. | 14 | GNU General Public License for more details. |
15 | 15 | ||
16 | You should have received a copy of the GNU General Public License | 16 | You should have received a copy of the GNU General Public License |
17 | along with this program; if not, write to the Free Software | 17 | along with this program; if not, write to the Free Software |
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 | 19 | ||
20 | As a special exception, permission is given to link this program | 20 | As a special exception, permission is given to link this program |
21 | with any edition of Qt, and distribute the resulting executable, | 21 | with any edition of Qt, and distribute the resulting executable, |
22 | without including the source code for Qt in the source distribution. | 22 | without including the source code for Qt in the source distribution. |
23 | */ | 23 | */ |
24 | #ifndef KDATEEDIT_H | 24 | #ifndef KDATEEDIT_H |
25 | #define KDATEEDIT_H | 25 | #define KDATEEDIT_H |
26 | 26 | ||
27 | #include <qhbox.h> | 27 | #include <qhbox.h> |
28 | #include <qvbox.h> | 28 | #include <qvbox.h> |
29 | #include <qdatetime.h> | 29 | #include <qdatetime.h> |
30 | #include <qmap.h> | 30 | #include <qmap.h> |
31 | 31 | ||
32 | class QLineEdit; | 32 | class QLineEdit; |
33 | class QPushButton; | 33 | class QPushButton; |
34 | class QObject; | 34 | class QObject; |
35 | class QEvent; | 35 | class QEvent; |
36 | class KDatePicker; | 36 | class KDatePicker; |
37 | class KDateValidator; | 37 | class KDateValidator; |
38 | 38 | ||
39 | /** | 39 | /** |
40 | * A date editing widget that consists of a line edit followed by | 40 | * A date editing widget that consists of a line edit followed by |
41 | * a small push button. The line edit contains the date in text form, | 41 | * a small push button. The line edit contains the date in text form, |
42 | * and the push button will display a 'popup' style date picker. | 42 | * and the push button will display a 'popup' style date picker. |
43 | * | 43 | * |
44 | * This widget also supports advanced features like allowing the user | 44 | * This widget also supports advanced features like allowing the user |
45 | * to type in the day name to get the date. The following keywords | 45 | * to type in the day name to get the date. The following keywords |
46 | * are supported (in the native language): tomorrow, yesturday, today, | 46 | * are supported (in the native language): tomorrow, yesturday, today, |
47 | * monday, tuesday, wednesday, thursday, friday, saturday, sunday. | 47 | * monday, tuesday, wednesday, thursday, friday, saturday, sunday. |
48 | * | 48 | * |
49 | * @author Cornelius Schumacher <schumacher@kde.org> | 49 | * @author Cornelius Schumacher <schumacher@kde.org> |
50 | * @author Mike Pilone <mpilone@slac.com> | 50 | * @author Mike Pilone <mpilone@slac.com> |
51 | */ | 51 | */ |
52 | class KDateEdit : public QHBox | 52 | class KDateEdit : public QHBox |
53 | { | 53 | { |
54 | Q_OBJECT | 54 | Q_OBJECT |
55 | public: | 55 | public: |
56 | KDateEdit(QWidget *parent=0, const char *name=0, bool withoutDP = false ); | 56 | KDateEdit(QWidget *parent=0, const char *name=0, bool withoutDP = false ); |
57 | virtual ~KDateEdit(); | 57 | virtual ~KDateEdit(); |
58 | 58 | ||
59 | /** @return True if the date in the text edit is valid, | 59 | /** @return True if the date in the text edit is valid, |
60 | * false otherwise. This will not modify the display of the date, | 60 | * false otherwise. This will not modify the display of the date, |
61 | * but only check for validity. | 61 | * but only check for validity. |
62 | */ | 62 | */ |
63 | bool inputIsValid(); | 63 | bool inputIsValid(); |
64 | 64 | ||
65 | /** @return The date entered. This will not | 65 | /** @return The date entered. This will not |
66 | * modify the display of the date, but only return it. | 66 | * modify the display of the date, but only return it. |
67 | */ | 67 | */ |
68 | QDate date() const; | 68 | QDate date() const; |
69 | 69 | ||
70 | /** @param handleInvalid If true the date edit accepts invalid dates | 70 | /** @param handleInvalid If true the date edit accepts invalid dates |
71 | * and displays them as the empty ("") string. It also returns an invalid date. | 71 | * and displays them as the empty ("") string. It also returns an invalid date. |
72 | * If false (default) invalid dates are not accepted and instead the date | 72 | * If false (default) invalid dates are not accepted and instead the date |
73 | * of today will be returned. | 73 | * of today will be returned. |
74 | */ | 74 | */ |
75 | void setHandleInvalid(bool handleInvalid); | 75 | void setHandleInvalid(bool handleInvalid); |
76 | 76 | ||
77 | /** Checks for a focus out event. The display of the date is updated | 77 | /** Checks for a focus out event. The display of the date is updated |
78 | * to display the proper date when the focus leaves. | 78 | * to display the proper date when the focus leaves. |
79 | */ | 79 | */ |
80 | virtual bool eventFilter(QObject *o, QEvent *e); | 80 | virtual bool eventFilter(QObject *o, QEvent *e); |
81 | void toggleDateFormat(); | 81 | void toggleDateFormat(); |
82 | void clear(); | 82 | void clear(); |
83 | signals: | 83 | signals: |
84 | /** This signal is emitted whenever the user modifies the date. This | 84 | /** This signal is emitted whenever the user modifies the date. This |
85 | * may not get emitted until the user presses enter in the line edit or | 85 | * may not get emitted until the user presses enter in the line edit or |
86 | * focus leaves the widget (ie: the user confirms their selection). | 86 | * focus leaves the widget (ie: the user confirms their selection). |
87 | */ | 87 | */ |
88 | void dateChanged(QDate); | 88 | void dateChanged(QDate); |
89 | void returnPressed(); | 89 | void returnPressed(); |
90 | void setTimeTo( QTime ); | ||
90 | public slots: | 91 | public slots: |
91 | /** Sets the date. | 92 | /** Sets the date. |
92 | * | 93 | * |
93 | * @param date The new date to display. This date must be valid or | 94 | * @param date The new date to display. This date must be valid or |
94 | * it will not be displayed. | 95 | * it will not be displayed. |
95 | */ | 96 | */ |
96 | void setDate(QDate date); | 97 | void setDate(QDate date); |
97 | // set Date with key_up key_down to relation of cursor Position | 98 | // set Date with key_up key_down to relation of cursor Position |
98 | // and set selection from begin to end of single date | 99 | // and set selection from begin to end of single date |
99 | void setDate(QDate, int *cpos, const int, const bool); | 100 | void setDate(QDate, int *cpos, const int, const bool); |
100 | 101 | ||
101 | /** Sets the date edit to be enabled or disabled (grayed out) | 102 | /** Sets the date edit to be enabled or disabled (grayed out) |
102 | * | 103 | * |
103 | * @param on Enabled if true, disabled if false | 104 | * @param on Enabled if true, disabled if false |
104 | */ | 105 | */ |
105 | void setEnabled(bool on); | 106 | void setEnabled(bool on); |
106 | 107 | ||
107 | protected slots: | 108 | protected slots: |
108 | void toggleDatePicker(); | 109 | void toggleDatePicker(); |
109 | void lineEnterPressed(); | 110 | void lineEnterPressed(); |
110 | void textChanged(const QString &); | 111 | void textChanged(const QString &); |
112 | void goToNow(); | ||
111 | 113 | ||
112 | private: | 114 | private: |
113 | /** Reads the text from the line edit. If the text is a keyword, the | 115 | /** Reads the text from the line edit. If the text is a keyword, the |
114 | * word will be translated to a date. If the text is not a keyword, the | 116 | * word will be translated to a date. If the text is not a keyword, the |
115 | * text will be interpreted as a date. | 117 | * text will be interpreted as a date. |
116 | */ | 118 | */ |
117 | QDate readDate() const; | 119 | QDate readDate() const; |
118 | 120 | ||
119 | /** Maps the text that the user can enter to the offset in days from | 121 | /** Maps the text that the user can enter to the offset in days from |
120 | * today. For example, the text 'tomorrow' is mapped to +1. | 122 | * today. For example, the text 'tomorrow' is mapped to +1. |
121 | */ | 123 | */ |
122 | QMap<QString, int> mKeywordMap; | 124 | QMap<QString, int> mKeywordMap; |
123 | bool mTextChanged; | 125 | bool mTextChanged; |
124 | bool mHandleInvalid; | 126 | bool mHandleInvalid; |
125 | 127 | ||
126 | QPushButton *mDateButton; | 128 | QPushButton *mDateButton; |
127 | QLineEdit *mDateEdit; | 129 | QLineEdit *mDateEdit; |
128 | KDatePicker *mDatePicker; | 130 | KDatePicker *mDatePicker; |
129 | QVBox *mDateFrame; | 131 | QVBox *mDateFrame; |
130 | int maxDay; | 132 | int maxDay; |
131 | bool withoutDp; | 133 | bool withoutDp; |
132 | 134 | ||
133 | protected: | 135 | protected: |
134 | virtual void keyPressEvent(QKeyEvent *qke); | 136 | virtual void keyPressEvent(QKeyEvent *qke); |
135 | void setSelect ( int, int ); | 137 | void setSelect ( int, int ); |
136 | bool dateFormShort; | 138 | bool dateFormShort; |
137 | char lengthMonthName; | 139 | char lengthMonthName; |
138 | 140 | ||
139 | }; | 141 | }; |
140 | 142 | ||
141 | #endif | 143 | #endif |