From kde-commits Wed Oct 31 23:38:43 2012 From: Jaroslaw Staniek Date: Wed, 31 Oct 2012 23:38:43 +0000 To: kde-commits Subject: [calligra/calligra/2.5] kexi: Remove limit of 101 fields in Kexi Table Designer Message-Id: <20121031233843.7A6F1A6078 () git ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=135172673532303 Git commit f8df23f8201518681cfd3e85235afc70701643b2 by Jaroslaw Staniek. Committed on 27/10/2012 at 23:40. Pushed by staniek into branch 'calligra/2.5'. Remove limit of 101 fields in Kexi Table Designer BUG:309116 REVIEW:107085 FIXED-IN:2.5.4 M +3 -5 kexi/plugins/tables/kexitabledesignerview.cpp M +48 -15 kexi/widget/dataviewcommon/kexidataawarepropertyset.cpp M +8 -8 kexi/widget/dataviewcommon/kexidataawarepropertyset.h M +2 -2 kexi/widget/dataviewcommon/kexitableviewdata.h http://commits.kde.org/calligra/f8df23f8201518681cfd3e85235afc70701643b2 diff --git a/kexi/plugins/tables/kexitabledesignerview.cpp b/kexi/plugins/t= ables/kexitabledesignerview.cpp index 8ec956d..28d9610 100644 --- a/kexi/plugins/tables/kexitabledesignerview.cpp +++ b/kexi/plugins/tables/kexitabledesignerview.cpp @@ -59,8 +59,6 @@ = #include = -//#define MAX_FIELDS 101 //nice prime number - //! used only for BLOBs #define DEFAULT_OBJECT_TYPE_VALUE "image" = @@ -267,9 +265,9 @@ void KexiTableDesignerView::initData() // d->sets->clear();//default size // } = - //add empty space -// const int columnsCount =3D d->data->columnsCount(); - for (int i =3D tableFieldCount; i < (int)d->sets->size(); i++) { + //add empty space, at least 2 times more than number of existing fields + uint fullSize =3D qMax(d->sets->size(), uint(2 * tableFieldCount)); + for (int i =3D tableFieldCount; i < fullSize; i++) { // KexiDB::RecordData *item =3D new KexiDB::RecordData(columnsCount);//3 = empty fields d->data->append(d->data->createItem()); } diff --git a/kexi/widget/dataviewcommon/kexidataawarepropertyset.cpp b/kexi= /widget/dataviewcommon/kexidataawarepropertyset.cpp index e3a534d..405d90e 100644 --- a/kexi/widget/dataviewcommon/kexidataawarepropertyset.cpp +++ b/kexi/widget/dataviewcommon/kexidataawarepropertyset.cpp @@ -1,5 +1,5 @@ /* This file is part of the KDE project - Copyright (C) 2004-2005 Jaros=C5=82aw Staniek + Copyright (C) 2004-2012 Jaros=C5=82aw Staniek = This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -25,8 +25,6 @@ #include #include = -#define MAX_FIELDS 101 //nice prime number (default prop. set vector size) - KexiDataAwarePropertySet::KexiDataAwarePropertySet(KexiView *view, KexiDataAwareObjectInterface* dataObject) : QObject(view) @@ -81,9 +79,11 @@ void KexiDataAwarePropertySet::eraseCurrentPropertySet() = void KexiDataAwarePropertySet::eraseAt(uint row) { - KoProperty::Set *set =3D m_sets.at(row); - if (!set) + KoProperty::Set *set =3D m_sets.value(row); + if (!set) { + kWarning() << "No row to erase:" << row; return; + } m_sets[row] =3D 0; set->debug(); delete set; @@ -96,14 +96,27 @@ uint KexiDataAwarePropertySet::size() const return m_sets.size(); } = -void KexiDataAwarePropertySet::clear(uint minimumSize) +void KexiDataAwarePropertySet::clear() { + qDeleteAll(m_sets); m_sets.clear(); - m_sets.resize(qMax(minimumSize, (uint)MAX_FIELDS)); + m_sets.resize(1000); m_view->setDirty(true); m_view->propertySetSwitched(); } = +void KexiDataAwarePropertySet::enlargeToFitRow(uint row) +{ + uint newSize =3D m_sets.size(); + if (row < newSize) { + return; + } + while (newSize < (row + 1)) { + newSize *=3D 2; + } + m_sets.resize(newSize); +} + void KexiDataAwarePropertySet::slotReloadRequested() { clear(); @@ -111,14 +124,18 @@ void KexiDataAwarePropertySet::slotReloadRequested() = void KexiDataAwarePropertySet::set(uint row, KoProperty::Set* set, bool ne= wOne) { - if (!set || row >=3D (uint)m_sets.size()) { - kWarning() << "invalid args: record=3D" << row << "propertyset=3D"= << set; + if (!set) { + Q_ASSERT_X(false, "KexiDataAwarePropertySet::set", "set =3D=3D 0"); + kWarning() << "set =3D=3D 0"; return; } if (set->parent() && set->parent() !=3D this) { - kWarning() << "property set's parent must be NULL or this KexiData= AwarePropertySet"; + const char *msg =3D "property set's parent must be NULL or this Ke= xiDataAwarePropertySet"; + Q_ASSERT_X(false, "KexiDataAwarePropertySet::set", msg); + kWarning() << msg; return; } + enlargeToFitRow(row); = m_sets[row] =3D set; = @@ -136,7 +153,10 @@ void KexiDataAwarePropertySet::set(uint row, KoPropert= y::Set* set, bool newOne) = KoProperty::Set* KexiDataAwarePropertySet::currentPropertySet() const { - return (m_dataObject->currentRow() >=3D 0) ? m_sets.at(m_dataObject->c= urrentRow()) : 0; + if (m_dataObject->currentRow() < 0) { + return 0; + } + return m_sets.value(m_dataObject->currentRow()); } = uint KexiDataAwarePropertySet::currentRow() const @@ -159,19 +179,29 @@ void KexiDataAwarePropertySet::slotRowDeleted() m_sets[ size ] =3D 0;*/ = // It's simplified in Qt4: + enlargeToFitRow(m_dataObject->currentRow()); m_sets.remove(m_dataObject->currentRow()); = m_view->propertySetSwitched(); emit rowDeleted(); } = -void KexiDataAwarePropertySet::slotRowsDeleted(const QList &rows) +void KexiDataAwarePropertySet::slotRowsDeleted(const QList &_rows) { + if (_rows.isEmpty()) { + return; + } //let's move most property sets up & delete unwanted const int orig_size =3D size(); int prev_r =3D -1; - int num_removed =3D 0, cur_r =3D -1; - for (QList::ConstIterator r_it =3D rows.constBegin(); r_it !=3D r= ows.constEnd() && *r_it < orig_size; ++r_it) { + int num_removed =3D 0; + int cur_r =3D -1; + QList rows(_rows); + qSort(rows); + enlargeToFitRow(rows.last()); + for (QList::ConstIterator r_it =3D rows.constBegin(); r_it !=3D r= ows.constEnd() && *r_it < + orig_size; ++r_it) + { cur_r =3D *r_it; if (prev_r >=3D 0) { // kDebug() << "move " << prev_r+num_removed-1 << ".." << cur_r-1 << " t= o " << prev_r+num_removed-1 << ".." << cur_r-2; @@ -236,6 +266,9 @@ void KexiDataAwarePropertySet::slotRowInserted(KexiDB::= RecordData*, uint pos, bo m_sets[row] =3D 0;*/ = // It's simplified in Qt4: + if (pos > 0) { + enlargeToFitRow(pos - 1); + } m_sets.insert(pos, 0); = m_view->propertySetSwitched(); @@ -250,7 +283,7 @@ void KexiDataAwarePropertySet::slotCellSelected(int, in= t row) m_view->propertySetSwitched(); } = -KoProperty::Set* KexiDataAwarePropertySet::findPropertySetForItem(KexiDB::= RecordData& record) +KoProperty::Set* KexiDataAwarePropertySet::findPropertySetForItem(const Ke= xiDB::RecordData& record) { if (m_currentTVData.isNull()) return 0; diff --git a/kexi/widget/dataviewcommon/kexidataawarepropertyset.h b/kexi/w= idget/dataviewcommon/kexidataawarepropertyset.h index 8a27b7c..7806dc2 100644 --- a/kexi/widget/dataviewcommon/kexidataawarepropertyset.h +++ b/kexi/widget/dataviewcommon/kexidataawarepropertyset.h @@ -1,5 +1,5 @@ /* This file is part of the KDE project - Copyright (C) 2004-2005 Jaros=C5=82aw Staniek + Copyright (C) 2004-2012 Jaros=C5=82aw Staniek = This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -28,8 +28,6 @@ #include #include = -typedef QVector SetVector; - class KexiView; class KexiTableViewData; class KexiDataAwareObjectInterface; @@ -74,13 +72,13 @@ public: uint currentRow() const; = inline KoProperty::Set* at(uint row) const { - return m_sets[row]; + return m_sets.value(row); } = /*! \return a pointer to property set assigned for \a record or null i= f \a item has no property set assigned or it's not owned by assigned table view or if assigned table view has no data set. */ - KoProperty::Set* findPropertySetForItem(KexiDB::RecordData& record); + KoProperty::Set* findPropertySetForItem(const KexiDB::RecordData& reco= rd); = /*! \return number of the first row containing \a propertyName propert= y equal to \a value. This is used e.g. in the Table Designer to find a row by field name. @@ -101,7 +99,7 @@ signals: public slots: void eraseCurrentPropertySet(); = - void clear(uint minimumSize =3D 0); + void clear(); = /*! Inserts \a set property set at \a row position. If there was a buffer at this position before, it will be destroyed. @@ -117,7 +115,7 @@ public slots: */ void set(uint row, KoProperty::Set* set, bool newOne =3D false); = - /*! Erases a property set at \a row position. */ + /*! Deletes a property set at \a row position without removing the row= . */ void eraseAt(uint row); = protected slots: @@ -140,7 +138,9 @@ protected slots: void slotReloadRequested(); = protected: - SetVector m_sets; //!< prop. sets vector + void enlargeToFitRow(uint row); + + QVector m_sets; //!< prop. sets vector = QPointer m_view; KexiDataAwareObjectInterface* m_dataObject; diff --git a/kexi/widget/dataviewcommon/kexitableviewdata.h b/kexi/widget/d= ataviewcommon/kexitableviewdata.h index b96f348..39d695a 100644 --- a/kexi/widget/dataviewcommon/kexitableviewdata.h +++ b/kexi/widget/dataviewcommon/kexitableviewdata.h @@ -252,8 +252,8 @@ public: return KexiTableViewDataBase::last(); } //Qt 4 inline int findRef( const KexiDB::RecordData* record ) { return Kex= iTableViewDataBase::findRef(record); } - inline int indexOf(KexiDB::RecordData* record, int from =3D 0) const { - return KexiTableViewDataBase::indexOf(record, from); + inline int indexOf(const KexiDB::RecordData* record, int from =3D 0) c= onst { + return KexiTableViewDataBase::indexOf(const_cast(record), from); } inline void removeFirst() { KexiTableViewDataBase::removeFirst();