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