00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kexidbdatetimeedit.h"
00022
00023 #include <qtoolbutton.h>
00024 #include <qlayout.h>
00025 #include <kpopupmenu.h>
00026 #include <kdatepicker.h>
00027 #include <kdatetbl.h>
00028 #include <kexiutils/utils.h>
00029
00030 KexiDBDateTimeEdit::KexiDBDateTimeEdit(const QDateTime &datetime, QWidget *parent, const char *name)
00031 : QWidget(parent, name), KexiFormDataItemInterface()
00032 {
00033 m_invalidState = false;
00034 m_cleared = false;
00035 m_readOnly = false;
00036
00037 m_dateEdit = new QDateEdit(datetime.date(), this);
00038 m_dateEdit->setAutoAdvance(true);
00039 m_dateEdit->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
00040
00041 connect(m_dateEdit, SIGNAL(valueChanged(const QDate&)), this, SLOT(slotValueChanged()));
00042 connect(m_dateEdit, SIGNAL(valueChanged(const QDate&)), this, SIGNAL(dateTimeChanged()));
00043
00044 QToolButton* btn = new QToolButton(this);
00045 btn->setText("...");
00046 btn->setFixedWidth( QFontMetrics(btn->font()).width(" ... ") );
00047 btn->setPopupDelay(1);
00048
00049 m_timeEdit = new QTimeEdit(datetime.time(), this);;
00050 m_timeEdit->setAutoAdvance(true);
00051 m_timeEdit->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
00052 connect(m_timeEdit, SIGNAL(valueChanged(const QTime&)), this, SLOT(slotValueChanged()));
00053 connect(m_timeEdit, SIGNAL(valueChanged(const QTime&)), this, SIGNAL(dateTimeChanged()));
00054
00055 #ifdef QDateTimeEditor_HACK
00056 m_dte_date = KexiUtils::findFirstChild<QDateTimeEditor>(m_dateEdit, "QDateTimeEditor");
00057 m_dte_time = KexiUtils::findFirstChild<QDateTimeEditor>(m_timeEdit, "QDateTimeEditor");
00058 #else
00059 m_dte_date = 0;
00060 #endif
00061
00062 m_datePickerPopupMenu = new KPopupMenu(0, "date_popup");
00063 connect(m_datePickerPopupMenu, SIGNAL(aboutToShow()), this, SLOT(slotShowDatePicker()));
00064 m_datePicker = new KDatePicker(m_datePickerPopupMenu, QDate::currentDate(), 0);
00065
00066 KDateTable *dt = KexiUtils::findFirstChild<KDateTable>(m_datePicker, "KDateTable");
00067 if (dt)
00068 connect(dt, SIGNAL(tableClicked()), this, SLOT(acceptDate()));
00069 m_datePicker->setCloseButton(true);
00070 m_datePicker->installEventFilter(this);
00071 m_datePickerPopupMenu->insertItem(m_datePicker);
00072 btn->setPopup(m_datePickerPopupMenu);
00073
00074 QHBoxLayout* layout = new QHBoxLayout(this);
00075 layout->addWidget(m_dateEdit, 0);
00076 layout->addWidget(btn, 0);
00077 layout->addWidget(m_timeEdit, 0);
00078
00079
00080 setFocusProxy(m_dateEdit);
00081 }
00082
00083 KexiDBDateTimeEdit::~KexiDBDateTimeEdit()
00084 {
00085 }
00086
00087 void KexiDBDateTimeEdit::setInvalidState(const QString & )
00088 {
00089 setEnabled(false);
00090 setReadOnly(true);
00091 m_invalidState = true;
00093 if (focusPolicy() & TabFocus)
00094 setFocusPolicy(QWidget::ClickFocus);
00095 }
00096
00097 void
00098 KexiDBDateTimeEdit::setEnabled(bool enabled)
00099 {
00100
00101 if(enabled && m_invalidState)
00102 return;
00103 QWidget::setEnabled(enabled);
00104 }
00105
00106 void KexiDBDateTimeEdit::setValueInternal(const QVariant &, bool )
00107 {
00108 m_dateEdit->setDate(m_origValue.toDate());
00109 m_timeEdit->setTime(m_origValue.toTime());
00110 }
00111
00112 QVariant
00113 KexiDBDateTimeEdit::value()
00114 {
00115 return QDateTime(m_dateEdit->date(), m_timeEdit->time());
00116 }
00117
00118 bool KexiDBDateTimeEdit::valueIsNull()
00119 {
00120 return !m_dateEdit->date().isValid() || m_dateEdit->date().isNull()
00121 || !m_timeEdit->time().isValid() || m_timeEdit->time().isNull();
00122 }
00123
00124 bool KexiDBDateTimeEdit::valueIsEmpty()
00125 {
00126 return m_cleared;
00127 }
00128
00129 bool KexiDBDateTimeEdit::isReadOnly() const
00130 {
00133 return m_readOnly;
00134 }
00135
00136 void KexiDBDateTimeEdit::setReadOnly(bool set)
00137 {
00138 m_readOnly = set;
00139 }
00140
00141 QWidget*
00142 KexiDBDateTimeEdit::widget()
00143 {
00144 return m_dateEdit;
00145 }
00146
00147 bool KexiDBDateTimeEdit::cursorAtStart()
00148 {
00149 #ifdef QDateTimeEditor_HACK
00150 return m_dte_date && m_dateEdit->hasFocus() && m_dte_date->focusSection()==0;
00151 #else
00152 return false;
00153 #endif
00154 }
00155
00156 bool KexiDBDateTimeEdit::cursorAtEnd()
00157 {
00158 #ifdef QDateTimeEditor_HACK
00159 return m_dte_time && m_timeEdit->hasFocus()
00160 && m_dte_time->focusSection()==int(m_dte_time->sectionCount()-1);
00161 #else
00162 return false;
00163 #endif
00164 }
00165
00166 void KexiDBDateTimeEdit::clear()
00167 {
00168 m_dateEdit->setDate(QDate());
00169 m_timeEdit->setTime(QTime());
00170 m_cleared = true;
00171 }
00172
00173 void
00174 KexiDBDateTimeEdit::slotValueChanged()
00175 {
00176 m_cleared = false;
00177 }
00178
00179 void
00180 KexiDBDateTimeEdit::slotShowDatePicker()
00181 {
00182 QDate date = m_dateEdit->date();
00183
00184 m_datePicker->setDate(date);
00185 m_datePicker->setFocus();
00186 m_datePicker->show();
00187 m_datePicker->setFocus();
00188 }
00189
00190 void
00191 KexiDBDateTimeEdit::acceptDate()
00192 {
00193 m_dateEdit->setDate(m_datePicker->date());
00194 m_datePickerPopupMenu->hide();
00195 }
00196
00197 bool
00198 KexiDBDateTimeEdit::eventFilter(QObject *o, QEvent *e)
00199 {
00200 if (o != m_datePicker)
00201 return false;
00202
00203 switch (e->type()) {
00204 case QEvent::Hide:
00205 m_datePickerPopupMenu->hide();
00206 break;
00207 case QEvent::KeyPress:
00208 case QEvent::KeyRelease: {
00209 QKeyEvent *ke = (QKeyEvent *)e;
00210 if (ke->key()==Key_Enter || ke->key()==Key_Return) {
00211
00212 acceptDate();
00213 return true;
00214 }
00215 else if (ke->key()==Key_Escape) {
00216
00217 m_datePickerPopupMenu->hide();
00218 return true;
00219 }
00220 else
00221 m_datePickerPopupMenu->setFocus();
00222 break;
00223 }
00224 default:
00225 break;
00226 }
00227 return false;
00228 }
00229
00230 QDateTime
00231 KexiDBDateTimeEdit::dateTime() const
00232 {
00233 return QDateTime(m_dateEdit->date(), m_timeEdit->time());
00234 }
00235
00236 void
00237 KexiDBDateTimeEdit::setDateTime(const QDateTime &dt)
00238 {
00239 m_dateEdit->setDate(dt.date());
00240 m_timeEdit->setTime(dt.time());
00241 }
00242
00243 #include "kexidbdatetimeedit.moc"