22 #include <QtCore/QStringList>
23 #include <QtGui/QKeyEvent>
24 #include <QtGui/QMenu>
25 #include <QtGui/QLineEdit>
26 #include <QtGui/QWidgetAction>
37 #include "ui_kdatetimeedit.h"
39 class KDateTimeEditPrivate
43 virtual ~KDateTimeEditPrivate();
51 void initDateWidget();
52 void initTimeWidget();
53 void initCalendarWidget();
54 void updateCalendarWidget();
55 void initTimeSpecWidget();
56 void updateTimeSpecWidget();
61 void selectCalendar(
int index);
63 void selectTimeZone(
int index);
64 void enterTimeZone(
const QString &zone);
68 KDateTimeEdit::Options m_options;
75 QList<KLocale::CalendarSystem> m_calendarSystems;
88 m_dateTime.setTime(QTime(0, 0, 0));
93 KDateTimeEditPrivate::~KDateTimeEditPrivate()
99 return ui.m_dateCombo->calendar();
102 KDateTime KDateTimeEditPrivate::defaultMinDateTime()
104 return KDateTime(calendar()->earliestValidDate(), QTime(0, 0, 0, 0));
107 KDateTime KDateTimeEditPrivate::defaultMaxDateTime()
109 return KDateTime(calendar()->latestValidDate(), QTime(23, 59, 59, 999));
112 void KDateTimeEditPrivate::initWidgets()
116 initCalendarWidget();
117 initTimeSpecWidget();
120 void KDateTimeEditPrivate::initDateWidget()
122 ui.m_dateCombo->blockSignals(
true);
124 KDateComboBox::Options options;
137 ui.m_dateCombo->setOptions(options);
138 ui.m_dateCombo->blockSignals(
false);
141 void KDateTimeEditPrivate::initTimeWidget()
143 ui.m_timeCombo->blockSignals(
true);
144 ui.m_timeCombo->setVisible((m_options &KDateTimeEdit::ShowDate) == KDateTimeEdit::ShowDate);
145 KTimeComboBox::Options options;
155 ui.m_timeCombo->setOptions(options);
156 ui.m_timeCombo->blockSignals(
false);
159 void KDateTimeEditPrivate::initCalendarWidget()
161 ui.m_calendarCombo->blockSignals(
true);
162 ui.m_calendarCombo->clear();
166 ui.m_calendarCombo->setCurrentIndex(ui.m_calendarCombo->findData(ui.m_dateCombo->calendarSystem()));
169 ui.m_calendarCombo->setEditable(
false);
170 ui.m_calendarCombo->blockSignals(
false);
173 void KDateTimeEditPrivate::updateCalendarWidget()
175 ui.m_calendarCombo->blockSignals(
true);
176 ui.m_calendarCombo->setCurrentIndex(ui.m_calendarCombo->findData(ui.m_dateCombo->calendarSystem()));
177 ui.m_calendarCombo->blockSignals(
false);
180 void KDateTimeEditPrivate::selectCalendar(
int index)
191 void KDateTimeEditPrivate::initTimeSpecWidget()
193 ui.m_timeSpecCombo->blockSignals(
true);
194 ui.m_timeSpecCombo->clear();
195 ui.m_timeSpecCombo->addItem(
i18nc(
"UTC time zone",
"UTC"),
"UTC");
196 ui.m_timeSpecCombo->addItem(
i18nc(
"No specific time zone",
"Floating"),
"Floating");
199 foreach (
const QString &key, keys) {
200 names.insert(
i18n(key.toUtf8()).
replace(
'_',
' '), key);
202 QMapIterator<QString, QString> i(names);
203 while (i.hasNext()) {
205 ui.m_timeSpecCombo->addItem(i.key(), i.value());
209 ui.m_timeSpecCombo->setEditable(
false);
210 ui.m_timeSpecCombo->blockSignals(
false);
213 void KDateTimeEditPrivate::updateTimeSpecWidget()
215 ui.m_timeSpecCombo->blockSignals(
true);
216 ui.m_timeSpecCombo->blockSignals(
false);
219 void KDateTimeEditPrivate::selectTimeZone(
int index)
221 enterTimeZone(ui.m_timeCombo->itemData(index).toString());
224 void KDateTimeEditPrivate::enterTimeZone(
const QString &zone)
231 void KDateTimeEditPrivate::warnDateTime()
236 if (!m_dateTime.isValid()) {
239 }
else if (m_dateTime < m_minDateTime) {
240 if (m_minWarnMsg.isEmpty()) {
243 warnMsg =
i18nc(
"@info",
"The entered date and time is before the minimum allowed date and time.");
245 warnMsg = m_minWarnMsg;
247 warnMsg.replace(
"%1",
KGlobal::locale()->formatDateTime(m_minDateTime));
249 }
else if (m_dateTime > m_maxDateTime) {
250 if (m_maxWarnMsg.isEmpty()) {
253 warnMsg =
i18nc(
"@info",
"The entered date and time is after the maximum allowed date and time.");
255 warnMsg = m_maxWarnMsg;
256 warnMsg.replace(
"%1",
KGlobal::locale()->formatDateTime(m_maxDateTime));
266 d(new KDateTimeEditPrivate(this))
272 d->m_minDateTime = d->defaultMinDateTime();
273 d->m_maxDateTime = d->defaultMaxDateTime();
274 d->ui.m_calendarCombo->installEventFilter(
this);
275 d->ui.m_dateCombo->installEventFilter(
this);
276 d->ui.m_timeCombo->installEventFilter(
this);
277 d->ui.m_timeSpecCombo->installEventFilter(
this);
280 connect( d->ui.m_calendarCombo, SIGNAL(activated(
int)),
281 this, SLOT(selectCalendar(
int)));
282 connect( d->ui.m_timeSpecCombo, SIGNAL(activated(
int)),
283 this, SLOT(selectTimeZone(
int)));
293 return d->m_dateTime;
298 return d-> ui.m_dateCombo->calendarSystem();
303 return d->m_dateTime.date();
308 return d->m_dateTime.time();
313 return d->m_dateTime.timeSpec();
318 return d->m_dateTime.isValid() &&
319 d->m_dateTime >= d->m_minDateTime &&
320 d->m_dateTime <= d->m_maxDateTime;
330 return d->ui.m_dateCombo->isValid();
335 return d->ui.m_dateCombo->isNull();
340 return d->ui.m_timeCombo->isValid();
345 return d->ui.m_timeCombo->isNull();
350 if (options != d->m_options) {
363 if (dateTime != d->m_dateTime) {
374 d->ui.m_dateCombo->setDate(dateTime.
date());
375 d->ui.m_timeCombo->setTime(dateTime.
time());
380 if (date != d->m_dateTime.date()) {
389 d->m_dateTime.setDate(date);
390 d->ui.m_dateCombo->setDate(date);
395 if (calendarSystem == d->ui.m_dateCombo->calendarSystem() ||
396 !d->m_calendarSystems.contains(calendarSystem)) {
406 d->ui.m_dateCombo->setCalendarSystem(calendarSystem);
407 d->updateCalendarWidget();
412 d->ui.m_dateCombo->setCalendar(calendar);
413 d->updateCalendarWidget();
418 if (time != d->m_dateTime.time()) {
427 d->m_dateTime.setTime(time);
428 d->ui.m_timeCombo->setTime(time);
433 if (spec == d->m_dateTime.timeSpec() || !spec.
isValid()) {
444 d->m_dateTime.setTimeSpec(spec);
445 d->updateTimeSpecWidget();
455 return d->m_minDateTime;
460 d->m_minDateTime = d->defaultMinDateTime();
470 return d->m_maxDateTime;
475 d->m_maxDateTime = d->defaultMaxDateTime();
485 minDateTime <= maxDateTime &&
486 d->calendar()->isValid(minDateTime.
date()) &&
487 d->calendar()->isValid(maxDateTime.
date())) {
489 d->m_minDateTime = minDateTime;
490 d->m_minWarnMsg = minErrorMsg;
491 d->m_maxDateTime = maxDateTime;
492 d->m_maxWarnMsg = maxErrorMsg;
504 if (calendars != d->m_calendarSystems) {
505 d->m_calendarSystems = calendars;
506 d->updateCalendarWidget();
512 return d->m_calendarSystems;
517 d->ui.m_dateCombo->setDisplayFormat(format);
522 return d->ui.m_dateCombo->displayFormat();
527 d->ui.m_dateCombo->setDateMap(dateMap);
532 return d->ui.m_dateCombo->dateMap();
537 d->ui.m_timeCombo->setDisplayFormat(formatOptions);
542 return d->ui.m_timeCombo->displayFormat();
547 d->ui.m_timeCombo->setTimeListInterval(minutes);
552 return d->ui.m_timeCombo->timeListInterval();
559 d->ui.m_timeCombo->setTimeList(timeList, minWarnMsg, maxWarnMsg);
564 return d->ui.m_timeCombo->timeList();
569 if (zones != d->m_zones) {
571 d->updateTimeSpecWidget();
601 #include "kdatetimeedit.moc"