diff --git a/gramps2/TODO b/gramps2/TODO
index 79168315c..50e53b143 100644
--- a/gramps2/TODO
+++ b/gramps2/TODO
@@ -7,10 +7,6 @@
* Provide an "import" of a gramps package. Not too difficult to do this,
since there is already a ReadTarFile class which will unpackage the
file. Needs have an interface built around it.
-* Catch uncaught exceptions at the top level, notifiy the user, and
- store the results in a file that can be emailed. Have the start of
- this with the gramps.err file, but most users don't realize that
- this file has been created. Some type of notification is needed.
* Speed up the reading of the database. The python XML routines are not
as fast as I would like, and it can take a minute or so to read a
large database. This is way too slow.
@@ -22,10 +18,5 @@
* Disable the save buttons if gramps database is marked read-only. Disable
the adding of media objects as well, since this will cause gramps to
try to create a thumbnail in a readonly database.
-* OpenOffice zip file is not handled very gracefully. Uses the "system"
- call to generate the zip file using the hard coded path of /usr/bin/zip.
- Python 2.0 provides a zip interface, so this may need to hold off until
- the move is made to Python 2.0.
-* Sort all lists
* Startup tips.
* And a whole lot more....
diff --git a/gramps2/src/docgen/AbiWordDoc.py b/gramps2/src/docgen/AbiWordDoc.py
index b9442eacb..1a24146ee 100644
--- a/gramps2/src/docgen/AbiWordDoc.py
+++ b/gramps2/src/docgen/AbiWordDoc.py
@@ -64,7 +64,7 @@ class AbiWordDoc(TextDoc.TextDoc):
self.filename = filename
self.f = open(self.filename,"w")
- self.f.write('\n')
+ self.f.write('\n')
self.f.write('\n')
self.f.write('' % act_height)
+ def start_superscript(self):
+ fsize = self.my_para.get_font().get_size()
+ self.text = self.text + ''
+
+ def end_superscript(self):
+ self.text = self.text + ''
+
def start_paragraph(self,style_name,leader=None):
if self.in_table:
self.start_paragraph_intable(style_name,leader)
@@ -142,6 +149,8 @@ class AbiWordDoc(TextDoc.TextDoc):
style = self.style_list[style_name]
self.current_style = style
self.f.write('
')
+ text = text.replace('</super>','')
if self.in_table:
self.cdata = self.cdata + text
else:
diff --git a/gramps2/src/docgen/PdfDoc.py b/gramps2/src/docgen/PdfDoc.py
index 92c34c5f7..8f1609c52 100644
--- a/gramps2/src/docgen/PdfDoc.py
+++ b/gramps2/src/docgen/PdfDoc.py
@@ -141,8 +141,8 @@ class PdfDoc(TextDoc.TextDoc):
pdf_style.alignment = TA_CENTER
else:
pdf_style.alignment = TA_JUSTIFY
- pdf_style.spaceBefore = style.get_padding()
- pdf_style.spaceAfter = style.get_padding()
+ pdf_style.spaceBefore = style.get_padding()*cm
+ pdf_style.spaceAfter = style.get_padding()*cm
pdf_style.textColor = make_color(font.get_color())
self.pdfstyles[style_name] = pdf_style
@@ -158,6 +158,7 @@ class PdfDoc(TextDoc.TextDoc):
def start_paragraph(self,style_name,leader=None):
self.current_para = self.pdfstyles[style_name]
self.my_para = self.style_list[style_name]
+ self.super = "" % (self.my_para.get_font().get_size()-2)
if leader==None:
self.text = ''
else:
@@ -167,7 +168,6 @@ class PdfDoc(TextDoc.TextDoc):
def end_paragraph(self):
if self.in_table == 0 and self.image == 0:
self.story.append(Paragraph(self.text,self.current_para))
- self.story.append(Spacer(1,0.5*cm))
else:
self.image = 0
@@ -178,10 +178,11 @@ class PdfDoc(TextDoc.TextDoc):
self.text = self.text + ''
def start_superscript(self):
- self.text = self.text + ''
+ fsize = self.my_para.get_font().get_size()
+ self.text = self.text + '' % (fsize-2)
def end_superscript(self):
- self.text = self.text + ''
+ self.text = self.text + ''
def start_table(self,name,style_name):
self.in_table = 1
@@ -283,12 +284,12 @@ class PdfDoc(TextDoc.TextDoc):
self.image = 1
def write_text(self,text):
- text = text.replace('&','&'); # Must be first
- text = text.replace('<','<');
- text = text.replace('>','>');
- text = text.replace('<super>','');
- text = text.replace('</super>','');
- self.text = self.text + text.replace('\n','
');
+ text = text.replace('&','&') # Must be first
+ text = text.replace('<','<')
+ text = text.replace('>','>')
+ text = text.replace('<super>',self.super)
+ text = text.replace('</super>','')
+ self.text = self.text + text.replace('\n','
')
#------------------------------------------------------------------------
#
diff --git a/gramps2/src/plugins/FtmStyleAncestors.py b/gramps2/src/plugins/FtmStyleAncestors.py
new file mode 100644
index 000000000..234c5f95a
--- /dev/null
+++ b/gramps2/src/plugins/FtmStyleAncestors.py
@@ -0,0 +1,883 @@
+#
+# Gramps - a GTK+/GNOME based genealogy program
+#
+# Copyright (C) 2003 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
+#
+
+#------------------------------------------------------------------------
+#
+# python modules
+#
+#------------------------------------------------------------------------
+import os
+import string
+import cStringIO
+
+#------------------------------------------------------------------------
+#
+# gramps modules
+#
+#------------------------------------------------------------------------
+import Report
+import TextDoc
+import RelLib
+import Errors
+from QuestionDialog import ErrorDialog
+from intl import gettext as _
+
+#------------------------------------------------------------------------
+#
+# AncestorReport
+#
+#------------------------------------------------------------------------
+class FtmAncestorReport(Report.Report):
+
+ def __init__(self,database,person,output,max,doc,pgbrk):
+ self.map = {}
+ self.database = database
+ self.start = person
+ self.max_generations = max
+ self.pgbrk = pgbrk
+ self.doc = doc
+ self.doc.open(output)
+ self.sref_map = {}
+ self.sref_index = 1
+
+ def apply_filter(self,person,index,generation=1):
+ if person == None or index >= (1 << 30):
+ return
+ self.map[index] = (person,generation)
+
+ family = person.getMainParents()
+ if family != None:
+ self.apply_filter(family.getFather(),index*2,generation+1)
+ self.apply_filter(family.getMother(),(index*2)+1,generation+1)
+
+ def write_report(self):
+
+ self.apply_filter(self.start,1)
+
+ name = self.start.getPrimaryName().getRegularName()
+ self.doc.start_paragraph("Title")
+ title = _("Ancestors of %s") % name
+ self.doc.write_text(title)
+ self.doc.end_paragraph()
+
+ keys = self.map.keys()
+ keys.sort()
+ old_gen = 0
+ for key in keys :
+ (person,generation) = self.map[key]
+ if old_gen != generation:
+ if self.pgbrk and generation > 0:
+ self.doc.page_break()
+ self.doc.start_paragraph("Generation")
+ t = _("Generation No. %d") % generation
+ self.doc.write_text(t)
+ self.doc.end_paragraph()
+ old_gen = generation
+
+ pri_name = person.getPrimaryName()
+ self.doc.start_paragraph("Entry","%d." % key)
+ name = pri_name.getRegularName()
+ self.doc.start_bold()
+ self.doc.write_text(name)
+ self.doc.end_bold()
+
+ # add source information here
+
+ self.doc.write_text(self.endnotes(pri_name))
+
+ # Check birth record
+
+ birth = person.getBirth()
+ death = person.getDeath()
+
+ birth_valid = birth.getDate() != "" or birth.getPlaceName() != ""
+ death_valid = death.getDate() != "" or death.getPlaceName() != ""
+
+ if birth_valid or death_valid:
+ self.doc.write_text(', ')
+ else:
+ self.doc.write_text('.')
+
+ if birth_valid:
+ date = birth.getDateObj().get_start_date()
+ place = birth.getPlaceName()
+ if place[-1:] == '.':
+ place = place[:-1]
+ if date.getDate() != "":
+ if place != "":
+ t = _("born %(date)s in %(place)s%(endnotes)s") % {
+ 'date' : date.getDate(),
+ 'place' : place,
+ 'endnotes' : self.endnotes(birth),
+ }
+ else:
+ t = _("born %(date)s%(endnotes)s") % {
+ 'date' : date.getDate(),
+ 'endnotes' : self.endnotes(birth),
+ }
+ else:
+ if place != "":
+ t = _("born in %(place)s%(endnotes)s") % {
+ 'place' : place,
+ 'endnotes' : self.endnotes(birth),
+ }
+ else:
+ t = ''
+
+ self.doc.write_text(t)
+ if death_valid:
+ self.doc.write_text('; ')
+ else:
+ self.doc.write_text('. ')
+
+ if death_valid:
+ date = death.getDateObj().get_start_date()
+ place = death.getPlaceName()
+ if place[-1:] == '.':
+ place = place[:-1]
+ if date.getDate() != "":
+ if place != "":
+ t = _("died %(date)s in %(place)s%(endnotes)s.") % {
+ 'date' : date.getDate(),
+ 'place' : place,
+ 'endnotes' : self.endnotes(death),
+ }
+ else:
+ t = _("died %(date)s%(endnotes)s.") % {
+ 'date' : date.getDate(),
+ 'endnotes' : self.endnotes(death),
+ }
+ else:
+ if place != "":
+ t = _("died in %(place)s%(endnotes)s.") % {
+ 'place' : place,
+ 'endnotes' : self.endnotes(death),
+ }
+ else:
+ t = '.'
+ self.doc.write_text(t + ' ')
+
+ self.print_parents(person,death_valid)
+ self.print_spouse(person)
+ self.doc.end_paragraph()
+
+ self.print_notes(person)
+ self.print_more_about(person)
+
+ self.write_endnotes()
+ self.doc.close()
+
+ def write_endnotes(self):
+ keys = self.sref_map.keys()
+ if not keys:
+ return
+
+ self.doc.start_paragraph('Generation')
+ self.doc.write_text('Endnotes')
+ self.doc.end_paragraph()
+
+ keys.sort()
+ for key in keys:
+ srcref = self.sref_map[key]
+ base = srcref.getBase()
+
+ self.doc.start_paragraph('Endnotes',"%d." % key)
+ self.doc.write_text(base.getTitle())
+
+ for item in [ base.getAuthor(), base.getPubInfo(), base.getCallNumber(),
+ srcref.getDate().getDate(),]:
+ if item:
+ self.doc.write_text('; %s' % item)
+
+ item = srcref.getText()
+ if item:
+ self.doc.write_text('; ')
+ self.doc.write_text(_('Text:'))
+ self.doc.write_text(' ')
+ self.doc.write_text(item)
+
+ item = srcref.getComments()
+ if item:
+ self.doc.write_text('; ')
+ self.doc.write_text(_('Comments:'))
+ self.doc.write_text(' ')
+ self.doc.write_text(item)
+
+ self.doc.write_text('.')
+ self.doc.end_paragraph()
+
+ def endnotes(self,obj):
+ msg = cStringIO.StringIO()
+ slist = obj.getSourceRefList()
+ if slist:
+ msg.write('')
+ first = 0
+ for ref in slist:
+ if first == 1:
+ msg.write(',')
+ msg.write("%d" % self.sref_index)
+ self.sref_map[self.sref_index] = ref
+ self.sref_index += 1
+ msg.write('')
+ str = msg.getvalue()
+ msg.close()
+ return str
+
+ def print_notes(self,person):
+ note = person.getNote()
+ if not note.strip():
+ return
+ self.doc.start_paragraph('SubEntry')
+ self.doc.write_text(_('Notes for %(person)s:') % { 'person' : person.getPrimaryName().getName()} )
+ self.doc.end_paragraph()
+ for line in note.split('\n'):
+ self.doc.start_paragraph('Details')
+ self.doc.write_text(line.strip())
+ self.doc.end_paragraph()
+
+ def print_more_about(self,person):
+
+ first = 1
+ ncount = 0
+ for name in person.getAlternateNames():
+ if first:
+ self.doc.start_paragraph('SubEntry')
+ self.doc.write_text(_('More about %(person_name)s:') % { 'person_name' : name })
+ self.doc.end_paragraph()
+ first = 0
+ self.doc.start_paragraph('Details')
+ self.doc.write_text(_('Name %(count)d: %(name)s%(endnotes)s') % {
+ 'count' : ncount, 'name' : name.getRegularName(),
+ 'endnotes' : self.endnotes(name),
+ })
+ self.doc.end_paragraph()
+ ncount += 1
+
+ for event in person.getEventList():
+ date = event.getDate()
+ place = event.getPlace()
+
+ if not date and not place:
+ continue
+ if first:
+ self.doc.start_paragraph('SubEntry')
+ name = person.getPrimaryName().getName()
+ self.doc.write_text(_('More about %(person_name)s:') % { 'person_name' : name })
+ self.doc.end_paragraph()
+ first = 0
+
+ self.doc.start_paragraph('Details')
+ if date and place:
+ self.doc.write_text(_('%(event_name)s: %(date)s, %(place)s%(endnotes)s') % {
+ 'event_name' : event.getName(),
+ 'date' : event.getDate(),
+ 'endnotes' : self.endnotes(event),
+ 'place' : event.getPlaceName() })
+ elif date:
+ self.doc.write_text(_('%(event_name)s: %(date)s%(endnotes)s') % {
+ 'event_name' : event.getName(),
+ 'endnotes' : self.endnotes(event),
+ 'date' : event.getDate()})
+ else:
+ self.doc.write_text(_('%(event_name)s: %(place)s%(endnotes)s') % {
+ 'event_name' : event.getName(),
+ 'place' : event.getPlaceName() })
+ self.doc.end_paragraph()
+
+ def print_spouse(self,person):
+ family_list = person.getFamilyList()
+ if not family_list:
+ return
+ family = family_list[0]
+ if family.getFather() == person:
+ spouse = family.getMother()
+ else:
+ spouse = family.getFather()
+ if not spouse:
+ return
+ event = family.getMarriage()
+ if not event:
+ return
+ date = event.getDate()
+ place = event.getPlaceName()
+
+ if date and place:
+ if person.getGender() == RelLib.Person.male:
+ self.doc.write_text(_('He married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),
+ 'endnotes' : self.endnotes(event),
+ 'date' : date,
+ 'place' : place})
+ else:
+ self.doc.write_text(_('She married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),
+ 'date' : date,
+ 'endnotes' : self.endnotes(event),
+ 'place' : place})
+ elif date:
+ if person.getGender() == RelLib.Person.male:
+ self.doc.write_text(_('He married %(spouse)s %(date)s%(endnotes)s.') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),
+ 'endnotes' : self.endnotes(event),
+ 'date' : date,})
+ else:
+ self.doc.write_text(_('She married %(spouse)s in %(place)s%(endnotes)s.') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),
+ 'endnotes' : self.endnotes(event),
+ 'place' : place,})
+ elif place:
+ if person.getGender() == RelLib.Person.male:
+ self.doc.write_text(_('He married %(spouse)s in %(place)s%(endnotes)s.') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),
+ 'endnotes' : self.endnotes(event),
+ 'place' : place})
+ else:
+ self.doc.write_text(_('She married %(spouse)s in %(place)s%(endnotes)s.') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),
+ 'endnotes' : self.endnotes(event),
+ 'place' : place})
+ else:
+ if person.getGender() == RelLib.Person.male:
+ self.doc.write_text(_('He married %(spouse)s%(endnotes)s.') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),
+ 'endnotes' : self.endnotes(event),
+ })
+ else:
+ self.doc.write_text(_('She married %(spouse)s%(endnotes)s ') % {
+ 'spouse' : spouse.getPrimaryName().getRegularName(),})
+ self.doc.write_text(' ')
+
+ death = spouse.getDeath()
+ dplace = death.getPlaceName()
+ ddate = death.getDate()
+
+ birth = spouse.getBirth()
+ bplace = birth.getPlaceName()
+ bdate = birth.getDate()
+
+ death_valid = ddate != "" or dplace != ""
+ birth_valid = bdate != "" or bplace != ""
+
+ if birth_valid and death_valid:
+ if person.getGender() == RelLib.Person.male:
+ if bdate:
+ if bplace:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("He was born %(birth_date)s in %(birth_place)s"
+ "%(birth_endnotes)s, "
+ "and died %(death_date)s in %(death_place)s"
+ "%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ 'death_date' : ddate,'death_place' : dplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("He was born %(birth_date)s in %(birth_place)s"
+ "%(birth_endnotes)s, "
+ "and died %(death_date)s%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ 'death_date' : ddate,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("He was born %(birth_date)s in %(birth_place)s"
+ "%(birth_endnotes)s, "
+ "and died in %(death_place)s%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'death_place' : dplace,
+ })
+ else:
+ self.doc.write_text(_("He was born %(birth_date)s in "
+ "%(birth_place)s%(birth_endnotes)s. ") % {
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ })
+ else:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s, "
+ "and died %(death_date)s in %(death_place)s"
+ "%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'death_date' : ddate,
+ 'death_place' : dplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s, "
+ "and died %(death_date)s%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'death_date' : ddate,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s, "
+ "and died in %(death_place)s%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'death_place' : dplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s. ") % {
+ 'birth_date' : bdate,
+ 'birth_endnotes' : self.endnotes(birth),
+ })
+ else:
+ if bplace:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s, "
+ "and died %(death_date)s in %(death_place)s"
+ "%(death_endnotes)s.") % {
+ 'birth_place' : bplace, 'death_date' : ddate, 'death_place' : dplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s, "
+ "and died %(death_date)s$(death_endnotes)s.") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'birth_place' : bplace, 'death_date' : ddate,
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s, "
+ "and died in %(death_place)s%(death_endnotes)s.") % {
+ 'birth_place' : bplace,'death_place' : dplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s. ") % {
+ 'birth_place' : bplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ })
+ else:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("He died %(death_date)s in "
+ "%(death_place)s%(death_endnotes)s.") % {
+ 'death_date' : ddate, 'death_place' : dplace,
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("He died %(death_date)s%(death_endnotes)s.") % {
+ 'death_date' : ddate,
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("He died in %(death_place)s%(death_endnotes)s.") % {
+ 'death_endnotes' : self.endnotes(death),
+ 'death_place' : dplace,
+ })
+ else:
+ if bdate:
+ if bplace:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
+ "%(birth_endnotes)s, "
+ "and died %(death_date)s in %(death_place)s"
+ "%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ 'death_date' : ddate,'death_place' : dplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
+ "%(birth_endnotes)s, "
+ "and died %(death_date)s%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'death_date' : ddate,
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
+ "%(birth_endnotes)s, "
+ "and died in %(death_place)s%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ 'death_place' : dplace,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ })
+ else:
+ self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
+ "%(birth_endnotes)s. ") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'birth_date' : bdate, 'birth_place' : bplace,
+ })
+ else:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s, "
+ "and died %(death_date)s in %(death_place)s"
+ "%(death_endnotes)s.") % {
+ 'birth_date' : bdate, 'death_date' : ddate,
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'death_place' : dplace,
+ })
+ else:
+ self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s, "
+ "and died %(death_date)s%(death_endnotes)s.") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'birth_date' : bdate, 'death_date' : ddate,
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s, "
+ "and died in %(death_place)s%(death_endnotes)s.") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'birth_date' : bdate, 'death_place' : dplace,
+ })
+ else:
+ self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s. ") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'birth_date' : bdate,
+ })
+ else:
+ if bplace:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s, "
+ "and died %(death_date)s in %(death_place)s%(death_endnotes)s.") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'birth_place' : bplace, 'death_date' : ddate, 'death_place' : dplace,
+ })
+ else:
+ self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s, "
+ "and died %(death_date)s%(death_endnotes)s.") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'birth_place' : bplace, 'death_date' : ddate,
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s, "
+ "and died in %(death_place)s$(death_endnotes)s.") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'death_endnotes' : self.endnotes(death),
+ 'birth_place' : bplace,'death_place' : dplace,
+ })
+ else:
+ self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s. ") % {
+ 'birth_endnotes' : self.endnotes(birth),
+ 'birth_place' : bplace,
+ })
+ else:
+ if ddate:
+ if dplace:
+ self.doc.write_text(_("She died %(death_date)s in "
+ "%(death_place)s%(death_endnotes)s.") % {
+ 'death_endnotes' : self.endnotes(death),
+ 'death_date' : ddate, 'death_place' : dplace,
+ })
+ else:
+ self.doc.write_text(_("She died %(death_date)s$(death_endotes)s.") % {
+ 'death_endnotes' : self.endnotes(death),
+ 'death_date' : ddate,
+ })
+ else:
+ if dplace:
+ self.doc.write_text(_("She died in %(death_place)s$(death_endnotes)s.") % {
+ 'death_endnotes' : self.endnotes(death),
+ 'birth_date' : bdate, 'death_place' : dplace,
+ })
+
+ self.doc.write_text(' ')
+ self.print_parents(spouse,death_valid)
+
+
+ def print_parents(self,person,dead):
+ family = person.getMainParents()
+ if family:
+ mother = family.getMother()
+ father = family.getFather()
+ if person.getGender() == RelLib.Person.male:
+ if mother and father:
+ if dead:
+ self.doc.write_text(_("He was the son of %(father)s and %(mother)s.") % {
+ 'father' : father.getPrimaryName().getRegularName(),
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ else:
+ self.doc.write_text(_("He is the son of %(father)s and %(mother)s.") % {
+ 'father' : father.getPrimaryName().getRegularName(),
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ elif mother:
+ if dead:
+ self.doc.write_text(_("He was the son of %(mother)s.") % {
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ else:
+ self.doc.write_text(_("He is the son of %(mother)s.") % {
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ elif father:
+ if dead:
+ self.doc.write_text(_("He was the son of %(father)s.") % {
+ 'father' : mother.getPrimaryName().getRegularName(), })
+ else:
+ self.doc.write_text(_("He is the son of %(father)s.") % {
+ 'father' : mother.getPrimaryName().getRegularName(), })
+ else:
+ if mother and father:
+ if dead:
+ self.doc.write_text(_("She was the daughter of %(father)s and %(mother)s.") % {
+ 'father' : father.getPrimaryName().getRegularName(),
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ else:
+ self.doc.write_text(_("She is the daughter of %(father)s and %(mother)s.") % {
+ 'father' : father.getPrimaryName().getRegularName(),
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ elif mother:
+ if dead:
+ self.doc.write_text(_("She was the daughter of %(mother)s.") % {
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ else:
+ self.doc.write_text(_("She is the daughter of %(mother)s.") % {
+ 'mother' : mother.getPrimaryName().getRegularName(), })
+ elif father:
+ if dead:
+ self.doc.write_text(_("She was the daughter of %(father)s.") % {
+ 'father' : mother.getPrimaryName().getRegularName(), })
+ else:
+ self.doc.write_text(_("She is the daughter of %(father)s.") % {
+ 'father' : mother.getPrimaryName().getRegularName(), })
+ self.doc.write_text(' ');
+
+
+#------------------------------------------------------------------------
+#
+#
+#
+#------------------------------------------------------------------------
+class FtmAncestorReportDialog(Report.TextReportDialog):
+ def __init__(self,database,person):
+ Report.TextReportDialog.__init__(self,database,person)
+
+ #------------------------------------------------------------------------
+ #
+ # Customization hooks
+ #
+ #------------------------------------------------------------------------
+ def get_title(self):
+ """The window title for this dialog"""
+ return "%s - %s - GRAMPS" % (_("Ahnentafel Report"),_("Text Reports"))
+
+ def get_header(self, name):
+ """The header line at the top of the dialog contents"""
+ return _("Ahnentafel Report for %s") % name
+
+ def get_target_browser_title(self):
+ """The title of the window created when the 'browse' button is
+ clicked in the 'Save As' frame."""
+ return _("Save Ancestor Report")
+
+ def get_stylesheet_savefile(self):
+ """Where to save styles for this report."""
+ return "ftm_ancestor_report.xml"
+
+ def make_default_style(self):
+ """Make the default output style for the Ahnentafel report."""
+ font = TextDoc.FontStyle()
+ font.set(face=TextDoc.FONT_SANS_SERIF,size=16,bold=1,italic=1)
+ para = TextDoc.ParagraphStyle()
+ para.set_font(font)
+ para.set_header_level(1)
+ para.set_alignment(TextDoc.PARA_ALIGN_CENTER)
+ para.set(pad=0.5)
+ para.set_description(_('The style used for the title of the page.'))
+ self.default_style.add_style("Title",para)
+
+ font = TextDoc.FontStyle()
+ font.set(face=TextDoc.FONT_SANS_SERIF,size=14,italic=1)
+ para = TextDoc.ParagraphStyle()
+ para.set_font(font)
+ para.set_header_level(2)
+ para.set(pad=0.5)
+ para.set_alignment(TextDoc.PARA_ALIGN_CENTER)
+ para.set_description(_('The style used for the generation header.'))
+ self.default_style.add_style("Generation",para)
+
+ para = TextDoc.ParagraphStyle()
+ para.set(first_indent=-1.0,lmargin=1.0,pad=0.25)
+ para.set_description(_('The basic style used for the text display.'))
+ self.default_style.add_style("Entry",para)
+
+ para = TextDoc.ParagraphStyle()
+ para.set(lmargin=1.0,pad=0.05)
+ para.set_description(_('The basic style used for the text display.'))
+ self.default_style.add_style("Details",para)
+
+ para = TextDoc.ParagraphStyle()
+ para.set(lmargin=1.0,pad=0.25)
+ para.set_description(_('The basic style used for the text display.'))
+ self.default_style.add_style("SubEntry",para)
+
+ para = TextDoc.ParagraphStyle()
+ para.set(pad=0.05)
+ para.set_description(_('The basic style used for the text display.'))
+ self.default_style.add_style("Endnotes",para)
+
+
+ def make_report(self):
+ """Create the object that will produce the Ahnentafel Report.
+ All user dialog has already been handled and the output file
+ opened."""
+ try:
+ MyReport = FtmAncestorReport(self.db, self.person, self.target_path,
+ self.max_gen, self.doc, self.pg_brk)
+ MyReport.write_report()
+ except Errors.ReportError, msg:
+ ErrorDialog(str(msg))
+ except:
+ import DisplayTrace
+ DisplayTrace.DisplayTrace()
+
+#------------------------------------------------------------------------
+#
+#
+#
+#------------------------------------------------------------------------
+def report(database,person):
+ FtmAncestorReportDialog(database,person)
+
+
+#------------------------------------------------------------------------
+#
+#
+#
+#------------------------------------------------------------------------
+def get_xpm_image():
+ return [
+ "48 48 33 1",
+ " c None",
+ ". c #1A1A1A",
+ "+ c #847B6E",
+ "@ c #B7AC9C",
+ "# c #D1D1D0",
+ "$ c #EEE2D0",
+ "% c #6A655C",
+ "& c #868686",
+ "* c #F1EADF",
+ "= c #5C5854",
+ "- c #B89C73",
+ "; c #E2C8A1",
+ "> c #55524C",
+ ", c #F5EEE6",
+ "' c #4F4E4C",
+ ") c #A19C95",
+ "! c #B3966E",
+ "~ c #CDC8BF",
+ "{ c #F6F2ED",
+ "] c #A6A5A4",
+ "^ c #413F3F",
+ "/ c #D8D1C5",
+ "( c #968977",
+ "_ c #BAB9B6",
+ ": c #FAFAF9",
+ "< c #BEA27B",
+ "[ c #E9DAC2",
+ "} c #9D9385",
+ "| c #E4E3E3",
+ "1 c #7A7062",
+ "2 c #E6D3B4",
+ "3 c #BAA488",
+ "4 c #322E2B",
+ " ",
+ " ",
+ " (+(+++++111%1%%%%===%1 ",
+ " +______________@_@)&==1 ",
+ " +_::::::::::::::*|#_&&}> ",
+ " &_:::::::::::::::{|#]1~}^ ",
+ " +_::::::::::::::::{|#=|~&4 ",
+ " +_::::]]]]]]]]:::::|{':|~&4 ",
+ " +_::::::::::::::::::{'::|~&4 ",
+ " +_:::::::::::::::::::'*::|~&^ ",
+ " +_:::::::::::::::::::'|*::|~}> ",
+ " 1_::::]]]]]]]]]]]]:::'~|{::|_}% ",
+ " 1_:::::::::::::::::::'..4^'=1+%1 ",
+ " +_::::]]]]]]]]]]]]:::|__])&+%=^% ",
+ " 1_::::::::::::::::::::|#__)&&+'^ ",
+ " 1_::::]]]]]]]]]::::::::|#~_])&%^ ",
+ " 1_::::::::::::::::::::{||#~_])14 ",
+ " 1_::::]]]]]]]]]]]]]]]]]]&}#~_]+4 ",
+ " 1_::::::::::::::::::{{{{||#~~@&4 ",
+ " %_::::]]]]]]]]]]]]]]]])))}(~~~&4 ",
+ " %_:::::::::::::::::{{{{{*|#/~_(4 ",
+ " %_::::]]]]]]]]]]]]]]])))))}2;/}4 ",
+ " %_:::::::::::::::{{{{{***||[#~}4 ",
+ " %_::::]]]]]]]]]])]))))))))}2/;)4 ",
+ " %_::::::::::::::{{{{{**|$$[/2~!4 ",
+ " %_::::]]]]]]]]){{{{******$$[2/}4 ",
+ " %_::::::::::::{{{{****$$$$$[2/!4 ",
+ " =_::::]]]]]]])]))))))))})}}[2/!4 ",
+ " %_:::::::::{{{{{{**|$$$$$$[[2;)4 ",
+ " =_::::]]]])]]))))))))))}}}}[22!4 ",
+ " %_::::::::{{{{{|**|$$[$[[[[[22}4 ",
+ " =_::::]]])])))))))))}}}}}}}222-4 ",
+ " =_:::::{{{{{|{*|$$$$$[[[[22222!4 ",
+ " =_::::)]])))))))))}}}}}}(}(2;2-4 ",
+ " =_:::{{{{{{***|$$$$$[[[[22222;-4 ",
+ " =_:::{])))))))))}}}}}}}(}((2;;<4 ",
+ " >_:{{{{{{**|$$$$$[[[[22222;2;;-4 ",
+ " >_{{{{)))))))}}}}}}}(!(((((;;;-4 ",
+ " >_{{{{|**|*$$$$$[[[[22222;;;;;!4 ",
+ " '_{{{{****$$$$$2[[222222;2;;;;-4 ",
+ " '@{{****$$$$$[[[2[222;;2;;;;;;!4 ",
+ " >]{******$$$[$[2[[2222;;;;;;;;!4 ",
+ " '_****$$$$[$[[[[2222;2;;;;;;;;!4 ",
+ " '@__@@@@@@@33<3<<<<<<-<-!!!!!!!4 ",
+ " 44444444444444444444444444444444 ",
+ " ",
+ " ",
+ " "]
+
+#------------------------------------------------------------------------
+#
+#
+#
+#------------------------------------------------------------------------
+from Plugins import register_report
+
+register_report(
+ report,
+ _("FTM Style Ancestor Report"),
+ category=_("Text Reports"),
+ status=(_("Beta")),
+ description= _("Produces a textual ancestral report similar to Family Tree Maker."),
+ xpm=get_xpm_image(),
+ author_name="Donald N. Allingham",
+ author_email="dallingham@users.sourceforge.net"
+ )
+