📄 texteditor.py
字号:
#----------------------------------------------------------------------------
# Name: TextEditor.py
# Purpose: Text Editor for pydocview
#
# Author: Peter Yared
#
# Created: 8/15/03
# CVS-ID: $Id: TextEditor.py,v 1.3 2006/04/20 06:25:48 RD Exp $
# Copyright: (c) 2003-2005 ActiveGrid, Inc.
# License: wxWindows License
#----------------------------------------------------------------------------
import wx
import wx.lib.docview
import wx.lib.pydocview
import string
import FindService
_ = wx.GetTranslation
class TextDocument(wx.lib.docview.Document):
def __init__(self):
wx.lib.docview.Document .__init__(self)
self._inModify = False
def SaveObject(self, fileObject):
view = self.GetFirstView()
fileObject.write(view.GetTextCtrl().GetValue())
return True
def LoadObject(self, fileObject):
view = self.GetFirstView()
data = fileObject.read()
view.GetTextCtrl().SetValue(data)
return True
def IsModified(self):
view = self.GetFirstView()
if view and view.GetTextCtrl():
return view.GetTextCtrl().IsModified()
return False
def Modify(self, modify):
if self._inModify:
return
self._inModify = True
view = self.GetFirstView()
if not modify and view and view.GetTextCtrl():
view.GetTextCtrl().DiscardEdits()
wx.lib.docview.Document.Modify(self, modify) # this must called be after the DiscardEdits call above.
self._inModify = False
class TextView(wx.lib.docview.View):
#----------------------------------------------------------------------------
# Overridden methods
#----------------------------------------------------------------------------
def __init__(self):
wx.lib.docview.View.__init__(self)
self._textCtrl = None
self._wordWrap = wx.ConfigBase_Get().ReadInt("TextEditorWordWrap", True)
def OnCreate(self, doc, flags):
frame = wx.GetApp().CreateDocumentFrame(self, doc, flags)
sizer = wx.BoxSizer()
font, color = self._GetFontAndColorFromConfig()
self._textCtrl = self._BuildTextCtrl(frame, font, color = color)
self._textCtrl.Bind(wx.EVT_TEXT, self.OnModify)
sizer.Add(self._textCtrl, 1, wx.EXPAND, 0)
frame.SetSizer(sizer)
frame.Layout()
frame.Show(True)
self.Activate()
return True
def OnModify(self, event):
self.GetDocument().Modify(True)
def _BuildTextCtrl(self, parent, font, color = wx.BLACK, value = "", selection = [0, 0]):
if self._wordWrap:
wordWrapStyle = wx.TE_WORDWRAP
else:
wordWrapStyle = wx.TE_DONTWRAP
textCtrl = wx.TextCtrl(parent, -1, pos = wx.DefaultPosition, size = parent.GetClientSize(), style = wx.TE_MULTILINE | wordWrapStyle)
textCtrl.SetFont(font)
textCtrl.SetForegroundColour(color)
textCtrl.SetValue(value)
return textCtrl
def _GetFontAndColorFromConfig(self):
font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
config = wx.ConfigBase_Get()
fontData = config.Read("TextEditorFont", "")
if fontData:
nativeFont = wx.NativeFontInfo()
nativeFont.FromString(fontData)
font.SetNativeFontInfo(nativeFont)
color = wx.BLACK
colorData = config.Read("TextEditorColor", "")
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 OnCreateCommandProcessor(self):
# Don't create a command processor, it has its own
pass
def OnActivateView(self, activate, activeView, deactiveView):
if activate and self._textCtrl:
# In MDI mode just calling set focus doesn't work and in SDI mode using CallAfter causes an endless loop
if self.GetDocumentManager().GetFlags() & wx.lib.docview.DOC_SDI:
self._textCtrl.SetFocus()
else:
def SetFocusToTextCtrl():
if self._textCtrl: # Need to make sure it is there in case we are in the closeall mode of the MDI window
self._textCtrl.SetFocus()
wx.CallAfter(SetFocusToTextCtrl)
def OnUpdate(self, sender = None, hint = None):
if wx.lib.docview.View.OnUpdate(self, sender, hint):
return
if hint == "Word Wrap":
self.SetWordWrap(wx.ConfigBase_Get().ReadInt("TextEditorWordWrap", True))
elif hint == "Font":
font, color = self._GetFontAndColorFromConfig()
self.SetFont(font, color)
def OnClose(self, deleteWindow = True):
if not wx.lib.docview.View.OnClose(self, deleteWindow):
return False
self.Activate(False)
if deleteWindow and self.GetFrame():
self.GetFrame().Destroy()
return True
# Since ProcessEvent is not virtual, we have to trap the relevant events using this pseudo-ProcessEvent instead of EVT_MENU
def ProcessEvent(self, event):
id = event.GetId()
if id == wx.ID_UNDO:
if not self._textCtrl:
return False
self._textCtrl.Undo()
return True
elif id == wx.ID_REDO:
if not self._textCtrl:
return False
self._textCtrl.Redo()
return True
elif id == wx.ID_CUT:
if not self._textCtrl:
return False
self._textCtrl.Cut()
return True
elif id == wx.ID_COPY:
if not self._textCtrl:
return False
self._textCtrl.Copy()
return True
elif id == wx.ID_PASTE:
if not self._textCtrl:
return False
self._textCtrl.Paste()
return True
elif id == wx.ID_CLEAR:
if not self._textCtrl:
return False
self._textCtrl.Replace(self._textCtrl.GetSelection()[0], self._textCtrl.GetSelection()[1], '')
return True
elif id == wx.ID_SELECTALL:
if not self._textCtrl:
return False
self._textCtrl.SetSelection(-1, -1)
return True
elif id == TextService.CHOOSE_FONT_ID:
if not self._textCtrl:
return False
self.OnChooseFont(event)
return True
elif id == TextService.WORD_WRAP_ID:
if not self._textCtrl:
return False
self.OnWordWrap(event)
return True
elif id == FindService.FindService.FIND_ID:
self.OnFind()
return True
elif id == FindService.FindService.FIND_PREVIOUS_ID:
self.DoFind(forceFindPrevious = True)
return True
elif id == FindService.FindService.FIND_NEXT_ID:
self.DoFind(forceFindNext = True)
return True
elif id == FindService.FindService.REPLACE_ID:
self.OnFind(replace = True)
return True
elif id == FindService.FindService.FINDONE_ID:
self.DoFind()
return True
elif id == FindService.FindService.REPLACEONE_ID:
self.DoFind(replace = True)
return True
elif id == FindService.FindService.REPLACEALL_ID:
self.DoFind(replaceAll = True)
return True
elif id == FindService.FindService.GOTO_LINE_ID:
self.OnGotoLine(event)
return True
else:
return wx.lib.docview.View.ProcessEvent(self, event)
def ProcessUpdateUIEvent(self, event):
if not self._textCtrl:
return False
hasText = len(self._textCtrl.GetValue()) > 0
id = event.GetId()
if id == wx.ID_UNDO:
event.Enable(self._textCtrl.CanUndo())
return True
elif id == wx.ID_REDO:
event.Enable(self._textCtrl.CanRedo())
return True
if id == wx.ID_CUT:
event.Enable(self._textCtrl.CanCut())
return True
elif id == wx.ID_COPY:
event.Enable(self._textCtrl.CanCopy())
return True
elif id == wx.ID_PASTE:
event.Enable(self._textCtrl.CanPaste())
return True
elif id == wx.ID_CLEAR:
event.Enable(self._textCtrl.CanCopy())
return True
elif id == wx.ID_SELECTALL:
event.Enable(hasText)
return True
elif id == TextService.CHOOSE_FONT_ID:
event.Enable(True)
return True
elif id == TextService.WORD_WRAP_ID:
event.Enable(True)
return True
elif id == FindService.FindService.FIND_ID:
event.Enable(hasText)
return True
elif id == FindService.FindService.FIND_PREVIOUS_ID:
event.Enable(hasText and
self._FindServiceHasString() and
self._textCtrl.GetSelection()[0] > 0)
return True
elif id == FindService.FindService.FIND_NEXT_ID:
event.Enable(hasText and
self._FindServiceHasString() and
self._textCtrl.GetSelection()[0] < len(self._textCtrl.GetValue()))
return True
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -