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