diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 3c11d196d..8fb0d4b72 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,7 @@ +2006-04-28 Brian Matherly + * src/docgen/ODSDoc.py: Add Open Document Spreadsheet document + * src/plugins/EventCmp.py: Use ODSDoc instead of OpenSpreadSheet + 2006-04-28 Don Allingham * src/DataViews/_MediaView.py (MediaView.add): Fix call to AddMedia * src/ViewManager.py: add ScratchPad to the View menu diff --git a/gramps2/src/docgen/ODSDoc.py b/gramps2/src/docgen/ODSDoc.py new file mode 100644 index 000000000..3708252ba --- /dev/null +++ b/gramps2/src/docgen/ODSDoc.py @@ -0,0 +1,506 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2000-2004 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# $Id: + +#------------------------------------------------------------------------- +# +# Standard Python Modules +# +#------------------------------------------------------------------------- +import os +import tempfile +import zipfile +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# Gramps modules +# +#------------------------------------------------------------------------- +import BaseDoc +from SpreadSheetDoc import * + +import const + +import Errors + +#------------------------------------------------------------------------- +# +# OpenSpreadSheet +# +#------------------------------------------------------------------------- +class ODSDoc(SpreadSheetDoc): + + def __init__(self,type,orientation): + SpreadSheetDoc.__init__(self,type,orientation) + self.f = None + self.filename = None + self.level = 0 + self.time = "0000-00-00T00:00:00" + + def open(self,filename): + import time + + t = time.localtime(time.time()) + self.time = "%04d-%02d-%02dT%02d:%02d:%02d" % \ + (t[0],t[1],t[2],t[3],t[4],t[5]) + + if filename[-4:] != ".ods": + self.filename = filename + ".ods" + else: + self.filename = filename + + try: + self.content_xml = tempfile.mktemp() + self.f = open(self.content_xml,"wb") + except IOError,msg: + raise Errors.ReportError(_("Could not create %s") % self.content_xml, msg) + except: + raise Errors.ReportError(_("Could not create %s") % self.content_xml) + + self.f = open(self.content_xml,"w") + self.f.write('\n') + self.f.write(' ') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + self.f.write('\n') + for key in self.table_styles.keys(): + table = self.table_styles[key] + self.f.write(' \n') + self.f.write(' \n') + self.f.write('\n') + for index in range(0,table.get_columns()): + self.f.write('\n') + self.f.write('\n' % table.get_column_width(index)) + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + for key in self.style_list.keys(): + style = self.style_list[key] + font = style.get_font() + self.f.write('\n') + self.f.write('\n') + else: + self.f.write('fo:font-weight="normal"/>\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + def close(self): + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.close() + self._write_styles_file() + self._write_manifest() + self._write_meta_file() + self._write_mimetype_file() + self._write_zip() + + def start_row(self): + self.f.write('\n') + + def end_row(self): + self.f.write('\n') + + def start_cell(self,style_name,span=1): + self.content = 0 + self.span = span + self.f.write(' 1: + self.f.write(' table:number-columns-spanned="' + str(span) + '">\n') + else: + self.f.write('>\n') + + def end_cell(self): + if self.content == 0: + self.f.write('\n') + else: + self.f.write('\n') + self.f.write('\n') + for col in range(1,self.span): + self.f.write('\n') + + def _write_zip(self): + file = zipfile.ZipFile(self.filename,"w",zipfile.ZIP_DEFLATED) + file.write(self.manifest_xml,str("META-INF/manifest.xml")) + file.write(self.content_xml,str("content.xml")) + file.write(self.meta_xml,str("meta.xml")) + file.write(self.styles_xml,str("styles.xml")) + file.write(self.mimetype,str("mimetype")) + file.close() + + os.unlink(self.manifest_xml) + os.unlink(self.content_xml) + os.unlink(self.meta_xml) + os.unlink(self.styles_xml) + + def _write_styles_file(self): + self.styles_xml = tempfile.mktemp() + + try: + self.f = open(self.styles_xml,"wb") + except IOError,msg: + errmsg = "%s\n%s" % (_("Could not create %s") % self.styles_xml, msg) + raise Errors.ReportError(errmsg) + except: + pass + raise Errors.ReportError(_("Could not create %s") % self.styles_xml) + + self.f = open(self.styles_xml,"w") + self.f.write('\n') + self.f.write('') + + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + self.f.write('\n') + + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + self.f.write('\n') + + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('???\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('Page 1\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('??? ') + self.f.write('(???)\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('05/16/2001, ') + self.f.write('10:53:17\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('Page 1 / ') + self.f.write('99\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + + self.f.write('\n') + self.f.close() + + def start_page(self,name,style_name): + table = self.table_styles[style_name] + self.f.write('\n') + for col in range(0,table.get_columns()): + self.f.write('\n') + + def end_page(self): + self.f.write('\n') + + def write_text(self,text): + if text == "": + return + if self.content == 0: + self.f.write('') + self.content = 1 + text = text.replace('&','&') # Must be first + text = text.replace('<','<') + text = text.replace('>','>') + text = text.replace('\t','') + text = text.replace('\n','') + self.f.write(unicode(text)) + + def _write_manifest(self): + self.manifest_xml = tempfile.mktemp() + + try: + self.f = open(self.manifest_xml,"wb") + except IOError,msg: + errmsg = "%s\n%s" % (_("Could not create %s") % self.manifest_xml, msg) + raise Errors.ReportError(errmsg) + except: + pass + raise Errors.ReportError(_("Could not create %s") % self.manifest_xml) + + self.f = open(self.manifest_xml,"w") + self.f.write('\n') + self.f.write('') + self.f.write('') + self.f.write('') + self.f.write('') + self.f.write('') + self.f.write('') + #self.f.write('') + self.f.write('\n') + self.f.close() + + def _write_meta_file(self): + self.meta_xml = tempfile.mktemp() + + try: + self.f = open(self.meta_xml,"wb") + except IOError,msg: + errmsg = "%s\n%s" % (_("Could not create %s") % self.meta_xml, msg) + raise Errors.ReportError(errmsg) + except: + pass + raise Errors.ReportError(_("Could not create %s") % self.meta_xml) + + self.f = open(self.meta_xml,"w") + + self.f.write('\n') + self.f.write('\n'); + self.f.write('\n') + self.f.write('') + self.f.write(const.program_name + ' ' + const.version) + self.f.write('\n') + self.f.write('') + self.f.write(self.name) + self.f.write('\n') + self.f.write('') + self.f.write(self.time) + self.f.write('\n') + self.f.write('') + self.f.write(self.name) + self.f.write('\n') + self.f.write('') + self.f.write(self.time) + self.f.write('\n') + self.f.write('0-00-00T00:00:00\n') + self.f.write('en-US\n') + self.f.write('1\n') + self.f.write('PT0S\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.write('\n') + self.f.close() + + def _write_mimetype_file(self): + self.mimetype = tempfile.mktemp() + + try: + self.f = open(self.mimetype,"wb") + except IOError,msg: + errmsg = "%s\n%s" % (_("Could not create %s") % self.mimetype, msg) + raise Errors.ReportError(errmsg) + except: + pass + raise Errors.ReportError(_("Could not create %s") % self.mimetype) + + self.f = open(self.mimetype,"w") + self.f.write('application/vnd.oasis.opendocument.spreadsheet') + self.f.close() \ No newline at end of file diff --git a/gramps2/src/plugins/EventCmp.py b/gramps2/src/plugins/EventCmp.py index 9bf1654a2..0b428c81c 100644 --- a/gramps2/src/plugins/EventCmp.py +++ b/gramps2/src/plugins/EventCmp.py @@ -48,7 +48,7 @@ import ListModel import Sort import Utils import BaseDoc -import OpenSpreadSheet +import ODSDoc import const import DateHandler from QuestionDialog import WarningDialog @@ -384,8 +384,7 @@ class DisplayChart(ManagedWindow.ManagedWindow): if status == gtk.RESPONSE_OK: pstyle = BaseDoc.PaperStyle("junk",10,10) - doc = OpenSpreadSheet.OpenSpreadSheet(pstyle, - BaseDoc.PAPER_PORTRAIT) + doc = ODSDoc.ODSDoc(pstyle,BaseDoc.PAPER_PORTRAIT) doc.creator(self.db.get_researcher().get_name()) spreadsheet = TableReport(name,doc) spreadsheet.initialize(len(self.event_titles))