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