Package Gnumed :: Package wxpython :: Package patient :: Module gmGP_TabbedLists
[frames] | no frames]

Source Code for Module Gnumed.wxpython.patient.gmGP_TabbedLists

  1  # -*- coding: utf-8 -*- 
  2  ############################################################################# 
  3  # 
  4  # gmMedGPTabbedLists :convenience widget that displays a notebook widget 
  5  #                     notebook pages contain lists of information needed in 
  6  #                     in everyday general practice consultation 
  7  #                     eg patients scripts, referral letters, inbox 
  8  #                     recalls, measurements etc 
  9  # Description of Gui: the background panel contains: 
 10  #                     - wxWindow as a shadow behind the wxNotebook 
 11  #                     - a wxNotebook wigit to hold the lists 
 12  #                     - lists as needed 
 13  #                      
 14  # --------------------------------------------------------------------------- 
 15  # 
 16  # @author: Dr. Richard Terry 
 17  # @copyright: author 
 18  # @license: GPL v2 or later (details at http://www.gnu.org) 
 19  # @dependencies: 
 20  # @change log: 
 21  #       25.05.2002 rterry first draft, untested 
 22  # 
 23  # @TODO: Almost everything 
 24  #        Why arn't the lists showing on the tabs  
 25  #        Allow user configuration of which pages to display 
 26  #        Make icons on tabs user configurable 
 27  #        ?can cursor tool tip change when hovered over bitmap on a tab? 
 28  #        remove non-used imports from below this text 
 29  ############################################################################ 
 30  # $Source: /home/ncq/Projekte/cvs2git/vcs-mirror/gnumed/gnumed/client/wxpython/patient/gmGP_TabbedLists.py,v $ 
 31  # $Id: gmGP_TabbedLists.py,v 1.21 2008-04-13 14:39:49 ncq Exp $ 
 32  __version__ = "$Revision: 1.21 $" 
 33   
 34  import wx 
 35   
 36  import keyword 
 37  import time 
 38  import images #bitmaps for column headers of lists 
 39  import gmPlugin, gmShadow 
 40  #from wxPython.lib.mixins.listctrl import wxColumnSorterMixin 
 41  import zlib, cPickle 
 42   
 43   
 44  scriptdata = { 
 45  1 : ("Adalat Oris", "30mg","1 mane","21/01/2002", "Hypertension","30 Rpt5","29/02/2000"), 
 46  2 : ("Nitrolingual Spray","", "1 spray when needed","24/08/2001", "Angina","1 Rpt2","01/06/2001"), 
 47  3 : ("Losec", "20mg","1 mane", "21/01/2002","Reflux Oesophagitis","30 Rpt5","16/11/2001"), 
 48  4 : ("Zoloft", "50mg","1 mane", "24/04/2002","Depression","30 Rpt0","24/04/2002"), 
 49  } 
 50   
 51  #===================================================================== 
52 -class Notebook(wxNotebook):
53 """ sets tooltips for notebook tab images """ 54 55 tip_shown=0
56 - def __init__(self, parent, id):
57 wxNotebook.__init__(self,parent,id) 58 59 # tool tips activated in... 60 self.tip_area1=wxRect(2,2,30,30) 61 self.tip_area2=wxRect(32,2,31,30) 62 self.tip_area3=wxRect(63,2,31,30) 63 self.tip_area4=wxRect(94,2,31,30) 64 self.tip_area5=wxRect(125,2,31,30) 65 self.tip_area6=wxRect(156,2,31,30) 66 67 EVT_MOTION(self, self.OnMouseMotion) 68 EVT_LEFT_DOWN(self, self.OnLeftDown)
69
70 - def OnMouseMotion(self, evt):
71 pt_local = self.GetPosition() 72 #print 'x_local', pt_local.x, 'y_local', pt_local.y #test 73 pt_global = self.ClientToScreen(pt_local) 74 #print 'x_global', pt_global.x, 'y_global', pt_global.y #test 75 76 x, y = evt.GetPosition() # clean-up --- pt_local = x,y (?) 77 if(self.tip_area1.Inside(wxPoint(x,y))): 78 if(self.tip_shown!=1): 79 tipwin1=wxTipWindow(self, _('Prescriptions')) 80 tipwin1.SetBoundingRect(wxRect(1+pt_global.x,1+pt_global.y,30,30)) 81 pt=wxPoint((1+pt_global.x+4+5), (1+pt_global.y+32+4)) 82 tipwin1.Move(pt) # position tool tip 83 self.tip_shown=1 # avoid tool tip flashing 84 85 elif(self.tip_area2.Inside(wxPoint(x,y))): 86 if(self.tip_shown!=2): 87 tipwin2=wxTipWindow(self, _('Requests')) 88 tipwin2.SetBoundingRect(wxRect(32+pt_global.x,1+pt_global.y,31,30)) 89 pt=wxPoint((32+pt_global.x+4+5), (1+pt_global.y+32+4)) 90 tipwin2.Move(pt) 91 self.tip_shown=2 92 93 elif(self.tip_area3.Inside(wxPoint(x,y))): 94 if(self.tip_shown!=3): 95 tipwin3=wxTipWindow(self, _('Measurements')) 96 tipwin3.SetBoundingRect(wxRect(63+pt_global.x,1+pt_global.y,31,30)) 97 pt=wxPoint((63+pt_global.x+4+5), (1+pt_global.y+32+4)) 98 tipwin3.Move(pt) 99 self.tip_shown=3 100 101 elif(self.tip_area4.Inside(wxPoint(x,y))): 102 if(self.tip_shown!=4): 103 tipwin4=wxTipWindow(self, _('Referrals')) 104 tipwin4.SetBoundingRect(wxRect(94+pt_global.x,1+pt_global.y,31,30)) 105 pt=wxPoint((94+pt_global.x+4+5), (1+pt_global.y+32+4)) 106 tipwin4.Move(pt) 107 self.tip_shown=4 108 109 elif(self.tip_area5.Inside(wxPoint(x,y))): 110 if(self.tip_shown!=5): 111 tipwin5=wxTipWindow(self, _('Recalls and Reviews')) 112 tipwin5.SetBoundingRect(wxRect(125+pt_global.x,1+pt_global.y,31,30)) 113 pt=wxPoint((125+pt_global.x+4+5), (1+pt_global.y+32+4)) 114 tipwin5.Move(pt) 115 self.tip_shown=5 116 117 elif(self.tip_area6.Inside(wxPoint(x,y))): 118 if(self.tip_shown!=6): 119 tipwin6=wxTipWindow(self, _('Inbox')) 120 tipwin6.SetBoundingRect(wxRect(156+pt_global.x,1+pt_global.y,31,30)) 121 pt=wxPoint((156+pt_global.x+4+5), (1+pt_global.y+32+4)) 122 tipwin6.Move(pt) 123 self.tip_shown=6 124 else: 125 self.tip_shown=0
126
127 - def OnLeftDown(self,evt): # have fix clicking problem - make tab select a single click
128 pass
129 #self.tipwin1.destroy() # ??? 130
131 -class TabbedLists(wxPanel): #, wxColumnSorterMixin):
132 """ a panel to hold the tabbed list """ 133 __icons_script = {"""icon_Rx_symbol""": 'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u=\x85d\x05e\x03 p\xb3\x00\ 134 \xf3#@|\x0b\x03\x10\x04\xf3\x15\x80|\xbf\xfc\xbcT(\x07\x15\xe0\x15\xd4\x83\ 135 \x00t\xc1\x08 \x80\x8a"\t\xc2I\xb2\x04\xc1 "\x82R\x8b\x80\x08UP\x01b,\xdc\ 136 \x9b\x10+\x14\xc0\xa6\xa2\xf9\x1d\xa8\x0eI;\x02DD\xe0\x0c%=\x00D|Hk'} 137 138 __icons_requests = {"""icon_blood_sample""": "x\xdau\x8f\xbd\n\xc3 \x10\x80\xf7<\xc5A\x94\x14\x04Qh\x89c0\xe0\x98\x1b\xb2\ 139 \xb8\x96\xd2\xad\xf4\xfa\xfeS\x8d?\xe0\x05r\xdb\xf7\xdd\xff\xed\xf3\xb3\xc3>\ 140 \xd9;\xd8\x07X\x03v\x1a\x9e\xfb$\xe1\x05cp&Ef<\xd8;\xbfz\x97y<xv\xf3Z\xf3K\ 141 \xa9\x0f\x8d!\xf1F\xdfw\x06\xdd\x86\x85\xd2\x1cK\xb31sa\xd5\x9ak^\xb4|\x1dFm\ 142 Y\xad\x07\x16'\xa5\xf5YE\x9d\x1cS\x84xR\x84JE\xa6R\r\x12\x1bO\xb8(b\x1b\x93\ 143 \xc1\x91\x1dABJ\xc1\xee\xeaLU\xbd\xa9\xaa7M\tq\xf9\xe3\xb5\xd2\x7fZ\x8fVi"} 144 145 __icons_measurements = {"""icon_Set_Square""": 'x\xda\xd3\xc8)0\xe4\nV74S\x00"S\x05Cu\xae\xc4`\xf5|\x85d\x05\xa7\x9c\xc4\ 146 \xe4l0O\x0f\xc8S6\xb70w60\x00\xf3#@|7\x0b7\x18_\x01\xc8\xf7\xcb\xcfK\x05s\ 147 \xfca\x8a\xcd-\xa0\x92\n\nz\x11\x11z\nP\x80,\x98\x8fEP/\x9f\xb0\xca|4\x00qe\ 148 \x04*\x84\n\xa2\x02\xdc\x82\xfe@\x90\xaf\xa7\x97\xef\x0f\x05\xd4p\'\xf5U\xea\ 149 \x01\x00\xd2 _\x1b'} 150 151 __icons_referrals = {"""icon_writing_pen""": "x\xda\x8d\x901\x0b\xc3 \x10F\xf7\xfc\n\xa1\x83\x85\xc0\x87Y\xa2\xb3B\xc6:d\ 152 \xb95\x84N\r\xb5\xff\x7f\xaa9-\xd4K\xa1\x11\x11\xde\xbb\xe7\xa0\xd7\xed5t\ 153 \xb3\x1eF\x95w>t\xb7\xcc\x1ajU~[\xd6\x07S\x9f\xe9\xe2\x9d\x0f\xde1\xc7\x9d'7\ 154 \x05c\x98U\xe6[z\xde\x19\xd2>\xb4\xce\x98:\xa4\xc26XW\xe3v\x9d\x93\x00\x0e\ 155 \x92\x90\x12\xa4D\x04HHB\xa4\xc3u\xc4\x1e$d\t\x85,a+k\xd8\xca\x1aJ\xc9\xa1\ 156 \x90\x80\xfa!\xbf\xde\x8e\xcf\xfa\xf3Kx\x03\x0b\xf8P\xa7" 157 158 , """icon_outgoing_letter""": "x\xda]\xcd;\x0e\x830\x10\x04\xd0\x9eSXJ\xe1T+\\$r\x9dH.\xe3\x82f[\x84R\x05e\ 159 r\xff*\xbb\xb6\xf1\x87\x11B\xccc\x0c\xd7\xfd\xe7\xa6\xc5\xba\xbb\x91\xebf\ 160 \x9c\x9d\xd6\xc5\xc2l\xe6\xb1\xaf\xdb'5\x92v\xf1\xb3&u#\xfd\x85\xef;\x15\xd6\ 161 \x97\xc1\x87g\xf0\xa9G\xed\xf3\\\xbb\xc9!.\x0f\x1d\x12\x1d\xda\x90\xa8jE\xa2\ 162 \xa6m\t!\x9c\x96`\xddaX\x82\x13f-(\x96Q\x94\x0b\x02\xb1`\x04*\xb2*\xabq\x87\ 163 \x8c\x1c\x1e1-G\xcc6\x1eG\x8c\xf2Q\xb9\xf5?\xeas \x0fQ\xa4?:Rj{"} 164 165 __icons_recalls = {"""icon_talking_head""": 'x\xda\x8d\x8f1\x0b\xc3 \x10\x85\xf7\xfc\x8a\x83\x0e\x16\x041K\xe3\xac\xe0\ 166 \xd8\x0cYn\r\xa1SC\xed\xff\x9fzw\x1a\x8b\xa6C\x1f"\xbc\xef\xde\xdd\xe9u\x7f\ 167 \x8f\xc3\xa2\xc6\x1b\xd0\xa1K\r\xeb\xa2\x006\xf0\xfb\xba=\xc5%r\x17\xef|\xf0\ 168 N\xbcf?\xb9)X+~foI1\xd7\r\xf9{z=\xc4 \x17\xa3\x8b\xa1\x14\xe1\x90\xc9ja\xc1=\ 169 \x84\xbf b:Ad\xd8\xcd$\x86\xd0mg\x04-\xe4\x18\xcem;\x16\xfd\x86\t\xfa\xf6\ 170 \xfc"\xad\xeb\xa2\xda\xad\xcfI\x8a\xd5$Oc\x81\x04\xbf\x8b\x8e\x8fS\x90\xa1\ 171 \xf9\x00[x_\x8e'} 172 173 __icons_inbox = {"""icon_inbox""": "x\xda\x85\xd01\x0e\xc20\x0c\x05\xd0\xbd\xa7\x88\xc4\x10&+\x19\x80\xcc e\xac\ 174 \x87.^\xab\x8a\x89\ns\xff\t\xc7Nh2\xf1UU\xfdOv#\xe5\xbc\x7f\xe2\xb4\xf8xu\ 175 \xf2\\\\\xf4\xd3\xbaxv\x9b\xbb\xef\xeb\xf6\xd2\xe6\xa4\xcd\xfc~jA)\xa7\x10\ 176 \xf2#'\xedTzN\xbf\x0e\xa5\xdfR\x90\xd4\xe5\x12\x00 \xfb\xfa\x83,\xc84\"S\x99\ 177 4m\xc8\xa4hZQ\xe7\xa0\xcd\x1a\xca\x9c)\x11\x8aVd\xac\xeb\xc8\x07\x92\xaa\xce\ 178 uHl\xa1\x11\xa9dD\xb3q\x9d\x11\xe5\xa7\xf2\xea\x0f\xea\xd3\x90\x86\xf4\xb7tD\ 179 \x10\xbe\xb8\xbej\xdf"} 180
181 - def __init__(self, parent,id):
182 wxPanel.__init__(self, parent, id) 183 self.SetAutoLayout(True) 184 sizer = wxBoxSizer(wxHORIZONTAL) 185 self.SetBackgroundColour(wxColour(222,222,222)) 186 #----------------------------------------------------- 187 #create imagelist for use by the lists in the notebook 188 #e.g the icons to sort the columns up and down 189 #----------------------------------------------------- 190 self.ListsImageList= wxImageList(16,16) 191 self.small_arrow_up = self.ListsImageList.Add(images.getSmallUpArrowBitmap()) 192 self.small_arrow_down = self.ListsImageList.Add(images.getSmallDnArrowBitmap()) 193 #------------------------------------------------------------------------ 194 #---------------------------------------------------------------------- 195 #Add a notebook control to hold the lists of things eg scripts, recalls 196 #---------------------------------------------------------------------- 197 #self.notebook1 = Notebook(self, -1, wxDefaultPosition, wxDefaultSize, style = 0) 198 self.notebook1 = Notebook(self, -1) 199 #------------------------------------------------------------------------- 200 #Associate an imagelist with the notebook and add images to the image list 201 #------------------------------------------------------------------------- 202 tabimage_Script = tabimage_Requests = tabimage_Requests = tabimage_Requests = tabimage_Requests = tabimage_Requests = -1 203 self.notebook1.il = wxImageList(16, 16) 204 tabimage_Script = self.notebook1.il.Add(self.getBitmap(self.__icons_script[_("""icon_Rx_symbol""")])) 205 tabimage_Requests = self.notebook1.il.Add( self.getBitmap(self.__icons_requests[_("""icon_blood_sample""")])) 206 tabimage_Measurements = self.notebook1.il.Add( self.getBitmap(self.__icons_measurements[_("""icon_Set_Square""")])) 207 tabimage_Referrals = self.notebook1.il.Add( self.getBitmap(self.__icons_referrals[_("""icon_writing_pen""")])) 208 tabimage_Recalls = self.notebook1.il.Add(self.getBitmap(self.__icons_recalls[_("""icon_talking_head""")])) 209 tabimage_Inbox = self.notebook1.il.Add(self.getBitmap(self.__icons_inbox[_("""icon_inbox""")])) 210 self.notebook1.SetImageList(self.notebook1.il) 211 szr_notebook = wxNotebookSizer(self.notebook1) 212 #---------------------------------------------------------------------------------- 213 #now create the lists that will sit on the notebook pages, and add them to the page 214 #---------------------------------------------------------------------------------- 215 szr_script_page= wxBoxSizer(wxVERTICAL) 216 ListScript_ID = wxNewId() #can use wxLC_VRULES to put faint cols in list 217 self.List_Script = wxListCtrl(self.notebook1, ListScript_ID, wxDefaultPosition, wxDefaultSize,wxLC_REPORT|wxSUNKEN_BORDER) 218 szr_script_page.Add(self.List_Script,100,wxEXPAND) 219 self.List_Script.SetForegroundColour(wxColor(131,129,131)) 220 self.List_Requests = wxListCtrl(self.notebook1, -1, wxDefaultPosition, wxDefaultSize,wxSUNKEN_BORDER) 221 self.List_Measurements = wxListCtrl(self.notebook1, -1, wxDefaultPosition, wxDefaultSize,wxSUNKEN_BORDER) 222 self.List_Referrals = wxListCtrl(self.notebook1, -1, wxDefaultPosition, wxDefaultSize,wxSUNKEN_BORDER) 223 self.List_Recalls = wxListCtrl(self.notebook1, -1, wxDefaultPosition, wxDefaultSize,wxSUNKEN_BORDER) 224 self.List_Inbox = wxListCtrl(self.notebook1, -1, wxDefaultPosition, wxDefaultSize,wxSUNKEN_BORDER) 225 226 self.notebook1.AddPage(self.List_Script, '', True, tabimage_Script) 227 #self.notebook1.AddPage(True, tabimage_Inbox, szr_script_page, '') 228 self.notebook1.AddPage(self.List_Requests, '', True, tabimage_Requests) 229 self.notebook1.AddPage(self.List_Measurements, '', True, tabimage_Measurements) 230 self.notebook1.AddPage(self.List_Referrals, '', True, tabimage_Referrals) 231 self.notebook1.AddPage(self.List_Recalls, '', True, tabimage_Recalls) 232 self.notebook1.AddPage(self.List_Inbox, '', True, tabimage_Inbox) 233 self.notebook1.SetSelection(0) #start on scriptpage 234 #-------------------------------------- 235 #Now lets do things to the script list: 236 #-------------------------------------- 237 self.List_Script.SetImageList(self.ListsImageList, wxIMAGE_LIST_SMALL) 238 #------------------------------------------------------------------------ 239 # since we want images on the column header we have to do it the hard way 240 #------------------------------------------------------------------------ 241 info = wxListItem() 242 info.Mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE | wxLIST_MASK_FORMAT 243 info.Image = -1 244 info.Align = 0 245 info.Text = _("Drug") 246 self.List_Script.InsertColumnInfo(0, info) 247 248 249 info.Align = wxLIST_FORMAT_LEFT 250 info.Text = _("Dose") 251 self.List_Script.InsertColumnInfo(1, info) 252 253 info.Align = wxLIST_FORMAT_RIGHT 254 info.Text = _("Instructions") 255 self.List_Script.InsertColumnInfo(2, info) 256 257 info.Align = wxLIST_FORMAT_RIGHT 258 info.Text = _("Last Date") 259 self.List_Script.InsertColumnInfo(3, info) 260 261 info.Align = wxLIST_FORMAT_RIGHT 262 info.Text = _("Prescribed For") 263 self.List_Script.InsertColumnInfo(4, info) 264 265 266 info.Align = wxLIST_FORMAT_RIGHT 267 info.Text = _("Quantity") 268 self.List_Script.InsertColumnInfo(5, info) 269 270 271 info.Align = 0 272 info.Text = _("First Date") 273 self.List_Script.InsertColumnInfo(6, info) 274 #------------------------------------------------------------- 275 #loop through the scriptdata array and add to the list control 276 #note the different syntax for the first coloum of each row 277 #i.e. here > self.List_Script.InsertItem(x, data[0])!! 278 #------------------------------------------------------------- 279 items = scriptdata.items() 280 for x in range(len(items)): 281 key, data = items[x] 282 #<DEBUG> 283 gmLog.gmDefLog.Log (gmLog.lData, items[x]) 284 #</DEBUG> 285 #print x, data[0],data[1],data[2] 286 self.List_Script.InsertItem(x, data[0]) 287 self.List_Script.SetItem(x, 1, data[1]) 288 self.List_Script.SetItem(x, 2, data[2]) 289 self.List_Script.SetItem(x, 3, data[3]) 290 self.List_Script.SetItem(x, 4, data[4]) 291 self.List_Script.SetItem(x, 5, data[5]) 292 self.List_Script.SetItem(x, 6, data[6]) 293 self.List_Script.SetItemData(x, key) 294 #-------------------------------------------------------- 295 #note the number pased to the wxColumnSorterMixin must be 296 #the 1 based count of columns 297 #-------------------------------------------------------- 298 self.itemDataMap = scriptdata 299 #wxColumnSorterMixin.__init__(self, 5) #I excluded first date as it didn't sort 300 301 self.List_Script.SetColumnWidth(0, wxLIST_AUTOSIZE) 302 self.List_Script.SetColumnWidth(1, wxLIST_AUTOSIZE) 303 self.List_Script.SetColumnWidth(2, wxLIST_AUTOSIZE) 304 self.List_Script.SetColumnWidth(3, wxLIST_AUTOSIZE) 305 self.List_Script.SetColumnWidth(4, wxLIST_AUTOSIZE) 306 self.List_Script.SetColumnWidth(5, wxLIST_AUTOSIZE) 307 self.List_Script.SetColumnWidth(6, 150) 308 sizer.AddSizer(szr_notebook,40,wxEXPAND) 309 self.SetSizer(sizer) #set the sizer 310 sizer.Fit(self) #set to minimum size as calculated by sizer 311 self.SetAutoLayout(True) #tell frame to use the sizer 312 self.Show(True)
313
314 - def getBitmap (self,__icon):
315 # returns the images on the tabs 316 return wxBitmapFromXPMData(cPickle.loads(zlib.decompress( __icon )))
317 318 #=====================================================================
319 -class gmGP_TabbedLists (gmPlugin.wxBasePlugin):
320 """ 321 Plugin to encapsulate the tabbed lists 322 """
323 - def name (self):
324 return 'TabbedListsPlugin'
325
326 - def register (self):
327 self.mwm = self.gb['clinical.manager'] 328 self.mwm.RegisterRightSide ('tabbed_lists', TabbedLists 329 (self.mwm.righthalfpanel, -1), position=1)
330
331 - def unregister (self):
332 self.mwm.Unregister ('tabbed_lists')
333 334 if __name__ == "__main__": 335 app = wxPyWidgetTester(size = (400, 300)) 336 app.SetWidget(TabbedLists, -1) 337 app.MainLoop() 338 339 #===================================================================== 340 # $Log: gmGP_TabbedLists.py,v $ 341 # Revision 1.21 2008-04-13 14:39:49 ncq 342 # - no more old style logging 343 # 344 # Revision 1.20 2005/09/26 18:01:53 ncq 345 # - use proper way to import wx26 vs wx2.4 346 # - note: THIS WILL BREAK RUNNING THE CLIENT IN SOME PLACES 347 # - time for fixup 348 # 349 # Revision 1.19 2004/07/18 20:30:54 ncq 350 # - wxPython.true/false -> Python.True/False as Python tells us to do 351 # 352 # Revision 1.18 2003/11/17 10:56:42 sjtan 353 # 354 # synced and commiting. 355 # 356 # Revision 1.1 2003/10/23 06:02:40 sjtan 357 # 358 # manual edit areas modelled after r.terry's specs. 359 # 360 # Revision 1.17 2003/05/03 02:20:24 michaelb 361 # bug fix: make wxPython 2.4.0.7's wxRect:Inside happy 362 # 363 # Revision 1.16 2003/04/23 09:20:32 ncq 364 # - reordered arguments and removed keywords from Tabbed Lists to work 365 # around difference betwee 2.0.4.1 to 2.0.4.7 366 # 367 # Revision 1.15 2003/04/05 00:39:23 ncq 368 # - "patient" is now "clinical", changed all the references 369 # 370 # Revision 1.14 2003/02/25 05:30:46 michaelb 371 # improvements on the tooltips 'attached' to the tab images 372 # 373 # Revision 1.13 2003/02/20 02:13:49 michaelb 374 # adding tooltips for the images on the tabs of the wxNotebook 375 # 376 # Revision 1.12 2003/02/07 21:01:21 sjtan 377 # 378 # refactored to re-use handler_generator.generator. Handler for gmSelectPerson as test. 379 # 380 # Revision 1.11 2003/02/02 06:36:26 michaelb 381 # split '__icons' into multiple dictionaries 382 # added 'icon_outgoing_letter' to '__icons_referrals' so it similar to 'gmGP_Referrals.py' 383 # 384 # Revision 1.10 2003/01/30 06:02:14 michaelb 385 # tiny bit of clean-up 386 # 387 # Revision 1.9 2003/01/28 06:47:43 michaelb 388 # removed dependence on "images_gnuMedGP_TabbedLists.py", changed drugs tab icon to 'Rx' 389 # 390 # Revision 1.8 2003/01/25 23:02:53 ncq 391 # - cvs keywords/metadata 392 # 393