-rw-r--r-- | library/timestring.cpp | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/library/timestring.cpp b/library/timestring.cpp new file mode 100644 index 0000000..d5d78ae --- a/dev/null +++ b/library/timestring.cpp | |||
@@ -0,0 +1,360 @@ | |||
1 | /********************************************************************** | ||
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | ||
3 | ** | ||
4 | ** This file is part of Qtopia Environment. | ||
5 | ** | ||
6 | ** This file may be distributed and/or modified under the terms of the | ||
7 | ** GNU General Public License version 2 as published by the Free Software | ||
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
9 | ** packaging of this file. | ||
10 | ** | ||
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
13 | ** | ||
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
15 | ** | ||
16 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
17 | ** not clear to you. | ||
18 | ** | ||
19 | **********************************************************************/ | ||
20 | |||
21 | #include "timestring.h" | ||
22 | #include <qobject.h> | ||
23 | #include "qpeapplication.h" //for qApp | ||
24 | #include "config.h" | ||
25 | |||
26 | |||
27 | class TimeStringFormatKeeper : public QObject | ||
28 | { | ||
29 | Q_OBJECT | ||
30 | public: | ||
31 | static DateFormat currentFormat() | ||
32 | { | ||
33 | if ( !self ) | ||
34 | self = new TimeStringFormatKeeper; | ||
35 | return self->format; | ||
36 | } | ||
37 | private slots: | ||
38 | void formatChanged( DateFormat f ) | ||
39 | { | ||
40 | format = f; | ||
41 | } | ||
42 | private: | ||
43 | static TimeStringFormatKeeper *self; | ||
44 | DateFormat format; | ||
45 | |||
46 | TimeStringFormatKeeper() | ||
47 | : QObject( qApp ) | ||
48 | { | ||
49 | Config config("qpe"); | ||
50 | config.setGroup( "Date" ); | ||
51 | format = DateFormat(QChar(config.readEntry("Separator", "/")[0]), | ||
52 | (DateFormat::Order)config .readNumEntry("ShortOrder", DateFormat::DayMonthYear), | ||
53 | (DateFormat::Order)config.readNumEntry("LongOrder", DateFormat::DayMonthYear)); | ||
54 | |||
55 | connect( qApp, SIGNAL( dateFormatChanged(DateFormat) ), | ||
56 | this, SLOT( formatChanged( DateFormat ) ) ); | ||
57 | } | ||
58 | }; | ||
59 | |||
60 | TimeStringFormatKeeper *TimeStringFormatKeeper::self = 0; | ||
61 | |||
62 | QString DateFormat::toNumberString() const | ||
63 | { | ||
64 | QString buf = ""; | ||
65 | // for each part of the order | ||
66 | for (int i = 0; i < 3; i++) { | ||
67 | // switch on the relavent 3 bits. | ||
68 | switch((_shortOrder >> (i * 3)) & 0x0007) { | ||
69 | case 0x0001: | ||
70 | buf += QObject::tr( "D" ); | ||
71 | break; | ||
72 | case 0x0002: | ||
73 | buf += QObject::tr( "M" ); | ||
74 | break; | ||
75 | case 0x0004: | ||
76 | buf += QObject::tr( "Y" ); | ||
77 | break; | ||
78 | } | ||
79 | if (i < 2) | ||
80 | buf += _shortSeparator; | ||
81 | } | ||
82 | return buf; | ||
83 | } | ||
84 | |||
85 | QString DateFormat::toWordString() const | ||
86 | { | ||
87 | QString buf = ""; | ||
88 | // for each part of the order | ||
89 | for (int i = 0; i < 3; i++) { | ||
90 | // switch on the relavent 3 bits. | ||
91 | switch((_longOrder >> (i * 3)) & 0x0007) { | ||
92 | case 0x0001: | ||
93 | buf += QObject::tr( "day" ); | ||
94 | if (i < 2) { | ||
95 | if ((_shortOrder << ((i+1) * 3)) & 0x0007) | ||
96 | buf += ", "; | ||
97 | else | ||
98 | buf += " "; | ||
99 | } | ||
100 | break; | ||
101 | case 0x0002: | ||
102 | buf += QObject::tr( "month" ); | ||
103 | if (i < 2) | ||
104 | buf += " "; | ||
105 | break; | ||
106 | case 0x0004: | ||
107 | buf += QObject::tr( "year" ); | ||
108 | if (i < 2) | ||
109 | buf += ", "; | ||
110 | break; | ||
111 | } | ||
112 | } | ||
113 | return buf; | ||
114 | } | ||
115 | |||
116 | QString DateFormat::numberDate(const QDate &d, int v) const | ||
117 | { | ||
118 | QString buf = ""; | ||
119 | |||
120 | int pad = 0; | ||
121 | if (v & padNumber) | ||
122 | pad = 2; | ||
123 | |||
124 | // for each part of the order | ||
125 | for (int i = 0; i < 3; i++) { | ||
126 | // switch on the relavent 3 bits. | ||
127 | switch((_shortOrder >> (i * 3)) & 0x0007) { | ||
128 | case 0x0001: | ||
129 | buf += QString("%1").arg(d.day(), pad); | ||
130 | break; | ||
131 | case 0x0002: | ||
132 | buf += QString("%1").arg(d.month(), pad); | ||
133 | break; | ||
134 | case 0x0004: | ||
135 | { | ||
136 | int year = d.year(); | ||
137 | if (!(v & longNumber)) | ||
138 | year = year % 100; | ||
139 | |||
140 | if (year < 10) | ||
141 | buf += "0"; | ||
142 | |||
143 | buf += QString::number(year); | ||
144 | |||
145 | } | ||
146 | break; | ||
147 | } | ||
148 | if (i < 2) | ||
149 | buf = _shortSeparator; | ||
150 | } | ||
151 | return buf; | ||
152 | } | ||
153 | |||
154 | QString DateFormat::wordDate(const QDate &d, int v) const | ||
155 | { | ||
156 | QString buf = ""; | ||
157 | // for each part of the order | ||
158 | if (v & showWeekDay) { | ||
159 | QString weekDay = d.dayName(d.dayOfWeek()); | ||
160 | if (!(v & longWord)) { | ||
161 | weekDay = weekDay.left(3); | ||
162 | } | ||
163 | buf += weekDay; | ||
164 | if (_longOrder & 0x0007 == 0x0002) | ||
165 | buf += ' '; | ||
166 | else | ||
167 | buf += ", "; | ||
168 | } | ||
169 | |||
170 | int pad = 0; | ||
171 | if (v & padNumber) | ||
172 | pad = 2; | ||
173 | |||
174 | for (int i = 0; i < 3; i++) { | ||
175 | // switch on the relavent 3 bits. | ||
176 | switch((_longOrder >> (i * 3)) & 0x0007) { | ||
177 | case 0x0001: | ||
178 | buf += QString("%1").arg(d.day(), pad); | ||
179 | if (i < 2) { | ||
180 | if ((_shortOrder << ((i+1) * 3)) & 0x0007) | ||
181 | buf += ", "; | ||
182 | else | ||
183 | buf += " "; | ||
184 | } | ||
185 | break; | ||
186 | case 0x0002: | ||
187 | { | ||
188 | QString monthName = d.monthName(d.month()); | ||
189 | if (!(v & longWord)) { | ||
190 | monthName = monthName.left(3); | ||
191 | } | ||
192 | buf += monthName; | ||
193 | } | ||
194 | if (i < 2) | ||
195 | buf += " "; | ||
196 | break; | ||
197 | case 0x0004: | ||
198 | { | ||
199 | int year = d.year(); | ||
200 | if (!(v & longNumber)) | ||
201 | year = year % 100; | ||
202 | |||
203 | if (year < 10) | ||
204 | buf += "0"; | ||
205 | |||
206 | buf += QString::number(year); | ||
207 | } | ||
208 | if (i < 2) | ||
209 | buf += ", "; | ||
210 | break; | ||
211 | } | ||
212 | } | ||
213 | return buf; | ||
214 | } | ||
215 | |||
216 | #ifndef QT_NO_DATASTREAM | ||
217 | void DateFormat::save(QDataStream &d) const | ||
218 | { | ||
219 | d << _shortSeparator.unicode(); | ||
220 | uint v= _shortOrder; | ||
221 | d << v; | ||
222 | v = _longOrder; | ||
223 | d << v; | ||
224 | } | ||
225 | |||
226 | void DateFormat::load(QDataStream &d) | ||
227 | { | ||
228 | ushort value; | ||
229 | d >> value; | ||
230 | _shortSeparator = QChar(value); | ||
231 | uint v = 0; | ||
232 | d >> v; | ||
233 | _shortOrder = (Order)v; | ||
234 | v = 0; | ||
235 | d >> v; | ||
236 | _longOrder = (Order)v; | ||
237 | } | ||
238 | |||
239 | QDataStream &operator<<(QDataStream &s, const DateFormat&df) | ||
240 | { | ||
241 | df.save(s); | ||
242 | return s; | ||
243 | } | ||
244 | QDataStream &operator>>(QDataStream &s, DateFormat&df) | ||
245 | { | ||
246 | df.load(s); | ||
247 | return s; | ||
248 | } | ||
249 | #endif | ||
250 | |||
251 | QString TimeString::shortDate( const QDate &d, DateFormat dtf ) | ||
252 | { | ||
253 | return dtf.wordDate(d); | ||
254 | } | ||
255 | |||
256 | QString TimeString::dateString( const QDate &d, DateFormat dtf ) | ||
257 | { | ||
258 | return dtf.wordDate(d, DateFormat::longNumber | DateFormat::longWord); | ||
259 | } | ||
260 | |||
261 | |||
262 | QString TimeString::longDateString( const QDate &d, DateFormat dtf ) | ||
263 | { | ||
264 | return dtf.wordDate(d, DateFormat::showWeekDay | DateFormat::longNumber | ||
265 | | DateFormat::longWord); | ||
266 | } | ||
267 | |||
268 | DateFormat TimeString::currentDateFormat() | ||
269 | { | ||
270 | return TimeStringFormatKeeper::currentFormat(); | ||
271 | } | ||
272 | |||
273 | |||
274 | QString TimeString::dateString( const QDateTime &dt, bool ampm, bool seconds, DateFormat dtf ) | ||
275 | { | ||
276 | const QDate& d = dt.date(); | ||
277 | const QTime& t = dt.time(); | ||
278 | |||
279 | // based on QDateTime::toString() | ||
280 | QString buf = timeString(t,ampm,seconds); | ||
281 | buf += " "; | ||
282 | buf += longDateString( d, dtf ); | ||
283 | |||
284 | return buf; | ||
285 | } | ||
286 | |||
287 | QString TimeString::timeString( const QTime &t, bool ampm, bool seconds ) | ||
288 | { | ||
289 | if ( !ampm ) { | ||
290 | if ( seconds ) | ||
291 | return t.toString(); | ||
292 | QString r = QString::number(t.hour()); | ||
293 | if ( t.hour() < 10 ) r.prepend( "0" ); | ||
294 | r.append( ":" ); | ||
295 | if ( t.minute() < 10 ) r.append( "0" ); | ||
296 | r.append(QString::number(t.minute())); | ||
297 | return r; | ||
298 | } | ||
299 | // ### else the hard case that should disappear in Qt 3.0 | ||
300 | QString argString = seconds ? "%4:%5:%6 %7" : "%4:%5 %7"; | ||
301 | int hour = t.hour(); | ||
302 | QString strMin = QString::number( t.minute() ); | ||
303 | QString strSec = QString::number( t.second() ); | ||
304 | if ( hour > 12 ) | ||
305 | argString = argString.arg( hour - 12, 2 ); | ||
306 | else { | ||
307 | if ( hour == 0 ) | ||
308 | argString = argString.arg( 12 ); | ||
309 | else | ||
310 | argString = argString.arg( hour, 2 ); | ||
311 | } | ||
312 | if ( t.minute() < 10 ) | ||
313 | strMin.prepend( "0" ); | ||
314 | if ( t.second() < 10 ) | ||
315 | strSec.prepend( "0" ); | ||
316 | argString = argString.arg( strMin ); | ||
317 | if ( seconds ) | ||
318 | argString = argString.arg( strSec ); | ||
319 | if ( hour >= 12 ) | ||
320 | argString = argString.arg( QObject::tr("PM") ); | ||
321 | else | ||
322 | argString = argString.arg( QObject::tr("AM") ); | ||
323 | return argString; | ||
324 | } | ||
325 | |||
326 | QString TimeString::shortTime( bool ampm, bool seconds ) | ||
327 | { | ||
328 | static const char* const day[] = { | ||
329 | QT_TRANSLATE_NOOP( "QObject", "Mon" ), | ||
330 | QT_TRANSLATE_NOOP( "QObject", "Tue" ), | ||
331 | QT_TRANSLATE_NOOP( "QObject", "Wed" ), | ||
332 | QT_TRANSLATE_NOOP( "QObject", "Thu" ), | ||
333 | QT_TRANSLATE_NOOP( "QObject", "Fri" ), | ||
334 | QT_TRANSLATE_NOOP( "QObject", "Sat" ), | ||
335 | QT_TRANSLATE_NOOP( "QObject", "Sun" ) | ||
336 | }; | ||
337 | // just create a shorter time String | ||
338 | QDateTime dtTmp = QDateTime::currentDateTime(); | ||
339 | QString strTime; | ||
340 | strTime = QObject::tr( day[dtTmp.date().dayOfWeek()-1] ) + " " + | ||
341 | timeString( dtTmp.time(), ampm, seconds ); | ||
342 | return strTime; | ||
343 | } | ||
344 | |||
345 | QString TimeString::dateString( const QDateTime &t, bool ampm ) | ||
346 | { | ||
347 | return dateString(t,ampm,FALSE); | ||
348 | } | ||
349 | |||
350 | QString TimeString::timeString( const QTime &t, bool ampm) | ||
351 | { | ||
352 | return timeString(t,ampm,FALSE); | ||
353 | } | ||
354 | |||
355 | QString TimeString::shortTime( bool ampm ) | ||
356 | { | ||
357 | return shortTime(ampm,FALSE); | ||
358 | } | ||
359 | |||
360 | #include "timestring.moc" | ||