From a67cd53b353221dd917fc2afc4d2952c8a4b1b11 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Fri, 18 Apr 2003 04:15:42 +0000 Subject: [PATCH] Reports handle file extensions and check for existing file. svn: r1462 --- NEWS | 11 +- src/Plugins.py | 15 ++- src/QuestionDialog.py | 10 +- src/Report.py | 51 ++++++-- src/docgen/AbiWordDoc.py | 2 +- src/docgen/HtmlDoc.py | 2 +- src/docgen/KwordDoc.py | 4 +- src/docgen/LaTeXDoc.py | 3 +- src/docgen/OpenDrawDoc.py | 2 +- src/docgen/OpenOfficeDoc.py | 2 +- src/docgen/PSDrawDoc.py | 2 +- src/docgen/PdfDoc.py | 20 ++- src/docgen/PdfDrawDoc.py | 48 ++++++-- src/docgen/RTFDoc.py | 2 +- src/docgen/SvgDrawDoc.py | 4 +- src/plugins/AncestorChart.py | 1 + src/plugins/TimeLine.py | 4 + src/plugins/WriteGedcom.py | 1 - src/po/template.po | 233 +++++++++++++++++++++++------------ 19 files changed, 288 insertions(+), 129 deletions(-) diff --git a/NEWS b/NEWS index 9c01aaf65..022d46ff0 100644 --- a/NEWS +++ b/NEWS @@ -2,8 +2,17 @@ Version 0.9.1 * Custom paper sizes may be set for reports * Witnesses may be added to an event. The witnesses do not have to be in the database, in which case only a string for a name is kept. -* Improved Dialogs to be compliant with GNOME Human Interface Guidelines. +* Improved Dialogs to be more compliant with GNOME Human Interface Guidelines. * Added Romanian translation (Radu Bogdan Mare) +* Displaying of tabbed person list is significantly faster, since the lists + are only drawn with they are selected. +* GRAMPS manual has been updated for the GNOME 2 interface. +* Patch Names utility allows you to select which names should be modified. +* Find dialog is now working again. +* Example database can be installed and loaded from the help menu. +* The status bar can now optionally show the active person's relationship + to the home person (works for English only, since the relationship + calculation is region/culture dependent). Version 0.9.0 * GNOME 2.0 support. Requires pygtk2 and gnome-python2. diff --git a/src/Plugins.py b/src/Plugins.py index 5372bec73..5fcd504d5 100644 --- a/src/Plugins.py +++ b/src/Plugins.py @@ -58,6 +58,7 @@ import GrampsCfg import Errors import intl + _ = intl.gettext #------------------------------------------------------------------------- @@ -438,19 +439,19 @@ def register_tool(task, name, _tools.append((task, category, name, description, xpm, status, author_name, author_name)) -def register_text_doc(name,classref, table, paper, style): +def register_text_doc(name,classref, table, paper, style, ext): """Register a text document generator""" for n in _textdoc: if n[0] == name: return - _textdoc.append((name,classref,table,paper,style)) + _textdoc.append((name,classref,table,paper,style,ext)) -def register_draw_doc(name,classref): +def register_draw_doc(name,classref,paper,style, ext): """Register a drawing document generator""" for n in _drawdoc: if n[0] == name: return - _drawdoc.append((name,classref)) + _drawdoc.append((name,classref,paper,style,ext)) #------------------------------------------------------------------------- # @@ -563,6 +564,7 @@ def get_text_doc_menu(main_menu,tables,callback,obj=None): menuitem.set_data("name",item[1]) menuitem.set_data("styles",item[4]) menuitem.set_data("paper",item[3]) + menuitem.set_data("ext",item[5]) menuitem.set_data("obj",obj) if callback: menuitem.connect("activate",callback) @@ -608,9 +610,12 @@ def get_draw_doc_menu(main_menu,callback=None,obj=None): index = 0 myMenu = gtk.Menu() - for (name,classref) in _drawdoc: + for (name,classref,paper,styles,ext) in _drawdoc: menuitem = gtk.MenuItem(name) menuitem.set_data("name",classref) + menuitem.set_data("styles",styles) + menuitem.set_data("paper",paper) + menuitem.set_data("ext",ext) menuitem.set_data("obj",obj) if callback: menuitem.connect("activate",callback) diff --git a/src/QuestionDialog.py b/src/QuestionDialog.py index 513b6d004..7e047a0ac 100644 --- a/src/QuestionDialog.py +++ b/src/QuestionDialog.py @@ -86,14 +86,18 @@ class OptionDialog: self.xml.get_widget('option1').set_label(btnmsg1) self.xml.get_widget('option2').set_label(btnmsg2) self.top.show() - response = self.top.run() - if response == gtk.RESPONSE_NO: + self.response = self.top.run() + if self.response == gtk.RESPONSE_NO: if task1: task1() else: - task2() + if task2: + task2() self.top.destroy() + def get_response(self): + return self.response + class ErrorDialog: def __init__(self,msg1,msg2=""): diff --git a/src/Report.py b/src/Report.py index 0cb3be5fc..2840b7226 100644 --- a/src/Report.py +++ b/src/Report.py @@ -55,7 +55,7 @@ import GrampsCfg import PaperMenu from intl import gettext as _ -from QuestionDialog import ErrorDialog +from QuestionDialog import ErrorDialog, OptionDialog #------------------------------------------------------------------------- # @@ -184,7 +184,8 @@ class ReportDialog: self.frame_names = [] self.frames = {} self.format_menu = None - + self.style_button = None + self.window = gtk.Dialog('GRAMPS') self.window.set_has_separator(gtk.FALSE) self.cancel = self.window.add_button(gtk.STOCK_CANCEL,1) @@ -274,6 +275,12 @@ class ReportDialog: this function.""" return "basic_report.xml" + def get_default_basename(self): + """What should the default name be? + """ + path = self.get_stylesheet_savefile() + return path.split('.')[0] + def get_print_pagecount_map(self): """Return the data used to fill out the 'pagecount' option menu in the print options box. The first value is a mapping @@ -445,8 +452,9 @@ class ReportDialog: self.output_notebook.set_current_page(self.notebook_page) # Does this report format use styles? - self.style_button.set_sensitive(obj.get_data("styles")) - self.style_menu.set_sensitive(obj.get_data("styles")) + if self.style_button: + self.style_button.set_sensitive(obj.get_data("styles")) + self.style_menu.set_sensitive(obj.get_data("styles")) #------------------------------------------------------------------------ # @@ -504,12 +512,9 @@ class ReportDialog: self.tbl.attach(self.target_fileentry,2,4,self.col,self.col+1) self.col += 1 - self.target_fileentry.set_default_path(self.get_default_directory()) - if self.get_target_is_directory(): - self.target_fileentry.set_directory_entry(1) - - self.target_fileentry.set_filename(self.get_default_directory()) - + path = self.get_default_directory() + self.target_fileentry.set_default_path(path) + def setup_format_frame(self): """Set up the format frame of the dialog. This function relies on the make_doc_menu() function to do all the hard @@ -523,6 +528,20 @@ class ReportDialog: self.tbl.attach(self.format_menu,2,4,self.col,self.col+1) self.col += 1 + type = self.format_menu.get_menu().get_active() + ext = type.get_data('ext') + if ext == None: + ext = "" + if type: + path = self.get_default_directory() + if self.get_target_is_directory(): + self.target_fileentry.set_filename(path) + else: + base = self.get_default_basename() + path = os.path.normpath("%s/%s%s" % (path,base,ext)) + self.target_fileentry.set_filename(path) + + def setup_style_frame(self): """Set up the style frame of the dialog. This function relies on other routines create the default style for this report, @@ -872,6 +891,16 @@ class ReportDialog: _("The filename that you gave is a directory.\n" "You need to provide a valid filename.")) return None + + if os.path.isfile(self.target_path): + a = OptionDialog(_('File already exists'), + _('You can choose to either overwrite the file, or change ' + 'the selected filename.'), + _('_Overwrite'),None, + _('_Change filename'),None) + + if a.get_response() == gtk.RESPONSE_YES: + return self.set_default_directory(os.path.dirname(self.target_path) + os.sep) return 1 @@ -1112,7 +1141,7 @@ class DrawReportDialog(ReportDialog): def make_doc_menu(self): """Build a menu of document types that are appropriate for this drawing report.""" - Plugins.get_draw_doc_menu(self.format_menu) + Plugins.get_draw_doc_menu(self.format_menu,self.doc_type_changed) def make_document(self): """Create a document of the type requested by the user.""" diff --git a/src/docgen/AbiWordDoc.py b/src/docgen/AbiWordDoc.py index 4ac652ef5..b9442eacb 100644 --- a/src/docgen/AbiWordDoc.py +++ b/src/docgen/AbiWordDoc.py @@ -318,4 +318,4 @@ class AbiWordDoc(TextDoc.TextDoc): self.cdata = self.cdata + "" self.cdatalist.append(self.cdata) -Plugins.register_text_doc(_("AbiWord"),AbiWordDoc,1,1,1) +Plugins.register_text_doc(_("AbiWord"),AbiWordDoc,1,1,1,".abw") diff --git a/src/docgen/HtmlDoc.py b/src/docgen/HtmlDoc.py index 6e061b2e7..b540d952c 100644 --- a/src/docgen/HtmlDoc.py +++ b/src/docgen/HtmlDoc.py @@ -412,4 +412,4 @@ class HtmlDoc(TextDoc.TextDoc): self.empty = 0 self.f.write(text) -Plugins.register_text_doc(_("HTML"),HtmlDoc,1,0,1) +Plugins.register_text_doc(_("HTML"),HtmlDoc,1,0,1,".html") diff --git a/src/docgen/KwordDoc.py b/src/docgen/KwordDoc.py index ddc0c9e81..c99b5f9ef 100644 --- a/src/docgen/KwordDoc.py +++ b/src/docgen/KwordDoc.py @@ -24,6 +24,8 @@ from latin_utf8 import latin_to_utf8 import time import StringIO import gzip + +import Errors from TarFile import TarFile import Plugins import ImgManip @@ -435,4 +437,4 @@ class KwordDoc(TextDoc.TextDoc): def write_text(self,text): self.text = self.text + text -Plugins.register_text_doc(_("KWord"),KwordDoc,1,1,1) +Plugins.register_text_doc(_("KWord"),KwordDoc,1,1,1,".kwd") diff --git a/src/docgen/LaTeXDoc.py b/src/docgen/LaTeXDoc.py index 3ec8a6936..5fb5317a6 100644 --- a/src/docgen/LaTeXDoc.py +++ b/src/docgen/LaTeXDoc.py @@ -394,5 +394,6 @@ Plugins.register_text_doc( classref=LaTeXDoc, table=1, paper=1, - style=0 + style=0, + ext=".tex" ) diff --git a/src/docgen/OpenDrawDoc.py b/src/docgen/OpenDrawDoc.py index 9c1ca41d5..174ef5b73 100644 --- a/src/docgen/OpenDrawDoc.py +++ b/src/docgen/OpenDrawDoc.py @@ -557,4 +557,4 @@ class OpenDrawDoc(DrawDoc.DrawDoc): # Register document generator # #------------------------------------------------------------------------- -Plugins.register_draw_doc(_("OpenOffice/StarOffice 6"),OpenDrawDoc); +Plugins.register_draw_doc(_("OpenOffice/StarOffice 6"),OpenDrawDoc,1,1,".sxd"); diff --git a/src/docgen/OpenOfficeDoc.py b/src/docgen/OpenOfficeDoc.py index b8a03fc45..640b9a5f9 100644 --- a/src/docgen/OpenOfficeDoc.py +++ b/src/docgen/OpenOfficeDoc.py @@ -569,4 +569,4 @@ class OpenOfficeDoc(TextDoc.TextDoc): self.f.write('\n') self.f.close() -Plugins.register_text_doc(_("OpenOffice/StarOffice 6"),OpenOfficeDoc,1,1,1) +Plugins.register_text_doc(_("OpenOffice/StarOffice 6"),OpenOfficeDoc,1,1,1,".sxw") diff --git a/src/docgen/PSDrawDoc.py b/src/docgen/PSDrawDoc.py index 59be43c05..6550e42b8 100644 --- a/src/docgen/PSDrawDoc.py +++ b/src/docgen/PSDrawDoc.py @@ -249,4 +249,4 @@ def rgb_color(color): b = float(color[2])/255.0 return (r,g,b) -Plugins.register_draw_doc(_("PostScript"),PSDrawDoc); +Plugins.register_draw_doc(_("PostScript"),PSDrawDoc,1,1,".ps"); diff --git a/src/docgen/PdfDoc.py b/src/docgen/PdfDoc.py index 4c5c5bcae..1a01c8689 100644 --- a/src/docgen/PdfDoc.py +++ b/src/docgen/PdfDoc.py @@ -42,7 +42,7 @@ try: from reportlab.lib.colors import Color from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY import reportlab.lib.styles -except: +except ImportError: raise Errors.PluginError( _("The ReportLab modules are not installed")) #------------------------------------------------------------------------ @@ -99,7 +99,7 @@ class PdfDoc(TextDoc.TextDoc): pdf_style.fontSize = font.get_size() pdf_style.bulletFontSize = font.get_size() - if font.get_type_face() == FONT_SERIF: + if font.get_type_face() == TextDoc.FONT_SERIF: if font.get_bold(): if font.get_italic(): pdf_style.fontName = "Times-BoldItalic" @@ -123,7 +123,6 @@ class PdfDoc(TextDoc.TextDoc): pdf_style.fontName = "Helvetica" pdf_style.bulletFontName = pdf_style.fontName - right = style.get_right_margin()*cm left = style.get_left_margin()*cm first = left + style.get_first_indent()*cm @@ -278,19 +277,17 @@ class PdfDoc(TextDoc.TextDoc): self.image = 1 def write_text(self,text): - text = string.replace(text,'&','&'); # Must be first - text = string.replace(text,'<','<'); - text = string.replace(text,'>','>'); - self.text = self.text + text + text = text.replace('&','&'); # Must be first + text = text.replace('<','<'); + self.text = self.text + text.replace('>','>'); #------------------------------------------------------------------------ # # Convert an RGB color tulple to a Color instance # #------------------------------------------------------------------------ -def make_color(color): - return Color(float(color[0])/255.0, float(color[1])/255.0, - float(color[2])/255.0) +def make_color(c): + return Color(float(c[0])/255.0, float(c[1])/255.0, float(c[2])/255.0) #------------------------------------------------------------------------ # @@ -303,5 +300,6 @@ Plugins.register_text_doc( classref=PdfDoc, table=1, paper=1, - style=1 + style=1, + ext="pdf" ) diff --git a/src/docgen/PdfDrawDoc.py b/src/docgen/PdfDrawDoc.py index 2e09514ef..ebecc2ce2 100644 --- a/src/docgen/PdfDrawDoc.py +++ b/src/docgen/PdfDrawDoc.py @@ -18,9 +18,18 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -import os +#------------------------------------------------------------------------- +# +# Standard python libraries +# +#------------------------------------------------------------------------- import string +#------------------------------------------------------------------------- +# +# GRAMPS libraries +# +#------------------------------------------------------------------------- import Plugins import Errors @@ -28,18 +37,27 @@ import TextDoc import DrawDoc from intl import gettext as _ +#------------------------------------------------------------------------- +# +# ReportLab PDF detection, PIL detection +# +#------------------------------------------------------------------------- try: from reportlab.pdfgen import canvas from reportlab.lib.units import cm from reportlab.lib.colors import Color -except: +except ImportError: raise Errors.PluginError( _("The ReportLab modules are not installed")) -def make_color(color): - return Color(float(color[0])/255.0, float(color[1])/255.0, - float(color[2])/255.0) - +#------------------------------------------------------------------------- +# +# PdfDrawDoc +# +#------------------------------------------------------------------------- class PdfDrawDoc(DrawDoc.DrawDoc): + """ + PDF drawing class. Uses the ReportLab libraries to build the PDF files + """ def __init__(self,styles,type,orientation): DrawDoc.DrawDoc.__init__(self,styles,type,orientation) @@ -139,7 +157,7 @@ class PdfDrawDoc(DrawDoc.DrawDoc): w = box_style.get_width()*cm h = box_style.get_height()*cm - self.f.setLineWidth(stype.get_line_width()) + self.f.setLineWidth(box_style.get_line_width()) if box_style.get_shadow(): self.f.setFillColorRGB(0.5,0.5,0.5) @@ -148,12 +166,12 @@ class PdfDrawDoc(DrawDoc.DrawDoc): font = p.get_font() self.f.setStrokeColor(make_color(font.get_color())) - self.f.setFillColor(make_color(box_style.get_color())) + self.f.setFillColor(make_color(box_style.get_fill_color())) self.f.rect(x*cm,y*cm,w,h,fill=1) if text != "": - lines = string.split(text,'\n') + lines = text.split('\n') self.center_print(lines,font,x*cm,y*cm,w,h) def draw_text(self,style,text,x,y): @@ -214,4 +232,14 @@ class PdfDrawDoc(DrawDoc.DrawDoc): self.f.drawString(start_x,start_y,text) self.f.restoreState() -Plugins.register_draw_doc(_("PDF"),PdfDrawDoc); + +def make_color(c): + return Color(float(c[0])/255.0, float(c[1])/255.0, float(c[2])/255.0) + + +#------------------------------------------------------------------------- +# +# Register the document class +# +#------------------------------------------------------------------------- +Plugins.register_draw_doc(_("PDF"),PdfDrawDoc,1,1,".pdf"); diff --git a/src/docgen/RTFDoc.py b/src/docgen/RTFDoc.py index 3258c1706..bd0047702 100644 --- a/src/docgen/RTFDoc.py +++ b/src/docgen/RTFDoc.py @@ -363,4 +363,4 @@ class RTFDoc(TextDoc.TextDoc): else: self.text = self.text + i -Plugins.register_text_doc(_("Rich Text Format (RTF)"),RTFDoc,1,1,1) +Plugins.register_text_doc(_("Rich Text Format (RTF)"),RTFDoc,1,1,1,".rtf") diff --git a/src/docgen/SvgDrawDoc.py b/src/docgen/SvgDrawDoc.py index 3b35e0acd..759a6c353 100644 --- a/src/docgen/SvgDrawDoc.py +++ b/src/docgen/SvgDrawDoc.py @@ -153,7 +153,7 @@ class SvgDrawDoc(DrawDoc.DrawDoc): self.f.write('y="%4.2fcm" ' % y) self.f.write('width="%4.2fcm" ' % bw) self.f.write('height="%4.2fcm" ' % bh) - self.f.write('style="fill:#%02x%02x%02x; stroke:#000000; stroke-width:1;"/>\n' % box_style.get_color()) + self.f.write('style="fill:#%02x%02x%02x; stroke:#000000; stroke-width:1;"/>\n' % box_style.get_fill_color()) if text != "": font = p.get_font() font_size = font.get_size() @@ -218,4 +218,4 @@ def units(val): # Register document generator # #------------------------------------------------------------------------- -Plugins.register_draw_doc(_("SVG (Scalable Vector Graphics)"),SvgDrawDoc); +Plugins.register_draw_doc(_("SVG (Scalable Vector Graphics)"),SvgDrawDoc,1,1,".svg"); diff --git a/src/plugins/AncestorChart.py b/src/plugins/AncestorChart.py index 17654e35d..2cf27c6d9 100644 --- a/src/plugins/AncestorChart.py +++ b/src/plugins/AncestorChart.py @@ -163,6 +163,7 @@ class AncestorChart: g.set_width(self.box_width) g.set_paragraph_style("Normal") g.set_shadow(1) + g.set_fill_color((255,255,255)) self.doc.add_draw_style("box",g) g = DrawDoc.GraphicsStyle() diff --git a/src/plugins/TimeLine.py b/src/plugins/TimeLine.py index adab79d37..79600f8c8 100644 --- a/src/plugins/TimeLine.py +++ b/src/plugins/TimeLine.py @@ -315,6 +315,10 @@ class TimeLineDialog(Report.DrawReportDialog): return "%s - %s - GRAMPS" % (_("Timeline"), _("Graphical Reports")) + def get_stylesheet_savefile(self): + """Where to save user defined styles for this report.""" + return "timeline.xml" + def get_target_browser_title(self): """The title of the window created when the 'browse' button is clicked in the 'Save As' frame.""" diff --git a/src/plugins/WriteGedcom.py b/src/plugins/WriteGedcom.py index 520ff19b0..f46b4136b 100644 --- a/src/plugins/WriteGedcom.py +++ b/src/plugins/WriteGedcom.py @@ -36,7 +36,6 @@ import re # #------------------------------------------------------------------------- import gtk -import gnome.ui import gtk.glade #------------------------------------------------------------------------- diff --git a/src/po/template.po b/src/po/template.po index b4a24794f..a6cfeffec 100644 --- a/src/po/template.po +++ b/src/po/template.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: GRAMPS VERSION\n" -"POT-Creation-Date: Wed Apr 16 12:06:31 2003\n" +"POT-Creation-Date: Thu Apr 17 22:12:29 2003\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,7 +26,7 @@ msgstr "" #: AddSpouse.py:85 ChooseParents.py:55 EditPerson.py:206 FamilyView.py:138 #: SelectChild.py:105 gramps_main.py:103 plugins/FilterEditor.py:130 #: plugins/IndivComplete.py:370 plugins/IndivSummary.py:211 -#: plugins/PatchNames.py:145 plugins/RelCalc.py:326 plugins/TimeLine.py:336 +#: plugins/PatchNames.py:145 plugins/RelCalc.py:326 plugins/TimeLine.py:340 #: plugins/WebPage.py:274 msgid "Name" msgstr "" @@ -498,8 +498,8 @@ msgstr "" msgid "%s: unknown" msgstr "" -#: FamilyView.py:423 Plugins.py:417 Plugins.py:418 Plugins.py:419 -#: Plugins.py:431 Plugins.py:432 Plugins.py:433 Witness.py:71 const.py:149 +#: FamilyView.py:423 Plugins.py:418 Plugins.py:419 Plugins.py:420 +#: Plugins.py:432 Plugins.py:433 Plugins.py:434 Witness.py:71 const.py:149 #: const.py:424 const.py:432 gramps.glade:3657 gramps.glade:3850 #: gramps.glade:4272 gramps.glade:4452 gramps.glade:5928 gramps.glade:6174 #: gramps_main.py:1272 plugins/WebPage.py:288 @@ -933,7 +933,7 @@ msgid "The GRAMPS ID that you chose for this relationship is already being used. msgstr "" #: MediaView.py:75 SourceView.py:68 Sources.py:77 Sources.py:160 -#: plugins/PatchNames.py:168 plugins/TimeLine.py:347 +#: plugins/PatchNames.py:168 plugins/TimeLine.py:351 msgid "Title" msgstr "" @@ -1033,31 +1033,31 @@ msgstr "" msgid "_Delete Place" msgstr "" -#: Plugins.py:81 +#: Plugins.py:82 msgid "No description was provided" msgstr "" -#: Plugins.py:242 +#: Plugins.py:243 msgid "Report Selection" msgstr "" -#: Plugins.py:258 +#: Plugins.py:259 msgid "Tool Selection" msgstr "" -#: Plugins.py:274 +#: Plugins.py:275 msgid "Plugin status" msgstr "" -#: Plugins.py:286 +#: Plugins.py:287 msgid "All modules were successfully loaded." msgstr "" -#: Plugins.py:288 +#: Plugins.py:289 msgid "The following modules could not be loaded:" msgstr "" -#: Plugins.py:414 Plugins.py:428 +#: Plugins.py:415 Plugins.py:429 msgid "Uncategorized" msgstr "" @@ -1100,8 +1100,8 @@ msgstr "" #: RelImage.py:71 RelImage.py:74 RelImage.py:139 RelImage.py:142 #: gramps_main.py:813 gramps_main.py:818 gramps_main.py:827 #: plugins/AncestorChart.py:113 plugins/DesGraph.py:210 -#: plugins/DesGraph.py:219 plugins/WriteGedcom.py:495 -#: plugins/WriteGedcom.py:500 +#: plugins/DesGraph.py:219 plugins/WriteGedcom.py:494 +#: plugins/WriteGedcom.py:499 msgid "Could not create %s" msgstr "" @@ -1265,109 +1265,125 @@ msgstr "" msgid "Working" msgstr "" -#: Report.py:259 +#: Report.py:260 msgid "Save Report As" msgstr "" -#: Report.py:484 +#: Report.py:492 msgid "Document Options" msgstr "" -#: Report.py:494 +#: Report.py:502 msgid "Save As" msgstr "" -#: Report.py:498 +#: Report.py:506 msgid "Directory" msgstr "" -#: Report.py:500 +#: Report.py:508 msgid "Filename" msgstr "" -#: Report.py:520 +#: Report.py:525 msgid "Output Format" msgstr "" -#: Report.py:534 +#: Report.py:553 msgid "Styles" msgstr "" -#: Report.py:538 StyleEditor.py:80 +#: Report.py:557 StyleEditor.py:80 msgid "Style Editor" msgstr "" -#: Report.py:597 Report.py:599 +#: Report.py:616 Report.py:618 msgid "Paper Options" msgstr "" -#: Report.py:608 +#: Report.py:627 msgid "Size" msgstr "" -#: Report.py:613 +#: Report.py:632 msgid "Height" msgstr "" -#: Report.py:621 Report.py:637 styles.glade:903 styles.glade:927 +#: Report.py:640 Report.py:656 styles.glade:903 styles.glade:927 #: styles.glade:951 msgid "cm" msgstr "" -#: Report.py:625 +#: Report.py:644 msgid "Orientation" msgstr "" -#: Report.py:629 +#: Report.py:648 msgid "Width" msgstr "" -#: Report.py:649 +#: Report.py:668 msgid "Page Count" msgstr "" -#: Report.py:673 Report.py:678 +#: Report.py:692 Report.py:697 msgid "HTML Options" msgstr "" -#: Report.py:680 plugins/eventcmp.glade:192 +#: Report.py:699 plugins/eventcmp.glade:192 msgid "Template" msgstr "" -#: Report.py:699 +#: Report.py:718 msgid "User Template" msgstr "" -#: Report.py:702 +#: Report.py:721 msgid "Choose File" msgstr "" -#: Report.py:741 +#: Report.py:760 msgid "Report Options" msgstr "" -#: Report.py:759 plugins/FilterEditor.py:70 plugins/pafexport.glade:127 +#: Report.py:778 plugins/FilterEditor.py:70 plugins/pafexport.glade:127 msgid "Filter" msgstr "" -#: Report.py:776 +#: Report.py:795 msgid "Generations" msgstr "" -#: Report.py:783 +#: Report.py:802 msgid "Page break between generations" msgstr "" -#: Report.py:871 +#: Report.py:890 msgid "Invalid file name" msgstr "" -#: Report.py:872 +#: Report.py:891 msgid "" "The filename that you gave is a directory.\n" "You need to provide a valid filename." msgstr "" +#: Report.py:896 +msgid "File already exists" +msgstr "" + +#: Report.py:897 +msgid "You can choose to either overwrite the file, or change the selected filename." +msgstr "" + +#: Report.py:899 +msgid "_Overwrite" +msgstr "" + +#: Report.py:900 +msgid "_Change filename" +msgstr "" + #: SelectChild.py:71 msgid "Add Children" msgstr "" @@ -2134,12 +2150,12 @@ msgstr "" msgid "HTML" msgstr "" -#: docgen/KwordDoc.py:239 docgen/KwordDoc.py:243 +#: docgen/KwordDoc.py:241 docgen/KwordDoc.py:245 #: plugins/DetAncestralReport.py:62 plugins/DetDescendantReport.py:62 msgid "Could not open %s" msgstr "" -#: docgen/KwordDoc.py:438 +#: docgen/KwordDoc.py:440 msgid "KWord" msgstr "" @@ -2155,11 +2171,11 @@ msgstr "" msgid "PostScript" msgstr "" -#: docgen/PdfDoc.py:46 docgen/PdfDrawDoc.py:36 +#: docgen/PdfDoc.py:46 docgen/PdfDrawDoc.py:50 msgid "The ReportLab modules are not installed" msgstr "" -#: docgen/PdfDoc.py:302 docgen/PdfDrawDoc.py:217 +#: docgen/PdfDoc.py:299 docgen/PdfDrawDoc.py:245 msgid "PDF" msgstr "" @@ -2171,6 +2187,10 @@ msgstr "" msgid "SVG (Scalable Vector Graphics)" msgstr "" +#: docgen/TextBufDoc.py:169 +msgid "Text Buffer Preview" +msgstr "" + #: edit_person.glade:33 msgid "Abandon changes and close window" msgstr "" @@ -3359,52 +3379,58 @@ msgstr "" msgid "Author's email:" msgstr "" -#: plugins/AncestorChart.py:217 plugins/AncestorChart.py:425 +#: plugins/AncestorChart.py:218 plugins/AncestorChart.py:426 msgid "Ancestor Chart" msgstr "" -#: plugins/AncestorChart.py:217 plugins/AncestorChart.py:426 -#: plugins/DesGraph.py:308 plugins/DesGraph.py:460 plugins/GraphViz.py:78 -#: plugins/GraphViz.py:448 plugins/TimeLine.py:316 plugins/TimeLine.py:457 +#: plugins/AncestorChart.py:218 plugins/AncestorChart.py:427 +#: plugins/DesGraph.py:308 plugins/DesGraph.py:460 plugins/FullFamily.py:105 +#: plugins/FullFamily.py:170 plugins/GraphViz.py:78 plugins/GraphViz.py:448 +#: plugins/TimeLine.py:316 plugins/TimeLine.py:461 msgid "Graphical Reports" msgstr "" -#: plugins/AncestorChart.py:221 +#: plugins/AncestorChart.py:222 msgid "Ancestor Chart for %s" msgstr "" -#: plugins/AncestorChart.py:226 +#: plugins/AncestorChart.py:227 msgid "Save Ancestor Chart" msgstr "" -#: plugins/AncestorChart.py:238 plugins/DesGraph.py:325 +#: plugins/AncestorChart.py:239 plugins/DesGraph.py:325 +#: plugins/FullFamily.py:126 msgid "Display Format" msgstr "" -#: plugins/AncestorChart.py:239 plugins/DesGraph.py:326 +#: plugins/AncestorChart.py:240 plugins/DesGraph.py:326 +#: plugins/FullFamily.py:127 msgid "Allows you to customize the data in the boxes in the report" msgstr "" -#: plugins/AncestorChart.py:248 plugins/AncestorReport.py:262 +#: plugins/AncestorChart.py:249 plugins/AncestorReport.py:262 #: plugins/DesGraph.py:335 plugins/FamilyGroup.py:417 -#: plugins/IndivComplete.py:528 plugins/IndivSummary.py:371 +#: plugins/FtmStyleAncestors.py:231 plugins/IndivComplete.py:528 +#: plugins/IndivSummary.py:371 msgid "The basic style used for the text display." msgstr "" -#: plugins/AncestorChart.py:427 plugins/AncestorReport.py:389 +#: plugins/AncestorChart.py:428 plugins/AncestorReport.py:389 #: plugins/DescendReport.py:284 plugins/DetAncestralReport.py:972 #: plugins/DetDescendantReport.py:850 plugins/FamilyGroup.py:566 +#: plugins/FtmStyleAncestors.py:358 plugins/FullFamily.py:171 #: plugins/GraphViz.py:447 plugins/IndivComplete.py:667 -#: plugins/IndivSummary.py:500 plugins/Summary.py:150 plugins/TimeLine.py:456 +#: plugins/IndivSummary.py:500 plugins/Summary.py:150 plugins/TimeLine.py:460 #: plugins/WebPage.py:1267 msgid "Beta" msgstr "" -#: plugins/AncestorChart.py:428 +#: plugins/AncestorChart.py:429 plugins/FullFamily.py:172 msgid "Produces a graphical ancestral tree graph" msgstr "" #: plugins/AncestorReport.py:75 plugins/AncestorReport.py:229 +#: plugins/FtmStyleAncestors.py:196 msgid "Ahnentafel Report for %s" msgstr "" @@ -3482,6 +3508,7 @@ msgid " and was buried in %s." msgstr "" #: plugins/AncestorReport.py:225 plugins/AncestorReport.py:387 +#: plugins/FtmStyleAncestors.py:192 msgid "Ahnentafel Report" msgstr "" @@ -3489,22 +3516,25 @@ msgstr "" #: plugins/DescendReport.py:124 plugins/DescendReport.py:283 #: plugins/DetAncestralReport.py:973 plugins/DetDescendantReport.py:851 #: plugins/FamilyGroup.py:344 plugins/FamilyGroup.py:565 +#: plugins/FtmStyleAncestors.py:192 plugins/FtmStyleAncestors.py:357 #: plugins/IndivComplete.py:446 plugins/IndivComplete.py:668 #: plugins/IndivSummary.py:317 plugins/IndivSummary.py:501 msgid "Text Reports" msgstr "" #: plugins/AncestorReport.py:234 plugins/DetAncestralReport.py:677 +#: plugins/FtmStyleAncestors.py:201 msgid "Save Ancestor Report" msgstr "" #: plugins/AncestorReport.py:248 plugins/DescendReport.py:148 -#: plugins/FamilyGroup.py:408 plugins/IndivComplete.py:502 -#: plugins/IndivSummary.py:345 plugins/TimeLine.py:395 plugins/WebPage.py:960 +#: plugins/FamilyGroup.py:408 plugins/FtmStyleAncestors.py:216 +#: plugins/IndivComplete.py:502 plugins/IndivSummary.py:345 +#: plugins/TimeLine.py:399 plugins/WebPage.py:960 msgid "The style used for the title of the page." msgstr "" -#: plugins/AncestorReport.py:257 +#: plugins/AncestorReport.py:257 plugins/FtmStyleAncestors.py:226 msgid "The style used for the generation header." msgstr "" @@ -3653,8 +3683,8 @@ msgid "Provides a browsable hierarchy based on the active person" msgstr "" #: plugins/DescendReport.py:87 plugins/GraphViz.py:103 -#: plugins/IndivComplete.py:475 plugins/TimeLine.py:359 -#: plugins/WriteGedcom.py:378 +#: plugins/IndivComplete.py:475 plugins/TimeLine.py:363 +#: plugins/WriteGedcom.py:377 msgid "Descendants of %s" msgstr "" @@ -3960,7 +3990,7 @@ msgid "Event comparison filter selection" msgstr "" #: plugins/EventCmp.py:147 plugins/GraphViz.py:99 plugins/IndivComplete.py:483 -#: plugins/TimeLine.py:355 plugins/WebPage.py:921 plugins/WriteGedcom.py:374 +#: plugins/TimeLine.py:359 plugins/WebPage.py:921 plugins/WriteGedcom.py:373 msgid "Entire Database" msgstr "" @@ -4067,6 +4097,60 @@ msgstr "" msgid "The System Filter Editor builds custom filters that can be used by anyone on the system to select people included in reports, exports, and other utilities." msgstr "" +#: plugins/FtmStyleAncestors.py:73 plugins/GraphViz.py:107 +#: plugins/IndivComplete.py:479 plugins/TimeLine.py:367 plugins/WebPage.py:933 +#: plugins/WriteGedcom.py:381 +msgid "Ancestors of %s" +msgstr "" + +#: plugins/FtmStyleAncestors.py:86 +msgid "Generation No. %d" +msgstr "" + +#: plugins/FtmStyleAncestors.py:120 +msgid "born %(date)s in %(place)s" +msgstr "" + +#: plugins/FtmStyleAncestors.py:125 +msgid "born on %(date)s" +msgstr "" + +#: plugins/FtmStyleAncestors.py:130 +msgid "born in %(place)s" +msgstr "" + +#: plugins/FtmStyleAncestors.py:150 +msgid "died %(date)s in %(place)s. " +msgstr "" + +#: plugins/FtmStyleAncestors.py:155 +msgid "died on %(date)s. " +msgstr "" + +#: plugins/FtmStyleAncestors.py:160 +msgid "died in %(place)s. " +msgstr "" + +#: plugins/FtmStyleAncestors.py:356 +msgid "FTM Style Ancestor Report" +msgstr "" + +#: plugins/FtmStyleAncestors.py:359 +msgid "Produces a textual ancestral report similar to Family Tree Maker." +msgstr "" + +#: plugins/FullFamily.py:105 plugins/FullFamily.py:169 +msgid "Full Family Chart" +msgstr "" + +#: plugins/FullFamily.py:109 +msgid "Full Family Chart for %s" +msgstr "" + +#: plugins/FullFamily.py:114 +msgid "Save Full Family Chart" +msgstr "" + #: plugins/GraphViz.py:60 plugins/GraphViz.py:87 msgid "Single (scaled)" msgstr "" @@ -4087,12 +4171,7 @@ msgstr "" msgid "Graphviz File" msgstr "" -#: plugins/GraphViz.py:107 plugins/IndivComplete.py:479 -#: plugins/TimeLine.py:363 plugins/WebPage.py:933 plugins/WriteGedcom.py:382 -msgid "Ancestors of %s" -msgstr "" - -#: plugins/GraphViz.py:111 plugins/TimeLine.py:367 plugins/WriteGedcom.py:386 +#: plugins/GraphViz.py:111 plugins/TimeLine.py:371 plugins/WriteGedcom.py:385 msgid "People with common ancestor with %s" msgstr "" @@ -4675,7 +4754,7 @@ msgstr "" msgid "Relationship calculator" msgstr "" -#: plugins/RelCalc.py:327 plugins/TimeLine.py:336 +#: plugins/RelCalc.py:327 plugins/TimeLine.py:340 msgid "Birth Date" msgstr "" @@ -4783,27 +4862,27 @@ msgstr "" msgid "Timeline" msgstr "" -#: plugins/TimeLine.py:321 +#: plugins/TimeLine.py:325 msgid "Timeline File" msgstr "" -#: plugins/TimeLine.py:343 +#: plugins/TimeLine.py:347 msgid "Sort by" msgstr "" -#: plugins/TimeLine.py:379 +#: plugins/TimeLine.py:383 msgid "The style used for the person's name." msgstr "" -#: plugins/TimeLine.py:387 +#: plugins/TimeLine.py:391 msgid "The style used for the year labels." msgstr "" -#: plugins/TimeLine.py:451 +#: plugins/TimeLine.py:455 msgid "Generates a timeline graph." msgstr "" -#: plugins/TimeLine.py:455 +#: plugins/TimeLine.py:459 msgid "Timeline Graph" msgstr "" @@ -5253,11 +5332,11 @@ msgstr "" msgid "Generates web (HTML) pages for individuals, or a set of individuals." msgstr "" -#: plugins/WriteGedcom.py:368 plugins/WriteGedcom.py:477 +#: plugins/WriteGedcom.py:367 plugins/WriteGedcom.py:476 msgid "GEDCOM export" msgstr "" -#: plugins/WriteGedcom.py:1085 +#: plugins/WriteGedcom.py:1084 msgid "Export to GEDCOM" msgstr ""