📄 stctexteditor.py
字号:
## def OnChooseStyle(self, event):## import STCStyleEditor## import os## base = os.path.split(__file__)[0]## config = os.path.abspath(os.path.join(base, 'stc-styles.rc.cfg'))## ## dlg = STCStyleEditor.STCStyleEditDlg(None,## 'Python', 'python',## #'HTML', 'html',## #'XML', 'xml',## config)## dlg.CenterOnParent()## try:## dlg.ShowModal()## finally:## dlg.Destroy() def OnChooseFont(self, event): data = wx.FontData() data.EnableEffects(True) data.SetInitialFont(self._textFont) data.SetColour(self._textColor) fontDialog = wx.FontDialog(self, data) fontDialog.CenterOnParent() if fontDialog.ShowModal() == wx.ID_OK: data = fontDialog.GetFontData() self._textFont = data.GetChosenFont() self._textColor = data.GetColour() self.UpdateSampleFont() fontDialog.Destroy() def OnOK(self, optionsDialog): config = wx.ConfigBase_Get() doViewStuffUpdate = config.ReadInt(self._configPrefix + "EditorViewWhitespace", False) != self._viewWhitespaceCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorViewWhitespace", self._viewWhitespaceCheckBox.GetValue()) doViewStuffUpdate = doViewStuffUpdate or config.ReadInt(self._configPrefix + "EditorViewEOL", False) != self._viewEOLCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorViewEOL", self._viewEOLCheckBox.GetValue()) doViewStuffUpdate = doViewStuffUpdate or config.ReadInt(self._configPrefix + "EditorViewIndentationGuides", False) != self._viewIndentationGuideCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorViewIndentationGuides", self._viewIndentationGuideCheckBox.GetValue()) doViewStuffUpdate = doViewStuffUpdate or config.ReadInt(self._configPrefix + "EditorViewRightEdge", False) != self._viewRightEdgeCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorViewRightEdge", self._viewRightEdgeCheckBox.GetValue()) doViewStuffUpdate = doViewStuffUpdate or config.ReadInt(self._configPrefix + "EditorViewLineNumbers", True) != self._viewLineNumbersCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorViewLineNumbers", self._viewLineNumbersCheckBox.GetValue()) if self._hasFolding: doViewStuffUpdate = doViewStuffUpdate or config.ReadInt(self._configPrefix + "EditorViewFolding", True) != self._viewFoldingCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorViewFolding", self._viewFoldingCheckBox.GetValue()) if self._hasWordWrap: doViewStuffUpdate = doViewStuffUpdate or config.ReadInt(self._configPrefix + "EditorWordWrap", False) != self._wordWrapCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorWordWrap", self._wordWrapCheckBox.GetValue()) if self._hasTabs: doViewStuffUpdate = doViewStuffUpdate or not config.ReadInt(self._configPrefix + "EditorUseTabs", True) != self._hasTabsCheckBox.GetValue() config.WriteInt(self._configPrefix + "EditorUseTabs", not self._hasTabsCheckBox.GetValue()) newIndentWidth = int(self._indentWidthChoice.GetStringSelection()) oldIndentWidth = config.ReadInt(self._configPrefix + "EditorIndentWidth", 4) if newIndentWidth != oldIndentWidth: doViewStuffUpdate = True config.WriteInt(self._configPrefix + "EditorIndentWidth", newIndentWidth) doFontUpdate = self._originalTextFont != self._textFont or self._originalTextColor != self._textColor config.Write(self._configPrefix + "EditorFont", self._textFont.GetNativeFontInfoDesc()) config.Write(self._configPrefix + "EditorColor", "%02x%02x%02x" % (self._textColor.Red(), self._textColor.Green(), self._textColor.Blue())) if doViewStuffUpdate or doFontUpdate: for document in optionsDialog.GetDocManager().GetDocuments(): if issubclass(document.GetDocumentTemplate().GetDocumentType(), TextDocument): if doViewStuffUpdate: document.UpdateAllViews(hint = "ViewStuff") if doFontUpdate: document.UpdateAllViews(hint = "Font") def GetIcon(self): return getTextIcon()class TextCtrl(wx.stc.StyledTextCtrl): def __init__(self, parent, id=-1, style=wx.NO_FULL_REPAINT_ON_RESIZE): wx.stc.StyledTextCtrl.__init__(self, parent, id, style=style) if isinstance(parent, wx.gizmos.DynamicSashWindow): self._dynSash = parent self.SetupDSScrollBars() self.Bind(wx.gizmos.EVT_DYNAMIC_SASH_SPLIT, self.OnDSSplit) self.Bind(wx.gizmos.EVT_DYNAMIC_SASH_UNIFY, self.OnDSUnify) self._font = None self._fontColor = None self.SetVisiblePolicy(wx.stc.STC_VISIBLE_STRICT,1) self.CmdKeyClear(wx.stc.STC_KEY_ADD, wx.stc.STC_SCMOD_CTRL) self.CmdKeyClear(wx.stc.STC_KEY_SUBTRACT, wx.stc.STC_SCMOD_CTRL) self.CmdKeyAssign(wx.stc.STC_KEY_PRIOR, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_ZOOMIN) self.CmdKeyAssign(wx.stc.STC_KEY_NEXT, wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_ZOOMOUT) self.Bind(wx.stc.EVT_STC_ZOOM, self.OnUpdateLineNumberMarginWidth) # auto update line num width on zoom wx.EVT_KEY_DOWN(self, self.OnKeyPressed) wx.EVT_KILL_FOCUS(self, self.OnKillFocus) wx.EVT_SET_FOCUS(self, self.OnFocus) self.SetMargins(0,0) self.SetUseTabs(0) self.SetTabWidth(4) self.SetIndent(4) self.SetViewWhiteSpace(False) self.SetEOLMode(wx.stc.STC_EOL_LF) self.SetEdgeMode(wx.stc.STC_EDGE_NONE) self.SetEdgeColumn(78) self.SetMarginType(1, wx.stc.STC_MARGIN_NUMBER) self.SetMarginWidth(1, self.EstimatedLineNumberMarginWidth()) self.UpdateStyles() self.SetCaretForeground("BLACK") self.SetViewDefaults() font, color = self.GetFontAndColorFromConfig() self.SetFont(font) self.SetFontColor(color) self.MarkerDefineDefault() # for multisash initialization if isinstance(parent, wx.lib.multisash.MultiClient): while parent.GetParent(): parent = parent.GetParent() if hasattr(parent, "GetView"): break if hasattr(parent, "GetView"): textEditor = parent.GetView()._textEditor if textEditor: doc = textEditor.GetDocPointer() if doc: self.SetDocPointer(doc) def OnFocus(self, event): # wxBug: On Mac, the STC control may fire a focus/kill focus event # on shutdown even if the control is in an invalid state. So check # before handling the event. if self.IsBeingDeleted(): return self.SetSelBackground(1, "BLUE") self.SetSelForeground(1, "WHITE") if hasattr(self, "_dynSash"): self._dynSash._view.SetCtrl(self) event.Skip() def OnKillFocus(self, event): # wxBug: On Mac, the STC control may fire a focus/kill focus event # on shutdown even if the control is in an invalid state. So check # before handling the event. if self.IsBeingDeleted(): return self.SetSelBackground(0, "BLUE") self.SetSelForeground(0, "WHITE") self.SetSelBackground(1, "#C0C0C0") # Don't set foreground color, use syntax highlighted default colors. event.Skip() def SetViewDefaults(self, configPrefix="Text", hasWordWrap=True, hasTabs=False, hasFolding=False): config = wx.ConfigBase_Get() self.SetViewWhiteSpace(config.ReadInt(configPrefix + "EditorViewWhitespace", False)) self.SetViewEOL(config.ReadInt(configPrefix + "EditorViewEOL", False)) self.SetIndentationGuides(config.ReadInt(configPrefix + "EditorViewIndentationGuides", False)) self.SetViewRightEdge(config.ReadInt(configPrefix + "EditorViewRightEdge", False)) self.SetViewLineNumbers(config.ReadInt(configPrefix + "EditorViewLineNumbers", True)) if hasFolding: self.SetViewFolding(config.ReadInt(configPrefix + "EditorViewFolding", True)) if hasWordWrap: self.SetWordWrap(config.ReadInt(configPrefix + "EditorWordWrap", False)) if hasTabs: # These methods do not exist in STCTextEditor and are meant for subclasses self.SetUseTabs(config.ReadInt(configPrefix + "EditorUseTabs", False)) self.SetIndent(config.ReadInt(configPrefix + "EditorIndentWidth", 4)) self.SetTabWidth(config.ReadInt(configPrefix + "EditorIndentWidth", 4)) else: self.SetUseTabs(True) self.SetIndent(4) self.SetTabWidth(4) def GetDefaultFont(self): """ Subclasses should override this """ return wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL) def GetDefaultColor(self): """ Subclasses should override this """ return wx.BLACK def GetFontAndColorFromConfig(self, configPrefix = "Text"): font = self.GetDefaultFont() config = wx.ConfigBase_Get() fontData = config.Read(configPrefix + "EditorFont", "") if fontData: nativeFont = wx.NativeFontInfo() nativeFont.FromString(fontData) font.SetNativeFontInfo(nativeFont) color = self.GetDefaultColor() colorData = config.Read(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) color = wx.Color(red, green, blue) return font, color def GetFont(self): return self._font def SetFont(self, font): self._font = font self.StyleSetFont(wx.stc.STC_STYLE_DEFAULT, self._font) def GetFontColor(self): return self._fontColor def SetFontColor(self, fontColor = wx.BLACK): self._fontColor = fontColor self.StyleSetForeground(wx.stc.STC_STYLE_DEFAULT, "#%02x%02x%02x" % (self._fontColor.Red(), self._fontColor.Green(), self._fontColor.Blue())) def UpdateStyles(self): self.StyleClearAll() return def EstimatedLineNumberMarginWidth(self): MARGIN = 4 baseNumbers = "000" lineNum = self.GetLineCount() lineNum = lineNum/100 while lineNum >= 10: lineNum = lineNum/10 baseNumbers = baseNumbers + "0" return self.TextWidth(wx.stc.STC_STYLE_LINENUMBER, baseNumbers) + MARGIN def OnUpdateLineNumberMarginWidth(self, event): self.UpdateLineNumberMarginWidth() def UpdateLineNumberMarginWidth(self): if self.GetViewLineNumbers(): self.SetMarginWidth(1, self.EstimatedLineNumberMarginWidth()) def MarkerDefineDefault(self): """ This must be called after the textcontrol is instantiated """ self.MarkerDefine(TextView.MARKER_NUM, wx.stc.STC_MARK_ROUNDRECT, wx.BLACK, wx.BLUE) def OnClear(self): # Used when Delete key is hit. sel = self.GetSelection() # Delete the selection or if no selection, the character after the caret. if sel[0] == sel[1]: self.SetSelection(sel[0], sel[0] + 1) else: # remove any folded lines also. startLine = self.LineFromPosition(sel[0]) endLine = self.LineFromPosition(sel[1]) endLineStart = self.PositionFromLine(endLine) if startLine != endLine and sel[1] - endLineStart == 0: while not self.GetLineVisible(endLine): endLine += 1 self.SetSelectionEnd(self.PositionFromLine(endLine)) self.Clear() def OnPaste(self): # replace any folded lines also. sel = self.GetSelection() startLine = self.LineFromPosition(sel[0]) endLine = self.LineFromPosition(sel[1]) endLineStart = self.PositionFromLine(endLine) if startLine != endLine and sel[1] - endLineStart == 0: while not self.GetLineVisible(endLine): endLine += 1 self.SetSelectionEnd(self.PositionFromLine(endLine)) self.Paste() def OnKeyPressed(self, event): key = event.GetKeyCode() if key == wx.WXK_NUMPAD_ADD: #wxBug: For whatever reason, the key accelerators for numpad add and subtract with modifiers are not working so have to trap them here if event.ControlDown(): self.ToggleFoldAll(expand = True, topLevelOnly = True) elif event.ShiftDown(): self.ToggleFoldAll(expand = True) else: self.ToggleFold(self.GetCurrentLine()) elif key == wx.WXK_NUMPAD_SUBTRACT: if event.ControlDown(): self.ToggleFoldAll(expand = False, topLevelOnly = True) elif event.ShiftDown(): self.ToggleFoldAll(expand = False) else: self.ToggleFold(self.GetCurrentLine())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -