Mercurial > octave
diff libgui/languages/build_ts/octave-qsci/qscilexer.cpp @ 31537:5ceb4bfcdb0f stable
add tools and files for updating the gui's language files for translation
* libgui/languages/build_ts/README.md: readme for updating language files
* libgui/languages/build_ts/octave-qsci: QScintilla source files for
languages without translation provided by QScintilla
* libgui/languages/build_ts/octave-qt: Qt source files for languages
without translation provided by Qt
author | Torsten Lilge <ttl-octave@mailbox.org> |
---|---|
date | Thu, 24 Nov 2022 06:48:25 +0100 |
parents | |
children | dd5ece3664ed |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgui/languages/build_ts/octave-qsci/qscilexer.cpp Thu Nov 24 06:48:25 2022 +0100 @@ -0,0 +1,731 @@ +// This module implements the QsciLexer class. +// +// Copyright (c) 2019 Riverbank Computing Limited <info@riverbankcomputing.com> +// +// This file is part of QScintilla. +// +// This file may be used under the terms of the GNU General Public License +// version 3.0 as published by the Free Software Foundation and appearing in +// the file LICENSE included in the packaging of this file. Please review the +// following information to ensure the GNU General Public License version 3.0 +// requirements will be met: http://www.gnu.org/copyleft/gpl.html. +// +// If you do not wish to use this file under the terms of the GPL version 3.0 +// then you may purchase a commercial license. For more information contact +// info@riverbankcomputing.com. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +#include "Qsci/qscilexer.h" + +#include <qapplication.h> +#include <qcolor.h> +#include <qfont.h> +#include <qsettings.h> + +#include "Qsci/qsciapis.h" +#include "Qsci/qsciscintilla.h" +#include "Qsci/qsciscintillabase.h" + + +// The ctor. +QsciLexer::QsciLexer(QObject *parent) + : QObject(parent), + autoIndStyle(-1), apiSet(0), attached_editor(0) +{ +#if defined(Q_OS_WIN) + defFont = QFont("Verdana", 10); +#elif defined(Q_OS_MAC) + defFont = QFont("Menlo", 12); +#else + defFont = QFont("Bitstream Vera Sans", 9); +#endif + + // Set the default fore and background colours. + QPalette pal = QApplication::palette(); + defColor = pal.text().color(); + defPaper = pal.base().color(); + + // Putting this on the heap means we can keep the style getters const. + style_map = new StyleDataMap; + style_map->style_data_set = false; +} + + +// The dtor. +QsciLexer::~QsciLexer() +{ + delete style_map; +} + + +// Set the attached editor. +void QsciLexer::setEditor(QsciScintilla *editor) +{ + attached_editor = editor; +} + + +// Return the lexer name. +const char *QsciLexer::lexer() const +{ + return 0; +} + + +// Return the lexer identifier. +int QsciLexer::lexerId() const +{ + return QsciScintillaBase::SCLEX_CONTAINER; +} + + +// Return the number of style bits needed by the lexer. +int QsciLexer::styleBitsNeeded() const +{ + return 8; +} + + +// Make sure the style defaults have been set. +void QsciLexer::setStyleDefaults() const +{ + if (!style_map->style_data_set) + { + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) + if (!description(i).isEmpty()) + styleData(i); + + style_map->style_data_set = true; + } +} + + +// Return a reference to a style's data, setting up the defaults if needed. +QsciLexer::StyleData &QsciLexer::styleData(int style) const +{ + StyleData &sd = style_map->style_data[style]; + + // See if this is a new style by checking if the colour is valid. + if (!sd.color.isValid()) + { + sd.color = defaultColor(style); + sd.paper = defaultPaper(style); + sd.font = defaultFont(style); + sd.eol_fill = defaultEolFill(style); + } + + return sd; +} + + +// Set the APIs associated with the lexer. +void QsciLexer::setAPIs(QsciAbstractAPIs *apis) +{ + apiSet = apis; +} + + +// Return a pointer to the current APIs if there are any. +QsciAbstractAPIs *QsciLexer::apis() const +{ + return apiSet; +} + + +// Default implementation to return the set of fill up characters that can end +// auto-completion. +const char *QsciLexer::autoCompletionFillups() const +{ + return "("; +} + + +// Default implementation to return the view used for indentation guides. +int QsciLexer::indentationGuideView() const +{ + return QsciScintillaBase::SC_IV_LOOKBOTH; +} + + +// Default implementation to return the list of character sequences that can +// separate auto-completion words. +QStringList QsciLexer::autoCompletionWordSeparators() const +{ + return QStringList(); +} + + +// Default implementation to return the list of keywords that can start a +// block. +const char *QsciLexer::blockStartKeyword(int *) const +{ + return 0; +} + + +// Default implementation to return the list of characters that can start a +// block. +const char *QsciLexer::blockStart(int *) const +{ + return 0; +} + + +// Default implementation to return the list of characters that can end a +// block. +const char *QsciLexer::blockEnd(int *) const +{ + return 0; +} + + +// Default implementation to return the style used for braces. +int QsciLexer::braceStyle() const +{ + return -1; +} + + +// Default implementation to return the number of lines to look back when +// auto-indenting. +int QsciLexer::blockLookback() const +{ + return 20; +} + + +// Default implementation to return the case sensitivity of the language. +bool QsciLexer::caseSensitive() const +{ + return true; +} + + +// Default implementation to return the characters that make up a word. +const char *QsciLexer::wordCharacters() const +{ + return 0; +} + + +// Default implementation to return the style used for whitespace. +int QsciLexer::defaultStyle() const +{ + return 0; +} + + +// Returns the foreground colour of the text for a style. +QColor QsciLexer::color(int style) const +{ + return styleData(style).color; +} + + +// Returns the background colour of the text for a style. +QColor QsciLexer::paper(int style) const +{ + return styleData(style).paper; +} + + +// Returns the font for a style. +QFont QsciLexer::font(int style) const +{ + return styleData(style).font; +} + + +// Returns the end-of-line fill for a style. +bool QsciLexer::eolFill(int style) const +{ + return styleData(style).eol_fill; +} + + +// Returns the set of keywords. +const char *QsciLexer::keywords(int) const +{ + return 0; +} + + +// Returns the default EOL fill for a style. +bool QsciLexer::defaultEolFill(int) const +{ + return false; +} + + +// Returns the default font for a style. +QFont QsciLexer::defaultFont(int) const +{ + return defaultFont(); +} + + +// Returns the default font. +QFont QsciLexer::defaultFont() const +{ + return defFont; +} + + +// Sets the default font. +void QsciLexer::setDefaultFont(const QFont &f) +{ + defFont = f; +} + + +// Returns the default text colour for a style. +QColor QsciLexer::defaultColor(int) const +{ + return defaultColor(); +} + + +// Returns the default text colour. +QColor QsciLexer::defaultColor() const +{ + return defColor; +} + + +// Sets the default text colour. +void QsciLexer::setDefaultColor(const QColor &c) +{ + defColor = c; +} + + +// Returns the default paper colour for a styles. +QColor QsciLexer::defaultPaper(int) const +{ + return defaultPaper(); +} + + +// Returns the default paper colour. +QColor QsciLexer::defaultPaper() const +{ + return defPaper; +} + + +// Sets the default paper colour. +void QsciLexer::setDefaultPaper(const QColor &c) +{ + defPaper = c; + + // Normally the default values are only intended to provide defaults when a + // lexer is first setup because once a style has been referenced then a + // copy of the default is made. However the default paper is a special + // case because there is no other way to set the background colour used + // where there is no text. Therefore we also actively set it. + setPaper(c, QsciScintillaBase::STYLE_DEFAULT); +} + + +// Read properties from the settings. +bool QsciLexer::readProperties(QSettings &,const QString &) +{ + return true; +} + + +// Refresh all properties. +void QsciLexer::refreshProperties() +{ +} + + +// Write properties to the settings. +bool QsciLexer::writeProperties(QSettings &,const QString &) const +{ + return true; +} + + +// Restore the user settings. +bool QsciLexer::readSettings(QSettings &qs,const char *prefix) +{ + bool ok, flag, rc = true; + int num; + QString key, full_key; + QStringList fdesc; + + setStyleDefaults(); + + // Read the styles. + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) + { + // Ignore invalid styles. + if (description(i).isEmpty()) + continue; + + key.sprintf("%s/%s/style%d/",prefix,language(),i); + + // Read the foreground colour. + full_key = key + "color"; + + ok = qs.contains(full_key); + num = qs.value(full_key).toInt(); + + if (ok) + setColor(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i); + else + rc = false; + + // Read the end-of-line fill. + full_key = key + "eolfill"; + + ok = qs.contains(full_key); + flag = qs.value(full_key, false).toBool(); + + if (ok) + setEolFill(flag, i); + else + rc = false; + + // Read the font. First try the deprecated format that uses an integer + // point size. + full_key = key + "font"; + + ok = qs.contains(full_key); + fdesc = qs.value(full_key).toStringList(); + + if (ok && fdesc.count() == 5) + { + QFont 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; + + // Now try the newer font format that uses a floating point point size. + // It is not an error if it doesn't exist. + full_key = key + "font2"; + + ok = qs.contains(full_key); + fdesc = qs.value(full_key).toStringList(); + + if (ok) + { + // Allow for future versions with more fields. + if (fdesc.count() >= 5) + { + QFont f; + + f.setFamily(fdesc[0]); + f.setPointSizeF(fdesc[1].toDouble()); + f.setBold(fdesc[2].toInt()); + f.setItalic(fdesc[3].toInt()); + f.setUnderline(fdesc[4].toInt()); + + setFont(f, i); + } + else + { + rc = false; + } + } + + // Read the background colour. + full_key = key + "paper"; + + ok = qs.contains(full_key); + num = qs.value(full_key).toInt(); + + if (ok) + setPaper(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff), i); + else + rc = false; + } + + // Read the properties. + key.sprintf("%s/%s/properties/",prefix,language()); + + if (!readProperties(qs,key)) + rc = false; + + refreshProperties(); + + // Read the rest. + key.sprintf("%s/%s/",prefix,language()); + + // Read the default foreground colour. + full_key = key + "defaultcolor"; + + ok = qs.contains(full_key); + num = qs.value(full_key).toInt(); + + if (ok) + setDefaultColor(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff)); + else + rc = false; + + // Read the default background colour. + full_key = key + "defaultpaper"; + + ok = qs.contains(full_key); + num = qs.value(full_key).toInt(); + + if (ok) + setDefaultPaper(QColor((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff)); + else + rc = false; + + // Read the default font. First try the deprecated format that uses an + // integer point size. + full_key = key + "defaultfont"; + + ok = qs.contains(full_key); + fdesc = qs.value(full_key).toStringList(); + + if (ok && fdesc.count() == 5) + { + QFont 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()); + + setDefaultFont(f); + } + else + rc = false; + + // Now try the newer font format that uses a floating point point size. It + // is not an error if it doesn't exist. + full_key = key + "defaultfont2"; + + ok = qs.contains(full_key); + fdesc = qs.value(full_key).toStringList(); + + if (ok) + { + // Allow for future versions with more fields. + if (fdesc.count() >= 5) + { + QFont f; + + f.setFamily(fdesc[0]); + f.setPointSizeF(fdesc[1].toDouble()); + f.setBold(fdesc[2].toInt()); + f.setItalic(fdesc[3].toInt()); + f.setUnderline(fdesc[4].toInt()); + + setDefaultFont(f); + } + else + { + rc = false; + } + } + + full_key = key + "autoindentstyle"; + + ok = qs.contains(full_key); + num = qs.value(full_key).toInt(); + + if (ok) + setAutoIndentStyle(num); + else + rc = false; + + return rc; +} + + +// Save the user settings. +bool QsciLexer::writeSettings(QSettings &qs,const char *prefix) const +{ + bool rc = true; + QString key, fmt("%1"); + int num; + QStringList fdesc; + + setStyleDefaults(); + + // Write the styles. + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) + { + // Ignore invalid styles. + if (description(i).isEmpty()) + continue; + + QColor c; + + key.sprintf("%s/%s/style%d/",prefix,language(),i); + + // Write the foreground colour. + c = color(i); + num = (c.red() << 16) | (c.green() << 8) | c.blue(); + + qs.setValue(key + "color", num); + + // Write the end-of-line fill. + qs.setValue(key + "eolfill", eolFill(i)); + + // Write the font using the deprecated format. + QFont f = font(i); + + fdesc.clear(); + 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()); + + qs.setValue(key + "font", fdesc); + + // Write the font using the newer format. + fdesc[1] = fmt.arg(f.pointSizeF()); + + qs.setValue(key + "font2", fdesc); + + // Write the background colour. + c = paper(i); + num = (c.red() << 16) | (c.green() << 8) | c.blue(); + + qs.setValue(key + "paper", num); + } + + // Write the properties. + key.sprintf("%s/%s/properties/",prefix,language()); + + if (!writeProperties(qs,key)) + rc = false; + + // Write the rest. + key.sprintf("%s/%s/",prefix,language()); + + // Write the default foreground colour. + num = (defColor.red() << 16) | (defColor.green() << 8) | defColor.blue(); + + qs.setValue(key + "defaultcolor", num); + + // Write the default background colour. + num = (defPaper.red() << 16) | (defPaper.green() << 8) | defPaper.blue(); + + qs.setValue(key + "defaultpaper", num); + + // Write the default font using the deprecated format. + fdesc.clear(); + fdesc += defFont.family(); + fdesc += fmt.arg(defFont.pointSize()); + + // The casts are for Borland. + fdesc += fmt.arg((int)defFont.bold()); + fdesc += fmt.arg((int)defFont.italic()); + fdesc += fmt.arg((int)defFont.underline()); + + qs.setValue(key + "defaultfont", fdesc); + + // Write the font using the newer format. + fdesc[1] = fmt.arg(defFont.pointSizeF()); + + qs.setValue(key + "defaultfont2", fdesc); + + qs.setValue(key + "autoindentstyle", autoIndStyle); + + return rc; +} + + +// Return the auto-indentation style. +int QsciLexer::autoIndentStyle() +{ + // We can't do this in the ctor because we want the virtuals to work. + if (autoIndStyle < 0) + autoIndStyle = (blockStartKeyword() || blockStart() || blockEnd()) ? + 0 : QsciScintilla::AiMaintain; + + return autoIndStyle; +} + + +// Set the auto-indentation style. +void QsciLexer::setAutoIndentStyle(int autoindentstyle) +{ + autoIndStyle = autoindentstyle; +} + + +// Set the foreground colour for a style. +void QsciLexer::setColor(const QColor &c, int style) +{ + if (style >= 0) + { + styleData(style).color = c; + emit colorChanged(c, style); + } + else + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) + if (!description(i).isEmpty()) + setColor(c, i); +} + + +// Set the end-of-line fill for a style. +void QsciLexer::setEolFill(bool eolfill, int style) +{ + if (style >= 0) + { + styleData(style).eol_fill = eolfill; + emit eolFillChanged(eolfill, style); + } + else + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) + if (!description(i).isEmpty()) + setEolFill(eolfill, i); +} + + +// Set the font for a style. +void QsciLexer::setFont(const QFont &f, int style) +{ + if (style >= 0) + { + styleData(style).font = f; + emit fontChanged(f, style); + } + else + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) + if (!description(i).isEmpty()) + setFont(f, i); +} + + +// Set the background colour for a style. +void QsciLexer::setPaper(const QColor &c, int style) +{ + if (style >= 0) + { + styleData(style).paper = c; + emit paperChanged(c, style); + } + else + { + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) + if (!description(i).isEmpty()) + setPaper(c, i); + + emit paperChanged(c, QsciScintillaBase::STYLE_DEFAULT); + } +}