""" Dialog report panel to show and summarize the results of the invariant calculation. """ ################################################################################ #This software was developed by the University of Tennessee as part of the #Distributed Data Analysis of Neutron Scattering Experiments (DANSE) #project funded by the US National Science Foundation. # #See the license text in license.txt # #copyright 2009, University of Tennessee ################################################################################ import wx import sys import os import wx.html as html _STATICBOX_WIDTH = 480 PANEL_WIDTH = 530 PANEL_HEIGHT = 700 FONT_VARIANT = 1 ISMAC = False ISPDF = False if sys.platform == "win32": _STATICBOX_WIDTH = 450 PANEL_WIDTH = 500 PANEL_HEIGHT = 700 FONT_VARIANT = 0 ISMAC = False ISPDF = True elif sys.platform == "darwin": ISMAC = True ISPDF = True class ReportDialog(wx.Dialog): """ The report dialog box. """ def __init__(self, list, *args, **kwds): """ Initialization. The parameters added to Dialog are: :param list: report_list (list of html_str, text_str, image) from invariant_state """ kwds["style"] = wx.RESIZE_BORDER|wx.DEFAULT_DIALOG_STYLE wx.Dialog.__init__(self, *args, **kwds) kwds["image"] = 'Dynamic Image' # title self.SetTitle("Report: Fitting") # size self.SetSize((720, 650)) # font size self.SetWindowVariant(variant=FONT_VARIANT) # check if tit is MAC self.is_pdf = ISPDF # report string self.report_list = list # number of images of plot self.nimages = len(list[2]) if list[2] != None: # put image path in the report string if len(list[2]) == 1: self.report_html = self.report_list[0] % \ "memory:img_fit0.png" elif len(list[2]) == 2: self.report_html = self.report_list[0] % \ ("memory:img_fit0.png", "memory:img_fit1.png") # allows up to three images else: self.report_html = self.report_list[0] % \ ("memory:img_fit0.png", "memory:img_fit1.png", "memory:img_fit2.png") else: self.report_html = self.report_list[0] # layout self._setup_layout() def _setup_layout(self): """ Set up layout """ hbox = wx.BoxSizer(wx.HORIZONTAL) # buttons id = wx.ID_OK button_close = wx.Button(self, id, "Close") button_close.SetToolTipString("Close this report window.") #hbox.Add((5,10), 1 , wx.EXPAND|wx.ADJUST_MINSIZE,0) hbox.Add(button_close) button_close.SetFocus() id = wx.NewId() button_preview = wx.Button(self, id, "Preview") button_preview.SetToolTipString("Print preview this report.") button_preview.Bind(wx.EVT_BUTTON, self.onPreview, id=button_preview.GetId()) hbox.Add(button_preview) id = wx.NewId() button_print = wx.Button(self, id, "Print") button_print.SetToolTipString("Print this report.") button_print.Bind(wx.EVT_BUTTON, self.onPrint, id=button_print.GetId()) hbox.Add(button_print) id = wx.NewId() button_save = wx.Button(self, id, "Save") button_save.SetToolTipString("Save this report.") button_save.Bind(wx.EVT_BUTTON, self.onSave, id=button_save.GetId()) hbox.Add(button_save) # panel for report page #panel = wx.Panel(self, -1) vbox = wx.BoxSizer(wx.VERTICAL) # html window self.hwindow = html.HtmlWindow(self, style=wx.BORDER) # set the html page with the report string self.hwindow.SetPage(self.report_html) # add panels to boxsizers vbox.Add(hbox) vbox.Add(self.hwindow, 1, wx.EXPAND|wx.ALL,0) self.SetSizer(vbox) self.Centre() self.Show(True) def onSave(self, event=None): """ Save """ # pdf supporting only on MAC, not on exe if self.is_pdf: wild_card = ' PDF files (*.pdf)|*.pdf|' ind_cor = 0 else: wild_card = '' ind_cor = 1 wild_card += 'HTML files (*.html)|*.html|' wild_card += 'Text files (*.txt)|*.txt' #todo: complete saving fig file and as a txt file dlg = wx.FileDialog(self, "Choose a file", wildcard=wild_card, style=wx.SAVE|wx.OVERWRITE_PROMPT|wx.CHANGE_DIR) dlg.SetFilterIndex(0) # Set .html files to be default if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() return fName = dlg.GetPath() ext_num = dlg.GetFilterIndex() #set file extensions img_ext = [] pic_fname = [] #PDF if ext_num == (0 + 2 * ind_cor): # TODO: Sort this case out ext = '.pdf' fName = os.path.splitext(fName)[0] + ext dlg.Destroy() #pic (png) file path/name for num in range(self.nimages): im_ext = '_img%s.png' % num #img_ext.append(im_ext) pic_name = os.path.splitext(fName)[0] + im_ext pic_fname.append(pic_name) # save the image for use with pdf writer self.report_list[2][num].savefig(pic_name) #put the image path in html string report_frame = self.report_list[0] #put image name strings into the html file #Note:The str for pic_fname shouldn't be removed. if self.nimages == 1: html = report_frame % str(pic_fname[0]) elif self.nimages == 2: html = report_frame % (str(pic_fname[0]), str(pic_fname[1])) elif self.nimages == 3: html = report_frame % (str(pic_fname[0]), str(pic_fname[1]), str(pic_fname[2])) # make/open file in case of absence f = open(fName, 'w') f.close() # write pdf as a pdf file pdf = self.HTML2PDF(data=html, filename=fName) #open pdf if pdf: try: #Windows os.startfile(str(fName)) except: try: #Mac os.system("open %s"% fName) except: #DO not open pass #delete image file for num in range(self.nimages): os.remove(pic_fname[num]) return #HTML + png(graph) elif ext_num == (1 - ind_cor): ext = '.html' for num in range(self.nimages): img_ext.append('_img4html%s.png' % num) report_frame = self.report_list[0] #TEXT + pdf(graph) elif ext_num == (2 - ind_cor): ext = '.txt' # changing the image extension actually changes the image # format on saving for num in range(self.nimages): img_ext.append('_img4txt%s.pdf' % num) report = self.report_list[1] else: return #file name fName = os.path.splitext(fName)[0] + ext dlg.Destroy() #pic (png) file path/name for num in range(self.nimages): pic_name = os.path.splitext(fName)[0] + img_ext[num] pic_fname.append(pic_name) #put the image path in html string if ext_num == (1 - ind_cor): if self.nimages == 1: report = report_frame % os.path.basename(pic_fname[0]) elif self.nimages == 2: report = report_frame % (os.path.basename(pic_fname[0]), os.path.basename(pic_fname[1])) elif self.nimages == 3: report = report_frame % (os.path.basename(pic_fname[0]), os.path.basename(pic_fname[1]), os.path.basename(pic_fname[2])) f = open(fName, 'w') f.write(report) f.close() self.Update() #save png file using pic_fname for num in range(self.nimages): self.report_list[2][num].savefig(pic_fname[num]) def onPreview(self, event=None): """ Preview : event: Preview button event """ previewh = html.HtmlEasyPrinting(name="Printing", parentWindow=self) previewh.PreviewText(self.report_html) if event is not None: event.Skip() self.Update() def onPrint(self, event=None): """ Print : event: Print button event """ printh = html.HtmlEasyPrinting(name="Printing", parentWindow=self) printh.PrintText(self.report_html) if event is not None: event.Skip() self.Update() def OnClose(self, event=None): """ Close the Dialog : event: Close button event """ self.Close() # Reset memory #wx.MemoryFSHandler() if event is not None: event.Skip() def HTML2PDF(self, data, filename): """ Create a PDF file from html source string. : data: html string : filename: name of file to be saved """ import ho.pisa as pisa f = file(filename, "wb") # pisa requires some extra packages, see their web-site pdf = pisa.CreatePDF(data, f) # close the file here otherwise it will be open until quitting #the application. f.close() self.Update() return not pdf.err