]> git.saurik.com Git - wxWidgets.git/blame - wxPython/wx/py/crust.py
"wxWindows" --> "wxWidgets"
[wxWidgets.git] / wxPython / wx / py / crust.py
CommitLineData
d14a1e28 1"""Crust combines the shell and filling into one control."""
1fded56b 2
d14a1e28
RD
3__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
4__cvsid__ = "$Id$"
5__revision__ = "$Revision$"[11:-2]
1fded56b 6
d14a1e28
RD
7import wx
8
9import os
10import pprint
11import sys
12
13import dispatcher
14import editwindow
15from filling import Filling
16import frame
17from shell import Shell
18from version import VERSION
19
d14a1e28
RD
20
21class Crust(wx.SplitterWindow):
22 """Crust based on SplitterWindow."""
23
24 name = 'Crust'
25 revision = __revision__
26
27 def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
28 size=wx.DefaultSize, style=wx.SP_3D,
29 name='Crust Window', rootObject=None, rootLabel=None,
30 rootIsNamespace=True, intro='', locals=None,
31 InterpClass=None, *args, **kwds):
32 """Create Crust instance."""
33 wx.SplitterWindow.__init__(self, parent, id, pos, size, style, name)
34 self.shell = Shell(parent=self, introText=intro,
35 locals=locals, InterpClass=InterpClass,
36 *args, **kwds)
37 self.editor = self.shell
38 if rootObject is None:
39 rootObject = self.shell.interp.locals
40 self.notebook = wx.Notebook(parent=self, id=-1)
41 self.shell.interp.locals['notebook'] = self.notebook
42 self.filling = Filling(parent=self.notebook,
43 rootObject=rootObject,
44 rootLabel=rootLabel,
45 rootIsNamespace=rootIsNamespace)
46 # Add 'filling' to the interpreter's locals.
47 self.shell.interp.locals['filling'] = self.filling
48 self.notebook.AddPage(page=self.filling, text='Namespace', select=True)
49 self.display = Display(parent=self.notebook)
50 self.notebook.AddPage(page=self.display, text='Display')
51 # Add 'pp' (pretty print) to the interpreter's locals.
52 self.shell.interp.locals['pp'] = self.display.setItem
53 self.calltip = Calltip(parent=self.notebook)
54 self.notebook.AddPage(page=self.calltip, text='Calltip')
55 self.sessionlisting = SessionListing(parent=self.notebook)
56 self.notebook.AddPage(page=self.sessionlisting, text='Session')
57 self.dispatcherlisting = DispatcherListing(parent=self.notebook)
58 self.notebook.AddPage(page=self.dispatcherlisting, text='Dispatcher')
e757654c
PB
59## from wxd import wx_
60## self.wxdocs = Filling(parent=self.notebook,
61## rootObject=wx_,
62## rootLabel='wx',
63## rootIsNamespace=False,
64## static=True)
65## self.notebook.AddPage(page=self.wxdocs, text='wxPython Docs')
66## from wxd import stc_
67## self.stcdocs = Filling(parent=self.notebook,
68## rootObject=stc_.StyledTextCtrl,
69## rootLabel='StyledTextCtrl',
70## rootIsNamespace=False,
71## static=True)
72## self.notebook.AddPage(page=self.stcdocs, text='StyledTextCtrl Docs')
d14a1e28
RD
73 self.SplitHorizontally(self.shell, self.notebook, 300)
74 self.SetMinimumPaneSize(1)
75
76
77class Display(editwindow.EditWindow):
78 """STC used to display an object using Pretty Print."""
79
80 def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
81 size=wx.DefaultSize,
82 style=wx.CLIP_CHILDREN | wx.SUNKEN_BORDER,
83 static=False):
84 """Create Display instance."""
85 editwindow.EditWindow.__init__(self, parent, id, pos, size, style)
86 # Configure various defaults and user preferences.
87 self.SetReadOnly(True)
88 self.SetWrapMode(False)
89 if not static:
90 dispatcher.connect(receiver=self.push, signal='Interpreter.push')
91
92 def push(self, command, more):
93 """Receiver for Interpreter.push signal."""
94 self.Refresh()
95
96 def Refresh(self):
97 if not hasattr(self, "item"):
98 return
99 self.SetReadOnly(False)
100 text = pprint.pformat(self.item)
101 self.SetText(text)
102 self.SetReadOnly(True)
103
104 def setItem(self, item):
105 """Set item to pretty print in the notebook Display tab."""
106 self.item = item
107 self.Refresh()
108
109
110class Calltip(wx.TextCtrl):
111 """Text control containing the most recent shell calltip."""
112
113 def __init__(self, parent=None, id=-1):
65d005e4
PB
114 style = (wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH2)
115 wx.TextCtrl.__init__(self, parent, id, style=style)
d14a1e28
RD
116 self.SetBackgroundColour(wx.Colour(255, 255, 232))
117 dispatcher.connect(receiver=self.display, signal='Shell.calltip')
118
119 def display(self, calltip):
120 """Receiver for Shell.calltip signal."""
07b87e8d
PB
121 ## self.SetValue(calltip) # Caused refresh problem on Windows.
122 self.Clear()
123 self.AppendText(calltip)
d14a1e28
RD
124
125
126class SessionListing(wx.TextCtrl):
127 """Text control containing all commands for session."""
128
129 def __init__(self, parent=None, id=-1):
65d005e4
PB
130 style = (wx.TE_MULTILINE | wx.TE_READONLY |
131 wx.TE_RICH2 | wx.TE_DONTWRAP)
132 wx.TextCtrl.__init__(self, parent, id, style=style)
d14a1e28
RD
133 dispatcher.connect(receiver=self.push, signal='Interpreter.push')
134
135 def push(self, command, more):
136 """Receiver for Interpreter.push signal."""
137 if command and not more:
138 self.SetInsertionPointEnd()
139 start, end = self.GetSelection()
140 if start != end:
141 self.SetSelection(0, 0)
142 self.AppendText(command + '\n')
143
144
145class DispatcherListing(wx.TextCtrl):
146 """Text control containing all dispatches for session."""
147
148 def __init__(self, parent=None, id=-1):
65d005e4
PB
149 style = (wx.TE_MULTILINE | wx.TE_READONLY |
150 wx.TE_RICH2 | wx.TE_DONTWRAP)
151 wx.TextCtrl.__init__(self, parent, id, style=style)
d14a1e28
RD
152 dispatcher.connect(receiver=self.spy)
153
154 def spy(self, signal, sender):
155 """Receiver for Any signal from Any sender."""
156 text = '%r from %s' % (signal, sender)
157 self.SetInsertionPointEnd()
158 start, end = self.GetSelection()
159 if start != end:
160 self.SetSelection(0, 0)
161 self.AppendText(text + '\n')
162
163
164class CrustFrame(frame.Frame):
165 """Frame containing all the PyCrust components."""
166
167 name = 'CrustFrame'
168 revision = __revision__
169
170 def __init__(self, parent=None, id=-1, title='PyCrust',
171 pos=wx.DefaultPosition, size=wx.DefaultSize,
172 style=wx.DEFAULT_FRAME_STYLE,
173 rootObject=None, rootLabel=None, rootIsNamespace=True,
174 locals=None, InterpClass=None, *args, **kwds):
175 """Create CrustFrame instance."""
176 frame.Frame.__init__(self, parent, id, title, pos, size, style)
177 intro = 'PyCrust %s - The Flakiest Python Shell' % VERSION
178 intro += '\nSponsored by Orbtech - '
179 intro += 'Your source for Python programming expertise.'
180 self.SetStatusText(intro.replace('\n', ', '))
181 self.crust = Crust(parent=self, intro=intro,
182 rootObject=rootObject,
183 rootLabel=rootLabel,
184 rootIsNamespace=rootIsNamespace,
185 locals=locals,
186 InterpClass=InterpClass, *args, **kwds)
187 self.shell = self.crust.shell
188 # Override the filling so that status messages go to the status bar.
189 self.crust.filling.tree.setStatusText = self.SetStatusText
190 # Override the shell so that status messages go to the status bar.
191 self.shell.setStatusText = self.SetStatusText
192 # Fix a problem with the sash shrinking to nothing.
193 self.crust.filling.SetSashPosition(200)
194 # Set focus to the shell editor.
195 self.shell.SetFocus()
196
197 def OnClose(self, event):
198 """Event handler for closing."""
199 self.crust.shell.destroy()
200 self.Destroy()
201
202 def OnAbout(self, event):
203 """Display an About window."""
204 title = 'About PyCrust'
205 text = 'PyCrust %s\n\n' % VERSION + \
206 'Yet another Python shell, only flakier.\n\n' + \
207 'Half-baked by Patrick K. O\'Brien,\n' + \
208 'the other half is still in the oven.\n\n' + \
209 'Shell Revision: %s\n' % self.shell.revision + \
210 'Interpreter Revision: %s\n\n' % self.shell.interp.revision + \
211 'Python Version: %s\n' % sys.version.split()[0] + \
212 'wxPython Version: %s\n' % wx.VERSION_STRING + \
213 'Platform: %s\n' % sys.platform
214 dialog = wx.MessageDialog(self, text, title,
215 wx.OK | wx.ICON_INFORMATION)
216 dialog.ShowModal()
217 dialog.Destroy()