diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kexi/widget/tableview/kexicelleditorfactory.cpp | |
download | koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip |
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kexi/widget/tableview/kexicelleditorfactory.cpp')
-rw-r--r-- | kexi/widget/tableview/kexicelleditorfactory.cpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/kexi/widget/tableview/kexicelleditorfactory.cpp b/kexi/widget/tableview/kexicelleditorfactory.cpp new file mode 100644 index 00000000..a20eac07 --- /dev/null +++ b/kexi/widget/tableview/kexicelleditorfactory.cpp @@ -0,0 +1,198 @@ +/* This file is part of the KDE project + Copyright (C) 2004-2007 Jaroslaw Staniek <[email protected]> + + This program 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 program 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 program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include "kexicelleditorfactory.h" + +#include <qptrdict.h> +#include <qintdict.h> +#include <kstaticdeleter.h> + +#include <kexidb/indexschema.h> +#include <kexidb/tableschema.h> +#include "kexitableviewdata.h" +#include "kexidatetableedit.h" +#include "kexitimetableedit.h" +#include "kexidatetimetableedit.h" +#include "kexitableedit.h" +#include "kexiinputtableedit.h" +#include "kexicomboboxtableedit.h" +#include "kexiblobtableedit.h" +#include "kexibooltableedit.h" + +//============= KexiCellEditorFactoryItem ============ + +KexiCellEditorFactoryItem::KexiCellEditorFactoryItem() +{ +} + +KexiCellEditorFactoryItem::~KexiCellEditorFactoryItem() +{ +} + +//============= KexiCellEditorFactoryPrivate ============ + +//! @internal +class KexiCellEditorFactoryPrivate +{ + public: + KexiCellEditorFactoryPrivate() + : items(101) + , items_by_type(101, false) + { + items.setAutoDelete( true ); + items_by_type.setAutoDelete( false ); + } + ~KexiCellEditorFactoryPrivate() {} + + QString key(uint type, const QString& subType) const + { + QString key = QString::number(type); + if (!subType.isEmpty()) + key += (QString(" ") + subType); + return key; + } + + void registerItem( KexiCellEditorFactoryItem& item, uint type, const QString& subType = QString::null ) + { + if (!items[ &item ]) + items.insert( &item, &item ); + + items_by_type.insert( key(type, subType), &item ); + } + + KexiCellEditorFactoryItem *findItem(uint type, const QString& subType) + { + KexiCellEditorFactoryItem *item = items_by_type[ key(type, subType) ]; + if (item) + return item; + item = items_by_type[ key(type, QString::null) ]; + if (item) + return item; + return items_by_type[ key( KexiDB::Field::InvalidType, QString::null ) ]; + } + + QPtrDict<KexiCellEditorFactoryItem> items; //!< list of editor factory items (for later destroy) + + QDict<KexiCellEditorFactoryItem> items_by_type; //!< editor factory items accessed by a key +}; + +static KStaticDeleter<KexiCellEditorFactoryPrivate> KexiCellEditorFactory_deleter; +static KexiCellEditorFactoryPrivate *KexiCellEditorFactory_static = 0; + +//============= KexiCellEditorFactory ============ + +KexiCellEditorFactory::KexiCellEditorFactory() +{ +} + +KexiCellEditorFactory::~KexiCellEditorFactory() +{ +} + + +// Initializes standard editor cell editor factories +void KexiCellEditorFactory::init() +{ + if (KexiCellEditorFactory_static) + return; + KexiCellEditorFactory_deleter.setObject(KexiCellEditorFactory_static, new KexiCellEditorFactoryPrivate()); + + KexiCellEditorFactory_static->registerItem( *new KexiBlobEditorFactoryItem(), KexiDB::Field::BLOB ); + KexiCellEditorFactory_static->registerItem( *new KexiDateEditorFactoryItem(), KexiDB::Field::Date ); + KexiCellEditorFactory_static->registerItem( *new KexiTimeEditorFactoryItem(), KexiDB::Field::Time ); + KexiCellEditorFactory_static->registerItem( *new KexiDateTimeEditorFactoryItem(), KexiDB::Field::DateTime ); + KexiCellEditorFactory_static->registerItem( *new KexiComboBoxEditorFactoryItem(), KexiDB::Field::Enum ); + KexiCellEditorFactory_static->registerItem( *new KexiBoolEditorFactoryItem(), KexiDB::Field::Boolean ); + KexiCellEditorFactory_static->registerItem( *new KexiKIconTableEditorFactoryItem(), KexiDB::Field::Text, "KIcon" ); + //default type + KexiCellEditorFactory_static->registerItem( *new KexiInputEditorFactoryItem(), KexiDB::Field::InvalidType ); +} + +void KexiCellEditorFactory::registerItem( KexiCellEditorFactoryItem& item, uint type, const QString& subType ) +{ + init(); + KexiCellEditorFactory_static->registerItem( item, type, subType ); +} + +static bool hasEnumType( const KexiTableViewColumn &column ) +{ + /*not db-aware case*/ + if (column.relatedData()) + return true; + /*db-aware case*/ + if (!column.field() || !column.field()->table()) + return false; + KexiDB::LookupFieldSchema *lookupFieldSchema = column.field()->table()->lookupFieldSchema( *column.field() ); + if (!lookupFieldSchema) + return false; + if (lookupFieldSchema->rowSource().name().isEmpty()) + return false; + return true; +} + +KexiTableEdit* KexiCellEditorFactory::createEditor(KexiTableViewColumn &column, QWidget* parent) +{ + init(); + KexiDB::Field *realField; + if (column.visibleLookupColumnInfo) { + realField = column.visibleLookupColumnInfo->field; + } + else { + realField = column.field(); + } + + KexiCellEditorFactoryItem *item = 0; + + if (hasEnumType(column)) { + //--we need to create combo box because of relationship: + item = KexiCellEditorFactory::item( KexiDB::Field::Enum ); + } + else { + item = KexiCellEditorFactory::item( realField->type(), realField->subType() ); + } + +#if 0 //js: TODO LATER + //--check if we need to create combo box because of relationship: + //WARNING: it's assumed that indices are one-field long + KexiDB::TableSchema *table = f.table(); + if (table) { + //find index that contain this field + KexiDB::IndexSchema::ListIterator it = table->indicesIterator(); + for (;it.current();++it) { + KexiDB::IndexSchema *idx = it.current(); + if (idx->fields()->findRef(&f)!=-1) { + //find details-side rel. for this index + KexiDB::Relationship *rel = idx->detailsRelationships()->first(); + if (rel) { + + } + } + } + } +#endif + + return item->createEditor(column, parent); +} + +KexiCellEditorFactoryItem* KexiCellEditorFactory::item( uint type, const QString& subType ) +{ + init(); + return KexiCellEditorFactory_static->findItem(type, subType); +} + |