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

Source Code for Module Gnumed.wxpython.gmPlugin_Patient

  1  """gmPlugin_Patient - base classes for GNUMed's patient plugin architecture. 
  2   
  3  @copyright: author 
  4  @license: GPL v2 or later (details at http://www.gnu.org) 
  5  """ 
  6  ############################################################################ 
  7  # $Source: /home/ncq/Projekte/cvs2git/vcs-mirror/gnumed/gnumed/client/wxpython/gmPlugin_Patient.py,v $ 
  8  # $Id: gmPlugin_Patient.py,v 1.12 2009-07-17 09:26:53 ncq Exp $ 
  9  __version__ = "$Revision: 1.12 $" 
 10  __author__ = "H.Herb, I.Haywood, K.Hilbert" 
 11   
 12  import os, sys, re, cPickle, zlib 
 13   
 14  import wx 
 15   
 16  from Gnumed.pycommon import gmExceptions, gmGuiBroker, gmCfg 
 17  from Gnumed.wxpython import gmShadow 
 18   
 19  gmPerson = None 
 20  _log = gmLog.gmDefLog 
 21  _log.Log(gmLog.lInfo, __version__) 
 22   
 23  #------------------------------------------------------------------ 
24 -class BasePlugin:
25 """Base class for all plugins providing wxPython widgets. 26 27 Plugins must have a class descending of this class in 28 their file, which MUST HAVE THE SAME NAME AS THE FILE. 29 30 The file must be in a directory which is loaded by 31 LoadPluginSet (gui/ for the moment, others may be 32 added for different plugin types) 33 """ 34 # NOTE: I anticipate that all plugins will in fact be derived 35 # from this class. Without the brokers a plugin is useless (IH)
36 - def __init__(self, set='', guibroker=None, callbackbroker=None, params=None):
37 self.gb = guibroker 38 self.cb = callbackbroker 39 if self.gb is None: 40 self.gb = gmGuiBroker.GuiBroker() 41 self.set = set
42 #-----------------------------------------------------
43 - def GetIcon (self):
44 """Return icon representing page on the toolbar. 45 46 This is the default behaviour. GetIconData should return 47 pickled, compressed and escaped string with the icon data. 48 49 If you want to change the behaviour (because you want to load 50 plugin icons from overseas via a satellite link or something 51 you need to override this function in your plugin (class). 52 53 Using this standard code also allows us to only import cPickle 54 and zlib here and not in each and every plugin module which 55 should speed up plugin load time :-) 56 """ 57 # FIXME: load from config which plugin we want 58 # which_icon is a cookie stored on the backend by a config manager, 59 # it tells the plugin which icon to return data for, 60 which_icon = None 61 icon_data = self.GetIconData(which_icon) 62 if icon_data is None: 63 return None 64 else: 65 return wx.BitmapFromXPMData(cPickle.loads(zlib.decompress(icon_data)))
66 #-----------------------------------------------------
67 - def GetIconData(self, anIconID = None):
68 # FIXME: in overriding methods need to be very careful about the 69 # type of the icon ID since if we read it back from the database we 70 # may not know what type it was 71 return None
72 #-----------------------------------------------------
73 - def GetWidget (self, parent):
74 """ 75 Return the widget to display. Usually called from 76 register(). The instance returned is the 77 active object for event handling purposes. 78 """ 79 raise gmExceptions.PureVirtualFunction()
80 #-----------------------------------------------------
81 - def MenuInfo (self):
82 """Return tuple of (menuname, menuitem). 83 84 menuname can be 85 "tools", 86 "view", 87 "help", 88 "file" 89 90 If you return "None" no entry will be placed 91 in any menu. 92 """ 93 raise gmExceptions.PureVirtualFunction()
94 #-----------------------------------------------------
95 - def Raise (self):
96 """Raises this plugin to the top level if not visible. 97 """ 98 raise gmExceptions.PureVirtualFunction()
99 #-----------------------------------------------------
100 - def ReceiveFocus(self):
101 """Called whenever this module receives focus and is thus shown onscreen. 102 """ 103 pass
104 #-----------------------------------------------------
105 - def register(self):
106 # register ANY type of plugin, regardless of where plugged in 107 # we may be able to do away with this once we don't do 108 # several types of plugins anymore, as we should 109 self.gb['modules.%s' % self.set][self.__class__.__name__] = self # split/renamed 'horstspace.notebook.%s' 110 _log.Log(gmLog.lInfo, "plugin: [%s] (class: [%s]) set: [%s]" % (self.name(), self.__class__.__name__, self.set))
111 #-----------------------------------------------------
112 - def unregister(self):
113 del self.gb['modules.%s' % self.set][self.__class__.__name__] # split/renamed 'horstspace.notebook.%s' 114 _log.Log(gmLog.lInfo, "plugin: [%s] (class: [%s]) set: [%s]" % (self.name(), self.__class__.__name__, self.set))
115 #-----------------------------------------------------
116 - def name(self):
117 return 'plugin %s' % self.__class__.__name__
118 #------------------------------------------------------------------
119 -class wxPatientPlugin (BasePlugin):
120 """ 121 A 'small page', sits inside the patient view, with the side visible 122 """
123 - def register (self):
124 BasePlugin.register (self) 125 self.mwm = self.gb['clinical.manager'] 126 127 # FIXME: do proper config check for shadowing 128 # FIXME: do we always want shadows and set it to 0 width via themes ? 129 shadow = gmShadow.Shadow (self.mwm, -1) 130 widget = self.GetWidget (shadow) 131 shadow.SetContents (widget) 132 self.mwm.RegisterLeftSide (self.__class__.__name__, shadow) 133 134 icon = self.GetIcon () 135 if icon is not None: 136 tb2 = self.gb['toolbar.%s' % 'gmClinicalWindowManager'] 137 #tb2.AddSeparator() 138 self.tool_id = wx.NewId () 139 tool1 = tb2.AddTool( 140 self.tool_id, 141 icon, 142 shortHelpString = self.name() 143 ) 144 wx.EVT_TOOL (tb2, self.tool_id, self.OnTool) 145 menuname = self.name () 146 menu = self.gb['clinical.submenu'] 147 self.menu_id = wx.NewId () 148 menu.Append (self.menu_id, menuname)
149 #wx.EVT_MENU (..., self.menu_id, self.OnTool) 150 #-----------------------------------------------------
151 - def OnTool (self, event):
152 self.ReceiveFocus() 153 self.mwm.Display (self.__class__.__name__)
154 # redundant as cannot access toolbar unless mwm raised 155 #self.gb['modules.gui']['Patient'].Raise () # split/renamed 'horstspace.notebook.%s' 156 #-----------------------------------------------------
157 - def Raise (self):
158 self.gb['modules.gui']['Patient'].Raise() # split/renamed 'horstspace.notebook.%s' 159 self.mwm.Display (self.__class__.__name__)
160 #-----------------------------------------------------
161 - def unregister (self):
162 BasePlugin.unregister (self) 163 self.mwm.Unregister (self.__class__.__name__) 164 menu = self.gb['main.submenu'] 165 menu.Delete (menu_id) 166 if self.GetIcon () is not None: 167 tb2 = self.gb['toolbar.%s' % 'gmClinicalWindowManager'] 168 tb2.DeleteTool (self.tool_id) 169 del self.gb['modules.patient'][self.__class__.__name__]
170 171 #================================================================== 172 # Main 173 #------------------------------------------------------------------ 174 if __name__ == '__main__': 175 print "please write a unit test" 176 177 #================================================================== 178