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  __author__ = "Karsten Hilbert <Karsten.Hilbert@gmx.net>" 
  5  __license__ = "GPL v2 or later" 
  6   
  7   
  8  import os.path, sys, logging 
  9   
 10   
 11  import wx 
 12   
 13   
 14  if __name__ == '__main__': 
 15          sys.path.insert(0, '../../') 
 16  from Gnumed.pycommon import gmI18N 
 17  from Gnumed.pycommon import gmTools 
 18  from Gnumed.pycommon import gmDispatcher 
 19  from Gnumed.pycommon import gmPrinting 
 20   
 21  from Gnumed.business import gmForms 
 22  from Gnumed.business import gmPerson 
 23   
 24  from Gnumed.wxpython import gmGuiHelpers 
 25  from Gnumed.wxpython import gmListWidgets 
 26  from Gnumed.wxpython import gmMacro 
 27   
 28   
 29  _log = logging.getLogger('gm.ui') 
 30   
 31  #============================================================ 
 32  # convenience functions 
 33  #============================================================ 
111  #------------------------------------------------------------ 
112  # eventually this should become superfluous when there's a 
113  # standard engine wrapper around OOo 
164  #------------------------------------------------------------ 
165 -def manage_form_templates(parent=None, template_types=None, active_only=False, excluded_types=None, msg=None):
166 167 if parent is None: 168 parent = wx.GetApp().GetTopWindow() 169 170 #------------------------- 171 def edit(template=None): 172 dlg = cFormTemplateEditAreaDlg(parent, -1, template=template) 173 return (dlg.ShowModal() == wx.ID_OK)
174 #------------------------- 175 def delete(template): 176 delete = gmGuiHelpers.gm_show_question ( 177 aTitle = _('Deleting form template.'), 178 aMessage = _( 179 'Are you sure you want to delete\n' 180 'the following form template ?\n\n' 181 ' "%s (%s)"\n\n' 182 'You can only delete templates which\n' 183 'have not yet been used to generate\n' 184 'any forms from.' 185 ) % (template['name_long'], template['external_version']) 186 ) 187 if delete: 188 # FIXME: make this a priviledged operation ? 189 gmForms.delete_form_template(template = template) 190 return True 191 return False 192 #------------------------- 193 def refresh(lctrl): 194 templates = gmForms.get_form_templates(active_only = active_only, template_types = template_types, excluded_types = excluded_types) 195 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ]) 196 lctrl.set_data(data = templates) 197 #------------------------- 198 template = gmListWidgets.get_choices_from_list ( 199 parent = parent, 200 msg = msg, 201 caption = _('Select letter or form template.'), 202 columns = [_('Template'), _('Version'), _('Type')], 203 edit_callback = edit, 204 new_callback = edit, 205 delete_callback = delete, 206 refresh_callback = refresh, 207 single_selection = True 208 ) 209 210 return template 211 #------------------------------------------------------------
212 -def create_new_letter(parent=None):
213 214 # 1) have user select template 215 template = manage_form_templates(parent = parent, active_only = True, excluded_types = ['gnuplot script', 'visual progress note']) 216 if template is None: 217 return 218 219 wx.BeginBusyCursor() 220 221 # 2) export template to file 222 filename = template.export_to_file() 223 if filename is None: 224 wx.EndBusyCursor() 225 gmGuiHelpers.gm_show_error ( 226 _( 'Error exporting form template\n' 227 '\n' 228 ' "%s" (%s)' 229 ) % (template['name_long'], template['external_version']), 230 _('Letter template export') 231 ) 232 return 233 234 try: 235 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type']) 236 except ImportError: 237 wx.EndBusyCursor() 238 gmGuiHelpers.gm_show_error ( 239 _('Cannot connect to OpenOffice.\n\n' 240 'The UNO bridge module for Python\n' 241 'is not installed.' 242 ), 243 _('Letter writer') 244 ) 245 return 246 247 if not doc.open_in_ooo(): 248 wx.EndBusyCursor() 249 gmGuiHelpers.gm_show_error ( 250 _('Cannot connect to OpenOffice.\n' 251 '\n' 252 'You may want to increase the option\n' 253 '\n' 254 ' <%s>' 255 ) % _('OOo startup time'), 256 _('Letter writer') 257 ) 258 try: os.remove(filename) 259 except: pass 260 return 261 262 doc.show(False) 263 ph_handler = gmMacro.gmPlaceholderHandler() 264 265 wx.EndBusyCursor() 266 267 doc.replace_placeholders(handler = ph_handler) 268 269 wx.BeginBusyCursor() 270 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-') 271 doc.save_in_ooo(filename = filename) 272 wx.EndBusyCursor() 273 274 doc.show(True)
275 #============================================================ 276 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl 277
278 -class cFormTemplateEditAreaPnl(wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl):
279
280 - def __init__(self, *args, **kwargs):
281 try: 282 self.__template = kwargs['template'] 283 del kwargs['template'] 284 except KeyError: 285 self.__template = None 286 287 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs) 288 289 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider() 290 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider() 291 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider() 292 293 self.refresh() 294 295 self.full_filename = None
296 #--------------------------------------------------------
297 - def refresh(self, template = None):
298 if template is not None: 299 self.__template = template 300 301 if self.__template is None: 302 self._PRW_name_long.SetText(u'') 303 self._PRW_name_short.SetText(u'') 304 self._TCTRL_external_version.SetValue(u'') 305 self._PRW_template_type.SetText(u'') 306 self._PRW_instance_type.SetText(u'') 307 self._TCTRL_filename.SetValue(u'') 308 self._CH_engine.SetSelection(0) 309 self._CHBOX_active.SetValue(True) 310 311 self._TCTRL_date_modified.SetValue(u'') 312 self._TCTRL_modified_by.SetValue(u'') 313 314 self._BTN_export.Enable(False) 315 else: 316 self._PRW_name_long.SetText(self.__template['name_long']) 317 self._PRW_name_short.SetText(self.__template['name_short']) 318 self._TCTRL_external_version.SetValue(self.__template['external_version']) 319 self._PRW_template_type.SetText(self.__template['l10n_template_type'], data = self.__template['pk_template_type']) 320 self._PRW_instance_type.SetText(self.__template['l10n_instance_type'], data = self.__template['instance_type']) 321 self._TCTRL_filename.SetValue(self.__template['filename']) 322 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.__template['engine'])) 323 self._CHBOX_active.SetValue(self.__template['in_use']) 324 325 self._TCTRL_date_modified.SetValue(self.__template['last_modified'].strftime('%x')) 326 self._TCTRL_modified_by.SetValue(self.__template['modified_by']) 327 328 self._TCTRL_filename.Enable(True) 329 self._BTN_load.Enable(not self.__template['has_instances']) 330 331 self._BTN_export.Enable(True) 332 333 self._PRW_name_long.SetFocus()
334 #--------------------------------------------------------
335 - def __valid_for_save(self):
336 error = False 337 338 if gmTools.coalesce(self._PRW_name_long.GetValue(), u'').strip() == u'': 339 error = True 340 self._PRW_name_long.SetBackgroundColour('pink') 341 else: 342 self._PRW_name_long.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 343 344 if gmTools.coalesce(self._PRW_name_short.GetValue(), u'').strip() == u'': 345 error = True 346 self._PRW_name_short.SetBackgroundColour('pink') 347 else: 348 self._PRW_name_short.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 349 350 if gmTools.coalesce(self._TCTRL_external_version.GetValue(), u'').strip() == u'': 351 error = True 352 self._TCTRL_external_version.SetBackgroundColour('pink') 353 else: 354 self._TCTRL_external_version.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 355 356 if gmTools.coalesce(self._PRW_template_type.GetValue(), u'').strip() == u'': 357 error = True 358 self._PRW_template_type.SetBackgroundColour('pink') 359 else: 360 self._PRW_template_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 361 362 if gmTools.coalesce(self._PRW_instance_type.GetValue(), u'').strip() == u'': 363 error = True 364 self._PRW_instance_type.SetBackgroundColour('pink') 365 else: 366 self._PRW_instance_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 367 368 if self.__template is None and self.full_filename is None: 369 error = True 370 gmDispatcher.send(signal = 'statustext', msg = _('You must select a template file before saving.'), beep = True) 371 372 return not error
373 #--------------------------------------------------------
374 - def save(self):
375 if not self.__valid_for_save(): 376 return False 377 378 if self.__template is None: 379 self.__template = gmForms.create_form_template ( 380 template_type = self._PRW_template_type.GetData(), 381 name_short = self._PRW_name_short.GetValue().strip(), 382 name_long = self._PRW_name_long.GetValue().strip() 383 ) 384 else: 385 self.__template['pk_template_type'] = self._PRW_template_type.GetData() 386 self.__template['name_short'] = self._PRW_name_short.GetValue().strip() 387 self.__template['name_long'] = self._PRW_name_long.GetValue().strip() 388 389 if not self.__template['has_instances']: 390 if self.full_filename is not None: 391 self.__template.update_template_from_file(filename = self.full_filename) 392 393 self.__template['external_version'] = self._TCTRL_external_version.GetValue() 394 tmp = self._PRW_instance_type.GetValue().strip() 395 if tmp not in [self.__template['instance_type'], self.__template['l10n_instance_type']]: 396 self.__template['instance_type'] = tmp 397 self.__template['filename'] = self._TCTRL_filename.GetValue() 398 self.__template['in_use'] = self._CHBOX_active.GetValue() 399 self.__template['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 400 401 self.__template.save() 402 return True
403 #-------------------------------------------------------- 404 # event handlers 405 #--------------------------------------------------------
406 - def _on_load_button_pressed(self, evt):
407 408 engine_abbrev = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 409 410 wildcards = [] 411 try: 412 wildcards.append(u'%s (%s)|%s' % ( 413 gmForms.form_engine_names[engine_abbrev], 414 gmForms.form_engine_template_wildcards[engine_abbrev], 415 gmForms.form_engine_template_wildcards[engine_abbrev] 416 )) 417 except KeyError: 418 pass 419 420 wildcards.append(u"%s (*)|*" % _('all files')) 421 wildcards.append(u"%s (*.*)|*.*" % _('all files (Windows)')) 422 423 dlg = wx.FileDialog ( 424 parent = self, 425 message = _('Choose a form template file'), 426 defaultDir = os.path.expanduser(os.path.join('~', 'gnumed')), 427 defaultFile = '', 428 wildcard = '|'.join(wildcards), 429 style = wx.OPEN | wx.HIDE_READONLY | wx.FILE_MUST_EXIST 430 ) 431 result = dlg.ShowModal() 432 if result != wx.ID_CANCEL: 433 self.full_filename = dlg.GetPath() 434 fname = os.path.split(self.full_filename)[1] 435 self._TCTRL_filename.SetValue(fname) 436 dlg.Destroy()
437 #--------------------------------------------------------
438 - def _on_export_button_pressed(self, event):
439 440 if self.__template is None: 441 return 442 443 engine_abbrev = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 444 445 wildcards = [] 446 try: 447 wildcards.append(u'%s (%s)|%s' % ( 448 gmForms.form_engine_names[engine_abbrev], 449 gmForms.form_engine_template_wildcards[engine_abbrev], 450 gmForms.form_engine_template_wildcards[engine_abbrev] 451 )) 452 except KeyError: 453 pass 454 wildcards.append(u"%s (*)|*" % _('all files')) 455 wildcards.append(u"%s (*.*)|*.*" % _('all files (Windows)')) 456 457 dlg = wx.FileDialog ( 458 parent = self, 459 message = _('Enter a filename to save the template in'), 460 defaultDir = os.path.expanduser(os.path.join('~', 'gnumed')), 461 defaultFile = '', 462 wildcard = '|'.join(wildcards), 463 style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT | wx.HIDE_READONLY 464 ) 465 result = dlg.ShowModal() 466 if result != wx.ID_CANCEL: 467 fname = dlg.GetPath() 468 self.__template.export_to_file(filename = fname) 469 470 dlg.Destroy()
471 #============================================================ 472 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaDlg 473
474 -class cFormTemplateEditAreaDlg(wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg):
475
476 - def __init__(self, *args, **kwargs):
477 try: 478 template = kwargs['template'] 479 del kwargs['template'] 480 except KeyError: 481 template = None 482 483 wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg.__init__(self, *args, **kwargs) 484 485 self._PNL_edit_area.refresh(template=template)
486 #--------------------------------------------------------
487 - def _on_save_button_pressed(self, evt):
488 if self._PNL_edit_area.save(): 489 if self.IsModal(): 490 self.EndModal(wx.ID_OK) 491 else: 492 self.Close()
493 #============================================================ 494 # main 495 #------------------------------------------------------------ 496 if __name__ == '__main__': 497 498 gmI18N.activate_locale() 499 gmI18N.install_domain(domain = 'gnumed') 500 501 #----------------------------------------
502 - def test_cFormTemplateEditAreaPnl():
503 app = wx.PyWidgetTester(size = (400, 300)) 504 pnl = cFormTemplateEditAreaPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4)) 505 app.frame.Show(True) 506 app.MainLoop() 507 return
508 #---------------------------------------- 509 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'): 510 test_cFormTemplateEditAreaPnl() 511 512 #============================================================ 513