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