📄 stctexteditor.py
字号:
def MarkerDefine(self):
""" This must be called after the texteditor is instantiated """
self.GetCtrl().MarkerDefine(TextView.MARKER_NUM, wx.stc.STC_MARK_CIRCLE, wx.BLACK, wx.BLUE)
def MarkerToggle(self, lineNum = -1, marker_index=MARKER_NUM, mask=MARKER_MASK):
if lineNum == -1:
lineNum = self.GetCtrl().GetCurrentLine()
if self.GetCtrl().MarkerGet(lineNum) & mask:
self.GetCtrl().MarkerDelete(lineNum, marker_index)
self._markerCount -= 1
else:
self.GetCtrl().MarkerAdd(lineNum, marker_index)
self._markerCount += 1
def MarkerAdd(self, lineNum = -1, marker_index=MARKER_NUM, mask=MARKER_MASK):
if lineNum == -1:
lineNum = self.GetCtrl().GetCurrentLine()
self.GetCtrl().MarkerAdd(lineNum, marker_index)
self._markerCount += 1
def MarkerDelete(self, lineNum = -1, marker_index=MARKER_NUM, mask=MARKER_MASK):
if lineNum == -1:
lineNum = self.GetCtrl().GetCurrentLine()
if self.GetCtrl().MarkerGet(lineNum) & mask:
self.GetCtrl().MarkerDelete(lineNum, marker_index)
self._markerCount -= 1
def MarkerDeleteAll(self, marker_num=MARKER_NUM):
self.GetCtrl().MarkerDeleteAll(marker_num)
if marker_num == self.MARKER_NUM:
self._markerCount = 0
def MarkerNext(self, lineNum = -1):
if lineNum == -1:
lineNum = self.GetCtrl().GetCurrentLine() + 1 # start search below current line
foundLine = self.GetCtrl().MarkerNext(lineNum, self.MARKER_MASK)
if foundLine == -1:
# wrap to top of file
foundLine = self.GetCtrl().MarkerNext(0, self.MARKER_MASK)
if foundLine == -1:
wx.GetApp().GetTopWindow().PushStatusText(_("No markers"))
return
self.GotoLine(foundLine + 1)
def MarkerPrevious(self, lineNum = -1):
if lineNum == -1:
lineNum = self.GetCtrl().GetCurrentLine() - 1 # start search above current line
if lineNum == -1:
lineNum = self.GetCtrl().GetLineCount()
foundLine = self.GetCtrl().MarkerPrevious(lineNum, self.MARKER_MASK)
if foundLine == -1:
# wrap to bottom of file
foundLine = self.GetCtrl().MarkerPrevious(self.GetCtrl().GetLineCount(), self.MARKER_MASK)
if foundLine == -1:
wx.GetApp().GetTopWindow().PushStatusText(_("No markers"))
return
self.GotoLine(foundLine + 1)
def MarkerExists(self, lineNum = -1, mask=MARKER_MASK):
if lineNum == -1:
lineNum = self.GetCtrl().GetCurrentLine()
if self.GetCtrl().MarkerGet(lineNum) & mask:
return True
else:
return False
def GetMarkerLines(self, mask=MARKER_MASK):
retval = []
for lineNum in range(self.GetCtrl().GetLineCount()):
if self.GetCtrl().MarkerGet(lineNum) & mask:
retval.append(lineNum)
return retval
def GetMarkerCount(self):
return self._markerCount
class TextService(wx.lib.pydocview.DocService):
def __init__(self):
wx.lib.pydocview.DocService.__init__(self)
def InstallControls(self, frame, menuBar = None, toolBar = None, statusBar = None, document = None):
if document and document.GetDocumentTemplate().GetDocumentType() != TextDocument:
return
if not document and wx.GetApp().GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI:
return
statusBar = TextStatusBar(frame, TEXT_STATUS_BAR_ID)
frame.SetStatusBar(statusBar)
wx.EVT_UPDATE_UI(frame, TEXT_STATUS_BAR_ID, frame.ProcessUpdateUIEvent)
viewMenu = menuBar.GetMenu(menuBar.FindMenu(_("&View")))
viewMenu.AppendSeparator()
textMenu = wx.Menu()
textMenu.AppendCheckItem(VIEW_WHITESPACE_ID, _("&Whitespace"), _("Shows or hides whitespace"))
wx.EVT_MENU(frame, VIEW_WHITESPACE_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, VIEW_WHITESPACE_ID, frame.ProcessUpdateUIEvent)
textMenu.AppendCheckItem(VIEW_EOL_ID, _("&End of Line Markers"), _("Shows or hides indicators at the end of each line"))
wx.EVT_MENU(frame, VIEW_EOL_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, VIEW_EOL_ID, frame.ProcessUpdateUIEvent)
textMenu.AppendCheckItem(VIEW_INDENTATION_GUIDES_ID, _("&Indentation Guides"), _("Shows or hides indentations"))
wx.EVT_MENU(frame, VIEW_INDENTATION_GUIDES_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, VIEW_INDENTATION_GUIDES_ID, frame.ProcessUpdateUIEvent)
textMenu.AppendCheckItem(VIEW_RIGHT_EDGE_ID, _("&Right Edge"), _("Shows or hides the right edge marker"))
wx.EVT_MENU(frame, VIEW_RIGHT_EDGE_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, VIEW_RIGHT_EDGE_ID, frame.ProcessUpdateUIEvent)
textMenu.AppendCheckItem(VIEW_LINE_NUMBERS_ID, _("&Line Numbers"), _("Shows or hides the line numbers"))
wx.EVT_MENU(frame, VIEW_LINE_NUMBERS_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, VIEW_LINE_NUMBERS_ID, frame.ProcessUpdateUIEvent)
viewMenu.AppendMenu(TEXT_ID, _("&Text"), textMenu)
wx.EVT_UPDATE_UI(frame, TEXT_ID, frame.ProcessUpdateUIEvent)
isWindows = (wx.Platform == '__WXMSW__')
zoomMenu = wx.Menu()
zoomMenu.Append(ZOOM_NORMAL_ID, _("Normal Size"), _("Sets the document to its normal size"))
wx.EVT_MENU(frame, ZOOM_NORMAL_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, ZOOM_NORMAL_ID, frame.ProcessUpdateUIEvent)
if isWindows:
zoomMenu.Append(ZOOM_IN_ID, _("Zoom In\tCtrl+Page Up"), _("Zooms the document to a larger size"))
else:
zoomMenu.Append(ZOOM_IN_ID, _("Zoom In"), _("Zooms the document to a larger size"))
wx.EVT_MENU(frame, ZOOM_IN_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, ZOOM_IN_ID, frame.ProcessUpdateUIEvent)
if isWindows:
zoomMenu.Append(ZOOM_OUT_ID, _("Zoom Out\tCtrl+Page Down"), _("Zooms the document to a smaller size"))
else:
zoomMenu.Append(ZOOM_OUT_ID, _("Zoom Out"), _("Zooms the document to a smaller size"))
wx.EVT_MENU(frame, ZOOM_OUT_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, ZOOM_OUT_ID, frame.ProcessUpdateUIEvent)
viewMenu.AppendMenu(ZOOM_ID, _("&Zoom"), zoomMenu)
wx.EVT_UPDATE_UI(frame, ZOOM_ID, frame.ProcessUpdateUIEvent)
formatMenuIndex = menuBar.FindMenu(_("&Format"))
if formatMenuIndex > -1:
formatMenu = menuBar.GetMenu(formatMenuIndex)
else:
formatMenu = wx.Menu()
if not menuBar.FindItemById(CHOOSE_FONT_ID):
formatMenu.Append(CHOOSE_FONT_ID, _("&Font..."), _("Sets the font to use"))
wx.EVT_MENU(frame, CHOOSE_FONT_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, CHOOSE_FONT_ID, frame.ProcessUpdateUIEvent)
if not menuBar.FindItemById(WORD_WRAP_ID):
formatMenu.AppendCheckItem(WORD_WRAP_ID, _("Word Wrap"), _("Wraps text horizontally when checked"))
wx.EVT_MENU(frame, WORD_WRAP_ID, frame.ProcessEvent)
wx.EVT_UPDATE_UI(frame, WORD_WRAP_ID, frame.ProcessUpdateUIEvent)
if formatMenuIndex == -1:
viewMenuIndex = menuBar.FindMenu(_("&View"))
menuBar.Insert(viewMenuIndex + 1, formatMenu, _("&Format"))
# wxBug: wxToolBar::GetToolPos doesn't exist, need it to find cut tool and then insert find in front of it.
toolBar.AddSeparator()
toolBar.AddTool(ZOOM_IN_ID, getZoomInBitmap(), shortHelpString = _("Zoom In"), longHelpString = _("Zooms the document to a larger size"))
toolBar.AddTool(ZOOM_OUT_ID, getZoomOutBitmap(), shortHelpString = _("Zoom Out"), longHelpString = _("Zooms the document to a smaller size"))
toolBar.Realize()
def ProcessUpdateUIEvent(self, event):
id = event.GetId()
if (id == TEXT_ID
or id == VIEW_WHITESPACE_ID
or id == VIEW_EOL_ID
or id == VIEW_INDENTATION_GUIDES_ID
or id == VIEW_RIGHT_EDGE_ID
or id == VIEW_LINE_NUMBERS_ID
or id == ZOOM_ID
or id == ZOOM_NORMAL_ID
or id == ZOOM_IN_ID
or id == ZOOM_OUT_ID
or id == CHOOSE_FONT_ID
or id == WORD_WRAP_ID):
event.Enable(False)
return True
else:
return False
class TextStatusBar(wx.StatusBar):
# wxBug: Would be nice to show num key status in statusbar, but can't figure out how to detect if it is enabled or disabled
def __init__(self, parent, id, style = wx.ST_SIZEGRIP, name = "statusBar"):
wx.StatusBar.__init__(self, parent, id, style, name)
self.SetFieldsCount(4)
self.SetStatusWidths([-1, 50, 50, 55])
def SetInsertMode(self, insert = True):
if insert:
newText = _("Ins")
else:
newText = _("")
if self.GetStatusText(1) != newText: # wxBug: Need to check if the text has changed, otherwise it flickers under win32
self.SetStatusText(newText, 1)
def SetLineNumber(self, lineNumber):
newText = _("Ln %i") % lineNumber
if self.GetStatusText(2) != newText:
self.SetStatusText(newText, 2)
def SetColumnNumber(self, colNumber):
newText = _("Col %i") % colNumber
if self.GetStatusText(3) != newText:
self.SetStatusText(newText, 3)
class TextOptionsPanel(wx.Panel):
def __init__(self, parent, id, configPrefix = "Text", label = "Text", hasWordWrap = True, hasTabs = False, addPage=True, hasFolding=False):
wx.Panel.__init__(self, parent, id)
self._configPrefix = configPrefix
self._hasWordWrap = hasWordWrap
self._hasTabs = hasTabs
self._hasFolding = hasFolding
SPACE = 10
HALF_SPACE = 5
config = wx.ConfigBase_Get()
self._textFont = wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL)
fontData = config.Read(self._configPrefix + "EditorFont", "")
if fontData:
nativeFont = wx.NativeFontInfo()
nativeFont.FromString(fontData)
self._textFont.SetNativeFontInfo(nativeFont)
self._originalTextFont = self._textFont
self._textColor = wx.BLACK
colorData = config.Read(self._configPrefix + "EditorColor", "")
if colorData:
red = int("0x" + colorData[0:2], 16)
green = int("0x" + colorData[2:4], 16)
blue = int("0x" + colorData[4:6], 16)
self._textColor = wx.Color(red, green, blue)
self._originalTextColor = self._textColor
fontLabel = wx.StaticText(self, -1, _("Font:"))
self._sampleTextCtrl = wx.TextCtrl(self, -1, "", size = (125, 21))
self._sampleTextCtrl.SetEditable(False)
chooseFontButton = wx.Button(self, -1, _("Choose Font..."))
wx.EVT_BUTTON(self, chooseFontButton.GetId(), self.OnChooseFont)
if self._hasWordWrap:
self._wordWrapCheckBox = wx.CheckBox(self, -1, _("Wrap words inside text area"))
self._wordWrapCheckBox.SetValue(wx.ConfigBase_Get().ReadInt(self._configPrefix + "EditorWordWrap", False))
self._viewWhitespaceCheckBox = wx.CheckBox(self, -1, _("Show whitespace"))
self._viewWhitespaceCheckBox.SetValue(config.ReadInt(self._configPrefix + "EditorViewWhitespace", False))
self._viewEOLCheckBox = wx.CheckBox(self, -1, _("Show end of line markers"))
self._viewEOLCheckBox.SetValue(config.ReadInt(self._configPrefix + "EditorViewEOL", False))
self._viewIndentationGuideCheckBox = wx.CheckBox(self, -1, _("Show indentation guides"))
self._viewIndentationGuideCheckBox.SetValue(config.ReadInt(self._configPrefix + "EditorViewIndentationGuides", False))
self._viewRightEdgeCheckBox = wx.CheckBox(self, -1, _("Show right edge"))
self._viewRightEdgeCheckBox.SetValue(config.ReadInt(self._configPrefix + "EditorViewRightEdge", False))
self._viewLineNumbersCheckBox = wx.CheckBox(self, -1, _("Show line numbers"))
self._viewLineNumbersCheckBox.SetValue(config.ReadInt(self._configPrefix + "EditorViewLineNumbers", True))
if self._hasFolding:
self._viewFoldingCheckBox = wx.CheckBox(self, -1, _("Show folding"))
self._viewFoldingCheckBox.SetValue(config.ReadInt(self._configPrefix + "EditorViewFolding", True))
if self._hasTabs:
self._hasTabsCheckBox = wx.CheckBox(self, -1, _("Use spaces instead of tabs"))
self._hasTabsCheckBox.SetValue(not wx.ConfigBase_Get().ReadInt(self._configPrefix + "EditorUseTabs", False))
indentWidthLabel = wx.StaticText(self, -1, _("Indent Width:"))
self._indentWidthChoice = wx.Choice(self, -1, choices = ["2", "4", "6", "8", "10"])
self._indentWidthChoice.SetStringSelection(str(config.ReadInt(self._configPrefix + "EditorIndentWidth", 4)))
textPanelBorderSizer = wx.BoxSizer(wx.VERTICAL)
textPanelSizer = wx.BoxSizer(wx.VERTICAL)
textFontSizer = wx.BoxSizer(wx.HORIZONTAL)
textFontSizer.Add(fontLabel, 0, wx.ALIGN_LEFT | wx.RIGHT | wx.TOP, HALF_SPACE)
textFontSizer.Add(self._sampleTextCtrl, 1, wx.ALIGN_LEFT | wx.EXPAND | wx.RIGHT, HALF_SPACE)
textFontSizer.Add(chooseFontButton, 0, wx.ALIGN_RIGHT | wx.LEFT, HALF_SPACE)
textPanelSizer.Add(textFontSizer, 0, wx.ALL|wx.EXPAND, HALF_SPACE)
if self._hasWordWrap:
textPanelSizer.Add(self._wordWrapCheckBox, 0, wx.ALL, HALF_SPACE)
textPanelSizer.Add(self._viewWhitespaceCheckBox, 0, wx.ALL, HALF_SPACE)
textPanelSizer.Add(self._viewEOLCheckBox, 0, wx.ALL, HALF_SPACE)
textPanelSizer.Add(self._viewIndentationGuideCheckBox, 0, wx.ALL, HALF_SPACE)
textPanelSizer.Add(self._viewRightEdgeCheckBox, 0, wx.ALL, HALF_SPACE)
textPanelSizer.Add(self._viewLineNumbersCheckBox, 0, wx.ALL, HALF_SPACE)
if self._hasFolding:
textPanelSizer.Add(self._viewFoldingCheckBox, 0, wx.ALL, HALF_SPACE)
if self._hasTabs:
textPanelSizer.Add(self._hasTabsCheckBox, 0, wx.ALL, HALF_SPACE)
textIndentWidthSizer = wx.BoxSizer(wx.HORIZONTAL)
textIndentWidthSizer.Add(indentWidthLabel, 0, wx.ALIGN_LEFT | wx.RIGHT | wx.TOP, HALF_SPACE)
textIndentWidthSizer.Add(self._indentWidthChoice, 0, wx.ALIGN_LEFT | wx.EXPAND, HALF_SPACE)
textPanelSizer.Add(textIndentWidthSizer, 0, wx.ALL, HALF_SPACE)
textPanelBorderSizer.Add(textPanelSizer, 0, wx.ALL|wx.EXPAND, SPACE)
## styleButton = wx.Button(self, -1, _("Choose Style..."))
## wx.EVT_BUTTON(self, styleButton.GetId(), self.OnChooseStyle)
## textPanelBorderSizer.Add(styleButton, 0, wx.ALL, SPACE)
self.SetSizer(textPanelBorderSizer)
self.UpdateSampleFont()
if addPage:
parent.AddPage(self, _(label))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -