diff options
Diffstat (limited to 'src/UiGuiHighlighter.cpp')
| -rw-r--r-- | src/UiGuiHighlighter.cpp | 458 | 
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"  | 
