]> git.saurik.com Git - wxWidgets.git/blob - wxPython/wx/lib/mixins/inspect.py
wx.FRAME_FLOAT_ON_PARENT notes
[wxWidgets.git] / wxPython / wx / lib / mixins / inspect.py
1 #----------------------------------------------------------------------------
2 # Name: wx.lib.mixins.inspect
3 # Purpose: A mix-in class that can add PyCrust-based inspection of the
4 # app's widgets and sizers.
5 #
6 # Author: Robin Dunn
7 #
8 # Created: 21-Nov-2006
9 # RCS-ID: $Id$
10 # Copyright: (c) 2006 by Total Control Software
11 # Licence: wxWindows license
12 #----------------------------------------------------------------------------
13
14 # NOTE: This class was originally based on ideas sent to the
15 # wxPython-users mail list by Dan Eloff.
16
17 import wx
18 import wx.py
19 import wx.stc
20 import sys
21
22
23 class InspectionMixin(object):
24 """
25 This class is intended to be used as a mix-in with the wx.App
26 class. When used it will add the ability to popup a
27 InspectionFrame window where the widget under the mouse cursor
28 will be selected in the tree and loaded into the shell's namespace
29 as 'obj'. The default key sequence to activate the inspector is
30 Ctrl-Alt-I (or Cmd-Alt-I on Mac) but this can be changed via
31 parameters to the `Init` method, or the application can call
32 `ShowInspectionTool` from other event handlers if desired.
33
34 To use this class simply derive a class from wx.App and
35 InspectionMixin and then call the `Init` method from the app's
36 OnInit.
37 """
38 def Init(self, pos=(-1, -1), size=(850,700), config=None, locals=None,
39 alt=True, cmd=True, shift=False, keyCode=ord('I')):
40 """
41 Make the event binding that will activate the InspectionFrame window.
42 """
43 self.Bind(wx.EVT_KEY_DOWN, self._OnKeyPress)
44 self._tool = None
45 self._pos = pos
46 self._size = size
47 self._config = config
48 self._locals = locals
49 self._alt = alt
50 self._cmd = cmd
51 self._shift = shift
52 self._keyCode = keyCode
53
54
55 def _OnKeyPress(self, evt):
56 """
57 Event handler, check for our hot-key. Normally it is
58 Ctrl-Alt-I but that can be changed by what is passed to the
59 Init method.
60 """
61 if evt.AltDown() == self._alt and \
62 evt.CmdDown() == self._cmd and \
63 evt.ShiftDown() == self._shift and \
64 evt.GetKeyCode() == self._keyCode:
65 self.ShowInspectionTool()
66 else:
67 evt.Skip()
68
69
70 def ShowInspectionTool(self):
71 """
72 Show the Inspection tool, creating it if neccesary.
73 """
74 if not self._tool:
75 self._tool = InspectionFrame(parent=self.GetTopWindow(),
76 pos=self._pos,
77 size=self._size,
78 config=self._config,
79 locals=self._locals,
80 app=self)
81 # get the current widget under the mouse
82 wnd = wx.FindWindowAtPointer()
83 self._tool.SetObj(wnd)
84
85 self._tool.Show()
86 self._tool.Raise()
87
88
89 #---------------------------------------------------------------------------
90
91 class InspectionFrame(wx.Frame):
92 """
93 This class is the frame that holds the wxPython inspection tools.
94 The toolbar and splitter windows are also managed here. The
95 contents of the splitter windows are handled by other classes.
96 """
97 def __init__(self, wnd=None, locals=None, config=None,
98 app=None, title="wxPython Widget Inspection Tool",
99 *args, **kw):
100 kw['title'] = title
101 wx.Frame.__init__(self, *args, **kw)
102
103 self.includeSizers = False
104 self.started = False
105
106 self.MacSetMetalAppearance(True)
107 self.MakeToolBar()
108
109 self.outerSplitter = wx.SplitterWindow(self,style=wx.SP_LIVE_UPDATE)
110 self.innerSplitter = wx.SplitterWindow(self.outerSplitter,style=wx.SP_LIVE_UPDATE)
111 self.tree = InspectionTree(self.outerSplitter)
112 self.info = InspectionInfoPanel(self.innerSplitter)
113
114 if not locals:
115 locals = {}
116 myIntroText = (
117 "Python %s on %s\nNOTE: The 'obj' variable refers to the selected object."
118 % (sys.version.split()[0], sys.platform))
119 self.crust = wx.py.crust.Crust(self.innerSplitter, locals=locals,
120 intro=myIntroText,
121 showInterpIntro=False,
122 )
123 self.crust.shell.SetMarginWidth(1, 0)
124 self.locals = self.crust.shell.interp.locals
125 self.crust.shell.interp.introText = ''
126 self.locals['obj'] = self.obj = wnd
127 self.locals['app'] = app
128 self.locals['wx'] = wx
129 wx.CallAfter(self._postStartup)
130
131 self.innerSplitter.SplitHorizontally(self.info, self.crust, -225)
132 self.outerSplitter.SplitVertically(self.tree, self.innerSplitter, 280)
133 self.outerSplitter.SetMinimumPaneSize(20)
134 self.innerSplitter.SetMinimumPaneSize(20)
135
136
137 def MakeToolBar(self):
138 tbar = self.CreateToolBar(wx.TB_HORIZONTAL | wx.TB_FLAT | wx.TB_TEXT | wx.NO_BORDER )
139 tbar.SetToolBitmapSize((24,24))
140
141 refreshBmp = getRefreshBitmap()
142 findWidgetBmp = getFindBitmap()
143 showSizersBmp = getShowSizersBitmap()
144 toggleFillingBmp = getShowFillingBitmap()
145
146 refreshTool = tbar.AddLabelTool(-1, 'Refresh', refreshBmp,
147 shortHelp = 'Refresh widget tree')
148 findWidgetTool = tbar.AddLabelTool(-1, 'Find', findWidgetBmp,
149 shortHelp='Find new target widget. Click here and\nthen on another widget in the app.')
150 showSizersTool = tbar.AddLabelTool(-1, 'Sizers', showSizersBmp,
151 shortHelp='Include sizers in widget tree',
152 kind=wx.ITEM_CHECK)
153 toggleFillingTool = tbar.AddLabelTool(-1, 'Filling', toggleFillingBmp,
154 shortHelp='Show PyCrust \'filling\'',
155 kind=wx.ITEM_CHECK)
156 tbar.Realize()
157
158 self.Bind(wx.EVT_TOOL, self.OnRefreshTree, refreshTool)
159 self.Bind(wx.EVT_TOOL, self.OnFindWidget, findWidgetTool)
160 self.Bind(wx.EVT_TOOL, self.OnShowSizers, showSizersTool)
161 self.Bind(wx.EVT_TOOL, self.OnToggleFilling, toggleFillingTool)
162 self.Bind(wx.EVT_UPDATE_UI, self.OnShowSizersUI, showSizersTool)
163 self.Bind(wx.EVT_UPDATE_UI, self.OnToggleFillingUI, toggleFillingTool)
164
165
166
167 def _postStartup(self):
168 if self.crust.ToolsShown():
169 self.crust.ToggleTools()
170 self.UpdateInfo()
171 self.started = True
172
173 def UpdateInfo(self):
174 self.info.Update(self.obj)
175
176 def SetObj(self, obj):
177 if self.obj is obj:
178 return
179 self.locals['obj'] = self.obj = obj
180 self.UpdateInfo()
181 if not self.tree.built:
182 self.tree.BuildTree(obj, includeSizers=self.includeSizers)
183 else:
184 self.tree.SelectObj(obj)
185
186
187 def RefreshTree(self):
188 self.tree.BuildTree(self.obj, includeSizers=self.includeSizers)
189
190
191 def OnRefreshTree(self, evt):
192 self.RefreshTree()
193
194
195 def OnFindWidget(self, evt):
196 self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
197 self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnCaptureLost)
198 self.CaptureMouse()
199 self.finding = wx.BusyInfo("Click on any widget in the app...")
200
201 def OnCaptureLost(self, evt):
202 self.Unbind(wx.EVT_LEFT_DOWN)
203 self.Unbind(wx.EVT_MOUSE_CAPTURE_LOST)
204 del self.finding
205
206 def OnLeftDown(self, evt):
207 self.ReleaseMouse()
208 wnd = wx.FindWindowAtPointer()
209 if wnd is not None:
210 self.SetObj(wnd)
211 else:
212 wx.Bell()
213 self.OnCaptureLost(evt)
214
215
216 def OnShowSizers(self, evt):
217 self.includeSizers = not self.includeSizers
218 self.RefreshTree()
219
220
221 def OnToggleFilling(self, evt):
222 self.crust.ToggleTools()
223
224
225 def OnShowSizersUI(self, evt):
226 evt.Check(self.includeSizers)
227
228
229 def OnToggleFillingUI(self, evt):
230 if self.started:
231 evt.Check(self.crust.ToolsShown())
232
233
234
235 #---------------------------------------------------------------------------
236
237 # should inspection frame (and children) be includeed in the tree?
238 INCLUDE_INSPECTOR = True
239
240 class InspectionTree(wx.TreeCtrl):
241 """
242 All of the widgets in the app, and optionally their sizers, are
243 loaded into this tree.
244 """
245 def __init__(self, *args, **kw):
246 #s = kw.get('style', 0)
247 #kw['style'] = s | wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT
248 wx.TreeCtrl.__init__(self, *args, **kw)
249 self.roots = []
250 self.built = False
251 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelectionChanged)
252
253
254 def BuildTree(self, startWidget, includeSizers=False):
255 if self.GetCount():
256 self.DeleteAllItems()
257 self.roots = []
258 self.built = False
259
260 realRoot = self.AddRoot('Top-level Windows')
261
262 for w in wx.GetTopLevelWindows():
263 if w is wx.GetTopLevelParent(self) and not INCLUDE_INSPECTOR:
264 continue
265 root = self._AddWidget(realRoot, w, includeSizers)
266 self.roots.append(root)
267
268 # Expand the subtree containing the startWidget, and select it.
269 if not startWidget or not isinstance(startWidget, wx.Window):
270 startWidget = wx.GetApp().GetTopWindow()
271 top = wx.GetTopLevelParent(startWidget)
272 topItem = self.FindWidgetItem(top)
273 if topItem:
274 self.ExpandAllChildren(topItem)
275 self.SelectObj(startWidget)
276 self.built = True
277
278
279 def _AddWidget(self, parentItem, widget, includeSizers):
280 text = self.GetTextForWidget(widget)
281 item = self.AppendItem(parentItem, text)
282 self.SetItemPyData(item, widget)
283
284 # Add the sizer and widgets in the sizer, if we're showing them
285 widgetsInSizer = []
286 if includeSizers and widget.GetSizer() is not None:
287 widgetsInSizer = self._AddSizer(item, widget.GetSizer())
288
289 # Add any children not in the sizer, or all children if we're
290 # not showing the sizers
291 for child in widget.GetChildren():
292 if not child in widgetsInSizer and not child.IsTopLevel():
293 self._AddWidget(item, child, includeSizers)
294
295 return item
296
297
298 def _AddSizer(self, parentItem, sizer):
299 widgets = []
300 text = self.GetTextForSizer(sizer)
301 item = self.AppendItem(parentItem, text)
302 self.SetItemPyData(item, sizer)
303 self.SetItemTextColour(item, "blue")
304
305 for si in sizer.GetChildren():
306 if si.IsWindow():
307 w = si.GetWindow()
308 self._AddWidget(item, w, True)
309 widgets.append(w)
310 elif si.IsSizer():
311 widgets += self._AddSizer(item, si.GetSizer())
312 else:
313 i = self.AppendItem(item, "Spacer")
314 self.SetItemPyData(i, si)
315 self.SetItemTextColour(i, "blue")
316 return widgets
317
318
319 def FindWidgetItem(self, widget):
320 """
321 Find the tree item for a widget.
322 """
323 for item in self.roots:
324 found = self._FindWidgetItem(widget, item)
325 if found:
326 return found
327 return None
328
329 def _FindWidgetItem(self, widget, item):
330 if self.GetItemPyData(item) is widget:
331 return item
332 child, cookie = self.GetFirstChild(item)
333 while child:
334 found = self._FindWidgetItem(widget, child)
335 if found:
336 return found
337 child, cookie = self.GetNextChild(item, cookie)
338 return None
339
340
341 def GetTextForWidget(self, widget):
342 """
343 Returns the string to be used in the tree for a widget
344 """
345 return "%s (\"%s\")" % (widget.__class__.__name__, widget.GetName())
346
347 def GetTextForSizer(self, sizer):
348 """
349 Returns the string to be used in the tree for a sizer
350 """
351 return "%s" % sizer.__class__.__name__
352
353
354 def SelectObj(self, obj):
355 item = self.FindWidgetItem(obj)
356 if item:
357 self.EnsureVisible(item)
358 self.SelectItem(item)
359
360
361 def OnSelectionChanged(self, evt):
362 obj = self.GetItemPyData(evt.GetItem())
363 toolFrm = wx.GetTopLevelParent(self)
364 toolFrm.SetObj(obj)
365
366
367 #---------------------------------------------------------------------------
368
369 class InspectionInfoPanel(wx.stc.StyledTextCtrl):
370 """
371 Used to display information about the currently selected items.
372 Currently just a read-only wx.stc.StyledTextCtrl with some plain
373 text. Should probably add some styles to make things easier to
374 read.
375 """
376 def __init__(self, *args, **kw):
377 wx.stc.StyledTextCtrl.__init__(self, *args, **kw)
378
379 from wx.py.editwindow import FACES
380 self.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT,
381 "face:%(mono)s,size:%(size)d,back:%(backcol)s" % FACES)
382 self.StyleClearAll()
383 self.SetReadOnly(True)
384 self.SetMarginType(1, 0)
385 self.SetMarginWidth(1, 0)
386 self.SetSelForeground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
387 self.SetSelBackground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT))
388
389
390 def Update(self, obj):
391 st = []
392 if not obj:
393 st.append("Item is None or has been destroyed.")
394
395 elif isinstance(obj, wx.Window):
396 st += self.FmtWidget(obj)
397
398 elif isinstance(obj, wx.Sizer):
399 st += self.FmtSizer(obj)
400
401 elif isinstance(obj, wx.SizerItem):
402 st += self.FmtSizerItem(obj)
403
404 self.SetReadOnly(False)
405 self.SetText('\n'.join(st))
406 self.SetReadOnly(True)
407
408
409 def Fmt(self, name, value):
410 if isinstance(value, (str, unicode)):
411 return " %s = '%s'" % (name, value)
412 else:
413 return " %s = %s" % (name, value)
414
415
416 def FmtWidget(self, obj):
417 st = ["Widget:"]
418 st.append(self.Fmt('name', obj.GetName()))
419 st.append(self.Fmt('class', obj.__class__))
420 st.append(self.Fmt('bases', obj.__class__.__bases__))
421 st.append(self.Fmt('id', obj.GetId()))
422 st.append(self.Fmt('style', obj.GetWindowStyle()))
423 st.append(self.Fmt('pos', obj.GetPosition()))
424 st.append(self.Fmt('size', obj.GetSize()))
425 st.append(self.Fmt('minsize', obj.GetMinSize()))
426 st.append(self.Fmt('bestsize', obj.GetBestSize()))
427 st.append(self.Fmt('client size',obj.GetClientSize()))
428 st.append(self.Fmt('IsEnabled', obj.IsEnabled()))
429 st.append(self.Fmt('IsShown', obj.IsShown()))
430 st.append(self.Fmt('fg color', obj.GetForegroundColour()))
431 st.append(self.Fmt('bg color', obj.GetBackgroundColour()))
432 st.append(self.Fmt('label', obj.GetLabel()))
433 if hasattr(obj, 'GetTitle'):
434 st.append(self.Fmt('title', obj.GetTitle()))
435 if hasattr(obj, 'GetValue'):
436 st.append(self.Fmt('value', obj.GetValue()))
437 if obj.GetContainingSizer() is not None:
438 st.append('')
439 sizer = obj.GetContainingSizer()
440 st += self.FmtSizerItem(sizer.GetItem(obj))
441 return st
442
443
444 def FmtSizerItem(self, obj):
445 st = ['SizerItem:']
446 st.append(self.Fmt('proportion', obj.GetProportion()))
447 st.append(self.Fmt('flag',
448 FlagsFormatter(itemFlags, obj.GetFlag())))
449 st.append(self.Fmt('border', obj.GetBorder()))
450 st.append(self.Fmt('pos', obj.GetPosition()))
451 st.append(self.Fmt('size', obj.GetSize()))
452 st.append(self.Fmt('minsize', obj.GetMinSize()))
453 st.append(self.Fmt('ratio', obj.GetRatio()))
454 st.append(self.Fmt('IsWindow', obj.IsWindow()))
455 st.append(self.Fmt('IsSizer', obj.IsSizer()))
456 st.append(self.Fmt('IsSpacer', obj.IsSpacer()))
457 st.append(self.Fmt('IsShown', obj.IsShown()))
458 if isinstance(obj, wx.GBSizerItem):
459 st.append(self.Fmt('cellpos', obj.GetPos()))
460 st.append(self.Fmt('cellspan', obj.GetSpan()))
461 st.append(self.Fmt('endpos', obj.GetEndPos()))
462 return st
463
464
465 def FmtSizer(self, obj):
466 st = ['Sizer:']
467 st.append(self.Fmt('class', obj.__class__))
468 st.append(self.Fmt('pos', obj.GetPosition()))
469 st.append(self.Fmt('size', obj.GetSize()))
470 st.append(self.Fmt('minsize', obj.GetMinSize()))
471 if isinstance(obj, wx.BoxSizer):
472 st.append(self.Fmt('orientation',
473 FlagsFormatter(orientFlags, obj.GetOrientation())))
474 if isinstance(obj, wx.GridSizer):
475 st.append(self.Fmt('cols', obj.GetCols()))
476 st.append(self.Fmt('rows', obj.GetRows()))
477 st.append(self.Fmt('vgap', obj.GetVGap()))
478 st.append(self.Fmt('hgap', obj.GetHGap()))
479 if isinstance(obj, wx.FlexGridSizer):
480 st.append(self.Fmt('rowheights', obj.GetRowHeights()))
481 st.append(self.Fmt('colwidths', obj.GetColWidths()))
482 st.append(self.Fmt('flexdir',
483 FlagsFormatter(orientFlags, obj.GetFlexibleDirection())))
484 st.append(self.Fmt('nonflexmode',
485 FlagsFormatter(flexmodeFlags, obj.GetNonFlexibleGrowMode())))
486 if isinstance(obj, wx.GridBagSizer):
487 st.append(self.Fmt('emptycell', obj.GetEmptyCellSize()))
488
489 if obj.GetContainingWindow():
490 si = obj.GetContainingWindow().GetSizer().GetItem(obj)
491 if si:
492 st.append('')
493 st += self.FmtSizerItem(si)
494 return st
495
496
497 class FlagsFormatter(object):
498 def __init__(self, d, val):
499 self.d = d
500 self.val = val
501
502 def __str__(self):
503 st = []
504 for k in self.d.keys():
505 if self.val & k:
506 st.append(self.d[k])
507 if st:
508 return '|'.join(st)
509 else:
510 return '0'
511
512 orientFlags = {
513 wx.HORIZONTAL : 'wx.HORIZONTAL',
514 wx.VERTICAL : 'wx.VERTICAL',
515 }
516
517 itemFlags = {
518 wx.TOP : 'wx.TOP',
519 wx.BOTTOM : 'wx.BOTTOM',
520 wx.LEFT : 'wx.LEFT',
521 wx.RIGHT : 'wx.RIGHT',
522 # wx.ALL : 'wx.ALL',
523 wx.EXPAND : 'wx.EXPAND',
524 # wx.GROW : 'wx.GROW',
525 wx.SHAPED : 'wx.SHAPED',
526 wx.STRETCH_NOT : 'wx.STRETCH_NOT',
527 wx.ALIGN_CENTER : 'wx.ALIGN_CENTER',
528 wx.ALIGN_LEFT : 'wx.ALIGN_LEFT',
529 wx.ALIGN_RIGHT : 'wx.ALIGN_RIGHT',
530 wx.ALIGN_TOP : 'wx.ALIGN_TOP',
531 wx.ALIGN_BOTTOM : 'wx.ALIGN_BOTTOM',
532 wx.ALIGN_CENTER_VERTICAL : 'wx.ALIGN_CENTER_VERTICAL',
533 wx.ALIGN_CENTER_HORIZONTAL : 'wx.ALIGN_CENTER_HORIZONTAL',
534 wx.ADJUST_MINSIZE : 'wx.ADJUST_MINSIZE',
535 wx.FIXED_MINSIZE : 'wx.FIXED_MINSIZE',
536 }
537
538 flexmodeFlags = {
539 wx.FLEX_GROWMODE_NONE : 'wx.FLEX_GROWMODE_NONE',
540 wx.FLEX_GROWMODE_SPECIFIED : 'wx.FLEX_GROWMODE_SPECIFIED',
541 wx.FLEX_GROWMODE_ALL : 'wx.FLEX_GROWMODE_ALL',
542 }
543
544 #---------------------------------------------------------------------------
545 from wx import ImageFromStream, BitmapFromImage
546 import cStringIO
547
548
549 def getRefreshData():
550 return \
551 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
552 \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
553 \x05\xe8IDATH\x89\x9d\x96]h\x94\xd9\x19\xc7\x7f\xefG21\x93\x99Il\xcc&\x18w\
554 \x1c?\xe2GK\xa5kb\x8d\xd3(+\xcb\xd2-\x0b-4A\xf1\xc6\xcb\x8a\xdaz\xa7\xd8\x9b\
555 zQ\xe8\x85R\xd3\xd0\x1a\x97\x06w\xad\xa8\x14/z%\x85\xd2\x85\xe2\x17\xedEK\
556 \x83\xd4\xc4X\x1b\x9bL\x98L\xdf\xc9d\xbe\'\x99\xc9{\xfe\xbd\xc8$\xc4e\xa1\
557 \xd0\x07\x0e\x1c\x0e\xcf\xc7y\xfe\xe7\xff<\xcf\xb1\xf8\xdfr\x008\x03|\x0bp\
558 \x00\x0b\xf0\x81\xa7\xc0\'\xc0\xdf\xbe\xccH\xabz\xb8\x1b\xce\x9c\xba!\xc0\
559 \x07\xc0\xbf\x81\x92\xe38\xef\xf8\xbe\xff.\xf0\xb5\xae\xae\xae%\x80d2\xd9\
560 \xd4\xd0\xd0\x90\xd9\xb9s\xe7\xf6\xc9\xc9\xc9y\xa0\x19\x88\x01\x9f\x03\x06p,\
561 \xf0\x05\x96\xfb\x05\xe7[\x80\x9f\xb9\xae{d\xeb\xd6\xad%\xd7u\x7f\xf0\xfa\
562 \xf5\xeb\xd7\xb6m[\x03\x03\x03\x0c\x0e\x0e6Y\x96\xc5\x83\x07\x0f\x98\x98\x98\
563 h\xf4}?\x01\x84c\xb1\xd8\'\xb3\xb3\xb3\x1d+++\x7f\x06~\x0c$\xd7\x82l\xccj\
564 \x8b\xe38\xf7W\xb3[_\x9f\x02W\x81\x7f\x0e\r\r)\x95J\xa9\\.\xeb\xf4\xe9\xd3\
565 \x02fC\xa1\xd0\xcd\xb6\xb6\xb6\xcf6\xda\xd8\xb6\xfd\x00\xe8\xfc2\xd8\xc6\x00\
566 \x85B!\xf5\xf6\xf6\x9aC\x87\x0e\x99\xd6\xd6V\x01joo\xd7\xcd\x9b7\xfdt:\xadR\
567 \xa9\xa4\xb1\xb11?\x14\n\t\xd0\xbe}\xfb\xd4\xdb\xdb\xab\xde\xde^\x13\x0e\x87\
568 \xd7\x02\xfd\xa6\x8e\xca\xba|\xe08\xce?\x00\x1d<x\xd0LMM\xc9\xf3<]\xbatI\xb6\
569 m\xeb\xe2\xc5\x8b\x92\xa4B\xa1\xa0d2)I\xba|\xf9\xb2l\xdb\xd6\x85\x0b\x174??\
570 \xaf\xe9\xe9i\xf5\xf7\xf7\x1b@\xae\xeb\xbe\x04>\xda\x18\xa0g\xfb\xf6\xed\xcf\
571 \x00\xf5\xf5\xf5\xc9\xf3<%\x12\t%\x93I\xcd\xcc\xcc(\x95J\xa9T*)\x9f\xcf+\x97\
572 \xcb\xa9X,*\x95JiffF\xc9dR\x89DB\x8b\x8b\x8b\x1a\x18\x180\x80\xa2\xd1\xe8\
573 \xdf\x81\xfdlH\xa31\x9b\xcd~\xde\xd6\xd6\x16\t\x04\x02_\xf7<\x8fx<NGG\x07\
574 \xa1P\x88\xc6\xc6Fj\xb5\x1a\x96eaY\x16\xc6\x18\x82\xc1 \x91H\x84`0H\xadVcxx\
575 \x98\x87\x0f\x1fZ\x95J\xe5n{{\xfb\xe5\xc5\xc5\xc5\x0c\x90\x078\xd0\xd3\xd3\
576 \xf3\xdd]\xbbv}#\x12\x89\xfc\xaa\xfeP\x9a\x99\x99\xd1\xca\xca\x8a\xb2\xd9\
577 \xac\xca\xe5\xb2\xbe(\x95JE\xd9lV\xd5jU\x9e\xe7)\x18\x0c\xae\xe1\xff\x0b`\
578 \xa7\xe38\x1f\x02\x07\x1c\xe0J\xa1P\xf8\xd8q\x9c\x8f3\x99L_0\x18\x8c\x9c?\
579 \x7f\x9ec\xc7\x8e\xd1\xd8\xd8\x88m\xdb\x14\x8bE\xc6\xc7\xc7y\xf2\xe4\t\xcf\
580 \x9f?\'\x9f\xcf\x13\n\x85\xd8\xb4i\x13\xc6\x18|\x7f\x95\x8d\x13\x13\x13\x94\
581 \xcb\xe5\x0e\xdb\xb6\xfb\x8c1\xfd\xc0n\x80\xe7\x80\xe2\xf1\xb8N\x9e<\xa9\xd1\
582 \xd1Q_\x92\x8a\xc5\xa2r\xb9\x9c$\xe9\xe9\xd3\xa7z\xff\xfd\xf7\xd5\xd0\xd0 \
583 \xdb\xb6u\xf4\xe8Q=z\xf4H\x92\x94\xcb\xe5T(\x14$I\xb7n\xdd\xf2\x07\x07\x07u\
584 \xfc\xf8q\xd9\xb6\xad\xbao^tuuUFFF\x94\xcb\xe5\x94\xcf\xe7\x95L&\xd7\xf7\x92\
585 t\xef\xde=544l\xe4\xban\xdf\xbe-I\xca\xe7\xf3\xca\xe7\xf3*\x14\nJ\xa7\xd3J\
586 \xa5R\x1a\x1d\x1dUww\xf72\xf0\xc2e\xadg\xb8.\xbe\xefcY\x16\xc1`\xf0\xad\x02\
587 \x91\xb4\x0e\x03\x801\x06c\xcc[:\xc5b\x91p8\x8ceY\xd8\xb6\x8deY\x00\x96\x03\
588 \xfc\xa8T*\xbd\xb3\xb4\xb4\xc4\xe3\xc7\x8fYZZ2\x87\x0f\x1f\xb6|\xdf\xc7\x18C\
589 \x10 \x9f\xcf\xf3\xea\xd5+fgg\x91\xc4\x91#G\x18\x1a\x1a"\x1a\x8d\xb2\xbc\
590 \xbc\x8cm\xdbl\xde\xbc\x99\xfb\xf7\xef\x9b\x91\x91\x11\xeb\xd9\xb3g\x8c\x8f\
591 \x8f;@\xca\x02\xae\x00\xbd\xb6m7\x19cvttt\xc4\xce\x9c9\xc3\xb9s\xe7\x08\x87\
592 \xc3\x00\x14\n\x05&\'\'\x99\x9e\x9e\xc6\x18\xc3\x8e\x1d;\xd8\xbbw/\xe1p\x18I\
593 T*\x15FFF\x18\x1e\x1e&\x97\xcb\xcduvv\xcef2\x99\x95j\xb5\xfa\x02\xa0\xc3q\
594 \x9c\xe3\xf5\xc2\xf8\xf9\xffK\xd3\xe6\xe6f\x01\n\x87\xc3\xb7zzz\xfa\xf6\xec\
595 \xd9\xf3}\xe0=\x07(I\xaa\xc5b\xb1`6\x9b=\x1a\x89D\xde;{\xf6,\x03\x03\x03\x04\
596 \x83A\\\xd7\xc5\x18C\xa5R\xa1Z\xadR\xadV\xd7a\t\x04\x02\x00,//S\xab\xd5X\\\\\
597 \xa4T*M\xce\xcd\xcd\xfdqaa\xe1_\xc0\xcb\xb57\xda\xb5\xb1U\xcc\xcf\xcf+\x91H\
598 \xc8\xf3<y\x9e\xa7\x85\x85\x05\x15\n\x85\xb7\x18\x93\xc9d\xe4y\x9e\xd2\xe9\
599 \xb4\x12\x89\x84\xd2\xe9\xb4\xe2\xf1\xb8\x00\xc5b\xb1g\xc0>\x81e\xd7\x03lO\
600 \xcc\xcdm^#M\xa5R!\x18\x0cr\xfd\xfau\xa2\xd1(W\xaf^\xa5\xa5\xa5\x85r\xb9\x0c\
601 @KK\x0b7n\xdc \x1a\x8dr\xed\xda5\x9a\x9a\x9aXZZB\x92\x00\x12\x89\xc4\x16 f\
602 \x81\x10XC\xab=\xe9\xd3:\x86\xea\xef\xef7\xf1x\xdc\xec\xdf\xbf_\x80ZZZ466\
603 \xe6\xe7\xf3ye\xb3Y\xdd\xb9s\xc7\xef\xec\xec\x14\xa0\xd6\xd6V\xc5\xe3q\xc5\
604 \xe3\xf1\xf5\xf6\x0e\xdc\x05\x1aW\xaf[\xaf\x03\xa0\xab>,\xd6\x0b\xaa\xb5\xb5\
605 \xf5\xb7\xe1p\xf8\xd7\xc0\xec\x89\x13\'\x94\xcb\xe5\x94\xc9dt\xea\xd4)\x01o\
606 \x80_\x02\x9fm\xb4q]\xf7w@\xf7\x9ao\x17\xe0 4\xfc\x15\x92\xc6\x98\x1f\x02\
607 \x15\xd7u\xbf\xd9\xdd\xdd\x9d\x7f\xf3\xe6\xcdOw\xef\xde\xed477\xefK&\x93\xdd\
608 w\xef\xde\xc5u]<\xcf\xc3\xb6\xed\x97\xc6\x98\x91X,\xd6$\xe9\xabsssm\xb5Z\xed\
609 /+++\x97\x80\x04\xab\xa8\x18~\x02v=\x8b\x8d\xf3\xf9\xa3:m\xb7\xf6\xf4\xf4|/\
610 \x10\x08\xfc\tPww\xf7\xf2\xb6m\xdb\x96\x1d\xc7\x11\xf0\x07\xc7q\xbe\r\xbc\
611 \x0b\xec\x05\xbe\xb3\x0eK}\x0c\xacgp\x05,\xad\x0eh\x0b0\x16\xfc~\x8d^SSS\xed\
612 \xc0\x04\xf0\x95D"\xb1\xf1\xdb2\xed\xfb\xfe\x7f\x80\x99\xba\xead\xfd\xa2\x16\
613 \xab?\x0b\x0b\xe0\xbf\xf5\x19yJo\xfcW\xe3\x00\x00\x00\x00IEND\xaeB`\x82'
614
615 def getRefreshBitmap():
616 return BitmapFromImage(getRefreshImage())
617
618 def getRefreshImage():
619 stream = cStringIO.StringIO(getRefreshData())
620 return ImageFromStream(stream)
621
622 #----------------------------------------------------------------------
623 def getFindData():
624 return \
625 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
626 \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
627 \x06\x04IDATH\x89\xb5\x95Mh\x1b\xdb\x15\xc7\xffs\xe7\x8e4\xfa@V%K\xc6\r\x91\
628 \x12^\xeb$d\xf3\x08\xc1V\xa8\xc9\xb3i\xe2x\x97\x10(]$\xf0\xc0!i> i\xc0\x8bR(\
629 \xcf\xdd\xb4\xf1\xaad\xd7E\x9cdS\x08\xdd\x98.\x82\xbc0\xe9\xc3q)\xc6\xa4v\
630 \x82\xbf\x82\x15;\x93\x91,[c\xcb\x965\xdfsgn\x17\x0f\xf9\xb9\xa4o\xd7\x1e\
631 \x18\xb8w8s\x7f\xf7\xf0\xff\x9f3\xc0\xff9\x84\xc3\x9b\xb1\xb1\xb1\xdf\xf8\
632 \xbe\xff\xc7\xd7\xaf_C\x92$\x00\x80\xe388u\xea\x14\xb2\xd9\xec\xb7\xb7n\xdd\
633 \xea\x07\x80\'O\x9e\x145M\x1b\\XX@8\x1c\x06\x00x\x9e\x87\xde\xde^PJ\x7f\x7f\
634 \xe3\xc6\x8d\x91\xcfH\xe3\xe3\xe3\xc3\xf7\xee\xddc\xf9|\x9e\x038xB\xa1\x10/\
635 \x14\n\xfc\xfa\xf5\xeb\x7fo\xe5^\xbbv\xad\xd8\xdb\xdb{\x90C\x08\xe1\xa2(\xf2\
636 \\.\xc7o\xdf\xbe\xcd\xc6\xc7\xc7\x7f\xdb\xca\xa5\xad\x85\xef\xfb_\x11B\xc4\
637 \xcd\xcdMv\xf5\xeaUZ(\x14P.\x97\xf1\xfc\xf9s\xcc\xcd\xcdA\x10\x04\xab\x95\
638 \xbb\xb6\xb6f\xce\xcc\xcc\xe0\xf4\xe9\xd3\xb8s\xe7\x0e&\'\'Q\xab\xd50;;\xcb\
639 \x04A\xa0\x8c\xb1~\x00\x7f\xf8\x0f\x00\xa5t\xbb^\xaf#\x91H\xd0\x0b\x17.\xe0\
640 \xca\x95+X[[\xc3\xabW\xaf\xf0\xe9\xd3\'tuu}q\xe6\xcc\x99\xaf\t!\xac\xd9l\x9e\
641 x\xf3\xe6\rN\x9e<\x89\x9b7o\x82R\nUUQ*\x95\xe8\xee\xee.(\xa5\xdb\x9fU \xcb2\
642 \x18c\xd04\r333\xd8\xda\xda\x82\xef\xfb\xd8\xde\xde\x86,\xcb,\x9dNwy\x9e\xf7\
643 \\\x10\x04\xa4R)$\x93Io~~^z\xfc\xf81\x16\x17\x17!\x08\x024M\x83m\xdb\x08\x85\
644 B\xf8\x0c\xe0\xba.8\xe7 \x84@\x14E\xd4\xebuX\x96\x85 \x08\x10\x04\x01U\x14%0\
645 M\xd3\x01\x80X,\x16\xe6\x9cK\xb6mcuu\x15\x9a\xa6!\x9dN\x1f\x18\x831v\x00 \
646 \xad\xc5\x87\x0f\x1f\x9a\x8a\xa2@\x14Ed\xb3Yx\x9e\x87b\xb1\x08\xc7q\xd0\xd3\
647 \xd3\x83l6\xfb\x8fb\xb1\x18-\x16\x8b\xd1l6\xfb\xea\xdc\xb9s0\x0c\x03\x13\x13\
648 \x138v\xec\x18\x18cp]\x17\xd5j\x15+++\x07\x00\x11\x00\xee\xde\xbd\xfb\xbb\
649 \xb7o\xdf\xde\x92e9\xd2\xdd\xdd\r]\xd7111\x81J\xa5\x02Y\x96q\xf6\xecY\xd8\
650 \xb6M\xdf\xbd{w\x04\xc0\x85\xae\xae\xae\xaf\x92\xc9d\xdb\xd2\xd2\x12j\xb5\
651 \x1a4MC>\x9fGGG\x07$I\x82\xaa\xaa\xd3\xa5R\xe9\xe5\x01\xa0\xbb\xbb\xfbo\xab\
652 \xab\xab?\xda\xda\xdab\xc9d\x92\xcc\xce\xceBQ\x14\xc8\xb2\x8c\\.\xc7\xc2\xe1\
653 0\xd1u=a\x9a\xe6\xb9x<\xfe\xb3x<\xde\xe6\xba.\x0c\xc3`\xf5z\x9d\xec\xed\xedA\
654 \x14Ed2\x19\xa8\xaa\x8ar\xb9\xdcv\xff\xfe\xfd\xad\xa9\xa9\xa9E\n\x00\xe1p\
655 \xf8c\xa5R\xf9\xd24MZ(\x14\xd0\xdf\xdf\x8fK\x97.AUU\xac\xaf\xaf\xd3\x85\x85\
656 \x85R4\x1a-\xa7R\xa9>\x00(\x97\xcbS\x8dF\xa3#\x9f\xcf\x9f\x18\x18\x18\x80(\
657 \x8a\xd0u\x1d\xd5j\x15\xef\xdf\xbf\xf7r\xb9\xdcO\x1b\x8d\xc6_\x00\xfc\x15\
658 \x00\xf0\xf0\xe1\xc3\xb9T*\xc5\x07\x06\x06x\xadV\xe3\x86a\xf0\xf5\xf5u><<\
659 \xcc\xdb\xda\xda8\x80a\x00\x91C\r\x98\x04p\xbb\xaf\xaf\x8f+\x8a\xc2\x9b\xcd&\
660 \xd74\x8d\x8f\x8c\x8cpY\x96y.\x97\xe3\x0f\x1e<X>p\x11!\x04\x94R\xe8\xba\x0eU\
661 U\x11\x89DP*\x95\xa0\xebz\xcb\x19\x0c\x80{\xa8\xf1=\x00\xbe\xe38PU\x15\x86a`\
662 cc\x03{{{\x90$\t\x82 \x80\x10\xf2\xbdM\x1d\xc7qL\xd3\x84\xa6i\xd8\xdc\xdc\
663 \x84,\xcbX^^\x86i\x9a\xadY\xf3+\x00\x83\x87\x00\xe3\x00~\xec8\x0e*\x95\n<\
664 \xcf\xc3\xca\xca\nvvv`\x9a&$I\x82\xe38.\x00\x88ccc#/^\xbc\xf89\x80x\xa1P@gg\
665 \'l\xdbF\xb5ZE\xbd^\xc7\xf2\xf2\xb2\xc79\xef\xe8\xe9\xe9\xf9\xc9\xf1\xe3\xc7\
666 \x91\xcf\xe7q\xf4\xe8\xd1/\xca\xe5r6\x91Hx\xdd\xdd\xdd\xa2\xeb\xba(\x97\xcb\
667 \x90$\t\xed\xed\xedh4\x1a\xa8T*\xe2\xa3G\x8fb\x941\xf6\xcd\xe2\xe2".^\xbc\
668 \xe8\x9f?\x7f^\xacV\xabH&\x93p\x1c\x07\x9cs\xd8\xb6-\xe5r9\x0c\x0e\x0en\xeb\
669 \xba\xfe-\x80 \x1e\x8f\xf7U\xab\xd5\xaca\x18\x92i\x9ap\x1c\x07\xba\xae#\x1a\
670 \x8d\xe2\xf2\xe5\xcb`\x8c\xf9/_\xbelg\x8c}C\xa6\xa7\xa7\xc19G&\x93\x11=\xcf\
671 \xc3\xce\xce\x0el\xdb\xc6\xce\xce\x0e\x18c\xa0\x94\x82\x10\x82\xfd\xfd\xfd\
672 \x7f\x8d\x8e\x8e\xfebtt\xf4\x97\xcdf\xf3\x9f\x94R\xb8\xae\x8bz\xbd\x0e\xdb\
673 \xb6\xd1h4\xa0(\n,\xcbB&\x93\x11\x01`zz\x1a\xa4%\x8aeY`\x8c\x81\x10\x02\xc7q\
674 @\x08\x81 |\xf7\xbb\xe0\x9c\x83s\x1e:\xa4A\xb85V\x04A\x80\xe38\x10\x04\x01\
675 \xa1P\x08\x9e\xe7\xc1\xb2\xbe\x1b\xbc\x92$\xa1\xd5\x07(\x95J\x90e\x19\xae\
676 \xebbww\x17\x86a\xc0\xf7}\xfcPPJa\x18\x06VWW\x11\n\x85`\x9a&,\xcb\xc2\xdc\
677 \xdc\x1cJ\xa5\xd2\xc1\\\xa2\xad\x1b\x8a\xa2\x88T*\x85X,\x86L&\x83\x8f\x1f?"\
678 \x08\x02\xc8\xb2\xfc_AA\x10\x80R\x8a\xce\xceNttt@UUloo\x831\x06\xcb\xb2\xbe\
679 \xb7i$\x12A\x10\x04PU5XZZ"\xd1h\x14\xf1x\x1c\x8a\xa2 \x08\x02\xd4j5?\x9dN\
680 \x8b\x00\xda\x0f\x1d\xdeN)E\xbd^\xf7\xe7\xe7\xe7\xc5t:\rUU\xd1l6\xc19\x87\
681 \xa2(\x81\xef\xfb$\x12\x89\x80Z\x965\x7f\xe4\xc8\x91\x13\x1b\x1b\x1b\x91\xa9\
682 \xa9)p\xce\x11\x04\xc1A\x89\x92$\x89\xf1x\x1c\x00\xa6Z\x00B\xc8\xebX,vV\x92$\
683 qrr\x12\xbe\xefC\x92\xa4\xc3\xba\x91\xce\xceN\xc7\xb2\xace\x01\x00\x86\x86\
684 \x86\xe6"\x91\xc8\x97-q\x0eG"\x91@\xa3\xd1\xf8\xf3\xb3g\xcf\xee\x1c~?44\xf4\
685 \xa7D"\xf1\xeb\xfd\xfd\xfd\xcf\xbe\x91e\x19\xb6m\xaf<}\xfa\xf4\xd4\x0f\x8a\
686 \xf8\xbf\x8a\x7f\x03\x7f_\x17\xc3%\x00\xe7\xe4\x00\x00\x00\x00IEND\xaeB`\x82\
687 '
688
689 def getFindBitmap():
690 return BitmapFromImage(getFindImage())
691
692 def getFindImage():
693 stream = cStringIO.StringIO(getFindData())
694 return ImageFromStream(stream)
695
696 #----------------------------------------------------------------------
697 def getShowSizersData():
698 return \
699 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
700 \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
701 \x04(IDATH\x89\xb5\x95Mh\\U\x14\xc7\x7f\xf7\xdey\xf7\xcd\xbcy\x99\xc9\xb43\
702 \x93\x99\xc4iM\x02~\x97R\xa9Q(\x82\x16*\xb5\xeaFP\x8b;\x0b\xe2\xb6\xba(\xa8\
703 \xa0\xe0F\x17"\xaeD\xa9\x8a\x04\x84\n]\x16\x05\xadt\xe1B\xa8H\x8a\x0bK\xc4\
704 \xd6\x966\xb553\x93\xc9L\xf3\xe6\xcd\xfb\xb8\xd7EZ\x9b\xa6%)-\x1e\xb8\xab\
705 \xcb\xff\xfc\xce=\xfc\xcf\xb9\xf0?\x87X\xe7\xfe\xc1R\xa9\xf4\xaa\xeb\xba\xdb\
706 \xad\xb5\x8b\xd7\t\x85(\xc6q<\xd3j\xb5\x0e\x02\xbf\xdd\x16}lll\xbf7\xe4\x9d\
707 \x92\xc8(Cf\xe1\xdaaAB\x94\xf3\xbd\xd3\xf5z\xfd\xc0Z92k]*\xa5\xee2=\xb3\xd9\
708 \xdcg\x94y\xc1\x0c\xb3\x04(`\xae\x08\xdf\x0f\xb0\xcdh\xb3\xde\xa8\x1b\xb7\r\
709 \x00B\x81\xe8\xb3\x05\x9f7\x1c\x98-\x816\xf0g\x15~\xbf\x08\xcdN`\x8c\xe9\xdf\
710 \t`9b\xe0\xaf\x1c\xfc4\t\x19\x0b\x84`\xe3[\x92\xde\x1a \x05Z1\x9ci\x82\xb2Pr\
711 \xc0\xc2\xfa\x1eY\x07 \xa5\xcc\xd9\x8c\xcd\xf3\x03p\xa2\x0f\x97\xcf\x02X\xa4\
712 \x15tbp\xdc\xbc\x94\xd2[+\x87Z\xb3\xf04U\xd2\x95%\xdf\xf8\xa1j\x89f\x14\x86U\
713 \xc2Tx}\xe7\xe4\x90?4g\xb5:\x11\x06\xfdo\xa2(\x9a\xbd-@\x14E\xedJ\xb9RP\xae\
714 \xba\xa7\x9f\x86\x15\xadu\xe48N`\x14*_\xf0\xdb^.\xf7m\xb3\xd9<\x02\x04W$7\
715 \xf4l-@\xaeX,N%I\xb2\xa7\xd7\xeb\xedJ\xd3tP.\x97\xa7}\xdf\xff\xb5\xdb\xedn\
716 \x1d\x0c\x06\xf7Zk\x17\xb4\xd6\x97\x06\x83\xc1E\x96\xadpS\xc8\xcd\xa2\xa8\
717 \x94z\xaeV\xab\x1d\xd2Z[\xaduk\xd3\xa6M\xef\x00\xdb\x81m\x8dF\xe3m\xd7u\xe7\
718 \x1d\xc7\xb1###\x87\x95R\xcf\x03\xa5\xf5\x92^%+\xa5\xd4\xee\xb1\xb1\xb1O\x94\
719 RK\x9e\xe7\x85\xe5r\xf9K\xe0\xb1\x15/~\xa4R\xa9|\x9e\xcf\xe7\x97\xa4\x94\xc1\
720 \xe8\xe8\xe8A\xa5\xd43\\3\xcd\x7f\xaf\xb8\xa1E\xf9|~g\xa1Px\xa5\xd9l\xee\xd5\
721 Z\xf7]\xd7=\x94$\xc9g\x83\xc1\xe08W\xcc\t\\\x00\xe6\xb4\xd6J\x081\xd9\xedv\
722 \xa7J\xa5\x92\'\x84h\xc7q|ze>\x05\x8c4\x1a\x8d\x1d\xb5Zm\x8b\xef\xfb\x0f\'I\
723 \xf2b\xbf\xdf\x7fVJ9_.\x97g\x93$9\xd2\xe9t\x8e\xb2<\r\xe2juq\x1c7\xb3\xd9l\
724 \xb1T*\xd5\xc20TI\x92l\xd5Z\xfb\xd5j5;222\xe1\xfb\xfe\xf8\xe2\xe2bOx\x9ew\
725 \xc0q\x9c\x971\xe9\x03\x12\xd3\t\x07Q\xa1\x1f%\xee\xb0\xe2g<\xbf\x90\x085c\
726 \x92\xf8\xa3 \x08fVV\xe6y\xde\xd6\x8c\x94\xfbQj\xaa/M\x10/\xf4\xb6\x93u\x02\
727 \'\xe7-(c6d\x91\xa7\xa38\x9e\xa6^\xaf\x1f\x93B$\x08eqr-\x94\x9e\xc7\xcd\xcfS\
728 \x1a\xb5 \xedP\xde\xebOLL\xbc\xb6\xba\x95\xe3\xe3\xe3\xfb\xfc\xc2P\x1f\xb0%T\
729 \xb8\x91Lg\x18uy\x03*\xc8\x81E\x8a\xb4^\xaf\x1f\xcb\x18c\x02a\xad\xe2\xa1]_\
730 \xf1\xe9w\xd3\xfc8\x93\xc5u\xef\xc6\xcd|\xc8\xc7/y\x9c=\x11\x00\xd1ML\x11-\
731 \xd94\xad\x91\xe9\x9fdj\xda`\x92\x90T\x8cR\xe8\xbd\xc9\xc9G?\x10\x17\x9e0\
732 \xc6\x04\xd7V\x85\x10\x97\xd8\x81\xcf?\xdb\x9e$%O\x7fI!\xd7\x9cC,\x08\t\xf10\
733 C\x01dw\x82\xaat\t\x83K\xc8\n\x10\xc2\xca]\x94\xda9R&\xb1\xbc\x8e\xa4\xcdP^#\
734 \xe4\x9a\x00@d\x10)x\xe1,K\x93\x92\x8c? %\x8b\x06\xe8\x01d\x84\x109\x0bp\xfa\
735 \xf8n\xf6\xbe\xe7S\x19\x85\xe0\xf2\x06\x10\xd0\x9e\x83\x0c\x1e,+\xae\xcb,\
736 \x84\xa3\x85t:\xc4\xb9\xb7\xf8\xe5\xf1S\xa4n\x04lD3K\x0f,Y!D.c\x8c9\xa7\xb4>\
737 C\xd8\xde#\x0e\xbf\x0b\xb0\xc0\x95\xf9\xb0\x90\xb7\xc5\xe1\xb3I\x92\xb4V\x03\
738 \xe28n\xe7\x90\x7f,Jq\xff\xfb\xe2\xfc\x0e`\x89\xe5\x9d$\xb0hW\xe9\xb61\xe6\
739 \x9c\x00\x9e\xaeV\xab{\xa5\x94\rk\xedu\xbf\x93\x10\xa2\x10\x04\xc1\xd1n\xb7\
740 \xfb\x05p~\x15c\xd4\xf7\xfd}\xbe\xef?e\xad\xed\xad\xd2e\xd34\xfd{~~\xfe\xeb\
741 \xf5z|\xc7\xf1/Y%\x9eF\x90EP\xda\x00\x00\x00\x00IEND\xaeB`\x82'
742
743 def getShowSizersBitmap():
744 return BitmapFromImage(getShowSizersImage())
745
746 def getShowSizersImage():
747 stream = cStringIO.StringIO(getShowSizersData())
748 return ImageFromStream(stream)
749
750 #----------------------------------------------------------------------
751 def getShowFillingData():
752 return \
753 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\
754 \x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\
755 \x01\x9eIDATH\x89\xed\x95\xcfJ\x02A\x1c\xc7?\xad\xbb\xb3\xb1-\x14\xae\x19E\
756 \xed!\xf5)\xbaE\xbd@\x97\x0e\xdez\x84.\x82\xd7.\xbd\x81\xb7\x8e\xddD\x10*\
757 \x83\x12z\x06\xa30<\x97\xb4\x14Ibh\xb3k\x17\x15u\xcdv\xadc\xdf\xd303\xdf\xef\
758 g\x86\xdf\xfc\x81\x7f\xfd\xa0\xb9\xa1\xf6\x0e\xb0\x0b\xac\x00\xed\x19\xf3\
759 \x04\xf0\x02\x94\x80+\x00uhp_U\xd5m)\xe52\xd0\x99\x11\xa0)\x8a\xfa\xeayrq\
760 \x12`CJ\xb9~tt(67\xf78?\x7f\xc64\x83'\x9b\xe62\xb7\xb7g\\^\x1e/\x00\x1b\xfd\
761 \xfea\xc0\x07\xf0a\x18I\xb1\xba\xba\x85m?b\x18\xc1\x01KKk<==\x0cr&\x01\x00\
762 \xb8\xb9\xb9G\xd3\xae\xb1,\x07\xcf\x0b\x0e\xd0u\x0bM\xbb\x03\xe8~7\xa7\x00\
763 \xbc\x15\n\xf9\xee\xac\xba\xb88\xeb\x02\xef\xbd,\x00\x94qJ\xbb\xfd\x19|\xd9\
764 \x01\xbc>\x80\x10bf\xc0$\xaf\xaf\x06\x8dF\x03\x80f\xb3\x19*\xdc4\xcd\x81w* \
765 \x97\xcbQ.\x97i\xb5Z\xa1\x00\x86aP\xab\xd5`\xac\xc8>@\xa5R\xa1Z\xad\xe2\x859\
766 B\x80\xa2(t:\xfe\xfb\xe9\x03d2\x19\xd2\xe94\xf5z=\x14 \x1e\x8f\x93\xcf\xe7\
767 \xc9f\xb3\xd3\x01\x89D\x82d2\x89m\xdb\xa1\x00B\x08R\xa9\x14\x8c\xbeo~\x80\
768 \xae\xeb\x03CX\xf5\xbc#5\xf0\x1d\xd3h4\x1a:\xb8/\xcb\xb2`\xca\x0e\xe6\x81\
769 \xf9b\xb1\x08\x80\xe38\xa1\xc2c\xb1\x18\xa5R\t@\xefe1N;\xf9\x8b\xe7:\x12\x89\
770 \xbc\xba\xae{\x05\x1c\xc0\xe8\x0eN\xa5\x94\x0e\xbf\xfcp\\\xd7\xed\x7f8\xff\n\
771 \xa6/8\xf7\xb7\xf5\xb4m\x07\xcd\x00\x00\x00\x00IEND\xaeB`\x82"
772
773 def getShowFillingBitmap():
774 return BitmapFromImage(getShowFillingImage())
775
776 def getShowFillingImage():
777 stream = cStringIO.StringIO(getShowFillingData())
778 return ImageFromStream(stream)
779
780 #---------------------------------------------------------------------------