1
/* This file is part of the KDE project
2
Copyright (C) 2005 Cedric Pasteur <cedric.pasteur@free.fr>
3
Copyright (C) 2004-2005 Jarosław Staniek <staniek@kde.org>
5
This program is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Library General Public
7
License as published by the Free Software Foundation; either
8
version 2 of the License, or (at your option) any later version.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Library General Public License for more details.
15
You should have received a copy of the GNU Library General Public License
16
along with this program; see the file COPYING. If not, write to
17
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18
* Boston, MA 02110-1301, USA.
21
#include "kexidbdatetimeedit.h"
23
#include <qtoolbutton.h>
27
#include <QHBoxLayout>
29
#include <kdatepicker.h>
30
#include <kdatetable.h>
31
#include <kexiutils/utils.h>
33
KexiDBDateTimeEdit::KexiDBDateTimeEdit(const QDateTime &datetime, QWidget *parent)
34
: QWidget(parent), KexiFormDataItemInterface()
36
m_invalidState = false;
40
m_dateEdit = new Q3DateEdit(datetime.date(), this);
41
m_dateEdit->setAutoAdvance(true);
42
m_dateEdit->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
43
// m_dateEdit->setFixedWidth( QFontMetrics(m_dateEdit->font()).width("8888-88-88___") );
44
connect(m_dateEdit, SIGNAL(valueChanged(const QDate&)), this, SLOT(slotValueChanged()));
45
connect(m_dateEdit, SIGNAL(valueChanged(const QDate&)), this, SIGNAL(dateTimeChanged()));
47
QToolButton* btn = new QToolButton(this);
49
btn->setFixedWidth(QFontMetrics(btn->font()).width(" ... "));
50
btn->setPopupDelay(1); //1 ms
52
m_timeEdit = new Q3TimeEdit(datetime.time(), this);
53
m_timeEdit->setAutoAdvance(true);
54
m_timeEdit->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
55
connect(m_timeEdit, SIGNAL(valueChanged(const QTime&)), this, SLOT(slotValueChanged()));
56
connect(m_timeEdit, SIGNAL(valueChanged(const QTime&)), this, SIGNAL(dateTimeChanged()));
58
#ifdef QDateTimeEditor_HACK
59
m_dte_date = KexiUtils::findFirstChild<QDateTimeEditor>(m_dateEdit, "QDateTimeEditor");
60
m_dte_time = KexiUtils::findFirstChild<QDateTimeEditor>(m_timeEdit, "QDateTimeEditor");
65
m_datePickerPopupMenu = new KMenu(0, "date_popup");
66
connect(m_datePickerPopupMenu, SIGNAL(aboutToShow()), this, SLOT(slotShowDatePicker()));
67
m_datePicker = new KDatePicker(m_datePickerPopupMenu, QDate::currentDate(), 0);
69
KDateTable *dt = KexiUtils::findFirstChild<KDateTable>(m_datePicker, "KDateTable");
71
connect(dt, SIGNAL(tableClicked()), this, SLOT(acceptDate()));
72
m_datePicker->setCloseButton(true);
73
m_datePicker->installEventFilter(this);
74
m_datePickerPopupMenu->insertItem(m_datePicker);
75
btn->setPopup(m_datePickerPopupMenu);
77
QHBoxLayout* layout = new QHBoxLayout(this);
78
layout->addWidget(m_dateEdit, 0);
79
layout->addWidget(btn, 0);
80
layout->addWidget(m_timeEdit, 0);
81
//layout->addStretch(1);
83
setFocusProxy(m_dateEdit);
86
KexiDBDateTimeEdit::~KexiDBDateTimeEdit()
90
void KexiDBDateTimeEdit::setInvalidState(const QString & /*! @todo paint this text: text*/)
94
m_invalidState = true;
95
//! @todo move this to KexiDataItemInterface::setInvalidStateInternal() ?
96
if (focusPolicy() & Qt::TabFocus)
97
setFocusPolicy(Qt::ClickFocus);
101
KexiDBDateTimeEdit::setEnabled(bool enabled)
103
// prevent the user from reenabling the widget when it is in invalid state
104
if (enabled && m_invalidState)
106
QWidget::setEnabled(enabled);
109
void KexiDBDateTimeEdit::setValueInternal(const QVariant &, bool)
111
m_dateEdit->setDate(m_origValue.toDate());
112
m_timeEdit->setTime(m_origValue.toTime());
116
KexiDBDateTimeEdit::value()
118
return QDateTime(m_dateEdit->date(), m_timeEdit->time());
121
bool KexiDBDateTimeEdit::valueIsNull()
123
return !m_dateEdit->date().isValid() || m_dateEdit->date().isNull()
124
|| !m_timeEdit->time().isValid() || m_timeEdit->time().isNull();
127
bool KexiDBDateTimeEdit::valueIsEmpty()
132
bool KexiDBDateTimeEdit::isReadOnly() const
134
//! @todo: data/time edit API has no readonly flag,
135
//! so use event filter to avoid changes made by keyboard or mouse when m_readOnly==true
136
return m_readOnly; //!isEnabled();
139
void KexiDBDateTimeEdit::setReadOnly(bool set)
145
KexiDBDateTimeEdit::widget()
150
bool KexiDBDateTimeEdit::cursorAtStart()
152
#ifdef QDateTimeEditor_HACK
153
return m_dte_date && m_dateEdit->hasFocus() && m_dte_date->focusSection() == 0;
159
bool KexiDBDateTimeEdit::cursorAtEnd()
161
#ifdef QDateTimeEditor_HACK
162
return m_dte_time && m_timeEdit->hasFocus()
163
&& m_dte_time->focusSection() == int(m_dte_time->sectionCount() - 1);
169
void KexiDBDateTimeEdit::clear()
171
m_dateEdit->setDate(QDate());
172
m_timeEdit->setTime(QTime());
177
KexiDBDateTimeEdit::slotValueChanged()
183
KexiDBDateTimeEdit::slotShowDatePicker()
185
QDate date = m_dateEdit->date();
187
m_datePicker->setDate(date);
188
m_datePicker->setFocus();
189
m_datePicker->show();
190
m_datePicker->setFocus();
194
KexiDBDateTimeEdit::acceptDate()
196
m_dateEdit->setDate(m_datePicker->date());
197
m_datePickerPopupMenu->hide();
201
KexiDBDateTimeEdit::eventFilter(QObject *o, QEvent *e)
203
if (o != m_datePicker)
208
m_datePickerPopupMenu->hide();
210
case QEvent::KeyPress:
211
case QEvent::KeyRelease: {
212
QKeyEvent *ke = (QKeyEvent *)e;
213
if (ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return) {
217
} else if (ke->key() == Qt::Key_Escape) {
219
m_datePickerPopupMenu->hide();
222
m_datePickerPopupMenu->setFocus();
232
KexiDBDateTimeEdit::dateTime() const
234
return QDateTime(m_dateEdit->date(), m_timeEdit->time());
238
KexiDBDateTimeEdit::setDateTime(const QDateTime &dt)
240
m_dateEdit->setDate(dt.date());
241
m_timeEdit->setTime(dt.time());
244
#include "kexidbdatetimeedit.moc"