1
/* This file is part of the KDE project
2
Copyright (C) 2004-2005 Jaroslaw Staniek <js@iidea.pl>
4
This program is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Library General Public
6
License as published by the Free Software Foundation; either
7
version 2 of the License, or (at your option) any later version.
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
Library General Public License for more details.
14
You should have received a copy of the GNU Library General Public License
15
along with this program; see the file COPYING. If not, write to
16
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
* Boston, MA 02110-1301, USA.
20
#include "kexidataawarepropertyset.h"
21
#include "kexitableviewdata.h"
22
#include "kexidataawareobjectiface.h"
24
#include <koproperty/property.h>
25
#include <kexiviewbase.h>
27
#define MAX_FIELDS 101 //nice prime number (default buffer vector size)
29
KexiDataAwarePropertySet::KexiDataAwarePropertySet(KexiViewBase *view,
30
KexiDataAwareObjectInterface* dataObject)
31
: QObject( view, QCString(view->name())+"KexiDataAwarePropertySet" )
33
, m_dataObject(dataObject)
36
m_sets.setAutoDelete(true);
38
// connect(m_dataObject, SIGNAL(dataSet(KexiTableViewData*)),
39
// this, SLOT(slotDataSet(KexiTableViewData*)));
40
m_dataObject->connectDataSetSignal(this, SLOT(slotDataSet(KexiTableViewData*)));
41
// connect(m_dataObject, SIGNAL(cellSelected(int,int)),
42
// this, SLOT(slotCellSelected(int,int)));
43
m_dataObject->connectCellSelectedSignal(this, SLOT(slotCellSelected(int,int)));
45
slotDataSet( m_dataObject->data() );
46
const bool wasDirty = view->dirty();
49
view->setDirty(false);
52
KexiDataAwarePropertySet::~KexiDataAwarePropertySet()
56
void KexiDataAwarePropertySet::slotDataSet( KexiTableViewData *data )
58
if (!m_currentTVData.isNull()) {
59
m_currentTVData->disconnect( this );
62
m_currentTVData = data;
63
if (!m_currentTVData.isNull()) {
64
connect(m_currentTVData, SIGNAL(rowDeleted()), this, SLOT(slotRowDeleted()));
65
connect(m_currentTVData, SIGNAL(rowsDeleted( const QValueList<int> & )),
66
this, SLOT(slotRowsDeleted( const QValueList<int> & )));
67
connect(m_currentTVData, SIGNAL(rowInserted(KexiTableItem*,uint,bool)),
68
this, SLOT(slotRowInserted(KexiTableItem*,uint,bool)));
69
connect(m_currentTVData, SIGNAL(reloadRequested()),
70
this, SLOT(slotReloadRequested()));
74
void KexiDataAwarePropertySet::removeCurrentPropertySet()
76
remove( m_dataObject->currentRow() );
79
void KexiDataAwarePropertySet::remove(uint row)
81
KoProperty::Set *buf = m_sets.at(row);
87
m_view->propertySetSwitched();
90
uint KexiDataAwarePropertySet::size() const
95
void KexiDataAwarePropertySet::clear(uint minimumSize)
98
m_sets.resize(QMAX(minimumSize, MAX_FIELDS));
99
m_view->setDirty(true);
100
m_view->propertySetSwitched();
103
void KexiDataAwarePropertySet::slotReloadRequested()
108
void KexiDataAwarePropertySet::insert(uint row, KoProperty::Set* buf, bool newOne)
110
if (!buf || row >= m_sets.size()) {
111
kexiwarn << "KexiDataAwarePropertySet::insert() invalid args: rew="<< row<< " buf="<< buf<< endl;
114
if (buf->parent() && buf->parent()!=this) {
115
kexiwarn << "KexiDataAwarePropertySet::insert() buffer's parent must be NULL or this KexiDataAwarePropertySet" << endl;
119
// m_sets.remove(row);//sanity
121
/* //let's move down all buffers that are below
122
m_sets.setAutoDelete(false);//to avoid auto deleting in insert()
123
m_sets.resize(m_sets.size()+1);
124
for (int i=int(m_sets.size()-1); i>(int)row; i--) {
125
KoProperty::Set *b = m_sets[i-1];
126
m_sets.insert( i , b );
128
m_sets.insert(row, buf);
130
// m_sets.setAutoDelete(true);//revert the flag
132
connect(buf,SIGNAL(propertyChanged()), m_view, SLOT(setDirty()));
135
//add a special property indicating that this is brand new buffer,
137
KoProperty::Property* prop = new KoProperty::Property("newrow");
138
prop->setVisible(false);
139
buf->addProperty( prop );
144
KoProperty::Set* KexiDataAwarePropertySet::currentPropertySet() const
146
return (m_dataObject->currentRow() >= 0) ? m_sets.at( m_dataObject->currentRow() ) : 0;
149
void KexiDataAwarePropertySet::slotRowDeleted()
152
removeCurrentPropertySet();
154
//let's move up all buffers that are below that deleted
155
m_sets.setAutoDelete(false);//to avoid auto deleting in insert()
156
const int r = m_dataObject->currentRow();
157
for (int i=r;i<int(m_sets.size()-1);i++) {
158
KoProperty::Set *b = m_sets[i+1];
159
m_sets.insert( i , b );
161
m_sets.insert( m_sets.size()-1, 0 );
162
m_sets.setAutoDelete(true);//revert the flag
164
m_view->propertySetSwitched();
168
void KexiDataAwarePropertySet::slotRowsDeleted( const QValueList<int> &rows )
170
//let's move most buffers up & delete unwanted
171
m_sets.setAutoDelete(false);//to avoid auto deleting in insert()
172
const int orig_size = size();
174
int num_removed = 0, cur_r = -1;
175
for (QValueList<int>::ConstIterator r_it = rows.constBegin(); r_it!=rows.constEnd() && *r_it < orig_size; ++r_it) {
176
cur_r = *r_it;// - num_removed;
178
// kdDebug() << "move " << prev_r+num_removed-1 << ".." << cur_r-1 << " to " << prev_r+num_removed-1 << ".." << cur_r-2 << endl;
180
KoProperty::Set *b = m_sets.take(i+num_removed);
181
kdDebug() << "buffer " << i+num_removed << " deleted" << endl;
184
for (; (i+num_removed)<cur_r; i++) {
185
m_sets.insert( i, m_sets[i+num_removed] );
186
kdDebug() << i << " <- " << i+num_removed << endl;
189
prev_r = cur_r - num_removed;
191
//move remaining buffers up
193
KoProperty::Set *b = m_sets.take(cur_r);
194
kdDebug() << "buffer " << cur_r << " deleted" << endl;
197
for (int i=prev_r; (i+num_removed)<orig_size; i++) {
198
m_sets.insert( i, m_sets[i+num_removed] );
199
kdDebug() << i << " <- " << i+num_removed << endl;
202
//finally: clear last rows
203
for (int i=orig_size-num_removed; i<orig_size; i++) {
204
kdDebug() << i << " <- zero" << endl;
205
m_sets.insert( i, 0 );
207
m_sets.setAutoDelete(true);//revert the flag
211
m_view->propertySetSwitched();
214
//void KexiDataAwarePropertySet::slotEmptyRowInserted(KexiTableItem*, uint /*index*/)
215
void KexiDataAwarePropertySet::slotRowInserted(KexiTableItem*, uint row, bool /*repaint*/)
219
//let's move down all buffers that are below
220
m_sets.setAutoDelete(false);//to avoid auto deleting in insert()
221
// const int r = m_dataObject->currentRow();
222
m_sets.resize(m_sets.size()+1);
223
for (int i=int(m_sets.size())-1; i>(int)row; i--) {
224
KoProperty::Set *b = m_sets[i-1];
225
m_sets.insert( i , b );
227
m_sets.insert( row, 0 );
228
m_sets.setAutoDelete(true);//revert the flag
230
m_view->propertySetSwitched();
235
void KexiDataAwarePropertySet::slotCellSelected(int, int row)
240
m_view->propertySetSwitched();
243
KoProperty::Set* KexiDataAwarePropertySet::listForItem(KexiTableItem& item)
245
if (m_currentTVData.isNull())
247
int idx = m_currentTVData->findRef(&item);
253
#include "kexidataawarepropertyset.moc"