cadquery-freecad-module/Libs/pyqode/core/widgets/code_edits.py

157 lines
6.0 KiB
Python

"""
This module contains core code edits:
- TextEdit: code edit specialised for plain text
- GenericCodeEdit: generic code editor, not that smart and slow.
Use it as a fallback and look other pyqode packages for language
specific cod edits.
"""
import sys
from pyqode.core.backend import server
from pyqode.core.api import CodeEdit, Panel, SyntaxHighlighter, \
CharBasedFoldDetector, IndentFoldDetector, ColorScheme
class TextCodeEdit(CodeEdit):
"""
CodeEdit specialised for plain text.
Especially useful for long text file such as log files because it's syntax
highlighter does not do anything.
"""
class TextSH(SyntaxHighlighter):
"""
Empty highlighter, does not do anything (very fast at loading very
big files).
"""
def highlight_block(self, text, user_data):
"""
Does nothing
"""
pass
mimetypes = ['text/x-plain', 'text/x-log', 'text/plain']
def __init__(self, parent=None, server_script=server.__file__,
interpreter=sys.executable, args=None,
create_default_actions=True, color_scheme='qt',
reuse_backend=False):
from pyqode.core import panels
from pyqode.core import modes
super(TextCodeEdit, self).__init__(parent, create_default_actions)
self.backend.start(server_script, interpreter, args,
reuse=reuse_backend)
# append panels
self.panels.append(panels.SearchAndReplacePanel(),
Panel.Position.BOTTOM)
self.panels.append(panels.FoldingPanel())
self.panels.append(panels.LineNumberPanel())
# append modes
self.modes.append(modes.AutoCompleteMode())
self.modes.append(modes.ExtendedSelectionMode())
self.modes.append(modes.CaseConverterMode())
self.modes.append(modes.FileWatcherMode())
self.modes.append(modes.CaretLineHighlighterMode())
self.modes.append(modes.RightMarginMode())
self.modes.append(TextCodeEdit.TextSH(
self.document(), ColorScheme(color_scheme)))
self.modes.append(modes.ZoomMode())
self.modes.append(modes.OccurrencesHighlighterMode())
self.modes.append(modes.CodeCompletionMode())
self.modes.append(modes.AutoIndentMode())
self.modes.append(modes.IndenterMode())
self.modes.append(modes.SymbolMatcherMode())
self.panels.append(panels.EncodingPanel(), Panel.Position.TOP)
def clone(self):
clone = self.__class__(
parent=self.parent(), server_script=self.backend.server_script,
interpreter=self.backend.interpreter, args=self.backend.args,
color_scheme=self.syntax_highlighter.color_scheme.name)
return clone
class GenericCodeEdit(CodeEdit):
"""
This generic code edit uses the PygmentSH for syntax highlighting and
commpletion engine based on the document words. It is not very smart and
is probably 2 times slower than a native specialised code edit.
It is meant to be used as a fallback editor in case you're missing a
specialised editor.
"""
# generic
mimetypes = []
#: the list of mimetypes that use char based fold detector
_char_based_mimetypes = [
'text/x-php',
'text/x-c++hdr',
'text/x-c++src',
'text/x-chdr',
'text/x-csrc',
'text/x-csharp',
'application/javascript'
]
def __init__(self, parent=None, server_script=server.__file__,
interpreter=sys.executable, args=None,
create_default_actions=True, color_scheme='qt',
reuse_backend=False):
super(GenericCodeEdit, self).__init__(parent, create_default_actions)
from pyqode.core import panels
from pyqode.core import modes
self.backend.start(server_script, interpreter, args,
reuse=reuse_backend)
# append panels
self.panels.append(panels.LineNumberPanel())
self.panels.append(panels.SearchAndReplacePanel(),
Panel.Position.BOTTOM)
self.panels.append(panels.FoldingPanel())
# append modes
self.modes.append(modes.AutoCompleteMode())
self.modes.append(modes.ExtendedSelectionMode())
self.modes.append(modes.CaseConverterMode())
self.modes.append(modes.FileWatcherMode())
self.modes.append(modes.CaretLineHighlighterMode())
self.modes.append(modes.RightMarginMode())
self.modes.append(modes.PygmentsSyntaxHighlighter(
self.document(), color_scheme=ColorScheme(color_scheme)))
self.modes.append(modes.ZoomMode())
self.modes.append(modes.CodeCompletionMode())
self.modes.append(modes.AutoIndentMode())
self.modes.append(modes.IndenterMode())
self.modes.append(modes.SymbolMatcherMode())
self.modes.append(modes.OccurrencesHighlighterMode())
self.modes.append(modes.SmartBackSpaceMode())
self.panels.append(panels.EncodingPanel(), Panel.Position.TOP)
def setPlainText(self, txt, mime_type='', encoding=''):
if mime_type is None:
mime_type = self.file.mimetype
if encoding is None:
encoding = self.file.encoding
self.syntax_highlighter.set_lexer_from_filename(self.file.path)
try:
mimetype = self.syntax_highlighter._lexer.mimetypes[0]
except (AttributeError, IndexError):
mimetype = ''
if mimetype in self._char_based_mimetypes:
self.syntax_highlighter.fold_detector = CharBasedFoldDetector()
else:
self.syntax_highlighter.fold_detector = IndentFoldDetector()
super(GenericCodeEdit, self).setPlainText(txt, mime_type, encoding)
def clone(self):
clone = self.__class__(
parent=self.parent(), server_script=self.backend.server_script,
interpreter=self.backend.interpreter, args=self.backend.args,
color_scheme=self.syntax_highlighter.color_scheme.name)
return clone