23 #include <tqvalidator.h>
24 #include <tqlineedit.h>
25 #include <tdelocale.h>
27 #include "timespinbox.moc"
30 class TimeSpinBox::TimeValidator :
public TQValidator
33 TimeValidator(
int minMin,
int maxMin, TQWidget* parent,
const char* name = 0)
34 : TQValidator(TQT_TQOBJECT(parent), name),
35 minMinute(minMin), maxMinute(maxMin), m12Hour(false), mPm(false) { }
36 virtual State validate(TQString&,
int&)
const;
37 int minMinute, maxMinute;
58 :
SpinBox2(0, 1439, 1, 60, parent, name),
63 mEnteredSetValue(false)
65 mValidator =
new TimeValidator(0, 1439,
this,
"TimeSpinBox validator");
66 mValidator->m12Hour = m12Hour;
73 connect(
this, TQT_SIGNAL(
valueChanged(
int)), TQT_SLOT(slotValueChanged(
int)));
80 :
SpinBox2(minMinute, maxMinute, 1, 60, parent, name),
81 mMinimumValue(minMinute),
84 mEnteredSetValue(false)
86 mValidator =
new TimeValidator(minMinute, maxMinute,
this,
"TimeSpinBox validator");
91 setAlignment(TQApplication::reverseLayout() ? TQt::AlignLeft : TQt::AlignRight);
96 return i18n(
"Press the Shift key while clicking the spin buttons to adjust the time by a larger step (6 hours / 5 minutes).");
104 TQString TimeSpinBox::mapValueToText(
int v)
114 s.sprintf((
wrapping() ?
"%02d:%02d" :
"%d:%02d"), v/60, v%60);
124 int TimeSpinBox::mapTextToValue(
bool* ok)
127 int colon = text.find(
':');
131 TQString hour = text.left(colon).stripWhiteSpace();
132 TQString minute = text.mid(colon + 1).stripWhiteSpace();
133 if (!minute.isEmpty())
137 int m = minute.toUInt(&okmin);
140 h = hour.toUInt(&okhour);
141 if (okhour && okmin && m < 60)
145 if (h == 0 || h > 12)
153 if (t >= mMinimumValue && t <=
maxValue())
162 else if (text.length() == 4)
166 int mins = text.toUInt(&okn);
173 if (h == 0 || h > 12)
181 if (h < 24 && m < 60 && t >= mMinimumValue && t <=
maxValue())
202 if (valid && mInvalid)
205 if (
value() < mMinimumValue)
210 else if (!valid && !mInvalid)
224 mMinimumValue = minutes;
233 if (!mEnteredSetValue)
235 mEnteredSetValue =
true;
236 mPm = (minutes >= 720);
248 mEnteredSetValue =
false;
275 return value() >= mMinimumValue;
278 void TimeSpinBox::slotValueChanged(
int value)
280 mPm = mValidator->mPm = (value >= 720);
283 TQSize TimeSpinBox::sizeHint()
const
285 TQSize sz = SpinBox2::sizeHint();
286 TQFontMetrics fm(font());
287 return TQSize(sz.width() + fm.width(
":"), sz.height());
290 TQSize TimeSpinBox::minimumSizeHint()
const
292 TQSize sz = SpinBox2::minimumSizeHint();
293 TQFontMetrics fm(font());
294 return TQSize(sz.width() + fm.width(
":"), sz.height());
302 TQValidator::State TimeSpinBox::TimeValidator::validate(TQString& text,
int& )
const
304 TQString cleanText = text.stripWhiteSpace();
305 if (cleanText.isEmpty())
306 return TQValidator::Intermediate;
307 TQValidator::State state = TQValidator::Acceptable;
312 int colon = cleanText.find(
':');
315 TQString minute = cleanText.mid(colon + 1);
316 if (minute.isEmpty())
317 state = TQValidator::Intermediate;
318 else if ((mn = minute.toUInt(&ok)) >= 60 || !ok)
319 return TQValidator::Invalid;
321 hour = cleanText.left(colon);
323 else if (maxMinute >= 1440)
327 state = TQValidator::Intermediate;
331 if (cleanText.length() > 4)
332 return TQValidator::Invalid;
333 if (cleanText.length() < 4)
334 state = TQValidator::Intermediate;
335 hour = cleanText.left(2);
336 TQString minute = cleanText.mid(2);
337 if (!minute.isEmpty()
338 && ((mn = minute.toUInt(&ok)) >= 60 || !ok))
339 return TQValidator::Invalid;
344 hr = hour.toUInt(&ok);
347 if (hr == 0 || hr > 12)
354 if (!ok || hr > maxMinute/60)
355 return TQValidator::Invalid;
357 if (state == TQValidator::Acceptable)
359 int t = hr * 60 + mn;
360 if (t < minMinute || t > maxMinute)
361 return TQValidator::Invalid;