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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/* This file is part of the KDE project
* Copyright (C) 2013 Gopalakrishna Bhat A <gopalakbhat@gmail.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 "ParagraphFormattingCommand.h"
#include <KoTextDocument.h>
#include <KoTextEditor.h>
#include "KoTextEditor_p.h"
#include <klocalizedstring.h>
class MergeAutoParagraphStyleVisitor : public KoTextVisitor
{
public:
MergeAutoParagraphStyleVisitor(KoTextEditor *editor, const QTextCharFormat &deltaCharFormat, const QTextBlockFormat &deltaBlockFormat)
: KoTextVisitor(editor)
, m_deltaCharFormat(deltaCharFormat)
, m_deltaBlockFormat(deltaBlockFormat)
{
}
void visitBlock(QTextBlock &block, const QTextCursor &caret) override
{
m_formats.clear();
m_cursors.clear();
for (QTextBlock::iterator it = block.begin(); it != block.end(); ++it) {
QTextCursor fragmentSelection(caret);
fragmentSelection.setPosition(it.fragment().position());
fragmentSelection.setPosition(it.fragment().position() + it.fragment().length(), QTextCursor::KeepAnchor);
if (fragmentSelection.anchor() >= fragmentSelection.position()) {
continue;
}
visitFragmentSelection(fragmentSelection);
}
QTextCursor cursor(caret);
cursor.mergeBlockFormat(m_deltaBlockFormat);
cursor.mergeBlockCharFormat(m_deltaCharFormat);
QList<QTextCharFormat>::ConstIterator it = m_formats.constBegin();
foreach(QTextCursor cursor, m_cursors) {
cursor.setCharFormat(*it);
++it;
}
}
void visitFragmentSelection(QTextCursor &fragmentSelection) override
{
QTextCharFormat format = fragmentSelection.charFormat();
format.merge(m_deltaCharFormat);
m_formats.append(format);
m_cursors.append(fragmentSelection);
}
QTextCharFormat m_deltaCharFormat;
QTextBlockFormat m_deltaBlockFormat;
QList<QTextCharFormat> m_formats;
QList<QTextCursor> m_cursors;
};
ParagraphFormattingCommand::ParagraphFormattingCommand(KoTextEditor *editor,
const QTextCharFormat &characterFormat,
const QTextBlockFormat &blockFormat,
const KoListLevelProperties &llp,
KUndo2Command *parent)
:KUndo2Command(parent),
m_first(true),
m_editor(editor),
m_charFormat(characterFormat),
m_blockFormat(blockFormat),
m_levelProperties(llp)
{
Q_ASSERT(editor);
setText(kundo2_i18n("Direct Paragraph Formatting"));
}
ParagraphFormattingCommand::~ParagraphFormattingCommand()
{
}
void ParagraphFormattingCommand::undo()
{
KUndo2Command::undo();
}
void ParagraphFormattingCommand::redo()
{
if (!m_first) {
KUndo2Command::redo();
} else {
MergeAutoParagraphStyleVisitor visitor(m_editor, m_charFormat, m_blockFormat);
m_editor->recursivelyVisitSelection(m_editor->document()->rootFrame()->begin(), visitor);
KoTextEditor::ChangeListFlags flags(KoTextEditor::AutoListStyle | KoTextEditor::DontUnsetIfSame);
m_editor->setListProperties(m_levelProperties, flags, this);
m_first = false;
}
}
|