Preferences/PreferencesLexer.py

Tue, 12 Mar 2019 20:00:30 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 12 Mar 2019 20:00:30 +0100
branch
sub_styles
changeset 6855
4d80c8cc99a1
parent 6854
f4dd76230eea
child 6858
9d962e654978
permissions
-rw-r--r--

SubstyledLexer: continued implementing the getter and setter methods.

# -*- coding: utf-8 -*-

# Copyright (c) 2002 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a special QScintilla lexer to handle the preferences.
"""

from __future__ import unicode_literals

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
        @rtype 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(PreferencesLexer, self).__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)
        """
        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 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
        """
        if substyle >= 0:
            color = self.__lex.substyleDefaultColor(style, substyle)
        else:
            color = 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
        """
        if substyle >= 0:
            color = self.__lex.substyleColor(style, substyle)
        else:
            color = 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
        """
        if substyle >= 0:
            color = self.__lex.substyleDefaultPaper(style, substyle)
        else:
            color = 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
        """
        if substyle >= 0:
            color = self.__lex.substylePaper(style, substyle)
        else:
            color = 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 defaulEolFill(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
        """
        if substyle >= 0:
            eolFill = self.__lex.substyleDefaultEolFill(style, substyle)
        else:
            eolFill = 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
        """
        if substyle >= 0:
            eolFill = self.__lex.substyleEolFill(style, substyle)
        else:
            eolFill = 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
        """
        if substyle >= 0:
            font = self.__lex.substyleDefaultFont(style, substyle)
        else:
            font = 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
        """
        if substyle >= 0:
            font = self.__lex.substyleFont(style, substyle)
        else:
            font = 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 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
        """
        return self.__lex.description(style)
    
    def language(self):
        """
        Public method to get the lexers programming language.
        
        @return lexer programming language
        @rtype str
        """
        return self.__lex.language()

eric ide

mercurial