Gnumed.wxpython.gmPregWidgets

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

# Source Code for Module Gnumed.wxpython.gmPregWidgets

      1  """GNUmed pregnancy related dates widgets.
      2  """
      3  #====================================================================
      4  __author__ = "M. Bonert, R. Terry, I. Haywood, K.Hilbert"
      5  __licence__ = "GPL v2 or later"
      6
      7
      8  import sys
      9  import datetime as pydt
     10
     11
     12  import wx
     13
     14
     15  from Gnumed.pycommon import gmDateTime
     16  from Gnumed.pycommon import gmTools
     17  from Gnumed.business import gmClinicalCalculator
     18  from Gnumed.wxpython import gmGuiHelpers
     19
     20  #====================================================================
     21 -def calculate_edc(parent=None, patient=None):
     22
     23          if parent is None:
     24                  parent = wx.GetApp().GetTopWindow()
     25
     26          dlg = cEdcCalculatorDlg(parent, -1)
     27          prev_edc = None
     28          if patient.connected:
     29                  prev_edc = patient.emr.EDC
     30                  dlg.patient = patient
     31                  dlg.EDC = prev_edc
     32          action = dlg.ShowModal()
     33          new_edc = dlg.EDC
     34          dlg.DestroyLater()
     35
     36          # cancelled ?
     37          if action != wx.ID_SAVE:
     38                  return
     39
     40          # but have we got a patient ?
     41          if not patient.connected:
     42                  return
     43
     44          # ignore setting EDC from NULL to NULL
     45          if (new_edc is None) and (prev_edc is None):
     46                  return
     47
     48          # setting from X to NULL -> is a deletion intended ?
     49          # (prev_edc MUST be not None due to the previous condition)
     50          if new_edc is None:
     51                  delete_edc = gmGuiHelpers.gm_show_question (
     52                          title = _('Editing EDC'),
     53                          question = _(
     54                                  'Really delete the EDC documented previously ?\n'
     55                                  '\n'
     56                                  ' EDC: %s'
     57                          ) % gmDateTime.pydt_strftime(prev_edc, '%Y %b %d'),
     58                          cancel_button = False
     59                  )
     60                  if not delete_edc:
     61                          return
     62
     63          patient.emr.EDC = new_edc
     64
     65  #====================================================================
     66  from Gnumed.wxGladeWidgets import wxgEdcCalculatorDlg
     67
     68 -class cEdcCalculatorDlg(wxgEdcCalculatorDlg.wxgEdcCalculatorDlg):
     69
     70 -        def __init__(self, *args, **kwds):
     71                  wxgEdcCalculatorDlg.wxgEdcCalculatorDlg.__init__(self, *args, **kwds)
     72                  self.__calc = gmClinicalCalculator.cClinicalCalculator()
     73                  self.__init_ui()
     74          #----------------------------------------------------------------
     75 -        def __init_ui(self):
     76                  edc = self.__calc.get_EDC(lmp = None, nullipara = self._CHBOX_first_pregnancy.GetValue())
     77                  txt = _(
     78                          'Algorithm: %s\n'
     79                          '\n'
     80                          'Source: %s'
     81                  ) % (
     82                          edc.formula_name,
     83                          edc.formula_source
     84                  )
     85                  self._TCTRL_algo.SetValue(txt)
     86                  self._PRW_lmp.add_callback_on_selection(self._on_lmp_selected)
     87                  self._PRW_edc.add_callback_on_modified(self._on_edc_modified)
     88
     89                  self._PRW_lmp.SetFocus()
     90          #----------------------------------------------------------------
     91 -        def _on_lmp_selected(self, data):
     92                  self.__recalculate()
     93          #----------------------------------------------------------------
     94 -        def _on_edc_modified(self):
     95                  self._PRW_lmp.SetData(None)
     96                  self._TCTRL_details.SetValue('')
     97          #----------------------------------------------------------------
     98 -        def _on_first_pregnancy_toggled(self, event):
     99                  event.Skip()
    100                  self.__recalculate()
    101          #----------------------------------------------------------------
    102 -        def _on_lmp_picked_in_calendar(self, event):
    103                  event.Skip()
    104                  self._PRW_lmp.SetData(gmDateTime.wxDate2py_dt(wxDate = self._CALCTRL.Date))
    105                  self.__recalculate()
    106          #----------------------------------------------------------------
    107 -        def _on_save_button_pressed(self, event):
    108                  event.Skip()
    109                  if self.__calc.patient is None:
    110                          return False
    111                  if self._PRW_edc.is_valid_timestamp(empty_is_valid = True):
    112                          self.EndModal(wx.ID_SAVE)
    113                          return True
    114                  return False
    115          #----------------------------------------------------------------
    116 -        def __recalculate(self):
    117                  lmp = self._PRW_lmp.date
    118                  if lmp is None:
    119                          self._PRW_edc.SetData(None)
    120                          self._TCTRL_details.SetValue('')
    121                          return
    122
    123                  edc = self.__calc.get_EDC(lmp = lmp, nullipara = self._CHBOX_first_pregnancy.GetValue())
    124
    125                  self._PRW_edc.SetData(edc.numeric_value)
    126                  details = ''
    127                  now = gmDateTime.pydt_now_here()
    128                  # Beulah Hunter, 375 days (http://www.reference.com/motif/health/longest-human-pregnancy-on-record)
    129                  if (lmp < now) and (edc.numeric_value > (now + pydt.timedelta(days = 380))):
    130                          age = now - lmp
    131                          weeks, days = divmod(age.days, 7)
    132                          week = weeks
    133                          if days > 0:
    134                                  week = weeks + 1
    135                          month, tmp = divmod(age.days, 28)
    136                          if days > 0:
    137                                  month += 1
    138                          details += _(
    139                                  'Current age of pregnancy (%s):\n'
    140                                  ' day %s = %s weeks %s days = week %s = month %s\n\n'
    141                          ) % (
    142                                  gmDateTime.pydt_strftime(now, '%Y %b %d'),
    143                                  age.days,
    144                                  int(weeks),
    145                                  int(days),
    146                                  week,
    147                                  month
    148                          )
    149
    150                  details += edc.format (
    151                          left_margin = 1,
    152                          width = 50,
    153                          with_formula = False,
    154                          with_warnings = True,
    155                          with_variables = True,
    156                          with_sub_results = True,
    157                          return_list = False
    158                  )
    159                  self._TCTRL_details.SetValue(details)
    160          #----------------------------------------------------------------
    161          # properties
    162          #----------------------------------------------------------------
    163 -        def _get_EDC(self):
    164                  return self._PRW_edc.date
    165
    166 -        def _set_EDC(self, edc):
    167                  self._PRW_edc.SetData(edc)
    168                  self._PRW_lmp.SetData(None)
    169                  self._TCTRL_details.SetValue('')
    170
    171          EDC = property(_get_EDC, _set_EDC)
    172          #----------------------------------------------------------------
    173 -        def _set_patient(self, patient):
    174                  self.__calc.patient = patient
    175
    176          patient = property(lambda x:x, _set_patient)
    177
    178  #====================================================================
    179  #====================================================================
    180  # old code
    181  #====================================================================
    182  #====================================================================
    183  #====================================================================
    184  import math, zlib, random, string, os.path
    185
    186
    187  import wx.lib.rcsizer
    188
    189  """
    190  Calculates from LMP:
    191   - EDC
    192   - 18th week ultrasound scan
    193
    194  Naegele's rule is easy for manual calculation, but a pain to code
    195  Enter Haywood's rule ;-), human gestation is defined as 24192000 seconds.
    196  (Ian, can you please explain a bit more ?)
    197
    198  TODO:
    199  ideally, tool should query backend for parity, race, etc. for exact measurement
    200  """
    201
    202
    203  LMP_FIELD = 0
    204  US_FIELD = 1
    205
    206  ID_LMP = wx.NewId()
    207  ID_DUE = wx.NewId()
    208  ID_DAY = wx.NewId()
    209  ID_WEEK = wx.NewId()
    210  ID_MENU = wx.NewId()
    211
    212  GESTATION = 24192000
    213  WEEK = 604800
    214  DAY = 86400
    215  US18_52 = 10886400      # 18 weeks in seconds (for 18/52 Ultrasound)
    216
    217  #====================================================================
    218 -class cPregCalcFrame (wx.Frame):
    219          """
    220          The new pregnancy calculator.
    221          """
    222
    223          #TODO
    224          # IMPROVE removal of time from txt_lmp, txtedc, txtdue (?)
    225          #       see: def PurgeTime(self, date):
    226          #
    227          # explore idea of 'status bar' across bottom -- something to make
    228          #       clear how to use the calculator
    229          #
    230          # change the set-up of the RowColSizer(), shrink the size of the 'Weeks' & 'Days' fields
    231          #       make column on right side of preg. calc. more compact
    232          #
    233          # clean-up the names of the variables (some could be named more descriptively)
    234          #
    235          # add ability to type in LMP and Scan Date with keyboard (as opposed to only clicking on calendar)
    236          #       make movement between fields possible with 'tab' & 'enter'
    237
    238 -        def __init__ (self, parent):
    239                  myStyle = wx.MINIMIZE_BOX | wx.CAPTION | wx.ALIGN_CENTER | \
    240                          wx.ALIGN_CENTER_VERTICAL | wx.TAB_TRAVERSAL | wx.STAY_ON_TOP
    241                  wx.Frame.__init__(self, parent, -1, _("Pregnancy Calculator"), style=myStyle)
    242
    243                  # initialization of variables used in the control & calculation
    244                  self.xfer_cal_date_to=LMP_FIELD # controls which variable (LMP or Ultrasound) a calendar event changes
    245                                          # (if == 0): {calendar selection modifies LMP}
    246                                          # (if == 1): {calendar selection modifies Ultrasound Date}
    247
    248                  self.ustxt=wx.DateTime_Today()  # avoids problem - one would have if the user clicked on
    249                                                  # ultrasound date
    250                                                  # BONUS: makes the preg. calculator useful for EDC calcs given
    251                                                  #       a date and the gestation time
    252
    253                  # get icon
    254                  if __name__ == '__main__':
    255                          png_fname = os.path.join('..', 'bitmaps', 'preg_calculator.png')
    256                  else:
    257                          from Gnumed.pycommon import gmGuiBroker
    258                          gb = gmGuiBroker.GuiBroker()
    259                          png_fname = os.path.join(gb['gnumed_dir'], 'bitmaps', 'preg_calculator.png')
    260                  icon = wx.Icon()
    261                  icon.LoadFile(png_fname, wx.BITMAP_TYPE_PNG)
    262                  self.SetIcon(icon)
    263
    264                  szr_rc = wx.lib.rcsizer.RowColSizer()
    265
    266                  #------------------------------
    267                  # sizer holding the 'LMP' stuff
    268                  #------------------------------
    269                  label = wx.StaticText(self,-1,_("LMP"),size = (50,20))  #label Lmp
    270                  label.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    271                  label.SetForegroundColour(wx.Colour(0,0,0))
    272
    273                  self.txt_lmp = wx.TextCtrl(self,-1,"",size=(100,20))    # text for lmp
    274                  self.txt_lmp.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    275                  self.txt_lmp.SetToolTip(wx.ToolTip(_("Click on calendar to enter the last menstrual period date")))
    276                  tiplmp=self.txt_lmp.GetToolTip()
    277
    278                  szr_row1 = wx.BoxSizer(wx.HORIZONTAL)
    279                  szr_row1.Add(self.txt_lmp,1,wx.EXPAND|wx.ALL,2)
    280                  wx.EVT_SET_FOCUS(self.txt_lmp, self.OnSetFocus_lmp)
    281
    282                  szr_lmp = wx.BoxSizer(wx.HORIZONTAL)
    283                  szr_lmp.Add(label, 1, 0, 0)
    284                  szr_lmp.Add((10,1),0,0)
    285                  szr_rc.Add(szr_lmp, flag=wx.EXPAND, row=0, col=1)
    286                  szr_rc.Add(szr_row1, flag=wx.EXPAND, row=0, col=2, colspan=5)
    287                  #------------------------------
    288                  # sizer holding the 'Gest.' stuff
    289                  #------------------------------
    290                  label = wx.StaticText(self,-1,_("Gest."),size = (50,20))
    291                  label.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    292                  label.SetForegroundColour(wx.Colour(0,0,0))
    293
    294                  self.txtgest = wx.TextCtrl(self,-1,"",size=(100,20))
    295                  self.txtgest.Enable(False)
    296                  self.txtgest.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    297                  self.txtgest_szr  = wx.BoxSizer(wx.HORIZONTAL)
    298                  self.txtgest_szr.Add(self.txtgest,1,wx.EXPAND|wx.ALL,2)
    299
    300                  szr_gest = wx.BoxSizer(wx.HORIZONTAL)
    301                  szr_gest.Add(label, 1, 0, 0)
    302                  szr_gest.Add((10,1),0,0)
    303                  szr_rc.Add(szr_gest, flag=wx.EXPAND, row=1, col=1)
    304                  szr_rc.Add(self.txtgest_szr, flag=wx.EXPAND, row=1, col=2, colspan=5)
    305
    306                  #------------------------------
    307                  # sizer holding the 'EDC' stuff
    308                  #------------------------------
    309                  label = wx.StaticText(self,-1,_("EDC"),size = (50,20))
    310                  label.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    311                  label.SetForegroundColour(wx.Colour(0,0,0))
    312
    313                  self.txtedc = wx.TextCtrl(self,-1,"",size=(100,20))
    314                  self.txtedc.Enable(False)
    315                  self.txtedc.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    316                  szr_txtedc = wx.BoxSizer(wx.HORIZONTAL)
    317                  szr_txtedc.Add(self.txtedc,1,wx.EXPAND|wx.ALL,2)
    318                  szr_edc = wx.BoxSizer(wx.HORIZONTAL)
    319                  szr_edc.Add(label,1,0,0)
    320                  szr_edc.Add((10,1),0,0)
    321                  szr_rc.Add(szr_edc, flag=wx.EXPAND, row=2, col=1)
    322                  szr_rc.Add(szr_txtedc, flag=wx.EXPAND, row=2, col=2, colspan=5)
    323
    324                  #------------------------------
    325                  # "Ultrasound Scan" label
    326                  #------------------------------
    327                  us_label = wx.StaticText(self,-1,_("18 Week Ultrasound Scan"),size = (200,20))
    328                  us_label.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.BOLD,False,''))
    329                  us_label.SetForegroundColour(wx.Colour(50,50,204))
    330                  szr_backgrnd_18WkScanDue = wx.BoxSizer(wx.VERTICAL)
    331                  szr_backgrnd_18WkScanDue.Add((1,3), 0)
    332                  szr_backgrnd_18WkScanDue.Add(us_label,1,wx.EXPAND,1)
    333                  szr_rc.Add(szr_backgrnd_18WkScanDue, flag=wx.ALIGN_CENTRE_HORIZONTAL, row=3, col=2, colspan=5)
    334                  #------------------------------
    335                  # sizer holding the 'Due' stuff
    336                  #------------------------------
    337                  label = wx.StaticText(self,-1,_("Due"),size = (100,20))
    338                  label.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    339                  label.SetForegroundColour(wx.Colour(0,0,0))
    340
    341                  self.txtdue = wx.TextCtrl(self,-1,"",size=(100,20))
    342                  self.txtdue.Enable(False)
    343                  self.txtdue.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    344                  self.szr_txtdue  = wx.BoxSizer(wx.HORIZONTAL)
    345                  self.szr_txtdue.Add(self.txtdue,1,wx.EXPAND|wx.ALL,2)
    346                  szr_due = wx.BoxSizer(wx.HORIZONTAL)
    347                  szr_due.Add(label,1,0,0)
    348                  szr_due.Add((10,1),0,0)
    349                  szr_rc.Add(szr_due, flag=wx.EXPAND, row=4, col=1)
    350                  szr_rc.Add(self.szr_txtdue, flag=wx.EXPAND, row=4, col=2, colspan=5)
    351
    352                  #------------------------------
    353                  # "Ultrasound Scan - Revised EDC" label
    354                  #------------------------------
    355                  rev_edc_label = wx.StaticText(self,-1,_("Ultrasound Scan - Revised EDC"),size = (300,20))
    356                  rev_edc_label.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.BOLD,False,''))
    357                  rev_edc_label.SetForegroundColour(wx.Colour(50,50,204))
    358                  szr_backgrnd_RevEDCLabel = wx.BoxSizer(wx.VERTICAL)
    359                  szr_backgrnd_RevEDCLabel.Add((1,3), 0)
    360                  szr_backgrnd_RevEDCLabel.Add(rev_edc_label,1,wx.EXPAND,1)
    361                  szr_rc.Add(szr_backgrnd_RevEDCLabel, flag=wx.ALIGN_CENTRE_HORIZONTAL, row=5, col=2, colspan=5)
    362
    363                  #------------------------------
    364                  # sizer holding the 'newedc' stuff
    365                  #------------------------------
    366                  label1 = wx.StaticText(self,-1,_("Scan Date"),size = (25,20))
    367                  label1.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    368                  label1.SetForegroundColour(wx.Colour(0,0,0))
    369                  self.txtdate = wx.TextCtrl(self,-1,"",size=(25,20))
    370                  self.txtdate.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    371                  self.txtdate.SetToolTip(wx.ToolTip(_("Click on this field and then the ultrasound scan date on the calendar")))
    372                  tipdue=self.txtdate.GetToolTip()
    373                  wx.ToolTip_Enable(1)
    374                  self.szr_txtdate  = wx.BoxSizer(wx.HORIZONTAL)
    375                  self.szr_txtdate.Add(self.txtdate,1,wx.EXPAND|wx.ALL,2)
    376                  wx.EVT_SET_FOCUS(self.txtdate, self.OnSetFocus_USDate)
    377
    378                  szr_label1 = wx.BoxSizer(wx.HORIZONTAL)
    379                  szr_label1.Add(label1,1,0,0)
    380                  szr_label1.Add((10,1),0,0)
    381                  szr_rc.Add(szr_label1, flag=wx.EXPAND, row=6, col=1)
    382                  szr_rc.Add(self.szr_txtdate, flag=wx.EXPAND, row=6, col=2, colspan=5)
    383
    384                  #------------------------------
    385
    386                  label2 = wx.StaticText(self,-1,_("Weeks"),size = (25,20))
    387                  label2.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    388                  label2.SetForegroundColour(wx.Colour(0,0,0))
    389                  self.txtweeks = wx.SpinCtrl (self, -1, value = "0", min = 0, max = 42)
    390                  wx.EVT_SPINCTRL (self.txtweeks ,self.txtweeks.GetId(), self.EvtText_calcnewedc)
    391                  self.txtweeks.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    392                  self.szr_txtweeks  = wx.BoxSizer(wx.HORIZONTAL)
    393                  self.szr_txtweeks.Add(self.txtweeks,1,wx.EXPAND|wx.ALL,2)
    394
    395                  label3 = wx.StaticText(self,-1,_("Days"),size = (25,20))
    396                  label3.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    397                  label3.SetForegroundColour(wx.Colour(0,0,0))
    398                  self.txtdays = wx.SpinCtrl (self, -1, value = "0", min = 0, max = 6)
    399                  wx.EVT_SPINCTRL (self.txtdays ,self.txtdays.GetId(), self.EvtText_calcnewedc)
    400                  self.txtdays.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    401                  self.szr_txtdays  = wx.BoxSizer(wx.HORIZONTAL)
    402                  self.szr_txtdays.Add(self.txtdays,1,wx.EXPAND|wx.ALL,2)
    403
    404                  szr_label2 = wx.BoxSizer(wx.HORIZONTAL)
    405                  szr_label2.Add(label2,1,wx.ALIGN_CENTRE_VERTICAL,0)
    406                  szr_label2.Add((10,1),0,0)
    407                  szr_label3 = wx.BoxSizer(wx.HORIZONTAL)
    408                  szr_label3.Add((10,1),0,0)
    409                  szr_label3.Add(label3,1,wx.ALIGN_CENTRE_VERTICAL,0)
    410                  szr_label3.Add((10,1),0,0)
    411                  szr_rc.Add(szr_label2, flag=wx.EXPAND, row=7, col=1)
    412                  szr_rc.Add(self.szr_txtweeks, flag=wx.EXPAND, row=7, col=2, colspan=2)
    413                  szr_rc.Add(szr_label3, flag=wx.EXPAND, row=7, col=4)
    414                  szr_rc.Add(self.szr_txtdays, flag=wx.EXPAND, row=7, col=5, colspan=2)
    415
    416                  #------------------------------
    417                  # sizer holding the new (or revised) 'EDC' stuff
    418                  #------------------------------
    419                  label = wx.StaticText(self,-1,_("Rev EDC"),size = (100,20))
    420                  label.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    421                  label.SetForegroundColour(wx.Colour(0,0,0))
    422
    423                  self.txtnewedc = wx.TextCtrl(self,-1,"",size=(100,20))
    424                  self.txtnewedc.Enable(False)
    425                  self.txtnewedc.SetFont(wx.Font(12,wx.SWISS,wx.NORMAL,wx.NORMAL,False,''))
    426                  self.szr_txtnewedc  = wx.BoxSizer(wx.HORIZONTAL)
    427                  self.szr_txtnewedc.Add(self.txtnewedc,1,wx.EXPAND|wx.ALL,2)
    428                  szr_label=wx.BoxSizer(wx.HORIZONTAL)
    429                  szr_label.Add(label,1,0,0)
    430                  szr_label.Add((10,1),0,0)
    431                  szr_rc.Add(szr_label, flag=wx.EXPAND, row=8, col=1)
    432                  szr_rc.Add(self.szr_txtnewedc, flag=wx.EXPAND, row=8, col=2, colspan=5)
    433                  self.btnPrint = wx.Button(self,1011,_('&Print'))
    434                  self.btnSave = wx.Button(self,1011,_('&Save'))
    435                  szr_buttons = wx.BoxSizer(wx.HORIZONTAL)
    436                  szr_buttons.Add(self.btnPrint,0,wx.EXPAND)
    437                  szr_buttons.Add(self.btnSave,0,wx.EXPAND)
    438                  szr_rc.Add(szr_buttons, flag=wx.EXPAND,row=9, col=3, colspan=4)
    439                  #------------------------------
    440                  # Sizer holding stuff on the right
    441                  #------------------------------
    442                  szr_main_rt = wx.BoxSizer(wx.VERTICAL)
    443                  szr_main_rt.Add(szr_rc)
    444                  wx.EVT_BUTTON(self,1010,self.EvtReset)
    445                  wx.EVT_BUTTON(self,1011,self.EvtPrint)
    446                  wx.EVT_BUTTON(self,1012,self.EvtSave)
    447                  #------------------------------
    448                  # Add calendar (stuff on the left)
    449                  #------------------------------
    450                  self.lmp_cal = wx.calendar.CalendarCtrl (self, ID_LMP,style = wx.RAISED_BORDER)
    451                  wx.calendar.EVT_CALENDAR_SEL_CHANGED(self.lmp_cal, ID_LMP, self.OnCalcByLMP)
    452
    453                  szr_main_lf = wx.BoxSizer(wx.VERTICAL)
    454                  szr_main_lf.Add(self.lmp_cal,0,wx.ALIGN_CENTRE_HORIZONTAL)
    455                  btn_reset = wx.Button(self, 1010, _('&Reset'))
    456                  #szr_main_lf.Add(5,0,5)
    457                  szr_main_lf.Add(btn_reset,0,wx.EXPAND)
    458
    459                  #--------------------------------------
    460                  # Super-sizer holds all the stuff above
    461                  #--------------------------------------
    462                  szr_main_top= wx.BoxSizer(wx.HORIZONTAL)
    463                  szr_main_top.Add(szr_main_lf,0,0)
    464                  szr_main_top.Add((15,0),0,0)
    465                  szr_main_top.Add(szr_main_rt,0,0)
    466                  #szr_main_top.Add(15,1,0,0)
    467
    468                  #------------------------------
    469                  # Put everything together in one big sizer
    470                  #------------------------------
    471                  szr_main= wx.BoxSizer(wx.HORIZONTAL)
    472                  szr_main.Add(szr_main_top,1,wx.EXPAND|wx.ALL,10)
    473                  self.SetSizer (szr_main)
    474                  self.SetAutoLayout (1)
    475                  szr_main.Fit (self)
    476
    477                  wx.EVT_CLOSE (self, self.OnClose )
    478
    479          #-----------------------------------------
    480 -        def OnCalcByLMP (self, event):
    481
    482                  if(self.xfer_cal_date_to==LMP_FIELD):
    483                          # we do this the "UNIX Way" -- all dates are converted into seconds
    484                          # since midnight 1 Jan, 1970.
    485                          # .GetDate().GetTicks() returns time at 5AM.  The -18000 second
    486                          #       correction adjusts LMP to 12AM ??? NOT NEEDED
    487                          #       is it possible there is a BUG in the wxPython
    488                          #       Day Light Savings/Standard Time Calc?
    489
    490                          #LMP = self.lmp_cal.GetDate ().GetTicks () - 18000      # Standard Time Fix (?)
    491                          self.lmp = self.lmp_cal.GetDate ().GetTicks ()          # Correct for Day Light Saving Time
    492                          today = wx.DateTime_Today().GetTicks()
    493                          due = self.lmp + GESTATION
    494                          gest = today - self.lmp
    495                          self.ultrasound18_52 = self.lmp + US18_52
    496
    497                          # -----------------
    498                          # FIXME: use gmDateInput in gmDateTimeInput.py
    499                          lmp_txt = wx.DateTime()                 # FIXME? - change format of date (?)
    500                          lmp_txt.SetTimeT(self.lmp)
    501                          self.txt_lmp.SetValue(self.PurgeTime(lmp_txt))
    502
    503                          # -----------------
    504                          gest_week = gest / WEEK
    505                          gest_day = (gest % WEEK) / DAY
    506                          if(gest_day==1):
    507                                  days_label=_('day')
    508                          else:
    509                                  days_label=_('days')
    510                          if(gest_week==1):
    511                                  weeks_label=_('week')
    512                          else:
    513                                  weeks_label=_('weeks')
    514  #                       txtgest_str = "%s %s, %s %s" % (gest_week, weeks_label, gest_day, days_label)
    515                          txtgest_str=str(gest_week)+" "+weeks_label+", "+str(gest_day)+" "+days_label
    516                          self.txtgest.SetValue(txtgest_str)
    517
    518                          # -----------------
    519                          edctxt = wx.DateTime()
    520                          edctxt.SetTimeT(due)
    521                          self.txtedc.SetValue(self.PurgeTime(edctxt))
    522
    523                          # -----------------
    524                          self.ustxt = wx.DateTime()
    525                          self.ustxt.SetTimeT(self.ultrasound18_52)
    526                          self.txtdue.SetValue(self.PurgeTime(self.ustxt))
    527
    528                  else:
    529                          # set Ultrasound Date
    530                          self.usdate = self.lmp_cal.GetDate ().GetTicks ()
    531                          usdatetxt = wx.DateTime()       # FIXME? - change format of date
    532                          usdatetxt.SetTimeT(self.usdate)
    533                          self.txtdate.SetValue(self.PurgeTime(usdatetxt))
    534
    535                          # recalculate 'Rev EDC' if Ultrasound Scan Date is changed
    536                          if( self.txtnewedc.GetValue() !=""):
    537                                  self.EvtText_calcnewedc(self)
    538
    539          #-----------------------------------------
    540 -        def EvtText_calcnewedc (self, event):
    541                  try:
    542                          weeks=self.txtweeks.GetValue()
    543                          days=self.txtdays.GetValue()
    544
    545                          # get date of ultrasound
    546                          newedc=self.usdate+GESTATION-WEEK*weeks-DAY*days
    547
    548                          wx.D=wx.DateTime()
    549                          wx.D.SetTimeT(newedc)
    550                          self.txtnewedc.SetValue(self.PurgeTime(wx.D))
    551                  except Exception:
    552                          pass    # error handling - FIXME is 'try' statement necessary (?)
    553
    554          #-----------------------------------------
    555 -        def EvtReset(self, event):
    556                  # reset variables
    557                  self.txt_lmp.SetValue("")
    558                  self.txtgest.SetValue("")
    559                  self.txtedc.SetValue("")
    560                  self.txtdue.SetValue("")
    561
    562                  self.txtdate.SetValue("")
    563                  self.ustxt=wx.DateTime_Today()
    564
    565                  self.txtweeks.SetValue(0)                       # FIXME - MAKE IT RESET TO BLANK?
    566                  self.txtdays.SetValue(0)
    567                  self.txtnewedc.SetValue("")
    568
    569                  self.xfer_cal_date_to=LMP_FIELD
    570                  self.lmp_cal.SetDate(wx.DateTime_Today())       # reset Calendar to current date
    571
    572          #-----------------------------------------
    573 -        def EvtPrint(self, event):
    574                  pass                                    # TODO
    575          #-----------------------------------------
    576 -        def EvtSave(self, event):
    577                  pass                                    # TODO
    578          #-----------------------------------------
    579          #def EvtHandout(self, event):
    580          #       pass                                    # TODO
    581          #-------------------------------------------
    582 -        def OnClose (self, event):
    583                  self.Destroy ()
    584
    585          #-------------------------------------------
    586 -        def PurgeTime(self, date):                      # a not so elegant way of removing the time
    587                  time_loc=string.find(str(date),":00:00")
    588                  date_str=str(date)
    589                  return date_str[:(time_loc-3)]
    590
    591          #-------------------------------------------
    592 -        def OnSetFocus_lmp (self, event):
    593                  self.xfer_cal_date_to=LMP_FIELD
    594                  event.Skip()                            # required so wxTextCtrl box is selected
    595
    596          #-------------------------------------------
    597 -        def OnSetFocus_USDate (self, event):
    598                  self.lmp_cal.SetDate(self.ustxt)        # flip calendar to 18/52 date
    599                  self.xfer_cal_date_to=US_FIELD
    600                  event.Skip()
    601
    602
    603
    604  #====================================================================
    605  # Main
    606  #====================================================================
    607  if __name__ == '__main__':
    608          # set up dummy app
    609 -        class TestApp (wx.App):
    610 -                def OnInit (self):
    611                          frame = cPregCalcFrame(None)
    612                          frame.Show(1)
    613                          return 1
    614          #---------------------
    615          import gettext
    616          _ = gettext.gettext
    617          gettext.textdomain ('gnumed')
    618          app = TestApp()
    619          app.MainLoop()
    620
    621  #=====================================================================
    622