1/* This file is part of the KDE project
2 Copyright 2009 Johannes Simon <johannes.simon@gmail.com>
3
4 This library 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.
8
9 This library 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.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
18*/
19
20// Ours
21#include "SheetAccessModel.h"
22#include "calligra_sheets_limits.h"
23#include "Map.h"
24#include "Binding.h"
25#include "BindingManager.h"
26#include "Damages.h"
27#include "Region.h"
28
29// Qt
30#include <QList>
31#include <QMap>
32#include <QStandardItem>
33#include <QAbstractItemModel>
34#include <QVariant>
35
36// Calligra
37//#include <KoStore.h>
38//#include <KoXmlWriter.h>
39//#include <KoShapeSavingContext.h>
40
41Q_DECLARE_METATYPE(QPointer<QAbstractItemModel>)
42
43namespace Calligra
44{
45namespace Sheets
46{
47
48class SheetAccessModel::Private
49{
50public:
51 Map *map;
52 /// Stores in what column each Sheet is. We need this because
53 /// a Sheet is removed from its Map before the sheetRemoved() signal
54 /// is emitted, thus we can't ask the Map what index it had.
55 QMap<Sheet*, int> cols;
56};
57
58SheetAccessModel::SheetAccessModel(Map *map)
59 : d(new Private)
60{
61 d->map = map;
62
63 connect(map, SIGNAL(sheetAdded(Sheet*)),
64 this, SLOT(slotSheetAdded(Sheet*)));
65 // FIXME: Check if we can simply connect sheetRevived() to slotSheetAdded()
66 connect(map, SIGNAL(sheetRevived(Sheet*)),
67 this, SLOT(slotSheetAdded(Sheet*)));
68 connect(map, SIGNAL(sheetRemoved(Sheet*)),
69 this, SLOT(slotSheetRemoved(Sheet*)));
70 connect(map, SIGNAL(damagesFlushed(QList<Damage*>)),
71 this, SLOT(handleDamages(QList<Damage*>)));
72
73 setRowCount(1);
74 setColumnCount(0);
75}
76
77SheetAccessModel::~SheetAccessModel()
78{
79 delete d;
80}
81
82void SheetAccessModel::slotSheetAdded(Sheet *sheet)
83{
84 Q_ASSERT(!d->cols.contains(sheet));
85
86 QStandardItem *item = new QStandardItem;
87 QList<QStandardItem*> col;
88 col.append(item);
89
90 // This region contains the entire sheet
91 const Region region(1, 1, KS_colMax, KS_rowMax, sheet);
92 const QPointer<QAbstractItemModel> model = const_cast<QAbstractItemModel*>( d->map->bindingManager()->createModel( region.name() ) );
93
94 item->setData( QVariant::fromValue( model ), Qt::DisplayRole );
95
96 const int sheetIndex = d->map->indexOf( sheet );
97 d->cols.insert(sheet, sheetIndex);
98
99 insertColumn( sheetIndex, col );
100 setHeaderData( sheetIndex, Qt::Horizontal, sheet->sheetName() );
101}
102
103void SheetAccessModel::slotSheetRemoved(Sheet *sheet)
104{
105 Q_ASSERT(d->cols.contains(sheet));
106 removeColumn(d->cols[sheet]);
107 d->cols.remove(sheet);
108}
109
110void SheetAccessModel::handleDamages(const QList<Damage*>& damages)
111{
112 QList<Damage*>::ConstIterator end(damages.end());
113 for (QList<Damage*>::ConstIterator it = damages.begin(); it != end; ++it) {
114 Damage* damage = *it;
115 if (!damage) {
116 continue;
117 }
118
119 if (damage->type() == Damage::Sheet) {
120 SheetDamage* sheetDamage = static_cast<SheetDamage*>(damage);
121 kDebug(36007) << "Processing\t" << *sheetDamage;
122
123 if (sheetDamage->changes() & SheetDamage::Name) {
124 Sheet *sheet = sheetDamage->sheet();
125 // We should never receive signals from sheets that are not in our model
126 Q_ASSERT(d->cols.contains(sheet));
127 const int sheetIndex = d->cols[sheet];
128 setHeaderData(sheetIndex, Qt::Horizontal, sheet->sheetName());
129 }
130 continue;
131 }
132 }
133}
134
135} // namespace Sheets
136} // namespace Calligra
137