Subversion Repositories Scribus

Rev

Rev 19416 | Rev 20793 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
1111 tsoots 7
/***************************************************************************
8
 *   Copyright (C) 2005 by Riku Leino                                      *
5116 tsoots 9
 *   riku@scribus.info                                                     *
1111 tsoots 10
 *                                                                         *
11
 *   This program is free software; you can redistribute it and/or modify  *
12
 *   it under the terms of the GNU General Public License as published by  *
13
 *   the Free Software Foundation; either version 2 of the License, or     *
14
 *   (at your option) any later version.                                   *
15
 *                                                                         *
16
 *   This program is distributed in the hope that it will be useful,       *
17
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
19
 *   GNU General Public License for more details.                          *
20
 *                                                                         *
21
 *   You should have received a copy of the GNU General Public License     *
22
 *   along with this program; if not, write to the                         *
23
 *   Free Software Foundation, Inc.,                                       *
18122 mrdocs 24
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
1111 tsoots 25
 ***************************************************************************/
26
 
27
#include "undostate.h"
5116 tsoots 28
#include "undoobject.h"
1111 tsoots 29
 
5116 tsoots 30
UndoState::UndoState(const QString& name, const QString& description, QPixmap* pixmap) :
13322 cbradney 31
transactionCode(0),
5116 tsoots 32
actionName_(name),
33
actionDescription_(description),
34
actionPixmap_(pixmap),
13322 cbradney 35
undoObject_(0)
1111 tsoots 36
{
5116 tsoots 37
 
1111 tsoots 38
}
39
 
40
QString UndoState::getName()
41
{
5116 tsoots 42
        return actionName_;
1111 tsoots 43
}
44
 
1213 tsoots 45
void UndoState::setName(const QString &newName)
46
{
5116 tsoots 47
        actionName_ = newName;
1213 tsoots 48
}
49
 
1111 tsoots 50
QString UndoState::getDescription()
51
{
5116 tsoots 52
        return actionDescription_;
1111 tsoots 53
}
54
 
1213 tsoots 55
void UndoState::setDescription(const QString &newDescription)
56
{
5116 tsoots 57
        actionDescription_ = newDescription;
1213 tsoots 58
}
59
 
1111 tsoots 60
QPixmap* UndoState::getPixmap()
61
{
5116 tsoots 62
        return actionPixmap_;
1111 tsoots 63
}
64
 
1213 tsoots 65
void UndoState::setPixmap(QPixmap *pixmap)
66
{
5116 tsoots 67
        actionPixmap_ = pixmap;
1213 tsoots 68
}
69
 
5116 tsoots 70
void UndoState::undo()
71
{
72
        if (undoObject_) // if !undoObject_ there's an error, hmmm
73
                undoObject_->restore(this, true);
74
}
75
 
76
void UndoState::redo()
77
{
78
        if (undoObject_)
79
                undoObject_->restore(this, false);
80
}
81
 
82
void UndoState::setUndoObject(UndoObject *object)
83
{
11168 jghali 84
        undoObject_ = object->undoObjectPtr();
5116 tsoots 85
}
86
 
87
UndoObject* UndoState::undoObject()
88
{
89
        return undoObject_;
90
}
91
 
1111 tsoots 92
UndoState::~UndoState()
93
{
1518 tsoots 94
 
1111 tsoots 95
}
96
 
97
/*** SimpleState **************************************************************/
98
 
99
SimpleState::SimpleState(const QString& name, const QString& description, QPixmap* pixmap)
100
: UndoState(name, description, pixmap)
101
{
102
 
103
}
104
 
105
bool SimpleState::contains(const QString& key)
106
{
5116 tsoots 107
        return values_.contains(key);
1111 tsoots 108
}
109
 
13461 jghali 110
QVariant SimpleState::variant(const QString& key, const QVariant& def)
111
{
112
        QMap<QString, QVariant>::const_iterator it = values_.find(key);
113
        if (it != values_.end())
114
                return it.value();
115
 
116
        values_[key] = def;
117
        return def;
118
}
119
 
1111 tsoots 120
QString SimpleState::get(const QString& key, const QString& def)
121
{
13461 jghali 122
        QMap<QString, QVariant>::const_iterator it = values_.find(key);
123
        if (it != values_.end())
124
                return it.value().toString();
1111 tsoots 125
 
5116 tsoots 126
        values_[key] = def;
13461 jghali 127
        return def;
1111 tsoots 128
}
129
 
130
int SimpleState::getInt(const QString& key, int def)
131
{
132
        bool ok = false;
13461 jghali 133
        QVariant retVar = variant(key, QVariant(def));
134
        int ret = retVar.toInt(&ok);
1111 tsoots 135
        if (!ok)
136
                ret = def;
137
        return ret;
138
}
139
 
1238 tsoots 140
uint SimpleState::getUInt(const QString& key, uint def)
141
{
142
        bool ok = false;
13461 jghali 143
        QVariant retVar = variant(key, QVariant(def));
144
        uint ret = retVar.toUInt(&ok);
1238 tsoots 145
        if (!ok)
146
                ret = def;
147
        return ret;
148
}
149
 
1111 tsoots 150
double SimpleState::getDouble(const QString& key, double def)
151
{
152
        bool ok = false;
13461 jghali 153
        QVariant retVar = variant(key, QVariant(def));
154
        double ret = retVar.toDouble(&ok);
1111 tsoots 155
        if (!ok)
156
                ret = def;
157
        return ret;
158
}
159
 
1179 tsoots 160
bool SimpleState::getBool(const QString& key, bool def)
161
{
162
        bool ok = false;
13461 jghali 163
        QVariant retVar = variant(key, QVariant(def));
164
        int ret = retVar.toInt(&ok);
1179 tsoots 165
        if (!ok)
166
                ret = def;
167
        return ret;
168
}
169
 
1111 tsoots 170
void SimpleState::set(const QString& key, const QString& value)
171
{
13461 jghali 172
        values_[key] = QVariant(value);
1111 tsoots 173
}
174
 
175
void SimpleState::set(const QString& key, int value)
176
{
13461 jghali 177
        values_[key] = QVariant(value);
1111 tsoots 178
}
179
 
1238 tsoots 180
void SimpleState::set(const QString& key, uint value)
181
{
13461 jghali 182
        values_[key] = QVariant(value);
1238 tsoots 183
}
184
 
1111 tsoots 185
void SimpleState::set(const QString& key, double value)
186
{
13461 jghali 187
        values_[key] = QVariant(value);
1111 tsoots 188
}
189
 
1179 tsoots 190
void SimpleState::set(const QString& key, bool value)
191
{
13461 jghali 192
        values_[key] = QVariant(value);
1179 tsoots 193
}
1111 tsoots 194
 
1179 tsoots 195
 
1518 tsoots 196
SimpleState::~SimpleState()
1111 tsoots 197
{
198
 
199
}
19416 jghali 200
 
201
/*** TransactionState *****************************************************/
202
 
203
TransactionState::TransactionState() : UndoState("")
204
{
205
        size_ = 0;
206
}
207
 
19929 jghali 208
UndoState* TransactionState::at(int index) const
19416 jghali 209
{
210
        if (index >= 0 && static_cast<uint>(index) < sizet())
211
                return states_[index];
212
        else
213
                return 0;
214
}
215
 
19929 jghali 216
UndoState* TransactionState::last() const
217
{
218
        if (states_.size() > 0)
219
                return states_.at(size_ - 1);
220
        return 0;
221
}
222
 
19416 jghali 223
bool TransactionState::contains(int uid) const
224
{
225
        for (uint i = 0; i < states_.size(); ++i)
226
        {
227
                UndoObject* undoObject = states_[i]->undoObject();
228
                if (undoObject && undoObject->getUId() == static_cast<uint>(uid))
229
                        return true;
230
        }
231
        return false;
232
}
233
 
234
bool TransactionState::containsOnly(int uid) const
235
{
236
        for (uint i = 0; i < states_.size(); ++i)
237
        {
238
                UndoObject* undoObject = states_[i]->undoObject();
239
                if (undoObject && undoObject->getUId() != static_cast<uint>(uid))
240
                        return false;
241
        }
242
        return true;
243
}
244
 
245
void TransactionState::pushBack(UndoObject *target, UndoState *state)
246
{
247
        if (target && state)
248
        {
249
                state->setUndoObject(target);
250
                states_.push_back(state);
251
                ++size_;
252
        }
253
}
254
 
19929 jghali 255
uint TransactionState::sizet() const
19416 jghali 256
{
257
        return size_;
258
}
259
 
260
void TransactionState::useActionName()
261
{
262
        if (size_ > 0)
263
                setName(states_[size_ - 1]->getName());
264
}
265
 
266
UndoObject* TransactionState::replace(ulong uid, UndoObject *newUndoObject)
267
{
268
        UndoObject *tmp = 0;
269
        for (uint i = 0; i < states_.size(); ++i)
270
        {
271
                TransactionState *ts = dynamic_cast<TransactionState*>(states_[i]);
272
                if (ts) // are we having a transaction_inside a transaction
273
                        ts->replace(uid, newUndoObject);
274
                else if (states_[i]->undoObject() && states_[i]->undoObject()->getUId() == uid)
275
                {
276
                        tmp = states_[i]->undoObject();
277
                        states_[i]->setUndoObject(newUndoObject);
278
                }
279
        }
280
        return tmp;
281
}
282
 
283
void TransactionState::undo() // undo all attached states
284
{
285
        for (int i = sizet() - 1; i > -1; --i)
286
        {
287
                if ((sizet() - 1) == 0)
288
                        at(i)->transactionCode = 0;
289
                else
290
                {
291
                        if (i == static_cast<int>(sizet() - 1))
292
                                at(i)->transactionCode = 1;
293
                        else if (i == 0)
294
                                at(i)->transactionCode = 2;
295
                        else
296
                                at(i)->transactionCode = 3;
297
                }
298
                if (transactionCode != 0)
299
                        at(i)->transactionCode = transactionCode;
300
                at(i)->undo();
301
        }
302
}
303
 
304
void TransactionState::redo() // redo all attached states
305
{
306
        for (uint i = 0; i < sizet(); ++i)
307
        {
308
                if ((sizet() - 1) == 0)
309
                        at(i)->transactionCode = 0;
310
                else
311
                {
312
                        if (i == 0)
313
                                at(i)->transactionCode = 1;
314
                        else if (i == static_cast<uint>(sizet() - 1))
315
                                at(i)->transactionCode = 2;
316
                        else
317
                                at(i)->transactionCode = 3;
318
                }
319
                if (transactionCode != 0)
320
                        at(i)->transactionCode = transactionCode;
321
                at(i)->redo();
322
        }
323
}
324
 
325
TransactionState::~TransactionState()
326
{
327
        for (uint i = 0; i < states_.size(); ++i)
328
        {
329
                if (states_[i])
330
                {
331
                        delete states_[i];
332
                        states_[i] = 0;
333
                }
334
        }
335
}