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

Source Code for Module Gnumed.wxpython.gmFormWidgets

  1  """GNUmed form/letter handling widgets. 
  2  """ 
  3  #================================================================ 
  4  # $Source: /cvsroot/gnumed/gnumed/gnumed/client/wxpython/gmFormWidgets.py,v $ 
  5  # $Id: gmFormWidgets.py,v 1.16 2010/01/09 18:30:10 ncq Exp $ 
  6  __version__ = "$Revision: 1.16 $" 
  7  __author__ = "Karsten Hilbert <Karsten.Hilbert@gmx.net>" 
  8   
  9  import os.path, sys, logging 
 10   
 11   
 12  import wx 
 13   
 14   
 15  if __name__ == '__main__': 
 16          sys.path.insert(0, '../../') 
 17  from Gnumed.pycommon import gmI18N, gmTools, gmDispatcher, gmPrinting 
 18  from Gnumed.business import gmForms, gmPerson 
 19  from Gnumed.wxpython import gmGuiHelpers, gmListWidgets, gmMacro 
 20  from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl, wxgFormTemplateEditAreaDlg 
 21   
 22   
 23  _log = logging.getLogger('gm.ui') 
 24  _log.info(__version__) 
 25   
 26  #============================================================ 
 27  # convenience functions 
 28  #============================================================ 
 98  #------------------------------------------------------------ 
 99  # eventually this should become superfluous when there's a 
100  # standard engine wrapper around OOo 
151  #------------------------------------------------------------ 
152 -def manage_form_templates(parent=None):
153 154 if parent is None: 155 parent = wx.GetApp().GetTopWindow() 156 157 #------------------------- 158 def edit(template=None): 159 dlg = cFormTemplateEditAreaDlg(parent, -1, template=template) 160 result = dlg.ShowModal() 161 return (result == wx.ID_OK)
162 #------------------------- 163 def delete(template): 164 delete = gmGuiHelpers.gm_show_question ( 165 aTitle = _('Deleting form template.'), 166 aMessage = _( 167 'Are you sure you want to delete\n' 168 'the following form template ?\n\n' 169 ' "%s (%s)"\n\n' 170 'You can only delete templates which\n' 171 'have not yet been used to generate\n' 172 'any forms from.' 173 ) % (template['name_long'], template['external_version']) 174 ) 175 if delete: 176 # FIXME: make this a priviledged operation ? 177 gmForms.delete_form_template(template = template) 178 return True 179 return False 180 #------------------------- 181 def refresh(lctrl): 182 templates = gmForms.get_form_templates(active_only = False) 183 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ]) 184 lctrl.set_data(data = templates) 185 #------------------------- 186 template = gmListWidgets.get_choices_from_list ( 187 parent = parent, 188 caption = _('Select letter or form template.'), 189 columns = [_('Template'), _('Version'), _('Type')], 190 edit_callback = edit, 191 new_callback = edit, 192 delete_callback = delete, 193 refresh_callback = refresh, 194 single_selection = True 195 ) 196 197 return template 198 #------------------------------------------------------------
199 -def create_new_letter(parent=None):
200 201 # 1) have user select template 202 template = manage_form_templates(parent = parent) 203 if template is None: 204 return 205 206 wx.BeginBusyCursor() 207 208 # 2) export template to file 209 filename = template.export_to_file() 210 if filename is None: 211 wx.EndBusyCursor() 212 gmGuiHelpers.gm_show_error ( 213 _( 'Error exporting form template\n' 214 '\n' 215 ' "%s" (%s)' 216 ) % (template['name_long'], template['external_version']), 217 _('Letter template export') 218 ) 219 return 220 221 try: 222 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type']) 223 except ImportError: 224 wx.EndBusyCursor() 225 gmGuiHelpers.gm_show_error ( 226 _('Cannot connect to OpenOffice.\n\n' 227 'The UNO bridge module for Python\n' 228 'is not installed.' 229 ), 230 _('Letter writer') 231 ) 232 return 233 234 if not doc.open_in_ooo(): 235 wx.EndBusyCursor() 236 gmGuiHelpers.gm_show_error ( 237 _('Cannot connect to OpenOffice.\n' 238 '\n' 239 'You may want to increase the option\n' 240 '\n' 241 ' <%s>' 242 ) % _('OOo startup time'), 243 _('Letter writer') 244 ) 245 try: os.remove(filename) 246 except: pass 247 return 248 249 doc.show(False) 250 ph_handler = gmMacro.gmPlaceholderHandler() 251 252 wx.EndBusyCursor() 253 254 doc.replace_placeholders(handler = ph_handler) 255 256 wx.BeginBusyCursor() 257 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-') 258 doc.save_in_ooo(filename = filename) 259 wx.EndBusyCursor() 260 261 doc.show(True)
262 #============================================================
263 -class cFormTemplateEditAreaPnl(wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl):
264
265 - def __init__(self, *args, **kwargs):
266 try: 267 self.__template = kwargs['template'] 268 del kwargs['template'] 269 except KeyError: 270 self.__template = None 271 272 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs) 273 274 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider() 275 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider() 276 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider() 277 278 self.refresh() 279 280 self.full_filename = None
281 #--------------------------------------------------------
282 - def refresh(self, template = None):
283 if template is not None: 284 self.__template = template 285 286 if self.__template is None: 287 self._PRW_name_long.SetText(u'') 288 self._PRW_name_short.SetText(u'') 289 self._TCTRL_external_version.SetValue(u'') 290 self._PRW_template_type.SetText(u'') 291 self._PRW_instance_type.SetText(u'') 292 self._TCTRL_filename.SetValue(u'') 293 self._CH_engine.SetSelection(0) 294 self._CHBOX_active.SetValue(True) 295 296 self._TCTRL_date_modified.SetValue(u'') 297 self._TCTRL_modified_by.SetValue(u'') 298 299 else: 300 self._PRW_name_long.SetText(self.__template['name_long']) 301 self._PRW_name_short.SetText(self.__template['name_short']) 302 self._TCTRL_external_version.SetValue(self.__template['external_version']) 303 self._PRW_template_type.SetText(self.__template['l10n_template_type'], data = self.__template['pk_template_type']) 304 self._PRW_instance_type.SetText(self.__template['l10n_instance_type'], data = self.__template['instance_type']) 305 self._TCTRL_filename.SetValue(self.__template['filename']) 306 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.__template['engine'])) 307 self._CHBOX_active.SetValue(self.__template['in_use']) 308 309 self._TCTRL_date_modified.SetValue(self.__template['last_modified'].strftime('%x')) 310 self._TCTRL_modified_by.SetValue(self.__template['modified_by']) 311 312 self._TCTRL_filename.Enable(True) 313 self._BTN_load.Enable(not self.__template['has_instances']) 314 315 self._PRW_name_long.SetFocus()
316 #--------------------------------------------------------
317 - def __valid_for_save(self):
318 error = False 319 320 if gmTools.coalesce(self._PRW_name_long.GetValue(), u'').strip() == u'': 321 error = True 322 self._PRW_name_long.SetBackgroundColour('pink') 323 else: 324 self._PRW_name_long.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 325 326 if gmTools.coalesce(self._PRW_name_short.GetValue(), u'').strip() == u'': 327 error = True 328 self._PRW_name_short.SetBackgroundColour('pink') 329 else: 330 self._PRW_name_short.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 331 332 if gmTools.coalesce(self._TCTRL_external_version.GetValue(), u'').strip() == u'': 333 error = True 334 self._TCTRL_external_version.SetBackgroundColour('pink') 335 else: 336 self._TCTRL_external_version.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 337 338 if gmTools.coalesce(self._PRW_template_type.GetValue(), u'').strip() == u'': 339 error = True 340 self._PRW_template_type.SetBackgroundColour('pink') 341 else: 342 self._PRW_template_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 343 344 if gmTools.coalesce(self._PRW_instance_type.GetValue(), u'').strip() == u'': 345 error = True 346 self._PRW_instance_type.SetBackgroundColour('pink') 347 else: 348 self._PRW_instance_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 349 350 if self.__template is None and self.full_filename is None: 351 error = True 352 gmDispatcher.send(signal = 'statustext', msg = _('You must select a template file before saving.'), beep = True) 353 354 return not error
355 #--------------------------------------------------------
356 - def save(self):
357 if not self.__valid_for_save(): 358 return False 359 360 if self.__template is None: 361 self.__template = gmForms.create_form_template ( 362 template_type = self._PRW_template_type.GetData(), 363 name_short = self._PRW_name_short.GetValue().strip(), 364 name_long = self._PRW_name_long.GetValue().strip() 365 ) 366 else: 367 self.__template['pk_template_type'] = self._PRW_template_type.GetData() 368 self.__template['name_short'] = self._PRW_name_short.GetValue().strip() 369 self.__template['name_long'] = self._PRW_name_long.GetValue().strip() 370 371 if not self.__template['has_instances']: 372 if self.full_filename is not None: 373 self.__template.update_template_from_file(filename = self.full_filename) 374 375 self.__template['external_version'] = self._TCTRL_external_version.GetValue() 376 tmp = self._PRW_instance_type.GetValue().strip() 377 if tmp not in [self.__template['instance_type'], self.__template['l10n_instance_type']]: 378 self.__template['instance_type'] = tmp 379 self.__template['filename'] = self._TCTRL_filename.GetValue() 380 self.__template['in_use'] = self._CHBOX_active.GetValue() 381 self.__template['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 382 383 self.__template.save() 384 return True
385 #-------------------------------------------------------- 386 # event handlers 387 #--------------------------------------------------------
388 - def _on_load_button_pressed(self, evt):
389 dlg = wx.FileDialog ( 390 parent = self, 391 message = _('Choose a form template file'), 392 defaultDir = os.path.expanduser(os.path.join('~', 'gnumed')), 393 defaultFile = '', 394 wildcard = "%s (*.ott)|*.ott|%s (*.tex)|*.tex|%s (*)|*|%s (*.*)|*.*" % (_('OOo templates'), _('LaTeX templates'), _('all files'), _('all files (Win)')), 395 style = wx.OPEN | wx.HIDE_READONLY | wx.FILE_MUST_EXIST 396 ) 397 result = dlg.ShowModal() 398 if result != wx.ID_CANCEL: 399 self.full_filename = dlg.GetPath() 400 fname = os.path.split(self.full_filename)[1] 401 self._TCTRL_filename.SetValue(fname) 402 dlg.Destroy()
403 #============================================================
404 -class cFormTemplateEditAreaDlg(wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg):
405
406 - def __init__(self, *args, **kwargs):
407 try: 408 template = kwargs['template'] 409 del kwargs['template'] 410 except KeyError: 411 template = None 412 413 wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg.__init__(self, *args, **kwargs) 414 415 self._PNL_edit_area.refresh(template=template)
416 #--------------------------------------------------------
417 - def _on_save_button_pressed(self, evt):
418 if self._PNL_edit_area.save(): 419 if self.IsModal(): 420 self.EndModal(wx.ID_OK) 421 else: 422 self.Close()
423 #============================================================ 424 # main 425 #------------------------------------------------------------ 426 if __name__ == '__main__': 427 428 gmI18N.activate_locale() 429 gmI18N.install_domain(domain = 'gnumed') 430 431 #----------------------------------------
432 - def test_cFormTemplateEditAreaPnl():
433 app = wx.PyWidgetTester(size = (400, 300)) 434 pnl = cFormTemplateEditAreaPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4)) 435 app.frame.Show(True) 436 app.MainLoop() 437 return
438 #---------------------------------------- 439 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'): 440 test_cFormTemplateEditAreaPnl() 441 442 #============================================================ 443 # $Log: gmFormWidgets.py,v $ 444 # Revision 1.16 2010/01/09 18:30:10 ncq 445 # - include LaTeX template shell glob pattern to template picker 446 # 447 # Revision 1.15 2010/01/06 14:39:05 ncq 448 # - make cleanup configurable 449 # 450 # Revision 1.14 2010/01/03 18:18:05 ncq 451 # - run edit before generating printout data on generic letters 452 # 453 # Revision 1.13 2010/01/01 21:50:54 ncq 454 # - generic print-doc-from-template 455 # 456 # Revision 1.12 2009/12/25 21:44:43 ncq 457 # - let-user-select-form-template -> manage-form-templates 458 # - handle setting engine type in form template EA 459 # 460 # Revision 1.11 2009/06/11 12:37:25 ncq 461 # - much simplified initial setup of list ctrls 462 # 463 # Revision 1.10 2008/10/12 16:20:11 ncq 464 # - add busy cursor around letter creation 465 # 466 # Revision 1.9 2008/03/05 22:30:14 ncq 467 # - new style logging 468 # 469 # Revision 1.8 2008/01/27 21:14:16 ncq 470 # - gracefully handle UNO import errors 471 # 472 # Revision 1.7 2007/11/10 20:57:04 ncq 473 # - handle failing OOo connection 474 # - cleanup leftover templates on failure 475 # 476 # Revision 1.6 2007/09/16 22:40:15 ncq 477 # - allow editing templates when there are no instances 478 # 479 # Revision 1.5 2007/09/10 18:40:19 ncq 480 # - allow setting data on existing templates if it hasn't been set before 481 # 482 # Revision 1.4 2007/09/02 20:57:28 ncq 483 # - improve edit/delete callbacks 484 # - add refresh callback 485 # 486 # Revision 1.3 2007/09/01 23:33:04 ncq 487 # - implement save()/delete on form templates 488 # 489 # Revision 1.2 2007/08/29 14:38:55 ncq 490 # - remove spurious , 491 # 492 # Revision 1.1 2007/08/28 14:40:12 ncq 493 # - factored out from gmMedDocWidgets.py 494 # 495 # 496 497 498 #============================================================ 499 # Log: gmMedDocWidgets.py 500 # Revision 1.142 2007/08/28 14:18:13 ncq 501 # - no more gm_statustext() 502