You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kexi/widget/kexiqueryparameters.cpp

140 lines
5.0 KiB

/* This file is part of the KDE project
Copyright (C) 2006 Jaroslaw Staniek <js@iidea.pl>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "kexiqueryparameters.h"
#include <kdebug.h>
#include <tdelocale.h>
#include <kinputdialog.h>
#include <knumvalidator.h>
#include <kexidb/queryschemaparameter.h>
#include <kexidb/utils.h>
#include "utils/kexidatetimeformatter.h"
//static
TQValueList<TQVariant> KexiQueryParameters::getParameters(TQWidget *parent,
const KexiDB::Driver &driver, KexiDB::QuerySchema& querySchema, bool &ok)
{
Q_UNUSED(driver);
ok = false;
const KexiDB::QuerySchemaParameterList params( querySchema.parameters() );
TQValueList<TQVariant> values;
const TQString caption( i18n("Enter Query Parameter Value", "Enter Parameter Value") );
foreach(KexiDB::QuerySchemaParameterListConstIterator, it, params) {
switch ((*it).type) {
case KexiDB::Field::Byte:
case KexiDB::Field::ShortInteger:
case KexiDB::Field::Integer:
case KexiDB::Field::BigInteger: {
//! @todo problem for ranges in case of BigInteger - will disappear when we remove use of KInputDialog
int minValue, maxValue;
//! @todo add support for unsigned parameter here
KexiDB::getLimitsForType((*it).type, minValue, maxValue);
const int result = KInputDialog::getInteger(
caption, (*it).message, 0, minValue, maxValue, 1/*step*/, 10/*base*/, &ok, parent);
if (!ok)
return TQValueList<TQVariant>(); //cancelled
values.append(result);
break;
}
case KexiDB::Field::Boolean: {
TQStringList list;
list << i18n("Boolean True - Yes", "Yes") << i18n("Boolean False - No", "No");
const TQString result = KInputDialog::getItem(
caption, (*it).message, list, 0/*current*/, false /*!editable*/, &ok, parent);
if (!ok || result.isEmpty())
return TQValueList<TQVariant>(); //cancelled
values.append( TQVariant( result==list.first(), 1 ) );
break;
}
case KexiDB::Field::Date: {
KexiDateFormatter df;
const TQString result = KInputDialog::getText(
caption, (*it).message, TQString(), &ok, parent, 0/*name*/,
//! @todo add validator
0/*validator*/, df.inputMask() );
if (!ok)
return TQValueList<TQVariant>(); //cancelled
values.append( df.stringToDate(result) );
break;
}
case KexiDB::Field::DateTime: {
KexiDateFormatter df;
KexiTimeFormatter tf;
const TQString result = KInputDialog::getText(
caption, (*it).message, TQString(), &ok, parent, 0/*name*/,
//! @todo add validator
0/*validator*/, dateTimeInputMask(df, tf) );
if (!ok)
return TQValueList<TQVariant>(); //cancelled
values.append( stringToDateTime(df, tf, result) );
break;
}
case KexiDB::Field::Time: {
KexiTimeFormatter tf;
const TQString result = KInputDialog::getText(
caption, (*it).message, TQString(), &ok, parent, 0/*name*/,
//! @todo add validator
0/*validator*/, tf.inputMask() );
if (!ok)
return TQValueList<TQVariant>(); //cancelled
values.append( tf.stringToTime(result) );
break;
}
case KexiDB::Field::Float:
case KexiDB::Field::Double: {
// KInputDialog::getDouble() does not work well, use getText and double validator
KDoubleValidator validator(0);
const TQString textResult = KInputDialog::getText( caption, (*it).message, TQString(), &ok,
parent, 0, &validator);
if (!ok || textResult.isEmpty())
return TQValueList<TQVariant>(); //cancelled
//! @todo this value will be still rounded: consider storing them as a decimal type
//! (e.g. using a special TQ_LLONG+decimalplace class)
const double result = textResult.toDouble(&ok); //this is also good for float (to avoid rounding)
if (!ok)
return TQValueList<TQVariant>();
values.append( result );
break;
}
case KexiDB::Field::Text:
case KexiDB::Field::LongText: {
const TQString result = KInputDialog::getText(
caption, (*it).message, TQString(), &ok, parent);
if (!ok)
return TQValueList<TQVariant>(); //cancelled
values.append( result );
break;
}
case KexiDB::Field::BLOB: {
//! @todo BLOB input unsupported
values.append( TQByteArray() );
}
default:
kexiwarn << "KexiQueryParameters::getParameters() unsupported type " << KexiDB::Field::typeName((*it).type)
<< " for parameter \"" << (*it).message << "\" - aborting query execution!" << endl;
return TQValueList<TQVariant>();
}
}
ok = true;
return values;
}