[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/plugins/textshape
From:       Thomas Zander <zander () kde ! org>
Date:       2010-01-24 11:38:14
Message-ID: 1264333094.075502.1390.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1079499 by zander:

Fix design of texteditor plugins

The text-editor plugins should have one instance per document
instead of what it had before, one instance per tool (which equals view,
roughly). And this caused loads of crashes ;)

 M  +1 -0      CMakeLists.txt  
 A             TextEditingPluginContainer.cpp   [License: LGPL (v2+)]
 A             TextEditingPluginContainer.h   [License: LGPL (v2+)]
 M  +41 -45    TextTool.cpp  
 M  +3 -3      TextTool.h  
 M  +1 -0      tests/CMakeLists.txt  


--- trunk/koffice/plugins/textshape/CMakeLists.txt #1079498:1079499
@@ -17,6 +17,7 @@
     TextShape.cpp
     TextShapeFactory.cpp
     TextTool.cpp
+    TextEditingPluginContainer.cpp
     TextToolFactory.cpp
     Layout.cpp
     ListItemsHelper.cpp
--- trunk/koffice/plugins/textshape/TextTool.cpp #1079498:1079499
@@ -22,6 +22,7 @@
  */
 
 #include "TextTool.h"
+#include "TextEditingPluginContainer.h"
 #include "dialogs/SimpleStyleWidget.h"
 #include "dialogs/StylesWidget.h"
 #include "dialogs/ParagraphSettingsDialog.h"
@@ -96,7 +97,6 @@
         m_prevCursorPosition(-1),
         m_caretTimer(this),
         m_caretTimerState(true),
-        m_spellcheckPlugin(0),
         m_currentCommand(0),
         m_currentCommandHasChildren(false),
         m_specialCharacterDocker(0),
@@ -310,35 +310,50 @@
     action->setToolTip(i18n("Change text attributes to their default values"));
     connect(action, SIGNAL(triggered()), this, SLOT(setDefaultFormat()));
 
-    foreach (const QString &key, KoTextEditingRegistry::instance()->keys()) {
-        KoTextEditingFactory *factory =  \
                KoTextEditingRegistry::instance()->value(key);
-        Q_ASSERT(factory);
-        if (m_textEditingPlugins.contains(factory->id())) {
-            kWarning(32500) << "Duplicate id for textEditingPlugin, ignoring one! (" \
                << factory->id() << ")";
-            continue;
-        }
-        QString factoryId = factory->id();
-        KoTextEditingPlugin *plugin = factory->create();
-        if (factoryId == "spellcheck") {
-            kDebug(32500) << "KOffice SpellCheck plugin found";
-            m_spellcheckPlugin = plugin;
-            connect(canvas->resourceManager(), SIGNAL(resourceChanged(int, const \
                QVariant &)),
-                    plugin, SLOT(resourceChanged(int, const QVariant &)));
-        }
-        m_textEditingPlugins.insert(factory->id(), plugin);
+    m_textEditingPlugins = canvas->resourceManager()->
+        resource(TextEditingPluginContainer::ResourceId).value<TextEditingPluginContainer*>();
 +    if (m_textEditingPlugins == 0) {
+        m_textEditingPlugins = new \
TextEditingPluginContainer(canvas->resourceManager()); +        QVariant variant;
+        variant.setValue(m_textEditingPlugins);
+        canvas->resourceManager()->setResource(TextEditingPluginContainer::ResourceId, \
variant);  }
 
-    foreach (KoTextEditingPlugin* plugin, m_textEditingPlugins) {
-        connect(plugin, SIGNAL(startMacro(const QString &)), this, \
SLOT(startMacro(const QString &))); +    foreach (KoTextEditingPlugin* plugin, \
m_textEditingPlugins->values()) { +        connect(plugin, SIGNAL(startMacro(const \
QString &)), +                this, SLOT(startMacro(const QString &)));
         connect(plugin, SIGNAL(stopMacro()), this, SLOT(stopMacro()));
         QHash<QString, KAction*> actions = plugin->actions();
         QHash<QString, KAction*>::iterator i = actions.begin();
         while (i != actions.end()) {
             addAction(i.key(), i.value());
-            i++;
+            ++i;
         }
     }
+    if (m_textEditingPlugins->spellcheck()) {
+           connect(canvas->resourceManager(), SIGNAL(resourceChanged(int, const \
QVariant&)), +                   m_textEditingPlugins->spellcheck(), \
SLOT(resourceChanged(int, const QVariant&))); +    }
 
+    // setup the context list.
+    QSignalMapper *signalMapper = new QSignalMapper(this);
+    connect(signalMapper, SIGNAL(mapped(QString)), this, \
SLOT(startTextEditingPlugin(QString))); +    QList<QAction*> list;
+    list.append(this->action("text_default"));
+    list.append(this->action("format_font"));
+    foreach (const QString &key, KoTextEditingRegistry::instance()->keys()) {
+        KoTextEditingFactory *factory =  \
KoTextEditingRegistry::instance()->value(key); +        if (factory->showInMenu()) {
+            KAction *a = new KAction(i18n("Apply %1").arg(factory->title()), this);
+            connect(a, SIGNAL(triggered()), signalMapper, SLOT(map()));
+            signalMapper->setMapping(a, factory->id());
+            list.append(a);
+            addAction(QString("apply_%1").arg(factory->id()), a);
+        }
+    }
+    setPopupActionList(list);
+
+
     action = new KAction(i18n("Table..."), this);
     addAction("insert_table", action);
     action->setShortcut(Qt::ALT + Qt::CTRL + Qt::Key_P);
@@ -395,24 +410,6 @@
     connect(action, SIGNAL(triggered()), this, SLOT(debugTextStyles()));
 #endif
 
-    // setup the context list.
-    QSignalMapper *signalMapper = new QSignalMapper(this);
-    connect(signalMapper, SIGNAL(mapped(QString)), this, \
                SLOT(startTextEditingPlugin(QString)));
-    QList<QAction*> list;
-    list.append(this->action("text_default"));
-    list.append(this->action("format_font"));
-    foreach (const QString & key, KoTextEditingRegistry::instance()->keys()) {
-        KoTextEditingFactory *factory =  \
                KoTextEditingRegistry::instance()->value(key);
-        if (factory->showInMenu()) {
-            KAction *a = new KAction(i18n("Apply %1").arg(factory->title()), this);
-            connect(a, SIGNAL(triggered()), signalMapper, SLOT(map()));
-            signalMapper->setMapping(a, factory->id());
-            list.append(a);
-            addAction(QString("apply_%1").arg(factory->id()), a);
-        }
-    }
-    setPopupActionList(list);
-
     connect(canvas->shapeManager()->selection(), SIGNAL(selectionChanged()), this, \
SLOT(shapeAddedToCanvas()));  
     m_caretTimer.setInterval(500);
@@ -438,10 +435,10 @@
     m_prevCursorPosition(-1),
     m_caretTimer(this),
     m_caretTimerState(true),
-    m_spellcheckPlugin(0),
     m_currentCommand(0),
     m_currentCommandHasChildren(false),
     m_specialCharacterDocker(0),
+    m_textEditingPlugins(0),
     m_changeTipTimer(this),
     m_changeTipCursorPos(0)
 {
@@ -451,7 +448,6 @@
 
 TextTool::~TextTool()
 {
-    qDeleteAll(m_textEditingPlugins);
 }
 
 void TextTool::showChangeTip()
@@ -706,8 +702,8 @@
         }
     }
     m_textEditor->updateDefaultTextDirection(m_textShapeData->pageDirection());
-    if (m_spellcheckPlugin)
-        m_spellcheckPlugin->checkSection(m_textShapeData->document(), 0, 0);
+    if (m_textEditingPlugins->spellcheck())
+        m_textEditingPlugins->spellcheck()->checkSection(m_textShapeData->document(), \
0, 0);  }
 
 void TextTool::updateSelectionHandler()
@@ -1763,7 +1759,7 @@
 
 void TextTool::startTextEditingPlugin(const QString &pluginId)
 {
-    KoTextEditingPlugin *plugin = m_textEditingPlugins.value(pluginId);
+    KoTextEditingPlugin *plugin = m_textEditingPlugins->plugin(pluginId);
     if (plugin) {
         if (m_textEditor->hasSelection()) {
             int from = m_textEditor->position();
@@ -1891,13 +1887,13 @@
 
 void TextTool::finishedWord()
 {
-    foreach (KoTextEditingPlugin* plugin, m_textEditingPlugins)
+    foreach (KoTextEditingPlugin* plugin, m_textEditingPlugins->values())
         plugin->finishedWord(m_textShapeData->document(), m_prevCursorPosition);
 }
 
 void TextTool::finishedParagraph()
 {
-    foreach (KoTextEditingPlugin* plugin, m_textEditingPlugins)
+    foreach (KoTextEditingPlugin* plugin, m_textEditingPlugins->values())
         plugin->finishedParagraph(m_textShapeData->document(), \
m_prevCursorPosition);  }
 
--- trunk/koffice/plugins/textshape/TextTool.h #1079498:1079499
@@ -33,6 +33,7 @@
 #include <QTimer>
 #include <QPointer>
 
+class TextEditingPluginContainer;
 class InsertCharacter;
 class KoChangeTracker;
 class KoCharacterStyle;
@@ -304,9 +305,6 @@
     KoColorPopupAction *m_actionFormatTextColor;
     KoColorPopupAction *m_actionFormatBackgroundColor;
 
-    QHash<QString, KoTextEditingPlugin*> m_textEditingPlugins;
-    KoTextEditingPlugin *m_spellcheckPlugin;
-
     QUndoCommand *m_currentCommand; //this command will be the direct parent of \
undoCommands generated as the result of QTextDocument changes  
     bool m_currentCommandHasChildren;
@@ -321,6 +319,8 @@
 
     InsertCharacter *m_specialCharacterDocker;
 
+    TextEditingPluginContainer *m_textEditingPlugins;
+
     bool m_textTyping;
     bool m_textDeleting;
 
--- trunk/koffice/plugins/textshape/tests/CMakeLists.txt #1079498:1079499
@@ -39,6 +39,7 @@
     ../commands/AcceptChangeCommand.cpp
     ../commands/RejectChangeCommand.cpp
     ../TextTool.cpp
+    ../TextEditingPluginContainer.cpp
     ../ChangeTracker.cpp
     ../dialogs/FontDia.cpp
     ../dialogs/InsertCharacter.cpp


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic