attempting to work around the fremantle 70pixel theme limit for pannable tree views
[gc-dialer] / src / hildonize.py
1 #!/usr/bin/env python
2
3 """
4 Open Issues
5         @bug not all of a message is shown
6         @bug Buttons are too small
7 """
8
9
10 import gobject
11 import gtk
12 import dbus
13
14
15 class _NullHildonModule(object):
16         pass
17
18
19 try:
20         import hildon as _hildon
21         hildon  = _hildon # Dumb but gets around pyflakiness
22 except (ImportError, OSError):
23         hildon = _NullHildonModule
24
25
26 IS_HILDON_SUPPORTED = hildon is not _NullHildonModule
27
28
29 class _NullHildonProgram(object):
30
31         def add_window(self, window):
32                 pass
33
34
35 def _hildon_get_app_class():
36         return hildon.Program
37
38
39 def _null_get_app_class():
40         return _NullHildonProgram
41
42
43 try:
44         hildon.Program
45         get_app_class = _hildon_get_app_class
46 except AttributeError:
47         get_app_class = _null_get_app_class
48
49
50 def _hildon_set_application_title(window, title):
51         pass
52
53
54 def _null_set_application_title(window, title):
55         window.set_title(title)
56
57
58 if IS_HILDON_SUPPORTED:
59         set_application_title = _hildon_set_application_title
60 else:
61         set_application_title = _null_set_application_title
62
63
64 def _fremantle_hildonize_window(app, window):
65         oldWindow = window
66         newWindow = hildon.StackableWindow()
67         oldWindow.get_child().reparent(newWindow)
68         app.add_window(newWindow)
69         return newWindow
70
71
72 def _hildon_hildonize_window(app, window):
73         oldWindow = window
74         newWindow = hildon.Window()
75         oldWindow.get_child().reparent(newWindow)
76         app.add_window(newWindow)
77         return newWindow
78
79
80 def _null_hildonize_window(app, window):
81         return window
82
83
84 try:
85         hildon.StackableWindow
86         hildonize_window = _fremantle_hildonize_window
87 except AttributeError:
88         try:
89                 hildon.Window
90                 hildonize_window = _hildon_hildonize_window
91         except AttributeError:
92                 hildonize_window = _null_hildonize_window
93
94
95 def _fremantle_hildonize_menu(window, gtkMenu):
96         appMenu = hildon.AppMenu()
97         window.set_app_menu(appMenu)
98         gtkMenu.get_parent().remove(gtkMenu)
99         return appMenu
100
101
102 def _hildon_hildonize_menu(window, gtkMenu):
103         hildonMenu = gtk.Menu()
104         for child in gtkMenu.get_children():
105                 child.reparent(hildonMenu)
106         window.set_menu(hildonMenu)
107         gtkMenu.destroy()
108         return hildonMenu
109
110
111 def _null_hildonize_menu(window, gtkMenu):
112         return gtkMenu
113
114
115 try:
116         hildon.AppMenu
117         GTK_MENU_USED = False
118         IS_FREMANTLE_SUPPORTED = True
119         hildonize_menu = _fremantle_hildonize_menu
120 except AttributeError:
121         GTK_MENU_USED = True
122         IS_FREMANTLE_SUPPORTED = False
123         if IS_HILDON_SUPPORTED:
124                 hildonize_menu = _hildon_hildonize_menu
125         else:
126                 hildonize_menu = _null_hildonize_menu
127
128
129 def _hildon_set_button_auto_selectable(button):
130         button.set_theme_size(hildon.HILDON_SIZE_AUTO_HEIGHT)
131
132
133 def _null_set_button_auto_selectable(button):
134         pass
135
136
137 try:
138         hildon.HILDON_SIZE_AUTO_HEIGHT
139         gtk.Button.set_theme_size
140         set_button_auto_selectable = _hildon_set_button_auto_selectable
141 except AttributeError:
142         set_button_auto_selectable = _null_set_button_auto_selectable
143
144
145 def _hildon_set_button_finger_selectable(button):
146         button.set_theme_size(hildon.HILDON_SIZE_FINGER_HEIGHT)
147
148
149 def _null_set_button_finger_selectable(button):
150         pass
151
152
153 try:
154         hildon.HILDON_SIZE_FINGER_HEIGHT
155         gtk.Button.set_theme_size
156         set_button_finger_selectable = _hildon_set_button_finger_selectable
157 except AttributeError:
158         set_button_finger_selectable = _null_set_button_finger_selectable
159
160
161 def _hildon_set_button_thumb_selectable(button):
162         button.set_theme_size(hildon.HILDON_SIZE_THUMB_HEIGHT)
163
164
165 def _null_set_button_thumb_selectable(button):
166         pass
167
168
169 try:
170         hildon.HILDON_SIZE_THUMB_HEIGHT
171         gtk.Button.set_theme_size
172         set_button_thumb_selectable = _hildon_set_button_thumb_selectable
173 except AttributeError:
174         set_button_thumb_selectable = _null_set_button_thumb_selectable
175
176
177 def _hildon_set_cell_thumb_selectable(renderer):
178         renderer.set_property("scale", 1.5)
179
180
181 def _null_set_cell_thumb_selectable(renderer):
182         pass
183
184
185 if IS_HILDON_SUPPORTED:
186         set_cell_thumb_selectable = _hildon_set_cell_thumb_selectable
187 else:
188         set_cell_thumb_selectable = _null_set_cell_thumb_selectable
189
190
191 def _hildon_set_pix_cell_thumb_selectable(renderer):
192         renderer.set_property("stock-size", 48)
193
194
195 def _null_set_pix_cell_thumb_selectable(renderer):
196         pass
197
198
199 if IS_HILDON_SUPPORTED:
200         set_pix_cell_thumb_selectable = _hildon_set_pix_cell_thumb_selectable
201 else:
202         set_pix_cell_thumb_selectable = _null_set_pix_cell_thumb_selectable
203
204
205 def _fremantle_show_information_banner(parent, message):
206         hildon.hildon_banner_show_information(parent, "", message)
207
208
209 def _hildon_show_information_banner(parent, message):
210         hildon.hildon_banner_show_information(parent, None, message)
211
212
213 def _null_show_information_banner(parent, message):
214         pass
215
216
217 if IS_FREMANTLE_SUPPORTED:
218         show_information_banner = _fremantle_show_information_banner
219 else:
220         try:
221                 hildon.hildon_banner_show_information
222                 show_information_banner = _hildon_show_information_banner
223         except AttributeError:
224                 show_information_banner = _null_show_information_banner
225
226
227 def _fremantle_show_busy_banner_start(parent, message):
228         hildon.hildon_gtk_window_set_progress_indicator(parent, True)
229         return parent
230
231
232 def _fremantle_show_busy_banner_end(banner):
233         hildon.hildon_gtk_window_set_progress_indicator(banner, False)
234
235
236 def _hildon_show_busy_banner_start(parent, message):
237         return hildon.hildon_banner_show_animation(parent, None, message)
238
239
240 def _hildon_show_busy_banner_end(banner):
241         banner.destroy()
242
243
244 def _null_show_busy_banner_start(parent, message):
245         return None
246
247
248 def _null_show_busy_banner_end(banner):
249         assert banner is None
250
251
252 try:
253         hildon.hildon_gtk_window_set_progress_indicator
254         show_busy_banner_start = _fremantle_show_busy_banner_start
255         show_busy_banner_end = _fremantle_show_busy_banner_end
256 except AttributeError:
257         try:
258                 hildon.hildon_banner_show_animation
259                 show_busy_banner_start = _hildon_show_busy_banner_start
260                 show_busy_banner_end = _hildon_show_busy_banner_end
261         except AttributeError:
262                 show_busy_banner_start = _null_show_busy_banner_start
263                 show_busy_banner_end = _null_show_busy_banner_end
264
265
266 def _hildon_hildonize_text_entry(textEntry):
267         textEntry.set_property('hildon-input-mode', 7)
268
269
270 def _null_hildonize_text_entry(textEntry):
271         pass
272
273
274 if IS_HILDON_SUPPORTED:
275         hildonize_text_entry = _hildon_hildonize_text_entry
276 else:
277         hildonize_text_entry = _null_hildonize_text_entry
278
279
280 def _hildon_mark_window_rotatable(window):
281         # gtk documentation is unclear whether this does a "=" or a "|="
282         window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
283
284
285 def _null_mark_window_rotatable(window):
286         pass
287
288
289 try:
290         hildon.HILDON_PORTRAIT_MODE_SUPPORT
291         mark_window_rotatable = _hildon_mark_window_rotatable
292 except AttributeError:
293         mark_window_rotatable = _null_mark_window_rotatable
294
295
296 def _hildon_window_to_portrait(window):
297         # gtk documentation is unclear whether this does a "=" or a "|="
298         window.set_flags(hildon.HILDON_PORTRAIT_MODE_SUPPORT)
299
300
301 def _hildon_window_to_landscape(window):
302         # gtk documentation is unclear whether this does a "=" or a "&= ~"
303         window.unset_flags(hildon.HILDON_PORTRAIT_MODE_REQUEST)
304
305
306 def _null_window_to_portrait(window):
307         pass
308
309
310 def _null_window_to_landscape(window):
311         pass
312
313
314 try:
315         hildon.HILDON_PORTRAIT_MODE_SUPPORT
316         hildon.HILDON_PORTRAIT_MODE_REQUEST
317
318         window_to_portrait = _hildon_window_to_portrait
319         window_to_landscape = _hildon_window_to_landscape
320 except AttributeError:
321         window_to_portrait = _null_window_to_portrait
322         window_to_landscape = _null_window_to_landscape
323
324
325 def get_device_orientation():
326         bus = dbus.SystemBus()
327         try:
328                 rawMceRequest = bus.get_object("com.nokia.mce", "/com/nokia/mce/request")
329                 mceRequest = dbus.Interface(rawMceRequest, dbus_interface="com.nokia.mce.request")
330                 orientation, standState, faceState, xAxis, yAxis, zAxis = mceRequest.get_device_orientation()
331         except dbus.exception.DBusException:
332                 # catching for documentation purposes that when a system doesn't
333                 # support this, this is what to expect
334                 raise
335
336         if orientation == "":
337                 return gtk.ORIENTATION_HORIZONTAL
338         elif orientation == "":
339                 return gtk.ORIENTATION_VERTICAL
340         else:
341                 raise RuntimeError("Unknown orientation: %s" % orientation)
342
343
344 def _hildon_hildonize_password_entry(textEntry):
345         textEntry.set_property('hildon-input-mode', 7 | (1 << 29))
346
347
348 def _null_hildonize_password_entry(textEntry):
349         pass
350
351
352 if IS_HILDON_SUPPORTED:
353         hildonize_password_entry = _hildon_hildonize_password_entry
354 else:
355         hildonize_password_entry = _null_hildonize_password_entry
356
357
358 def _hildon_hildonize_combo_entry(comboEntry):
359         comboEntry.set_property('hildon-input-mode', 1 << 4)
360
361
362 def _null_hildonize_combo_entry(textEntry):
363         pass
364
365
366 if IS_HILDON_SUPPORTED:
367         hildonize_combo_entry = _hildon_hildonize_combo_entry
368 else:
369         hildonize_combo_entry = _null_hildonize_combo_entry
370
371
372 def _fremantle_hildonize_scrollwindow(scrolledWindow):
373         pannableWindow = hildon.PannableArea()
374
375         child = scrolledWindow.get_child()
376         scrolledWindow.remove(child)
377         pannableWindow.add(child)
378
379         parent = scrolledWindow.get_parent()
380         if parent is not None:
381                 parent.remove(scrolledWindow)
382                 parent.add(pannableWindow)
383
384         return pannableWindow
385
386
387 def _hildon_hildonize_scrollwindow(scrolledWindow):
388         hildon.hildon_helper_set_thumb_scrollbar(scrolledWindow, True)
389         return scrolledWindow
390
391
392 def _null_hildonize_scrollwindow(scrolledWindow):
393         return scrolledWindow
394
395
396 try:
397         hildon.PannableArea
398         hildonize_scrollwindow = _fremantle_hildonize_scrollwindow
399         hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
400 except AttributeError:
401         try:
402                 hildon.hildon_helper_set_thumb_scrollbar
403                 hildonize_scrollwindow = _hildon_hildonize_scrollwindow
404                 hildonize_scrollwindow_with_viewport = _hildon_hildonize_scrollwindow
405         except AttributeError:
406                 hildonize_scrollwindow = _null_hildonize_scrollwindow
407                 hildonize_scrollwindow_with_viewport = _null_hildonize_scrollwindow
408
409
410 def _fremantle_pannable_treeview_theme_workaround(treeview):
411         scrollWindow = treeview.get_parent()
412         scrollWindow.remove(treeview)
413
414         vbox = gtk.VBox()
415         vbox.add(treeview)
416         viewport = gtk.Viewport()
417         viewport.add(vbox)
418         scrollWindow.add(viewport)
419
420
421 def _null_pannable_treeview_theme_workaround(treeview):
422         pass
423
424
425 if IS_FREMANTLE_SUPPORTED:
426         pannable_treeview_theme_workaround = _fremantle_pannable_treeview_theme_workaround
427 else:
428         pannable_treeview_theme_workaround = _null_pannable_treeview_theme_workaround
429
430
431 def _hildon_request_number(parent, title, range, default):
432         spinner = hildon.NumberEditor(*range)
433         spinner.set_value(default)
434
435         dialog = gtk.Dialog(
436                 title,
437                 parent,
438                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
439                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
440         )
441         dialog.set_default_response(gtk.RESPONSE_CANCEL)
442         dialog.get_child().add(spinner)
443
444         try:
445                 dialog.show_all()
446                 response = dialog.run()
447
448                 if response == gtk.RESPONSE_OK:
449                         return spinner.get_value()
450                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
451                         raise RuntimeError("User cancelled request")
452                 else:
453                         raise RuntimeError("Unrecognized response %r", response)
454         finally:
455                 dialog.hide()
456                 dialog.destroy()
457
458
459 def _null_request_number(parent, title, range, default):
460         adjustment = gtk.Adjustment(default, range[0], range[1], 1, 5, 0)
461         spinner = gtk.SpinButton(adjustment, 0, 0)
462         spinner.set_wrap(False)
463
464         dialog = gtk.Dialog(
465                 title,
466                 parent,
467                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
468                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
469         )
470         dialog.set_default_response(gtk.RESPONSE_CANCEL)
471         dialog.get_child().add(spinner)
472
473         try:
474                 dialog.show_all()
475                 response = dialog.run()
476
477                 if response == gtk.RESPONSE_OK:
478                         return spinner.get_value_as_int()
479                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
480                         raise RuntimeError("User cancelled request")
481                 else:
482                         raise RuntimeError("Unrecognized response %r", response)
483         finally:
484                 dialog.hide()
485                 dialog.destroy()
486
487
488 try:
489         hildon.NumberEditor # TODO deprecated in fremantle
490         request_number = _hildon_request_number
491 except AttributeError:
492         request_number = _null_request_number
493
494
495 def _hildon_touch_selector(parent, title, items, defaultIndex):
496         model = gtk.ListStore(gobject.TYPE_STRING)
497         for item in items:
498                 model.append((item, ))
499
500         selector = hildon.TouchSelector()
501         selector.append_text_column(model, True)
502         selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
503         selector.set_active(0, defaultIndex)
504
505         dialog = hildon.PickerDialog(parent)
506         dialog.set_selector(selector)
507
508         try:
509                 dialog.show_all()
510                 response = dialog.run()
511
512                 if response == gtk.RESPONSE_OK:
513                         return selector.get_active(0)
514                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
515                         raise RuntimeError("User cancelled request")
516                 else:
517                         raise RuntimeError("Unrecognized response %r", response)
518         finally:
519                 dialog.hide()
520                 dialog.destroy()
521
522
523 def _on_null_touch_selector_activated(treeView, path, column, dialog, pathData):
524         dialog.response(gtk.RESPONSE_OK)
525         pathData[0] = path
526
527
528 def _null_touch_selector(parent, title, items, defaultIndex = -1):
529         parentSize = parent.get_size()
530
531         model = gtk.ListStore(gobject.TYPE_STRING)
532         for item in items:
533                 model.append((item, ))
534
535         cell = gtk.CellRendererText()
536         set_cell_thumb_selectable(cell)
537         column = gtk.TreeViewColumn(title)
538         column.pack_start(cell, expand=True)
539         column.add_attribute(cell, "text", 0)
540
541         treeView = gtk.TreeView()
542         treeView.set_model(model)
543         treeView.append_column(column)
544         selection = treeView.get_selection()
545         selection.set_mode(gtk.SELECTION_SINGLE)
546         if 0 < defaultIndex:
547                 selection.select_path((defaultIndex, ))
548
549         scrolledWin = gtk.ScrolledWindow()
550         scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
551         scrolledWin.add(treeView)
552
553         dialog = gtk.Dialog(
554                 title,
555                 parent,
556                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
557                 (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
558         )
559         dialog.set_default_response(gtk.RESPONSE_CANCEL)
560         dialog.get_child().add(scrolledWin)
561         dialog.resize(parentSize[0], max(parentSize[1]-100, 100))
562
563         scrolledWin = hildonize_scrollwindow(scrolledWin)
564         pathData = [None]
565         treeView.connect("row-activated", _on_null_touch_selector_activated, dialog, pathData)
566
567         try:
568                 dialog.show_all()
569                 response = dialog.run()
570
571                 if response == gtk.RESPONSE_OK:
572                         if pathData[0] is None:
573                                 raise RuntimeError("No selection made")
574                         return pathData[0][0]
575                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
576                         raise RuntimeError("User cancelled request")
577                 else:
578                         raise RuntimeError("Unrecognized response %r", response)
579         finally:
580                 dialog.hide()
581                 dialog.destroy()
582
583
584 try:
585         hildon.PickerDialog
586         hildon.TouchSelector
587         touch_selector = _hildon_touch_selector
588 except AttributeError:
589         touch_selector = _null_touch_selector
590
591
592 def _hildon_touch_selector_entry(parent, title, items, defaultItem):
593         # Got a segfault when using append_text_column with TouchSelectorEntry, so using this way
594         try:
595                 selector = hildon.TouchSelectorEntry(text=True)
596         except TypeError:
597                 selector = hildon.hildon_touch_selector_entry_new_text()
598         defaultIndex = -1
599         for i, item in enumerate(items):
600                 selector.append_text(item)
601                 if item == defaultItem:
602                         defaultIndex = i
603
604         dialog = hildon.PickerDialog(parent)
605         dialog.set_selector(selector)
606
607         if 0 < defaultIndex:
608                 selector.set_active(0, defaultIndex)
609         else:
610                 selector.get_entry().set_text(defaultItem)
611
612         try:
613                 dialog.show_all()
614                 response = dialog.run()
615         finally:
616                 dialog.hide()
617
618         if response == gtk.RESPONSE_OK:
619                 return selector.get_entry().get_text()
620         elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
621                 raise RuntimeError("User cancelled request")
622         else:
623                 raise RuntimeError("Unrecognized response %r", response)
624
625
626 def _on_null_touch_selector_entry_entry_changed(entry, result, selection, defaultIndex):
627         custom = entry.get_text().strip()
628         if custom:
629                 result[0] = custom
630                 selection.unselect_all()
631         else:
632                 result[0] = None
633                 selection.select_path((defaultIndex, ))
634
635
636 def _on_null_touch_selector_entry_entry_activated(customEntry, dialog, result):
637         dialog.response(gtk.RESPONSE_OK)
638         result[0] = customEntry.get_text()
639
640
641 def _on_null_touch_selector_entry_tree_activated(treeView, path, column, dialog, result):
642         dialog.response(gtk.RESPONSE_OK)
643         model = treeView.get_model()
644         itr = model.get_iter(path)
645         if itr is not None:
646                 result[0] = model.get_value(itr, 0)
647
648
649 def _null_touch_selector_entry(parent, title, items, defaultItem):
650         parentSize = parent.get_size()
651
652         model = gtk.ListStore(gobject.TYPE_STRING)
653         defaultIndex = -1
654         for i, item in enumerate(items):
655                 model.append((item, ))
656                 if item == defaultItem:
657                         defaultIndex = i
658
659         cell = gtk.CellRendererText()
660         set_cell_thumb_selectable(cell)
661         column = gtk.TreeViewColumn(title)
662         column.pack_start(cell, expand=True)
663         column.add_attribute(cell, "text", 0)
664
665         treeView = gtk.TreeView()
666         treeView.set_model(model)
667         treeView.append_column(column)
668         selection = treeView.get_selection()
669         selection.set_mode(gtk.SELECTION_SINGLE)
670
671         scrolledWin = gtk.ScrolledWindow()
672         scrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
673         scrolledWin.add(treeView)
674
675         customEntry = gtk.Entry()
676
677         layout = gtk.VBox()
678         layout.pack_start(customEntry, expand=False)
679         layout.pack_start(scrolledWin)
680
681         dialog = gtk.Dialog(
682                 title,
683                 parent,
684                 gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
685                 (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL),
686         )
687         dialog.set_default_response(gtk.RESPONSE_CANCEL)
688         dialog.get_child().add(layout)
689         dialog.resize(parentSize[0], max(parentSize[1]-100, 100))
690
691         scrolledWin = hildonize_scrollwindow(scrolledWin)
692
693         result = [None]
694         if 0 < defaultIndex:
695                 selection.select_path((defaultIndex, ))
696                 result[0] = defaultItem
697         else:
698                 customEntry.set_text(defaultItem)
699
700         customEntry.connect("activate", _on_null_touch_selector_entry_entry_activated, dialog, result)
701         customEntry.connect("changed", _on_null_touch_selector_entry_entry_changed, result, selection, defaultIndex)
702         treeView.connect("row-activated", _on_null_touch_selector_entry_tree_activated, dialog, result)
703
704         try:
705                 dialog.show_all()
706                 response = dialog.run()
707
708                 if response == gtk.RESPONSE_OK:
709                         _, itr = selection.get_selected()
710                         if itr is not None:
711                                 return model.get_value(itr, 0)
712                         else:
713                                 enteredText = customEntry.get_text().strip()
714                                 if enteredText:
715                                         return enteredText
716                                 elif result[0] is not None:
717                                         return result[0]
718                                 else:
719                                         raise RuntimeError("No selection made")
720                 elif response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_DELETE_EVENT:
721                         raise RuntimeError("User cancelled request")
722                 else:
723                         raise RuntimeError("Unrecognized response %r", response)
724         finally:
725                 dialog.hide()
726                 dialog.destroy()
727
728
729 try:
730         hildon.PickerDialog
731         hildon.TouchSelectorEntry
732         touch_selector_entry = _hildon_touch_selector_entry
733 except AttributeError:
734         touch_selector_entry = _null_touch_selector_entry
735
736
737 if __name__ == "__main__":
738         app = get_app_class()()
739
740         label = gtk.Label("Hello World from a Label!")
741
742         win = gtk.Window()
743         win.add(label)
744         win = hildonize_window(app, win)
745         if False and IS_FREMANTLE_SUPPORTED:
746                 appMenu = hildon.AppMenu()
747                 for i in xrange(5):
748                         b = gtk.Button(str(i))
749                         appMenu.append(b)
750                 win.set_app_menu(appMenu)
751                 win.show_all()
752                 appMenu.show_all()
753                 gtk.main()
754         elif False:
755                 print touch_selector(win, "Test", ["A", "B", "C", "D"], 2)
756         elif False:
757                 print touch_selector_entry(win, "Test", ["A", "B", "C", "D"], "C")
758                 print touch_selector_entry(win, "Test", ["A", "B", "C", "D"], "Blah")
759         elif False:
760                 import pprint
761                 name, value = "", ""
762                 goodLocals = [
763                         (name, value) for (name, value) in locals().iteritems()
764                         if not name.startswith("_")
765                 ]
766                 pprint.pprint(goodLocals)
767         elif False:
768                 import time
769                 show_information_banner(win, "Hello World")
770                 time.sleep(5)
771         elif False:
772                 import time
773                 banner = show_busy_banner_start(win, "Hello World")
774                 time.sleep(5)
775                 show_busy_banner_end(banner)