]>
git.saurik.com Git - wxWidgets.git/blob - 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.
10 # Copyright: (c) 2006 by Total Control Software
11 # Licence: wxWindows license
12 #----------------------------------------------------------------------------
14 # NOTE: This class was originally based on ideas sent to the
15 # wxPython-users mail list by Dan Eloff.
23 class InspectionMixin(object):
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.
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
38 def Init(self
, pos
=(-1, -1), size
=(850,700), config
=None, locals=None,
39 alt
=True, cmd
=True, shift
=False, keyCode
=ord('I')):
41 Make the event binding that will activate the InspectionFrame window.
43 self
.Bind(wx
.EVT_KEY_DOWN
, self
._OnKeyPress
)
52 self
._keyCode
= keyCode
55 def _OnKeyPress(self
, evt
):
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
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()
70 def ShowInspectionTool(self
):
72 Show the Inspection tool, creating it if neccesary.
75 self
._tool
= InspectionFrame(parent
=self
.GetTopWindow(),
81 # get the current widget under the mouse
82 wnd
= wx
.FindWindowAtPointer()
83 self
._tool
.SetObj(wnd
)
89 #---------------------------------------------------------------------------
91 class InspectionFrame(wx
.Frame
):
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.
97 def __init__(self
, wnd
=None, locals=None, config
=None,
98 app
=None, title
="wxPython Widget Inspection Tool",
101 wx
.Frame
.__init
__(self
, *args
, **kw
)
103 self
.includeSizers
= False
106 self
.MacSetMetalAppearance(True)
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
)
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,
121 showInterpIntro
=False,
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
)
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)
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))
141 refreshBmp
= getRefreshBitmap()
142 findWidgetBmp
= getFindBitmap()
143 showSizersBmp
= getShowSizersBitmap()
144 toggleFillingBmp
= getShowFillingBitmap()
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',
153 toggleFillingTool
= tbar
.AddLabelTool(-1, 'Filling', toggleFillingBmp
,
154 shortHelp
='Show PyCrust \'filling\'',
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
)
167 def _postStartup(self
):
168 if self
.crust
.ToolsShown():
169 self
.crust
.ToggleTools()
173 def UpdateInfo(self
):
174 self
.info
.Update(self
.obj
)
176 def SetObj(self
, obj
):
179 self
.locals['obj'] = self
.obj
= obj
181 if not self
.tree
.built
:
182 self
.tree
.BuildTree(obj
, includeSizers
=self
.includeSizers
)
184 self
.tree
.SelectObj(obj
)
187 def RefreshTree(self
):
188 self
.tree
.BuildTree(self
.obj
, includeSizers
=self
.includeSizers
)
191 def OnRefreshTree(self
, evt
):
195 def OnFindWidget(self
, evt
):
196 self
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnLeftDown
)
197 self
.Bind(wx
.EVT_MOUSE_CAPTURE_LOST
, self
.OnCaptureLost
)
199 self
.finding
= wx
.BusyInfo("Click on any widget in the app...")
201 def OnCaptureLost(self
, evt
):
202 self
.Unbind(wx
.EVT_LEFT_DOWN
)
203 self
.Unbind(wx
.EVT_MOUSE_CAPTURE_LOST
)
206 def OnLeftDown(self
, evt
):
208 wnd
= wx
.FindWindowAtPointer()
213 self
.OnCaptureLost(evt
)
216 def OnShowSizers(self
, evt
):
217 self
.includeSizers
= not self
.includeSizers
221 def OnToggleFilling(self
, evt
):
222 self
.crust
.ToggleTools()
225 def OnShowSizersUI(self
, evt
):
226 evt
.Check(self
.includeSizers
)
229 def OnToggleFillingUI(self
, evt
):
231 evt
.Check(self
.crust
.ToolsShown())
235 #---------------------------------------------------------------------------
237 # should inspection frame (and children) be includeed in the tree?
238 INCLUDE_INSPECTOR
= True
240 class InspectionTree(wx
.TreeCtrl
):
242 All of the widgets in the app, and optionally their sizers, are
243 loaded into this tree.
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
)
251 self
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelectionChanged
)
254 def BuildTree(self
, startWidget
, includeSizers
=False):
256 self
.DeleteAllItems()
260 realRoot
= self
.AddRoot('Top-level Windows')
262 for w
in wx
.GetTopLevelWindows():
263 if w
is wx
.GetTopLevelParent(self
) and not INCLUDE_INSPECTOR
:
265 root
= self
._AddWidget
(realRoot
, w
, includeSizers
)
266 self
.roots
.append(root
)
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
)
274 self
.ExpandAllChildren(topItem
)
275 self
.SelectObj(startWidget
)
279 def _AddWidget(self
, parentItem
, widget
, includeSizers
):
280 text
= self
.GetTextForWidget(widget
)
281 item
= self
.AppendItem(parentItem
, text
)
282 self
.SetItemPyData(item
, widget
)
284 # Add the sizer and widgets in the sizer, if we're showing them
286 if includeSizers
and widget
.GetSizer() is not None:
287 widgetsInSizer
= self
._AddSizer
(item
, widget
.GetSizer())
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
)
298 def _AddSizer(self
, parentItem
, sizer
):
300 text
= self
.GetTextForSizer(sizer
)
301 item
= self
.AppendItem(parentItem
, text
)
302 self
.SetItemPyData(item
, sizer
)
303 self
.SetItemTextColour(item
, "blue")
305 for si
in sizer
.GetChildren():
308 self
._AddWidget
(item
, w
, True)
311 widgets
+= self
._AddSizer
(item
, si
.GetSizer())
313 i
= self
.AppendItem(item
, "Spacer")
314 self
.SetItemPyData(i
, si
)
315 self
.SetItemTextColour(i
, "blue")
319 def FindWidgetItem(self
, widget
):
321 Find the tree item for a widget.
323 for item
in self
.roots
:
324 found
= self
._FindWidgetItem
(widget
, item
)
329 def _FindWidgetItem(self
, widget
, item
):
330 if self
.GetItemPyData(item
) is widget
:
332 child
, cookie
= self
.GetFirstChild(item
)
334 found
= self
._FindWidgetItem
(widget
, child
)
337 child
, cookie
= self
.GetNextChild(item
, cookie
)
341 def GetTextForWidget(self
, widget
):
343 Returns the string to be used in the tree for a widget
345 return "%s (\"%s\")" % (widget
.__class
__.__name
__, widget
.GetName())
347 def GetTextForSizer(self
, sizer
):
349 Returns the string to be used in the tree for a sizer
351 return "%s" % sizer
.__class
__.__name
__
354 def SelectObj(self
, obj
):
355 item
= self
.FindWidgetItem(obj
)
357 self
.EnsureVisible(item
)
358 self
.SelectItem(item
)
361 def OnSelectionChanged(self
, evt
):
362 obj
= self
.GetItemPyData(evt
.GetItem())
363 toolFrm
= wx
.GetTopLevelParent(self
)
367 #---------------------------------------------------------------------------
369 class InspectionInfoPanel(wx
.stc
.StyledTextCtrl
):
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
376 def __init__(self
, *args
, **kw
):
377 wx
.stc
.StyledTextCtrl
.__init
__(self
, *args
, **kw
)
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
)
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
))
390 def Update(self
, obj
):
393 st
.append("Item is None or has been destroyed.")
395 elif isinstance(obj
, wx
.Window
):
396 st
+= self
.FmtWidget(obj
)
398 elif isinstance(obj
, wx
.Sizer
):
399 st
+= self
.FmtSizer(obj
)
401 elif isinstance(obj
, wx
.SizerItem
):
402 st
+= self
.FmtSizerItem(obj
)
404 self
.SetReadOnly(False)
405 self
.SetText('\n'.join(st
))
406 self
.SetReadOnly(True)
409 def Fmt(self
, name
, value
):
410 if isinstance(value
, (str, unicode)):
411 return " %s = '%s'" % (name
, value
)
413 return " %s = %s" % (name
, value
)
416 def FmtWidget(self
, obj
):
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:
439 sizer
= obj
.GetContainingSizer()
440 st
+= self
.FmtSizerItem(sizer
.GetItem(obj
))
444 def FmtSizerItem(self
, obj
):
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()))
465 def FmtSizer(self
, obj
):
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()))
489 if obj
.GetContainingWindow():
490 si
= obj
.GetContainingWindow().GetSizer().GetItem(obj
)
493 st
+= self
.FmtSizerItem(si
)
497 class FlagsFormatter(object):
498 def __init__(self
, d
, val
):
504 for k
in self
.d
.keys():
513 wx
.HORIZONTAL
: 'wx.HORIZONTAL',
514 wx
.VERTICAL
: 'wx.VERTICAL',
519 wx
.BOTTOM
: 'wx.BOTTOM',
521 wx
.RIGHT
: 'wx.RIGHT',
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',
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',
544 #---------------------------------------------------------------------------
545 from wx
import ImageFromStream
, BitmapFromImage
549 def getRefreshData():
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'
615 def getRefreshBitmap():
616 return BitmapFromImage(getRefreshImage())
618 def getRefreshImage():
619 stream
= cStringIO
.StringIO(getRefreshData())
620 return ImageFromStream(stream
)
622 #----------------------------------------------------------------------
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\
690 return BitmapFromImage(getFindImage())
693 stream
= cStringIO
.StringIO(getFindData())
694 return ImageFromStream(stream
)
696 #----------------------------------------------------------------------
697 def getShowSizersData():
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'
743 def getShowSizersBitmap():
744 return BitmapFromImage(getShowSizersImage())
746 def getShowSizersImage():
747 stream
= cStringIO
.StringIO(getShowSizersData())
748 return ImageFromStream(stream
)
750 #----------------------------------------------------------------------
751 def getShowFillingData():
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"
773 def getShowFillingBitmap():
774 return BitmapFromImage(getShowFillingImage())
776 def getShowFillingImage():
777 stream
= cStringIO
.StringIO(getShowFillingData())
778 return ImageFromStream(stream
)
780 #---------------------------------------------------------------------------