Fwd: [calligra] /: Make paragraph and character dialogs actually work, and use the new visitor
C. Boemann
cbo at boemann.dk
Fri Mar 9 19:14:59 GMT 2012
Could someone please review and take it for a spin so i can backport it
---------- Forwarded Message ----------
Subject: [calligra] /: Make paragraph and character dialogs actually work, and
use the new visitor
Date: Friday 09 March 2012
From: "C. Boemann" <cbo at boemann.dk>
To: kde-commits at kde.org
Git commit f829eea91c2fe479a496730af08dff897a99bea7 by C. Boemann.
Committed on 09/03/2012 at 19:41.
Pushed by boemann into branch 'master'.
Make paragraph and character dialogs actually work, and use the new visitor
so it doesn't apply to protected blocks.
Undo also seems to work.
M +4 -0 libs/kotext/KoTextEditor.h
M +112 -3 libs/kotext/KoTextEditor_format.cpp
M +4 -6 plugins/textshape/TextTool.cpp
M +3 -3 plugins/textshape/dialogs/CharacterGeneral.cpp
M +1 -1 plugins/textshape/dialogs/CharacterGeneral.h
M +12 -40 plugins/textshape/dialogs/FontDia.cpp
M +3 -10 plugins/textshape/dialogs/FontDia.h
M +12 -9 plugins/textshape/dialogs/ParagraphSettingsDialog.cpp
M +3 -9 plugins/textshape/dialogs/ParagraphSettingsDialog.h
http://commits.kde.org/calligra/f829eea91c2fe479a496730af08dff897a99bea7
diff --git a/libs/kotext/KoTextEditor.h b/libs/kotext/KoTextEditor.h
index c98a427..1f81cf5 100644
--- a/libs/kotext/KoTextEditor.h
+++ b/libs/kotext/KoTextEditor.h
@@ -206,6 +206,10 @@ public slots:
void setStyle(KoCharacterStyle *style);
+ void mergeAutoStyle(QTextCharFormat deltaCharFormat);
+
+ void mergeAutoStyle(QTextCharFormat deltaCharFormat, QTextBlockFormat
deltaBlockFormat);
+
/**
* Insert an inlineObject (such as a variable) at the current cursor
position. Possibly replacing the selection.
* @param inliner the object to insert.
diff --git a/libs/kotext/KoTextEditor_format.cpp
b/libs/kotext/KoTextEditor_format.cpp
index f969ef2..f862719 100644
--- a/libs/kotext/KoTextEditor_format.cpp
+++ b/libs/kotext/KoTextEditor_format.cpp
@@ -407,7 +407,6 @@ public:
virtual void visitFragmentSelection(QTextCursor fragmentSelection)
{
QTextCharFormat format = m_newFormat;
- fragmentSelection.charFormat();
QVariant v;
v =
fragmentSelection.charFormat().property(KoCharacterStyle::InlineInstanceId);
@@ -438,7 +437,7 @@ public:
void KoTextEditor::setStyle(KoCharacterStyle *style)
{
Q_ASSERT(style);
- d->updateState(KoTextEditor::Private::Format, i18n("Set Character
Style"));
+ d->updateState(KoTextEditor::Private::Custom, i18n("Set Character
Style"));
SetCharacterStyleVisitor visitor(this, style);
@@ -478,7 +477,7 @@ public:
void KoTextEditor::setStyle(KoParagraphStyle *style)
{
- d->updateState(KoTextEditor::Private::Format, i18n("Set Paragraph
Style"));
+ d->updateState(KoTextEditor::Private::Custom, i18n("Set Paragraph
Style"));
KoStyleManager *styleManager = KoTextDocument(d-
>document).styleManager();
SetParagraphStyleVisitor visitor(this, styleManager, style);
@@ -489,6 +488,116 @@ void KoTextEditor::setStyle(KoParagraphStyle *style)
emit textFormatChanged();
}
+class MergeAutoCharacterStyleVisitor : public KoTextVisitor
+{
+public:
+ MergeAutoCharacterStyleVisitor(KoTextEditor *editor, QTextCharFormat
deltaCharFormat)
+ : KoTextVisitor(editor)
+ , m_deltaCharFormat(deltaCharFormat)
+ {
+ }
+
+ virtual void visitBlock(QTextBlock block, const QTextCursor &caret)
+ {
+ KoTextVisitor::visitBlock(block, caret);
+
+ QList<QTextCharFormat>::Iterator it = m_formats.begin();
+ foreach(QTextCursor cursor, m_cursors) {
+ QTextFormat prevFormat(cursor.charFormat());
+ cursor.setCharFormat(*it);
+ editor()->registerTrackedChange(cursor,
KoGenChange::FormatChange, i18n("Formatting"), *it, prevFormat, false);
+ ++it;
+ }
+ }
+
+ virtual void visitFragmentSelection(QTextCursor fragmentSelection)
+ {
+ QTextCharFormat format = fragmentSelection.charFormat();
+ format.merge(m_deltaCharFormat);
+
+ m_formats.append(format);
+ m_cursors.append(fragmentSelection);
+ }
+
+ QTextCharFormat m_deltaCharFormat;
+ QList<QTextCharFormat> m_formats;
+ QList<QTextCursor> m_cursors;
+};
+
+void KoTextEditor::mergeAutoStyle(QTextCharFormat deltaCharFormat)
+{
+ d->updateState(KoTextEditor::Private::Custom, "Formatting");
+
+ MergeAutoCharacterStyleVisitor visitor(this, deltaCharFormat);
+
+ recursivelyVisitSelection(d->document->rootFrame()->begin(), visitor);
+
+ d->updateState(KoTextEditor::Private::NoOp);
+ emit textFormatChanged();
+}
+
+class MergeAutoParagraphStyleVisitor : public KoTextVisitor
+{
+public:
+ MergeAutoParagraphStyleVisitor(KoTextEditor *editor, QTextCharFormat
deltaCharFormat, QTextBlockFormat deltaBlockFormat)
+ : KoTextVisitor(editor)
+ , m_deltaCharFormat(deltaCharFormat)
+ , m_deltaBlockFormat(deltaBlockFormat)
+ {
+ }
+
+ virtual void visitBlock(QTextBlock block, const QTextCursor &caret)
+ {
+ 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);
+ }
+
+ QList<QTextCharFormat>::Iterator it = m_formats.begin();
+ foreach(QTextCursor cursor, m_cursors) {
+ QTextFormat prevFormat(cursor.charFormat());
+ cursor.setCharFormat(*it);
+ editor()->registerTrackedChange(cursor,
KoGenChange::FormatChange, i18n("Formatting"), *it, prevFormat, false);
+ ++it;
+ }
+ QTextCursor cursor(caret);
+ cursor.mergeBlockFormat(m_deltaBlockFormat);
+ cursor.mergeBlockCharFormat(m_deltaCharFormat);
+ }
+
+ virtual void visitFragmentSelection(QTextCursor fragmentSelection)
+ {
+ 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;
+};
+
+void KoTextEditor::mergeAutoStyle(QTextCharFormat deltaCharFormat,
QTextBlockFormat deltaBlockFormat)
+{
+ d->updateState(KoTextEditor::Private::Custom, "Formatting");
+
+ MergeAutoParagraphStyleVisitor visitor(this, deltaCharFormat,
deltaBlockFormat);
+
+ recursivelyVisitSelection(d->document->rootFrame()->begin(), visitor);
+
+ d->updateState(KoTextEditor::Private::NoOp);
+ emit textFormatChanged();
+}
QTextCharFormat KoTextEditor::blockCharFormat() const
{
diff --git a/plugins/textshape/TextTool.cpp b/plugins/textshape/TextTool.cpp
index 2efab17..7e098a8 100644
--- a/plugins/textshape/TextTool.cpp
+++ b/plugins/textshape/TextTool.cpp
@@ -1848,13 +1848,12 @@ void TextTool::splitTableCells()
void TextTool::formatParagraph()
{
- ParagraphSettingsDialog *dia = new ParagraphSettingsDialog(this,
m_textEditor.data()->cursor());//TODO check this with KoTextEditor
+ ParagraphSettingsDialog *dia = new ParagraphSettingsDialog(this,
m_textEditor.data());
dia->setUnit(canvas()->unit());
- connect(dia, SIGNAL(startMacro(const QString&)), this,
SLOT(startMacro(const QString&)));//TODO
- connect(dia, SIGNAL(stopMacro()), this, SLOT(stopMacro()));
dia->exec();
delete dia;
+ returnFocusToCanvas();
}
void TextTool::testSlot(bool on)
@@ -1997,11 +1996,10 @@ void TextTool::insertString(const QString& string)
void TextTool::selectFont()
{
- FontDia *fontDlg = new FontDia(m_textEditor.data()->cursor());//TODO
check this with KoTextEditor
- connect(fontDlg, SIGNAL(startMacro(const QString &)), this,
SLOT(startMacro(const QString &)));
- connect(fontDlg, SIGNAL(stopMacro()), this, SLOT(stopMacro()));
+ FontDia *fontDlg = new FontDia(m_textEditor.data());
fontDlg->exec();
delete fontDlg;
+ returnFocusToCanvas();
}
void TextTool::shapeAddedToCanvas()
diff --git a/plugins/textshape/dialogs/CharacterGeneral.cpp
b/plugins/textshape/dialogs/CharacterGeneral.cpp
index c2315c1..5366b2e 100644
--- a/plugins/textshape/dialogs/CharacterGeneral.cpp
+++ b/plugins/textshape/dialogs/CharacterGeneral.cpp
@@ -29,14 +29,14 @@
#include "kdebug.h"
-CharacterGeneral::CharacterGeneral(QWidget *parent, bool uniqueFormat)
+CharacterGeneral::CharacterGeneral(QWidget *parent)
: QWidget(parent),
m_blockSignals(false),
m_style(0)
{
widget.setupUi(this);
- m_characterHighlighting = new CharacterHighlighting(uniqueFormat, this);
+ m_characterHighlighting = new CharacterHighlighting(true, this);
connect(m_characterHighlighting,
SIGNAL(underlineChanged(KoCharacterStyle::LineType,
KoCharacterStyle::LineStyle, QColor)), this,
SLOT(slotUnderlineChanged(KoCharacterStyle::LineType,
KoCharacterStyle::LineStyle, QColor)));
connect(m_characterHighlighting,
SIGNAL(strikethroughChanged(KoCharacterStyle::LineType,
KoCharacterStyle::LineStyle, QColor)), this,
SLOT(slotStrikethroughChanged(KoCharacterStyle::LineType,
KoCharacterStyle::LineStyle, QColor)));
connect(m_characterHighlighting,
SIGNAL(capitalizationChanged(QFont::Capitalization)), this,
SLOT(slotCapitalizationChanged(QFont::Capitalization)));
@@ -44,7 +44,7 @@ CharacterGeneral::CharacterGeneral(QWidget *parent, bool
uniqueFormat)
connect(m_characterHighlighting, SIGNAL(backgroundColorChanged(QColor)),
this, SLOT(slotBackgroundColorChanged(QColor)));
connect(m_characterHighlighting, SIGNAL(textColorChanged(QColor)), this,
SLOT(slotTextColorChanged(QColor)));
- m_languageTab = new LanguageTab(uniqueFormat, this);
+ m_languageTab = new LanguageTab(true, this);
widget.tabs->addTab(m_characterHighlighting, i18n("Font"));
diff --git a/plugins/textshape/dialogs/CharacterGeneral.h
b/plugins/textshape/dialogs/CharacterGeneral.h
index 8946bc3..cd025a6 100644
--- a/plugins/textshape/dialogs/CharacterGeneral.h
+++ b/plugins/textshape/dialogs/CharacterGeneral.h
@@ -33,7 +33,7 @@ class CharacterGeneral : public QWidget
{
Q_OBJECT
public:
- explicit CharacterGeneral(QWidget *parent = 0, bool uniqueFormat = true);
+ explicit CharacterGeneral(QWidget *parent = 0);
void setStyle(KoCharacterStyle *style);
void hideStyleName(bool hide);
diff --git a/plugins/textshape/dialogs/FontDia.cpp
b/plugins/textshape/dialogs/FontDia.cpp
index 80f1aec..599a295 100644
--- a/plugins/textshape/dialogs/FontDia.cpp
+++ b/plugins/textshape/dialogs/FontDia.cpp
@@ -28,6 +28,8 @@
#include "FormattingPreview.h"
+#include <KoTextEditor.h>
+
#include <klocale.h>
#include <kvbox.h>
#include <kfontdialog.h>
@@ -37,50 +39,18 @@
#include <QTextDocument>
#include <QTextCursor>
-FontDia::FontDia(QTextCursor* cursor, QWidget* parent)
- : KDialog(parent),
- m_cursor(cursor)
+FontDia::FontDia(KoTextEditor *editor, QWidget* parent)
+ : KDialog(parent)
+ , m_editor(editor)
{
- //First find out if we have more than one charFormat in our selection. If
so, m_initialFormat/m_style will get initialised with the charFormat at the
cursor's position. The tabs will get informed of this.
-
- if (m_cursor->hasSelection()) {
- int begin = qMin(m_cursor->anchor(), m_cursor->position());
- int end = qMax(m_cursor->anchor(), m_cursor->position());
- QTextBlock block = m_cursor->block().document()->findBlock(begin);
- m_uniqueFormat = true;
- QTextCursor caret(*m_cursor);
- caret.setPosition(begin+1);
- m_initialFormat = caret.charFormat();
- while (block.isValid() && block.position() < end) {
- QTextBlock::iterator iter = block.begin();
- while (! iter.atEnd()) {
- QTextFragment fragment = iter.fragment();
- if (fragment.position() >= end)
- break;
- if (fragment.position() + fragment.length() <= begin) {
- ++iter;
- continue;
- }
- if (!(m_uniqueFormat = (fragment.charFormat() ==
m_initialFormat)))
- break;
- ++iter;
- }
- if (!m_uniqueFormat)
- break;
- block = block.next();
- }
- }
- else {
- m_initialFormat = cursor->charFormat();
- m_uniqueFormat = true;
- }
+ m_initialFormat = m_editor->charFormat();
setCaption(i18n("Select Font"));
setModal(true);
setButtons(Ok | Cancel | Reset | Apply);
setDefaultButton(Ok);
- m_characterGeneral = new CharacterGeneral(this, m_uniqueFormat);
+ m_characterGeneral = new CharacterGeneral(this);
m_characterGeneral->hideStyleName(true);
setMainWidget(m_characterGeneral);
@@ -98,11 +68,13 @@ void FontDia::initTabs()
void FontDia::slotApply()
{
- emit startMacro(i18n("Font"));
+ m_editor->beginEditBlock(i18n("Font"));
KoCharacterStyle chosenStyle;
m_characterGeneral->save(&chosenStyle);
- chosenStyle.applyStyle(m_cursor);
- emit stopMacro();
+ QTextCharFormat cformat;
+ chosenStyle.applyStyle(cformat);
+ m_editor->mergeAutoStyle(cformat);
+ m_editor->endEditBlock();
}
void FontDia::slotOk()
diff --git a/plugins/textshape/dialogs/FontDia.h
b/plugins/textshape/dialogs/FontDia.h
index 7f8e6e0..9ae9567 100644
--- a/plugins/textshape/dialogs/FontDia.h
+++ b/plugins/textshape/dialogs/FontDia.h
@@ -26,8 +26,7 @@
#include <kdialog.h>
#include <KoCharacterStyle.h>
-#include <QTextCursor>
-
+class KoTextEditor;
class CharacterGeneral;
@@ -35,13 +34,7 @@ class FontDia : public KDialog
{
Q_OBJECT
public:
- explicit FontDia(QTextCursor *cursor, QWidget* parent = 0);
-
-signals:
- /// emitted when a series of commands is started that together need to
become 1 undo action.
- void startMacro(const QString &name);
- /// emitted when a series of commands has ended that together should be 1
undo action.
- void stopMacro();
+ explicit FontDia(KoTextEditor *cursor, QWidget* parent = 0);
protected slots:
void slotReset();
@@ -53,7 +46,7 @@ private:
CharacterGeneral *m_characterGeneral;
- QTextCursor* m_cursor;
+ KoTextEditor *m_editor;
QTextCharFormat m_initialFormat;
bool m_uniqueFormat;
diff --git a/plugins/textshape/dialogs/ParagraphSettingsDialog.cpp
b/plugins/textshape/dialogs/ParagraphSettingsDialog.cpp
index 85ca90b..befcaca 100644
--- a/plugins/textshape/dialogs/ParagraphSettingsDialog.cpp
+++ b/plugins/textshape/dialogs/ParagraphSettingsDialog.cpp
@@ -30,10 +30,10 @@
#include <QTextBlock>
#include <QTimer>
-ParagraphSettingsDialog::ParagraphSettingsDialog(TextTool *tool, QTextCursor
*cursor, QWidget* parent)
+ParagraphSettingsDialog::ParagraphSettingsDialog(TextTool *tool, KoTextEditor
*editor, QWidget* parent)
: KDialog(parent),
m_tool(tool),
- m_cursor(cursor)
+ m_editor(editor)
{
setCaption(i18n("Paragraph Format"));
setModal(true);
@@ -55,8 +55,8 @@ ParagraphSettingsDialog::~ParagraphSettingsDialog()
void ParagraphSettingsDialog::initTabs()
{
- KoParagraphStyle *style = KoParagraphStyle::fromBlock(m_cursor->block());
- m_paragraphGeneral->setStyle(style, KoList::level(m_cursor->block()));
+ KoParagraphStyle *style = KoParagraphStyle::fromBlock(m_editor->block());
+ m_paragraphGeneral->setStyle(style, KoList::level(m_editor->block()));
}
void ParagraphSettingsDialog::slotOk()
@@ -67,23 +67,26 @@ void ParagraphSettingsDialog::slotOk()
void ParagraphSettingsDialog::slotApply()
{
- emit startMacro(i18n("Paragraph Settings"));
+ m_editor->beginEditBlock(i18n("Paragraph Settings"));
KoParagraphStyle chosenStyle;
m_paragraphGeneral->save(&chosenStyle);
+ QTextCharFormat cformat;
QTextBlockFormat format;
+ chosenStyle.KoCharacterStyle::applyStyle(cformat);
chosenStyle.applyStyle(format);
- m_cursor->mergeBlockFormat(format);
+
+ m_editor->mergeAutoStyle(cformat, format);
if (chosenStyle.listStyle()) {
KoTextEditor::ChangeListFlags flags(KoTextEditor::AutoListStyle |
KoTextEditor::DontUnsetIfSame);
m_tool->textEditor()->setListProperties(chosenStyle.listStyle()-
>levelProperties(chosenStyle.listStyle()->listLevels().first()),
flags);
} else {
- QTextList *list = m_cursor->block().textList();
+ QTextList *list = m_editor->block().textList();
if (list) { // then remove it.
- list->remove(m_cursor->block());
+ list->remove(m_editor->block());
}
}
- emit stopMacro();
+ m_editor->endEditBlock();
}
void ParagraphSettingsDialog::setUnit(const KoUnit &unit)
diff --git a/plugins/textshape/dialogs/ParagraphSettingsDialog.h
b/plugins/textshape/dialogs/ParagraphSettingsDialog.h
index 7224692..c54d8e0 100644
--- a/plugins/textshape/dialogs/ParagraphSettingsDialog.h
+++ b/plugins/textshape/dialogs/ParagraphSettingsDialog.h
@@ -20,9 +20,9 @@
#define PARAGRAPHSETTINGSDIALOG_H
#include <KoUnit.h>
+#include <KoTextEditor.h>
#include <KDialog>
-#include <QTextCursor>
class TextTool;
class ParagraphGeneral;
@@ -32,17 +32,11 @@ class ParagraphSettingsDialog : public KDialog
{
Q_OBJECT
public:
- explicit ParagraphSettingsDialog(TextTool *tool, QTextCursor *cursor,
QWidget* parent = 0);
+ explicit ParagraphSettingsDialog(TextTool *tool, KoTextEditor *editor,
QWidget* parent = 0);
~ParagraphSettingsDialog();
void setUnit(const KoUnit &unit);
-signals:
- /// emitted when a series of commands is started that together need to
become 1 undo action.
- void startMacro(const QString &name);
- /// emitted when a series of commands has ended that together should be 1
undo action.
- void stopMacro();
-
protected slots:
void slotApply();
void slotOk();
@@ -52,7 +46,7 @@ private:
ParagraphGeneral *m_paragraphGeneral;
TextTool *m_tool;
- QTextCursor *m_cursor;
+ KoTextEditor *m_editor;
bool m_uniqueFormat;
};
-------------------------------------------------------
More information about the calligra-devel
mailing list