eric7/Preferences/PreferencesLexer.py

branch
eric7
changeset 8312
800c432b34c8
parent 8259
2bbec88047dd
child 8318
962bce857696
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric7/Preferences/PreferencesLexer.py	Sat May 15 18:45:04 2021 +0200
@@ -0,0 +1,537 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2002 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a special QScintilla lexer to handle the preferences.
+"""
+
+from PyQt5.QtCore import QCoreApplication, QObject
+from PyQt5.Qsci import QsciScintillaBase
+
+import Preferences
+import Globals
+
+
+class PreferencesLexerError(Exception):
+    """
+    Class defining a special error for the PreferencesLexer class.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        self._errorMessage = QCoreApplication.translate(
+            "PreferencesLexerError",
+            "Unspecific PreferencesLexer error.")
+        
+    def __repr__(self):
+        """
+        Special method returning a representation of the exception.
+        
+        @return string representing the error message
+        @rtype str
+        """
+        return repr(self._errorMessage)
+        
+    def __str__(self):
+        """
+        Special method returning a string representation of the exception.
+        
+        @return string representing the error message
+        @rtype str
+        """
+        return self._errorMessage
+
+
+class PreferencesLexerLanguageError(PreferencesLexerError):
+    """
+    Class defining a special error for the PreferencesLexer class.
+    """
+    def __init__(self, language):
+        """
+        Constructor
+        
+        @param language lexer language
+        @type str
+        """
+        PreferencesLexerError.__init__(self)
+        self._errorMessage = QCoreApplication.translate(
+            "PreferencesLexerError",
+            'Unsupported Lexer Language: {0}').format(language)
+
+
+class PreferencesLexer(QObject):
+    """
+    Class implementing a Lexer facade for the highlighting styles
+    configuration.
+    """
+    def __init__(self, language, parent=None):
+        """
+        Constructor
+        
+        @param language language of the lexer
+        @type str
+        @param parent parent widget of this lexer (QWidget)
+        @exception PreferencesLexerLanguageError raised to indicate an invalid
+            lexer language
+        """
+        super().__init__(parent)
+        
+        # These default font families are taken from QScintilla
+        if Globals.isWindowsPlatform():
+            self.__defaultFontFamily = "Courier New"
+        elif Globals.isMacPlatform():
+            self.__defaultFontFamily = "Courier"
+        else:
+            self.__defaultFontFamily = "Bitstream Vera Sans Mono"
+        
+        # instantiate a lexer object for the given language
+        import QScintilla.Lexers
+        self.__lex = QScintilla.Lexers.getLexer(language)
+        if self.__lex is None:
+            raise PreferencesLexerLanguageError(language)
+        
+        # read the last stored values from preferences file
+        self.__lex.readSettings(Preferences.Prefs.settings, "Scintilla")
+        if self.__lex.hasSubstyles():
+            self.__lex.loadSubstyles()
+    
+    def writeSettings(self):
+        """
+        Public method to write the lexer settings.
+        """
+        self.__lex.writeSettings(Preferences.Prefs.settings, "Scintilla")
+        if self.__lex.hasSubstyles():
+            self.__lex.writeSubstyles()
+    
+    def getStyles(self):
+        """
+        Public method to get a list of all supported styles.
+        
+        @return list of tuples each containing the description of the style,
+            style number and sub-style number (or -1 for no sub-style)
+        @rtype list of tuples of (str, int, int)
+        """
+        styles = []
+        
+        for i in range(QsciScintillaBase.STYLE_MAX):
+            desc = self.__lex.description(i)
+            if desc:
+                styles.append((desc, i, -1))
+        if self.__lex.hasSubstyles():
+            for baseStyle in self.__lex.getBaseStyles():
+                for subStyle in range(self.__lex.substylesCount(baseStyle)):
+                    desc = self.__lex.substyleDescription(baseStyle, subStyle)
+                    styles.append((desc, baseStyle, subStyle))
+        
+        return styles
+    
+    def getSubStyles(self, style):
+        """
+        Public method to get a list of all sub-styles of a style.
+        
+        @param style style number
+        @type int
+        @return list of tuples each containing the description of the style,
+            style number and sub-style number (or -1 for no sub-style)
+        @rtype list of tuples of (str, int, int)
+        """
+        styles = []
+        
+        if self.isBaseStyle(style):
+            for subStyle in range(self.__lex.substylesCount(style)):
+                desc = self.__lex.substyleDescription(style, subStyle)
+                styles.append((desc, style, subStyle))
+        
+        return styles
+    
+    def defaultColor(self, style, substyle=-1):
+        """
+        Public method to get the default color of a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default color
+        @rtype QColor
+        """
+        color = (
+            self.__lex.substyleDefaultColor(style, substyle)
+            if substyle >= 0 else
+            self.__lex.defaultColor(style)
+        )
+        
+        return color
+    
+    def color(self, style, substyle=-1):
+        """
+        Public method to get the color of a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return color
+        @rtype QColor
+        """
+        color = (
+            self.__lex.substyleColor(style, substyle)
+            if substyle >= 0 else
+            self.__lex.color(style)
+        )
+        
+        return color
+    
+    def setColor(self, c, style, substyle=-1):
+        """
+        Public method to set the color for a style.
+        
+        @param c color
+        @type QColor
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        if substyle >= 0:
+            self.__lex.setSubstyleColor(c, style, substyle)
+        else:
+            self.__lex.setColor(c, style)
+    
+    def defaultPaper(self, style, substyle=-1):
+        """
+        Public method to get the default background for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default background color
+        @rtype QColor
+        """
+        color = (
+            self.__lex.substyleDefaultPaper(style, substyle)
+            if substyle >= 0 else
+            self.__lex.defaultPaper(style)
+        )
+        
+        return color
+    
+    def paper(self, style, substyle=-1):
+        """
+        Public method to get the background for a style.
+        
+        @param style the style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return background color
+        @rtype QColor
+        """
+        color = (
+            self.__lex.substylePaper(style, substyle)
+            if substyle >= 0 else
+            self.__lex.paper(style)
+        )
+        
+        return color
+    
+    def setPaper(self, c, style, substyle=-1):
+        """
+        Public method to set the background for a style.
+        
+        @param c background color
+        @type QColor
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        if substyle >= 0:
+            self.__lex.setSubstylePaper(c, style, substyle)
+        else:
+            self.__lex.setPaper(c, style)
+    
+    def defaultEolFill(self, style, substyle=-1):
+        """
+        Public method to get the default eolFill flag for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default eolFill flag
+        @rtype bool
+        """
+        eolFill = (
+            self.__lex.substyleDefaultEolFill(style, substyle)
+            if substyle >= 0 else
+            self.__lex.defaultEolFill(style)
+        )
+        
+        return eolFill
+    
+    def eolFill(self, style, substyle=-1):
+        """
+        Public method to get the eolFill flag for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return eolFill flag
+        @rtype bool
+        """
+        eolFill = (
+            self.__lex.substyleEolFill(style, substyle)
+            if substyle >= 0 else
+            self.__lex.eolFill(style)
+        )
+        
+        return eolFill
+    
+    def setEolFill(self, eolfill, style, substyle=-1):
+        """
+        Public method to set the eolFill flag for a style.
+        
+        @param eolfill eolFill flag
+        @type bool
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        if substyle >= 0:
+            self.__lex.setSubstyleEolFill(eolfill, style, substyle)
+        else:
+            self.__lex.setEolFill(eolfill, style)
+    
+    def defaultFont(self, style, substyle=-1):
+        """
+        Public method to get the default font for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default font
+        @rtype QFont
+        """
+        font = (
+            self.__lex.substyleDefaultFont(style, substyle)
+            if substyle >= 0 else
+            self.__lex.defaultFont(style)
+        )
+        
+        return font
+    
+    def font(self, style, substyle=-1):
+        """
+        Public method to get the font for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return font
+        @rtype QFont
+        """
+        font = (
+            self.__lex.substyleFont(style, substyle)
+            if substyle >= 0 else
+            self.__lex.font(style)
+        )
+        
+        return font
+    
+    def setFont(self, f, style, substyle=-1):
+        """
+        Public method to set the font for a style.
+        
+        @param f font
+        @type QFont
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        if substyle >= 0:
+            self.__lex.setSubstyleFont(f, style, substyle)
+        else:
+            self.__lex.setFont(f, style)
+    
+    def defaultWords(self, style, substyle=-1):
+        """
+        Public method to get the default list of words for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return whitespace separated default list of words
+        @rtype str
+        """
+        words = (
+            self.__lex.substyleDefaultWords(style, substyle)
+            if substyle >= 0 else
+            ""
+        )
+        
+        return words
+    
+    def words(self, style, substyle=-1):
+        """
+        Public method to get the list of words for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return whitespace separated list of words
+        @rtype str
+        """
+        words = (self.__lex.substyleWords(style, substyle) if substyle >= 0
+                 else "")
+        
+        return words
+    
+    def setWords(self, words, style, substyle=-1):
+        """
+        Public method to set the list of words for a style.
+        
+        @param words whitespace separated list of words
+        @type str
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        if substyle >= 0:
+            # only supported for sub-styles
+            self.__lex.setSubstyleWords(words, style, substyle)
+    
+    def defaultDescription(self, style, substyle=-1):
+        """
+        Public method to get the default descriptive string for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return default description of the style
+        @rtype str
+        """
+        desc = (
+            self.__lex.substyleDefaultDescription(style, substyle)
+            if substyle >= 0 else
+            # for base styles return the hard coded description
+            self.__lex.description(style)
+        )
+        
+        return desc
+    
+    def description(self, style, substyle=-1):
+        """
+        Public method to get a descriptive string for a style.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return description of the style
+        @rtype str
+        """
+        desc = (
+            self.__lex.substyleDescription(style, substyle)
+            if substyle >= 0 else
+            self.__lex.description(style)
+        )
+        
+        return desc
+    
+    def setDescription(self, description, style, substyle=-1):
+        """
+        Public method to set a descriptive string for a style.
+        
+        @param description description for the style
+        @type str
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        """
+        if substyle >= 0:
+            # only supported for sub-styles
+            self.__lex.setSubstyleDescription(description, style, substyle)
+    
+    def language(self):
+        """
+        Public method to get the lexers programming language.
+        
+        @return lexer programming language
+        @rtype str
+        """
+        return self.__lex.language()
+    
+    def hasStyle(self, style, substyle):
+        """
+        Public method to test for a given style definition.
+        
+        @param style style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return flag indicating the existence of a style definition
+        @rtype bool
+        """
+        ok = (self.__lex.hasSubstyle(style, substyle) if substyle >= 0
+              else True)
+        
+        return ok
+    
+    def isBaseStyle(self, style):
+        """
+        Public method to test, if a given style may have sub-styles.
+        
+        @param style base style number
+        @type int
+        @return flag indicating that the style may have sub-styles
+        @rtype bool
+        """
+        return self.__lex.hasSubstyles() and self.__lex.isBaseStyle(style)
+    
+    def addSubstyle(self, style):
+        """
+        Public method to add an empty sub-style to a given style.
+        
+        @param style style number
+        @type int
+        @return allocated sub-style number or -1 to indicate an error
+        @rtype int
+        """
+        return self.__lex.addSubstyle(style)
+    
+    def delSubstyle(self, style, substyle):
+        """
+        Public method to delete a given sub-style definition.
+        
+        @param style base style number
+        @type int
+        @param substyle sub-style number
+        @type int
+        @return flag indicating successful deletion
+        @rtype bool
+        """
+        return self.__lex.delSubstyle(style, substyle)
+    
+    def loadDefaultSubStyles(self, style):
+        """
+        Public method to load the default sub-styles for a given base style.
+        
+        @param style style number
+        @type int
+        """
+        self.__lex.loadDefaultSubStyles(style)

eric ide

mercurial