kexidbdatetimeedit.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2005 Cedric Pasteur <cedric.pasteur@free.fr>
3 Copyright (C) 2004-2005 Jaroslaw Staniek <js@iidea.pl>
4
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.
9
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.
14
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.
19*/
20
21#include "kexidbdatetimeedit.h"
22
23#include <tqtoolbutton.h>
24#include <tqlayout.h>
25#include <tdepopupmenu.h>
26#include <kdatepicker.h>
27#include <kdatetbl.h>
28#include <kexiutils/utils.h>
29
30KexiDBDateTimeEdit::KexiDBDateTimeEdit(const TQDateTime &datetime, TQWidget *parent, const char *name)
31 : TQWidget(parent, name), KexiFormDataItemInterface()
32{
33 m_invalidState = false;
34 m_cleared = false;
35 m_readOnly = false;
36
37 m_dateEdit = new TQDateEdit(datetime.date(), this);
38 m_dateEdit->setAutoAdvance(true);
39 m_dateEdit->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding);
40// m_dateEdit->setFixedWidth( TQFontMetrics(m_dateEdit->font()).width("8888-88-88___") );
41 connect(m_dateEdit, TQ_SIGNAL(valueChanged(const TQDate&)), this, TQ_SLOT(slotValueChanged()));
42 connect(m_dateEdit, TQ_SIGNAL(valueChanged(const TQDate&)), this, TQ_SIGNAL(dateTimeChanged()));
43
44 TQToolButton* btn = new TQToolButton(this);
45 btn->setText("...");
46 btn->setFixedWidth( TQFontMetrics(btn->font()).width(" ... ") );
47 btn->setPopupDelay(1); //1 ms
48
49 m_timeEdit = new TQTimeEdit(datetime.time(), this);;
50 m_timeEdit->setAutoAdvance(true);
51 m_timeEdit->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding);
52 connect(m_timeEdit, TQ_SIGNAL(valueChanged(const TQTime&)), this, TQ_SLOT(slotValueChanged()));
53 connect(m_timeEdit, TQ_SIGNAL(valueChanged(const TQTime&)), this, TQ_SIGNAL(dateTimeChanged()));
54
55#ifdef TQDateTimeEditor_HACK
56 m_dte_date = KexiUtils::findFirstChild<TQDateTimeEditor>(m_dateEdit, "TQDateTimeEditor");
57 m_dte_time = KexiUtils::findFirstChild<TQDateTimeEditor>(m_timeEdit, "TQDateTimeEditor");
58#else
59 m_dte_date = 0;
60#endif
61
62 m_datePickerPopupMenu = new TDEPopupMenu(0, "date_popup");
63 connect(m_datePickerPopupMenu, TQ_SIGNAL(aboutToShow()), this, TQ_SLOT(slotShowDatePicker()));
64 m_datePicker = new KDatePicker(m_datePickerPopupMenu, TQDate::currentDate(), 0);
65
66 KDateTable *dt = KexiUtils::findFirstChild<KDateTable>(m_datePicker, "KDateTable");
67 if (dt)
68 connect(dt, TQ_SIGNAL(tableClicked()), this, TQ_SLOT(acceptDate()));
69 m_datePicker->setCloseButton(true);
70 m_datePicker->installEventFilter(this);
71 m_datePickerPopupMenu->insertItem(m_datePicker);
72 btn->setPopup(m_datePickerPopupMenu);
73
74 TQHBoxLayout* layout = new TQHBoxLayout(this);
75 layout->addWidget(m_dateEdit, 0);
76 layout->addWidget(btn, 0);
77 layout->addWidget(m_timeEdit, 0);
78 //layout->addStretch(1);
79
80 setFocusProxy(m_dateEdit);
81}
82
83KexiDBDateTimeEdit::~KexiDBDateTimeEdit()
84{
85}
86
88{
89 setEnabled(false);
90 setReadOnly(true);
91 m_invalidState = true;
93 if (focusPolicy() & TabFocus)
94 setFocusPolicy(TQWidget::ClickFocus);
95}
96
97void
98KexiDBDateTimeEdit::setEnabled(bool enabled)
99{
100 // prevent the user from reenabling the widget when it is in invalid state
101 if(enabled && m_invalidState)
102 return;
103 TQWidget::setEnabled(enabled);
104}
105
106void KexiDBDateTimeEdit::setValueInternal(const TQVariant &, bool )
107{
108 m_dateEdit->setDate(m_origValue.toDate());
109 m_timeEdit->setTime(m_origValue.toTime());
110}
111
112TQVariant
114{
115 return TQDateTime(m_dateEdit->date(), m_timeEdit->time());
116}
117
119{
120 return !m_dateEdit->date().isValid() || m_dateEdit->date().isNull()
121 || !m_timeEdit->time().isValid() || m_timeEdit->time().isNull();
122}
123
125{
126 return m_cleared;
127}
128
130{
133 return m_readOnly;
134}
135
136void KexiDBDateTimeEdit::setReadOnly(bool set)
137{
138 m_readOnly = set;
139}
140
141TQWidget*
143{
144 return m_dateEdit;
145}
146
148{
149#ifdef TQDateTimeEditor_HACK
150 return m_dte_date && m_dateEdit->hasFocus() && m_dte_date->focusSection()==0;
151#else
152 return false;
153#endif
154}
155
157{
158#ifdef TQDateTimeEditor_HACK
159 return m_dte_time && m_timeEdit->hasFocus()
160 && m_dte_time->focusSection()==int(m_dte_time->sectionCount()-1);
161#else
162 return false;
163#endif
164}
165
167{
168 m_dateEdit->setDate(TQDate());
169 m_timeEdit->setTime(TQTime());
170 m_cleared = true;
171}
172
173void
174KexiDBDateTimeEdit::slotValueChanged()
175{
176 m_cleared = false;
177}
178
179void
180KexiDBDateTimeEdit::slotShowDatePicker()
181{
182 TQDate date = m_dateEdit->date();
183
184 m_datePicker->setDate(date);
185 m_datePicker->setFocus();
186 m_datePicker->show();
187 m_datePicker->setFocus();
188}
189
190void
191KexiDBDateTimeEdit::acceptDate()
192{
193 m_dateEdit->setDate(m_datePicker->date());
194 m_datePickerPopupMenu->hide();
195}
196
197bool
198KexiDBDateTimeEdit::eventFilter(TQObject *o, TQEvent *e)
199{
200 if (o != m_datePicker)
201 return false;
202
203 switch (e->type()) {
204 case TQEvent::Hide:
205 m_datePickerPopupMenu->hide();
206 break;
207 case TQEvent::KeyPress:
208 case TQEvent::KeyRelease: {
209 TQKeyEvent *ke = (TQKeyEvent *)e;
210 if (ke->key()==TQt::Key_Enter || ke->key()==TQt::Key_Return) {
211 //accepting picker
212 acceptDate();
213 return true;
214 }
215 else if (ke->key()==TQt::Key_Escape) {
216 //canceling picker
217 m_datePickerPopupMenu->hide();
218 return true;
219 }
220 else
221 m_datePickerPopupMenu->setFocus();
222 break;
223 }
224 default:
225 break;
226 }
227 return false;
228}
229
230TQDateTime
231KexiDBDateTimeEdit::dateTime() const
232{
233 return TQDateTime(m_dateEdit->date(), m_timeEdit->time());
234}
235
236void
237KexiDBDateTimeEdit::setDateTime(const TQDateTime &dt)
238{
239 m_dateEdit->setDate(dt.date());
240 m_timeEdit->setTime(dt.time());
241}
242
243#include "kexidbdatetimeedit.moc"
virtual TQWidget * widget()
virtual void setInvalidState(const TQString &displayText)
virtual TQVariant value()
virtual void setValueInternal(const TQVariant &add, bool removeOld)
virtual void clear()
clears item's data, so the data will contain NULL data
virtual bool isReadOnly() const
An interface for declaring form widgets to be data-aware.
type * findParent(TQObject *o, const char *className)