home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / wx / py / editor.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  23.9 KB  |  777 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
  5. __cvsid__ = '$Id: editor.py 41077 2006-09-08 20:09:27Z RD $'
  6. __revision__ = '$Revision: 41077 $'[11:-2]
  7. import wx
  8. from buffer import Buffer
  9. import crust
  10. import dispatcher
  11. import editwindow
  12. import frame
  13. from shell import Shell
  14. import version
  15.  
  16. class EditorFrame(frame.Frame):
  17.     
  18.     def __init__(self, parent = None, id = -1, title = 'PyAlaCarte', pos = wx.DefaultPosition, size = (800, 600), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE, filename = None):
  19.         frame.Frame.__init__(self, parent, id, title, pos, size, style)
  20.         self.buffers = { }
  21.         self.buffer = None
  22.         self.editor = None
  23.         self._defaultText = title + ' - the tastiest Python editor.'
  24.         self._statusText = self._defaultText
  25.         self.SetStatusText(self._statusText)
  26.         self.Bind(wx.EVT_IDLE, self.OnIdle)
  27.         self._setup()
  28.         if filename:
  29.             self.bufferCreate(filename)
  30.         
  31.  
  32.     
  33.     def _setup(self):
  34.         pass
  35.  
  36.     
  37.     def setEditor(self, editor):
  38.         self.editor = editor
  39.         self.buffer = self.editor.buffer
  40.         self.buffers[self.buffer.id] = self.buffer
  41.  
  42.     
  43.     def OnAbout(self, event):
  44.         title = 'About PyAlaCarte'
  45.         text = 'Another fine, flaky program.'
  46.         dialog = wx.MessageDialog(self, text, title, wx.OK | wx.ICON_INFORMATION)
  47.         dialog.ShowModal()
  48.         dialog.Destroy()
  49.  
  50.     
  51.     def OnClose(self, event):
  52.         for buffer in self.buffers.values():
  53.             self.buffer = buffer
  54.             if buffer.hasChanged():
  55.                 cancel = self.bufferSuggestSave()
  56.                 if cancel and event.CanVeto():
  57.                     event.Veto()
  58.                     return None
  59.                 
  60.             event.CanVeto()
  61.         
  62.         self.Destroy()
  63.  
  64.     
  65.     def OnIdle(self, event):
  66.         self._updateStatus()
  67.         if hasattr(self, 'notebook'):
  68.             self._updateTabText()
  69.         
  70.         self._updateTitle()
  71.         event.Skip()
  72.  
  73.     
  74.     def _updateStatus(self):
  75.         if self.editor and hasattr(self.editor, 'getStatus'):
  76.             status = self.editor.getStatus()
  77.             text = 'File: %s  |  Line: %d  |  Column: %d' % status
  78.         else:
  79.             text = self._defaultText
  80.         if text != self._statusText:
  81.             self.SetStatusText(text)
  82.             self._statusText = text
  83.         
  84.  
  85.     
  86.     def _updateTabText(self):
  87.         pass
  88.  
  89.     
  90.     def _updateTitle(self):
  91.         title = self.GetTitle()
  92.         if self.bufferHasChanged():
  93.             if title.startswith('* '):
  94.                 pass
  95.             else:
  96.                 self.SetTitle('* ' + title)
  97.         elif title.startswith('* '):
  98.             self.SetTitle(title[2:])
  99.         
  100.  
  101.     
  102.     def hasBuffer(self):
  103.         if self.buffer:
  104.             return True
  105.         else:
  106.             return False
  107.  
  108.     
  109.     def bufferClose(self):
  110.         if self.bufferHasChanged():
  111.             cancel = self.bufferSuggestSave()
  112.             if cancel:
  113.                 return cancel
  114.             
  115.         
  116.         self.bufferDestroy()
  117.         cancel = False
  118.         return cancel
  119.  
  120.     
  121.     def bufferCreate(self, filename = None):
  122.         self.bufferDestroy()
  123.         buffer = Buffer()
  124.         self.panel = panel = wx.Panel(parent = self, id = -1)
  125.         panel.Bind(wx.EVT_ERASE_BACKGROUND, (lambda x: x))
  126.         editor = Editor(parent = panel)
  127.         panel.editor = editor
  128.         sizer = wx.BoxSizer(wx.VERTICAL)
  129.         sizer.Add(editor.window, 1, wx.EXPAND)
  130.         panel.SetSizer(sizer)
  131.         panel.SetAutoLayout(True)
  132.         sizer.Layout()
  133.         buffer.addEditor(editor)
  134.         buffer.open(filename)
  135.         self.setEditor(editor)
  136.         self.editor.setFocus()
  137.         self.SendSizeEvent()
  138.  
  139.     
  140.     def bufferDestroy(self):
  141.         if self.buffer:
  142.             for editor in self.buffer.editors.values():
  143.                 editor.destroy()
  144.             
  145.             self.editor = None
  146.             del self.buffers[self.buffer.id]
  147.             self.buffer = None
  148.             self.panel.Destroy()
  149.         
  150.  
  151.     
  152.     def bufferHasChanged(self):
  153.         if self.buffer:
  154.             return self.buffer.hasChanged()
  155.         else:
  156.             return False
  157.  
  158.     
  159.     def bufferNew(self):
  160.         if self.bufferHasChanged():
  161.             cancel = self.bufferSuggestSave()
  162.             if cancel:
  163.                 return cancel
  164.             
  165.         
  166.         self.bufferCreate()
  167.         cancel = False
  168.         return cancel
  169.  
  170.     
  171.     def bufferOpen(self):
  172.         if self.bufferHasChanged():
  173.             cancel = self.bufferSuggestSave()
  174.             if cancel:
  175.                 return cancel
  176.             
  177.         
  178.         filedir = ''
  179.         if self.buffer and self.buffer.doc.filedir:
  180.             filedir = self.buffer.doc.filedir
  181.         
  182.         result = openSingle(directory = filedir)
  183.         if result.path:
  184.             self.bufferCreate(result.path)
  185.         
  186.         cancel = False
  187.         return cancel
  188.  
  189.     
  190.     def bufferSave(self):
  191.         if self.buffer.doc.filepath:
  192.             self.buffer.save()
  193.             cancel = False
  194.         else:
  195.             cancel = self.bufferSaveAs()
  196.         return cancel
  197.  
  198.     
  199.     def bufferSaveAs(self):
  200.         if self.bufferHasChanged() and self.buffer.doc.filepath:
  201.             cancel = self.bufferSuggestSave()
  202.             if cancel:
  203.                 return cancel
  204.             
  205.         
  206.         filedir = ''
  207.         if self.buffer and self.buffer.doc.filedir:
  208.             filedir = self.buffer.doc.filedir
  209.         
  210.         result = saveSingle(directory = filedir)
  211.         if result.path:
  212.             self.buffer.saveAs(result.path)
  213.             cancel = False
  214.         else:
  215.             cancel = True
  216.         return cancel
  217.  
  218.     
  219.     def bufferSuggestSave(self):
  220.         result = messageDialog(parent = None, message = '%s has changed.\nWould you like to save it first?' % self.buffer.name, title = 'Save current file?')
  221.         if result.positive:
  222.             cancel = self.bufferSave()
  223.         else:
  224.             cancel = result.text == 'Cancel'
  225.         return cancel
  226.  
  227.     
  228.     def updateNamespace(self):
  229.         if self.buffer.updateNamespace():
  230.             self.SetStatusText('Namespace updated')
  231.         else:
  232.             self.SetStatusText('Error executing, unable to update namespace')
  233.  
  234.  
  235.  
  236. class EditorNotebookFrame(EditorFrame):
  237.     
  238.     def __init__(self, parent = None, id = -1, title = 'PyAlaMode', pos = wx.DefaultPosition, size = (800, 600), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE, filename = None):
  239.         self.notebook = None
  240.         EditorFrame.__init__(self, parent, id, title, pos, size, style, filename)
  241.         if self.notebook:
  242.             dispatcher.connect(receiver = self._editorChange, signal = 'EditorChange', sender = self.notebook)
  243.         
  244.  
  245.     
  246.     def _setup(self):
  247.         self.notebook = EditorNotebook(parent = self)
  248.         intro = 'Py %s' % version.VERSION
  249.         import imp
  250.         module = imp.new_module('__main__')
  251.         import __builtin__
  252.         module.__dict__['__builtins__'] = __builtin__
  253.         namespace = module.__dict__.copy()
  254.         self.crust = crust.Crust(parent = self.notebook, intro = intro, locals = namespace)
  255.         self.shell = self.crust.shell
  256.         self.crust.filling.tree.setStatusText = self.SetStatusText
  257.         self.shell.setStatusText = self.SetStatusText
  258.         self.crust.filling.SetSashPosition(200)
  259.         self.notebook.AddPage(page = self.crust, text = '*Shell*', select = True)
  260.         self.setEditor(self.crust.editor)
  261.         self.crust.editor.SetFocus()
  262.  
  263.     
  264.     def _editorChange(self, editor):
  265.         self.setEditor(editor)
  266.  
  267.     
  268.     def OnAbout(self, event):
  269.         title = 'About PyAlaMode'
  270.         text = 'Another fine, flaky program.'
  271.         dialog = wx.MessageDialog(self, text, title, wx.OK | wx.ICON_INFORMATION)
  272.         dialog.ShowModal()
  273.         dialog.Destroy()
  274.  
  275.     
  276.     def _updateTitle(self):
  277.         pass
  278.  
  279.     
  280.     def bufferCreate(self, filename = None):
  281.         buffer = Buffer()
  282.         panel = wx.Panel(parent = self.notebook, id = -1)
  283.         panel.Bind(wx.EVT_ERASE_BACKGROUND, (lambda x: x))
  284.         editor = Editor(parent = panel)
  285.         panel.editor = editor
  286.         sizer = wx.BoxSizer(wx.VERTICAL)
  287.         sizer.Add(editor.window, 1, wx.EXPAND)
  288.         panel.SetSizer(sizer)
  289.         panel.SetAutoLayout(True)
  290.         sizer.Layout()
  291.         buffer.addEditor(editor)
  292.         buffer.open(filename)
  293.         self.setEditor(editor)
  294.         self.notebook.AddPage(page = panel, text = self.buffer.name, select = True)
  295.         self.editor.setFocus()
  296.  
  297.     
  298.     def bufferDestroy(self):
  299.         selection = self.notebook.GetSelection()
  300.         if selection > 0:
  301.             if self.buffer:
  302.                 del self.buffers[self.buffer.id]
  303.                 self.buffer = None
  304.             
  305.             self.notebook.DeletePage(selection)
  306.         
  307.  
  308.     
  309.     def bufferNew(self):
  310.         self.bufferCreate()
  311.         cancel = False
  312.         return cancel
  313.  
  314.     
  315.     def bufferOpen(self):
  316.         filedir = ''
  317.         if self.buffer and self.buffer.doc.filedir:
  318.             filedir = self.buffer.doc.filedir
  319.         
  320.         result = openMultiple(directory = filedir)
  321.         for path in result.paths:
  322.             self.bufferCreate(path)
  323.         
  324.         cancel = False
  325.         return cancel
  326.  
  327.  
  328.  
  329. class EditorNotebook(wx.Notebook):
  330.     
  331.     def __init__(self, parent):
  332.         wx.Notebook.__init__(self, parent, id = -1, style = wx.CLIP_CHILDREN)
  333.         self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging, id = self.GetId())
  334.         self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged, id = self.GetId())
  335.         self.Bind(wx.EVT_IDLE, self.OnIdle)
  336.  
  337.     
  338.     def OnIdle(self, event):
  339.         self._updateTabText()
  340.         event.Skip()
  341.  
  342.     
  343.     def _updateTabText(self):
  344.         size = 3
  345.         changed = ' **'
  346.         unchanged = ' --'
  347.         selection = self.GetSelection()
  348.         if selection < 1:
  349.             return None
  350.         
  351.         text = self.GetPageText(selection)
  352.         window = self.GetPage(selection)
  353.         if not window.editor:
  354.             return None
  355.         
  356.         if text.endswith(changed) or text.endswith(unchanged):
  357.             name = text[:-size]
  358.         else:
  359.             name = text
  360.         if name != window.editor.buffer.name:
  361.             text = window.editor.buffer.name
  362.         
  363.         if window.editor.buffer.hasChanged():
  364.             if text.endswith(changed):
  365.                 text = None
  366.             elif text.endswith(unchanged):
  367.                 text = text[:-size] + changed
  368.             else:
  369.                 text += changed
  370.         elif text.endswith(changed):
  371.             text = text[:-size] + unchanged
  372.         elif text.endswith(unchanged):
  373.             text = None
  374.         else:
  375.             text += unchanged
  376.         if text is not None:
  377.             self.SetPageText(selection, text)
  378.             self.Refresh()
  379.         
  380.  
  381.     
  382.     def OnPageChanging(self, event):
  383.         event.Skip()
  384.  
  385.     
  386.     def OnPageChanged(self, event):
  387.         new = event.GetSelection()
  388.         window = self.GetPage(new)
  389.         dispatcher.send(signal = 'EditorChange', sender = self, editor = window.editor)
  390.         window.SetFocus()
  391.         event.Skip()
  392.  
  393.  
  394.  
  395. class EditorShellNotebookFrame(EditorNotebookFrame):
  396.     
  397.     def __init__(self, parent = None, id = -1, title = 'PyAlaModeTest', pos = wx.DefaultPosition, size = (600, 400), style = wx.DEFAULT_FRAME_STYLE, filename = None, singlefile = False):
  398.         self._singlefile = singlefile
  399.         EditorNotebookFrame.__init__(self, parent, id, title, pos, size, style, filename)
  400.  
  401.     
  402.     def _setup(self):
  403.         if not self._singlefile:
  404.             self.notebook = EditorNotebook(parent = self)
  405.         
  406.  
  407.     
  408.     def OnAbout(self, event):
  409.         title = 'About PyAlaModePlus'
  410.         text = 'Another fine, flaky program.'
  411.         dialog = wx.MessageDialog(self, text, title, wx.OK | wx.ICON_INFORMATION)
  412.         dialog.ShowModal()
  413.         dialog.Destroy()
  414.  
  415.     
  416.     def bufferCreate(self, filename = None):
  417.         if self._singlefile:
  418.             self.bufferDestroy()
  419.             notebook = EditorShellNotebook(parent = self, filename = filename)
  420.             self.notebook = notebook
  421.         else:
  422.             notebook = EditorShellNotebook(parent = self.notebook, filename = filename)
  423.         self.setEditor(notebook.editor)
  424.         if not self._singlefile:
  425.             self.notebook.AddPage(page = notebook, text = self.buffer.name, select = True)
  426.         
  427.         self.editor.setFocus()
  428.  
  429.     
  430.     def bufferDestroy(self):
  431.         if self.buffer:
  432.             self.editor = None
  433.             del self.buffers[self.buffer.id]
  434.             self.buffer = None
  435.         
  436.         if self._singlefile:
  437.             self.notebook.Destroy()
  438.             self.notebook = None
  439.         else:
  440.             selection = self.notebook.GetSelection()
  441.             self.notebook.DeletePage(selection)
  442.  
  443.     
  444.     def bufferNew(self):
  445.         if self._singlefile and self.bufferHasChanged():
  446.             cancel = self.bufferSuggestSave()
  447.             if cancel:
  448.                 return cancel
  449.             
  450.         
  451.         self.bufferCreate()
  452.         cancel = False
  453.         return cancel
  454.  
  455.     
  456.     def bufferOpen(self):
  457.         if self._singlefile and self.bufferHasChanged():
  458.             cancel = self.bufferSuggestSave()
  459.             if cancel:
  460.                 return cancel
  461.             
  462.         
  463.         filedir = ''
  464.         if self.buffer and self.buffer.doc.filedir:
  465.             filedir = self.buffer.doc.filedir
  466.         
  467.         if self._singlefile:
  468.             result = openSingle(directory = filedir)
  469.             if result.path:
  470.                 self.bufferCreate(result.path)
  471.             
  472.         else:
  473.             result = openMultiple(directory = filedir)
  474.             for path in result.paths:
  475.                 self.bufferCreate(path)
  476.             
  477.         cancel = False
  478.         return cancel
  479.  
  480.  
  481.  
  482. class EditorShellNotebook(wx.Notebook):
  483.     
  484.     def __init__(self, parent, filename = None):
  485.         wx.Notebook.__init__(self, parent, id = -1)
  486.         usePanels = True
  487.         if usePanels:
  488.             editorparent = editorpanel = wx.Panel(self, -1)
  489.             shellparent = shellpanel = wx.Panel(self, -1)
  490.         else:
  491.             editorparent = self
  492.             shellparent = self
  493.         self.buffer = Buffer()
  494.         self.editor = Editor(parent = editorparent)
  495.         self.buffer.addEditor(self.editor)
  496.         self.buffer.open(filename)
  497.         self.shell = Shell(parent = shellparent, locals = self.buffer.interp.locals, style = wx.CLIP_CHILDREN | wx.SUNKEN_BORDER)
  498.         self.buffer.interp.locals.clear()
  499.         if usePanels:
  500.             self.AddPage(page = editorpanel, text = 'Editor', select = True)
  501.             self.AddPage(page = shellpanel, text = 'Shell')
  502.             editorsizer = wx.BoxSizer(wx.VERTICAL)
  503.             editorsizer.Add(self.editor.window, 1, wx.EXPAND)
  504.             editorpanel.SetSizer(editorsizer)
  505.             editorpanel.SetAutoLayout(True)
  506.             shellsizer = wx.BoxSizer(wx.VERTICAL)
  507.             shellsizer.Add(self.shell, 1, wx.EXPAND)
  508.             shellpanel.SetSizer(shellsizer)
  509.             shellpanel.SetAutoLayout(True)
  510.         else:
  511.             self.AddPage(page = self.editor.window, text = 'Editor', select = True)
  512.             self.AddPage(page = self.shell, text = 'Shell')
  513.         self.editor.setFocus()
  514.         self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged, id = self.GetId())
  515.  
  516.     
  517.     def OnPageChanged(self, event):
  518.         selection = event.GetSelection()
  519.         if selection == 0:
  520.             self.editor.setFocus()
  521.         else:
  522.             self.shell.SetFocus()
  523.         event.Skip()
  524.  
  525.     
  526.     def SetFocus(self):
  527.         wx.Notebook.SetFocus(self)
  528.         selection = self.GetSelection()
  529.         if selection == 0:
  530.             self.editor.setFocus()
  531.         else:
  532.             self.shell.SetFocus()
  533.  
  534.  
  535.  
  536. class Editor:
  537.     
  538.     def __init__(self, parent, id = -1, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.CLIP_CHILDREN | wx.SUNKEN_BORDER):
  539.         self.window = EditWindow(self, parent, id, pos, size, style)
  540.         self.id = self.window.GetId()
  541.         self.buffer = None
  542.         self.window.Bind(wx.EVT_CHAR, self.OnChar)
  543.         self.window.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
  544.  
  545.     
  546.     def _setBuffer(self, buffer, text):
  547.         self.buffer = buffer
  548.         self.autoCompleteKeys = buffer.interp.getAutoCompleteKeys()
  549.         self.clearAll()
  550.         self.setText(text)
  551.         self.emptyUndoBuffer()
  552.         self.setSavePoint()
  553.  
  554.     
  555.     def destroy(self):
  556.         self.window.Destroy()
  557.  
  558.     
  559.     def clearAll(self):
  560.         self.window.ClearAll()
  561.  
  562.     
  563.     def emptyUndoBuffer(self):
  564.         self.window.EmptyUndoBuffer()
  565.  
  566.     
  567.     def getStatus(self):
  568.         if self.window:
  569.             pos = self.window.GetCurrentPos()
  570.             line = self.window.LineFromPosition(pos) + 1
  571.             col = self.window.GetColumn(pos)
  572.             if self.buffer:
  573.                 if not self.buffer.doc.filepath:
  574.                     pass
  575.                 name = self.buffer.name
  576.             else:
  577.                 name = ''
  578.             status = (name, line, col)
  579.             return status
  580.         else:
  581.             return ('', 0, 0)
  582.  
  583.     
  584.     def getText(self):
  585.         return self.window.GetText()
  586.  
  587.     
  588.     def hasChanged(self):
  589.         return self.window.GetModify()
  590.  
  591.     
  592.     def setFocus(self):
  593.         self.window.SetFocus()
  594.  
  595.     
  596.     def setSavePoint(self):
  597.         self.window.SetSavePoint()
  598.  
  599.     
  600.     def setText(self, text):
  601.         self.window.SetText(text)
  602.  
  603.     
  604.     def OnChar(self, event):
  605.         key = event.GetKeyCode()
  606.         if key in self.autoCompleteKeys:
  607.             if self.window.AutoCompActive():
  608.                 self.window.AutoCompCancel()
  609.             
  610.             self.window.ReplaceSelection('')
  611.             self.window.AddText(chr(key))
  612.             (text, pos) = self.window.GetCurLine()
  613.             text = text[:pos]
  614.             if self.window.autoComplete:
  615.                 self.autoCompleteShow(text)
  616.             
  617.         elif key == ord('('):
  618.             if self.window.AutoCompActive():
  619.                 self.window.AutoCompCancel()
  620.             
  621.             self.window.ReplaceSelection('')
  622.             self.window.AddText('(')
  623.             (text, pos) = self.window.GetCurLine()
  624.             text = text[:pos]
  625.             self.autoCallTipShow(text)
  626.         else:
  627.             event.Skip()
  628.  
  629.     
  630.     def OnKeyDown(self, event):
  631.         key = event.GetKeyCode()
  632.         if self.window.AutoCompActive():
  633.             event.Skip()
  634.             return None
  635.         
  636.         controlDown = event.ControlDown()
  637.         altDown = event.AltDown()
  638.         shiftDown = event.ShiftDown()
  639.         if controlDown and altDown:
  640.             event.Skip()
  641.         elif controlDown and key in (ord(']'),):
  642.             dispatcher.send(signal = 'FontIncrease')
  643.         elif controlDown and key in (ord('['),):
  644.             dispatcher.send(signal = 'FontDecrease')
  645.         elif controlDown and key in (ord('='),):
  646.             dispatcher.send(signal = 'FontDefault')
  647.         else:
  648.             event.Skip()
  649.  
  650.     
  651.     def autoCompleteShow(self, command):
  652.         list = self.buffer.interp.getAutoCompleteList(command, includeMagic = self.window.autoCompleteIncludeMagic, includeSingle = self.window.autoCompleteIncludeSingle, includeDouble = self.window.autoCompleteIncludeDouble)
  653.         if list:
  654.             options = ' '.join(list)
  655.             offset = 0
  656.             self.window.AutoCompShow(offset, options)
  657.         
  658.  
  659.     
  660.     def autoCallTipShow(self, command):
  661.         if self.window.CallTipActive():
  662.             self.window.CallTipCancel()
  663.         
  664.         (name, argspec, tip) = self.buffer.interp.getCallTip(command)
  665.         if tip:
  666.             dispatcher.send(signal = 'Shell.calltip', sender = self, calltip = tip)
  667.         
  668.         if not self.window.autoCallTip:
  669.             return None
  670.         
  671.         if argspec:
  672.             startpos = self.window.GetCurrentPos()
  673.             self.window.AddText(argspec + ')')
  674.             endpos = self.window.GetCurrentPos()
  675.             self.window.SetSelection(endpos, startpos)
  676.         
  677.         if tip:
  678.             curpos = self.window.GetCurrentPos()
  679.             size = len(name)
  680.             tippos = curpos - (size + 1)
  681.             fallback = curpos - self.window.GetColumn(curpos)
  682.             tippos = max(tippos, fallback)
  683.             self.window.CallTipShow(tippos, tip)
  684.             self.window.CallTipSetHighlight(0, size)
  685.         
  686.  
  687.  
  688.  
  689. class EditWindow(editwindow.EditWindow):
  690.     
  691.     def __init__(self, editor, parent, id = -1, pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.CLIP_CHILDREN | wx.SUNKEN_BORDER):
  692.         editwindow.EditWindow.__init__(self, parent, id, pos, size, style)
  693.         self.editor = editor
  694.  
  695.  
  696.  
  697. class DialogResults:
  698.     
  699.     def __init__(self, returned):
  700.         self.returned = returned
  701.         self.positive = returned in (wx.ID_OK, wx.ID_YES)
  702.         self.text = self._asString()
  703.  
  704.     
  705.     def __repr__(self):
  706.         return str(self.__dict__)
  707.  
  708.     
  709.     def _asString(self):
  710.         returned = self.returned
  711.         if returned == wx.ID_OK:
  712.             return 'Ok'
  713.         elif returned == wx.ID_CANCEL:
  714.             return 'Cancel'
  715.         elif returned == wx.ID_YES:
  716.             return 'Yes'
  717.         elif returned == wx.ID_NO:
  718.             return 'No'
  719.         
  720.  
  721.  
  722.  
  723. def fileDialog(parent = None, title = 'Open', directory = '', filename = '', wildcard = 'All Files (*.*)|*.*', style = wx.OPEN | wx.MULTIPLE):
  724.     dialog = wx.FileDialog(parent, title, directory, filename, wildcard, style)
  725.     result = DialogResults(dialog.ShowModal())
  726.     if result.positive:
  727.         result.paths = dialog.GetPaths()
  728.     else:
  729.         result.paths = []
  730.     dialog.Destroy()
  731.     return result
  732.  
  733.  
  734. def openSingle(parent = None, title = 'Open', directory = '', filename = '', wildcard = 'All Files (*.*)|*.*', style = wx.OPEN):
  735.     dialog = wx.FileDialog(parent, title, directory, filename, wildcard, style)
  736.     result = DialogResults(dialog.ShowModal())
  737.     if result.positive:
  738.         result.path = dialog.GetPath()
  739.     else:
  740.         result.path = None
  741.     dialog.Destroy()
  742.     return result
  743.  
  744.  
  745. def openMultiple(parent = None, title = 'Open', directory = '', filename = '', wildcard = 'All Files (*.*)|*.*', style = wx.OPEN | wx.MULTIPLE):
  746.     return fileDialog(parent, title, directory, filename, wildcard, style)
  747.  
  748.  
  749. def saveSingle(parent = None, title = 'Save', directory = '', filename = '', wildcard = 'All Files (*.*)|*.*', style = wx.SAVE | wx.OVERWRITE_PROMPT):
  750.     dialog = wx.FileDialog(parent, title, directory, filename, wildcard, style)
  751.     result = DialogResults(dialog.ShowModal())
  752.     if result.positive:
  753.         result.path = dialog.GetPath()
  754.     else:
  755.         result.path = None
  756.     dialog.Destroy()
  757.     return result
  758.  
  759.  
  760. def directory(parent = None, message = 'Choose a directory', path = '', style = 0, pos = wx.DefaultPosition, size = wx.DefaultSize):
  761.     dialog = wx.DirDialog(parent, message, path, style, pos, size)
  762.     result = DialogResults(dialog.ShowModal())
  763.     if result.positive:
  764.         result.path = dialog.GetPath()
  765.     else:
  766.         result.path = None
  767.     dialog.Destroy()
  768.     return result
  769.  
  770.  
  771. def messageDialog(parent = None, message = '', title = 'Message box', style = wx.YES_NO | wx.CANCEL | wx.CENTRE | wx.ICON_QUESTION, pos = wx.DefaultPosition):
  772.     dialog = wx.MessageDialog(parent, message, title, style, pos)
  773.     result = DialogResults(dialog.ShowModal())
  774.     dialog.Destroy()
  775.     return result
  776.  
  777.