Trees | Indices | Help |
|
---|
|
1 """GNUmed GUI helper classes and functions. 2 3 This module provides some convenient wxPython GUI 4 helper thingies that are widely used throughout 5 GnuMed. 6 7 This source code is protected by the GPL licensing scheme. 8 Details regarding the GPL are available at http://www.gnu.org 9 You may use and share it as long as you don't deny this right 10 to anybody else. 11 """ 12 # ======================================================================== 13 # $Source: /cvsroot/gnumed/gnumed/gnumed/client/wxpython/gmGuiHelpers.py,v $ 14 # $Id: gmGuiHelpers.py,v 1.105 2009/09/23 14:42:28 ncq Exp $ 15 __version__ = "$Revision: 1.105 $" 16 __author__ = "K. Hilbert <Karsten.Hilbert@gmx.net>" 17 __license__ = "GPL (details at http://www.gnu.org)" 18 19 import os 20 21 22 import wx 23 24 25 from Gnumed.business import gmSurgery 26 from Gnumed.wxGladeWidgets import wxg3ButtonQuestionDlg, wxg2ButtonQuestionDlg, wxgGreetingEditorDlg 27 28 # ========================================================================30100 # ========================================================================32 33 caption = kwargs['caption'] 34 question = kwargs['question'] 35 button_defs = kwargs['button_defs'][:2] 36 del kwargs['caption'] 37 del kwargs['question'] 38 del kwargs['button_defs'] 39 40 try: 41 show_checkbox = kwargs['show_checkbox'] 42 del kwargs['show_checkbox'] 43 except KeyError: 44 show_checkbox = False 45 46 try: 47 checkbox_msg = kwargs['checkbox_msg'] 48 del kwargs['checkbox_msg'] 49 except KeyError: 50 checkbox_msg = None 51 52 try: 53 checkbox_tooltip = kwargs['checkbox_tooltip'] 54 del kwargs['checkbox_tooltip'] 55 except KeyError: 56 checkbox_tooltip = None 57 58 wxg2ButtonQuestionDlg.wxg2ButtonQuestionDlg.__init__(self, *args, **kwargs) 59 60 self.SetTitle(title = caption) 61 self._LBL_question.SetLabel(label = question) 62 63 if not show_checkbox: 64 self._CHBOX_dont_ask_again.Hide() 65 else: 66 if checkbox_msg is not None: 67 self._CHBOX_dont_ask_again.SetLabel(checkbox_msg) 68 if checkbox_tooltip is not None: 69 self._CHBOX_dont_ask_again.SetToolTipString(checkbox_tooltip) 70 71 buttons = [self._BTN_1, self._BTN_2] 72 for idx in range(len(button_defs)): 73 buttons[idx].SetLabel(label = button_defs[idx]['label']) 74 buttons[idx].SetToolTipString(button_defs[idx]['tooltip']) 75 try: 76 if button_defs[idx]['default'] is True: 77 buttons[idx].SetDefault() 78 buttons[idx].SetFocus() 79 except KeyError: 80 pass 81 82 self.Fit()83 #-------------------------------------------------------- 86 #-------------------------------------------------------- 87 # event handlers 88 #-------------------------------------------------------- 94 #--------------------------------------------------------102144 # ======================================================================== 145 from Gnumed.wxGladeWidgets import wxgMultilineTextEntryDlg 146 147104 105 caption = kwargs['caption'] 106 question = kwargs['question'] 107 button_defs = kwargs['button_defs'][:3] 108 109 del kwargs['caption'] 110 del kwargs['question'] 111 del kwargs['button_defs'] 112 113 wxg3ButtonQuestionDlg.wxg3ButtonQuestionDlg.__init__(self, *args, **kwargs) 114 115 self.SetTitle(title = caption) 116 self._LBL_question.SetLabel(label = question) 117 118 buttons = [self._BTN_1, self._BTN_2, self._BTN_3] 119 for idx in range(len(button_defs)): 120 buttons[idx].SetLabel(label = button_defs[idx]['label']) 121 buttons[idx].SetToolTipString(button_defs[idx]['tooltip']) 122 try: 123 if button_defs[idx]['default'] is True: 124 buttons[idx].SetDefault() 125 buttons[idx].SetFocus() 126 except KeyError: 127 pass 128 129 self.Fit()130 #-------------------------------------------------------- 131 # event handlers 132 #-------------------------------------------------------- 138 #--------------------------------------------------------149 """Editor for a bit of text.""" 150207 # ========================================================================152 153 try: 154 title = kwargs['title'] 155 del kwargs['title'] 156 except KeyError: 157 title = None 158 159 try: 160 msg = kwargs['msg'] 161 del kwargs['msg'] 162 except KeyError: 163 msg = None 164 165 try: 166 self.original_text = kwargs['text'] 167 del kwargs['text'] 168 except KeyError: 169 self.original_text = None 170 171 wxgMultilineTextEntryDlg.wxgMultilineTextEntryDlg.__init__(self, *args, **kwargs) 172 173 if title is not None: 174 self.SetTitle(title) 175 176 if self.original_text is not None: 177 self._TCTRL_text.SetValue(self.original_text) 178 self._BTN_restore.Enable(True) 179 180 if msg is None: 181 self._LBL_msg.Hide() 182 else: 183 self._LBL_msg.SetLabel(msg) 184 self.Layout() 185 self.Refresh()186 #--------------------------------------------------------188 return self._TCTRL_text.GetValue()189 190 value = property(_get_value, lambda x:x) 191 #-------------------------------------------------------- 192 # event handlers 193 #-------------------------------------------------------- 200 #-------------------------------------------------------- 203 #--------------------------------------------------------209224 # ========================================================================211 wxgGreetingEditorDlg.wxgGreetingEditorDlg.__init__(self, *args, **kwargs) 212 213 self.surgery = gmSurgery.gmCurrentPractice() 214 self._TCTRL_message.SetValue(self.surgery.db_logon_banner)215 #-------------------------------------------------------- 216 # event handlers 217 #--------------------------------------------------------226 """TreeCtrl mixin class to record expansion history."""311 # ========================================================================228 if not isinstance(self, wx.TreeCtrl): 229 raise TypeError('[%s]: mixin can only be applied to wx.TreeCtrl, not [%s]' % (cTreeExpansionHistoryMixin, self.__class__.__name__)) 230 self.expansion_state = {}231 #-------------------------------------------------------- 232 # public API 233 #-------------------------------------------------------- 236 #--------------------------------------------------------238 if len(self.expansion_state) == 0: 239 return True 240 self.__restore_subtree_expansion(start_node_id = self.GetRootItem())241 #--------------------------------------------------------243 if len(self.expansion_state) == 0: 244 print "currently no expansion snapshot available" 245 return True 246 print "last snapshot of state of expansion" 247 print "-----------------------------------" 248 print "listing expanded nodes:" 249 for node_id in self.expansion_state.keys(): 250 print "node ID:", node_id 251 print " selected:", self.expansion_state[node_id]252 #-------------------------------------------------------- 253 # internal API 254 #--------------------------------------------------------256 """This records node expansion states based on the item label. 257 258 A side effect of this is that identically named items can 259 become unduly synchronized in their expand state after a 260 snapshot/restore cycle. 261 262 Better choices might be 263 264 id(item.GetPyData()) or 265 item.GetPyData().get_tree_uid() 266 267 where get_tree_uid(): 268 269 '[%s:%s]' % (self.__class__.__name__, id(self)) 270 271 or some such. This would survive renaming of the item. 272 273 For database items it may be useful to include the 274 primary key which would - contrary to id() - survive 275 reloads from the database. 276 """ 277 # protect against empty tree where not even 278 # a root node exists 279 if not start_node_id.IsOk(): 280 return True 281 282 if not self.IsExpanded(start_node_id): 283 return True 284 285 self.expansion_state[self.GetItemText(start_node_id)] = self.IsSelected(start_node_id) 286 287 child_id, cookie = self.GetFirstChild(start_node_id) 288 while child_id.IsOk(): 289 self.__record_subtree_expansion(start_node_id = child_id) 290 child_id, cookie = self.GetNextChild(start_node_id, cookie) 291 292 return293 #--------------------------------------------------------295 start_node_label = self.GetItemText(start_node_id) 296 try: 297 node_selected = self.expansion_state[start_node_label] 298 except KeyError: 299 return 300 301 self.Expand(start_node_id) 302 if node_selected: 303 self.SelectItem(start_node_id) 304 305 child_id, cookie = self.GetFirstChild(start_node_id) 306 while child_id.IsOk(): 307 self.__restore_subtree_expansion(start_node_id = child_id) 308 child_id, cookie = self.GetNextChild(start_node_id, cookie) 309 310 return313 """Generic file drop target class. 314 315 Protocol: 316 Widgets being declared file drop targets 317 must provide the method: 318 319 add_filenames(filenames) 320 """ 321 #----------------------------------------------- 325 #-----------------------------------------------328 # ========================================================================327 self.target.add_filenames(filenames)330 if aMessage is None: 331 aMessage = _('programmer forgot to specify error message') 332 333 aMessage += _("\n\nPlease consult the error log for all the gory details !") 334 335 if aTitle is None: 336 aTitle = _('generic error message') 337 338 dlg = wx.MessageDialog ( 339 parent = None, 340 message = aMessage, 341 caption = aTitle, 342 style = wx.OK | wx.ICON_ERROR | wx.STAY_ON_TOP 343 ) 344 dlg.ShowModal() 345 dlg.Destroy() 346 return True347 #-------------------------------------------------------------------------349 if aMessage is None: 350 aMessage = _('programmer forgot to specify info message') 351 352 if aTitle is None: 353 aTitle = _('generic info message') 354 355 dlg = wx.MessageDialog ( 356 parent = None, 357 message = aMessage, 358 caption = aTitle, 359 style = wx.OK | wx.ICON_INFORMATION | wx.STAY_ON_TOP 360 ) 361 dlg.ShowModal() 362 dlg.Destroy() 363 return True364 #-------------------------------------------------------------------------366 if aMessage is None: 367 aMessage = _('programmer forgot to specify warning') 368 369 if aTitle is None: 370 aTitle = _('generic warning message') 371 372 dlg = wx.MessageDialog ( 373 parent = None, 374 message = aMessage, 375 caption = aTitle, 376 style = wx.OK | wx.ICON_EXCLAMATION | wx.STAY_ON_TOP 377 ) 378 dlg.ShowModal() 379 dlg.Destroy() 380 return True381 #-------------------------------------------------------------------------382 -def gm_show_question(aMessage='programmer forgot to specify question', aTitle='generic user question dialog', cancel_button=False):383 if cancel_button: 384 style = wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION | wx.STAY_ON_TOP 385 else: 386 style = wx.YES_NO | wx.ICON_QUESTION | wx.STAY_ON_TOP 387 388 dlg = wx.MessageDialog ( 389 None, 390 aMessage, 391 aTitle, 392 style 393 ) 394 btn_pressed = dlg.ShowModal() 395 dlg.Destroy() 396 397 if btn_pressed == wx.ID_YES: 398 return True 399 elif btn_pressed == wx.ID_NO: 400 return False 401 else: 402 return None403 #----------------------------------------------------------------------405 """ 406 Utility function to create the main sizer of a wizard's page. 407 408 @param wizPg The wizard page widget 409 @type wizPg A wx.WizardPageSimple instance 410 @param title The wizard page's descriptive title 411 @type title A StringType instance 412 """ 413 sizer = wx.BoxSizer(wx.VERTICAL) 414 wizPg.SetSizer(sizer) 415 title = wx.StaticText(wizPg, -1, title) 416 title.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) 417 sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 2) 418 sizer.Add(wx.StaticLine(wizPg, -1), 0, wx.EXPAND|wx.ALL, 2) 419 return sizer420 #============================================================ 421 422 # ======================================================================== 423 # $Log: gmGuiHelpers.py,v $ 424 # Revision 1.105 2009/09/23 14:42:28 ncq 425 # - remove dead code 426 # 427 # Revision 1.104 2009/07/23 16:39:23 ncq 428 # - try to improve multiline text dialog 429 # 430 # Revision 1.103 2009/07/06 17:12:34 ncq 431 # - cleanup 432 # 433 # Revision 1.102 2009/05/18 15:31:29 ncq 434 # - checkbox_is_checked convenience wrapper 435 # 436 # Revision 1.101 2009/02/24 11:19:54 ncq 437 # - cleanup 438 # 439 # Revision 1.100 2009/01/15 11:37:06 ncq 440 # - no more save callback in multiline text editor 441 # 442 # Revision 1.99 2009/01/11 19:17:17 ncq 443 # - support new action buttons in text editor 444 # 445 # Revision 1.98 2008/12/18 21:28:26 ncq 446 # - cMultilineTextEntryDlg 447 # 448 # Revision 1.97 2008/11/21 13:06:09 ncq 449 # - cleanup 450 # 451 # Revision 1.96 2008/08/08 13:30:12 ncq 452 # - needs gmSurgery 453 # 454 # Revision 1.95 2008/08/06 13:21:42 ncq 455 # - add checkbox tooltip support to 2 button question dialog 456 # 457 # Revision 1.94 2008/07/07 11:36:44 ncq 458 # - just cleanup 459 # 460 # Revision 1.93 2008/06/24 13:59:18 ncq 461 # - properly handle default buttons, SetFocus, too, in 2/3ButtonDlg 462 # 463 # Revision 1.92 2008/05/13 14:12:33 ncq 464 # - factor out exception handling 465 # 466 # Revision 1.91 2008/04/12 19:18:48 ncq 467 # - listen to application_closing and ignore 468 # PyDeadObjectError when closing down 469 # 470 # Revision 1.90 2008/03/06 18:33:12 ncq 471 # - properly log exception information for unhandled exceptions 472 # 473 # Revision 1.89 2008/03/02 15:11:55 ncq 474 # - support sender email in bug reporting 475 # 476 # Revision 1.88 2008/02/26 16:27:20 ncq 477 # - cleanup exception handler 478 # - actually log exception :-( 479 # 480 # Revision 1.87 2008/02/25 17:34:39 ncq 481 # - use new logging 482 # - auto-enable debug mode on first unhandled exception 483 # 484 # Revision 1.86 2008/01/22 12:22:18 ncq 485 # - better layout of bug report email 486 # 487 # Revision 1.85 2008/01/16 19:38:43 ncq 488 # - configure_*() factored out 489 # 490 # Revision 1.84 2008/01/13 01:17:50 ncq 491 # - use log_stack_trace() 492 # - annouce completed bug report emailing 493 # 494 # Revision 1.83 2008/01/11 16:14:05 ncq 495 # - cleanup 496 # - use staff name/system account in log mailing 497 # 498 # Revision 1.82 2008/01/07 19:52:40 ncq 499 # - proper use of flush() 500 # 501 # Revision 1.81 2008/01/06 08:12:29 ncq 502 # - auto-switch to --debug on detecting an unhandled exception 503 # - always save user comment if there is any 504 # - always backup the log file with comment for later perusal 505 # 506 # Revision 1.80 2008/01/05 16:41:27 ncq 507 # - remove logging from gm_show_*() 508 # 509 # Revision 1.79 2007/12/24 23:31:24 shilbert 510 # - remove some dlg.SetFocus statements 511 # 512 # Revision 1.78 2007/12/23 12:10:49 ncq 513 # - cleanup 514 # 515 # Revision 1.77 2007/12/11 12:49:26 ncq 516 # - explicit signal handling 517 # 518 # Revision 1.76 2007/12/04 17:32:33 ncq 519 # - improved wording 520 # 521 # Revision 1.75 2007/12/04 17:08:14 ncq 522 # - allow editing bug report targets before sending 523 # 524 # Revision 1.74 2007/12/04 16:15:28 ncq 525 # - remove get_dbowner_connection() 526 # 527 # Revision 1.73 2007/12/04 15:17:39 ncq 528 # - start general purpose progress bar 529 # 530 # Revision 1.72 2007/11/21 13:31:53 ncq 531 # - use send_mail() in exception handling dialog 532 # 533 # Revision 1.71 2007/10/21 20:18:32 ncq 534 # - configure_string_option() 535 # 536 # Revision 1.70 2007/10/19 12:50:31 ncq 537 # - add configure_boolean_option() 538 # 539 # Revision 1.69 2007/10/11 12:01:51 ncq 540 # - make c3ButtonQuestionDlg() more robust in the face of no-default button def 541 # 542 # Revision 1.68 2007/09/25 20:44:23 ncq 543 # - support saving user comment in log file rescued on error 544 # 545 # Revision 1.67 2007/09/20 21:30:06 ncq 546 # - cGreetingEditorDlg 547 # 548 # Revision 1.66 2007/09/03 11:03:20 ncq 549 # - teach top level wx exception handler about ImportError 550 # 551 # Revision 1.65 2007/08/20 14:25:16 ncq 552 # - factor out bits of code out of the actual top level 553 # exception handler in a bid to make it more resilient 554 # 555 # Revision 1.64 2007/07/18 14:43:01 ncq 556 # - do away with accessing console as it often breaks 557 # 558 # Revision 1.63 2007/06/18 20:31:58 ncq 559 # - gm_Multi/SingleChoiceDlg moved to gmListWidgets 560 # 561 # Revision 1.62 2007/06/11 20:35:06 ncq 562 # - MSW does ref counting in Begin/EndBusyCursor 563 # - add gmMultiChoiceDialog 564 # 565 # Revision 1.61 2007/05/14 10:34:07 ncq 566 # - no more gm_statustext() 567 # 568 # Revision 1.60 2007/05/14 10:05:33 ncq 569 # - make "default" button definition optional 570 # 571 # Revision 1.59 2007/05/14 08:36:13 ncq 572 # - in c2ButtonQuestionDlg make keyword show_checkbox option defaulting to False 573 # 574 # Revision 1.58 2007/05/11 14:15:59 ncq 575 # - display help desk in exception handler 576 # - properly handle keep running/close client buttons 577 # 578 # Revision 1.57 2007/05/08 16:04:40 ncq 579 # - add wxPython based exception display handler 580 # 581 # Revision 1.56 2007/04/27 13:28:48 ncq 582 # - implement c2ButtonQuestionDlg 583 # 584 # Revision 1.55 2007/04/23 01:06:42 ncq 585 # - add password argument to get_dbowner_connection() 586 # 587 # Revision 1.54 2007/04/11 20:41:58 ncq 588 # - remove gm_icon() 589 # 590 # Revision 1.53 2007/04/09 22:02:40 ncq 591 # - fix docstring 592 # 593 # Revision 1.52 2007/03/18 14:07:14 ncq 594 # - factor out hook script running 595 # 596 # Revision 1.51 2007/03/02 15:32:56 ncq 597 # - turn gm_statustext() into signal sender with depreciation 598 # warning (should used gmDispatcher.send() now) 599 # 600 # Revision 1.50 2007/02/19 16:13:36 ncq 601 # - add run_hook_script() 602 # 603 # Revision 1.49 2007/02/18 16:57:38 ncq 604 # - make sure gm-dbo connections aren't returned from the pool 605 # 606 # Revision 1.48 2007/01/20 22:52:27 ncq 607 # - .KeyCode -> GetKeyCode() 608 # 609 # Revision 1.47 2007/01/16 13:59:51 ncq 610 # - protect against empty trees in expansion history mixin 611 # 612 # Revision 1.46 2007/01/15 13:04:25 ncq 613 # - c3ButtonQuestionDlg 614 # - remove cReturnTraversalTextCtrl 615 # 616 # Revision 1.45 2007/01/13 22:43:41 ncq 617 # - remove str() raising Unicode exceptions 618 # 619 # Revision 1.44 2007/01/13 22:19:37 ncq 620 # - cTreeExpansionHistoryMixin 621 # 622 # Revision 1.43 2007/01/12 13:09:46 ncq 623 # - cFileDropTarget 624 # 625 # Revision 1.42 2006/12/15 15:24:06 ncq 626 # - cleanup 627 # 628 # Revision 1.41 2006/11/24 09:53:24 ncq 629 # - gm_beep_statustext() -> gm_statustext(beep=True) 630 # 631 # Revision 1.40 2006/11/05 14:18:57 ncq 632 # - missing "style =" 633 # 634 # Revision 1.39 2006/10/24 13:23:31 ncq 635 # - use gmPG2.get_default_login() in get_dbowner_connection() 636 # 637 # Revision 1.38 2006/10/08 11:03:09 ncq 638 # - convert to gmPG2 639 # 640 # Revision 1.37 2006/09/03 11:29:30 ncq 641 # - add cancel_button argument to show_question 642 # 643 # Revision 1.36 2006/08/01 22:03:49 ncq 644 # - cleanup 645 # 646 # Revision 1.35 2006/06/20 09:42:42 ncq 647 # - cTextObjectValidator -> cTextWidgetValidator 648 # - add custom invalid message to text widget validator 649 # - variable renaming, cleanup 650 # - fix demographics validation 651 # 652 # Revision 1.34 2006/06/17 16:42:48 ncq 653 # - add get_dbowner_connection() 654 # 655 # Revision 1.33 2006/05/01 18:47:32 ncq 656 # - cleanup 657 # 658 # Revision 1.32 2006/01/15 13:19:16 shilbert 659 # - gm_SingleChoiceDialog was added 660 # - wxpython 2.6 does not support client data associated with item 661 # 662 # Revision 1.31 2005/10/27 21:37:29 shilbert 663 # fixed wxYES|NO into wx.YES|NO 664 # 665 # Revision 1.30 2005/10/11 21:14:10 ncq 666 # - remove out-of-place LogException() call 667 # 668 # Revision 1.29 2005/10/09 08:07:56 ihaywood 669 # a textctrl that uses return for navigation wx 2.6 only 670 # 671 # Revision 1.28 2005/10/04 13:09:49 sjtan 672 # correct syntax errors; get soap entry working again. 673 # 674 # Revision 1.27 2005/10/04 00:04:45 sjtan 675 # convert to wx.; catch some transitional errors temporarily 676 # 677 # Revision 1.26 2005/09/28 21:27:30 ncq 678 # - a lot of wx2.6-ification 679 # 680 # Revision 1.25 2005/09/28 15:57:48 ncq 681 # - a whole bunch of wx.Foo -> wx.Foo 682 # 683 # Revision 1.24 2005/09/26 18:01:50 ncq 684 # - use proper way to import wx26 vs wx2.4 685 # - note: THIS WILL BREAK RUNNING THE CLIENT IN SOME PLACES 686 # - time for fixup 687 # 688 # Revision 1.23 2005/09/12 15:09:42 ncq 689 # - cleanup 690 # 691 # Revision 1.22 2005/06/10 16:11:14 shilbert 692 # szr.AddWindow() -> Add() such that wx2.5 works 693 # 694 # Revision 1.21 2005/06/08 01:27:50 cfmoro 695 # Validator fix 696 # 697 # Revision 1.20 2005/05/05 06:27:52 ncq 698 # - add wx.STAY_ON_TOP in an effort to keep popups up front 699 # 700 # Revision 1.19 2005/04/24 14:48:57 ncq 701 # - improved wording 702 # 703 # Revision 1.18 2005/04/10 12:09:16 cfmoro 704 # GUI implementation of the first-basic (wizard) page for patient details input 705 # 706 # Revision 1.17 2005/03/06 09:21:08 ihaywood 707 # stole a couple of icons from Richard's demo code 708 # 709 # Revision 1.16 2004/12/21 21:00:35 ncq 710 # - if no status text handler available, dump to stdout 711 # 712 # Revision 1.15 2004/12/21 19:40:56 ncq 713 # - fix faulty LogException() usage 714 # 715 # Revision 1.14 2004/09/25 13:10:40 ncq 716 # - in gm_beep_statustext() make aMessage a defaulted keyword argument 717 # 718 # Revision 1.13 2004/08/19 13:56:51 ncq 719 # - added gm_show_warning() 720 # 721 # Revision 1.12 2004/08/18 10:18:42 ncq 722 # - added gm_show_info() 723 # 724 # Revision 1.11 2004/05/28 13:30:27 ncq 725 # - set_status_text -> _set_status_text so nobody 726 # gets the idea to use it directly 727 # 728 # Revision 1.10 2004/05/26 23:23:35 shilbert 729 # - import statement fixed 730 # 731 # Revision 1.9 2004/04/11 10:10:56 ncq 732 # - cleanup 733 # 734 # Revision 1.8 2004/04/10 01:48:31 ihaywood 735 # can generate referral letters, output to xdvi at present 736 # 737 # Revision 1.7 2004/03/04 19:46:54 ncq 738 # - switch to package based import: from Gnumed.foo import bar 739 # 740 # Revision 1.6 2003/12/29 16:49:18 uid66147 741 # - cleanup, gm_beep_statustext() 742 # 743 # Revision 1.5 2003/11/17 10:56:38 sjtan 744 # 745 # synced and commiting. 746 # 747 # Revision 1.1 2003/10/23 06:02:39 sjtan 748 # 749 # manual edit areas modelled after r.terry's specs. 750 # 751 # Revision 1.4 2003/08/26 12:35:52 ncq 752 # - properly replace \n\r 753 # 754 # Revision 1.3 2003/08/24 09:15:20 ncq 755 # - remove spurious self's 756 # 757 # Revision 1.2 2003/08/24 08:58:07 ncq 758 # - use gm_show_* 759 # 760 # Revision 1.1 2003/08/21 00:11:48 ncq 761 # - adds some widely used wxPython GUI helper functions 762 # 763
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Sat Jan 23 04:06:10 2010 | http://epydoc.sourceforge.net |