1 """PyAlaCarte and PyAlaMode editors.""" 
   3 __author__ 
= "Patrick K. O'Brien <pobrien@orbtech.com>" 
   5 __revision__ 
= "$Revision$"[11:-2] 
   9 from buffer import Buffer
 
  14 from shell 
import Shell
 
  18 class EditorFrame(frame
.Frame
): 
  19     """Frame containing one editor.""" 
  21     def __init__(self
, parent
=None, id=-1, title
='PyAlaCarte', 
  22                  pos
=wx
.DefaultPosition
, size
=(800, 600),  
  23                  style
=wx
.DEFAULT_FRAME_STYLE | wx
.NO_FULL_REPAINT_ON_RESIZE
, 
  25         """Create EditorFrame instance.""" 
  26         frame
.Frame
.__init
__(self
, parent
, id, title
, pos
, size
, style
) 
  28         self
.buffer = None  # Current buffer. 
  30         self
._defaultText 
= title 
+ ' - the tastiest Python editor.' 
  31         self
._statusText 
= self
._defaultText
 
  32         self
.SetStatusText(self
._statusText
) 
  33         self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
) 
  36             self
.bufferCreate(filename
) 
  39         """Setup prior to first buffer creation. 
  41         Useful for subclasses.""" 
  44     def setEditor(self
, editor
): 
  46         self
.buffer = self
.editor
.buffer 
  47         self
.buffers
[self
.buffer.id] = self
.buffer 
  49     def OnAbout(self
, event
): 
  50         """Display an About window.""" 
  51         title 
= 'About PyAlaCarte' 
  52         text 
= 'Another fine, flaky program.' 
  53         dialog 
= wx
.MessageDialog(self
, text
, title
, 
  54                                   wx
.OK | wx
.ICON_INFORMATION
) 
  58     def OnClose(self
, event
): 
  59         """Event handler for closing.""" 
  60         for buffer in self
.buffers
.values(): 
  62             if buffer.hasChanged(): 
  63                 cancel 
= self
.bufferSuggestSave() 
  64                 if cancel 
and event
.CanVeto(): 
  69     def OnIdle(self
, event
): 
  70         """Event handler for idle time.""" 
  72         if hasattr(self
, 'notebook'): 
  77     def _updateStatus(self
): 
  78         """Show current status information.""" 
  79         if self
.editor 
and hasattr(self
.editor
, 'getStatus'): 
  80             status 
= self
.editor
.getStatus() 
  81             text 
= 'File: %s  |  Line: %d  |  Column: %d' % status
 
  83             text 
= self
._defaultText
 
  84         if text 
!= self
._statusText
: 
  85             self
.SetStatusText(text
) 
  86             self
._statusText 
= text
 
  88     def _updateTabText(self
): 
  89         """Show current buffer information on notebook tab.""" 
  91 ##         notebook = self.notebook 
  92 ##         selection = notebook.GetSelection() 
  93 ##         if selection == -1: 
  95 ##         text = notebook.GetPageText(selection) 
  96 ##         window = notebook.GetPage(selection) 
  97 ##         if window.editor and window.editor.buffer.hasChanged(): 
  98 ##             if text.endswith(suffix): 
 101 ##                 notebook.SetPageText(selection, text + suffix) 
 103 ##             if text.endswith(suffix): 
 104 ##                 notebook.SetPageText(selection, text[:len(suffix)]) 
 106     def _updateTitle(self
): 
 107         """Show current title information.""" 
 108         title 
= self
.GetTitle() 
 109         if self
.bufferHasChanged(): 
 110             if title
.startswith('* '): 
 113                 self
.SetTitle('* ' + title
) 
 115             if title
.startswith('* '): 
 116                 self
.SetTitle(title
[2:]) 
 119         """Return True if there is a current buffer.""" 
 125     def bufferClose(self
): 
 127         if self
.bufferHasChanged(): 
 128             cancel 
= self
.bufferSuggestSave() 
 135     def bufferCreate(self
, filename
=None): 
 136         """Create new buffer.""" 
 139         self
.panel 
= panel 
= wx
.Panel(parent
=self
, id=-1) 
 140         panel
.Bind (wx
.EVT_ERASE_BACKGROUND
, lambda x
: x
)         
 141         editor 
= Editor(parent
=panel
) 
 142         panel
.editor 
= editor
 
 143         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 144         sizer
.Add(editor
.window
, 1, wx
.EXPAND
) 
 145         panel
.SetSizer(sizer
) 
 146         panel
.SetAutoLayout(True) 
 148         buffer.addEditor(editor
) 
 149         buffer.open(filename
) 
 150         self
.setEditor(editor
) 
 151         self
.editor
.setFocus() 
 155     def bufferDestroy(self
): 
 156         """Destroy the current buffer.""" 
 158             for editor 
in self
.buffer.editors
.values(): 
 161             del self
.buffers
[self
.buffer.id] 
 166     def bufferHasChanged(self
): 
 167         """Return True if buffer has changed since last save.""" 
 169             return self
.buffer.hasChanged() 
 174         """Create new buffer.""" 
 175         if self
.bufferHasChanged(): 
 176             cancel 
= self
.bufferSuggestSave() 
 183     def bufferOpen(self
): 
 184         """Open file in buffer.""" 
 185         if self
.bufferHasChanged(): 
 186             cancel 
= self
.bufferSuggestSave() 
 190         if self
.buffer and self
.buffer.doc
.filedir
: 
 191             filedir 
= self
.buffer.doc
.filedir
 
 192         result 
= openSingle(directory
=filedir
) 
 194             self
.bufferCreate(result
.path
) 
 198 ##     def bufferPrint(self): 
 199 ##         """Print buffer.""" 
 202 ##     def bufferRevert(self): 
 203 ##         """Revert buffer to version of file on disk.""" 
 206     def bufferSave(self
): 
 207         """Save buffer to its file.""" 
 208         if self
.buffer.doc
.filepath
: 
 212             cancel 
= self
.bufferSaveAs() 
 215     def bufferSaveAs(self
): 
 216         """Save buffer to a new filename.""" 
 217         if self
.bufferHasChanged() and self
.buffer.doc
.filepath
: 
 218             cancel 
= self
.bufferSuggestSave() 
 222         if self
.buffer and self
.buffer.doc
.filedir
: 
 223             filedir 
= self
.buffer.doc
.filedir
 
 224         result 
= saveSingle(directory
=filedir
) 
 226             self
.buffer.saveAs(result
.path
) 
 232     def bufferSuggestSave(self
): 
 233         """Suggest saving changes.  Return True if user selected Cancel.""" 
 234         result 
= messageDialog(parent
=None, 
 235                                message
='%s has changed.\n' 
 236                                        'Would you like to save it first' 
 237                                        '?' % self
.buffer.name
, 
 238                                title
='Save current file?') 
 240             cancel 
= self
.bufferSave() 
 242             cancel 
= result
.text 
== 'Cancel' 
 245     def updateNamespace(self
): 
 246         """Update the buffer namespace for autocompletion and calltips.""" 
 247         if self
.buffer.updateNamespace(): 
 248             self
.SetStatusText('Namespace updated') 
 250             self
.SetStatusText('Error executing, unable to update namespace') 
 253 class EditorNotebookFrame(EditorFrame
): 
 254     """Frame containing one or more editors in a notebook.""" 
 256     def __init__(self
, parent
=None, id=-1, title
='PyAlaMode', 
 257                  pos
=wx
.DefaultPosition
, size
=(800, 600),  
 258                  style
=wx
.DEFAULT_FRAME_STYLE | wx
.NO_FULL_REPAINT_ON_RESIZE
, 
 260         """Create EditorNotebookFrame instance.""" 
 262         EditorFrame
.__init
__(self
, parent
, id, title
, pos
, 
 263                              size
, style
, filename
) 
 265             dispatcher
.connect(receiver
=self
._editorChange
, 
 266                                signal
='EditorChange', sender
=self
.notebook
) 
 269         """Setup prior to first buffer creation. 
 271         Called automatically by base class during init.""" 
 272         self
.notebook 
= EditorNotebook(parent
=self
) 
 273         intro 
= 'Py %s' % version
.VERSION
 
 275         module 
= imp
.new_module('__main__') 
 277         module
.__dict
__['__builtins__'] = __builtin__
 
 278         namespace 
= module
.__dict
__.copy() 
 279         self
.crust 
= crust
.Crust(parent
=self
.notebook
, intro
=intro
, locals=namespace
) 
 280         self
.shell 
= self
.crust
.shell
 
 281         # Override the filling so that status messages go to the status bar. 
 282         self
.crust
.filling
.tree
.setStatusText 
= self
.SetStatusText
 
 283         # Override the shell so that status messages go to the status bar. 
 284         self
.shell
.setStatusText 
= self
.SetStatusText
 
 285         # Fix a problem with the sash shrinking to nothing. 
 286         self
.crust
.filling
.SetSashPosition(200) 
 287         self
.notebook
.AddPage(page
=self
.crust
, text
='*Shell*', select
=True) 
 288         self
.setEditor(self
.crust
.editor
) 
 289         self
.crust
.editor
.SetFocus() 
 291     def _editorChange(self
, editor
): 
 292         """Editor change signal receiver.""" 
 293         self
.setEditor(editor
) 
 295     def OnAbout(self
, event
): 
 296         """Display an About window.""" 
 297         title 
= 'About PyAlaMode' 
 298         text 
= 'Another fine, flaky program.' 
 299         dialog 
= wx
.MessageDialog(self
, text
, title
, 
 300                                   wx
.OK | wx
.ICON_INFORMATION
) 
 304     def _updateTitle(self
): 
 305         """Show current title information.""" 
 307 ##         title = self.GetTitle() 
 308 ##         if self.bufferHasChanged(): 
 309 ##             if title.startswith('* '): 
 312 ##                 self.SetTitle('* ' + title) 
 314 ##             if title.startswith('* '): 
 315 ##                 self.SetTitle(title[2:]) 
 317     def bufferCreate(self
, filename
=None): 
 318         """Create new buffer.""" 
 320         panel 
= wx
.Panel(parent
=self
.notebook
, id=-1) 
 321         panel
.Bind(wx
.EVT_ERASE_BACKGROUND
, lambda x
: x
)         
 322         editor 
= Editor(parent
=panel
) 
 323         panel
.editor 
= editor
 
 324         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 325         sizer
.Add(editor
.window
, 1, wx
.EXPAND
) 
 326         panel
.SetSizer(sizer
) 
 327         panel
.SetAutoLayout(True) 
 329         buffer.addEditor(editor
) 
 330         buffer.open(filename
) 
 331         self
.setEditor(editor
) 
 332         self
.notebook
.AddPage(page
=panel
, text
=self
.buffer.name
, select
=True) 
 333         self
.editor
.setFocus() 
 335     def bufferDestroy(self
): 
 336         """Destroy the current buffer.""" 
 337         selection 
= self
.notebook
.GetSelection() 
 338 ##         print "Destroy Selection:", selection 
 339         if selection 
> 0:  # Don't destroy the PyCrust tab. 
 341                 del self
.buffers
[self
.buffer.id] 
 342                 self
.buffer = None  # Do this before DeletePage(). 
 343             self
.notebook
.DeletePage(selection
) 
 346         """Create new buffer.""" 
 351     def bufferOpen(self
): 
 352         """Open file in buffer.""" 
 354         if self
.buffer and self
.buffer.doc
.filedir
: 
 355             filedir 
= self
.buffer.doc
.filedir
 
 356         result 
= openMultiple(directory
=filedir
) 
 357         for path 
in result
.paths
: 
 358             self
.bufferCreate(path
) 
 363 class EditorNotebook(wx
.Notebook
): 
 364     """A notebook containing a page for each editor.""" 
 366     def __init__(self
, parent
): 
 367         """Create EditorNotebook instance.""" 
 368         wx
.Notebook
.__init
__(self
, parent
, id=-1, style
=wx
.CLIP_CHILDREN
) 
 369         self
.Bind(wx
.EVT_NOTEBOOK_PAGE_CHANGING
, self
.OnPageChanging
, id=self
.GetId()) 
 370         self
.Bind(wx
.EVT_NOTEBOOK_PAGE_CHANGED
, self
.OnPageChanged
, id=self
.GetId()) 
 371         self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
) 
 373     def OnIdle(self
, event
): 
 374         """Event handler for idle time.""" 
 375         self
._updateTabText
() 
 378     def _updateTabText(self
): 
 379         """Show current buffer display name on all but first tab.""" 
 383         selection 
= self
.GetSelection() 
 386         text 
= self
.GetPageText(selection
) 
 387         window 
= self
.GetPage(selection
) 
 388         if not window
.editor
: 
 390         if text
.endswith(changed
) or text
.endswith(unchanged
): 
 394         if name 
!= window
.editor
.buffer.name
: 
 395             text 
= window
.editor
.buffer.name
 
 396         if window
.editor
.buffer.hasChanged(): 
 397             if text
.endswith(changed
): 
 399             elif text
.endswith(unchanged
): 
 400                 text 
= text
[:-size
] + changed
 
 404             if text
.endswith(changed
): 
 405                 text 
= text
[:-size
] + unchanged
 
 406             elif text
.endswith(unchanged
): 
 411             self
.SetPageText(selection
, text
) 
 412             self
.Refresh()  # Needed on Win98. 
 414     def OnPageChanging(self
, event
): 
 415         """Page changing event handler.""" 
 418     def OnPageChanged(self
, event
): 
 419         """Page changed event handler.""" 
 420         new 
= event
.GetSelection() 
 421         window 
= self
.GetPage(new
) 
 422         dispatcher
.send(signal
='EditorChange', sender
=self
, 
 423                         editor
=window
.editor
) 
 428 class EditorShellNotebookFrame(EditorNotebookFrame
): 
 429     """Frame containing a notebook containing EditorShellNotebooks.""" 
 431     def __init__(self
, parent
=None, id=-1, title
='PyAlaModeTest', 
 432                  pos
=wx
.DefaultPosition
, size
=(600, 400),  
 433                  style
=wx
.DEFAULT_FRAME_STYLE
, 
 434                  filename
=None, singlefile
=False): 
 435         """Create EditorShellNotebookFrame instance.""" 
 436         self
._singlefile 
= singlefile
 
 437         EditorNotebookFrame
.__init
__(self
, parent
, id, title
, pos
, 
 438                                      size
, style
, filename
) 
 441         """Setup prior to first buffer creation. 
 443         Called automatically by base class during init.""" 
 444         if not self
._singlefile
: 
 445             self
.notebook 
= EditorNotebook(parent
=self
) 
 447     def OnAbout(self
, event
): 
 448         """Display an About window.""" 
 449         title 
= 'About PyAlaModePlus' 
 450         text 
= 'Another fine, flaky program.' 
 451         dialog 
= wx
.MessageDialog(self
, text
, title
, 
 452                                   wx
.OK | wx
.ICON_INFORMATION
) 
 456     def bufferCreate(self
, filename
=None): 
 457         """Create new buffer.""" 
 460             notebook 
= EditorShellNotebook(parent
=self
, 
 462             self
.notebook 
= notebook
 
 464             notebook 
= EditorShellNotebook(parent
=self
.notebook
, 
 466         self
.setEditor(notebook
.editor
) 
 467         if not self
._singlefile
: 
 468             self
.notebook
.AddPage(page
=notebook
, text
=self
.buffer.name
, 
 470         self
.editor
.setFocus() 
 472     def bufferDestroy(self
): 
 473         """Destroy the current buffer.""" 
 476             del self
.buffers
[self
.buffer.id] 
 477             self
.buffer = None  # Do this before DeletePage(). 
 479             self
.notebook
.Destroy() 
 482             selection 
= self
.notebook
.GetSelection() 
 483 ##             print "Destroy Selection:", selection 
 484             self
.notebook
.DeletePage(selection
) 
 487         """Create new buffer.""" 
 488         if self
._singlefile 
and self
.bufferHasChanged(): 
 489             cancel 
= self
.bufferSuggestSave() 
 496     def bufferOpen(self
): 
 497         """Open file in buffer.""" 
 498         if self
._singlefile 
and self
.bufferHasChanged(): 
 499             cancel 
= self
.bufferSuggestSave() 
 503         if self
.buffer and self
.buffer.doc
.filedir
: 
 504             filedir 
= self
.buffer.doc
.filedir
 
 506             result 
= openSingle(directory
=filedir
) 
 508                 self
.bufferCreate(result
.path
) 
 510             result 
= openMultiple(directory
=filedir
) 
 511             for path 
in result
.paths
: 
 512                 self
.bufferCreate(path
) 
 517 class EditorShellNotebook(wx
.Notebook
): 
 518     """A notebook containing an editor page and a shell page.""" 
 520     def __init__(self
, parent
, filename
=None): 
 521         """Create EditorShellNotebook instance.""" 
 522         wx
.Notebook
.__init
__(self
, parent
, id=-1) 
 525             editorparent 
= editorpanel 
= wx
.Panel(self
, -1) 
 526             shellparent 
= shellpanel 
= wx
.Panel(self
, -1) 
 530         self
.buffer = Buffer() 
 531         self
.editor 
= Editor(parent
=editorparent
) 
 532         self
.buffer.addEditor(self
.editor
) 
 533         self
.buffer.open(filename
) 
 534         self
.shell 
= Shell(parent
=shellparent
, locals=self
.buffer.interp
.locals, 
 535                            style
=wx
.CLIP_CHILDREN | wx
.SUNKEN_BORDER
) 
 536         self
.buffer.interp
.locals.clear() 
 538             self
.AddPage(page
=editorpanel
, text
='Editor', select
=True) 
 539             self
.AddPage(page
=shellpanel
, text
='Shell') 
 541             editorsizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 542             editorsizer
.Add(self
.editor
.window
, 1, wx
.EXPAND
) 
 543             editorpanel
.SetSizer(editorsizer
) 
 544             editorpanel
.SetAutoLayout(True) 
 545             shellsizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 546             shellsizer
.Add(self
.shell
, 1, wx
.EXPAND
) 
 547             shellpanel
.SetSizer(shellsizer
) 
 548             shellpanel
.SetAutoLayout(True) 
 550             self
.AddPage(page
=self
.editor
.window
, text
='Editor', select
=True) 
 551             self
.AddPage(page
=self
.shell
, text
='Shell') 
 552         self
.editor
.setFocus() 
 553         self
.Bind(wx
.EVT_NOTEBOOK_PAGE_CHANGED
, self
.OnPageChanged
, id=self
.GetId()) 
 555     def OnPageChanged(self
, event
): 
 556         """Page changed event handler.""" 
 557         selection 
= event
.GetSelection() 
 559             self
.editor
.setFocus() 
 561             self
.shell
.SetFocus() 
 565         wx
.Notebook
.SetFocus(self
) 
 566         selection 
= self
.GetSelection() 
 568             self
.editor
.setFocus() 
 570             self
.shell
.SetFocus() 
 574     """Editor having an EditWindow.""" 
 576     def __init__(self
, parent
, id=-1, pos
=wx
.DefaultPosition
, 
 578                  style
=wx
.CLIP_CHILDREN | wx
.SUNKEN_BORDER
): 
 579         """Create Editor instance.""" 
 580         self
.window 
= EditWindow(self
, parent
, id, pos
, size
, style
) 
 581         self
.id = self
.window
.GetId() 
 583         # Assign handlers for keyboard events. 
 584         self
.window
.Bind(wx
.EVT_CHAR
, self
.OnChar
) 
 585         self
.window
.Bind(wx
.EVT_KEY_DOWN
, self
.OnKeyDown
) 
 587     def _setBuffer(self
, buffer, text
): 
 588         """Set the editor to a buffer.  Private callback called by buffer.""" 
 590         self
.autoCompleteKeys 
= buffer.interp
.getAutoCompleteKeys() 
 593         self
.emptyUndoBuffer() 
 597         """Destroy all editor objects.""" 
 598         self
.window
.Destroy() 
 601         self
.window
.ClearAll() 
 603     def emptyUndoBuffer(self
): 
 604         self
.window
.EmptyUndoBuffer() 
 607         """Return (filepath, line, column) status tuple.""" 
 609             pos 
= self
.window
.GetCurrentPos() 
 610             line 
= self
.window
.LineFromPosition(pos
) + 1 
 611             col 
= self
.window
.GetColumn(pos
) 
 613                 name 
= self
.buffer.doc
.filepath 
or self
.buffer.name
 
 616             status 
= (name
, line
, col
) 
 622         """Return contents of editor.""" 
 623         return self
.window
.GetText() 
 625     def hasChanged(self
): 
 626         """Return True if contents have changed.""" 
 627         return self
.window
.GetModify() 
 630         """Set the input focus to the editor window.""" 
 631         self
.window
.SetFocus() 
 633     def setSavePoint(self
): 
 634         self
.window
.SetSavePoint() 
 636     def setText(self
, text
): 
 637         """Set contents of editor.""" 
 638         self
.window
.SetText(text
) 
 640     def OnChar(self
, event
): 
 641         """Keypress event handler. 
 643         Only receives an event if OnKeyDown calls event.Skip() for the 
 644         corresponding event.""" 
 646         key 
= event
.GetKeyCode() 
 647         if key 
in self
.autoCompleteKeys
: 
 648             # Usually the dot (period) key activates auto completion. 
 649             if self
.window
.AutoCompActive():  
 650                 self
.window
.AutoCompCancel() 
 651             self
.window
.ReplaceSelection('') 
 652             self
.window
.AddText(chr(key
)) 
 653             text
, pos 
= self
.window
.GetCurLine() 
 655             if self
.window
.autoComplete
:  
 656                 self
.autoCompleteShow(text
) 
 657         elif key 
== ord('('): 
 658             # The left paren activates a call tip and cancels an 
 659             # active auto completion. 
 660             if self
.window
.AutoCompActive():  
 661                 self
.window
.AutoCompCancel() 
 662             self
.window
.ReplaceSelection('') 
 663             self
.window
.AddText('(') 
 664             text
, pos 
= self
.window
.GetCurLine() 
 666             self
.autoCallTipShow(text
) 
 668             # Allow the normal event handling to take place. 
 671     def OnKeyDown(self
, event
): 
 672         """Key down event handler.""" 
 674         key 
= event
.GetKeyCode() 
 675         # If the auto-complete window is up let it do its thing. 
 676         if self
.window
.AutoCompActive(): 
 679         controlDown 
= event
.ControlDown() 
 680         altDown 
= event
.AltDown() 
 681         shiftDown 
= event
.ShiftDown() 
 682         # Let Ctrl-Alt-* get handled normally. 
 683         if controlDown 
and altDown
: 
 685         # Increase font size. 
 686         elif controlDown 
and key 
in (ord(']'),): 
 687             dispatcher
.send(signal
='FontIncrease') 
 688         # Decrease font size. 
 689         elif controlDown 
and key 
in (ord('['),): 
 690             dispatcher
.send(signal
='FontDecrease') 
 692         elif controlDown 
and key 
in (ord('='),): 
 693             dispatcher
.send(signal
='FontDefault') 
 697     def autoCompleteShow(self
, command
): 
 698         """Display auto-completion popup list.""" 
 699         list = self
.buffer.interp
.getAutoCompleteList(command
,  
 700                     includeMagic
=self
.window
.autoCompleteIncludeMagic
,  
 701                     includeSingle
=self
.window
.autoCompleteIncludeSingle
,  
 702                     includeDouble
=self
.window
.autoCompleteIncludeDouble
) 
 704             options 
= ' '.join(list) 
 706             self
.window
.AutoCompShow(offset
, options
) 
 708     def autoCallTipShow(self
, command
): 
 709         """Display argument spec and docstring in a popup window.""" 
 710         if self
.window
.CallTipActive(): 
 711             self
.window
.CallTipCancel() 
 712         (name
, argspec
, tip
) = self
.buffer.interp
.getCallTip(command
) 
 714             dispatcher
.send(signal
='Shell.calltip', sender
=self
, calltip
=tip
) 
 715         if not self
.window
.autoCallTip
: 
 718             startpos 
= self
.window
.GetCurrentPos() 
 719             self
.window
.AddText(argspec 
+ ')') 
 720             endpos 
= self
.window
.GetCurrentPos() 
 721             self
.window
.SetSelection(endpos
, startpos
) 
 723             curpos 
= self
.window
.GetCurrentPos() 
 725             tippos 
= curpos 
- (size 
+ 1) 
 726             fallback 
= curpos 
- self
.window
.GetColumn(curpos
) 
 727             # In case there isn't enough room, only go back to the 
 729             tippos 
= max(tippos
, fallback
) 
 730             self
.window
.CallTipShow(tippos
, tip
) 
 731             self
.window
.CallTipSetHighlight(0, size
) 
 734 class EditWindow(editwindow
.EditWindow
): 
 735     """EditWindow based on StyledTextCtrl.""" 
 737     def __init__(self
, editor
, parent
, id=-1, pos
=wx
.DefaultPosition
, 
 739                  style
=wx
.CLIP_CHILDREN | wx
.SUNKEN_BORDER
): 
 740         """Create EditWindow instance.""" 
 741         editwindow
.EditWindow
.__init
__(self
, parent
, id, pos
, size
, style
) 
 746     """DialogResults class.""" 
 748     def __init__(self
, returned
): 
 749         """Create wrapper for results returned by dialog.""" 
 750         self
.returned 
= returned
 
 751         self
.positive 
= returned 
in (wx
.ID_OK
, wx
.ID_YES
) 
 752         self
.text 
= self
._asString
() 
 756         return str(self
.__dict
__) 
 759         returned 
= self
.returned
 
 760         if returned 
== wx
.ID_OK
: 
 762         elif returned 
== wx
.ID_CANCEL
: 
 764         elif returned 
== wx
.ID_YES
: 
 766         elif returned 
== wx
.ID_NO
: 
 770 def fileDialog(parent
=None, title
='Open', directory
='', filename
='', 
 771                wildcard
='All Files (*.*)|*.*', 
 772                style
=wx
.OPEN | wx
.MULTIPLE
): 
 773     """File dialog wrapper function.""" 
 774     dialog 
= wx
.FileDialog(parent
, title
, directory
, filename
, 
 776     result 
= DialogResults(dialog
.ShowModal()) 
 778         result
.paths 
= dialog
.GetPaths() 
 785 def openSingle(parent
=None, title
='Open', directory
='', filename
='', 
 786                wildcard
='All Files (*.*)|*.*', style
=wx
.OPEN
): 
 787     """File dialog wrapper function.""" 
 788     dialog 
= wx
.FileDialog(parent
, title
, directory
, filename
, 
 790     result 
= DialogResults(dialog
.ShowModal()) 
 792         result
.path 
= dialog
.GetPath() 
 799 def openMultiple(parent
=None, title
='Open', directory
='', filename
='', 
 800                  wildcard
='All Files (*.*)|*.*', 
 801                  style
=wx
.OPEN | wx
.MULTIPLE
): 
 802     """File dialog wrapper function.""" 
 803     return fileDialog(parent
, title
, directory
, filename
, wildcard
, style
) 
 806 def saveSingle(parent
=None, title
='Save', directory
='', filename
='', 
 807                wildcard
='All Files (*.*)|*.*', 
 808                style
=wx
.SAVE | wx
.OVERWRITE_PROMPT
): 
 809     """File dialog wrapper function.""" 
 810     dialog 
= wx
.FileDialog(parent
, title
, directory
, filename
, 
 812     result 
= DialogResults(dialog
.ShowModal()) 
 814         result
.path 
= dialog
.GetPath() 
 821 def directory(parent
=None, message
='Choose a directory', path
='', style
=0, 
 822               pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
): 
 823     """Dir dialog wrapper function.""" 
 824     dialog 
= wx
.DirDialog(parent
, message
, path
, style
, pos
, size
) 
 825     result 
= DialogResults(dialog
.ShowModal()) 
 827         result
.path 
= dialog
.GetPath() 
 834 def messageDialog(parent
=None, message
='', title
='Message box', 
 835                   style
=wx
.YES_NO | wx
.CANCEL | wx
.CENTRE | wx
.ICON_QUESTION
, 
 836                   pos
=wx
.DefaultPosition
): 
 837     """Message dialog wrapper function.""" 
 838     dialog 
= wx
.MessageDialog(parent
, message
, title
, style
, pos
) 
 839     result 
= DialogResults(dialog
.ShowModal())