1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
/* This file is part of the KDE project
* Copyright (C) 2010 Pierre Stirnweiss \pstirnweiss@googlemail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "AcceptChangeCommand.h"
#include <KoGenChange.h>
#include <KoTextDocument.h>
#include <changetracker/KoChangeTracker.h>
#include <changetracker/KoChangeTrackerElement.h>
#include <styles/KoCharacterStyle.h>
#include <KLocale>
#include <QPair>
#include <QStack>
#include <QTextBlock>
#include <QTextCharFormat>
#include <QTextCursor>
#include <QTextDocument>
#include <QTextFragment>
AcceptChangeCommand::AcceptChangeCommand (int changeId, QList<QPair<int, int> > changeRanges, QTextDocument *document, KUndo2Command* parent) : KoTextCommandBase(parent),
m_first(true),
m_changeId(changeId),
m_changeRanges(changeRanges),
m_document(document)
{
setText(i18nc("(qtundo-format)", "Accept change"));
m_changeTracker = KoTextDocument(m_document).changeTracker();
}
AcceptChangeCommand::~AcceptChangeCommand()
{
}
void AcceptChangeCommand::redo()
{
if (m_first) {
m_first = false;
QTextCursor cursor(m_document);
if (m_changeTracker->elementById(m_changeId)->getChangeType() != KoGenChange::DeleteChange) {
QList<QPair<int, int> >::const_iterator it;
for (it = m_changeRanges.constBegin(); it != m_changeRanges.constEnd(); ++it) {
cursor.setPosition((*it).first);
cursor.setPosition((*it).second, QTextCursor::KeepAnchor);
QTextCharFormat format = cursor.charFormat();
int changeId = format.property(KoCharacterStyle::ChangeTrackerId).toInt();
if (changeId == m_changeId) {
if (int parentChangeId = m_changeTracker->parent(m_changeId)) {
format.setProperty(KoCharacterStyle::ChangeTrackerId, parentChangeId);
}
else {
format.clearProperty(KoCharacterStyle::ChangeTrackerId);
}
cursor.setCharFormat(format);
}
}
} else {
QList<QPair<int, int> >::const_iterator it;
QStack<QPair<int, int> > deleteRanges;
for (it = m_changeRanges.constBegin(); it != m_changeRanges.constEnd(); ++it) {
deleteRanges.push(QPair<int, int>((*it).first, (*it).second));
}
while (!deleteRanges.isEmpty()) {
QPair<int, int> range = deleteRanges.pop();
cursor.setPosition(range.first);
cursor.setPosition(range.second, QTextCursor::KeepAnchor);
cursor.deleteChar();
}
}
m_changeTracker->acceptRejectChange(m_changeId, true);
}
else {
m_changeTracker->acceptRejectChange(m_changeId, true);
KoTextCommandBase::redo();
UndoRedoFinalizer finalizer(this);
}
emit acceptRejectChange();
}
void AcceptChangeCommand::undo()
{
m_changeTracker->acceptRejectChange(m_changeId, false);
KoTextCommandBase::undo();
UndoRedoFinalizer finalizer(this);
emit acceptRejectChange();
}
#include <AcceptChangeCommand.moc>
|