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