/*************************************************************************** copyright : (C) 2005-2006 by Robby Stephenson email : robby@periapsis.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of version 2 of the GNU General Public License as * * published by the Free Software Foundation; * * * ***************************************************************************/ #include "numberfieldwidget.h" #include "datewidget.h" #include "../field.h" #include <klineedit.h> #include <tqlayout.h> #include <tqvalidator.h> using Tellico::GUI::NumberFieldWidget; NumberFieldWidget::NumberFieldWidget(Data::FieldPtr field_, TQWidget* parent_, const char* name_/*=0*/) : FieldWidget(field_, parent_, name_), m_lineEdit(0), m_spinBox(0) { if(field_->flags() & Data::Field::AllowMultiple) { initLineEdit(); } else { initSpinBox(); } registerWidget(); } void NumberFieldWidget::initLineEdit() { m_lineEdit = new KLineEdit(this); connect(m_lineEdit, TQT_SIGNAL(textChanged(const TQString&)), TQT_SIGNAL(modified())); // connect(kl, TQT_SIGNAL(returnPressed(const TQString&)), this, TQT_SLOT(slotHandleReturn())); // regexp is any number of digits followed optionally by any number of // groups of a semi-colon followed optionally by a space, followed by digits TQRegExp rx(TQString::fromLatin1("-?\\d*(; ?-?\\d*)*")); m_lineEdit->setValidator(new TQRegExpValidator(rx, TQT_TQOBJECT(this))); } void NumberFieldWidget::initSpinBox() { // intentionally allow only positive numbers m_spinBox = new GUI::SpinBox(-1, INT_MAX, this); connect(m_spinBox, TQT_SIGNAL(valueChanged(int)), TQT_SIGNAL(modified())); // TQSpinBox doesn't emit valueChanged if you edit the value with // the lineEdit until you change the keyboard focus connect(m_spinBox->child("qt_spinbox_edit"), TQT_SIGNAL(textChanged(const TQString&)), TQT_SIGNAL(modified())); // I want to allow no value, so set space as special text. Empty text is ignored m_spinBox->setSpecialValueText(TQChar(' ')); } TQString NumberFieldWidget::text() const { if(isSpinBox()) { // minValue = special empty text if(m_spinBox->value() > m_spinBox->minValue()) { return TQString::number(m_spinBox->value()); } return TQString(); } TQString text = m_lineEdit->text(); if(field()->flags() & Data::Field::AllowMultiple) { text.replace(s_semiColon, TQString::fromLatin1("; ")); } return text.simplifyWhiteSpace(); } void NumberFieldWidget::setText(const TQString& text_) { blockSignals(true); if(isSpinBox()) { bool ok; int n = text_.toInt(&ok); if(ok) { // did just allow positive if(n < 0) { m_spinBox->setMinValue(INT_MIN+1); } m_spinBox->blockSignals(true); m_spinBox->setValue(n); m_spinBox->blockSignals(false); } } else { m_lineEdit->blockSignals(true); m_lineEdit->setText(text_); m_lineEdit->blockSignals(false); } blockSignals(false); } void NumberFieldWidget::clear() { if(isSpinBox()) { // show empty special value text m_spinBox->setValue(m_spinBox->minValue()); } else { m_lineEdit->clear(); } editMultiple(false); } void NumberFieldWidget::updateFieldHook(Data::FieldPtr, Data::FieldPtr newField_) { bool wasLineEdit = !isSpinBox(); bool nowLineEdit = newField_->flags() & Data::Field::AllowMultiple; if(wasLineEdit == nowLineEdit) { return; } TQString value = text(); if(wasLineEdit && !nowLineEdit) { layout()->remove(m_lineEdit); delete m_lineEdit; m_lineEdit = 0; initSpinBox(); } else if(!wasLineEdit && nowLineEdit) { layout()->remove(m_spinBox); delete m_spinBox; m_spinBox = 0; initLineEdit(); } // should really be FIELD_EDIT_WIDGET_INDEX from fieldwidget.cpp static_cast<TQBoxLayout*>(layout())->insertWidget(2, widget(), 1 /*stretch*/); widget()->show(); setText(value); } TQWidget* NumberFieldWidget::widget() { if(isSpinBox()) { return m_spinBox; } return m_lineEdit; } #include "numberfieldwidget.moc"