summaryrefslogtreecommitdiffstats
path: root/src/UiGuiHighlighter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/UiGuiHighlighter.cpp')
-rw-r--r--src/UiGuiHighlighter.cpp458
1 files changed, 458 insertions, 0 deletions
diff --git a/src/UiGuiHighlighter.cpp b/src/UiGuiHighlighter.cpp
new file mode 100644
index 0000000..f23100b
--- /dev/null
+++ b/src/UiGuiHighlighter.cpp
@@ -0,0 +1,458 @@
+/***************************************************************************
+ * Copyright (C) 2006-2012 by Thomas Schweitzer *
+ * thomas-schweitzer(at)arcor.de *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License version 2.0 as *
+ * published by the Free Software Foundation. *
+ * *
+ * This program 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 General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program in the file LICENSE.GPL; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "UiGuiHighlighter.h"
+
+#include "SettingsPaths.h"
+
+#include <tqaction.h>
+#include <tqsettings.h>
+
+#include <tqextscintilla.h>
+#include <tqextscintillalexer.h>
+#include <tqextscintillalexerbash.h>
+#include <tqextscintillalexerbatch.h>
+#include <tqextscintillalexercpp.h>
+#include <tqextscintillalexercsharp.h>
+#include <tqextscintillalexercss.h>
+#include <tqextscintillalexerdiff.h>
+#include <tqextscintillalexerhtml.h>
+#include <tqextscintillalexeridl.h>
+#include <tqextscintillalexerjava.h>
+#include <tqextscintillalexerjavascript.h>
+#include <tqextscintillalexerlua.h>
+#include <tqextscintillalexermakefile.h>
+#include <tqextscintillalexerperl.h>
+#include <tqextscintillalexerpov.h>
+#include <tqextscintillalexerproperties.h>
+#include <tqextscintillalexerpython.h>
+#include <tqextscintillalexerruby.h>
+#include <tqextscintillalexersql.h>
+#include <tqextscintillalexertex.h>
+
+/*
+ \class UiGuiHighlighter
+ \ingroup grp_EditorComponent
+ \brief UiGuiHighlighter used for selecting the syntax highlighter/lexer for the TQextScintilla component.
+*/
+
+/*
+ \brief The constructor initializes some regular expressions and keywords to identify cpp tokens
+ */
+UiGuiHighlighter::UiGuiHighlighter(TQextScintilla *parent) :
+ TQObject((TQObject*)parent)
+{
+ m_qsciEditorParent = parent;
+
+ // Create the highlighter m_settings object from the uiguisyntaxhighlightconfigrc file.
+ m_settings = new TQSettings(TQSettings::Ini);
+ // The next lines make user the settings are always stored in
+ // $HOME/.universalindentgui/uiguisyntaxhighlightconfigrc
+ m_settings->insertSearchPath(TQSettings::Unix, SettingsPaths::getSettingsPath());
+ m_settings->setPath("UniversalIndentGUI", "UniversalIndentGUI", TQSettings::User);
+
+ m_highlightingIsOn = true;
+
+ m_fileExtensions["Bash"] = TQStringList() << "sh";
+ m_fileExtensions["Batch"] = TQStringList() << "bat";
+ m_fileExtensions["C++"] = TQStringList() << "c" << "h" << "cpp" << "hpp" << "cxx"<< "hxx";
+ m_fileExtensions["C#"] = TQStringList() << "cs";
+ m_fileExtensions["CSS"] = TQStringList() << "css";
+ m_fileExtensions["Diff"] = TQStringList() << "diff";
+ m_fileExtensions["HTML"] = TQStringList() << "html" << "htm";
+ m_fileExtensions["IDL"] = TQStringList() << "idl";
+ m_fileExtensions["Java"] = TQStringList() << "java";
+ m_fileExtensions["JavaScript"] = TQStringList() << "js";
+ m_fileExtensions["LUA"] = TQStringList() << "lua";
+ m_fileExtensions["Makefile"] = TQStringList() << "makefile";
+ m_fileExtensions["Perl"] = TQStringList() << "perl" << "pl" << "pm";
+ m_fileExtensions["PHP"] = TQStringList() << "php";
+ m_fileExtensions["POV"] = TQStringList() << "pov";
+ m_fileExtensions["Ini"] = TQStringList() << "ini";
+ m_fileExtensions["Python"] = TQStringList() << "py";
+ m_fileExtensions["Ruby"] = TQStringList() << "rub" << "rb";
+ m_fileExtensions["SQL"] = TQStringList() << "sql";
+ m_fileExtensions["TeX"] = TQStringList() << "tex";
+ m_fileExtensions["XML"] = TQStringList() << "xml";
+
+ m_lexer = NULL;
+
+ // Set default highlighter to C++ highlighter.
+ setLexer("cpp");
+}
+
+UiGuiHighlighter::~UiGuiHighlighter()
+{
+ delete m_settings;
+}
+
+/*
+ \brief Returns the available highlighters as TQStringList.
+ */
+TQStringList UiGuiHighlighter::getAvailableHighlighters()
+{
+ return m_fileExtensions.keys();
+}
+
+/*
+ \brief This slot handles signals coming from selecting another syntax highlighter.
+ */
+void UiGuiHighlighter::setHighlighterByAction(TQAction *highlighterAction)
+{
+ TQString highlighterName = highlighterAction->text();
+ setLexer(m_fileExtensions[highlighterName].first());
+ // TODO: This is really no nice way. How do it better?
+ // Need to do this "text update" to update the syntax highlighting. Otherwise highlighting is
+ // wrong.
+ // TODO not available in TQScintilla 1.71
+ //--- int scrollPos = m_qsciEditorParent->verticalScrollBar()->value();
+ m_qsciEditorParent->setText(m_qsciEditorParent->text());
+ //--- m_qsciEditorParent->verticalScrollBar()->setValue(scrollPos);
+}
+
+/*
+ \brief Turns the syntax parser on.
+*/
+void UiGuiHighlighter::turnHighlightOn()
+{
+ m_highlightingIsOn = true;
+ m_qsciEditorParent->setLexer(m_lexer);
+ readCurrentSettings();
+}
+
+/*
+ \brief Turns the syntax parser off.
+*/
+void UiGuiHighlighter::turnHighlightOff()
+{
+ m_highlightingIsOn = false;
+ m_qsciEditorParent->setLexer();
+ m_qsciEditorParent->setFont(TQFont("Monospace", 10, TQFont::Normal));
+ m_qsciEditorParent->setMarginsFont(TQFont("Monospace", 10, TQFont::Normal));
+}
+
+/*
+ \brief Read the settings for the current lexer from the settings file.
+ */
+bool UiGuiHighlighter::readCurrentSettings()
+{
+ // settings are read from the uiguisyntaxhighlightconfigrc file, group <lexer name>
+ m_settings->resetGroup();
+ m_settings->beginGroup(TQString("uiguisyntaxhighlightconfig/") + m_lexer->language());
+
+ bool ok, flag, rc = true;
+ int num;
+
+ // Reset lists containing fonts and colors for each style
+ m_fontForStyles.clear();
+ m_colorForStyles.clear();
+
+ // Read the styles.
+ for (int i = 0; i < 128; ++i)
+ {
+ // Ignore invalid styles.
+ if (m_lexer->description(i).isEmpty())
+ {
+ continue;
+ }
+
+ TQString key = TQString();
+ key.sprintf("style%02d/", i);
+ key.replace("+", "p");
+
+ // Read the foreground color.
+ num = m_settings->readNumEntry(key + "color", 0, &ok);
+ if (ok)
+ {
+ setColor(TQColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i);
+ }
+ else
+ {
+ rc = false;
+ }
+
+ // Read the end-of-line fill.
+ flag = m_settings->readBoolEntry(key + "eolfill", false, &ok);
+ if (ok)
+ {
+ m_lexer->setEolFill(flag, i);
+ }
+ else
+ {
+ rc = false;
+ }
+
+ // Read the font
+ TQStringList fdesc;
+ fdesc = m_settings->readListEntry(key + "font", &ok);
+ if (ok && fdesc.count() == 5)
+ {
+ TQFont f;
+ f.setFamily(fdesc[0]);
+ f.setPointSize(fdesc[1].toInt());
+ f.setBold(fdesc[2].toInt());
+ f.setItalic(fdesc[3].toInt());
+ f.setUnderline(fdesc[4].toInt());
+ setFont(f, i);
+ }
+ else
+ {
+ rc = false;
+ }
+
+ // Read the background color.
+ num = m_settings->readNumEntry(key + "paper", 0, &ok);
+ if (ok)
+ {
+ m_lexer->setPaper(TQColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i);
+ }
+ else
+ {
+ rc = false;
+ }
+ }
+
+ // Read the properties.
+ m_lexer->refreshProperties();
+
+ return rc;
+}
+
+/*
+ \brief Write the settings for the current lexer to the settings file.
+ */
+void UiGuiHighlighter::writeCurrentSettings()
+{
+ // settings are stored in the uiguisyntaxhighlightconfigrc file, group <lexer name>
+ m_settings->resetGroup();
+ m_settings->beginGroup(TQString("uiguisyntaxhighlightconfig/") + m_lexer->language());
+
+ // Write the styles.
+ for (int i = 0; i < 128; ++i)
+ {
+ // Ignore invalid styles.
+ if (m_lexer->description(i).isEmpty())
+ {
+ continue;
+ }
+
+ int num;
+ TQColor c;
+
+ TQString key = TQString();
+ key.sprintf("style%02d/", i);
+ key.replace("+", "p");
+
+ // Write style name
+ m_settings->writeEntry(key + "", m_lexer->description(i));
+
+ // Write the foreground color.
+ if (m_colorForStyles.contains(i))
+ {
+ c = m_colorForStyles[i];
+ }
+ else
+ {
+ c = m_lexer->color(i);
+ }
+ num = (c.red() << 16) | (c.green() << 8) | c.blue();
+
+ m_settings->writeEntry(key + "color", num);
+
+ // Write the end-of-line fill.
+ m_settings->writeEntry(key + "eolfill", m_lexer->eolFill(i));
+
+ // Write the font
+ TQStringList fdesc;
+ TQString fmt("%1");
+ TQFont f;
+ if (m_fontForStyles.contains(i))
+ {
+ f = m_fontForStyles[i];
+ }
+ else
+ {
+ f = m_lexer->font(i);
+ }
+
+ fdesc += f.family();
+ fdesc += fmt.arg(f.pointSize());
+ // The casts are for Borland.
+ fdesc += fmt.arg((int)f.bold());
+ fdesc += fmt.arg((int)f.italic());
+ fdesc += fmt.arg((int)f.underline());
+
+ m_settings->writeEntry(key + "font", fdesc);
+
+ // Write the background color.
+ c = m_lexer->paper(i);
+ num = (c.red() << 16) | (c.green() << 8) | c.blue();
+
+ m_settings->writeEntry(key + "paper", num);
+ }
+}
+
+/*
+ \brief Sets the \a color for the given \a style.
+ */
+void UiGuiHighlighter::setColor(const TQColor &color, int style)
+{
+ m_colorForStyles[style] = color;
+ m_lexer->setColor(color, style);
+}
+
+/*
+ \brief Sets the \a font for the given \a style.
+ */
+void UiGuiHighlighter::setFont(const TQFont &font, int style)
+{
+ m_fontForStyles[style] = font;
+ m_lexer->setFont(font, style);
+}
+
+/*
+ \brief Sets the proper highlighter/lexer for the given file \a extension. Returns the index of the used lexer in the list.
+ */
+int UiGuiHighlighter::setLexer(TQString extension)
+{
+ int indexOfHighlighter = 0;
+ extension = extension.lower();
+
+ if (m_lexer)
+ {
+ writeCurrentSettings();
+ delete m_lexer;
+ m_lexer = nullptr;
+ }
+
+ if (extension == "cpp" || extension == "hpp" || extension == "c" || extension == "h" ||
+ extension == "cxx" || extension == "hxx")
+ {
+ m_lexer = new TQextScintillaLexerCPP();
+ }
+ else if (extension == "sh")
+ {
+ m_lexer = new TQextScintillaLexerBash();
+ }
+ else if (extension == "bat")
+ {
+ m_lexer = new TQextScintillaLexerBatch();
+ }
+ else if (extension == "cs")
+ {
+ m_lexer = new TQextScintillaLexerCSharp();
+ }
+ else if (extension == "css")
+ {
+ m_lexer = new TQextScintillaLexerCSS();
+ }
+ else if (extension == "diff")
+ {
+ m_lexer = new TQextScintillaLexerDiff();
+ }
+ else if (extension == "html" || extension == "htm")
+ {
+ m_lexer = new TQextScintillaLexerHTML();
+ }
+ else if (extension == "idl")
+ {
+ m_lexer = new TQextScintillaLexerIDL();
+ }
+ else if (extension == "java")
+ {
+ m_lexer = new TQextScintillaLexerJava();
+ }
+ else if (extension == "js")
+ {
+ m_lexer = new TQextScintillaLexerJavaScript();
+ }
+ else if (extension == "lua")
+ {
+ m_lexer = new TQextScintillaLexerLua();
+ }
+ else if (extension == "makefile")
+ {
+ m_lexer = new TQextScintillaLexerMakefile();
+ }
+ else if (extension == "perl" || extension == "pl" || extension == "pm")
+ {
+ m_lexer = new TQextScintillaLexerPerl();
+ }
+ else if (extension == "php")
+ {
+ m_lexer = new TQextScintillaLexerHTML();
+ }
+ else if (extension == "pov")
+ {
+ m_lexer = new TQextScintillaLexerPOV();
+ }
+ else if (extension == "ini")
+ {
+ m_lexer = new TQextScintillaLexerProperties();
+ }
+ else if (extension == "py")
+ {
+ m_lexer = new TQextScintillaLexerPython();
+ }
+ else if (extension == "rub" || extension == "rb")
+ {
+ m_lexer = new TQextScintillaLexerRuby();
+ }
+ else if (extension == "sql")
+ {
+ m_lexer = new TQextScintillaLexerSQL();
+ }
+ else if (extension == "tex")
+ {
+ m_lexer = new TQextScintillaLexerTeX();
+ }
+ else if (extension == "xml")
+ {
+ m_lexer = new TQextScintillaLexerHTML();
+ }
+ else
+ {
+ m_lexer = new TQextScintillaLexerCPP();
+ extension = "cpp";
+ }
+
+ // Find the index of the selected m_lexer.
+ indexOfHighlighter = 0;
+ for (const TQString &hlExtList : m_fileExtensions.keys())
+ {
+ if (m_fileExtensions[hlExtList].contains(extension))
+ {
+ break;
+ }
+ indexOfHighlighter++;
+ }
+
+ // Set the m_lexer for the TQScintilla widget.
+ if (m_highlightingIsOn)
+ {
+ m_qsciEditorParent->setLexer(m_lexer);
+ }
+
+ // Read the m_settings for the m_lexer properties from file.
+ readCurrentSettings();
+
+ return indexOfHighlighter;
+}
+
+#include "UiGuiHighlighter.moc"