diff options
Diffstat (limited to 'lib/python2.7/site-packages/wx-3.0-msw/wx/py/editwindow.py')
-rw-r--r-- | lib/python2.7/site-packages/wx-3.0-msw/wx/py/editwindow.py | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/wx-3.0-msw/wx/py/editwindow.py b/lib/python2.7/site-packages/wx-3.0-msw/wx/py/editwindow.py new file mode 100644 index 0000000..dadd003 --- /dev/null +++ b/lib/python2.7/site-packages/wx-3.0-msw/wx/py/editwindow.py @@ -0,0 +1,297 @@ +"""EditWindow class.""" + +__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>" +__cvsid__ = "$Id$" +__revision__ = "$Revision$"[11:-2] + +import wx +from wx import stc + +import keyword +import os +import sys +import time + +import dispatcher +from version import VERSION + + +if 'wxMSW' in wx.PlatformInfo: + FACES = { 'times' : 'Times New Roman', + 'mono' : 'Courier New', + 'helv' : 'Arial', + 'lucida' : 'Lucida Console', + 'other' : 'Comic Sans MS', + 'size' : 10, + 'lnsize' : 8, + 'backcol' : '#FFFFFF', + 'calltipbg' : '#FFFFB8', + 'calltipfg' : '#404040', + } + +elif 'wxGTK' in wx.PlatformInfo and ('gtk2' in wx.PlatformInfo or + 'gtk3' in wx.PlatformInfo): + FACES = { 'times' : 'Serif', + 'mono' : 'Monospace', + 'helv' : 'Sans', + 'other' : 'new century schoolbook', + 'size' : 10, + 'lnsize' : 9, + 'backcol' : '#FFFFFF', + 'calltipbg' : '#FFFFB8', + 'calltipfg' : '#404040', + } + +elif 'wxMac' in wx.PlatformInfo: + FACES = { 'times' : 'Lucida Grande', + 'mono' : 'Monaco', + 'helv' : 'Geneva', + 'other' : 'new century schoolbook', + 'size' : 12, + 'lnsize' : 10, + 'backcol' : '#FFFFFF', + 'calltipbg' : '#FFFFB8', + 'calltipfg' : '#404040', + } + +else: # GTK1, etc. + FACES = { 'times' : 'Times', + 'mono' : 'Courier', + 'helv' : 'Helvetica', + 'other' : 'new century schoolbook', + 'size' : 12, + 'lnsize' : 10, + 'backcol' : '#FFFFFF', + 'calltipbg' : '#FFFFB8', + 'calltipfg' : '#404040', + } + + +class EditWindow(stc.StyledTextCtrl): + """EditWindow based on StyledTextCtrl.""" + + revision = __revision__ + + def __init__(self, parent, id=-1, pos=wx.DefaultPosition, + size=wx.DefaultSize, style=wx.CLIP_CHILDREN | wx.SUNKEN_BORDER): + """Create EditWindow instance.""" + stc.StyledTextCtrl.__init__(self, parent, id, pos, size, style) + self.__config() + stc.EVT_STC_UPDATEUI(self, id, self.OnUpdateUI) + dispatcher.connect(receiver=self._fontsizer, signal='FontIncrease') + dispatcher.connect(receiver=self._fontsizer, signal='FontDecrease') + dispatcher.connect(receiver=self._fontsizer, signal='FontDefault') + + def _fontsizer(self, signal): + """Receiver for Font* signals.""" + size = self.GetZoom() + if signal == 'FontIncrease': + size += 1 + elif signal == 'FontDecrease': + size -= 1 + elif signal == 'FontDefault': + size = 0 + self.SetZoom(size) + + + def __config(self): + self.setDisplayLineNumbers(False) + + self.SetLexer(stc.STC_LEX_PYTHON) + self.SetKeyWords(0, ' '.join(keyword.kwlist)) + + self.setStyles(FACES) + self.SetViewWhiteSpace(False) + self.SetTabWidth(4) + self.SetUseTabs(False) + # Do we want to automatically pop up command completion options? + self.autoComplete = True + self.autoCompleteIncludeMagic = True + self.autoCompleteIncludeSingle = True + self.autoCompleteIncludeDouble = True + self.autoCompleteCaseInsensitive = True + self.AutoCompSetIgnoreCase(self.autoCompleteCaseInsensitive) + self.autoCompleteAutoHide = False + self.AutoCompSetAutoHide(self.autoCompleteAutoHide) + self.AutoCompStops(' .,;:([)]}\'"\\<>%^&+-=*/|`') + # Do we want to automatically pop up command argument help? + self.autoCallTip = True + self.callTipInsert = True + self.CallTipSetBackground(FACES['calltipbg']) + self.CallTipSetForeground(FACES['calltipfg']) + self.SetWrapMode(False) + try: + self.SetEndAtLastLine(False) + except AttributeError: + pass + + def setDisplayLineNumbers(self, state): + self.lineNumbers = state + if state: + self.SetMarginType(1, stc.STC_MARGIN_NUMBER) + self.SetMarginWidth(1, 40) + else: + # Leave a small margin so the feature hidden lines marker can be seen + self.SetMarginType(1, 0) + self.SetMarginWidth(1, 10) + + def setStyles(self, faces): + """Configure font size, typeface and color for lexer.""" + + # Default style + self.StyleSetSpec(stc.STC_STYLE_DEFAULT, + "face:%(mono)s,size:%(size)d,back:%(backcol)s" % \ + faces) + + self.StyleClearAll() + self.SetSelForeground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)) + self.SetSelBackground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)) + + # Built in styles + self.StyleSetSpec(stc.STC_STYLE_LINENUMBER, + "back:#C0C0C0,face:%(mono)s,size:%(lnsize)d" % FACES) + self.StyleSetSpec(stc.STC_STYLE_CONTROLCHAR, + "face:%(mono)s" % faces) + self.StyleSetSpec(stc.STC_STYLE_BRACELIGHT, + "fore:#0000FF,back:#FFFF88") + self.StyleSetSpec(stc.STC_STYLE_BRACEBAD, + "fore:#FF0000,back:#FFFF88") + + # Python styles + self.StyleSetSpec(stc.STC_P_DEFAULT, + "face:%(mono)s" % faces) + self.StyleSetSpec(stc.STC_P_COMMENTLINE, + "fore:#007F00,face:%(mono)s" % faces) + self.StyleSetSpec(stc.STC_P_NUMBER, + "") + self.StyleSetSpec(stc.STC_P_STRING, + "fore:#7F007F,face:%(mono)s" % faces) + self.StyleSetSpec(stc.STC_P_CHARACTER, + "fore:#7F007F,face:%(mono)s" % faces) + self.StyleSetSpec(stc.STC_P_WORD, + "fore:#00007F,bold") + self.StyleSetSpec(stc.STC_P_TRIPLE, + "fore:#7F0000") + self.StyleSetSpec(stc.STC_P_TRIPLEDOUBLE, + "fore:#000033,back:#FFFFE8") + self.StyleSetSpec(stc.STC_P_CLASSNAME, + "fore:#0000FF,bold") + self.StyleSetSpec(stc.STC_P_DEFNAME, + "fore:#007F7F,bold") + self.StyleSetSpec(stc.STC_P_OPERATOR, + "") + self.StyleSetSpec(stc.STC_P_IDENTIFIER, + "") + self.StyleSetSpec(stc.STC_P_COMMENTBLOCK, + "fore:#7F7F7F") + self.StyleSetSpec(stc.STC_P_STRINGEOL, + "fore:#000000,face:%(mono)s,back:#E0C0E0,eolfilled" % faces) + + def OnUpdateUI(self, event): + """Check for matching braces.""" + # If the auto-complete window is up let it do its thing. + if self.AutoCompActive() or self.CallTipActive(): + return + braceAtCaret = -1 + braceOpposite = -1 + charBefore = None + caretPos = self.GetCurrentPos() + if caretPos > 0: + charBefore = self.GetCharAt(caretPos - 1) + styleBefore = self.GetStyleAt(caretPos - 1) + + # Check before. + if charBefore and chr(charBefore) in '[]{}()' \ + and styleBefore == stc.STC_P_OPERATOR: + braceAtCaret = caretPos - 1 + + # Check after. + if braceAtCaret < 0: + charAfter = self.GetCharAt(caretPos) + styleAfter = self.GetStyleAt(caretPos) + if charAfter and chr(charAfter) in '[]{}()' \ + and styleAfter == stc.STC_P_OPERATOR: + braceAtCaret = caretPos + + if braceAtCaret >= 0: + braceOpposite = self.BraceMatch(braceAtCaret) + + if braceAtCaret != -1 and braceOpposite == -1: + self.BraceBadLight(braceAtCaret) + else: + self.BraceHighlight(braceAtCaret, braceOpposite) + + def CanCopy(self): + """Return True if text is selected and can be copied.""" + return self.GetSelectionStart() != self.GetSelectionEnd() + + def CanCut(self): + """Return True if text is selected and can be cut.""" + return self.CanCopy() and self.CanEdit() + + def CanEdit(self): + """Return True if editing should succeed.""" + return not self.GetReadOnly() + + def CanPaste(self): + """Return True if pasting should succeed.""" + return stc.StyledTextCtrl.CanPaste(self) and self.CanEdit() + + + def GetLastPosition(self): + return self.GetLength() + + def GetRange(self, start, end): + return self.GetTextRange(start, end) + + def GetSelection(self): + return self.GetAnchor(), self.GetCurrentPos() + + def ShowPosition(self, pos): + line = self.LineFromPosition(pos) + #self.EnsureVisible(line) + self.GotoLine(line) + + def DoFindNext(self, findData, findDlg=None): + backward = not (findData.GetFlags() & wx.FR_DOWN) + matchcase = (findData.GetFlags() & wx.FR_MATCHCASE) != 0 + end = self.GetLastPosition() + # Changed to reflect the fact that StyledTextControl is in UTF-8 encoding + textstring = self.GetRange(0, end).encode('utf-8') + findstring = findData.GetFindString().encode('utf-8') + if not matchcase: + textstring = textstring.lower() + findstring = findstring.lower() + if backward: + start = self.GetSelection()[0] + loc = textstring.rfind(findstring, 0, start) + else: + start = self.GetSelection()[1] + loc = textstring.find(findstring, start) + + # if it wasn't found then restart at begining + if loc == -1 and start != 0: + if backward: + start = end + loc = textstring.rfind(findstring, 0, start) + else: + start = 0 + loc = textstring.find(findstring, start) + + # was it still not found? + if loc == -1: + dlg = wx.MessageDialog(self, 'Unable to find the search text.', + 'Not found!', + wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + if findDlg: + if loc == -1: + wx.CallAfter(findDlg.SetFocus) + return + else: + findDlg.Close() + + # show and select the found text + self.ShowPosition(loc) + self.SetSelection(loc, loc + len(findstring)) |