New Features: In Tab-View mode, Ctrl-number will take the user to
    the numbered tab view.  Modified files now show an '*' astrisk in
    the view title.  Debugger framework can now support PHP debugging.
    Not important for python development, but at least that means the
    debugger framework is more generalized.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38852 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
	
		
			
				
	
	
		
			560 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			560 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #----------------------------------------------------------------------------
 | |
| # Name:         TextEditor.py
 | |
| # Purpose:      Text Editor for pydocview
 | |
| #
 | |
| # Author:       Peter Yared
 | |
| #
 | |
| # Created:      8/15/03
 | |
| # CVS-ID:       $Id$
 | |
| # 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
 | |
|         elif id == FindService.FindService.REPLACE_ID:
 | |
|             event.Enable(hasText)
 | |
|             return True
 | |
|         elif id == FindService.FindService.GOTO_LINE_ID:
 | |
|             event.Enable(True)
 | |
|             return True
 | |
|         else:
 | |
|             return wx.lib.docview.View.ProcessUpdateUIEvent(self, event)
 | |
| 
 | |
| 
 | |
|     #----------------------------------------------------------------------------
 | |
|     # Methods for TextDocument to call
 | |
|     #----------------------------------------------------------------------------
 | |
| 
 | |
|     def GetTextCtrl(self):
 | |
|         return self._textCtrl
 | |
| 
 | |
| 
 | |
|     #----------------------------------------------------------------------------
 | |
|     # Format methods
 | |
|     #----------------------------------------------------------------------------
 | |
| 
 | |
|     def OnChooseFont(self, event):
 | |
|         data = wx.FontData()
 | |
|         data.EnableEffects(True)
 | |
|         data.SetInitialFont(self._textCtrl.GetFont())
 | |
|         data.SetColour(self._textCtrl.GetForegroundColour())
 | |
|         fontDialog = wx.FontDialog(self.GetFrame(), data)
 | |
|         if fontDialog.ShowModal() == wx.ID_OK:
 | |
|             data = fontDialog.GetFontData()
 | |
|             self.SetFont(data.GetChosenFont(), data.GetColour())
 | |
|         fontDialog.Destroy()
 | |
| 
 | |
| 
 | |
|     def SetFont(self, font, color):
 | |
|         self._textCtrl.SetFont(font)
 | |
|         self._textCtrl.SetForegroundColour(color)
 | |
|         self._textCtrl.Refresh()
 | |
|         self._textCtrl.Layout()
 | |
| 
 | |
| 
 | |
|     def OnWordWrap(self, event):
 | |
|         self.SetWordWrap(not self.GetWordWrap())
 | |
| 
 | |
| 
 | |
|     def GetWordWrap(self):
 | |
|         return self._wordWrap
 | |
| 
 | |
| 
 | |
|     def SetWordWrap(self, wordWrap = True):
 | |
|         self._wordWrap = wordWrap
 | |
|         temp = self._textCtrl
 | |
|         self._textCtrl = self._BuildTextCtrl(temp.GetParent(),
 | |
|                                              font = temp.GetFont(),
 | |
|                                              color = temp.GetForegroundColour(),
 | |
|                                              value = temp.GetValue(),
 | |
|                                              selection = temp.GetSelection())
 | |
|         self.GetDocument().Modify(temp.IsModified())
 | |
|         temp.Destroy()
 | |
| 
 | |
| 
 | |
|     #----------------------------------------------------------------------------
 | |
|     # Find methods
 | |
|     #----------------------------------------------------------------------------
 | |
| 
 | |
|     def OnFind(self, replace = False):
 | |
|         findService = wx.GetApp().GetService(FindService.FindService)
 | |
|         if findService:
 | |
|             findService.ShowFindReplaceDialog(findString = self._textCtrl.GetStringSelection(), replace = replace)
 | |
| 
 | |
| 
 | |
|     def DoFind(self, forceFindNext = False, forceFindPrevious = False, replace = False, replaceAll = False):
 | |
|         findService = wx.GetApp().GetService(FindService.FindService)
 | |
|         if not findService:
 | |
|             return
 | |
|         findString = findService.GetFindString()
 | |
|         if len(findString) == 0:
 | |
|             return -1
 | |
|         replaceString = findService.GetReplaceString()
 | |
|         flags = findService.GetFlags()
 | |
|         startLoc, endLoc = self._textCtrl.GetSelection()
 | |
| 
 | |
|         wholeWord = flags & wx.FR_WHOLEWORD > 0
 | |
|         matchCase = flags & wx.FR_MATCHCASE > 0
 | |
|         regExp = flags & FindService.FindService.FR_REGEXP > 0
 | |
|         down = flags & wx.FR_DOWN > 0
 | |
|         wrap = flags & FindService.FindService.FR_WRAP > 0
 | |
| 
 | |
|         if forceFindPrevious:   # this is from function keys, not dialog box
 | |
|             down = False
 | |
|             wrap = False        # user would want to know they're at the end of file
 | |
|         elif forceFindNext:
 | |
|             down = True
 | |
|             wrap = False        # user would want to know they're at the end of file
 | |
| 
 | |
|         # On replace dialog operations, user is allowed to replace the currently highlighted text to determine if it should be replaced or not.
 | |
|         # Typically, it is the text from a previous find operation, but we must check to see if it isn't, user may have moved the cursor or selected some other text accidentally.
 | |
|         # If the text is a match, then replace it.
 | |
|         if replace:
 | |
|             result, start, end, replText = findService.DoFind(findString, replaceString, self._textCtrl.GetStringSelection(), 0, 0, True, matchCase, wholeWord, regExp, replace)
 | |
|             if result > 0:
 | |
|                 self._textCtrl.Replace(startLoc, endLoc, replaceString)
 | |
|                 self.GetDocument().Modify(True)
 | |
|                 wx.GetApp().GetTopWindow().PushStatusText(_("1 occurrence of \"%s\" replaced") % findString)
 | |
|                 if down:
 | |
|                     startLoc += len(replText)  # advance start location past replacement string to new text
 | |
|                 endLoc = startLoc
 | |
| 
 | |
|         text = self._textCtrl.GetValue()
 | |
|         if wx.Platform == "__WXMSW__":
 | |
|             text = string.replace(text, '\n', '\r\n')
 | |
| 
 | |
|         # Find the next matching text occurance or if it is a ReplaceAll, replace all occurances
 | |
|         # Even if the user is Replacing, we should replace here, but only select the text and let the user replace it with the next Replace operation
 | |
|         result, start, end, text = findService.DoFind(findString, replaceString, text, startLoc, endLoc, down, matchCase, wholeWord, regExp, False, replaceAll, wrap)
 | |
|         if result > 0:
 | |
|             self._textCtrl.SetValue(text)
 | |
|             self.GetDocument().Modify(True)
 | |
|             if result == 1:
 | |
|                 wx.GetApp().GetTopWindow().PushStatusText(_("1 occurrence of \"%s\" replaced") % findString)
 | |
|             else:
 | |
|                 wx.GetApp().GetTopWindow().PushStatusText(_("%i occurrences of \"%s\" replaced") % (result, findString))
 | |
|         elif result == 0:
 | |
|             self._textCtrl.SetSelection(start, end)
 | |
|             self._textCtrl.SetFocus()
 | |
|             wx.GetApp().GetTopWindow().PushStatusText(_("Found \"%s\"") % findString)
 | |
|         else:
 | |
|             wx.GetApp().GetTopWindow().PushStatusText(_("Can't find \"%s\"") % findString)
 | |
| 
 | |
| 
 | |
|     def _FindServiceHasString(self):
 | |
|         findService = wx.GetApp().GetService(FindService.FindService)
 | |
|         if not findService or not findService.GetFindString():
 | |
|             return False
 | |
|         return True
 | |
| 
 | |
| 
 | |
|     def OnGotoLine(self, event):
 | |
|         findService = wx.GetApp().GetService(FindService.FindService)
 | |
|         if findService:
 | |
|             line = findService.GetLineNumber(self.GetDocumentManager().FindSuitableParent())
 | |
|             if line > -1:
 | |
|                 pos = self._textCtrl.XYToPosition(0, line - 1)
 | |
|                 self._textCtrl.SetSelection(pos, pos)
 | |
| 
 | |
| 
 | |
| class TextService(wx.lib.pydocview.DocService):
 | |
| 
 | |
| 
 | |
|     WORD_WRAP_ID = wx.NewId()
 | |
|     CHOOSE_FONT_ID = wx.NewId()
 | |
| 
 | |
| 
 | |
|     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
 | |
|         config = wx.ConfigBase_Get()
 | |
| 
 | |
|         formatMenuIndex = menuBar.FindMenu(_("&Format"))
 | |
|         if formatMenuIndex > -1:
 | |
|             formatMenu = menuBar.GetMenu(formatMenuIndex)
 | |
|         else:
 | |
|             formatMenu = wx.Menu()
 | |
|         formatMenu = wx.Menu()
 | |
|         if not menuBar.FindItemById(TextService.WORD_WRAP_ID):
 | |
|             formatMenu.AppendCheckItem(TextService.WORD_WRAP_ID, _("Word Wrap"), _("Wraps text horizontally when checked"))
 | |
|             formatMenu.Check(TextService.WORD_WRAP_ID, config.ReadInt("TextEditorWordWrap", True))
 | |
|             wx.EVT_MENU(frame, TextService.WORD_WRAP_ID, frame.ProcessEvent)
 | |
|             wx.EVT_UPDATE_UI(frame, TextService.WORD_WRAP_ID, frame.ProcessUpdateUIEvent)
 | |
|         if not menuBar.FindItemById(TextService.CHOOSE_FONT_ID):
 | |
|             formatMenu.Append(TextService.CHOOSE_FONT_ID, _("Font..."), _("Sets the font to use"))
 | |
|             wx.EVT_MENU(frame, TextService.CHOOSE_FONT_ID, frame.ProcessEvent)
 | |
|             wx.EVT_UPDATE_UI(frame, TextService.CHOOSE_FONT_ID, frame.ProcessUpdateUIEvent)
 | |
|         if formatMenuIndex == -1:
 | |
|             viewMenuIndex = menuBar.FindMenu(_("&View"))
 | |
|             menuBar.Insert(viewMenuIndex + 1, formatMenu, _("&Format"))
 | |
| 
 | |
| 
 | |
|     def ProcessUpdateUIEvent(self, event):
 | |
|         id = event.GetId()
 | |
|         if id == TextService.CHOOSE_FONT_ID:
 | |
|             event.Enable(False)
 | |
|             return True
 | |
|         elif id == TextService.WORD_WRAP_ID:
 | |
|             event.Enable(False)
 | |
|             return True
 | |
|         else:
 | |
|             return False
 | |
| 
 | |
| 
 | |
| class TextOptionsPanel(wx.Panel):
 | |
| 
 | |
| 
 | |
|     def __init__(self, parent, id):
 | |
|         wx.Panel.__init__(self, parent, id)
 | |
|         SPACE = 10
 | |
|         HALF_SPACE   = 5
 | |
|         config = wx.ConfigBase_Get()
 | |
|         self._textFont = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
 | |
|         fontData = config.Read("TextEditorFont", "")
 | |
|         if fontData:
 | |
|             nativeFont = wx.NativeFontInfo()
 | |
|             nativeFont.FromString(fontData)
 | |
|             self._textFont.SetNativeFontInfo(nativeFont)
 | |
|         self._originalTextFont = self._textFont
 | |
|         self._textColor = 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)
 | |
|             self._textColor = wx.Color(red, green, blue)
 | |
|         self._originalTextColor = self._textColor
 | |
|         parent.AddPage(self, _("Text"))
 | |
|         fontLabel = wx.StaticText(self, -1, _("Font:"))
 | |
|         self._sampleTextCtrl = wx.TextCtrl(self, -1, "", size = (125, -1))
 | |
|         self._sampleTextCtrl.SetEditable(False)
 | |
|         chooseFontButton = wx.Button(self, -1, _("Choose Font..."))
 | |
|         wx.EVT_BUTTON(self, chooseFontButton.GetId(), self.OnChooseFont)
 | |
|         self._wordWrapCheckBox = wx.CheckBox(self, -1, _("Wrap words inside text area"))
 | |
|         self._wordWrapCheckBox.SetValue(wx.ConfigBase_Get().ReadInt("TextEditorWordWrap", True))
 | |
|         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, 0, 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, HALF_SPACE)
 | |
|         textPanelSizer.Add(self._wordWrapCheckBox, 0, wx.ALL, HALF_SPACE)
 | |
|         textPanelBorderSizer.Add(textPanelSizer, 0, wx.ALL, SPACE)
 | |
|         self.SetSizer(textPanelBorderSizer)
 | |
|         self.UpdateSampleFont()
 | |
| 
 | |
| 
 | |
|     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(_("%d pt. %s") % (self._textFont.GetPointSize(), self._textFont.GetFaceName()))
 | |
|         self._sampleTextCtrl.Refresh()
 | |
|         self.Layout()
 | |
| 
 | |
| 
 | |
|     def OnChooseFont(self, event):
 | |
|         data = wx.FontData()
 | |
|         data.EnableEffects(True)
 | |
|         data.SetInitialFont(self._textFont)
 | |
|         data.SetColour(self._textColor)
 | |
|         fontDialog = wx.FontDialog(self, data)
 | |
|         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()
 | |
|         doWordWrapUpdate = config.ReadInt("TextEditorWordWrap", True) != self._wordWrapCheckBox.GetValue()
 | |
|         config.WriteInt("TextEditorWordWrap", self._wordWrapCheckBox.GetValue())
 | |
|         doFontUpdate = self._originalTextFont != self._textFont or self._originalTextColor != self._textColor
 | |
|         config.Write("TextEditorFont", self._textFont.GetNativeFontInfoDesc())
 | |
|         config.Write("TextEditorColor", "%02x%02x%02x" % (self._textColor.Red(), self._textColor.Green(), self._textColor.Blue()))
 | |
|         if doWordWrapUpdate or doFontUpdate:
 | |
|             for document in optionsDialog.GetDocManager().GetDocuments():
 | |
|                 if document.GetDocumentTemplate().GetDocumentType() == TextDocument:
 | |
|                     if doWordWrapUpdate:
 | |
|                         document.UpdateAllViews(hint = "Word Wrap")
 | |
|                     if doFontUpdate:
 | |
|                         document.UpdateAllViews(hint = "Font")
 |