From 7167ce41b61d2ba2cdb526777a4233eb84a3b66a Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Sat, 6 Dec 2014 17:33:25 -0500 Subject: Imported Upstream version 2.99.6 --- SQLiteStudio3/guiSQLiteStudio/uiscriptingedit.cpp | 75 +++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 SQLiteStudio3/guiSQLiteStudio/uiscriptingedit.cpp (limited to 'SQLiteStudio3/guiSQLiteStudio/uiscriptingedit.cpp') diff --git a/SQLiteStudio3/guiSQLiteStudio/uiscriptingedit.cpp b/SQLiteStudio3/guiSQLiteStudio/uiscriptingedit.cpp new file mode 100644 index 0000000..329af53 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/uiscriptingedit.cpp @@ -0,0 +1,75 @@ +#include "uiscriptingedit.h" +#include "common/unused.h" +#include "services/pluginmanager.h" +#include "syntaxhighlighterplugin.h" +#include "pluginservicebase.h" +#include +#include +#include +#include + +UiScriptingEdit::UiScriptingEdit() +{ +} + +const char* UiScriptingEdit::getPropertyName() const +{ + return "scriptingEdit"; +} + +void UiScriptingEdit::handle(QWidget* widget, const QVariant& value) +{ + if (!value.toBool()) + return; + + new EditUpdater(widget); // widget becomes its parent and owns it +} + +UiScriptingEdit::EditUpdater::EditUpdater(QWidget* widget) : + QObject(widget), watchedWidget(widget) +{ + widget->installEventFilter(this); +} + +bool UiScriptingEdit::EditUpdater::eventFilter(QObject* obj, QEvent* e) +{ + UNUSED(obj); + if (changingHighlighter) + return false; + + if (e->type() != QEvent::DynamicPropertyChange) + return false; + + if (dynamic_cast(e)->propertyName() != PluginServiceBase::LANG_PROPERTY_NAME) + return false; + + QVariant prop = watchedWidget->property(PluginServiceBase::LANG_PROPERTY_NAME); + installNewHighlighter(prop); + + return false; +} + +void UiScriptingEdit::EditUpdater::installNewHighlighter(const QVariant& prop) +{ + QString lang = prop.toString(); + if (lang == currentLang) + return; + + // When highlighter is deleted, it causes textChanged() signal and so this method is called recurrently. + // To avoid inifinite recursion, the changingHighlighter is used to ignore property changes during deletion + // of the highlighter. + changingHighlighter = true; + safe_delete(currentHighlighter); + currentLang = QString(); + changingHighlighter = false; + + for (SyntaxHighlighterPlugin* plugin : PLUGINS->getLoadedPlugins()) + { + if (plugin->getLanguageName() != lang) + continue; + + currentHighlighter = plugin->createSyntaxHighlighter(watchedWidget); + currentLang = lang; + break; + } +} -- cgit v1.2.3