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

List:       kde-commits
Subject:    [calligra/calligra/2.6] kexi: Remove limit of 101 fields in Kexi Table Designer
From:       Jaroslaw Staniek <staniek () kde ! org>
Date:       2012-10-31 23:44:54
Message-ID: 20121031234454.BDA6AA6078 () git ! kde ! org
[Download RAW message or body]

Git commit 4e77897c748b76bcfd7a42ba414f532a57fa22de by Jaroslaw Staniek.
Committed on 27/10/2012 at 23:40.
Pushed by staniek into branch 'calligra/2.6'.

Remove limit of 101 fields in Kexi Table Designer

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/4e77897c748b76bcfd7a42ba414f532a57fa22de

diff --git a/kexi/plugins/tables/kexitabledesignerview.cpp \
b/kexi/plugins/tables/kexitabledesignerview.cpp index a2f1572..754dc6c 100644
--- a/kexi/plugins/tables/kexitabledesignerview.cpp
+++ b/kexi/plugins/tables/kexitabledesignerview.cpp
@@ -60,8 +60,6 @@
 
 #include <kexi_global.h>
 
-//#define MAX_FIELDS 101 //nice prime number
-
 //! used only for BLOBs
 #define DEFAULT_OBJECT_TYPE_VALUE "image"
 
@@ -271,9 +269,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 149ac55..3a4c576 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 <db/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 ac91304..1241d97 100644
--- a/kexi/widget/dataviewcommon/kexitableviewdata.h
+++ b/kexi/widget/dataviewcommon/kexitableviewdata.h
@@ -250,8 +250,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