📄 stctexteditor.py
字号:
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._markerCountclass 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 Falseclass 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)) def UpdateSampleFont(self): nativeFont = wx.NativeFontInfo() nativeFont.FromString(self._textFont.GetNativeFontInfoDesc()) font = wx.NullFont font.SetNativeFontInfo(nativeFont) font.SetPointSize(self._sampleTextCtrl.GetFont().GetPointSize()) # Use the standard point size self._sampleTextCtrl.SetFont(font) self._sampleTextCtrl.SetForegroundColour(self._textColor) self._sampleTextCtrl.SetValue(str(self._textFont.GetPointSize()) + _(" pt. ") + self._textFont.GetFaceName()) self._sampleTextCtrl.Refresh() self.Layout()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -