Package Gnumed :: Package wxpython :: Module gmEditArea
[frames] | no frames]

Source Code for Module Gnumed.wxpython.gmEditArea

   1  #==================================================================== 
   2  # GNUmed Richard style Edit Area 
   3  #==================================================================== 
   4  __license__ = 'GPL' 
   5  __version__ = "$Revision: 1.135 $" 
   6  __author__ = "R.Terry, K.Hilbert" 
   7   
   8  #====================================================================== 
   9  import sys 
  10  import logging 
  11  import datetime as pydt 
  12   
  13   
  14  import wx 
  15   
  16   
  17  if __name__ == '__main__': 
  18          sys.path.insert(0, '../../') 
  19  from Gnumed.pycommon import gmDispatcher 
  20   
  21   
  22  _log = logging.getLogger('gm.ui') 
  23  _log.info(__version__) 
  24  #==================================================================== 
  25  edit_area_modes = ['new', 'edit', 'new_from_existing'] 
  26   
27 -class cGenericEditAreaMixin(object):
28 """Mixin for edit area panels providing generic functionality. 29 30 **************** start of template **************** 31 32 #==================================================================== 33 # Class definition: 34 35 from Gnumed.wxGladeWidgets import wxgXxxEAPnl 36 37 class cXxxEAPnl(wxgXxxEAPnl.wxgXxxEAPnl, gmEditArea.cGenericEditAreaMixin): 38 39 def __init__(self, *args, **kwargs): 40 41 try: 42 data = kwargs['xxx'] 43 del kwargs['xxx'] 44 except KeyError: 45 data = None 46 47 wxgXxxEAPnl.wxgXxxEAPnl.__init__(self, *args, **kwargs) 48 gmEditArea.cGenericEditAreaMixin.__init__(self) 49 50 # Code using this mixin should set mode and data 51 # after instantiating the class: 52 self.mode = 'new' 53 self.data = data 54 if data is not None: 55 self.mode = 'edit' 56 57 #self.__init_ui() 58 #---------------------------------------------------------------- 59 # def __init_ui(self): 60 # # adjust phrasewheels etc 61 #---------------------------------------------------------------- 62 # generic Edit Area mixin API 63 #---------------------------------------------------------------- 64 def _valid_for_save(self): 65 66 # its best to validate bottom -> top such that the 67 # cursor ends up in the topmost failing field 68 69 # remove when implemented: 70 return False 71 72 validity = True 73 74 if self._TCTRL_xxx.GetValue().strip() == u'': 75 validity = False 76 self.display_tctrl_as_valid(tctrl = self._TCTRL_xxx, valid = False) 77 gmDispatcher.send(signal = 'statustext', msg = _('No entry in field xxx.')) 78 self._TCTRL_xxx.SetFocus() 79 else: 80 self.display_tctrl_as_valid(tctrl = self._TCTRL_xxx, valid = True) 81 82 if self._PRW_xxx.GetData() is None: 83 validity = False 84 self._PRW_xxx.display_as_valid(False) 85 gmDispatcher.send(signal = 'statustext', msg = _('No entry in field xxx.')) 86 self._PRW_xxx.SetFocus() 87 else: 88 self._PRW_xxx.display_as_valid(True) 89 90 return validity 91 #---------------------------------------------------------------- 92 def _save_as_new(self): 93 94 # remove when implemented: 95 return False 96 97 # save the data as a new instance 98 data = gmXXXX.create_xxxx() 99 100 data[''] = self._ 101 data[''] = self._ 102 103 data.save() 104 105 # must be done very late or else the property access 106 # will refresh the display such that later field 107 # access will return empty values 108 self.data = data 109 return False 110 return True 111 #---------------------------------------------------------------- 112 def _save_as_update(self): 113 114 # remove when implemented: 115 return False 116 117 # update self.data and save the changes 118 self.data[''] = self._TCTRL_xxx.GetValue().strip() 119 self.data[''] = self._PRW_xxx.GetData() 120 self.data[''] = self._CHBOX_xxx.GetValue() 121 self.data.save() 122 return True 123 #---------------------------------------------------------------- 124 def _refresh_as_new(self): 125 pass 126 #---------------------------------------------------------------- 127 def _refresh_as_new_from_existing(self): 128 self._refresh_as_new() 129 #---------------------------------------------------------------- 130 def _refresh_from_existing(self): 131 pass 132 #---------------------------------------------------------------- 133 134 **************** end of template **************** 135 """
136 - def __init__(self):
137 self.__mode = 'new' 138 self.__data = None 139 self.successful_save_msg = None 140 self.__tctrl_validity_colors = { 141 True: wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW), 142 False: 'pink' 143 } 144 self._refresh_as_new()
145 #----------------------------------------------------------------
146 - def _get_mode(self):
147 return self.__mode
148
149 - def _set_mode(self, mode=None):
150 if mode not in edit_area_modes: 151 raise ValueError('[%s] <mode> must be in %s' % (self.__class__.__name__, edit_area_modes)) 152 if mode == 'edit': 153 if self.__data is None: 154 raise ValueError('[%s] <mode> "edit" needs data value' % self.__class__.__name__) 155 156 prev_mode = self.__mode 157 self.__mode = mode 158 if mode != prev_mode: 159 self.refresh()
160 161 mode = property(_get_mode, _set_mode) 162 #----------------------------------------------------------------
163 - def _get_data(self):
164 return self.__data
165
166 - def _set_data(self, data=None):
167 if data is None: 168 if self.__mode == 'edit': 169 raise ValueError('[%s] <mode> "edit" needs data value' % self.__class__.__name__) 170 self.__data = data 171 self.refresh()
172 173 data = property(_get_data, _set_data) 174 #----------------------------------------------------------------
175 - def save(self):
176 """Invoked from the generic edit area dialog. 177 178 Invokes 179 _valid_for_save, 180 _save_as_new, 181 _save_as_update 182 on the implementing edit area as needed. 183 184 _save_as_* must set self.__data and return True/False 185 """ 186 if not self._valid_for_save(): 187 return False 188 189 # remove messages about previous invalid save attempts 190 gmDispatcher.send(signal = 'statustext', msg = u'') 191 192 if self.__mode in ['new', 'new_from_existing']: 193 if self._save_as_new(): 194 self.mode = 'edit' 195 return True 196 return False 197 198 elif self.__mode == 'edit': 199 return self._save_as_update() 200 201 else: 202 raise ValueError('[%s] <mode> must be in %s' % (self.__class__.__name__, edit_area_modes))
203 #----------------------------------------------------------------
204 - def refresh(self):
205 """Invoked from the generic edit area dialog. 206 207 Invokes 208 _refresh_as_new() 209 _refresh_from_existing() 210 _refresh_as_new_from_existing() 211 on the implementing edit area as needed. 212 213 Then calls _valid_for_save(). 214 """ 215 if self.__mode == 'new': 216 result = self._refresh_as_new() 217 self._valid_for_save() 218 return result 219 elif self.__mode == 'edit': 220 result = self._refresh_from_existing() 221 return result 222 elif self.__mode == 'new_from_existing': 223 result = self._refresh_as_new_from_existing() 224 self._valid_for_save() 225 return result 226 else: 227 raise ValueError('[%s] <mode> must be in %s' % (self.__class__.__name__, edit_area_modes))
228 #----------------------------------------------------------------
229 - def display_tctrl_as_valid(self, tctrl=None, valid=None):
230 self.display_ctrl_as_valid(ctrl = tctrl, valid = valid)
231 #----------------------------------------------------------------
232 - def display_ctrl_as_valid(self, ctrl=None, valid=None):
233 ctrl.SetBackgroundColour(self.__tctrl_validity_colors[valid]) 234 ctrl.Refresh()
235 #==================================================================== 236 from Gnumed.wxGladeWidgets import wxgGenericEditAreaDlg2 237
238 -class cGenericEditAreaDlg2(wxgGenericEditAreaDlg2.wxgGenericEditAreaDlg2):
239 """Dialog for parenting edit area panels with save/clear/next/cancel""" 240 241 _lucky_day = 1 242 _lucky_month = 4 243 _today = pydt.date.today() 244
245 - def __init__(self, *args, **kwargs):
246 247 new_ea = kwargs['edit_area'] 248 del kwargs['edit_area'] 249 250 if not isinstance(new_ea, cGenericEditAreaMixin): 251 raise TypeError('[%s]: edit area instance must be child of cGenericEditAreaMixin') 252 253 try: 254 single_entry = kwargs['single_entry'] 255 del kwargs['single_entry'] 256 except KeyError: 257 single_entry = False 258 259 wxgGenericEditAreaDlg2.wxgGenericEditAreaDlg2.__init__(self, *args, **kwargs) 260 261 self.left_extra_button = None 262 263 if cGenericEditAreaDlg2._today.day != cGenericEditAreaDlg2._lucky_day: 264 self._BTN_lucky.Enable(False) 265 self._BTN_lucky.Hide() 266 else: 267 if cGenericEditAreaDlg2._today.month != cGenericEditAreaDlg2._lucky_month: 268 self._BTN_lucky.Enable(False) 269 self._BTN_lucky.Hide() 270 271 # replace dummy panel 272 dummy_ea_pnl = self._PNL_ea 273 ea_pnl_szr = dummy_ea_pnl.GetContainingSizer() 274 ea_pnl_parent = dummy_ea_pnl.GetParent() 275 ea_pnl_szr.Remove(dummy_ea_pnl) 276 dummy_ea_pnl.Destroy() 277 del dummy_ea_pnl 278 new_ea_min_size = new_ea.GetMinSize() 279 new_ea.Reparent(ea_pnl_parent) 280 self._PNL_ea = new_ea 281 ea_pnl_szr.Add(self._PNL_ea, 1, wx.EXPAND, 0) 282 ea_pnl_szr.SetMinSize(new_ea_min_size) # set minimum size of EA pnl sizer from its new EA item 283 ea_pnl_szr.Fit(new_ea) # resize the new EA to the minimum size of the EA pnl sizer 284 285 # adjust buttons 286 if single_entry: 287 self._BTN_forward.Enable(False) 288 self._BTN_forward.Hide() 289 290 self._adjust_clear_revert_buttons() 291 292 # attach listener 293 self._TCTRL_status.SetValue('') 294 gmDispatcher.connect(signal = u'statustext', receiver = self._on_set_statustext) 295 296 # redraw layout 297 #self.Layout() 298 main_szr = self.GetSizer() 299 main_szr.Fit(self) 300 self.Layout() 301 #self.Refresh() # apparently not needed (27.3.2011) 302 303 self._PNL_ea.refresh()
304 #--------------------------------------------------------
305 - def _on_set_statustext(self, msg=None, loglevel=None, beep=True):
306 if msg is None: 307 self._TCTRL_status.SetValue('') 308 return 309 if msg.strip() == u'': 310 self._TCTRL_status.SetValue('') 311 return 312 self._TCTRL_status.SetValue(msg) 313 return
314 #--------------------------------------------------------
316 if self._PNL_ea.data is None: 317 self._BTN_clear.Enable(True) 318 self._BTN_clear.Show() 319 self._BTN_revert.Enable(False) 320 self._BTN_revert.Hide() 321 else: 322 self._BTN_clear.Enable(False) 323 self._BTN_clear.Hide() 324 self._BTN_revert.Enable(True) 325 self._BTN_revert.Show()
326 #--------------------------------------------------------
327 - def _on_save_button_pressed(self, evt):
328 if self._PNL_ea.save(): 329 gmDispatcher.disconnect(signal = u'statustext', receiver = self._on_set_statustext) 330 if self.IsModal(): 331 self.EndModal(wx.ID_OK) 332 else: 333 self.Close()
334 #--------------------------------------------------------
335 - def _on_revert_button_pressed(self, evt):
336 self._PNL_ea.refresh()
337 #--------------------------------------------------------
338 - def _on_clear_button_pressed(self, evt):
339 self._PNL_ea.refresh()
340 #--------------------------------------------------------
341 - def _on_forward_button_pressed(self, evt):
342 if self._PNL_ea.save(): 343 if self._PNL_ea.successful_save_msg is not None: 344 gmDispatcher.send(signal = 'statustext', msg = self._PNL_ea.successful_save_msg) 345 self._PNL_ea.mode = 'new_from_existing' 346 347 self._adjust_clear_revert_buttons() 348 349 self.Layout() 350 main_szr = self.GetSizer() 351 main_szr.Fit(self) 352 self.Refresh() 353 354 self._PNL_ea.refresh()
355 #--------------------------------------------------------
356 - def _on_lucky_button_pressed(self, evt):
357 from Gnumed.wxpython import gmGuiHelpers 358 gmGuiHelpers.gm_show_info ( 359 _( 'Today is your lucky day !\n' 360 '\n' 361 'You have won one year of GNUmed\n' 362 'updates for free !\n' 363 ), 364 _('GNUmed Lottery') 365 )
366 #--------------------------------------------------------
367 - def _on_left_extra_button_pressed(self, event):
368 if not self.__left_extra_button_callback(self._PNL_ea.data): 369 return 370 371 if self.IsModal(): 372 self.EndModal(wx.ID_OK) 373 else: 374 self.Close()
375 #------------------------------------------------------------ 376 # properties 377 #------------------------------------------------------------
378 - def _set_left_extra_button(self, definition):
379 if definition is None: 380 self._BTN_extra_left.Enable(False) 381 self._BTN_extra_left.Hide() 382 self.__left_extra_button_callback = None 383 return 384 385 (label, tooltip, callback) = definition 386 if not callable(callback): 387 raise ValueError('<left extra button> callback is not a callable: %s' % callback) 388 self.__left_extra_button_callback = callback 389 self._BTN_extra_left.SetLabel(label) 390 self._BTN_extra_left.SetToolTipString(tooltip) 391 self._BTN_extra_left.Enable(True) 392 self._BTN_extra_left.Show()
393 394 left_extra_button = property(lambda x:x, _set_left_extra_button)
395 #==================================================================== 396 # DEPRECATED: 397 from Gnumed.wxGladeWidgets import wxgGenericEditAreaDlg 398
399 -class cGenericEditAreaDlg(wxgGenericEditAreaDlg.wxgGenericEditAreaDlg):
400 """Dialog for parenting edit area with save/clear/cancel""" 401
402 - def __init__(self, *args, **kwargs):
403 404 ea = kwargs['edit_area'] 405 del kwargs['edit_area'] 406 407 wxgGenericEditAreaDlg.wxgGenericEditAreaDlg.__init__(self, *args, **kwargs) 408 409 szr = self._PNL_ea.GetContainingSizer() 410 szr.Remove(self._PNL_ea) 411 ea.Reparent(self) 412 szr.Add(ea, 1, wx.ALL|wx.EXPAND, 4) 413 self._PNL_ea = ea 414 415 self.Layout() 416 szr = self.GetSizer() 417 szr.Fit(self) 418 self.Refresh() 419 420 self._PNL_ea.refresh()
421 #--------------------------------------------------------
422 - def _on_save_button_pressed(self, evt):
423 """The edit area save() method must return True/False.""" 424 if self._PNL_ea.save(): 425 if self.IsModal(): 426 self.EndModal(wx.ID_OK) 427 else: 428 self.Close()
429 #--------------------------------------------------------
430 - def _on_clear_button_pressed(self, evt):
431 self._PNL_ea.refresh()
432 #==================================================================== 433 #==================================================================== 434 #==================================================================== 435 #import time 436 437 #from Gnumed.business import gmPerson, gmDemographicRecord 438 from Gnumed.pycommon import gmGuiBroker 439 #from Gnumed.wxpython import gmDateTimeInput, gmPhraseWheel, gmGuiHelpers 440 441 _gb = gmGuiBroker.GuiBroker() 442 443 gmSECTION_SUMMARY = 1 444 gmSECTION_DEMOGRAPHICS = 2 445 gmSECTION_CLINICALNOTES = 3 446 gmSECTION_FAMILYHISTORY = 4 447 gmSECTION_PASTHISTORY = 5 448 gmSECTION_SCRIPT = 8 449 gmSECTION_REQUESTS = 9 450 gmSECTION_REFERRALS = 11 451 gmSECTION_RECALLS = 12 452 453 richards_blue = wx.Colour(0,0,131) 454 richards_aqua = wx.Colour(0,194,197) 455 richards_dark_gray = wx.Colour(131,129,131) 456 richards_light_gray = wx.Colour(255,255,255) 457 richards_coloured_gray = wx.Colour(131,129,131) 458 459 460 CONTROLS_WITHOUT_LABELS =['wxTextCtrl', 'cEditAreaField', 'wx.SpinCtrl', 'gmPhraseWheel', 'wx.ComboBox'] 461
462 -def _decorate_editarea_field(widget):
463 widget.SetForegroundColour(wx.Colour(255, 0, 0)) 464 widget.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD, False, ''))
465 #====================================================================
466 -class cEditAreaPopup(wx.Dialog):
467 - def __init__ ( 468 self, 469 parent, 470 id, 471 title = 'edit area popup', 472 pos=wx.DefaultPosition, 473 size=wx.DefaultSize, 474 style=wx.SIMPLE_BORDER, 475 name='', 476 edit_area = None 477 ):
478 if not isinstance(edit_area, cEditArea2): 479 raise TypeError('<edit_area> must be of type cEditArea2 but is <%s>' % type(edit_area)) 480 wx.Dialog.__init__(self, parent, id, title, pos, size, style, name) 481 self.__wxID_BTN_SAVE = wx.NewId() 482 self.__wxID_BTN_RESET = wx.NewId() 483 self.__editarea = edit_area 484 self.__do_layout() 485 self.__register_events()
486 #-------------------------------------------------------- 487 # public API 488 #--------------------------------------------------------
489 - def get_summary(self):
490 return self.__editarea.get_summary()
491 #--------------------------------------------------------
492 - def __do_layout(self):
493 self.__editarea.Reparent(self) 494 495 self.__btn_SAVE = wx.Button(self, self.__wxID_BTN_SAVE, _("Save")) 496 self.__btn_SAVE.SetToolTipString(_('save entry into medical record')) 497 self.__btn_RESET = wx.Button(self, self.__wxID_BTN_RESET, _("Reset")) 498 self.__btn_RESET.SetToolTipString(_('reset entry')) 499 self.__btn_CANCEL = wx.Button(self, wx.ID_CANCEL, _("Cancel")) 500 self.__btn_CANCEL.SetToolTipString(_('discard entry and cancel')) 501 502 szr_buttons = wx.BoxSizer(wx.HORIZONTAL) 503 szr_buttons.Add(self.__btn_SAVE, 1, wx.EXPAND | wx.ALL, 1) 504 szr_buttons.Add(self.__btn_RESET, 1, wx.EXPAND | wx.ALL, 1) 505 szr_buttons.Add(self.__btn_CANCEL, 1, wx.EXPAND | wx.ALL, 1) 506 507 szr_main = wx.BoxSizer(wx.VERTICAL) 508 szr_main.Add(self.__editarea, 1, wx.EXPAND) 509 szr_main.Add(szr_buttons, 0, wx.EXPAND) 510 511 self.SetSizerAndFit(szr_main)
512 #-------------------------------------------------------- 513 # event handling 514 #--------------------------------------------------------
515 - def __register_events(self):
516 # connect standard buttons 517 wx.EVT_BUTTON(self.__btn_SAVE, self.__wxID_BTN_SAVE, self._on_SAVE_btn_pressed) 518 wx.EVT_BUTTON(self.__btn_RESET, self.__wxID_BTN_RESET, self._on_RESET_btn_pressed) 519 wx.EVT_BUTTON(self.__btn_CANCEL, wx.ID_CANCEL, self._on_CANCEL_btn_pressed) 520 521 wx.EVT_CLOSE(self, self._on_CANCEL_btn_pressed) 522 523 # client internal signals 524 # gmDispatcher.connect(signal = gmSignals.pre_patient_selection(), receiver = self._on_pre_patient_selection) 525 # gmDispatcher.connect(signal = gmSignals.application_closing(), receiver = self._on_application_closing) 526 # gmDispatcher.connect(signal = gmSignals.post_patient_selection(), receiver = self.on_post_patient_selection) 527 528 return 1
529 #--------------------------------------------------------
530 - def _on_SAVE_btn_pressed(self, evt):
531 if self.__editarea.save_data(): 532 self.__editarea.Close() 533 self.EndModal(wx.ID_OK) 534 return 535 short_err = self.__editarea.get_short_error() 536 long_err = self.__editarea.get_long_error() 537 if (short_err is None) and (long_err is None): 538 long_err = _( 539 'Unspecified error saving data in edit area.\n\n' 540 'Programmer forgot to specify proper error\n' 541 'message in [%s].' 542 ) % self.__editarea.__class__.__name__ 543 if short_err is not None: 544 gmDispatcher.send(signal = 'statustext', msg = short_err) 545 if long_err is not None: 546 gmGuiHelpers.gm_show_error(long_err, _('saving clinical data'))
547 #--------------------------------------------------------
548 - def _on_CANCEL_btn_pressed(self, evt):
549 self.__editarea.Close() 550 self.EndModal(wx.ID_CANCEL)
551 #--------------------------------------------------------
552 - def _on_RESET_btn_pressed(self, evt):
553 self.__editarea.reset_ui()
554 #====================================================================
555 -class cEditArea2(wx.Panel):
556 - def __init__(self, parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL):
557 # init main background panel 558 wx.Panel.__init__ ( 559 self, 560 parent, 561 id, 562 pos = pos, 563 size = size, 564 style = style | wx.TAB_TRAVERSAL 565 ) 566 self.SetBackgroundColour(wx.Colour(222,222,222)) 567 568 self.data = None # a placeholder for opaque data 569 self.fields = {} 570 self.prompts = {} 571 self._short_error = None 572 self._long_error = None 573 self._summary = None 574 self._patient = gmPerson.gmCurrentPatient() 575 self.__wxID_BTN_OK = wx.NewId() 576 self.__wxID_BTN_CLEAR = wx.NewId() 577 self.__do_layout() 578 self.__register_events() 579 self.Show()
580 #-------------------------------------------------------- 581 # external API 582 #--------------------------------------------------------
583 - def save_data(self):
584 """This needs to be overridden by child classes.""" 585 self._long_error = _( 586 'Cannot save data from edit area.\n\n' 587 'Programmer forgot to override method:\n' 588 ' <%s.save_data>' 589 ) % self.__class__.__name__ 590 return False
591 #--------------------------------------------------------
592 - def reset_ui(self):
593 msg = _( 594 'Cannot reset fields in edit area.\n\n' 595 'Programmer forgot to override method:\n' 596 ' <%s.reset_ui>' 597 ) % self.__class__.__name__ 598 gmGuiHelpers.gm_show_error(msg)
599 #--------------------------------------------------------
600 - def get_short_error(self):
601 tmp = self._short_error 602 self._short_error = None 603 return tmp
604 #--------------------------------------------------------
605 - def get_long_error(self):
606 tmp = self._long_error 607 self._long_error = None 608 return tmp
609 #--------------------------------------------------------
610 - def get_summary(self):
611 return _('<No embed string for [%s]>') % self.__class__.__name__
612 #-------------------------------------------------------- 613 # event handling 614 #--------------------------------------------------------
615 - def __register_events(self):
616 # client internal signals 617 if self._patient.connected: 618 gmDispatcher.connect(signal = 'pre_patient_selection', receiver = self._on_pre_patient_selection) 619 gmDispatcher.connect(signal = 'post_patient_selection', receiver = self.on_post_patient_selection) 620 gmDispatcher.connect(signal = 'application_closing', receiver = self._on_application_closing) 621 622 # wxPython events 623 wx.EVT_CLOSE(self, self._on_close) 624 625 return 1
626 #--------------------------------------------------------
627 - def __deregister_events(self):
628 gmDispatcher.disconnect(signal = u'pre_patient_selection', receiver = self._on_pre_patient_selection) 629 gmDispatcher.disconnect(signal = u'post_patient_selection', receiver = self.on_post_patient_selection) 630 gmDispatcher.disconnect(signal = u'application_closing', receiver = self._on_application_closing)
631 #-------------------------------------------------------- 632 # handlers 633 #--------------------------------------------------------
634 - def _on_close(self, event):
635 self.__deregister_events() 636 event.Skip()
637 #--------------------------------------------------------
638 - def _on_OK_btn_pressed(self, event):
639 """Only active if _make_standard_buttons was called in child class.""" 640 # FIXME: this try: except: block seems to large 641 try: 642 event.Skip() 643 if self.data is None: 644 self._save_new_entry() 645 self.reset_ui() 646 else: 647 self._save_modified_entry() 648 self.reset_ui() 649 except gmExceptions.InvalidInputError, err: 650 # nasty evil popup dialogue box 651 # but for invalid input we want to interrupt user 652 gmGuiHelpers.gm_show_error (err, _("Invalid Input")) 653 except: 654 _log.exception( "save data problem in [%s]" % self.__class__.__name__)
655 #--------------------------------------------------------
656 - def _on_clear_btn_pressed(self, event):
657 """Only active if _make_standard_buttons was called in child class.""" 658 # FIXME: check for unsaved data 659 self.reset_ui() 660 event.Skip()
661 #--------------------------------------------------------
662 - def _on_application_closing(self, **kwds):
663 self.__deregister_events() 664 # remember wxCallAfter 665 if not self._patient.connected: 666 return True 667 # FIXME: should do this: 668 # if self.user_wants_save(): 669 # if self.save_data(): 670 # return True 671 return True 672 _log.error('[%s] lossage' % self.__class__.__name__) 673 return False
674 #--------------------------------------------------------
675 - def _on_pre_patient_selection(self, **kwds):
676 """Just before new patient becomes active.""" 677 # remember wxCallAfter 678 if not self._patient.connected: 679 return True 680 # FIXME: should do this: 681 # if self.user_wants_save(): 682 # if self.save_data(): 683 # return True 684 return True 685 _log.error('[%s] lossage' % self.__class__.__name__) 686 return False
687 #--------------------------------------------------------
688 - def on_post_patient_selection( self, **kwds):
689 """Just after new patient became active.""" 690 # remember to use wxCallAfter() 691 self.reset_ui()
692 #---------------------------------------------------------------- 693 # internal helpers 694 #----------------------------------------------------------------
695 - def __do_layout(self):
696 697 # define prompts and fields 698 self._define_prompts() 699 self._define_fields(parent = self) 700 if len(self.fields) != len(self.prompts): 701 _log.error('[%s]: #fields != #prompts' % self.__class__.__name__) 702 return None 703 704 # and generate edit area from it 705 szr_main_fgrid = wx.FlexGridSizer(rows = len(self.prompts), cols=2) 706 color = richards_aqua 707 lines = self.prompts.keys() 708 lines.sort() 709 for line in lines: 710 # 1) prompt 711 label, color, weight = self.prompts[line] 712 # FIXME: style for centering in vertical direction ? 713 prompt = wx.StaticText ( 714 parent = self, 715 id = -1, 716 label = label, 717 style = wx.ALIGN_CENTRE 718 ) 719 # FIXME: resolution dependant 720 prompt.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False, '')) 721 prompt.SetForegroundColour(color) 722 prompt.SetBackgroundColour(richards_light_gray) 723 szr_main_fgrid.Add(prompt, flag=wx.EXPAND | wx.ALIGN_RIGHT) 724 725 # 2) widget(s) for line 726 szr_line = wx.BoxSizer(wx.HORIZONTAL) 727 positions = self.fields[line].keys() 728 positions.sort() 729 for pos in positions: 730 field, weight = self.fields[line][pos] 731 # field.SetBackgroundColour(wx.Colour(222,222,222)) 732 szr_line.Add(field, weight, wx.EXPAND) 733 szr_main_fgrid.Add(szr_line, flag=wx.GROW | wx.ALIGN_LEFT) 734 735 # grid can grow column 1 only, not column 0 736 szr_main_fgrid.AddGrowableCol(1) 737 738 # # use sizer for border around everything plus a little gap 739 # # FIXME: fold into szr_main_panels ? 740 # self.szr_central_container = wx.BoxSizer(wxHORIZONTAL) 741 # self.szr_central_container.Add(self.szr_main_panels, 1, wx.EXPAND | wxALL, 5) 742 743 # and do the layouting 744 self.SetSizerAndFit(szr_main_fgrid)
745 # self.FitInside() 746 #---------------------------------------------------------------- 747 # intra-class API 748 #----------------------------------------------------------------
749 - def _define_prompts(self):
750 """Child classes override this to define their prompts using _add_prompt()""" 751 _log.error('missing override in [%s]' % self.__class__.__name__)
752 #----------------------------------------------------------------
753 - def _add_prompt(self, line, label='missing label', color=richards_blue, weight=0):
754 """Add a new prompt line. 755 756 To be used from _define_fields in child classes. 757 758 - label, the label text 759 - color 760 - weight, the weight given in sizing the various rows. 0 means the row 761 always has minimum size 762 """ 763 self.prompts[line] = (label, color, weight)
764 #----------------------------------------------------------------
765 - def _define_fields(self, parent):
766 """Defines the fields. 767 768 - override in child classes 769 - mostly uses _add_field() 770 """ 771 _log.error('missing override in [%s]' % self.__class__.__name__)
772 #----------------------------------------------------------------
773 - def _add_field(self, line=None, pos=None, widget=None, weight=0):
774 if None in (line, pos, widget): 775 _log.error('argument error in [%s]: line=%s, pos=%s, widget=%s' % (self.__class__.__name__, line, pos, widget)) 776 if not self.fields.has_key(line): 777 self.fields[line] = {} 778 self.fields[line][pos] = (widget, weight)
779 #----------------------------------------------------------------
780 - def _make_standard_buttons(self, parent):
781 """Generates OK/CLEAR buttons for edit area.""" 782 self.btn_OK = wx.Button(parent, self.__wxID_BTN_OK, _("OK")) 783 self.btn_OK.SetToolTipString(_('save entry into medical record')) 784 self.btn_Clear = wx.Button(parent, self.__wxID_BTN_CLEAR, _("Clear")) 785 self.btn_Clear.SetToolTipString(_('initialize input fields for new entry')) 786 787 szr_buttons = wx.BoxSizer(wx.HORIZONTAL) 788 szr_buttons.Add(self.btn_OK, 1, wx.EXPAND | wx.ALL, 1) 789 szr_buttons.Add((5, 0), 0) 790 szr_buttons.Add(self.btn_Clear, 1, wx.EXPAND | wx.ALL, 1) 791 792 # connect standard buttons 793 wx.EVT_BUTTON(self.btn_OK, self.__wxID_BTN_OK, self._on_OK_btn_pressed) 794 wx.EVT_BUTTON(self.btn_Clear, self.__wxID_BTN_CLEAR, self._on_clear_btn_pressed) 795 796 return szr_buttons
797 #==================================================================== 798 #==================================================================== 799 #text control class to be later replaced by the gmPhraseWheel 800 #--------------------------------------------------------------------
801 -class cEditAreaField(wx.TextCtrl):
802 - def __init__ (self, parent, id = -1, pos = wx.DefaultPosition, size=wx.DefaultSize):
803 wx.TextCtrl.__init__(self,parent,id,"",pos, size ,wx.SIMPLE_BORDER) 804 _decorate_editarea_field(self)
805 #====================================================================
806 -class cEditArea(wx.Panel):
807 - def __init__(self, parent, id, pos, size, style):
808 809 print "class [%s] is deprecated, use cEditArea2 instead" % self.__class__.__name__ 810 811 # init main background panel 812 wx.Panel.__init__(self, parent, id, pos=pos, size=size, style=wx.NO_BORDER | wx.TAB_TRAVERSAL) 813 self.SetBackgroundColour(wx.Colour(222,222,222)) 814 815 self.data = None 816 self.fields = {} 817 self.prompts = {} 818 819 ID_BTN_OK = wx.NewId() 820 ID_BTN_CLEAR = wx.NewId() 821 822 self.__do_layout() 823 824 # self.input_fields = {} 825 826 # self._postInit() 827 # self.old_data = {} 828 829 self._patient = gmPerson.gmCurrentPatient() 830 self.__register_events() 831 self.Show(True)
832 #---------------------------------------------------------------- 833 # internal helpers 834 #----------------------------------------------------------------
835 - def __do_layout(self):
836 # define prompts and fields 837 self._define_prompts() 838 self.fields_pnl = wx.Panel(self, -1, style = wx.RAISED_BORDER | wx.TAB_TRAVERSAL) 839 self._define_fields(parent = self.fields_pnl) 840 # and generate edit area from it 841 szr_prompts = self.__generate_prompts() 842 szr_fields = self.__generate_fields() 843 844 # stack prompts and fields horizontally 845 self.szr_main_panels = wx.BoxSizer(wx.HORIZONTAL) 846 self.szr_main_panels.Add(szr_prompts, 11, wx.EXPAND) 847 self.szr_main_panels.Add(5, 0, 0, wx.EXPAND) 848 self.szr_main_panels.Add(szr_fields, 90, wx.EXPAND) 849 850 # use sizer for border around everything plus a little gap 851 # FIXME: fold into szr_main_panels ? 852 self.szr_central_container = wx.BoxSizer(wx.HORIZONTAL) 853 self.szr_central_container.Add(self.szr_main_panels, 1, wx.EXPAND | wx.ALL, 5) 854 855 # and do the layouting 856 self.SetAutoLayout(True) 857 self.SetSizer(self.szr_central_container) 858 self.szr_central_container.Fit(self)
859 #----------------------------------------------------------------
860 - def __generate_prompts(self):
861 if len(self.fields) != len(self.prompts): 862 _log.error('[%s]: #fields != #prompts' % self.__class__.__name__) 863 return None 864 # prompts live on a panel 865 prompt_pnl = wx.Panel(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.SIMPLE_BORDER) 866 prompt_pnl.SetBackgroundColour(richards_light_gray) 867 # make them 868 color = richards_aqua 869 lines = self.prompts.keys() 870 lines.sort() 871 self.prompt_widget = {} 872 for line in lines: 873 label, color, weight = self.prompts[line] 874 self.prompt_widget[line] = self.__make_prompt(prompt_pnl, "%s " % label, color) 875 # make shadow below prompts in gray 876 shadow_below_prompts = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 877 shadow_below_prompts.SetBackgroundColour(richards_dark_gray) 878 szr_shadow_below_prompts = wx.BoxSizer (wx.HORIZONTAL) 879 szr_shadow_below_prompts.Add(5, 0, 0, wx.EXPAND) 880 szr_shadow_below_prompts.Add(shadow_below_prompts, 10, wx.EXPAND) 881 882 # stack prompt panel and shadow vertically 883 vszr_prompts = wx.BoxSizer(wx.VERTICAL) 884 vszr_prompts.Add(prompt_pnl, 97, wx.EXPAND) 885 vszr_prompts.Add(szr_shadow_below_prompts, 5, wx.EXPAND) 886 887 # make shadow to the right of the prompts 888 shadow_rightof_prompts = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 889 shadow_rightof_prompts.SetBackgroundColour(richards_dark_gray) 890 szr_shadow_rightof_prompts = wx.BoxSizer(wx.VERTICAL) 891 szr_shadow_rightof_prompts.Add(0,5,0,wx.EXPAND) 892 szr_shadow_rightof_prompts.Add(shadow_rightof_prompts, 1, wx.EXPAND) 893 894 # stack vertical prompt sizer and shadow horizontally 895 hszr_prompts = wx.BoxSizer(wx.HORIZONTAL) 896 hszr_prompts.Add(vszr_prompts, 10, wx.EXPAND) 897 hszr_prompts.Add(szr_shadow_rightof_prompts, 1, wx.EXPAND) 898 899 return hszr_prompts
900 #----------------------------------------------------------------
901 - def __generate_fields(self):
902 self.fields_pnl.SetBackgroundColour(wx.Colour(222,222,222)) 903 # rows, cols, hgap, vgap 904 vszr = wx.BoxSizer(wx.VERTICAL) 905 lines = self.fields.keys() 906 lines.sort() 907 self.field_line_szr = {} 908 for line in lines: 909 self.field_line_szr[line] = wx.BoxSizer(wx.HORIZONTAL) 910 positions = self.fields[line].keys() 911 positions.sort() 912 for pos in positions: 913 field, weight = self.fields[line][pos] 914 self.field_line_szr[line].Add(field, weight, wx.EXPAND) 915 try: 916 vszr.Add(self.field_line_szr[line], self.prompts[line][2], flag = wx.EXPAND) # use same lineweight as prompts 917 except KeyError: 918 _log.error("Error with line=%s, self.field_line_szr has key:%s; self.prompts has key: %s" % (line, self.field_line_szr.has_key(line), self.prompts.has_key(line) ) ) 919 # put them on the panel 920 self.fields_pnl.SetSizer(vszr) 921 vszr.Fit(self.fields_pnl) 922 923 # make shadow below edit fields in gray 924 shadow_below_edit_fields = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 925 shadow_below_edit_fields.SetBackgroundColour(richards_coloured_gray) 926 szr_shadow_below_edit_fields = wx.BoxSizer(wx.HORIZONTAL) 927 szr_shadow_below_edit_fields.Add(5, 0, 0, wx.EXPAND) 928 szr_shadow_below_edit_fields.Add(shadow_below_edit_fields, 12, wx.EXPAND) 929 930 # stack edit fields and shadow vertically 931 vszr_edit_fields = wx.BoxSizer(wx.VERTICAL) 932 vszr_edit_fields.Add(self.fields_pnl, 92, wx.EXPAND) 933 vszr_edit_fields.Add(szr_shadow_below_edit_fields, 5, wx.EXPAND) 934 935 # make shadow to the right of the edit area 936 shadow_rightof_edit_fields = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 937 shadow_rightof_edit_fields.SetBackgroundColour(richards_coloured_gray) 938 szr_shadow_rightof_edit_fields = wx.BoxSizer(wx.VERTICAL) 939 szr_shadow_rightof_edit_fields.Add(0, 5, 0, wx.EXPAND) 940 szr_shadow_rightof_edit_fields.Add(shadow_rightof_edit_fields, 1, wx.EXPAND) 941 942 # stack vertical edit fields sizer and shadow horizontally 943 hszr_edit_fields = wx.BoxSizer(wx.HORIZONTAL) 944 hszr_edit_fields.Add(vszr_edit_fields, 89, wx.EXPAND) 945 hszr_edit_fields.Add(szr_shadow_rightof_edit_fields, 1, wx.EXPAND) 946 947 return hszr_edit_fields
948 #---------------------------------------------------------------
949 - def __make_prompt(self, parent, aLabel, aColor):
950 # FIXME: style for centering in vertical direction ? 951 prompt = wx.StaticText( 952 parent, 953 -1, 954 aLabel, 955 style = wx.ALIGN_RIGHT 956 ) 957 prompt.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False, '')) 958 prompt.SetForegroundColour(aColor) 959 return prompt
960 #---------------------------------------------------------------- 961 # intra-class API 962 #----------------------------------------------------------------
963 - def _add_prompt(self, line, label='missing label', color=richards_blue, weight=0):
964 """Add a new prompt line. 965 966 To be used from _define_fields in child classes. 967 968 - label, the label text 969 - color 970 - weight, the weight given in sizing the various rows. 0 means the rwo 971 always has minimum size 972 """ 973 self.prompts[line] = (label, color, weight)
974 #----------------------------------------------------------------
975 - def _add_field(self, line=None, pos=None, widget=None, weight=0):
976 if None in (line, pos, widget): 977 _log.error('argument error in [%s]: line=%s, pos=%s, widget=%s' % (self.__class__.__name__, line, pos, widget)) 978 if not self.fields.has_key(line): 979 self.fields[line] = {} 980 self.fields[line][pos] = (widget, weight)
981 #----------------------------------------------------------------
982 - def _define_fields(self, parent):
983 """Defines the fields. 984 985 - override in child classes 986 - mostly uses _add_field() 987 """ 988 _log.error('missing override in [%s]' % self.__class__.__name__)
989 #----------------------------------------------------------------
990 - def _define_prompts(self):
991 _log.error('missing override in [%s]' % self.__class__.__name__)
992 #----------------------------------------------------------------
993 - def _make_standard_buttons(self, parent):
994 """Generates OK/CLEAR buttons for edit area.""" 995 self.btn_OK = wx.Button(parent, ID_BTN_OK, _("OK")) 996 self.btn_OK.SetToolTipString(_('save entry into medical record')) 997 self.btn_Clear = wx.Button(parent, ID_BTN_CLEAR, _("Clear")) 998 self.btn_Clear.SetToolTipString(_('initialize input fields for new entry')) 999 1000 szr_buttons = wx.BoxSizer(wx.HORIZONTAL) 1001 szr_buttons.Add(self.btn_OK, 1, wx.EXPAND | wx.ALL, 1) 1002 szr_buttons.Add(5, 0, 0) 1003 szr_buttons.Add(self.btn_Clear, 1, wx.EXPAND | wx.ALL, 1) 1004 1005 return szr_buttons
1006 #--------------------------------------------------------
1007 - def _pre_save_data(self):
1008 pass
1009 #--------------------------------------------------------
1010 - def _save_data(self):
1011 _log.error('[%s] programmer forgot to define _save_data()' % self.__class__.__name__) 1012 _log.info('child classes of cEditArea *must* override this function') 1013 return False
1014 #-------------------------------------------------------- 1015 # event handling 1016 #--------------------------------------------------------
1017 - def __register_events(self):
1018 # connect standard buttons 1019 wx.EVT_BUTTON(self.btn_OK, ID_BTN_OK, self._on_OK_btn_pressed) 1020 wx.EVT_BUTTON(self.btn_Clear, ID_BTN_CLEAR, self._on_clear_btn_pressed) 1021 1022 wx.EVT_SIZE (self.fields_pnl, self._on_resize_fields) 1023 1024 # client internal signals 1025 gmDispatcher.connect(signal = u'pre_patient_selection', receiver = self._on_pre_patient_selection) 1026 gmDispatcher.connect(signal = u'application_closing', receiver = self._on_application_closing) 1027 gmDispatcher.connect(signal = u'post_patient_selection', receiver = self.on_post_patient_selection) 1028 1029 return 1
1030 #-------------------------------------------------------- 1031 # handlers 1032 #--------------------------------------------------------
1033 - def _on_OK_btn_pressed(self, event):
1034 # FIXME: this try: except: block seems to large 1035 try: 1036 event.Skip() 1037 if self.data is None: 1038 self._save_new_entry() 1039 self.set_data() 1040 else: 1041 self._save_modified_entry() 1042 self.set_data() 1043 except gmExceptions.InvalidInputError, err: 1044 # nasty evil popup dialogue box 1045 # but for invalid input we want to interrupt user 1046 gmGuiHelpers.gm_show_error (err, _("Invalid Input")) 1047 except: 1048 _log.exception( "save data problem in [%s]" % self.__class__.__name__)
1049 #--------------------------------------------------------
1050 - def _on_clear_btn_pressed(self, event):
1051 # FIXME: check for unsaved data 1052 self.set_data() 1053 event.Skip()
1054 #--------------------------------------------------------
1055 - def on_post_patient_selection( self, **kwds):
1056 # remember to use wxCallAfter() 1057 self.set_data()
1058 #--------------------------------------------------------
1059 - def _on_application_closing(self, **kwds):
1060 # remember wxCallAfter 1061 if not self._patient.connected: 1062 return True 1063 if self._save_data(): 1064 return True 1065 _log.error('[%s] lossage' % self.__class__.__name__) 1066 return False
1067 #--------------------------------------------------------
1068 - def _on_pre_patient_selection(self, **kwds):
1069 # remember wxCallAfter 1070 if not self._patient.connected: 1071 return True 1072 if self._save_data(): 1073 return True 1074 _log.error('[%s] lossage' % self.__class__.__name__) 1075 return False
1076 #--------------------------------------------------------
1077 - def _on_resize_fields (self, event):
1078 self.fields_pnl.Layout() 1079 # resize the prompts accordingly 1080 for i in self.field_line_szr.keys(): 1081 # query the BoxSizer to find where the field line is 1082 pos = self.field_line_szr[i].GetPosition() 1083 # and set the prompt lable to the same Y position 1084 self.prompt_widget[i].SetPosition((0, pos.y))
1085 #====================================================================
1086 -class gmEditArea(cEditArea):
1087 - def __init__(self, parent, id, aType = None):
1088 1089 print "class [%s] is deprecated, use cEditArea2 instead" % self.__class__.__name__ 1090 1091 # sanity checks 1092 if aType not in _known_edit_area_types: 1093 _log.error('unknown edit area type: [%s]' % aType) 1094 raise gmExceptions.ConstructorError, 'unknown edit area type: [%s]' % aType 1095 self._type = aType 1096 1097 # init main background panel 1098 cEditArea.__init__(self, parent, id) 1099 1100 self.input_fields = {} 1101 1102 self._postInit() 1103 self.old_data = {} 1104 1105 self._patient = gmPerson.gmCurrentPatient() 1106 self.Show(True)
1107 #---------------------------------------------------------------- 1108 # internal helpers 1109 #---------------------------------------------------------------- 1110 #---------------------------------------------------------------- 1111 # to be obsoleted 1112 #----------------------------------------------------------------
1113 - def __make_prompts(self, prompt_labels):
1114 # prompts live on a panel 1115 prompt_pnl = wx.Panel(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.SIMPLE_BORDER) 1116 prompt_pnl.SetBackgroundColour(richards_light_gray) 1117 # make them 1118 gszr = wx.FlexGridSizer (len(prompt_labels)+1, 1, 2, 2) 1119 color = richards_aqua 1120 for prompt in prompt_labels: 1121 label = self.__make_prompt(prompt_pnl, "%s " % prompt, color) 1122 gszr.Add(label, 0, wx.EXPAND | wx.ALIGN_RIGHT) 1123 color = richards_blue 1124 gszr.RemoveGrowableRow (line-1) 1125 # put sizer on panel 1126 prompt_pnl.SetSizer(gszr) 1127 gszr.Fit(prompt_pnl) 1128 prompt_pnl.SetAutoLayout(True) 1129 1130 # make shadow below prompts in gray 1131 shadow_below_prompts = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1132 shadow_below_prompts.SetBackgroundColour(richards_dark_gray) 1133 szr_shadow_below_prompts = wx.BoxSizer (wx.HORIZONTAL) 1134 szr_shadow_below_prompts.Add(5, 0, 0, wx.EXPAND) 1135 szr_shadow_below_prompts.Add(shadow_below_prompts, 10, wx.EXPAND) 1136 1137 # stack prompt panel and shadow vertically 1138 vszr_prompts = wx.BoxSizer(wx.VERTICAL) 1139 vszr_prompts.Add(prompt_pnl, 97, wx.EXPAND) 1140 vszr_prompts.Add(szr_shadow_below_prompts, 5, wx.EXPAND) 1141 1142 # make shadow to the right of the prompts 1143 shadow_rightof_prompts = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1144 shadow_rightof_prompts.SetBackgroundColour(richards_dark_gray) 1145 szr_shadow_rightof_prompts = wx.BoxSizer(wx.VERTICAL) 1146 szr_shadow_rightof_prompts.Add(0,5,0,wx.EXPAND) 1147 szr_shadow_rightof_prompts.Add(shadow_rightof_prompts,1,wx.EXPAND) 1148 1149 # stack vertical prompt sizer and shadow horizontally 1150 hszr_prompts = wx.BoxSizer(wx.HORIZONTAL) 1151 hszr_prompts.Add(vszr_prompts, 10, wx.EXPAND) 1152 hszr_prompts.Add(szr_shadow_rightof_prompts, 1, wx.EXPAND) 1153 1154 return hszr_prompts
1155 #----------------------------------------------------------------
1156 - def _make_edit_lines(self, parent):
1157 _log.error('programmer forgot to define edit area lines for [%s]' % self._type) 1158 _log.info('child classes of gmEditArea *must* override this function') 1159 return []
1160 #----------------------------------------------------------------
1161 - def __make_editing_area(self):
1162 # make edit fields 1163 fields_pnl = wx.Panel(self, -1, wx.DefaultPosition, wx.DefaultSize, style = wx.RAISED_BORDER | wx.TAB_TRAVERSAL) 1164 fields_pnl.SetBackgroundColour(wx.Colour(222,222,222)) 1165 # rows, cols, hgap, vgap 1166 gszr = wx.GridSizer(len(_prompt_defs[self._type]), 1, 2, 2) 1167 1168 # get lines 1169 lines = self._make_edit_lines(parent = fields_pnl) 1170 1171 self.lines = lines 1172 if len(lines) != len(_prompt_defs[self._type]): 1173 _log.error('#(edit lines) not equal #(prompts) for [%s], something is fishy' % self._type) 1174 for line in lines: 1175 gszr.Add(line, 0, wx.EXPAND | wx.ALIGN_LEFT) 1176 # put them on the panel 1177 fields_pnl.SetSizer(gszr) 1178 gszr.Fit(fields_pnl) 1179 fields_pnl.SetAutoLayout(True) 1180 1181 # make shadow below edit fields in gray 1182 shadow_below_edit_fields = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1183 shadow_below_edit_fields.SetBackgroundColour(richards_coloured_gray) 1184 szr_shadow_below_edit_fields = wx.BoxSizer(wx.HORIZONTAL) 1185 szr_shadow_below_edit_fields.Add(5, 0, 0, wx.EXPAND) 1186 szr_shadow_below_edit_fields.Add(shadow_below_edit_fields, 12, wx.EXPAND) 1187 1188 # stack edit fields and shadow vertically 1189 vszr_edit_fields = wx.BoxSizer(wx.VERTICAL) 1190 vszr_edit_fields.Add(fields_pnl, 92, wx.EXPAND) 1191 vszr_edit_fields.Add(szr_shadow_below_edit_fields, 5, wx.EXPAND) 1192 1193 # make shadow to the right of the edit area 1194 shadow_rightof_edit_fields = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1195 shadow_rightof_edit_fields.SetBackgroundColour(richards_coloured_gray) 1196 szr_shadow_rightof_edit_fields = wx.BoxSizer(wx.VERTICAL) 1197 szr_shadow_rightof_edit_fields.Add(0, 5, 0, wx.EXPAND) 1198 szr_shadow_rightof_edit_fields.Add(shadow_rightof_edit_fields, 1, wx.EXPAND) 1199 1200 # stack vertical edit fields sizer and shadow horizontally 1201 hszr_edit_fields = wx.BoxSizer(wx.HORIZONTAL) 1202 hszr_edit_fields.Add(vszr_edit_fields, 89, wx.EXPAND) 1203 hszr_edit_fields.Add(szr_shadow_rightof_edit_fields, 1, wx.EXPAND) 1204 1205 return hszr_edit_fields
1206
1207 - def set_old_data( self, map):
1208 self.old_data = map
1209
1210 - def _default_init_fields(self):
1211 #self.dirty = 0 #this flag is for patient_activating event to save any unsaved entries 1212 self.setInputFieldValues( self._get_init_values()) 1213 self.data = None
1214
1215 - def _get_init_values(self):
1216 map = {} 1217 for k in self.input_fields.keys(): 1218 map[k] = '' 1219 return map
1220 1221 #--------------------------------------------------------
1222 - def _init_fields(self):
1223 self._default_init_fields()
1224 1225 # _log.Log(gmLog.lErr, 'programmer forgot to define _init_fields() for [%s]' % self._type) 1226 # _log.Log(gmLog.lInfo, 'child classes of gmEditArea *must* override this function') 1227 # raise AttributeError 1228 #-------------------------------------------------------------------------------------------------------------
1229 - def _updateUI(self):
1230 _log.warning("you may want to override _updateUI for [%s]" % self.__class__.__name__)
1231 1232
1233 - def _postInit(self):
1234 """override for further control setup""" 1235 pass
1236 1237
1238 - def _makeLineSizer(self, widget, weight, spacerWeight):
1239 szr = wx.BoxSizer(wx.HORIZONTAL) 1240 szr.Add( widget, weight, wx.EXPAND) 1241 szr.Add( 0,0, spacerWeight, wx.EXPAND) 1242 return szr
1243
1244 - def _makeCheckBox(self, parent, title):
1245 1246 cb = wx.CheckBox( parent, -1, _(title)) 1247 cb.SetForegroundColour( richards_blue) 1248 return cb
1249 1250 1251
1252 - def _makeExtraColumns(self , parent, lines, weightMap = {} ):
1253 """this is a utlity method to add extra columns""" 1254 #add an extra column if the class has attribute "extraColumns" 1255 if self.__class__.__dict__.has_key("extraColumns"): 1256 for x in self.__class__.extraColumns: 1257 lines = self._addColumn(parent, lines, x, weightMap) 1258 return lines
1259 1260 1261
1262 - def _addColumn(self, parent, lines, extra, weightMap = {}, existingWeight = 5 , extraWeight = 2):
1263 """ 1264 # add ia extra column in the edit area. 1265 # preconditions: 1266 # parent is fields_pnl (weak); 1267 # self.input_fields exists (required); 1268 # ; extra is a list of tuples of format - 1269 # ( key for input_fields, widget label , widget class to instantiate ) 1270 """ 1271 1272 newlines = [] 1273 i = 0 1274 for x in lines: 1275 # adjust weight if line has specific weightings. 1276 if weightMap.has_key( x): 1277 (existingWeight, extraWeight) = weightMap[x] 1278 1279 szr = wx.BoxSizer(wx.HORIZONTAL) 1280 szr.Add( x, existingWeight, wx.EXPAND) 1281 if i < len(extra) and extra[i] <> None: 1282 1283 (inputKey, widgetLabel, aclass) = extra[i] 1284 if aclass.__name__ in CONTROLS_WITHOUT_LABELS: 1285 szr.Add( self._make_prompt(parent, widgetLabel, richards_blue) ) 1286 widgetLabel = "" 1287 1288 1289 w = aclass( parent, -1, widgetLabel) 1290 if not aclass.__name__ in CONTROLS_WITHOUT_LABELS: 1291 w.SetForegroundColour(richards_blue) 1292 1293 szr.Add(w, extraWeight , wx.EXPAND) 1294 1295 # make sure the widget is locatable via input_fields 1296 self.input_fields[inputKey] = w 1297 1298 newlines.append(szr) 1299 i += 1 1300 return newlines
1301
1302 - def setInputFieldValues(self, map, id = None ):
1303 #self.monitoring_dirty = 0 1304 for k,v in map.items(): 1305 field = self.input_fields.get(k, None) 1306 if field == None: 1307 continue 1308 try: 1309 field.SetValue( str(v) ) 1310 except: 1311 try: 1312 if type(v) == type(''): 1313 v = 0 1314 1315 field.SetValue( v) 1316 except: 1317 pass 1318 self.setDataId(id) 1319 #self.monitoring_dirty = 1 1320 self.set_old_data(self.getInputFieldValues())
1321
1322 - def getDataId(self):
1323 return self.data
1324
1325 - def setDataId(self, id):
1326 self.data = id
1327
1328 - def _getInputFieldValues(self):
1329 values = {} 1330 for k,v in self.input_fields.items(): 1331 values[k] = v.GetValue() 1332 return values
1333
1334 - def getInputFieldValues(self, fields = None):
1335 if fields == None: 1336 fields = self.input_fields.keys() 1337 values = {} 1338 for f in fields: 1339 try: 1340 values[f] = self.input_fields[f].GetValue() 1341 except: 1342 pass 1343 return values
1344 #====================================================================
1345 -class gmPastHistoryEditArea(gmEditArea):
1346
1347 - def __init__(self, parent, id):
1348 gmEditArea.__init__(self, parent, id, aType = 'past history')
1349
1350 - def _define_prompts(self):
1351 self._add_prompt(line = 1, label = _("When Noted")) 1352 self._add_prompt(line = 2, label = _("Laterality")) 1353 self._add_prompt(line = 3, label = _("Condition")) 1354 self._add_prompt(line = 4, label = _("Notes")) 1355 self._add_prompt(line = 6, label = _("Status")) 1356 self._add_prompt(line = 7, label = _("Progress Note")) 1357 self._add_prompt(line = 8, label = '')
1358 #--------------------------------------------------------
1359 - def _define_fields(self, parent):
1360 # line 1 1361 self.fld_date_noted = gmDateTimeInput.gmDateInput( 1362 parent = parent, 1363 id = -1, 1364 style = wx.SIMPLE_BORDER 1365 ) 1366 self._add_field( 1367 line = 1, 1368 pos = 1, 1369 widget = self.fld_date_noted, 1370 weight = 2 1371 ) 1372 self._add_field( 1373 line = 1, 1374 pos = 2, 1375 widget = cPrompt_edit_area(parent,-1, _("Age")), 1376 weight = 0) 1377 1378 self.fld_age_noted = cEditAreaField(parent) 1379 self._add_field( 1380 line = 1, 1381 pos = 3, 1382 widget = self.fld_age_noted, 1383 weight = 2 1384 ) 1385 1386 # line 2 1387 self.fld_laterality_none= wx.RadioButton(parent, -1, _("N/A")) 1388 self.fld_laterality_left= wx.RadioButton(parent, -1, _("L")) 1389 self.fld_laterality_right= wx.RadioButton(parent, -1, _("R")) 1390 self.fld_laterality_both= wx.RadioButton(parent, -1, _("both")) 1391 self._add_field( 1392 line = 2, 1393 pos = 1, 1394 widget = self.fld_laterality_none, 1395 weight = 0 1396 ) 1397 self._add_field( 1398 line = 2, 1399 pos = 2, 1400 widget = self.fld_laterality_left, 1401 weight = 0 1402 ) 1403 self._add_field( 1404 line = 2, 1405 pos = 3, 1406 widget = self.fld_laterality_right, 1407 weight = 1 1408 ) 1409 self._add_field( 1410 line = 2, 1411 pos = 4, 1412 widget = self.fld_laterality_both, 1413 weight = 1 1414 ) 1415 # line 3 1416 self.fld_condition= cEditAreaField(parent) 1417 self._add_field( 1418 line = 3, 1419 pos = 1, 1420 widget = self.fld_condition, 1421 weight = 6 1422 ) 1423 # line 4 1424 self.fld_notes= cEditAreaField(parent) 1425 self._add_field( 1426 line = 4, 1427 pos = 1, 1428 widget = self.fld_notes, 1429 weight = 6 1430 ) 1431 # line 5 1432 self.fld_significant= wx.CheckBox( 1433 parent, 1434 -1, 1435 _("significant"), 1436 style = wx.NO_BORDER 1437 ) 1438 self.fld_active= wx.CheckBox( 1439 parent, 1440 -1, 1441 _("active"), 1442 style = wx.NO_BORDER 1443 ) 1444 1445 self._add_field( 1446 line = 5, 1447 pos = 1, 1448 widget = self.fld_significant, 1449 weight = 0 1450 ) 1451 self._add_field( 1452 line = 5, 1453 pos = 2, 1454 widget = self.fld_active, 1455 weight = 0 1456 ) 1457 #line 6 1458 self.fld_progress= cEditAreaField(parent) 1459 self._add_field( 1460 line = 6, 1461 pos = 1, 1462 widget = self.fld_progress, 1463 weight = 6 1464 ) 1465 1466 #line 7 1467 self._add_field( 1468 line = 7, 1469 pos = 4, 1470 widget = self._make_standard_buttons(parent), 1471 weight = 2 1472 )
1473 #--------------------------------------------------------
1474 - def _postInit(self):
1475 return 1476 #handling of auto age or year filling. 1477 wx.EVT_KILL_FOCUS( self.fld_age_noted, self._ageKillFocus) 1478 wx.EVT_KILL_FOCUS( self.fld_date_noted, self._yearKillFocus)
1479 #--------------------------------------------------------
1480 - def _ageKillFocus( self, event):
1481 # skip first, else later failure later in block causes widget to be unfocusable 1482 event.Skip() 1483 try : 1484 year = self._getBirthYear() + int(self.fld_age_noted.GetValue().strip() ) 1485 self.fld_date_noted.SetValue( str (year) ) 1486 except: 1487 pass
1488
1489 - def _getBirthYear(self):
1490 try: 1491 birthyear = int(str(self._patient['dob']).split('-')[0]) 1492 except: 1493 # birthyear = time.localtime()[0] 1494 birthyear = 1 1495 1496 return birthyear
1497
1498 - def _yearKillFocus( self, event):
1499 event.Skip() 1500 try: 1501 age = int(self.fld_date_noted.GetValue().strip() ) - self._getBirthYear() 1502 self.fld_age_noted.SetValue( str (age) ) 1503 except: 1504 pass 1505 1506 __init_values = { 1507 "condition": "", 1508 "notes1": "", 1509 "notes2": "", 1510 "age": "", 1511 #"year": str(time.localtime()[0]), 1512 "progress": "", 1513 "active": 1, 1514 "operation": 0, 1515 "confidential": 0, 1516 "significant": 1, 1517 "both": 0, 1518 "left": 0, 1519 "right": 0, 1520 "none" : 1 1521 } 1522
1523 - def _getDefaultAge(self):
1524 try: 1525 #return time.localtime()[0] - self._patient.getBirthYear() 1526 return 1 1527 except: 1528 return 0
1529
1530 - def _get_init_values(self):
1531 values = gmPastHistoryEditArea.__init_values 1532 values["age"] = str( self._getDefaultAge()) 1533 return values
1534
1535 - def _save_data(self):
1536 clinical = self._patient.get_emr().get_past_history() 1537 if self.getDataId() is None: 1538 id = clinical.create_history( self.get_fields_formatting_values() ) 1539 self.setDataId(id) 1540 return 1541 1542 clinical.update_history( self.get_fields_formatting_values(), self.getDataId() )
1543 1544 #====================================================================
1545 -class gmReferralEditArea(gmEditArea):
1546
1547 - def __init__(self, parent, id):
1548 try: 1549 gmEditArea.__init__(self, parent, id, aType = 'referral') 1550 except gmExceptions.ConstructorError: 1551 _log.exception('cannot instantiate referral edit area') 1552 self.data = None # we don't use this in this widget 1553 self.recipient = None
1554
1555 - def _define_prompts(self):
1556 self._add_prompt (line = 1, label = _ ("Specialty")) 1557 self._add_prompt (line = 2, label = _ ("Name")) 1558 self._add_prompt (line = 3, label = _ ("Address")) 1559 self._add_prompt (line = 4, label = _ ("Options")) 1560 self._add_prompt (line = 5, label = _("Text"), weight =6) 1561 self._add_prompt (line = 6, label = "")
1562
1563 - def _define_fields (self, parent):
1564 self.fld_specialty = gmPhraseWheel.cPhraseWheel ( 1565 parent = parent, 1566 id = -1, 1567 style = wx.SIMPLE_BORDER 1568 ) 1569 #_decorate_editarea_field (self.fld_specialty) 1570 self._add_field ( 1571 line = 1, 1572 pos = 1, 1573 widget = self.fld_specialty, 1574 weight = 1 1575 ) 1576 self.fld_name = gmPhraseWheel.cPhraseWheel ( 1577 parent = parent, 1578 id = -1, 1579 style = wx.SIMPLE_BORDER 1580 ) 1581 #_decorate_editarea_field (self.fld_name) 1582 self._add_field ( 1583 line = 2, 1584 pos = 1, 1585 widget = self.fld_name, 1586 weight = 1 1587 ) 1588 self.fld_address = wx.ComboBox (parent, -1, style = wx.CB_READONLY) 1589 #_decorate_editarea_field (self.fld_address) 1590 self._add_field ( 1591 line = 3, 1592 pos = 1, 1593 widget = self.fld_address, 1594 weight = 1 1595 ) 1596 # FIXME: replace with set_callback_on_* 1597 # self.fld_specialty.setDependent (self.fld_name, "occupation") 1598 self.fld_name.add_callback_on_selection(self.setAddresses) 1599 # flags line 1600 self.fld_med = wx.CheckBox (parent, -1, _("Meds"), style=wx.NO_BORDER) 1601 self._add_field ( 1602 line = 4, 1603 pos = 1, 1604 widget = self.fld_med, 1605 weight = 1 1606 ) 1607 self.fld_past = wx.CheckBox (parent, -1, _("Past Hx"), style=wx.NO_BORDER) 1608 self._add_field ( 1609 line = 4, 1610 pos = 4, 1611 widget = self.fld_past, 1612 weight = 1 1613 ) 1614 self.fld_text = wx.TextCtrl (parent, -1, style= wx.TE_MULTILINE) 1615 self._add_field ( 1616 line = 5, 1617 pos = 1, 1618 widget = self.fld_text, 1619 weight = 1) 1620 # final line 1621 self._add_field( 1622 line = 6, 1623 pos = 1, 1624 widget = self._make_standard_buttons(parent), 1625 weight = 1 1626 ) 1627 return 1
1628
1629 - def set_data (self):
1630 """ 1631 Doesn't accept any value as this doesn't make sense for this edit area 1632 """ 1633 self.fld_specialty.SetValue ('') 1634 self.fld_name.SetValue ('') 1635 self.fld_address.Clear () 1636 self.fld_address.SetValue ('') 1637 self.fld_med.SetValue (0) 1638 self.fld_past.SetValue (0) 1639 self.fld_text.SetValue ('') 1640 self.recipient = None
1641
1642 - def setAddresses (self, id):
1643 """ 1644 Set the available addresses for the selected identity 1645 """ 1646 if id is None: 1647 self.recipient = None 1648 self.fld_address.Clear () 1649 self.fld_address.SetValue ('') 1650 else: 1651 self.recipient = gmDemographicRecord.cDemographicRecord_SQL (id) 1652 self.fld_address.Clear () 1653 self.addr = self.recipient.getAddresses ('work') 1654 for i in self.addr: 1655 self.fld_address.Append (_("%(number)s %(street)s, %(urb)s %(postcode)s") % i, ('post', i)) 1656 fax = self.recipient.getCommChannel (gmDemographicRecord.FAX) 1657 email = self.recipient.getCommChannel (gmDemographicRecord.EMAIL) 1658 if fax: 1659 self.fld_address.Append ("%s: %s" % (_("FAX"), fax), ('fax', fax)) 1660 if email: 1661 self.fld_address.Append ("%s: %s" % (_("E-MAIL"), email), ('email', email))
1662
1663 - def _save_new_entry(self):
1664 """ 1665 We are always saving a "new entry" here because data_ID is always None 1666 """ 1667 if not self.recipient: 1668 raise gmExceptions.InvalidInputError(_('must have a recipient')) 1669 if self.fld_address.GetSelection() == -1: 1670 raise gmExceptions.InvalidInputError(_('must select address')) 1671 channel, addr = self.fld_address.GetClientData (self.fld_address.GetSelection()) 1672 text = self.fld_text.GetValue() 1673 flags = {} 1674 flags['meds'] = self.fld_med.GetValue() 1675 flags['pasthx'] = self.fld_past.GetValue() 1676 if not gmReferral.create_referral (self._patient, self.recipient, channel, addr, text, flags): 1677 raise gmExceptions.InvalidInputError('error sending form')
1678 1679 #==================================================================== 1680 #==================================================================== 1681 # unconverted edit areas below 1682 #====================================================================
1683 -class gmPrescriptionEditArea(gmEditArea):
1684 - def __init__(self, parent, id):
1685 try: 1686 gmEditArea.__init__(self, parent, id, aType = 'prescription') 1687 except gmExceptions.ConstructorError: 1688 _log.exceptions('cannot instantiate prescription edit area') 1689 raise
1690 1691 1692 #----------------------------------------------------------------
1693 - def _make_edit_lines(self, parent):
1694 _log.debug("making prescription lines") 1695 lines = [] 1696 self.txt_problem = cEditAreaField(parent) 1697 self.txt_class = cEditAreaField(parent) 1698 self.txt_generic = cEditAreaField(parent) 1699 self.txt_brand = cEditAreaField(parent) 1700 self.txt_strength= cEditAreaField(parent) 1701 self.txt_directions= cEditAreaField(parent) 1702 self.txt_for = cEditAreaField(parent) 1703 self.txt_progress = cEditAreaField(parent) 1704 1705 lines.append(self.txt_problem) 1706 lines.append(self.txt_class) 1707 lines.append(self.txt_generic) 1708 lines.append(self.txt_brand) 1709 lines.append(self.txt_strength) 1710 lines.append(self.txt_directions) 1711 lines.append(self.txt_for) 1712 lines.append(self.txt_progress) 1713 lines.append(self._make_standard_buttons(parent)) 1714 self.input_fields = { 1715 "problem": self.txt_problem, 1716 "class" : self.txt_class, 1717 "generic" : self.txt_generic, 1718 "brand" : self.txt_brand, 1719 "strength": self.txt_strength, 1720 "directions": self.txt_directions, 1721 "for" : self.txt_for, 1722 "progress": self.txt_progress 1723 1724 } 1725 1726 return self._makeExtraColumns( parent, lines)
1727 1728 1729 # This makes gmPrescriptionEditArea more adaptable to different nationalities special requirements. 1730 # ( well, it could be.) 1731 # to change at runtime, do 1732 1733 # gmPrescriptionEditArea.extraColumns = [ one or more columnListInfo ] 1734 1735 # each columnListInfo element describes one column, 1736 # where columnListInfo is a list of 1737 # tuples of [ inputMap name, widget label, widget class to instantiate from] 1738 1739 #gmPrescriptionEditArea.extraColumns = [ basicPrescriptionExtra ] 1740 #gmPrescriptionEditArea.extraColumns = [ auPrescriptionExtra ] 1741 1742
1743 - def _save_data(self):
1744 return 1
1745 1746 #==================================================================== 1747 # old style stuff below 1748 #==================================================================== 1749 #Class which shows a blue bold label left justified 1750 #--------------------------------------------------------------------
1751 -class cPrompt_edit_area(wx.StaticText):
1752 - def __init__(self, parent, id, prompt, aColor = richards_blue):
1753 wx.StaticText.__init__(self, parent, id, prompt, wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_LEFT) 1754 self.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False, '')) 1755 self.SetForegroundColour(aColor)
1756 #==================================================================== 1757 # create the editorprompts class which expects a dictionary of labels 1758 # passed to it with prompts relevant to the editing area. 1759 # remove the if else from this once the edit area labelling is fixed 1760 #--------------------------------------------------------------------
1761 -class gmPnlEditAreaPrompts(wx.Panel):
1762 - def __init__(self, parent, id, prompt_labels):
1763 wx.Panel.__init__(self, parent, id, wx.DefaultPosition, wx.DefaultSize, wx.SIMPLE_BORDER) 1764 self.SetBackgroundColour(richards_light_gray) 1765 gszr = wx.GridSizer (len(prompt_labels)+1, 1, 2, 2) 1766 color = richards_aqua 1767 for prompt_key in prompt_labels.keys(): 1768 label = cPrompt_edit_area(self, -1, " %s" % prompt_labels[prompt_key], aColor = color) 1769 gszr.Add(label, 0, wx.EXPAND | wx.ALIGN_RIGHT) 1770 color = richards_blue 1771 self.SetSizer(gszr) 1772 gszr.Fit(self) 1773 self.SetAutoLayout(True)
1774 #==================================================================== 1775 #Class central to gnumed data input 1776 #allows data entry of multiple different types.e.g scripts, 1777 #referrals, measurements, recalls etc 1778 #@TODO : just about everything 1779 #section = calling section eg allergies, script 1780 #----------------------------------------------------------
1781 -class EditTextBoxes(wx.Panel):
1782 - def __init__(self, parent, id, editareaprompts, section):
1783 wx.Panel.__init__(self, parent, id, wx.DefaultPosition, wx.DefaultSize,style = wx.RAISED_BORDER | wx.TAB_TRAVERSAL) 1784 self.SetBackgroundColour(wx.Colour(222,222,222)) 1785 self.parent = parent 1786 # rows, cols, hgap, vgap 1787 self.gszr = wx.GridSizer(len(editareaprompts), 1, 2, 2) 1788 1789 if section == gmSECTION_SUMMARY: 1790 pass 1791 elif section == gmSECTION_DEMOGRAPHICS: 1792 pass 1793 elif section == gmSECTION_CLINICALNOTES: 1794 pass 1795 elif section == gmSECTION_FAMILYHISTORY: 1796 pass 1797 elif section == gmSECTION_PASTHISTORY: 1798 pass 1799 # line 1 1800 1801 self.txt_condition = cEditAreaField(self,PHX_CONDITION,wx.DefaultPosition,wx.DefaultSize) 1802 self.rb_sideleft = wxRadioButton(self,PHX_LEFT, _(" (L) "), wx.DefaultPosition,wx.DefaultSize) 1803 self.rb_sideright = wxRadioButton(self, PHX_RIGHT, _("(R)"), wx.DefaultPosition,wx.DefaultSize,wx.SUNKEN_BORDER) 1804 self.rb_sideboth = wxRadioButton(self, PHX_BOTH, _("Both"), wx.DefaultPosition,wx.DefaultSize) 1805 rbsizer = wx.BoxSizer(wx.HORIZONTAL) 1806 rbsizer.Add(self.rb_sideleft,1,wx.EXPAND) 1807 rbsizer.Add(self.rb_sideright,1,wx.EXPAND) 1808 rbsizer.Add(self.rb_sideboth,1,wx.EXPAND) 1809 szr1 = wx.BoxSizer(wx.HORIZONTAL) 1810 szr1.Add(self.txt_condition, 4, wx.EXPAND) 1811 szr1.Add(rbsizer, 3, wx.EXPAND) 1812 # self.sizer_line1.Add(self.rb_sideleft,1,wx.EXPAND|wxALL,2) 1813 # self.sizer_line1.Add(self.rb_sideright,1,wx.EXPAND|wxALL,2) 1814 # self.sizer_line1.Add(self.rb_sideboth,1,wx.EXPAND|wxALL,2) 1815 # line 2 1816 self.txt_notes1 = cEditAreaField(self,PHX_NOTES,wx.DefaultPosition,wx.DefaultSize) 1817 # line 3 1818 self.txt_notes2= cEditAreaField(self,PHX_NOTES2,wx.DefaultPosition,wx.DefaultSize) 1819 # line 4 1820 self.txt_agenoted = cEditAreaField(self, PHX_AGE, wx.DefaultPosition, wx.DefaultSize) 1821 szr4 = wx.BoxSizer(wx.HORIZONTAL) 1822 szr4.Add(self.txt_agenoted, 1, wx.EXPAND) 1823 szr4.Add(5, 0, 5) 1824 # line 5 1825 self.txt_yearnoted = cEditAreaField(self,PHX_YEAR,wx.DefaultPosition,wx.DefaultSize) 1826 szr5 = wx.BoxSizer(wx.HORIZONTAL) 1827 szr5.Add(self.txt_yearnoted, 1, wx.EXPAND) 1828 szr5.Add(5, 0, 5) 1829 # line 6 1830 self.parent.cb_active = wx.CheckBox(self, PHX_ACTIVE, _("Active"), wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 1831 self.parent.cb_operation = wx.CheckBox(self, PHX_OPERATION, _("Operation"), wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 1832 self.parent.cb_confidential = wx.CheckBox(self, PHX_CONFIDENTIAL , _("Confidential"), wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 1833 self.parent.cb_significant = wx.CheckBox(self, PHX_SIGNIFICANT, _("Significant"), wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 1834 szr6 = wx.BoxSizer(wx.HORIZONTAL) 1835 szr6.Add(self.parent.cb_active, 1, wx.EXPAND) 1836 szr6.Add(self.parent.cb_operation, 1, wx.EXPAND) 1837 szr6.Add(self.parent.cb_confidential, 1, wx.EXPAND) 1838 szr6.Add(self.parent.cb_significant, 1, wx.EXPAND) 1839 # line 7 1840 self.txt_progressnotes = cEditAreaField(self,PHX_PROGRESSNOTES ,wx.DefaultPosition,wx.DefaultSize) 1841 # line 8 1842 szr8 = wx.BoxSizer(wx.HORIZONTAL) 1843 szr8.Add(5, 0, 6) 1844 szr8.Add(self._make_standard_buttons(), 0, wx.EXPAND) 1845 1846 self.gszr.Add(szr1,0,wx.EXPAND) 1847 self.gszr.Add(self.txt_notes1,0,wx.EXPAND) 1848 self.gszr.Add(self.txt_notes2,0,wx.EXPAND) 1849 self.gszr.Add(szr4,0,wx.EXPAND) 1850 self.gszr.Add(szr5,0,wx.EXPAND) 1851 self.gszr.Add(szr6,0,wx.EXPAND) 1852 self.gszr.Add(self.txt_progressnotes,0,wx.EXPAND) 1853 self.gszr.Add(szr8,0,wx.EXPAND) 1854 #self.anylist = wx.ListCtrl(self, -1, wx.DefaultPosition,wx.DefaultSize,wx.LC_REPORT|wx.LC_LIST|wx.SUNKEN_BORDER) 1855 1856 elif section == gmSECTION_SCRIPT: 1857 pass 1858 elif section == gmSECTION_REQUESTS: 1859 pass 1860 elif section == gmSECTION_RECALLS: 1861 pass 1862 else: 1863 pass 1864 1865 self.SetSizer(self.gszr) 1866 self.gszr.Fit(self) 1867 1868 self.SetAutoLayout(True) 1869 self.Show(True)
1870 #----------------------------------------------------------------
1871 - def _make_standard_buttons(self):
1872 self.btn_OK = wx.Button(self, -1, _("Ok")) 1873 self.btn_Clear = wx.Button(self, -1, _("Clear")) 1874 szr_buttons = wx.BoxSizer(wx.HORIZONTAL) 1875 szr_buttons.Add(self.btn_OK, 1, wx.EXPAND, wx.ALL, 1) 1876 szr_buttons.Add(5, 0, 0) 1877 szr_buttons.Add(self.btn_Clear, 1, wx.EXPAND, wx.ALL, 1) 1878 return szr_buttons
1879 #====================================================================
1880 -class EditArea(wx.Panel):
1881 - def __init__(self, parent, id, line_labels, section):
1882 _log.warning('***** old style EditArea instantiated, please convert *****') 1883 1884 wx.Panel.__init__(self, parent, id, wx.DefaultPosition, wx.DefaultSize, style = wx.NO_BORDER) 1885 self.SetBackgroundColour(wx.Colour(222,222,222)) 1886 1887 # make prompts 1888 prompts = gmPnlEditAreaPrompts(self, -1, line_labels) 1889 # and shadow below prompts in ... 1890 shadow_below_prompts = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1891 # ... gray 1892 shadow_below_prompts.SetBackgroundColour(richards_dark_gray) 1893 szr_shadow_below_prompts = wx.BoxSizer (wx.HORIZONTAL) 1894 szr_shadow_below_prompts.Add(5,0,0,wx.EXPAND) 1895 szr_shadow_below_prompts.Add(shadow_below_prompts, 10, wx.EXPAND) 1896 # stack prompts and shadow vertically 1897 szr_prompts = wx.BoxSizer(wx.VERTICAL) 1898 szr_prompts.Add(prompts, 97, wx.EXPAND) 1899 szr_prompts.Add(szr_shadow_below_prompts, 5, wx.EXPAND) 1900 1901 # make edit fields 1902 edit_fields = EditTextBoxes(self, -1, line_labels, section) 1903 # make shadow below edit area ... 1904 shadow_below_editarea = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1905 # ... gray 1906 shadow_below_editarea.SetBackgroundColour(richards_coloured_gray) 1907 szr_shadow_below_editarea = wx.BoxSizer(wx.HORIZONTAL) 1908 szr_shadow_below_editarea.Add(5,0,0,wx.EXPAND) 1909 szr_shadow_below_editarea.Add(shadow_below_editarea, 12, wx.EXPAND) 1910 # stack edit fields and shadow vertically 1911 szr_editarea = wx.BoxSizer(wx.VERTICAL) 1912 szr_editarea.Add(edit_fields, 92, wx.EXPAND) 1913 szr_editarea.Add(szr_shadow_below_editarea, 5, wx.EXPAND) 1914 1915 # make shadows to the right of ... 1916 # ... the prompts ... 1917 shadow_rightof_prompts = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1918 shadow_rightof_prompts.SetBackgroundColour(richards_dark_gray) 1919 szr_shadow_rightof_prompts = wx.BoxSizer(wx.VERTICAL) 1920 szr_shadow_rightof_prompts.Add(0,5,0,wx.EXPAND) 1921 szr_shadow_rightof_prompts.Add(shadow_rightof_prompts,1,wx.EXPAND) 1922 # ... and the edit area 1923 shadow_rightof_editarea = wxWindow(self, -1, wx.DefaultPosition, wx.DefaultSize, 0) 1924 shadow_rightof_editarea.SetBackgroundColour(richards_coloured_gray) 1925 szr_shadow_rightof_editarea = wx.BoxSizer(wx.VERTICAL) 1926 szr_shadow_rightof_editarea.Add(0, 5, 0, wx.EXPAND) 1927 szr_shadow_rightof_editarea.Add(shadow_rightof_editarea, 1, wx.EXPAND) 1928 1929 # stack prompts, shadows and fields horizontally 1930 self.szr_main_panels = wx.BoxSizer(wx.HORIZONTAL) 1931 self.szr_main_panels.Add(szr_prompts, 10, wx.EXPAND) 1932 self.szr_main_panels.Add(szr_shadow_rightof_prompts, 1, wx.EXPAND) 1933 self.szr_main_panels.Add(5, 0, 0, wx.EXPAND) 1934 self.szr_main_panels.Add(szr_editarea, 89, wx.EXPAND) 1935 self.szr_main_panels.Add(szr_shadow_rightof_editarea, 1, wx.EXPAND) 1936 1937 # use sizer for border around everything plus a little gap 1938 # FIXME: fold into szr_main_panels ? 1939 self.szr_central_container = wx.BoxSizer(wx.HORIZONTAL) 1940 self.szr_central_container.Add(self.szr_main_panels, 1, wx.EXPAND | wx.ALL, 5) 1941 self.SetSizer(self.szr_central_container) 1942 self.szr_central_container.Fit(self) 1943 self.SetAutoLayout(True) 1944 self.Show(True)
1945 1946 1947 #==================================================================== 1948 # old stuff still needed for conversion 1949 #-------------------------------------------------------------------- 1950 #==================================================================== 1951 1952 #==================================================================== 1953 1954 # elif section == gmSECTION_SCRIPT: 1955 # gmLog.gmDefLog.Log (gmLog.lData, "in script section now") 1956 # self.text1_prescription_reason = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1957 # self.text2_drug_class = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1958 # self.text3_generic_drug = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1959 # self.text4_brand_drug = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1960 # self.text5_strength = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1961 # self.text6_directions = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1962 # self.text7_for_duration = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1963 # self.text8_prescription_progress_notes = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1964 # self.text9_quantity = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1965 # lbl_veterans = cPrompt_edit_area(self,-1," Veteran ") 1966 # lbl_reg24 = cPrompt_edit_area(self,-1," Reg 24 ") 1967 # lbl_quantity = cPrompt_edit_area(self,-1," Quantity ") 1968 # lbl_repeats = cPrompt_edit_area(self,-1," Repeats ") 1969 # lbl_usualmed = cPrompt_edit_area(self,-1," Usual ") 1970 # self.cb_veteran = wx.CheckBox(self, -1, " Yes ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 1971 # self.cb_reg24 = wx.CheckBox(self, -1, " Yes ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 1972 # self.cb_usualmed = wx.CheckBox(self, -1, " Yes ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 1973 # self.sizer_auth_PI = wx.BoxSizer(wxHORIZONTAL) 1974 # self.btn_authority = wx.Button(self,-1,">Authority") #create authority script 1975 # self.btn_briefPI = wx.Button(self,-1,"Brief PI") #show brief drug product information 1976 # self.sizer_auth_PI.Add(self.btn_authority,1,wx.EXPAND|wxALL,2) #put authority button and PI button 1977 # self.sizer_auth_PI.Add(self.btn_briefPI,1,wx.EXPAND|wxALL,2) #on same sizer 1978 # self.text10_repeats = cEditAreaField(self,-1,wx.DefaultPosition,wx.DefaultSize) 1979 # self.sizer_line3.Add(self.text3_generic_drug,5,wx.EXPAND) 1980 # self.sizer_line3.Add(lbl_veterans,1,wx.EXPAND) 1981 # self.sizer_line3.Add(self.cb_veteran,1,wx.EXPAND) 1982 # self.sizer_line4.Add(self.text4_brand_drug,5,wx.EXPAND) 1983 # self.sizer_line4.Add(lbl_reg24,1,wx.EXPAND) 1984 # self.sizer_line4.Add(self.cb_reg24,1,wx.EXPAND) 1985 # self.sizer_line5.Add(self.text5_strength,5,wx.EXPAND) 1986 # self.sizer_line5.Add(lbl_quantity,1,wx.EXPAND) 1987 # self.sizer_line5.Add(self.text9_quantity,1,wx.EXPAND) 1988 # self.sizer_line6.Add(self.text6_directions,5,wx.EXPAND) 1989 # self.sizer_line6.Add(lbl_repeats,1,wx.EXPAND) 1990 # self.sizer_line6.Add(self.text10_repeats,1,wx.EXPAND) 1991 # self.sizer_line7.Add(self.text7_for_duration,5,wx.EXPAND) 1992 # self.sizer_line7.Add(lbl_usualmed,1,wx.EXPAND) 1993 # self.sizer_line7.Add(self.cb_usualmed,1,wx.EXPAND) 1994 # self.sizer_line8.Add(5,0,0) 1995 # self.sizer_line8.Add(self.sizer_auth_PI,2,wx.EXPAND) 1996 # self.sizer_line8.Add(5,0,2) 1997 # self.sizer_line8.Add(self.btn_OK,1,wx.EXPAND|wxALL,2) 1998 # self.sizer_line8.Add(self.btn_Clear,1,wx.EXPAND|wxALL,2) 1999 # self.gszr.Add(self.text1_prescription_reason,1,wx.EXPAND) #prescribe for 2000 # self.gszr.Add(self.text2_drug_class,1,wx.EXPAND) #prescribe by class 2001 # self.gszr.Add(self.sizer_line3,1,wx.EXPAND) #prescribe by generic, lbl_veterans, cb_veteran 2002 # self.gszr.Add(self.sizer_line4,1,wx.EXPAND) #prescribe by brand, lbl_reg24, cb_reg24 2003 # self.gszr.Add(self.sizer_line5,1,wx.EXPAND) #drug strength, lbl_quantity, text_quantity 2004 # self.gszr.Add(self.sizer_line6,1,wx.EXPAND) #txt_directions, lbl_repeats, text_repeats 2005 # self.gszr.Add(self.sizer_line7,1,wx.EXPAND) #text_for,lbl_usual,chk_usual 2006 # self.gszr.Add(self.text8_prescription_progress_notes,1,wx.EXPAND) #text_progressNotes 2007 # self.gszr.Add(self.sizer_line8,1,wx.EXPAND) 2008 2009 2010 # elif section == gmSECTION_REQUESTS: 2011 # #----------------------------------------------------------------------------- 2012 #editing area for general requests e.g pathology, radiology, physiotherapy etc 2013 #create textboxes, radiobuttons etc 2014 #----------------------------------------------------------------------------- 2015 # self.txt_request_type = cEditAreaField(self,ID_REQUEST_TYPE,wx.DefaultPosition,wx.DefaultSize) 2016 # self.txt_request_company = cEditAreaField(self,ID_REQUEST_COMPANY,wx.DefaultPosition,wx.DefaultSize) 2017 # self.txt_request_street = cEditAreaField(self,ID_REQUEST_STREET,wx.DefaultPosition,wx.DefaultSize) 2018 # self.txt_request_suburb = cEditAreaField(self,ID_REQUEST_SUBURB,wx.DefaultPosition,wx.DefaultSize) 2019 # self.txt_request_phone= cEditAreaField(self,ID_REQUEST_PHONE,wx.DefaultPosition,wx.DefaultSize) 2020 # self.txt_request_requests = cEditAreaField(self,ID_REQUEST_REQUESTS,wx.DefaultPosition,wx.DefaultSize) 2021 # self.txt_request_notes = cEditAreaField(self,ID_REQUEST_FORMNOTES,wx.DefaultPosition,wx.DefaultSize) 2022 # self.txt_request_medications = cEditAreaField(self,ID_REQUEST_MEDICATIONS,wx.DefaultPosition,wx.DefaultSize) 2023 # self.txt_request_copyto = cEditAreaField(self,ID_REQUEST_COPYTO,wx.DefaultPosition,wx.DefaultSize) 2024 # self.txt_request_progressnotes = cEditAreaField(self,ID_PROGRESSNOTES,wx.DefaultPosition,wx.DefaultSize) 2025 # self.lbl_companyphone = cPrompt_edit_area(self,-1," Phone ") 2026 # self.cb_includeallmedications = wx.CheckBox(self, -1, " Include all medications ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2027 # self.rb_request_bill_bb = wxRadioButton(self, ID_REQUEST_BILL_BB, "Bulk Bill ", wx.DefaultPosition,wx.DefaultSize) 2028 # self.rb_request_bill_private = wxRadioButton(self, ID_REQUEST_BILL_PRIVATE, "Private", wx.DefaultPosition,wx.DefaultSize,wx.SUNKEN_BORDER) 2029 # self.rb_request_bill_rebate = wxRadioButton(self, ID_REQUEST_BILL_REBATE, "Rebate", wx.DefaultPosition,wx.DefaultSize) 2030 # self.rb_request_bill_wcover = wxRadioButton(self, ID_REQUEST_BILL_wcover, "w/cover", wx.DefaultPosition,wx.DefaultSize) 2031 #-------------------------------------------------------------- 2032 #add controls to sizers where multiple controls per editor line 2033 #-------------------------------------------------------------- 2034 # self.sizer_request_optionbuttons = wx.BoxSizer(wxHORIZONTAL) 2035 # self.sizer_request_optionbuttons.Add(self.rb_request_bill_bb,1,wx.EXPAND) 2036 # self.sizer_request_optionbuttons.Add(self.rb_request_bill_private ,1,wx.EXPAND) 2037 # self.sizer_request_optionbuttons.Add(self.rb_request_bill_rebate ,1,wx.EXPAND) 2038 # self.sizer_request_optionbuttons.Add(self.rb_request_bill_wcover ,1,wx.EXPAND) 2039 # self.sizer_line4.Add(self.txt_request_suburb,4,wx.EXPAND) 2040 # self.sizer_line4.Add(self.lbl_companyphone,1,wx.EXPAND) 2041 # self.sizer_line4.Add(self.txt_request_phone,2,wx.EXPAND) 2042 # self.sizer_line7.Add(self.txt_request_medications, 4,wx.EXPAND) 2043 # self.sizer_line7.Add(self.cb_includeallmedications,3,wx.EXPAND) 2044 # self.sizer_line10.AddSizer(self.sizer_request_optionbuttons,3,wx.EXPAND) 2045 # self.sizer_line10.AddSizer(self.szr_buttons,1,wx.EXPAND) 2046 #self.sizer_line10.Add(self.btn_OK,1,wx.EXPAND|wxALL,1) 2047 #self.sizer_line10.Add(self.btn_Clear,1,wx.EXPAND|wxALL,1) 2048 #------------------------------------------------------------------ 2049 #add either controls or sizers with controls to vertical grid sizer 2050 #------------------------------------------------------------------ 2051 # self.gszr.Add(self.txt_request_type,0,wx.EXPAND) #e.g Pathology 2052 # self.gszr.Add(self.txt_request_company,0,wx.EXPAND) #e.g Douglas Hanly Moir 2053 # self.gszr.Add(self.txt_request_street,0,wx.EXPAND) #e.g 120 Big Street 2054 # self.gszr.AddSizer(self.sizer_line4,0,wx.EXPAND) #e.g RYDE NSW Phone 02 1800 222 365 2055 # self.gszr.Add(self.txt_request_requests,0,wx.EXPAND) #e.g FBC;ESR;UEC;LFTS 2056 # self.gszr.Add(self.txt_request_notes,0,wx.EXPAND) #e.g generally tired;weight loss; 2057 # self.gszr.AddSizer(self.sizer_line7,0,wx.EXPAND) #e.g Lipitor;losec;zyprexa 2058 # self.gszr.Add(self.txt_request_copyto,0,wx.EXPAND) #e.g Dr I'm All Heart, 120 Big Street Smallville 2059 # self.gszr.Add(self.txt_request_progressnotes,0,wx.EXPAND) #emphasised to patient must return for results 2060 # self.sizer_line8.Add(5,0,6) 2061 # self.sizer_line8.Add(self.btn_OK,1,wx.EXPAND|wxALL,2) 2062 # self.sizer_line8.Add(self.btn_Clear,1,wx.EXPAND|wxALL,2) 2063 # self.gszr.Add(self.sizer_line10,0,wx.EXPAND) #options:b/bill private, rebate,w/cover btnok,btnclear 2064 2065 2066 # elif section == gmSECTION_MEASUREMENTS: 2067 # self.combo_measurement_type = wx.ComboBox(self, ID_MEASUREMENT_TYPE, "", wx.DefaultPosition,wx.DefaultSize, ['Blood pressure','INR','Height','Weight','Whatever other measurement you want to put in here'], wx.CB_DROPDOWN) 2068 # self.combo_measurement_type.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL, wx.BOLD,False,'')) 2069 # self.combo_measurement_type.SetForegroundColour(wx.Colour(255,0,0)) 2070 # self.txt_measurement_value = cEditAreaField(self,ID_MEASUREMENT_VALUE,wx.DefaultPosition,wx.DefaultSize) 2071 # self.txt_txt_measurement_date = cEditAreaField(self,ID_MEASUREMENT_DATE,wx.DefaultPosition,wx.DefaultSize) 2072 # self.txt_txt_measurement_comment = cEditAreaField(self,ID_MEASUREMENT_COMMENT,wx.DefaultPosition,wx.DefaultSize) 2073 # self.txt_txt_measurement_progressnote = cEditAreaField(self,ID_PROGRESSNOTES,wx.DefaultPosition,wx.DefaultSize) 2074 # self.sizer_graphnextbtn = wx.BoxSizer(wxHORIZONTAL) 2075 # self.btn_nextvalue = wx.Button(self,ID_MEASUREMENT_NEXTVALUE," Next Value ") #clear fields except type 2076 # self.btn_graph = wx.Button(self,ID_MEASUREMENT_GRAPH," Graph ") #graph all values of this type 2077 # self.sizer_graphnextbtn.Add(self.btn_nextvalue,1,wx.EXPAND|wxALL,2) #put next and graph button 2078 # self.sizer_graphnextbtn.Add(self.btn_graph,1,wx.EXPAND|wxALL,2) #on same sizer 2079 # self.gszr.Add(self.combo_measurement_type,0,wx.EXPAND) #e.g Blood pressure 2080 # self.gszr.Add(self.txt_measurement_value,0,wx.EXPAND) #e.g 120.70 2081 # self.gszr.Add(self.txt_txt_measurement_date,0,wx.EXPAND) #e.g 10/12/2001 2082 # self.gszr.Add(self.txt_txt_measurement_comment,0,wx.EXPAND) #e.g sitting, right arm 2083 # self.gszr.Add(self.txt_txt_measurement_progressnote,0,wx.EXPAND) #e.g given home BP montitor, see 1 week 2084 # self.sizer_line8.Add(5,0,0) 2085 # self.sizer_line8.Add(self.sizer_graphnextbtn,2,wx.EXPAND) 2086 # self.sizer_line8.Add(5,0,2) 2087 # self.sizer_line8.Add(self.btn_OK,1,wx.EXPAND|wxALL,2) 2088 # self.sizer_line8.Add(self.btn_Clear,1,wx.EXPAND|wxALL,2) 2089 # self.gszr.AddSizer(self.sizer_line8,0,wx.EXPAND) 2090 2091 2092 # elif section == gmSECTION_REFERRALS: 2093 # self.btnpreview = wx.Button(self,-1,"Preview") 2094 # self.sizer_btnpreviewok = wx.BoxSizer(wxHORIZONTAL) 2095 #-------------------------------------------------------- 2096 #editing area for referral letters, insurance letters etc 2097 #create textboxes, checkboxes etc 2098 #-------------------------------------------------------- 2099 # self.txt_referralcategory = cEditAreaField(self,ID_REFERRAL_CATEGORY,wx.DefaultPosition,wx.DefaultSize) 2100 # self.txt_referralname = cEditAreaField(self,ID_REFERRAL_NAME,wx.DefaultPosition,wx.DefaultSize) 2101 # self.txt_referralorganisation = cEditAreaField(self,ID_REFERRAL_ORGANISATION,wx.DefaultPosition,wx.DefaultSize) 2102 # self.txt_referralstreet1 = cEditAreaField(self,ID_REFERRAL_STREET1,wx.DefaultPosition,wx.DefaultSize) 2103 # self.txt_referralstreet2 = cEditAreaField(self,ID_REFERRAL_STREET2,wx.DefaultPosition,wx.DefaultSize) 2104 # self.txt_referralstreet3 = cEditAreaField(self,ID_REFERRAL_STREET3,wx.DefaultPosition,wx.DefaultSize) 2105 # self.txt_referralsuburb = cEditAreaField(self,ID_REFERRAL_SUBURB,wx.DefaultPosition,wx.DefaultSize) 2106 # self.txt_referralpostcode = cEditAreaField(self,ID_REFERRAL_POSTCODE,wx.DefaultPosition,wx.DefaultSize) 2107 # self.txt_referralfor = cEditAreaField(self,ID_REFERRAL_FOR,wx.DefaultPosition,wx.DefaultSize) 2108 # self.txt_referralwphone= cEditAreaField(self,ID_REFERRAL_WPHONE,wx.DefaultPosition,wx.DefaultSize) 2109 # self.txt_referralwfax= cEditAreaField(self,ID_REFERRAL_WFAX,wx.DefaultPosition,wx.DefaultSize) 2110 # self.txt_referralwemail= cEditAreaField(self,ID_REFERRAL_WEMAIL,wx.DefaultPosition,wx.DefaultSize) 2111 #self.txt_referralrequests = cEditAreaField(self,ID_REFERRAL_REQUESTS,wx.DefaultPosition,wx.DefaultSize) 2112 #self.txt_referralnotes = cEditAreaField(self,ID_REFERRAL_FORMNOTES,wx.DefaultPosition,wx.DefaultSize) 2113 #self.txt_referralmedications = cEditAreaField(self,ID_REFERRAL_MEDICATIONS,wx.DefaultPosition,wx.DefaultSize) 2114 # self.txt_referralcopyto = cEditAreaField(self,ID_REFERRAL_COPYTO,wx.DefaultPosition,wx.DefaultSize) 2115 # self.txt_referralprogressnotes = cEditAreaField(self,ID_PROGRESSNOTES,wx.DefaultPosition,wx.DefaultSize) 2116 # self.lbl_referralwphone = cPrompt_edit_area(self,-1," W Phone ") 2117 # self.lbl_referralwfax = cPrompt_edit_area(self,-1," W Fax ") 2118 # self.lbl_referralwemail = cPrompt_edit_area(self,-1," W Email ") 2119 # self.lbl_referralpostcode = cPrompt_edit_area(self,-1," Postcode ") 2120 # self.chkbox_referral_usefirstname = wx.CheckBox(self, -1, " Use Firstname ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2121 # self.chkbox_referral_headoffice = wx.CheckBox(self, -1, " Head Office ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2122 # self.chkbox_referral_medications = wx.CheckBox(self, -1, " Medications ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2123 # self.chkbox_referral_socialhistory = wx.CheckBox(self, -1, " Social History ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2124 # self.chkbox_referral_familyhistory = wx.CheckBox(self, -1, " Family History ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2125 # self.chkbox_referral_pastproblems = wx.CheckBox(self, -1, " Past Problems ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2126 # self.chkbox_referral_activeproblems = wx.CheckBox(self, -1, " Active Problems ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2127 # self.chkbox_referral_habits = wx.CheckBox(self, -1, " Habits ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2128 #self.chkbox_referral_Includeall = wx.CheckBox(self, -1, " Include all of the above ", wx.DefaultPosition,wx.DefaultSize, wx.NO_BORDER) 2129 #-------------------------------------------------------------- 2130 #add controls to sizers where multiple controls per editor line 2131 #-------------------------------------------------------------- 2132 # self.sizer_line2.Add(self.txt_referralname,2,wx.EXPAND) 2133 # self.sizer_line2.Add(self.chkbox_referral_usefirstname,2,wx.EXPAND) 2134 # self.sizer_line3.Add(self.txt_referralorganisation,2,wx.EXPAND) 2135 # self.sizer_line3.Add(self.chkbox_referral_headoffice,2, wx.EXPAND) 2136 # self.sizer_line4.Add(self.txt_referralstreet1,2,wx.EXPAND) 2137 # self.sizer_line4.Add(self.lbl_referralwphone,1,wx.EXPAND) 2138 # self.sizer_line4.Add(self.txt_referralwphone,1,wx.EXPAND) 2139 # self.sizer_line5.Add(self.txt_referralstreet2,2,wx.EXPAND) 2140 # self.sizer_line5.Add(self.lbl_referralwfax,1,wx.EXPAND) 2141 # self.sizer_line5.Add(self.txt_referralwfax,1,wx.EXPAND) 2142 # self.sizer_line6.Add(self.txt_referralstreet3,2,wx.EXPAND) 2143 # self.sizer_line6.Add(self.lbl_referralwemail,1,wx.EXPAND) 2144 # self.sizer_line6.Add(self.txt_referralwemail,1,wx.EXPAND) 2145 # self.sizer_line7.Add(self.txt_referralsuburb,2,wx.EXPAND) 2146 # self.sizer_line7.Add(self.lbl_referralpostcode,1,wx.EXPAND) 2147 # self.sizer_line7.Add(self.txt_referralpostcode,1,wx.EXPAND) 2148 # self.sizer_line10.Add(self.chkbox_referral_medications,1,wx.EXPAND) 2149 # self.sizer_line10.Add(self.chkbox_referral_socialhistory,1,wx.EXPAND) 2150 # self.sizer_line10.Add(self.chkbox_referral_familyhistory,1,wx.EXPAND) 2151 # self.sizer_line11.Add(self.chkbox_referral_pastproblems ,1,wx.EXPAND) 2152 # self.sizer_line11.Add(self.chkbox_referral_activeproblems ,1,wx.EXPAND) 2153 # self.sizer_line11.Add(self.chkbox_referral_habits ,1,wx.EXPAND) 2154 # self.sizer_btnpreviewok.Add(self.btnpreview,0,wx.EXPAND) 2155 # self.szr_buttons.Add(self.btn_Clear,0, wx.EXPAND) 2156 #------------------------------------------------------------------ 2157 #add either controls or sizers with controls to vertical grid sizer 2158 #------------------------------------------------------------------ 2159 # self.gszr.Add(self.txt_referralcategory,0,wx.EXPAND) #e.g Othopaedic surgeon 2160 # self.gszr.Add(self.sizer_line2,0,wx.EXPAND) #e.g Dr B Breaker 2161 # self.gszr.Add(self.sizer_line3,0,wx.EXPAND) #e.g General Orthopaedic servies 2162 # self.gszr.Add(self.sizer_line4,0,wx.EXPAND) #e.g street1 2163 # self.gszr.Add(self.sizer_line5,0,wx.EXPAND) #e.g street2 2164 # self.gszr.Add(self.sizer_line6,0,wx.EXPAND) #e.g street3 2165 # self.gszr.Add(self.sizer_line7,0,wx.EXPAND) #e.g suburb and postcode 2166 # self.gszr.Add(self.txt_referralfor,0,wx.EXPAND) #e.g Referral for an opinion 2167 # self.gszr.Add(self.txt_referralcopyto,0,wx.EXPAND) #e.g Dr I'm All Heart, 120 Big Street Smallville 2168 # self.gszr.Add(self.txt_referralprogressnotes,0,wx.EXPAND) #emphasised to patient must return for results 2169 # self.gszr.AddSizer(self.sizer_line10,0,wx.EXPAND) #e.g check boxes to include medications etc 2170 # self.gszr.Add(self.sizer_line11,0,wx.EXPAND) #e.g check boxes to include active problems etc 2171 #self.spacer = wxWindow(self,-1,wx.DefaultPosition,wx.DefaultSize) 2172 #self.spacer.SetBackgroundColour(wx.Colour(255,255,255)) 2173 # self.sizer_line12.Add(5,0,6) 2174 #self.sizer_line12.Add(self.spacer,6,wx.EXPAND) 2175 # self.sizer_line12.Add(self.btnpreview,1,wx.EXPAND|wxALL,2) 2176 # self.sizer_line12.Add(self.btn_Clear,1,wx.EXPAND|wxALL,2) 2177 # self.gszr.Add(self.sizer_line12,0,wx.EXPAND) #btnpreview and btn clear 2178 2179 2180 # elif section == gmSECTION_RECALLS: 2181 #FIXME remove present options in this combo box #FIXME defaults need to be loaded from database 2182 # self.combo_tosee = wx.ComboBox(self, ID_RECALLS_TOSEE, "", wx.DefaultPosition,wx.DefaultSize, ['Doctor1','Doctor2','Nurse1','Dietition'], wx.CB_READONLY ) #wx.CB_DROPDOWN) 2183 # self.combo_tosee.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL, wx.BOLD,False,'')) 2184 # self.combo_tosee.SetForegroundColour(wx.Colour(255,0,0)) 2185 #FIXME defaults need to be loaded from database 2186 # self.combo_recall_method = wx.ComboBox(self, ID_RECALLS_CONTACTMETHOD, "", wx.DefaultPosition,wx.DefaultSize, ['Letter','Telephone','Email','Carrier pigeon'], wx.CB_READONLY ) 2187 # self.combo_recall_method.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL, wx.BOLD,False,'')) 2188 # self.combo_recall_method.SetForegroundColour(wx.Colour(255,0,0)) 2189 #FIXME defaults need to be loaded from database 2190 # self.combo_apptlength = wx.ComboBox(self, ID_RECALLS_APPNTLENGTH, "", wx.DefaultPosition,wx.DefaultSize, ['brief','standard','long','prolonged'], wx.CB_READONLY ) 2191 # self.combo_apptlength.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL, wx.BOLD,False,'')) 2192 # self.combo_apptlength.SetForegroundColour(wx.Colour(255,0,0)) 2193 # self.txt_recall_for = cEditAreaField(self,ID_RECALLS_TXT_FOR, wx.DefaultPosition,wx.DefaultSize) 2194 # self.txt_recall_due = cEditAreaField(self,ID_RECALLS_TXT_DATEDUE, wx.DefaultPosition,wx.DefaultSize) 2195 # self.txt_recall_addtext = cEditAreaField(self,ID_RECALLS_TXT_ADDTEXT,wx.DefaultPosition,wx.DefaultSize) 2196 # self.txt_recall_include = cEditAreaField(self,ID_RECALLS_TXT_INCLUDEFORMS,wx.DefaultPosition,wx.DefaultSize) 2197 # self.txt_recall_progressnotes = cEditAreaField(self,ID_PROGRESSNOTES,wx.DefaultPosition,wx.DefaultSize) 2198 # self.lbl_recall_consultlength = cPrompt_edit_area(self,-1," Appointment length ") 2199 #sizer_lkine1 has the method of recall and the appointment length 2200 # self.sizer_line1.Add(self.combo_recall_method,1,wx.EXPAND) 2201 # self.sizer_line1.Add(self.lbl_recall_consultlength,1,wx.EXPAND) 2202 # self.sizer_line1.Add(self.combo_apptlength,1,wx.EXPAND) 2203 #Now add the controls to the grid sizer 2204 # self.gszr.Add(self.combo_tosee,1,wx.EXPAND) #list of personel for patient to see 2205 # self.gszr.Add(self.txt_recall_for,1,wx.EXPAND) #the actual recall may be free text or word wheel 2206 # self.gszr.Add(self.txt_recall_due,1,wx.EXPAND) #date of future recall 2207 # self.gszr.Add(self.txt_recall_addtext,1,wx.EXPAND) #added explanation e.g 'come fasting' 2208 # self.gszr.Add(self.txt_recall_include,1,wx.EXPAND) #any forms to be sent out first eg FBC 2209 # self.gszr.AddSizer(self.sizer_line1,1,wx.EXPAND) #the contact method, appointment length 2210 # self.gszr.Add(self.txt_recall_progressnotes,1,wx.EXPAND) #add any progress notes for consultation 2211 # self.sizer_line8.Add(5,0,6) 2212 # self.sizer_line8.Add(self.btn_OK,1,wx.EXPAND|wxALL,2) 2213 # self.sizer_line8.Add(self.btn_Clear,1,wx.EXPAND|wxALL,2) 2214 # self.gszr.Add(self.sizer_line8,1,wx.EXPAND) 2215 # else: 2216 # pass 2217 2218 #==================================================================== 2219 # main 2220 #-------------------------------------------------------------------- 2221 if __name__ == "__main__": 2222 2223 #================================================================
2224 - class cTestEditArea(cEditArea):
2225 - def __init__(self, parent):
2226 cEditArea.__init__(self, parent, -1)
2227 - def _define_prompts(self):
2228 self._add_prompt(line=1, label='line 1') 2229 self._add_prompt(line=2, label='buttons')
2230 - def _define_fields(self, parent):
2231 # line 1 2232 self.fld_substance = cEditAreaField(parent) 2233 self._add_field( 2234 line = 1, 2235 pos = 1, 2236 widget = self.fld_substance, 2237 weight = 1 2238 ) 2239 # line 2 2240 self._add_field( 2241 line = 2, 2242 pos = 1, 2243 widget = self._make_standard_buttons(parent), 2244 weight = 1 2245 )
2246 #================================================================ 2247 app = wxPyWidgetTester(size = (400, 200)) 2248 app.SetWidget(cTestEditArea) 2249 app.MainLoop() 2250 # app = wxPyWidgetTester(size = (400, 200)) 2251 # app.SetWidget(gmFamilyHxEditArea, -1) 2252 # app.MainLoop() 2253 # app = wxPyWidgetTester(size = (400, 200)) 2254 # app.SetWidget(gmPastHistoryEditArea, -1) 2255 # app.MainLoop() 2256 #==================================================================== 2257