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

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

"""
Module implementing the Editor Properties configuration page.
"""

from PyQt6.Qsci import QsciLexerPython

from eric7 import Preferences

from .ConfigurationPageBase import ConfigurationPageBase
from .Ui_EditorPropertiesPage import Ui_EditorPropertiesPage


class EditorPropertiesPage(ConfigurationPageBase, Ui_EditorPropertiesPage):
    """
    Class implementing the Editor Properties configuration page.
    """

    def __init__(self, lexers):
        """
        Constructor

        @param lexers reference to the lexers dictionary
        @type dict
        """
        super().__init__()
        self.setupUi(self)
        self.setObjectName("EditorPropertiesPage")

        self.languages = sorted(lexers)

        # set initial values
        # All
        self.allFoldCompactCheckBox.setChecked(Preferences.getEditor("AllFoldCompact"))

        # Bash
        self.foldBashCommentCheckBox.setChecked(
            Preferences.getEditor("BashFoldComment")
        )

        # C++
        self.foldCppCommentCheckBox.setChecked(Preferences.getEditor("CppFoldComment"))
        self.foldCppPreprocessorCheckBox.setChecked(
            Preferences.getEditor("CppFoldPreprocessor")
        )
        self.foldCppAtElseCheckBox.setChecked(Preferences.getEditor("CppFoldAtElse"))
        self.cppIndentOpeningBraceCheckBox.setChecked(
            Preferences.getEditor("CppIndentOpeningBrace")
        )
        self.cppIndentClosingBraceCheckBox.setChecked(
            Preferences.getEditor("CppIndentClosingBrace")
        )
        self.cppCaseInsensitiveCheckBox.setChecked(
            Preferences.getEditor("CppCaseInsensitiveKeywords")
        )
        self.cppDollarAllowedCheckBox.setChecked(
            Preferences.getEditor("CppDollarsAllowed")
        )
        self.cppStylePreprocessorCheckBox.setChecked(
            Preferences.getEditor("CppStylePreprocessor")
        )
        self.cppHighlightTripleQuotedCheckBox.setChecked(
            Preferences.getEditor("CppHighlightTripleQuotedStrings")
        )
        self.cppHighlightHashQuotedCheckBox.setChecked(
            Preferences.getEditor("CppHighlightHashQuotedStrings")
        )
        self.cppHighlightBackQuotedCheckBox.setChecked(
            Preferences.getEditor("CppHighlightBackQuotedStrings")
        )
        self.cppHighlightEsacepSequencesCheckBox.setChecked(
            Preferences.getEditor("CppHighlightEscapeSequences")
        )
        self.cppVerbatimStringEscapeAllowedCheckBox.setChecked(
            Preferences.getEditor("CppVerbatimStringEscapeSequencesAllowed")
        )

        # CMake
        self.cmakeFoldAtElseCheckBox.setChecked(
            Preferences.getEditor("CMakeFoldAtElse")
        )

        # CoffeeScript
        if "CoffeeScript" in self.languages:
            self.foldCoffeeScriptCommentCheckBox.setChecked(
                Preferences.getEditor("CoffeScriptFoldComment")
            )
            self.coffeeScriptDollarAllowedCheckBox.setChecked(
                Preferences.getEditor("CoffeeScriptDollarsAllowed")
            )
            self.coffeeScriptStylePreprocessorCheckBox.setChecked(
                Preferences.getEditor("CoffeeScriptStylePreprocessor")
            )
        else:
            self.coffeeScriptGroup.setEnabled(False)

        # CSS
        self.foldCssCommentCheckBox.setChecked(Preferences.getEditor("CssFoldComment"))
        self.cssHssCheckBox.setChecked(Preferences.getEditor("CssHssSupport"))
        self.cssLessCheckBox.setChecked(Preferences.getEditor("CssLessSupport"))
        self.cssSassyCheckBox.setChecked(Preferences.getEditor("CssSassySupport"))

        # D
        self.foldDCommentCheckBox.setChecked(Preferences.getEditor("DFoldComment"))
        self.foldDAtElseCheckBox.setChecked(Preferences.getEditor("DFoldAtElse"))
        self.dIndentOpeningBraceCheckBox.setChecked(
            Preferences.getEditor("DIndentOpeningBrace")
        )
        self.dIndentClosingBraceCheckBox.setChecked(
            Preferences.getEditor("DIndentClosingBrace")
        )

        # Gettext
        if "Gettext" in self.languages:
            self.foldPoCommentCheckBox.setChecked(
                Preferences.getEditor("PoFoldComment")
            )
        else:
            self.gettextGroup.setEnabled(False)

        # HTML
        self.foldHtmlPreprocessorCheckBox.setChecked(
            Preferences.getEditor("HtmlFoldPreprocessor")
        )
        self.htmlCaseSensitiveTagsCheckBox.setChecked(
            Preferences.getEditor("HtmlCaseSensitiveTags")
        )
        self.foldHtmlScriptCommentsCheckBox.setChecked(
            Preferences.getEditor("HtmlFoldScriptComments")
        )
        self.foldHtmlScriptHereDocsCheckBox.setChecked(
            Preferences.getEditor("HtmlFoldScriptHeredocs")
        )
        self.htmlDjangoCheckBox.setChecked(Preferences.getEditor("HtmlDjangoTemplates"))
        self.htmlMakoCheckBox.setChecked(Preferences.getEditor("HtmlMakoTemplates"))

        # JSON
        if "JSON" in self.languages:
            self.jsonHighlightCommentsCheckBox.setChecked(
                Preferences.getEditor("JSONHightlightComments")
            )
            self.jsonHighlightEscapeCheckBox.setChecked(
                Preferences.getEditor("JSONHighlightEscapeSequences")
            )
        else:
            self.jsonGroup.setEnabled(False)

        # Pascal
        self.pascalGroup.setEnabled(True)
        self.foldPascalCommentCheckBox.setChecked(
            Preferences.getEditor("PascalFoldComment")
        )
        self.foldPascalPreprocessorCheckBox.setChecked(
            Preferences.getEditor("PascalFoldPreprocessor")
        )
        self.pascalSmartHighlightingCheckBox.setChecked(
            Preferences.getEditor("PascalSmartHighlighting")
        )

        # Perl
        self.foldPerlCommentCheckBox.setChecked(
            Preferences.getEditor("PerlFoldComment")
        )
        self.foldPerlPackagesCheckBox.setChecked(
            Preferences.getEditor("PerlFoldPackages")
        )
        self.foldPerlPODBlocksCheckBox.setChecked(
            Preferences.getEditor("PerlFoldPODBlocks")
        )
        self.foldPerlAtElseCheckBox.setChecked(Preferences.getEditor("PerlFoldAtElse"))

        # PostScript
        self.postscriptGroup.setEnabled(True)
        self.psFoldAtElseCheckBox.setChecked(
            Preferences.getEditor("PostScriptFoldAtElse")
        )
        self.psMarkTokensCheckBox.setChecked(
            Preferences.getEditor("PostScriptTokenize")
        )
        self.psLevelSpinBox.setValue(Preferences.getEditor("PostScriptLevel"))

        # Povray
        self.foldPovrayCommentCheckBox.setChecked(
            Preferences.getEditor("PovFoldComment")
        )
        self.foldPovrayDirectivesCheckBox.setChecked(
            Preferences.getEditor("PovFoldDirectives")
        )

        # Properties
        self.propertiesInitialSpacesCheckBox.setChecked(
            Preferences.getEditor("PropertiesInitialSpaces")
        )

        # Python
        self.pythonBadIndentationComboBox.addItems(
            [
                self.tr("No Warning"),
                self.tr("Inconsistent"),
                self.tr("Tabs after Spaces"),
                self.tr("Spaces"),
                self.tr("Tabs"),
            ]
        )
        self.pythonBadIndentationComboBox.setCurrentIndex(
            Preferences.getEditor("PythonBadIndentation").value
        )
        self.foldPythonCommentCheckBox.setChecked(
            Preferences.getEditor("PythonFoldComment")
        )
        self.foldPythonStringCheckBox.setChecked(
            Preferences.getEditor("PythonFoldString")
        )
        self.pythonAutoindentCheckBox.setChecked(
            Preferences.getEditor("PythonAutoIndent")
        )
        self.pythonV2UnicodeAllowedCheckBox.setChecked(
            Preferences.getEditor("PythonAllowV2Unicode")
        )
        self.pythonV3BinaryAllowedCheckBox.setChecked(
            Preferences.getEditor("PythonAllowV3Binary")
        )
        self.pythonV3BytesAllowedCheckBox.setChecked(
            Preferences.getEditor("PythonAllowV3Bytes")
        )
        self.foldPythonQuotesCheckBox.setChecked(
            Preferences.getEditor("PythonFoldQuotes")
        )
        self.pythonStringsOverNewlineCheckBox.setChecked(
            Preferences.getEditor("PythonStringsOverNewLineAllowed")
        )
        self.pythonHighlightSubidentifierCheckBox.setChecked(
            Preferences.getEditor("PythonHighlightSubidentifier")
        )

        # Ruby
        self.foldRubyCommentCheckBox.setChecked(
            Preferences.getEditor("RubyFoldComment")
        )

        # SQL
        self.foldSqlCommentCheckBox.setChecked(Preferences.getEditor("SqlFoldComment"))
        self.sqlBackslashEscapesCheckBox.setChecked(
            Preferences.getEditor("SqlBackslashEscapes")
        )
        self.sqlFoldAtElseCheckBox.setChecked(Preferences.getEditor("SqlFoldAtElse"))
        self.sqlFoldOnlyBeginCheckBox.setChecked(
            Preferences.getEditor("SqlFoldOnlyBegin")
        )
        self.sqlDottedWordsCheckBox.setChecked(Preferences.getEditor("SqlDottedWords"))
        self.sqlHashCommentsCheckBox.setChecked(
            Preferences.getEditor("SqlHashComments")
        )
        self.sqlQuotedIdentifiersCheckBox.setChecked(
            Preferences.getEditor("SqlQuotedIdentifiers")
        )

        # TCL
        self.foldTclCommentCheckBox.setChecked(Preferences.getEditor("TclFoldComment"))

        # TeX
        self.foldTexCommentCheckBox.setChecked(Preferences.getEditor("TexFoldComment"))
        self.texProcessCommentsCheckBox.setChecked(
            Preferences.getEditor("TexProcessComments")
        )
        self.texProcessIfCheckBox.setChecked(Preferences.getEditor("TexProcessIf"))

        # VHDL
        self.vhdlFoldCommentCheckBox.setChecked(
            Preferences.getEditor("VHDLFoldComment")
        )
        self.vhdlFoldAtElseCheckBox.setChecked(Preferences.getEditor("VHDLFoldAtElse"))
        self.vhdlFoldAtBeginCheckBox.setChecked(
            Preferences.getEditor("VHDLFoldAtBegin")
        )
        self.vhdlFoldAtParenthesisCheckBox.setChecked(
            Preferences.getEditor("VHDLFoldAtParenthesis")
        )

        # XML
        self.xmlSyleScriptsCheckBox.setChecked(Preferences.getEditor("XMLStyleScripts"))

        # YAML
        self.yamlGroup.setEnabled(True)
        self.foldYamlCommentCheckBox.setChecked(
            Preferences.getEditor("YAMLFoldComment")
        )

    def setMode(self, displayMode):
        """
        Public method to perform mode dependent setups.

        @param displayMode mode of the configuration dialog
        @type ConfigurationMode
        """
        from ..ConfigurationDialog import ConfigurationMode

        if displayMode in (ConfigurationMode.SHELLMODE,):
            self.bashGroup.hide()
            self.cppGroup.hide()
            self.cmakeGroup.hide()
            self.coffeeScriptGroup.hide()
            self.cssGroup.hide()
            self.dGroup.hide()
            self.gettextGroup.hide()
            self.htmlGroup.hide()
            self.jsonGroup.hide()
            self.pascalGroup.hide()
            self.perlGroup.hide()
            self.postscriptGroup.hide()
            self.povrayGroup.hide()
            self.propertiesGroup.hide()
            self.rubyGroup.hide()
            self.sqlGroup.hide()
            self.tclGroup.hide()
            self.texGroup.hide()
            self.vhdlGroup.hide()
            self.yamlGroup.hide()

    def save(self):
        """
        Public slot to save the Editor Properties (1) configuration.
        """
        # All
        Preferences.setEditor("AllFoldCompact", self.allFoldCompactCheckBox.isChecked())

        # Bash
        Preferences.setEditor(
            "BashFoldComment", self.foldBashCommentCheckBox.isChecked()
        )

        # CMake
        Preferences.setEditor(
            "CMakeFoldAtElse", self.cmakeFoldAtElseCheckBox.isChecked()
        )

        # C++
        Preferences.setEditor("CppFoldComment", self.foldCppCommentCheckBox.isChecked())
        Preferences.setEditor(
            "CppFoldPreprocessor", self.foldCppPreprocessorCheckBox.isChecked()
        )
        Preferences.setEditor("CppFoldAtElse", self.foldCppAtElseCheckBox.isChecked())
        Preferences.setEditor(
            "CppIndentOpeningBrace", self.cppIndentOpeningBraceCheckBox.isChecked()
        )
        Preferences.setEditor(
            "CppIndentClosingBrace", self.cppIndentClosingBraceCheckBox.isChecked()
        )
        Preferences.setEditor(
            "CppCaseInsensitiveKeywords", self.cppCaseInsensitiveCheckBox.isChecked()
        )
        Preferences.setEditor(
            "CppDollarsAllowed", self.cppDollarAllowedCheckBox.isChecked()
        )
        Preferences.setEditor(
            "CppStylePreprocessor", self.cppStylePreprocessorCheckBox.isChecked()
        )
        Preferences.setEditor(
            "CppHighlightTripleQuotedStrings",
            self.cppHighlightTripleQuotedCheckBox.isChecked(),
        )
        Preferences.setEditor(
            "CppHighlightHashQuotedStrings",
            self.cppHighlightHashQuotedCheckBox.isChecked(),
        )
        Preferences.setEditor(
            "CppHighlightBackQuotedStrings",
            self.cppHighlightBackQuotedCheckBox.isChecked(),
        )
        Preferences.setEditor(
            "CppHighlightEscapeSequences",
            self.cppHighlightEsacepSequencesCheckBox.isChecked(),
        )
        Preferences.setEditor(
            "CppVerbatimStringEscapeSequencesAllowed",
            self.cppVerbatimStringEscapeAllowedCheckBox.isChecked(),
        )

        # CMake
        Preferences.setEditor(
            "CMakeFoldAtElse", self.cmakeFoldAtElseCheckBox.isChecked()
        )

        # CoffeeScript
        if "CoffeeScript" in self.languages:
            Preferences.setEditor(
                "CoffeScriptFoldComment",
                self.foldCoffeeScriptCommentCheckBox.isChecked(),
            )
            Preferences.setEditor(
                "CoffeeScriptDollarsAllowed",
                self.coffeeScriptDollarAllowedCheckBox.isChecked(),
            )
            Preferences.setEditor(
                "CoffeeScriptStylePreprocessor",
                self.coffeeScriptStylePreprocessorCheckBox.isChecked(),
            )

        # CSS
        Preferences.setEditor("CssFoldComment", self.foldCssCommentCheckBox.isChecked())
        Preferences.setEditor("CssHssSupport", self.cssHssCheckBox.isChecked())
        Preferences.setEditor("CssLessSupport", self.cssLessCheckBox.isChecked())
        Preferences.setEditor("CssSassySupport", self.cssSassyCheckBox.isChecked())

        # D
        Preferences.setEditor("DFoldComment", self.foldDCommentCheckBox.isChecked())
        Preferences.setEditor("DFoldAtElse", self.foldDAtElseCheckBox.isChecked())
        Preferences.setEditor(
            "DIndentOpeningBrace", self.dIndentOpeningBraceCheckBox.isChecked()
        )
        Preferences.setEditor(
            "DIndentClosingBrace", self.dIndentClosingBraceCheckBox.isChecked()
        )

        # Gettext
        if "Gettext" in self.languages:
            Preferences.setEditor(
                "PoFoldComment", self.foldPoCommentCheckBox.isChecked()
            )

        # HTML
        Preferences.setEditor(
            "HtmlFoldPreprocessor", self.foldHtmlPreprocessorCheckBox.isChecked()
        )
        Preferences.setEditor(
            "HtmlCaseSensitiveTags", self.htmlCaseSensitiveTagsCheckBox.isChecked()
        )
        Preferences.setEditor(
            "HtmlFoldScriptComments", self.foldHtmlScriptCommentsCheckBox.isChecked()
        )
        Preferences.setEditor(
            "HtmlFoldScriptHeredocs", self.foldHtmlScriptHereDocsCheckBox.isChecked()
        )
        Preferences.setEditor(
            "HtmlDjangoTemplates", self.htmlDjangoCheckBox.isChecked()
        )
        Preferences.setEditor("HtmlMakoTemplates", self.htmlMakoCheckBox.isChecked())

        # JSON
        if "JSON" in self.languages:
            Preferences.setEditor(
                "JSONHightlightComments", self.jsonHighlightCommentsCheckBox.isChecked()
            )
            Preferences.setEditor(
                "JSONHighlightEscapeSequences",
                self.jsonHighlightEscapeCheckBox.isChecked(),
            )

        # Pascal
        Preferences.setEditor(
            "PascalFoldComment", self.foldPascalCommentCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PascalFoldPreprocessor", self.foldPascalPreprocessorCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PascalSmartHighlighting", self.pascalSmartHighlightingCheckBox.isChecked()
        )

        # Perl
        Preferences.setEditor(
            "PerlFoldComment", self.foldPerlCommentCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PerlFoldPackages", self.foldPerlPackagesCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PerlFoldPODBlocks", self.foldPerlPODBlocksCheckBox.isChecked()
        )
        Preferences.setEditor("PerlFoldAtElse", self.foldPerlAtElseCheckBox.isChecked())

        # PostScript
        Preferences.setEditor(
            "PostScriptFoldAtElse", self.psFoldAtElseCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PostScriptTokenize", self.psMarkTokensCheckBox.isChecked()
        )
        Preferences.setEditor("PostScriptLevel", self.psLevelSpinBox.value())

        # Povray
        Preferences.setEditor(
            "PovFoldComment", self.foldPovrayCommentCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PovFoldDirectives", self.foldPovrayDirectivesCheckBox.isChecked()
        )

        # Properties
        Preferences.setEditor(
            "PropertiesInitialSpaces", self.propertiesInitialSpacesCheckBox.isChecked()
        )

        # Python
        Preferences.setEditor(
            "PythonFoldComment", self.foldPythonCommentCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PythonFoldString", self.foldPythonStringCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PythonBadIndentation",
            QsciLexerPython.IndentationWarning(
                self.pythonBadIndentationComboBox.currentIndex()
            ),
        )
        Preferences.setEditor(
            "PythonAutoIndent", self.pythonAutoindentCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PythonAllowV2Unicode", self.pythonV2UnicodeAllowedCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PythonAllowV3Binary", self.pythonV3BinaryAllowedCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PythonAllowV3Bytes", self.pythonV3BytesAllowedCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PythonFoldQuotes", self.foldPythonQuotesCheckBox.isChecked()
        )
        Preferences.setEditor(
            "PythonStringsOverNewLineAllowed",
            self.pythonStringsOverNewlineCheckBox.isChecked(),
        )
        Preferences.setEditor(
            "PythonHighlightSubidentifier",
            self.pythonHighlightSubidentifierCheckBox.isChecked(),
        )

        # Ruby
        Preferences.setEditor(
            "RubyFoldComment", self.foldRubyCommentCheckBox.isChecked()
        )

        # SQL
        Preferences.setEditor("SqlFoldComment", self.foldSqlCommentCheckBox.isChecked())
        Preferences.setEditor(
            "SqlBackslashEscapes", self.sqlBackslashEscapesCheckBox.isChecked()
        )
        Preferences.setEditor("SqlFoldAtElse", self.sqlFoldAtElseCheckBox.isChecked())
        Preferences.setEditor(
            "SqlFoldOnlyBegin", self.sqlFoldOnlyBeginCheckBox.isChecked()
        )
        Preferences.setEditor("SqlDottedWords", self.sqlDottedWordsCheckBox.isChecked())
        Preferences.setEditor(
            "SqlHashComments", self.sqlHashCommentsCheckBox.isChecked()
        )
        Preferences.setEditor(
            "SqlQuotedIdentifiers", self.sqlQuotedIdentifiersCheckBox.isChecked()
        )

        # TCL
        Preferences.setEditor("TclFoldComment", self.foldTclCommentCheckBox.isChecked())

        # TeX
        Preferences.setEditor("TexFoldComment", self.foldTexCommentCheckBox.isChecked())
        Preferences.setEditor(
            "TexProcessComments", self.texProcessCommentsCheckBox.isChecked()
        )
        Preferences.setEditor("TexProcessIf", self.texProcessIfCheckBox.isChecked())

        # VHDL
        Preferences.setEditor(
            "VHDLFoldComment", self.vhdlFoldCommentCheckBox.isChecked()
        )
        Preferences.setEditor("VHDLFoldAtElse", self.vhdlFoldAtElseCheckBox.isChecked())
        Preferences.setEditor(
            "VHDLFoldAtBegin", self.vhdlFoldAtBeginCheckBox.isChecked()
        )
        Preferences.setEditor(
            "VHDLFoldAtParenthesis", self.vhdlFoldAtParenthesisCheckBox.isChecked()
        )

        # XML
        Preferences.setEditor(
            "XMLStyleScripts", self.xmlSyleScriptsCheckBox.isChecked()
        )

        # YAML
        Preferences.setEditor(
            "YAMLFoldComment", self.foldYamlCommentCheckBox.isChecked()
        )


def create(dlg):
    """
    Module function to create the configuration page.

    @param dlg reference to the configuration dialog
    @type ConfigurationDialog
    @return reference to the instantiated page
    @rtype ConfigurationPageBase
    """
    page = EditorPropertiesPage(dlg.getLexers())
    return page
