[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [calligra/calligra/2.5] kexi: Remove limit of 101 fields in Kexi Table Designer
From:       Jaroslaw Staniek <staniek () kde ! org>
Date:       2012-10-31 23:38:43
Message-ID: 20121031233843.7A6F1A6078 () git ! kde ! org
[Download RAW message or body]

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/tables/kexitabledesignerview.cpp index 8ec956d..28d9610 100644
--- a/kexi/plugins/tables/kexitabledesignerview.cpp
+++ b/kexi/plugins/tables/kexitabledesignerview.cpp
@@ -59,8 +59,6 @@
 
 #include <kexi_global.h>
 
-//#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 = d->data->columnsCount();
-    for (int i = tableFieldCount; i < (int)d->sets->size(); i++) {
+    //add empty space, at least 2 times more than number of existing fields
+    uint fullSize = qMax(d->sets->size(), uint(2 * tableFieldCount));
+    for (int i = tableFieldCount; i < fullSize; i++) {
 //  KexiDB::RecordData *item = 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ław Staniek <staniek@kde.org>
+   Copyright (C) 2004-2012 Jarosław Staniek <staniek@kde.org>
 
    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 <koproperty/Property.h>
 #include <KexiView.h>
 
-#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 = m_sets.at(row);
-    if (!set)
+    KoProperty::Set *set = m_sets.value(row);
+    if (!set) {
+        kWarning() << "No row to erase:" << row;
         return;
+    }
     m_sets[row] = 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 = m_sets.size();
+    if (row < newSize) {
+        return;
+    }
+    while (newSize < (row + 1)) {
+        newSize *= 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 newOne)
 {
-    if (!set || row >= (uint)m_sets.size()) {
-        kWarning() << "invalid args: record=" << row << "propertyset=" << set;
+    if (!set) {
+        Q_ASSERT_X(false, "KexiDataAwarePropertySet::set", "set == 0");
+        kWarning() << "set == 0";
         return;
     }
     if (set->parent() && set->parent() != this) {
-        kWarning() << "property set's parent must be NULL or this KexiDataAwarePropertySet";
+        const char *msg = "property set's parent must be NULL or this KexiDataAwarePropertySet";
+        Q_ASSERT_X(false, "KexiDataAwarePropertySet::set", msg);
+        kWarning() << msg;
         return;
     }
+    enlargeToFitRow(row);
 
     m_sets[row] = set;
 
@@ -136,7 +153,10 @@ void KexiDataAwarePropertySet::set(uint row, KoProperty::Set* set, bool newOne)
 
 KoProperty::Set* KexiDataAwarePropertySet::currentPropertySet() const
 {
-    return (m_dataObject->currentRow() >= 0) ? m_sets.at(m_dataObject->currentRow()) : 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 ] = 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<int> &rows)
+void KexiDataAwarePropertySet::slotRowsDeleted(const QList<int> &_rows)
 {
+    if (_rows.isEmpty()) {
+        return;
+    }
     //let's move most property sets up & delete unwanted
     const int orig_size = size();
     int prev_r = -1;
-    int num_removed = 0, cur_r = -1;
-    for (QList<int>::ConstIterator r_it = rows.constBegin(); r_it != rows.constEnd() && *r_it < \
orig_size; ++r_it) { +    int num_removed = 0;
+    int cur_r = -1;
+    QList<int> rows(_rows);
+    qSort(rows);
+    enlargeToFitRow(rows.last());
+    for (QList<int>::ConstIterator r_it = rows.constBegin(); r_it != rows.constEnd() && *r_it <
+         orig_size; ++r_it)
+    {
         cur_r = *r_it;
         if (prev_r >= 0) {
 //   kDebug() << "move " << prev_r+num_removed-1 << ".." << cur_r-1 << " to " << prev_r+num_removed-1 << \
".." << cur_r-2; @@ -236,6 +266,9 @@ void KexiDataAwarePropertySet::slotRowInserted(KexiDB::RecordData*, \
uint pos, bo  m_sets[row] = 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, int row)
     m_view->propertySetSwitched();
 }
 
-KoProperty::Set* KexiDataAwarePropertySet::findPropertySetForItem(KexiDB::RecordData& record)
+KoProperty::Set* KexiDataAwarePropertySet::findPropertySetForItem(const KexiDB::RecordData& record)
 {
     if (m_currentTVData.isNull())
         return 0;
diff --git a/kexi/widget/dataviewcommon/kexidataawarepropertyset.h \
b/kexi/widget/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ław Staniek <staniek@kde.org>
+   Copyright (C) 2004-2012 Jarosław Staniek <staniek@kde.org>
 
    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 <koproperty/Set.h>
 #include <kexidb/RecordData.h>
 
-typedef QVector<KoProperty::Set*> 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 if \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& record);
 
     /*! \return number of the first row containing \a propertyName property 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 = 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 = 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<KoProperty::Set*> m_sets; //!< prop. sets vector
 
     QPointer<KexiView> m_view;
     KexiDataAwareObjectInterface* m_dataObject;
diff --git a/kexi/widget/dataviewcommon/kexitableviewdata.h \
b/kexi/widget/dataviewcommon/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 \
                KexiTableViewDataBase::findRef(record); }
-    inline int indexOf(KexiDB::RecordData* record, int from = 0) const {
-        return KexiTableViewDataBase::indexOf(record, from);
+    inline int indexOf(const KexiDB::RecordData* record, int from = 0) const {
+        return KexiTableViewDataBase::indexOf(const_cast<KexiDB::RecordData*>(record), from);
     }
     inline void removeFirst() {
         KexiTableViewDataBase::removeFirst();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic