From 2f962b5f96da8d2a1b12fd8417b4e72a69ca6440 Mon Sep 17 00:00:00 2001 From: Alex Roitman Date: Tue, 6 Dec 2005 06:38:09 +0000 Subject: [PATCH] merge changes from gramps20 svn: r5482 --- ChangeLog | 1649 +- INSTALL | 11 +- NEWS | 38 + configure.in | 2 +- doc/gramps-manual/C/Makefile.am | 1 + doc/gramps-manual/C/authors.xml | 4 +- doc/gramps-manual/C/bugs.xml | 5 - doc/gramps-manual/C/cmdline.xml | 21 +- doc/gramps-manual/C/cmdplug.xml | 1528 + doc/gramps-manual/C/custom.xml | 6 +- doc/gramps-manual/C/faq.xml | 745 +- doc/gramps-manual/C/getstart.xml | 348 +- doc/gramps-manual/C/gramps-manual-C.omf | 9 +- doc/gramps-manual/C/gramps-manual.xml | 235 +- doc/gramps-manual/C/mainwin.xml | 1158 +- doc/gramps-manual/C/preface.xml | 440 +- doc/gramps-manual/C/usage.xml | 8744 ++-- doc/gramps-manual/Makefile.am | 8 + doc/gramps-manual/fr/gramps-manual-fr.omf | 7 +- doc/gramps.1.in | 4 +- doc/gramps.dtd | 320 - doc/grampsxml.dtd | 358 + doc/grampsxml.rng | 486 + example/gedcom/sample.ged | 10 +- .../1897_expeditionsmannschaft_rio_a.jpg | Bin 0 -> 27205 bytes example/gramps/654px-Aksel_Andersson.jpg | Bin 0 -> 70873 bytes example/gramps/Alimehemet.jpg | Bin 0 -> 58279 bytes example/gramps/AntoineClaudet.png | Bin 0 -> 65049 bytes example/gramps/E_W_Dahlgren.jpg | Bin 0 -> 110203 bytes example/gramps/Gunnlaugur_Larusson_-_Yawn.jpg | Bin 0 -> 112835 bytes example/gramps/data.gramps | 1373 +- example/gramps/example.gramps | 37614 ++++++++++++++++ gramps.sh.in | 2 +- src/AddMedia.py | 22 +- src/AddSpouse.py | 86 +- src/AddrEdit.py | 43 +- src/ArgHandler.py | 83 +- src/AttrEdit.py | 36 +- src/BaseDoc.py | 63 +- src/Bookmarks.py | 6 +- src/CalSdn.py | 12 +- src/ChooseParents.py | 110 +- src/ColumnOrder.py | 5 + src/Date.py | 28 +- src/DateDisplay.py | 48 +- src/DateEdit.py | 23 +- src/DateParser.py | 88 +- src/DdTargets.py | 6 +- src/DisplayModels.py | 12 +- src/DisplayTrace.py | 4 +- src/Errors.py | 9 + src/Exporter.py | 5 +- src/GenericFilter.py | 168 +- src/GrampsBSDDB.py | 23 +- src/GrampsCfg.py | 113 +- src/GrampsDBCallback.py | 31 +- src/GrampsDbBase.py | 97 +- src/{latin_utf8.py => GrampsDisplay.py} | 21 +- src/GrampsGconfKeys.py | 6 + src/GrampsIniKeys.py | 7 + src/GraphLayout.py | 77 - src/ImageSelect.py | 427 +- src/ImgManip.py | 81 +- src/LocEdit.py | 22 +- src/Makefile.am | 11 +- src/MergeData.py | 6 +- src/MergePeople.py | 35 +- src/NameDisplay.py | 72 +- src/NameEdit.py | 56 +- src/NoteEdit.py | 4 + src/Options.py | 513 + src/PeopleView.py | 4 +- src/PluginMgr.py | 224 +- src/Plugins.py | 408 +- src/QuestionDialog.py | 5 +- src/ReadGedcom.py | 217 +- src/ReadXML.py | 108 +- src/RelLib.py | 20 +- src/Relationship.py | 32 +- src/Report.py | 263 +- src/ReportOptions.py | 425 +- src/ReportUtils.py | 2120 +- src/SelectChild.py | 35 +- src/SelectObject.py | 8 +- src/SelectPerson.py | 3 + src/Sources.py | 76 +- src/Spell.py | 60 +- src/StyleEditor.py | 50 +- src/SubstKeywords.py | 25 + src/TipOfDay.py | 5 + src/Tool.py | 279 + src/TransUtils.py | 44 + src/TreeTips.py | 5 +- src/UrlEdit.py | 25 +- src/Utils.py | 128 +- src/WindowUtils.py | 36 + src/Witness.py | 28 +- src/WriteGedcom.py | 242 +- src/WriteXML.py | 103 +- src/build_cmdplug | 10 + src/const.py.in | 44 +- src/data/Makefile.am | 4 +- src/data/document.png | Bin 0 -> 2855 bytes src/data/gramps.schemas | 12 + src/data/main1.css | 346 +- src/data/main2.css | 325 +- src/data/main3.css | 270 +- src/data/main4.css | 346 +- src/data/main5.css | 335 +- src/data/main6.css | 277 + src/data/tips.xml | 9 - src/dates/Date_de.py | 2 +- src/dates/Date_fi.py | 28 +- src/dates/Date_nl.py | 243 + src/dates/Date_sv.py | 168 + src/dates/Makefile.am | 7 +- src/docgen/AbiWord2Doc.py | 9 +- src/docgen/AsciiDoc.py | 91 +- src/docgen/HtmlDoc.py | 54 +- src/docgen/KwordDoc.py | 21 +- src/docgen/LPRDoc.py | 77 +- src/docgen/LaTeXDoc.py | 88 +- src/docgen/OpenOfficeDoc.py | 57 +- src/docgen/OpenSpreadSheet.py | 4 +- src/docgen/PSDrawDoc.py | 110 +- src/docgen/PdfDoc.py | 59 +- src/gedcomimport.glade | 853 +- src/gramps_main.py | 6 +- src/plugins.glade | 1 - src/plugins/AncestorChart.py | 8 +- src/plugins/AncestorChart2.py | 17 +- src/plugins/AncestorReport.py | 174 +- src/plugins/Ancestors.py | 32 +- src/plugins/BookReport.py | 22 +- src/plugins/ChangeNames.py | 59 +- src/plugins/ChangeTypes.py | 155 +- src/plugins/Check.py | 122 +- src/plugins/Checkpoint.py | 374 +- src/plugins/CmdRef.py | 262 + src/plugins/CountAncestors.py | 3 +- src/plugins/CustomBookText.py | 3 +- src/plugins/DesGraph.py | 77 +- src/plugins/Desbrowser.py | 41 +- src/plugins/DescendChart.py | 478 + src/plugins/DescendReport.py | 111 +- src/plugins/DetAncestralReport.py | 263 +- src/plugins/DetDescendantReport.py | 281 +- src/plugins/DumpGenderStats.py | 88 +- src/plugins/Eval.py | 46 +- src/plugins/EventCmp.py | 60 +- src/plugins/ExportVCalendar.py | 9 +- src/plugins/ExportVCard.py | 9 +- src/plugins/FamilyGroup.py | 9 +- src/plugins/FanChart.py | 7 +- src/plugins/FilterEditor.py | 57 +- src/plugins/FtmStyleAncestors.py | 11 +- src/plugins/FtmStyleDescendants.py | 5 +- src/plugins/GraphViz.py | 22 +- src/plugins/ImportGeneWeb.py | 175 +- src/plugins/ImportvCard.py | 4 - src/plugins/IndivComplete.py | 42 +- src/plugins/IndivSummary.py | 8 +- src/plugins/Leak.py | 42 +- src/plugins/Makefile.am | 9 +- src/plugins/Merge.py | 117 +- src/plugins/NavWebPage.py | 1382 +- src/plugins/PatchNames.py | 37 +- src/plugins/Rebuild.py | 79 +- src/plugins/ReorderIds.py | 140 +- src/plugins/SimpleBookTitle.py | 9 +- src/plugins/SoundGen.py | 42 +- src/plugins/StatisticsChart.py | 131 +- src/plugins/Summary.py | 3 +- src/plugins/TestcaseGenerator.py | 884 +- src/plugins/TimeLine.py | 10 +- src/plugins/Verify.py | 252 +- src/plugins/WebPage.py | 12 +- src/plugins/WriteCD.py | 9 +- src/plugins/WriteGeneWeb.py | 22 +- src/plugins/checkpoint.glade | 448 + src/plugins/rel_es.py | 29 +- src/plugins/rel_sv.py | 4 +- src/plugins/relcalc.glade | 10 +- src/plugins/verify.glade | 169 +- src/po/Makefile.am | 5 - src/po/check_po | 150 + src/po/cs.po | 6330 ++- src/po/de.po | 8248 ++-- src/po/fi.po | 6954 +-- src/po/fr.po | 12001 ++--- src/po/lt.po | 10612 +++++ src/po/nb.po | 4732 +- src/po/nl.po | 6 +- src/po/no.po | 4732 +- src/po/ru.po | 8183 ++-- src/po/sv.po | 11519 ++--- src/po/template.po | 7554 ++-- src/po/zh_CN.po | 2 +- test/.cvsignore | 3 + test/impex.sh | 55 + test/runtest.sh | 55 + test/tools.sh | 51 + 202 files changed, 112821 insertions(+), 41664 deletions(-) create mode 100644 doc/gramps-manual/C/cmdplug.xml delete mode 100644 doc/gramps.dtd create mode 100644 doc/grampsxml.dtd create mode 100644 doc/grampsxml.rng create mode 100644 example/gramps/1897_expeditionsmannschaft_rio_a.jpg create mode 100644 example/gramps/654px-Aksel_Andersson.jpg create mode 100644 example/gramps/Alimehemet.jpg create mode 100644 example/gramps/AntoineClaudet.png create mode 100644 example/gramps/E_W_Dahlgren.jpg create mode 100644 example/gramps/Gunnlaugur_Larusson_-_Yawn.jpg create mode 100644 example/gramps/example.gramps rename src/{latin_utf8.py => GrampsDisplay.py} (67%) delete mode 100644 src/GraphLayout.py create mode 100644 src/Options.py create mode 100644 src/Tool.py create mode 100644 src/TransUtils.py create mode 100644 src/WindowUtils.py create mode 100755 src/build_cmdplug create mode 100644 src/data/document.png create mode 100644 src/data/main6.css create mode 100644 src/dates/Date_nl.py create mode 100644 src/dates/Date_sv.py create mode 100644 src/plugins/CmdRef.py create mode 100644 src/plugins/DescendChart.py create mode 100644 src/plugins/checkpoint.glade create mode 100755 src/po/check_po create mode 100644 src/po/lt.po create mode 100644 test/.cvsignore create mode 100755 test/impex.sh create mode 100755 test/runtest.sh create mode 100755 test/tools.sh diff --git a/ChangeLog b/ChangeLog index 7c984f480..3572aed1e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-12-05 Don Allingham + * src/data/main*.css: fix H6 and SUP + +2005-12-05 Alex Roitman + * doc/gramps-manual/Makefile.am: Change symlink creation. + * src/po/fr.po: Partial translation update. + 2005-12-05 Don Allingham * src/FamilyView.py: add more ui stuff * src/ReadGedcom.py: set batch properly @@ -6,6 +13,858 @@ * src/FamilyView.py: start of a new family view. * src/gramps_main.py: register FamilyView +2005-12-04 Alex Roitman + * src/po/ru.po: Partial translation update. + +2005-12-03 Julio Sanchez + * src/MergePeople.py: Avoid creating duplicate spouse-to-family links + * src/po/es.po: Partial translation update. + +2005-12-02 Alex Roitman + * src/po/ru.po: Partial translation update. + +2005-12-02 Don Allingham + * src/ReportOptions.py: fix inheritence + +2005-12-01 Don Allingham + * various: pychecker fixes + * src/DateParser.py: properly call the date checking routine + +2005-12-01 Alex Roitman + * src/ReportUtils.py (child_str): Initialize text. + * src/docgen/LaTeXDoc.py: support "____"; support roman numerals + in paragraph leaders. + * src/plugins/BookReport.py (BookReportDialog.__init__): + Initialize page_html_added before instantiating dialog class. + +2005-12-01 Benny Malengier + * src/dates/Date_nl.py: Add to CVS (bmcage). + * src/dates/Makefile.am: Ship new file. + +2005-11-30 Don Allingham + * src/ReadGedcom.py: fix mixing note assignment + * src/PeopleModel.py: streamline display + +2005-11-29 Don Allingham + * src/Relationship.py: limit search depth to 15 generations. + +2005-11-29 Alex Roitman + * doc/xmldocs.make: Revert help path to keep under gramps dir. + * doc/gramps-manual/Makefile.am: Add symlink to keep all gnome + versions happy with the help path. + * src/po/de.po: Typos: missing "\n". + * src/plugins/Checkpoint.py: Replace combos with text entries. + * src/plugins/checkpoint.glade: Replace combos with text entries. + +2005-11-29 Don Allingham + * src/GrampsBSDDB.py: change rebuilding of secondary indices + to use keys instead of cursors. + +2005-11-29 Julio Sanchez + * NEWS: Better support for media objects in GEDCOM output + +2005-11-28 Alex Roitman + * src/GenericFilter.py (MatchesFilter.apply): Typo. + +2005-11-28 Martin Hawlisch + * NEWS: Better support for unicode filenames + * src/FamilyView.py (change_families): Avoid exception if family + does not contain parents + +2005-11-28 Julio Sanchez + * src/DateParser.py: match modifiers in reverse length order so that + multiword modifiers work even if other modifier matches the first + words of the longer modifier + * src/ReadGedcom.py: be more tolerant w.r.t. whitespace in input, + to parse the output from tools that try (incorrectly) to make + the GEDCOM easier to read. Gedcom.pm is one example. + * src/WriteGedcom.py: make sure referenced family sources are output + +2005-11-27 Don Allingham + * src/MergeData.py: fix dangling family after a merge. + +2005-11-27 Alex Roitman + * src/po/template.po: Update. + +2005-11-26 Don Allingham + * src/EditPerson.py: properly handled added name types for the + preferred name + +2005-11-25 Wayne Bergeron + * src/GenericFilter.py + (IsLessThanNthGenerationAncestorOfDefaultPerson): Add new filter rule. + +2005-11-25 Don Allingham + * src/gramps.glade: enable word wrap on publication information + on the source display + +2005-11-25 Martin Hawlisch + * src/GenericFilter.py (HasCommonAncestorWith): Catch no longer + existing person; (IsSpouseOfFilterMatch) Call prepare for recursive + filter + +2005-11-24 Don Allingham + * src/po/template.po: updated translation file + +2005-11-24 Alex Roitman + * NEWS: Update. + * src/docgen/HtmlDoc.py (build_style_declaration): Use top- and + bottom- margins for paragraph styles. + +2005-11-23 Don Allingham + * src/docgen/KwordDoc.py: fix margins and fonts. + +2005-11-23 Wayne Bergeron + * src/GenericFilter.py (IsLessThanNthGenerationAncestorOfBookmarked): + Add new filter rule. + +2005-11-23 Alex Roitman + * src/ArgHandler.py (cl_export): Add grdb export from the CLI. + * src/plugins/Check.py (check_parent_relationships): Step through + the progress bar. + * test/runtest.sh: Add txt format and family_group report. + * test/impex.sh: Add import/export test set. + * example/gramps/example.gramps: Correct errors. + * src/BaseDoc.py (SheetParser.startElement): Tolerate missing + tmargin and bmargin (when reading older style files). + * src/docgen/PSDrawDoc.py (encode): Add tolerant encoder; + (patch_text): Remove unused method. + * src/docgen/AsciiDoc.py (reformat_para): Add optional argument + for the first line indent; (start_paragraph): remove leader + handling; (end_paragraph): Handle all formatting, including leader + and first line indent. + * src/plugins/Checkpoint.py (rcs): Do not write comment on + initialization. + * test/tools.sh: Add test set for tools. + +2005-11-22 Don Allingham + * src/docgen/AbiWord2Doc.py: fix spacing for top and bottom margin + * src/ArgHandler.py: fix typo + * src/docgen/PSDrawDoc.py: removed print statements + * src/plugins/DetDescendantReport.py: fixed insert_image + * src/ReadGedcom.py: Fix handling of CONT + +2005-11-22 Alex Roitman + * src/plugins/DetDescendantReport.py (write_write_children): + Properly check for henry number; (write_mate): omit children list. + * src/Report.py: Better packing in vertical direction. + * test/runtest.sh: Switch to doing many reports in one call. + +2005-11-22 Don Allingham + * src/plugins/NavWebPage.py: Fix output_notebook remains. + +2005-11-22 Martin Hawlisch + * src/AddrEdit.py, + * src/AttrEdit.py, + * src/EditPerson.py, + * src/EditPlace.py, + * src/EventEdit.py, + * src/FamilyView.py, + * src/MediaView.py, + * src/NameEdit.py, + * src/Sources.py: Better support for readonly DB; + * src/ImageSelect.py: Better support for readonly DB; + dont crash if mimetype could not get retrieved + * src/Marriage.py: Better support for readonly DB; + Avoid Traceback on DnD in empty list + +2005-11-21 Don Allingham + * src/ReadGedcom.py: Properly handle TEXT field in SOUR instances when + undefined or unhandled fields are present + +2005-11-21 Martin Hawlisch + * src/MediaView.py (media_update): Redisplay the media object at the top + * src/FamilyView.py (drag_data_get): Avoid Traceback when dragging from empty list + * src/gramps_main.py (read_file): More changes to unicode filename support + +2005-11-20 Don Allingham + * src/Report.py: shortened report dialog by making the Paper + Options a tab of the rest of the options + * src/plugins/AncestorReport.py: fix paragraph spacing + * src/plugins/Check.py: handle None for family + * src/plugins/DescendReport.py: fix paragraph spacing + * src/plugins/IndivComplete.py: fix paragraph spacing + +2005-11-20 Martin Hawlisch + * src/plugins/FilterEditor.py: Corrected plugin registration + * src/GrampsCfg.py: Add validation for GRAMPS ID prefixes + +2005-11-19 Don Allingham + * src/WriteGedcom.py: add space between given and surname in output. + * src/ReadGedcom.py: encoding list change + * src/DateParser.py: match end of string for regex matching + +2005-11-18 Martin Hawlisch + * src/Utils.py (find_file): new method that tries to check the + existance of a file by trying out multiple encoding variants for + the filename. + * src/ImgManip.py (get_thumbnail_image): Use Utils.find_file to fix + encoding problems, additionally catch OSError + * src/ImageSelect.py (on_name_changed): Use Utils.find_file + * src/AddMedia.py (on_name_changed): Use Utils.find_file + * src/plugins/Check.py (encoding) dont encode a utf-8 string as again, + (cleanup_missing_photos) Use Utils.find_file to fix encoding problems + * src/Utils.py (find_folder): new method + * src/gramps_main.py: Use Utils.find_file and Utils.find_folder to + enable using unicode names for gramps databases + +2005-11-17 Martin Hawlisch + * src/gramps.glade, + src/TipOfDay.py: Add window title + +2005-11-16 Don Allingham + * src/DisplayModels.py: try to handle encoding errors + * src/ImageSelect.py: call fix_encoding to handle path names + * src/Utils.py: provide a routine to attempt to fix encoding of + str values + * src/plugins/Check.py: repair bad filenames + +2005-11-16 Eero Tamminen + * src/po/fi.po: Translation update to latest template, + finetune keyboard shortcuts. + +2005-11-13 Alex Roitman + * src/docgen/PdfDoc.py: Proper indentation for the first line with + and without bullets. + +2005-11-12 Don Allingham + * src/plugins/DetDescendantReport.py: add support for Henry + numbers for descendants + +2005-11-12 Alex Roitman + * src/docgen/PdfDoc.py: Minor fixes. + +2005-11-10 Don Allingham + * src/GraphLayout.py: removed, incorporated into DesGraph + * src/Makefile.am: removed GraphLayout.py + * src/Plugins.py: don't enter into menus if not in debug mode + * src/plugins/CmdRef.py: don't enter into menus if not in debug mode + * src/plugins/Eval.py: don't enter into menus if not in debug mode + * src/plugins/Leak.py: don't enter into menus if not in debug mode + * src/plugins/TestcaseGenerator.py: don't enter into menus if not + in debug mode + * src/plugins/DumpGenderStats.py: don't enter into menus if not + * src/AncestorChart.py: Move to unsupported + * src/DesGraph.py: Move to unsupported + * src/AncestorChart2.py: More consistent name + * src/DescendChart.py: More consistent name + +2005-11-10 Alex Roitman + * src/po/nl.po: Typo. + * src/plugins/IndivSummary.py: Move to Unsupported (duplicates + a subset of the IndivComplete report functionality). + * src/plugins/IndivComplete.py: Add author. + +2005-11-10 Don Allingham + * src/DisplayModels.py: fix datalist[0] problem running with accessbility enabled + * doc/xmldocs.make: fix for GNOME 2.12 help path + * doc/gramps-manual/C/gramps-manual-C.omf: fix for GNOME 2.12 help path. + +2005-11-10 Julio Sanchez + * src/plugins/rel_es.py: More detail for some relationships + * src/ImageSelect.py: Recompute mime type in case of path change + * src/ReadGedcom.py: fix window object name + +2005-11-09 Don Allingham + * src/plugins/DetAncestralReport.py: fix spacing + * src/Report.py: use filechooser for report dialog + * src/ReportUtils.py: use a single photo for image display + +2005-11-09 Alex Roitman + * src/docgen/LPRDoc.py: Use paragraph padding correctly. + * src/BaseDoc.py: Support space above/below paragraph. + * src/StyleEditor.py: Support space above/below paragraph. + * src/gramps.glade: Support space above/below paragraph. + * src/Report.py: Minor tweaks for file selection. + * src/docgen//OpenOfficeDoc.py: Correct output for spacing. + * src/docgen/LPRDoc.py: Properly use space above/below. + * src/docgen/LPRDoc.py: Support post-leader directive. + * src/docgen/LPRDoc.py: Remove extra line after the paragraph. + * NEWS: Update. + * example/gramps/*: Add new example data. + +2005-11-09 Martin Hawlisch + * src/DbPrompter.py (DbPrompter): Use Combo to list multiple rcecent files + * src/gramps.glade: Use Combo to list multiple rcecent files + +2005-11-08 Martin Hawlisch + * src/DbPrompter.py (DbPrompter): Give possibility to open + the recent file + * src/gramps.glade: Add recent file to DbPrompter + +2005-11-08 Alex Roitman + * src/EditPlace.py: Fix idle for new objects. + * src/EditSource.py: Fix idle for new objects. + * src/ImageSelect.py: Fix idle for new objects. + * src/Report.py (parse_report_options_frame): Do not allow + negative-numbered selection in the filter menu. + * NEWS: Update. + +2005-11-07 Alex Roitman + * src/EditPlace.py: Convert References to the list view. + * src/gramps.glade: Replace TextView with TreeView. + * src/EditSource.py: Support editing Source from References tab. + * src/ImageSelect.py: Support editing objects through References. + +2005-11-07 Martin Hawlisch + * src/gramps_main.py: Fix improper active person handling + +2005-11-06 Alex Roitman + * src/EditSource.py (display_references): Return control if the + events are pending, not every 0.1 sec; Draw references as they + are found instead of deferring. + * src/EditPlace.py (display_references): Make nice. + * src/ImageSelect.py (GlobalMediaProperties.display_refs): Make nice. + + * src/EditSource.py (display_references): Check for elapsed time + and return control to the main loop after 0.1 sec from the idle + callback; convert callback to being able to store its state and + continue from the middle. + +2005-11-05 Alex Roitman + * src/PluginMgr.py: Add the optional argument indicating the + unsupported status to all registrations. + * src/Plugins.py: Reflect unsupported status in menus and trees. + * src/plugins/BookReport.py: Reflect unsupported status. + * src/plugins/WebPage.py, src/plugins/FtmStyleAncestors.py, + src/plugins/FtmStyleDescendants.py: Declare unsupported status. + +2005-11-05 Don Allingham + * src/plugins/*.py: updated email addresses and status + +2005-11-04 Alex Roitman + * src/Witness.py (WitnessEditor.__init__): Typo. + * src/PluginMgr.py: Update all lists properly on any registration; + (purge_failed): Add function. + * src/Plugins.py (Reload.__init__): Purge plugins newly failed on + reload; Regenerate all menus after reload. + * src/gramps_main.py (build_plugin_menus): Add optional argument + indicating rebuild, do not load plugins on rebuild; (load_plugins) + factor out plugin loading routine. + +2005-11-04 Martin Hawlisch + * src/ReportUtils.py (sanitize_person): Restrict Media reference list + * src/plugins/NavWebPage.py: Add many more filtering of private data + +2005-11-02 Alex Roitman + * src/DbPrompter.py: Close database in all cases; close dialogs + prior to that. + +2005-11-02 Don Allingham + * src/plugins/NavWebPage.py: fix surnames/surnames_count problem, + fix intro/home page naming issue + +2005-11-01 Don Allingham + * src/plugins/NavWebPage.py: fix private family records + +2005-10-31 Don Allingham + * src/plugins/NavWebPage.py: use builtin python tarfile module + +2005-10-29 Don Allingham + * src/Sources.py: fix callback (caught by Martin) + +2005-10-28 Alex Roitman + * src/plugins/TimeLine.py: Import strip_context correctly. + * src/plugins/SimpleBookText.py: Import strip_context correctly. + * src/plugins/StatisticsChart.py: Import strip_context correctly. + +2005-10-27 Don Allingham + * src/AddSpouse.py: glade fixes caught by Martin + * src/AttrEdit.py: glade fixes caught by Martin + * src/EditPerson.py: glade fixes caught by Martin + * src/EditPlace.py: glade fixes caught by Martin + * src/Marriage.py: glade fixes caught by Martin + * src/SelectChild.py: glade fixes caught by Martin + +2005-10-26 Alex Roitman + * src/plugins/CmdRef.py (write_ref): Only write itemizedlist if + there is any contents for it. + * doc/gramps-manual/C/cmdplug.xml: Update to a valid docbook. + * doc/gramps-manual/C/usage.xml: Add manual on the Narrative web + page generator. + +2005-10-25 Don Allingham + * src/latin_utf8.py: removed + * src/Makefile.am: remove latin_utf8.py + +2005-10-25 Alex Roitman + * src/ReadGedcom.py (parse_source_reference): Ignore empty QUAY. + +2005-10-24 Don Allingham + * src/GrampsCfg.py: signal_autoconnect changes + * src/ImageSelect.py: signal_autoconnect changes + * src/ReadGedcom.py: signal_autoconnect changes + * src/WriteGedcom.py: signal_autoconnect changes + * src/gedcomimport.glade: signal_autoconnect changes + * src/gramps.glade: signal_autoconnect changes + +2005-10-24 Julio Sanchez + * src/WriteGedcom.py: export more objects, better conformance with + the spec, preserve timestamps on objects + * src/const.py.in: add table of GEDCOM tags that take a value on the + * src/ImageSelect.py: signal fix + +2005-10-23 Don Allingham + * src/ReadGedcom.py: handle progress bar + * src/gedcomimport.glade: add progress bar and expanders + +2005-10-24 Julio Sanchez + * src/AddSpouse.py: signal fix + * src/EventEdit.py: signal fix + +2005-10-22 Don Allingham + * src/AddMedia.py: signal_autoconnect changes + * src/AddSpouse.py: signal_autoconnect changes + * src/AttrEdit.py: signal_autoconnect changes + * src/Bookmarks.py: signal_autoconnect changes + * src/ChooseParents.py: signal_autoconnect changes + * src/DateEdit.py: signal_autoconnect changes + * src/EventEdit.py: signal_autoconnect changes + * src/Exporter.py: signal_autoconnect changes + * src/GenericFilter.py: signal_autoconnect changes + * src/ImageSelect.py: signal_autoconnect changes + * src/LocEdit.py: signal_autoconnect changes + * src/Marriage.py: signal_autoconnect changes + * src/MediaView.py: signal_autoconnect changes + * src/NameEdit.py: signal_autoconnect changes + * src/SelectChild.py: signal_autoconnect changes + * src/Sources.py: signal_autoconnect changes + * src/TransUtils.py: signal_autoconnect changes + * src/UrlEdit.py: signal_autoconnect changes + * src/Utils.py: signal_autoconnect changes + * src/Witness.py: signal_autoconnect changes + * src/gramps.glade: signal_autoconnect changes + +2005-10-22 Julio Sanchez + * src/WriteGedcom.py: Media objects for families, preparation for + media objects for other entities + +2005-10-20 Don Allingham + * src/plugins/DetDescendantReport.py: bring in line with + DetAncestralReport + * src/plugins/DetAncestralReport.py: remove firstname option + +2005-10-19 Don Allingham + * src/plugins/DetAncestralReport.py: fix child strings + * src/GrampsBSDDB.py: use cursors to rebuild secondary indices. + * src/Sources.py: fix typo on gladeif call + +2005-10-19 Stefan Bjork + * src/po/sv.po: Updates. + +2005-10-19 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: More randomisation; new test options + * src/RelLib.py (Source.get_text_data_list): Add missing fields + * src/AttrEdit.py: escape xml-specialchars because of use_markup + * src/EditPerson.py: escape xml-specialchars because of use_markup + * src/EventEdit.py: escape xml-specialchars because of use_markup + * src/Marriage.py: escape xml-specialchars because of use_markup + * src/NameEdit.py: escape xml-specialchars because of use_markup + * src/PedView.py: escape xml-specialchars because of use_markup + * src/UrlEdit.py: escape xml-specialchars because of use_markup + +2005-10-18 Don Allingham + * src/Report.py: bumped the maximum generations to 999 from 31 + +2005-10-18 Martin Hawlisch + * src/plugins/NavWebPage.py: Support side-by-side gallery images + * src/data/main*.css: Support side-by-side gallery images + +2005-10-18 Alex Roitman + * src/plugins/CmdRef.py: Use withing the . + * doc/graps-manual/C/cmdplug.xml: Update. + +2005-10-17 Don Allingham + * src/gedcomimport.glade: use expanders for information and + warning windows. + * src/AddSpouse.py: remove signal_autoconnect + * src/DisplayTrace.py: remove signal_autoconnect + * src/EditSource.py: remove signal_autoconnect + * src/ReadGedcom.py: two pass approach for handling forward + refererencing notes, less obscure names + * src/gramps.glade: remove signal mappings + * src/plugins.glade: remove signal mappings + +2005-10-18 Julio Sanchez + * src/WriteGedcom.py: Add description and notes for media objects + +2005-10-17 Stefan Bjork + * src/po/template.po: Broken and recreated. + +2005-10-16 Alex Roitman + * doc/gramps-manual/*/gramps-manual-*.omf: Update. + +2005-10-14 Don Allingham + * src/EditPerson.py: remove signal_autoconnect to fix glade + memory leak + * src/EditPlace.py: remove signal_autoconnect to fix glade + memory leak + * src/GenericFilter.py: use TransUtils.py + * src/Makefile.am: add TransUtils.py and WindowUtils.py + * src/Marriage.py: remove signal_autoconnect to fix glade + memory leak + * src/Sources.py: remove signal_autoconnect to fix glade + memory leak + * src/Spell.py: import gettext + * src/Relationship.py: use TransUtils.py + * src/TransUtils.py: added to remove cyclic import + * src/WindowUtils.py: glade/signal interface class + +2005-10-14 Alex Roitman + * src/Date.py (is_empty): Consider non-text-only date with + empty numerical fields an empty date. + * src/gramps.glade: Use spinbuttons for selection coords in the + media reference dialog. + * src/ImageSelect.py (LocalMediaProperties): Support selection. + +2005-10-14 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: Randomize SourceRefs; + Add unicode test + +2005-10-14 Julio Sanchez + * src/ChooseParents.py: give unknown sex to the new parent, so that + guessing works + +2005-10-13 Don Allingham + * various: add explict calls to garbage collection + +2005-10-13 Alex Roitman + * example/gramps/data.gramps: Update example data to conform with + the format changes and the DTD. + * doc/grampsxml.dtd, doc/grampsxml.rng: Update. + * src/WriteXML.py (write_xml_data): Use ISO date in the created + attribute; (get_iso_date): Return empty string on empty date; + (write_date): Write quality attributes, if any. + * src/ReadXML.py (start_daterange,start_dateval): Parse quality + attributes. + +2005-10-13 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: Randomize more; Add LDS events + +2005-10-12 Don Allingham + * src/plugins/NavWebPage.py: option for choosing the ancestor graph + +2005-10-12 Alex Roitman + * doc/grampsxml.rng: Add to CVS. + * doc/grampsxml.dtd: Typo. + +2005-10-12 Don Allingham + * src/data/main*.css: improved css styles for ancestor graphs + * src/plugins/NavWebPage.py: 4 generation ancestor graph + * src/ReportUtils.py: handle "unknown_gender_name" in parameter arrays + +2005-10-11 Don Allingham + * src/plugins/NavWebPage.py: first pass at ancestor map + * src/data/main*.css: ancestor css styles + * src/EditPerson.py: handle adding death/birth record correctly + +2005-10-11 Alex Roitman + * src/plugins/GraphViz.py: Typos. + +2005-10-11 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: Add some date events + +2005-10-10 Don Allingham + * src/GrampsDBCallback.py: doc changes + * src/NameDisplay.py: remove nickname support + * src/QuestionDialog.py: handle missing icons for pychecker + * src/Report.py: set a default size for the window (600) + * src/ReportUtils.py: doc changes, add common_name + * src/plugins/DetAncestralReport.py: + * src/Date.py: set default modifier properly, fix compare and sortval + assignment + * src/RelLib.py: fix source reference date comparison + +2005-10-09 Julio Sanchez + * src/WriteGedcom.py: fixed error caused by incomplete migration to + handle-based storage API + +2005-10-09 Don Allingham + * src/Spell.py: give more intelligent error message if spelling + checker is not found. + * src/plugins/DescendChart.py: fixed type detection to handle both + unicode and str. + * src/plugins/NavWebPage.py: fixed typo in Creative Commons messages + +2005-10-08 Don Allingham + * src/Bookmarks.py: use GrampsDisplay for help + * src/MergeData.py: use GrampsDisplay for help + * src/MergePeople.py: use GrampsDisplay for help + +2005-10-07 Alex Roitman + * doc/grampsxml.dtd: Fix order, add missing contents. + +2005-10-07 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: Feed in more data + +2005-10-07 Alex Roitman + * doc/gramps-manual/C/cmdplug.xml: Add new section documenting + plugin options (Reports and Tools). + * src/build_cmdplug: Add script to refresh the new doc section. + * doc/gramps-manual/C/Makefile.am: Ship new file. + * doc/gramps-manual/C/gramps-manual.xml: Define new entity. + * doc/gramps-manual/C/cmdline.xml: Include new section. + * src/Makefile.am: Define new make target (cmdplug). + * src/PluginMgr.py: Include human-readable names in CLI plugins + registration. + * src/Report.py: Allow instantiation of command-line report + without adding item-specific options. + * src/Tool.py: Allow instantiation of command-line tool + without adding item-specific options. + * src/plugins/CmdRef.py: Add options for inclusion into the manual + and the target filename; Use human-readable names for titles; Add + section with common options; Add name option. + +2005-10-06 Don Allingham + * src/plugins/DetAncestralReport.py: fix margin on note paragraph + * src/DateEdit.py: try using standard icons + +2005-10-06 Alex Roitman + * src/plugins/CmdRef.py: Work out Report docs. + * src/Report.py: Typo. + + * src/WriteXML.py: Switch from preferred to alt name attribute. + * doc/grampsxml.dtd: Update. + * src/ReadXML.py: Bring in sync with format changes. + +2005-10-06 Martin Hawlisch + * src/plugins/CmdRef.py: New file. + +2005-10-06 Don Allingham + * src/docgen/AbiWord2Doc.py: handle superscript properly + * src/ReportUtils.py: remove name generation from list_person_str + * src/plugins/DetAncestralReport.py: fix child list, use roman numerals + +2005-10-06 Alex Roitman + * src/TreeTips.py: Typo. + * src/plugins/ScratchPad.py: Convert to new API. + * src/plugins/DumpGenderStats.py: Convert to new API. + * src/ArgHandler.py: Do actions prior to exports. + * doc/gramps.1.in: Document new execution order. + +2005-10-06 Stefan Bjork + * src/plugins/rel_sv.py: Obviosly, level=1 to get_parents means + parents, not level=0. + * src/po/sv.po: Updates and changes. + +2005-10-05 Don Allingham + * src/GrampsDisplay.py: move gnome help and url control into this + module + * various: switch from direct gnome calls to GrampsDisplay calls + * src/TreeTips.py: don't register type if pygtk > 2.8.0 + +2005-10-05 Alex Roitman + * doc/grampsxml.dtd: Add to CVS (replaces gramps.dtd). + * src/WriteXML.py: Bring in sync with the DTD: + + add PUBLIC declaration of the DTD file + + remove db stats as attributes of the database element + + prepend all handles and hlinks with "_" (conform to XML ID) + + replace "aka" with "name", "name" with "name preferred=1" + * src/Plugins.py: Factor out common code for plugins; fix tool + dialog; Convert plugin reloading tool to new API. + +2005-10-05 Julio Sanchez + * src/plugins/ReorderIds.py: handle more cases correctly + +2005-10-04 Alex Roitman + * src/plugins/PatchNames.py: Convert to new API. + * src/plugins/RelCalc.py: Convert to new API. + * src/plugins/ReorderIds.py: Convert to new API. + * src/plugins/SoundGen.py: Convert to new API. + * src/plugins/Rebuild.py: Convert to new API. + +2005-10-04 Don Allingham + * src/DateParser.py: handle non-matching dates as strings properly + +2005-10-04 Stefan Bjork + * src/dates/Date_sv.py: Fixes. No differences from english version + on test data. + +2005-10-03 Alex Roitman + * src/plugins/EventCmp.py: Convert to new API. + * src/plugins/Merge.py: Convert to new API. + +2005-10-03 Don Allingham + * src/Utils.py: grab the first word of a command line string + * src/plugins/DetAncestralReport.py: work on spouse information + +2005-10-02 Don Allingham + * src/ReportUtils.py: add pronoun/name support to child strings + * src/plugin/DetAncestralReport.py: Add support for ReportUtils + * src/plugin/DetDescendantReport.py: Add support for ReportUtils + * src/plugins/ImportGenweb.py: fix date handling to support + date ranges and date modifiers. + +2005-10-02 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: corrected options help dict + +2005-10-01 Alex Roitman + * src/plugins/Verify.py: Convert to new API. + * src/plugins/verify.glade: Use separate windows for errors and + warnings. + * src/plugins/Check.py: Convert to new API. + * src/plugins/DesGraph.py: Use correct constant. + * src/plugins/Eval.py: Convert to new API. + * src/plugins/Leak.py: Convert to new API. + +2005-09-30 Alex Roitman + * src/docgen/KwordDoc.py: Remove unused latin_utf8 import. + * src/plugins/FilterEditor.py: Convert to new API. + * src/plugins/DesBrowse.py: Convert to new API. + +2005-09-29 Don Allingham + * src/docgen/AbiWord2Doc.py: fix latin encoding issues + * src/docgen/KwordDoc.py: fix latin encoding issues + * src/docgen/OpenSpreadSheet.py: fix latin encoding issues + * src/plugins/GraphViz.py: fix latin encoding issues + * src/plugins/DetAncestralReport.py: Fixed generation string + * src/plugins/DetDescendantReport.py: Fixed generation string + +2005-09-29 Martin Hawlisch + * src/plugins/ExportVCalendar.py: Removed unused code + * src/plugins/ExportVCard.py: Removed unused code + * src/plugins/ImportGeneWeb.py: Removed unused code + * src/plugins/ImportvCard.py: Removed unused code + * src/plugins/TestcaseGenerator.py: Removed unused code + * src/plugins/WriteGeneWeb.py: Removed unused code + +2005-09-29 Don Allingham + * src/WriteGedcom.py: handle broken family + * src/ReportUtils.py: fix born_str to not depend on death date + * example/gedcom/sample.ged: remove broken refererence (I01) + +2005-09-29 Martin Hawlisch + * src/plugins/ImportGeneWeb.py: convert witout using latin_utf8.py + * src/plugins/ImportvCard.py: remove unused latin_utf8.py include + * src/plugins/TestcaseGenerator.py: remove unused latin_utf8.py include + +2005-09-28 Don Allingham + * src/NameDisplay.py: Add display_formal + * src/Report.py: remove generation strings + * src/docgen/OpenOfficeDoc.py: Fix leading space after tab. + * src/plugins/AncestorReport.py: Use ReportUtils strings + instead of local strings + +2005-09-28 Eero Tamminen + * src/po/fi.po: Translation update for 2.0.9. + +2005-09-28 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: Use new tool/option api + +2005-09-27 Don Allingham + * src/ReadXML.py: store then restore read only flag on load + +2005-09-26 Alex Roitman + * all reports: switch categories from const to Report module. + * src/const.py.in: Remove report and tool categories. + * src/Plugins.py: Switch report and tool category constants. + * src/PluginMgr.py: Switch report and tool category constants. + * src/Report.py, src/Tool.py: Move constants. + * src/plugins/ChangeNames.py, src/plugins/ChangeTypes.py, + src/plugins/Checkpoint.py: switch category constants. + +2005-09-26 Don Allingham + * src/docgen/PSDrawDoc.py: locale independent floating point + * src/DateDisplay.py: Better french republican date handling + * src/DateParser.py: Better french republican date handling + +2005-09-26 Alex Roitman + * src/plugins/ChangeNames.py: Convert to the new scheme. + * src/plugins/Checkpoint.py: Convert to new scheme, improve. + * src/plugins/checkpoint.glade: Add to CVS. + * src/plugins/Makefile.am: Ship new glade file. + +2005-09-25 Stefan Bjork + * src/po/sv.po: up to date with 2.0.9 + * src/date/Date_sv.py: date parser/displayer for swedish locale + * src/date/Makefile.am: include Date_sv.py + +2005-09-24 Don Allingham + * src/data/tips.xml: removed the tip mentioning column sorting + in people view. + * src/latin_utf8.py: removed + * src/ReadGedcom.py: added latin_utf8 functions + * src/Spell.py: better error checking on import + +2005-09-23 Don Allingham + * doc/gramps-manual/C/faq.xml: more updates + * doc/gramps-manual/C/getstart.xml: more updates + * doc/gramps-manual/C/gramps-manual.xml: more updates + * doc/gramps-manual/C/mainwin.xml: more updates + * doc/gramps-manual/C/usage.xml: more updates + +2005-09-24 Don Allingham + * src/WriteGedcom.py: handle patronymics + +2005-09-24 Martin Hawlisch + * src/GrampsDbBase.py: Properly validate ID prefix strings + +2005-09-23 Alex Roitman + Merge changes done in the TOOL_OPT branch as follows: + * src/Tool.py: Add to CVS: Generic tool interface. + * src/ArgHandler.py: Support command line mode for tools. + * src/PluginMgr.py: New tool registration scheme. + * src/Plugins.py: Convert to tool registration scheme. + * src/const.py.in: Add tool categories. + * src/plugins/ChangeTypes.py: Convert to new scheme. + * src/Options.py: Add to CVS: generic options interface. + * src/ReportOptions.py: Keep only report-specific option + handling. + * src/Makefile.am: Ship new files. + +2005-09-23 Alex Roitman + * src/plugins/Checkpoint.py: Minor improvements for the RCS. + * src/plugins/Makefile.am: Ship Checkpoint.py. + +2005-09-22 Don Allingham + * doc/gramps-manual/C/*.xml + +2005-09-21 Don Allingham + * src/ReportUtils.py: More UNKNOWN gender handling, and more + complete burial strings + * src/plugins/DetAncestralReport.py: defer pronoun handling to + ReportUtils + * src/plugins/DetDescendantReport.py: defer pronoun handling to + ReportUtils + +2005-09-21 Alex Roitman + * src/ReportUtils.py: Add UNKNOWN gender case throughout. + +2005-09-21 Martin Hawlisch + * src/dates/Date_de.py: Fix month name + +2005-09-21 Don Allingham + * src/ChooseParents.py: fix unbound variable when neither parents + exist. + * src/plugins/DetAncestralReport.py: fix endnotes for null sources + * src/plugins/DetDescendantReport.py: fix endnotes for null sources + * src/plugins/FtmStyleAncestors.py: fix endnotes for null sources + * src/ReportUtils.py: fix typo + * src/plugins/NavWebPage.py: handle contact page issues, including + random commas and missing image. + +2005-09-20 Don Allingham + * src/ImgManip.py: update thumbnail if out of date + +2005-09-20 Alex Roitman + * INSTALL: Provide correct examples for the local install. + * gramps.sh.in: Revert escaping the arguments, as this lumps all + the args into a single word. If filenames contain spaces then they + should be escaped by the user. + * src/plugins/DetAncestralReport.py (write_person,write_children): + Remove boldface, since it should be handled by the style; + (make_default_style): handle boldface heading by the style. + * src/plugins/DetDescendantReport.py (write_person, + write_children): Remove boldface, since it should be handled by + the style; (make_default_style): handle boldface heading by the + style. + +2005-09-19 Don Allingham + * src/ReportUtils.py: better string handling + * doc/gramps-manual/C/getstart.xml: updates from editors + * doc/gramps-manual/C/mainwin.xml: updates from editors + * doc/gramps-manual/C/usage.xml: updates from editors + 2005-09-16 Don Allingham * src/DisplayState.py: remove relationship display stuff for the time being. @@ -25,15 +884,234 @@ * src/Utils.py: Add marker types * src/edit_person.glade: Change complete flag into marker combo +2005-09-15 Don Allingham + * src/DescendReport.py: fix indentation + 2005-09-15 Don Allingham * src/EditPlace.py: fix windowing history +2005-09-14 Don Allingham + * src/CalSdn.py: fix Hebrew date parsing + * src/DescendReport.py: enhanced to add spouses and places + * src/ReadGedcom.py: fix forward referencing named notes + +2005-09-12 Don Allingham + * src/NameEdit.py: preserve custom name types + * src/plugins/ScratchPad.py: handle unicode better + * src/DdTargets.py: handle unicode better + +2005-09-11 Don Allingham + * src/NameDisplay: include nickname if available + * src/plugins/ScratchPad.py: Handle null handle + +2005-09-10 Don Allingham + * src/ImageSelect.py: fix adding a new image that is actually + already in the database. + +2005-09-06 Don Allingham + * src/plugins/NavWebPage.py: suppress dates on list pages for restricted + people + * doc/gramps-manual/C/getstart.xml: text and graphics improvements + * doc/gramps-manual/C/mainwin.xml: text and graphics improvements + * doc/gramps-manual/C/usage.xml: text and graphics improvements + +2005-09-05 Eero Tamminen + * src/plugins/StatisticsChart.py: string changes + "Number of relationship" -> "Number of relationships" (fix) + "Marriage age" -> "Age at marriage" (consistency) + +2005-09-05 Don Allingham + * NEWS: update for 2.0.8 + * src/data/Makefile.am: install main6.css + * src/plugins/NavWebPage.py: Catch exception if thumbnailer fails. + +2005-09-05 Eero Tamminen + * src/DateParser.py: Fixed what I broke + +2005-09-04 Don Allingham + * NEWS: update for 2.0.7 release + * src/DateDisplay.py: handle BCE better + * src/ReadXML.py: read the patronymic portion of a name properly. + +2005-09-04 Eero Tamminen + * src/DateParser.py: Added support for modifiers being both + before and after a date + * src/dates/Date_fi.py: Completed first version of Finnish + date handling + * src/dates/Makefile.am: Install Date_fi.py + +2005-09-03 Don Allingham + * src/GraphLayout.py: use recursion limit to detect db loops + * src/Utils.py: use recursion limit to detect db loops + +2005-09-03 Julio Sanchez + * src/po/es.po: Translation update + +2005-09-02 Don Allingham + * src/GrampsBSDDB.py: fixed unicode/str problem + * doc/gramps-manual/C/preface.xml: wording fixes. + * doc/gramps-manual/C/mainwin.xml: wording fixes. + +2005-09-01 Don Allingham + * src/docgen/OpenOfficeDoc.py: fix font point size handling + * src/Plugins.py: sort submenu entries properly + * src/PeopleView.py: replace unique string with one already translated + * src/gramps_main.py: replace unique string with one already translated + * src/plugins/Ancestors.py: replace unique string with one already translated + * src/plugins/Eval.py: replace unique string with one already translated + * src/plugins/WriteCD.py: replace unique string with one already translated + * src/po/check_po: produce a sorted list of used text strings, + split strings better + * src/ImageSelect.py: Local edit of a media Note type now + brings up the Note editor instead of the media editor. + * src/plugins/Verify.py: don't complain about difference in + ages between spouses if birth year is unknown. + +2005-09-01 Martin Hawlisch + * src/po/check_po: Support for multiple files as command line + arguments; untranslated strings dont need mismatch tests + +2005-08-31 Don Allingham + * src/plugins/RelCalc.py: use PeopleModel instead of ListModel, + check to the person being compared to him/herself + * src/plugins/relcalc.glade: increase the width of the window. + * src/Report.py: Catch thrown Database error + * src/GraphLayout.py: catch database loops + * src/po/de.po: fix %()s mismatches + * src/po/ru.po: fix %()s mismatches + * src/po/check_po: utility to look for problems in .po files + +2005-08-31 Eero Tamminen + * src/po/fi.po: Translation update for 2.0.7. + +2005-08-31 Don Allingham + * src/PedView.py: force an update of the cached person + * src/gramps_main.py: force an update of the cached person + * src/ReadGedcom.py: handle attributes if value is on the same line as the + keyword + +2005-08-31 Martin Hawlisch + * src/ReportUtils.py (insert_images): Warn about non existing files + +2005-08-30 Alex Roitman + * src/po/ru.po: Translation update for 2.0.7. + +2005-08-30 Don Allingham + * src/po/de.po: fixed parameter arguments + * doc/gramps-manual/C/getstart.xml: fixed spelling + * doc/gramps-manual/C/mainwin.xml: fixed spelling + * src/Errors.py: Add a DatabaseError type + * src/Utils.py: detect database loops in descendants_too_old + * src/WriteGedcom.py: report error message when database loop is detected + * src/po/template.po: added new error message. May be too late for some + translations to get this message. + * src/ImageSelect.py: specify mime type to get_thumbnail_image + * src/ImgManip.py: make thumbnailing routine more generic + * src/SelectObject.py: specify mime type to get_thumbnail_image + * src/plugins/NavWebpage.py: produce larger preview images for media + pages if a thumbnailer exists + * src/plugins/SimpleBookTitle.py: specify mime type to get_thumbnail_image + +2005-08-30 Martin Hawlisch + * src/plugins/NavWebPage.py: Encode using 'xmlcharrefreplace' + * src/plugins/WriteGeneWeb.py: Remove empty families before running + the export. this gives now an error instead of writing an empty file; + Encode using 'xmlcharrefreplace' + +2005-08-29 Don Allingham + * src/GenericFilter.py: fixed "only one" filter rule, and matching + the descendents of a filter + * src/SelectObject.py: Fix sorting order for title + * src/plugins/WriteGeneWeb.py: use 'replace' for 'iso-8859-1' encoding + * src/po/fr.po: fix named parameter + * src/ImageSelect.py: fix note media object added from a gallery + * src/po/template.po: updated translation template + * src/Utils.py: fix probably_alive to handle year offset properly + * src/plugins/NavWebPage.py: handle new probably_alive function + +2005-08-29 Martin Hawlisch + * src/plugins/NavWebPage.py: Correct link to Surname list page; + Better handling for not existing media object files and note-only + objects; thxumbnails are always png images + * src/plugins/Check.py: Files of note-only objects are no longer + reported as missing + +2005-08-28 Don Allingham + * src/plugins/NavWebPage.py: handle resticted living people + better, producing name and relationships instead of just Private. + * src/plugins/AncestorChart2.py: add support for %n style + of keyword substitution + +2005-08-27 Don Allingham + * src/data/Makefile.am: install document.png + * src/plugins/Makefile.am: install DescendChart.py + +2005-08-26 Don Allingham + * src/data/document.png: added + +2005-08-26 Martin Hawlisch + * src/plugins/TestcaseGenerator.py: Changed param handling; + add more tests; make names shorter and configurable + * src/GrampsDbBase.py: Print transaction if GRAMPS_SIGNAL=1 + +2005-08-26 Don Allingham + * src/plugins/DescendChart.py: Fix spacing and line drawing, + added maximum number of generations, fixed shadow scaling + 2005-08-25 Martin Hawlisch * src/gramps_main.py: pass DisplayState to TipOfDay * src/TipOfDay.py: Use DisplayState * src/const.py.in: add GRAMPS websites * src/ViewManager.py: Add TipOfDay; Make GRAMPS websites work again +2005-08-25 Don Allingham + * src/SubstKeywords: Add new % options + * src/plugins/DescendChart.py: New descendant wall chart report + +2005-08-25 Martin Hawlisch + * src/SelectChild.py (on_save_child_clicke): Dont add the same person + multiple times as child + * src/gramps_main.py (delete_person_response): Purge empty family + after the last child of a single-spouse family was deleted. + +2005-08-24 Don Allingham + * src/ImgManip.py: convert to png instead of jpeg + * src/ReadGedcom.py: try to catch bad secondary index error. + * src/ReportUtils.py: provide privacy sanitation on a list + * src/NavWebPage.py: better handling of thumbnails, allow gallery + page to be disabled + +2005-08-24 Martin Hawlisch + * src/ImgManip.py: import Utils (required by get_thumbnail_image) + +2005-08-18 Mark Knoop + * src/data/main6.css: new "Sharp" style sheet + +2005-08-23 Don Allingham + * gramps.sh.in: escape the arguments to prevent spaces in + filenames to be parsed as to seperate arguments + * src/ImageSelect.py: pass the mime_type to the thumbnail generator + * src/ImgManip.py: query the gconf database to find appropriate + thumbnail generators + * src/NameDisplay.py: don't force a comma if the last name does + not exist + * src/WriteGedcom.py: don't copy a file on top of itself + * src/plugins/Ancestors.py: verify the existance of a file + * src/plugins/NavWebPage.py: don't use HOME page if it would be + empty + +2005-08-23 Tim Allen + * src/plugins/Ancestors.py: fix pagebreak and borders around image + +2005-08-22 Martin Hawlisch + * src/plugins/ExportVCard.py (write_person): Fix typo + +2005-08-21 Don Allingham + * src/ImgManip.py: add support for PDF thumbnailing + * src/plugins/NavWebPage.py: Always use two levels instead of + one level of subdirectories, use subdirectories for thumbnails + and media objects + 2005-08-19 Don Allingham * src/DisplayState.py: fixe some window management syntax errros * src/PageView.py: enable double click to edit @@ -59,6 +1137,46 @@ * src/PageView.py: added basic tooltip support * src/PeopleModel.py: added basic tooltip support +2005-08-19 Don Allingham + * src/NameDisplay.py: handle patronymic names in given name + * src/plugins/NavWebPage.py: handle patronymic names in given name + * src/GenericFilter.py: fix unicode problem with menu store + +2005-08-18 Don Allingham + * src/plugins/NavWebPage.py: code clean up + * src/AddSpouse.py: remove unnecessary commit via add_family + +2005-08-18 Mark Knoop + * src/NavWebPage.py: move more HTML commands to CSS + * src/data/main*.css: add support for HTML control from NavWebPage + +2005-08-18 Martin Hawlisch + * doc/gramps-manual/C/custom.xml: Match against DTD + * doc/gramps-manual/C/usage.xml: Match against DTD + * doc/gramps-manual/C/preface.xml: Match against DTD + +2005-08-17 Don Allingham + * src/plugins/NavWebPage.py: fix source reference links on the + source page, check for bad file name if archive is used. + * src/FamilyView.py: commit person when removed from family + +2005-08-18 Eero Tamminen + * src/GenericFilter.py, src/Marriage.py, src/plugins/TimeLine.py, + src/plugins/SimpleBookTitle.py: add localization context for + "Title" string (needed in Finnish) + * src/ReportUtils.py: Add header option for draw_legend() + * src/plugins/StatisticsChart.py: add headers to legends and + barcharts, change chart type names to singular form, add + support for ProgressMeter, swap bar&text position as text + rightaligning in Gramps is broken (it can't know font metrics) + +2005-08-17 Don Allingham + * src/Marriage.py: fix lds_data_object problem + * src/GrampsDBCallback.py: look for GRAMPS_SIGNAL environment + variable equal to 1 to enable signal debugging + * src/ChooseParents.py: disconnect signals on close, do fewer + commits + 2005-08-17 Alex Roitman * various: merge changes made in gramps20 branch with main trunk. @@ -75,6 +1193,12 @@ * src/plugins/ScratchPad.py: removed * src/plugins/scratchpad.glade: removed +2005-08-17 Richard Taylor + * src/plugins/ExportVCalendar.py: fixed import for localtime, + corrected type of Utils and params to Until.family_name + made "Version" upper case as demanded by Korganiser and + the spec (I think). + 2005-08-17 Richard Taylor * src/EditRepository.py: fixes for lack of parent window handles use of dbstate. Commented out code to bold labels for now as @@ -85,6 +1209,30 @@ * src/RepositoryView.py: fixes for dbstate, commented out remove repos code for now as it does not work. Fixes edit repository call. +2005-08-17 Eero Tamminen + * src/po/fi.po: Fix/improve Finnish translations + +2005-08-16 Don Allingham + * src/plugins/NavWebPage.py: fix paths in surname page + * src/Sources.py: Limit the source title to 40 characters + * src/MergePeople.py: correctly handle selection of first person + * src/MediaView.py: add mediaobj to DND types + * src/plugins/ScratchPad.py: fill out rest of media details (type,value) + * src/EditPerson.py: hide LDS if not requested + * src/Marriage.py: hide LDS if not requested + * src/Spell.py: re-enable + * src/GrampsCfg.py: add support for spell checker + * src/GrampsGconfKeys.py: add support for spell checker + * src/GrampsIniKeys.py: add support for spell checker + * src/gramps.glade: add support for spell checker + * src/data/gramps.schemas: add support for spell checker + +2005-08-15 Alex Roitman + * NEWS: Update. + +2005-08-14 Eero Tamminen + * src/ReadXML.py (start_event): Correctly set event type. + 2005-08-14 Alex Roitman * src/PedView.py (__init__): Define database variable. * src/ViewManager.py (__init__): Define empty pages list. @@ -203,6 +1351,355 @@ * various: remove set_date/get_date removal to be replaced by DateHandler calls +2005-08-08 Eero Tamminen + * src/po/fi.po: Updated translated to latest template + +2005-08-05 Alex Roitman + * src/Spell.py: Make more robust to failure. + * src/Makefile.am: Ship new file. + + * src/EditPerson.py (did_data_change,on_apply_person_clicked): + Convert date text to unicode before parsing. + * src/Spell.py: Comment out to disable spell-checking for 2.0.6. + +2005-08-05 Martin Hawlisch + * src/plugins/Checkpoint.py (rcs): define variable comment before using it. + +2005-08-04 Don Allingham + * src/Spell.py: Interface to gtkspell + * src/AddrEdit.py: add spell checker to notes + * src/AttrEdit.py: add spell checker to notes + * src/EditPerson.py: add spell checker to notes + * src/EditPlace.py: add spell checker to notes + * src/EditSource.py: add spell checker to notes + * src/EventEdit.py: add spell checker to notes + * src/ImageSelect.py: add spell checker to notes + * src/Marriage.py: add spell checker to notes + * src/NameEdit.py: add spell checker to notes + * src/NoteEdit.py: add spell checker to notes + * src/Sources.py: add spell checker to notes + * src/ImageSelect.py: fixed thumbnail dnd selection + * src/AttrEdit.py: don't used reserved word "list" + * src/EditPerson.py: Pass correct attribute list to editor + * src/GrampsBSDDB.py: persistently load/save attribute lists + * src/GrampsDbBase.py: update attributes on commit + * src/Marriage.py: Pass correct attribute list to editor + +2005-08-04 Alex Roitman + * NEWS: Update. + * src/MergePeople.py: Typos. + * src/plugins/NavWebPage.py: Typos. + * src/po/template.po: Update for upcoming 2.0.6. + * src/Report.py (parse_report_options_frame): Fallback to trivial + filter on filter failure. + * src/ArgHandler.py (parse_args): Use mime type to identify gramps + XML data. + * doc/gramps.1.in: Update man page. + * doc/gramps-manual/C/cmdline.xml: Update manual. + * src/po/ru.po: Partial update. + +2005-08-04 Don Allingham + * src/PeopleModel.py: provide a work around for the python 2.3 bug + unicode sorting problem with locale.strcoll. For a nul termination + during sorting, strip it off after sorting. Only used for + python2.3, since this bug was fixed in python 2.4. + +2005-08-03 Don Allingham + * src/NavWebPage.py: use new ProgressMeter, add ability to + not generate a CSS style sheet. + * src/WebPage.py: add deprecation notice + +2005-08-03 Alex Roitman + * src/gramps_main.py (undo): Rebuild bookmarks menu on undo. + * src/plugins/ChangeNames.py: Add ProgressMeter. + * src/plugins/ChangeTypes.;y: Add ProgressMeter. + * src/plugins/Check.py: Mark translatable string. + * src/plugins/EventCmp.py: Add ProgressMeter. + * src/plugins/PatchNames.py: Add ProgressMeter. + +2005-08-03 Don Allingham + * src/GrampsDbBase.py: provide functions for indicating the number + of items in each table + * src/Check.py: Add ProgressMeter calls + * src/Utils.py: Define new ProgressMeter class + * src/GrampsBSDDB.py: call callback for rebuilding secondary indices + * src/plugins/Merge.py: use ProgressMeter + * src/plugins/Rebuild.py: use ProgressMeter + * src/plugins/ReorderIds.py: use ProgressMeter + * src/plugins/Verify.py: use ProgressMeter + +2005-08-02 Alex Roitman + * src/Bookmarks.py: Convert from CList to ListModel and TreeView; + Remove Cancel and OK buttons, Add Close button; make all changes + immediate conforming to the HIG; (remove_people): Add method for + removing people outside bookmark editor (useful for connecting to + signals). + * src/gramps_main.py (on_remove_bookmark): Add handler for + removing deleted people; (__init__): Connect new handler to the + 'person-delete' signal. + +2005-08-02 Don Allingham + * src/NameEdit.py: convert names to unicode + * src/PeopleModel.py: convert names to uncode + * src/DateHandler.py: handle <> for about + * src/plugins/NavWebPage.py: cleanup + * src/EditPerson.py: call new PersonEventEditor + * src/Marriage.py: call new FamilyEventEditor + * src/EditSource.py: call the correct EventEditor + * src/EventEdit.py: Add PersonEventEditor and FamilyEventEditor to + correctly manage event types + * src/GrampsBSDDB.py: use commit_event to handle personal vs. family + event types + * src/GrampsInMem.py: use commit_event to handle personal vs. family + event types + * src/GrampsDbBase.py: use commit_event to handle personal vs. family + event types + * src/ReadXML: use commit_event to handle personal vs. family + event types + * src/ReadGedcom: use commit_event to handle personal vs. family + event types + +2005-08-02 Martin Hawlisch + * src/Bookmarks.py (edit): Dont crash if bookmark list contains + nonexisting person. + * src/gramps_main.py: Disable "add bookmark" menu entry on readonly + database and only enable it in person/family/pedigree view. + +2005-08-01 Don Allingham + * src/NavWebPage.py: fix references to places + * src/WriteGedcom.py: Fix media handling, issue error message + on write failure + +2005-08-01 Martin Hawlisch + * src/gramps_main.py: Use gobject.timeout_add instead of gtk. + +2005-07-31 Alex Roitman + * src/docgen/OpenOfficeDoc.py: Typo. + +2005-07-30 Don Allingham + * src/docgen/OpenOfficeDoc.org: remove ^L and ^Z from output, use + xml.sax.saxutils.escape to handle XML entities + +2005-07-29 Don Allingham + * src/GrampsBSDDB.py: issue complete redraw on name grouping change + * src/Utils.py: use intermediate variable + * src/MergePeople.py: Fix wording of the message. + * src/Report.py: Don't force expansion of widgets + * src/ReportUtils.py: allow restriction of information + * src/plugins/NavWebPage.py: enable living restriction + +2005-07-29 Alex Roitman + * src/GenericFilter.py (GrampsFilterComboBox.get_value): Do not + convert key to unicode. + * src/po/no.po, src/po/nb.po: Typos. + +2005-07-28 Don Allingham + * src/MergePeople.py: prevent attempts to merge a person and his/her + spouse, prevent merging of child and parent. + +2005-07-28 Alex Roitman + * src/plugins/WebPage.py (WebReportOptions.set_new_options): + Define help dictionary to document options. + * src/Report.py (CommandLineReport.init_options): Typo. + * src/Report.py (ReportDialog.on_ok_clicked): Properly return on + correct/change filename choice. + +2005-07-27 Don Allingham + * src/plugins/NavWebPage.py: add user html header and footer + * src/FamilyView.py: try to prevent adding a spouse that has + already been added + * src/ReadXML.py: prevent adding a spouse that has already been + added + * src/plugins/Check.py: remove identical families in family list + +2005-07-26 Alex Roitman + * src/ChooseParents.py (save_parents_clicked): Do not create + family if parent is self. + +2005-07-26 Don Allingham + * src/EditPerson.py: NameDisplay enhancements + * src/FamilyView.py: NameDisplay enhancements + * src/NameDisplay.py: NameDisplay enhancements + * src/NameEdit.py: NameDisplay enhancements + * src/PedView.py: NameDisplay enhancements + * src/PeopleModel.py: NameDisplay enhancements + * src/PeopleView.py: NameDisplay enhancements + * src/RelLib.py: NameDisplay enhancements + * src/Report.py: NameDisplay enhancements + * src/SelectChild.py: NameDisplay enhancements + * src/Witness.py: NameDisplay enhancements + * src/gramps.glade: NameDisplay enhancements + * src/gramps_main.py: NameDisplay enhancements + +2005-07-26 Martin Hawlisch + * src/NavWebPage.py: Catch missing header/footer notes; Add Surname + page that is sorted by the number of persons. + +2005-07-25 Alex Roitman + * src/gramps.glade (editPerson,marriageEditor): Use Title for the + source titles. + +2005-07-24 Don Allingham + * src/MediaView.py: don't indicate missing path for Notes, which + aren't supposed to have a path + * src/ReadGedcom.py: Handle PAF's non-GEDCOM compliant method of + indicating unknown gender. + +2005-07-24 Alex Roitman + * src/plugins/RelCalc.py (__init__): Correctly name column header. + +2005-07-23 Julio Sanchez + * src/plugins/GraphViz.py: Fix computation of landscape dimensions, + especially when generating multiple sheets + +2005-07-22 Don Allingham + * src/ImgManip.py: provide path of a thumbnail + * src/NavWebPage.py: add user defined header/footer, add thumbnails + + * src/dates/Date_es.py: fix translation table for date qualifiers + * src/dates/Date_fr.py: fix translation table for date qualifiers + * src/plugins/DetAncestralReport.py: show events even if they have + neither date nor place + * src/plugins/DetDescendantReport.py: show events even if they have + neither date nor place + +2005-07-22 Martin Hawlisch + * src/plugins/NavWebPage.py: fix typos + +2005-07-21 Don Allingham + * src/data/somerights20.gif: make a local copy of the Create Commons + image + * src/data/Makefile.am: add somerights20.gif + * src/plugins/NavWebPage.py: add birth dates to people, use local + create commons image, add surname pages + +2005-07-20 Don Allingham + * src/plugins/NavWebPage.py: Add support for multiple directory levels to + try to keep the number of files per directory under 254 for optimal ext3 + file performance, add support for copyright. + +2005-07-20 Julio Sanchez + * src/plugins/DetDescendantReport.py: Names, events and sources. + * src/plugins/DetAncestralReport.py (add_user_options): Names, events and sources. + +2005-07-20 Alex Roitman + * configure.in: Put release number back to CVS+date. + * src/po/de.po: Typo. + * src/plugins/Ancestors.py (person): correctly compare handles. + +2005-07-18 Don Allingham + * src/plugins/NavWebPage.py: add media gallery navigation, clean up + * src/data/main*.css: add support for media gallery navigation + +2005-07-18 Martin Hawlisch + * src/plugins/NavWebPage.py: Optimize separation of multiple families; + Print out attributes; Print out family note + +2005-07-17 Don Allingham + * src/ReportUtils.py: fix private name generation + * src/plugins/NavWebPage.py: Add family photos to the gallery, + handle privacy better and filter out private people from the + internal lists + +2005-07-17 Julio Sanchez + * src/Sort.py: Make sure sorting by birthdate handles correctly + missing dates + * src/WriteGedcom.py: Export source references at the global person + level + +2005-07-16 Steve Hall + * src/data/main*.css: fix spacing in CSS files + +2005-07-16 Don Allingham + * src/plugins/NavWebPage.py: split parents and families + * src/ReportUtils.py: save note information + +2005-07-16 Martin Hawlisch + * src/plugins/Makefile.am: Install NavWebPage.py plugin + * src/data/Makefile.am: Install stylesheets for NavWebPage + +2005-07-15 Don Allingham + * src/Reportutils.py: copy source information while sanitizing data + * src/plugins/NavWebPage.py: add source references instead of direct + links to sources + +2005-07-15 Alex Roitman + * src/plugins/NavWebPage.py: Use researcher info from Gramps + session, not from the database. + * src/data/main4.css: Typos. + +2005-07-15 Martin Hawlisch + * src/plugins/NavWebPage.py: Avoid some segfaults; HTML validation fixes; + Show all names of a person; Show all images of person/source and + place; Add plugin version to header; Optimize page titles + * src/Utils.py (find_mime_type_pixbuf): Dont segfault with note only object + * src/SelectObject.py (on_select_row): Dont segfault with note only object + * src/GenericFilter.py: Only load rules that provide the required + number of arguments. + +2005-07-14 Don Allingham + * src/plugins/NavWebPage.py: gallery/media object enhancements, div/span fixes + in HTML, source and place references, individual source pges. + +2005-07-14 Martin Hawlisch + * src/plugins/NavWebPage.py: Added display_note_object and + display_first_image_as_thumbnail to BasePage; PlacePage and + IndividualPage use this now. + Display URL list of Individuals and Places + +2005-07-14 Don Allingham + * src/plugins/NavWebPage.py: wrap content with div, fix encoding problems + +2005-07-13 Don Allingham + * src/Sort.py: don't use upper case, let locale.strcoll figure this + out (correctly) for us + * src/plugins/NavWebPage.py: fix sorting. + * src/data/main*.css: added stylesheets for web page generator + * src/data/Makefile.am: add stylesheets + +2005-07-13 Alex Roitman + * src/GenericFilter.py: Proper test for place in event-based + filters; (Rule.set_list): Add assertion to have the correct number + of arguments; (various): stop testing for number of arguments. + * src/AddSpouse.py (LikelyFilter): Add labels to the filter. + * src/ChooseParents.py (LikelyFilter): Add labels to the filter. + * src/SelectiChild.py (LikelyFilter): Add labesl to the filter. + * src/gramps_main.py (init_filters): Instantiate filters with + correct number of arguments. + +2005-07-13 Don Allingham + * src/GrampsInMemDB.py: add get_event_cursor + * src/GrampsDbBase.py: add get_event_cursor + +2005-07-12 Don Allingham + * src/plugins/NavWebPage.py: handle links properly + * src/plugins/Makefile.am: export Rebuild.py + +2005-07-11 Don Allingham + * src/GrampsBSDDB.py: add repair_secondary task to rebuild + secondary indices + * src/GrampsDbBase.py: add repair_secondary task + * src/plugins/Check.py: move to "Repair Database" category + * src/plugins/Rebuild.py: new plugin to repair secondary indices + +2005-07-11 Alex Roitman + * src/plugins/GraphViz.py (GraphViz.__init__): Define nominal and + reduced margins; (write_report): Use nominal margin to compute + virtual size and reduced margin to write the margin size; + (write_header): Write reduced margin into header. + +2005-07-10 Don Allingham + * src/plugins/NavWebPage.py: enhancements, almost usable + * src/Report.py: fixed spacing + +2005-07-09 Alex Roitman + * src/ReadXML.py (stop_ref): Properly read id-based witness + reference created by old gramps. + +2005-07-09 Julio Sanchez + * src/docgen/OpenOfficeDoc.py: Make the output conform to the DTDs + for OpenOffice.org XML + 2005-07-08 Alex Roitman * various: merge changes made in gramps20 branch with main trunk. @@ -218,6 +1715,21 @@ * src/GenericFilter.py: optimize looping and reducing fetches * src/Utils.py: fix event handle accesses +2005-07-03 Alex Roitman + * src/plugins/GraphViz.py (dump_person): Correctly test for birth + relations. + +2005-07-03 Eero Tamminen + * src/po/fi.po: Updated translated to latest template + +2005-07-02 Alex Roitman + * src/RelLib.py (Family.get_handle_referents): Typo; + (Event.get_handle_referents): Work around possible None for + witness. + * src/plugins/Check.py (check_source_references): Add checking + routine to detect and remove dangling source references. + * configure.in: Bump up the version number. + 2005-06-16 Alex Roitman * src/EventEdit.py: Remove unused variable. @@ -233,6 +1745,53 @@ import, add missing event descriptions * src/RelLib.py: type checking for set_role relationship types +2005-06-24 Martin Hawlisch + * src/PeopleView.py (build_people_context_menu): Workaround to get a + proper german translation. + * srx/po/de.po: Updated + +2005-06-24 Alex Roitman + * src/po/fr.po: Add missing format line parameters. + +2005-06-23 Don Allingham + * src/WriteGedcom.py: Fix GEDCOM date exporting. + +2005-06-23 Alex Roitman + * src/Relationship.py (is_spouse): Use context. + * src/get_strings: Add "__" to default keywords. + * src/po/template.po: Update for 2.0.4. + * src/RelLib.py (SourceNote.replace_source_references, + MediaBase.replace_media_references,): Fix problem with replacing + multiple occurrences. + * src/po/ru.po: Update for 2.0.4. + +2005-06-23 Julio Sanchez + * src/WriteGedcom.py: Fix family source references, fix spurious + PLAC subrecords, respect more privacy settings + * src/po/es.po: Translation fixes + +2005-06-22 Don Allingham + * src/FamilyView.py: fix deleting of spouse and children + * src/PlaceView.py: fix sorting + * src/SourceView.py: fix sorting + +2005-06-22 Alex Roitman + * src/GenericFilter.py (IsDescendantOfFilterMatch.__init__): + Remove unneeded method. + * src/FamilyView.py (remove_child_clicked): Prevent signal race. + * NEWS: Update. + * src/TarFile.py (extract_files): insert missing 'replace' call. + * src/Relationship.py (is_spouse): return translated spouse name, + based on gender and family relation. + * src/plugins/rel_*.py (get_relationship): use new spouse scheme. + +2005-06-21 Don Allingham + * src/GenericFilter.py: optimize a few filters + +2005-06-21 Alex Roitman + * src/po/fr.po: Remove extra "%" signs. + * src/Report.py (CommandLineReport.parse_option_str): Fix indentation. + 2005-06-15 Alex Roitman * src/ListBox.py (EventListBox.set_place): Fix place setting. @@ -244,6 +1803,65 @@ Repository View side bar buttons. Add small icons to the main notebook tabs. +2005-06-20 Don Allingham + * src/AddSpouse.py: accept Person instead of handle + * src/ChooseParents.py: accept Person instead of handle + * src/GenericFilter.py: use single pass through database, filters + accept Person objects instead of handles + * src/PeopleModel.py: don't precalculate handle list + * src/RelLib.py: allow person object to be initialized with + serialized data + * src/SelectChild.py: accept Person instead of handle + +2005-06-20 Alex Roitman + * src/SelectChild.py (LikelyFilter.prepare,LikelyFilter.apply): + Handle absent birth of a parent. + * src/AddSpouse.py (LikelyFilter.prepare,LikelyFilter.apply): + Handle absent birth of a parent; correctly use gender. + +2005-06-19 Don Allingham + * src/AddSpouse.py: display idle cursor, build better likely filter + * src/SelectChild.py: display idle cursor + * src/ChooseParents.y: display "Loading..." while loading lists + +2005-06-18 Don Allingham + * src/ChooseParents.py: build custom filter rules to speed up + loading the data, provide watch cursor to provide feedback to + the user. + * src/Date.py: provide sort data recalculation function + +2005-06-19 Eero Tamminen + * src/plugins/StatisticsChart.py: Changed the entry fields to + SpinButtons as suggested by Alex + +2005-06-17 Don Allingham + * src/ChooseParents.py: optimize the add of a person to the models + * src/EditPlace.py: check to make sure a duplicate title is not + entered + +2005-06-17 Alex Roitman + * src/WriteGedcom.py (write_sources): Pass handle to the id + creator; (write_person): write person sources; (sid): return + gramps_id; (write_families): write family sources. + + * src/WriteGedcom.py: Pass gramps_id to filter rules. + * src/plugins/ExportVCalendar.py: Pass gramps_id to filter rules. + * src/plugins/ExportVCard.py: Pass gramps_id to filter rules. + * src/plugins/GraphViz.py: Pass gramps_id to filter rules. + * src/plugins/IndivComplete.py: Pass gramps_id to filter rules. + * src/plugins/NavWebPage.py: Pass gramps_id to filter rules. + * src/plugins/StatisticsChart.py: Pass gramps_id to filter rules. + * src/plugins/TimeLine.py: Pass gramps_id to filter rules. + * src/plugins/WebPage.py: Pass gramps_id to filter rules. + * src/plugins/WriteFtree.py: Pass gramps_id to filter rules. + * src/plugins/WriteGeneWeb.py: Pass gramps_id to filter rules. + + * src/plugins/WebPage.py (write_report): Test for empty dir_name. + +2005-06-16 Martin Hawlisch + * src/gramps_main.py (on_merge_activate,on_fast_merge_activate): + only merge if exactly two persons have been selected + 2005-06-08 Martin Hawlisch * src/EditPerson.py: Make gender guessing work again @@ -376,6 +1994,33 @@ * src/DisplayModels.py (RepositoryModel): Display repository type as text * src/RelLib.py (Repository): Serialize type as tuple not unicode * src/EditSource.py (ReposRefListView): Display repository type as text + * src/EditPerson.py: Don't add empty strings to pdmap + * src/AutoComp.py: don't add empty strings to completion + +2005-06-03 Alex Roitman + * src/Utils.py (bold_label,unbold_label,temp_label): optionally + set cursor. + * src/EditSource.py (__init__,on_switch_page): Call + display_references using idle_add; (display_references): set + cursor when done. + * src/EditPlace (__init__,on_switch_page): Call + display_references using idle_add; (display_references): set + cursor when done. + * src/ImageSelect (__init__,on_switch_page): Call + display_references using idle_add; (display_references): set + cursor when done. + + * src/EditPlace.py, src/EditSource.py: Detect new objects by + handle. + * src/const.py.in (save_frel): Return English strings. + * src/plugins/FamilyGroup.py (parse_user_options): Only select + spouse if there is any. + +2005-06-03 Jens Arvidsson + * src/po/sv.po: Minor fixes found via pochkpyvar.pl. + +2005-06-03 Jens Arvidsson + * src/po/sv.po: Translation update for version 2.0.2. 2005-06-02 Don Allingham * src/DisplayModels.py: Handle EventRefs properly @@ -1206,7 +2851,6 @@ 2005-04-26 Martin Hawlisch * src/PedView.py: Removed navigation buttons in flavour of a menu; -<<<<<<< ChangeLog 2005-04-23 Don Allingham * src/ListModel.py: keep track of data index * src/EventEdit.py: use new label scheme for tabs that uses an @@ -1235,7 +2879,7 @@ 2005-04-23 Martin Hawlisch * src/GrampsDbBase.py (_find_from_handle,find_object_from_handle, find_place_from_handle): Fix typo -======= + 2005-04-24 Don Allingham * src/gramps.glade: remove REDO menu item @@ -1305,7 +2949,6 @@ * src/Relationship.py: handle race condition where the screen wants to update with a stale family handle after the database has been closed and the internal data has not be rebuilt. ->>>>>>> 1.1547.2.407 2005-04-19 Martin Hawlisch * src/PedView.py: Replaced gnome canvas by an implementation diff --git a/INSTALL b/INSTALL index 8a951a62a..59b7785cc 100644 --- a/INSTALL +++ b/INSTALL @@ -22,14 +22,17 @@ But be careful if you're using the non-default options or would like to install without being root. The latter is possible, but you should supply additional arguments to -autogen or configrue: - --with-gconf-source=xml::$HOME/.gconf --with-mime-dir=$HOME/.local/share +autogen or configure: + --with-gconf-source=xml::$HOME/.gconf + --with-gconf-schema-file-dir=$HOME + --with-mime-dir=$HOME/.local/share/mime Most likely, such local install will also need some prefix with write permissions for you: --prefix=$HOME/my_gramps_path -Whether you're doing local install or regular install, YOU MUST INSTALL -GCONF SCHEMAS AND MIME TYPES. YOU HAVE BEEN WARNED! +Whether you're doing local install or regular install, +YOU MUST INSTALL GCONF SCHEMAS AND MIME TYPES. +YOU HAVE BEEN WARNED! Packager's issues diff --git a/NEWS b/NEWS index 7a70e4ba1..ab5667868 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,41 @@ +Version 2.0.9 -- the "Nobody expects the Spanish inquisition!" release +* Incremental interface improvements. +* Automated testing added, based on the CLI functionality. +* Smaller number of supported reports. +* Report rendering improvements in OOo, PDF, gnome-print, PS, HTML, + abw, and kwd formats. +* New filter rules: Ancestor of bookmarked/default person + less than N generations away (Wayne Bergeron). +* Numerous web generator improvements. +* GEDCOM import supports forward-referencing named notes. +* User manual updates. +* New Checkpoint tool plugin. +* Support for running tools from command line. +* Persistent options for tools, as applicable. +* Export patronymic names into GEDCOM. +* Updates for Swedish translation and date localization (Stefan Bjork). +* Fully formalized XML format (DTD and RelaxNG schema). +* New plugin documenting command line reference. +* Memory leak in libbglade worked around. +* Limitation of 31 generations in reports removed. +* Improved responsiveness when working with large databases. +* Select from recent files on startup. +* Better support for unicode filenames +* Better support for media objects in GEDCOM output +* Numerous bug fixes. + +Version 2.0.8 -- the "Romani ite domum" release + +Version 2.0.7 -- the "Romanes eunt domus" release +* Addition of a spelling checker if python-gnome-extras is installed +* Thumbnails are generated for objects other than images if an appropriate + thumbnailer is found the the GCONF database. +* Enhances Descendant Chart report that allows better control over the + formatting of the report +* Added support for new %n format in addition to $n, which will cause the + line to be removed if a text match is not made. +* Bug fixes, bug fixes, bug fixes, and bug fixes. + Version 2.0.6 -- the "Just like my dear Papa!" release * New Narrative Web Page added to create a more complete web site. * French manual available again (Jérôme). diff --git a/configure.in b/configure.in index 884a9d2dd..3df839879 100644 --- a/configure.in +++ b/configure.in @@ -41,7 +41,7 @@ if test x$ICONV = xno; then AC_MSG_ERROR(Couldn't find iconv program.) fi -LANGUAGES="hu zh_CN cs da de es fr it nb nl no pl pt_BR ro ru sv eo fi" +LANGUAGES="hu zh_CN cs da de es fr it nb nl no pl pt_BR ro ru sv eo fi lt" AC_SUBST(LANGUAGES) DISTLANGS= diff --git a/doc/gramps-manual/C/Makefile.am b/doc/gramps-manual/C/Makefile.am index b50c756a9..9a946a12e 100644 --- a/doc/gramps-manual/C/Makefile.am +++ b/doc/gramps-manual/C/Makefile.am @@ -12,6 +12,7 @@ entities = legal.xml\ keybind.xml\ filtref.xml\ cmdline.xml\ + cmdplug.xml\ bugs.xml\ authors.xml include $(top_srcdir)/doc/xmldocs.make diff --git a/doc/gramps-manual/C/authors.xml b/doc/gramps-manual/C/authors.xml index 312e00905..3b1e689b9 100644 --- a/doc/gramps-manual/C/authors.xml +++ b/doc/gramps-manual/C/authors.xml @@ -24,7 +24,7 @@ About GRAMPS &app; was written by Donald N. Allingham - (dallingham@users.sourceforge.net). + (don@gramps-project.org). The somewhat incomplete list of contributors includes (in alphabetical order): @@ -50,6 +50,7 @@ Steve Hall David R. Hampton Martin Hawlisch +Anton Huber Frode Jemtland Greg Kuperberg Arkadiusz Lipiec @@ -63,6 +64,7 @@ Guillaume Pratte Laurent Protois Matthieu Pupat +Trevor Rhodes Alexander Roitman Jason Salaz Julio Sanchez diff --git a/doc/gramps-manual/C/bugs.xml b/doc/gramps-manual/C/bugs.xml index 2f4dbff42..df83cfc8f 100644 --- a/doc/gramps-manual/C/bugs.xml +++ b/doc/gramps-manual/C/bugs.xml @@ -24,11 +24,6 @@ Known Bugs and Limitations -The bugs are tracked through the - - sourceforge.net tracking system. - - The known limitations include the BSDDB performance issues related to caching and the memory size. As long as the BSDDB cache fits completely into the available memory on the system, the performance should be diff --git a/doc/gramps-manual/C/cmdline.xml b/doc/gramps-manual/C/cmdline.xml index 29992cc73..d81ab514e 100644 --- a/doc/gramps-manual/C/cmdline.xml +++ b/doc/gramps-manual/C/cmdline.xml @@ -1,7 +1,7 @@ - Frequently Asked Questions - This appendix contains the list of questions that frequently come - up in mailing list discussions and forums. This list is by no means - complete. If you would like to add questions/answers to this list, - please email your suggestions to gramps-devel@lists.sf.net - - - - - - What is &app;? - &app; is the Genealogical Research and Analysis - Management Program System. In other words, it is a personal genealogy - program letting you store, edit, and research genealogical data using - the powers of your computer. - - - - Where do I get it and how much does it cost? - -&app; can be downloaded from http://sf.net/projects/gramps at no charge. -&app; is an Open Source project covered by the GNU General Public License. -You have full access to the source code and are allowed to distribute the -program and source code freely. - - - - Does it work with Windows (tm)? - -No. &app; uses the GTK and GNOME libraries. While the GTK libraries -have been ported to Windows, the GNOME libraries have not. -This, however, may change in the future. - - - - Does it work with the Mac? - -The Fink project has ported -some older versions of -&app; to OSX (tm). The Mac OSX port is not directly supported by -the &app; project, primarily because none of the &app; developers -have access to Mac OSX and because OSX is not Free Software. - -This version of &app; (&appversion;) does not appear to have been -ported by the Fink project. Please contact the Fink project for more -information. - - - - Does it work with KDE? - -Yes, as long as the required GNOME libraries are installed. - - - - Do I really have to have GNOME installed? - Yes, but you do not have to be running the GNOME desktop. - - - - What version of GNOME do I need? - -This version of gramps requires GNOME 2.8.0 or higher. -Previous versions in 1.0.x series required GNOME 2.0. - - - - Is &app; compatible with - other genealogical software (GenApps)? - -&app; makes every effort to maintain compatibility with GEDCOM, the general -standard of recording genealogical information. We have import and export -filters that enable &app; to read and write GEDCOM files. - - -It is important to understand that the GEDCOM standard is poorly implemented -- -virtually every genealogical software has its own "flavor" of GEDCOM. As we -learn about new flavor, the import/export filters can be created very quickly. -However, finding out about the unknown flavors requires user feedback. -Please feel free to inform us about any GEDCOM flavor not supported by &app;, -and we will do our best to support it! - - - - Can &app; read files created by GenApp X? - See above. - - - - Can &app; write files readable by GenApp X? - See above. - - - - Can &app; print a genealogical tree for my family? - -Yes. Different people have different ideas of what a genealogical tree is. -Some think of it as a chart going from the distant ancestor and listing -all his/her descendants and their families. Others think it should be a -chart going from the person back in time, listing the ancestors and their -families. Yet other people think of a table, text report, etc. - - -&app; can produce any of the above, and many more different charts and -reports. Moreover, the plugin architechture enables users (you) to create -their own plugins which could be new reports, charts, or research tools. - - - - In what formats can &app; output its reports? - -Text reports are available in HTML, PDF, AbiWord, KWord, LaTeX, RTF, and -OpenOffice formats. Graphical reports (charts and diagrams) are available in -PostScript, PDF, SVG, OpenOffice, and GraphViz formats. - - - - Is &app; compatible with the Internet? - -&app; can store web addresses and direct your browser to them. It can import -data that you download from the Internet. It can export data that you could -send over the Internet. &app; is familiar with the standard file formats -widely used on the Internet (e.g. JPEG, PNG, and GIF images, MP3, OGG, and -WAV sound files, QuickTime, MPEG, and AVI movie files, etc). Other than that, -there is little that a genealogical program can do with the Internet. - - - - Can I create custom reports/filters/whatever? - -Yes. There are many levels of customization. One is creating or modifying -the templates used for the reports. This gives you some control over -the fonts, colors, and some layout of the reports. You can also use &app; -controls in the report dialogs to tell what contents should be used for a -particular report. In addition to this, you have an ability to create your -own filters -- this is useful in selecting people based on criteria set -by you. You can combine these filters to create new, more complex filters. -Finally, you have an option to create your own plugins. These may be new -reports, research tools, import/export filters, etc. This assumes some -knowledge of programming in Python. - - - - What standards does &app; support? - -The nice thing about the standards is that there never is a shortage of -them. &app; is tested to support the following flavors of GEDCOM: -GEDCOM5.5, Brother's Keeper, Family Origins, Familty Tree Maker, Ftree, -GeneWeb, Legacy, Personal Ancestral File, Pro-Gen, Reunion, and -Visual Genealogie. - - - - What is the maximum database - size (bytes) &app; can handle? - -&app; has no hard limits on the size of a database that it can handle. -Starting with this release, &app; no longer loads all data into memory, -which allows it to work with much larger database than before. -In reality, however, there are practical limits. The main limiting factors -are the available memory on the system and the cache size used for BSDDB -database access. With common memory sizes these days, &app; should have -no problem using databases with tens of thousands of people. - - - - How many people can &app; database handle? - -We have found that on a typical system, &app; tends to bog down after the -database has around 150,000 people. Again, this is dependent on how much -memory you have. - - - - Why is &app; running so slowly? - It does not anymore! Just try out the current - version, &appversion;. - - - - My database is really big. - Is there a way around loading all the data into memory? - -Starting with this release, &app; no longer loads all data into memory, -which allows it to work with much larger database than before. - - - - I want to rerun the Startup dialog (druid). - How do I do this? - - &app; keeps a flag in the GNOME configuration database to indicate - that the startup dialog has been run. To cause &app; to rerun this, - the flag needs to be reset. This can be done with the following - command: - - gconftool-2 -u /apps/gramps/behavior/startup - - - - Why are non-latin characters displayed - as garbage in PDF/PS reports? - This is a limitation of the builtin fonts of PS - and PDF formats. To print non-latin text, use the Print... - in the format selection menu of the report dialog. This will use - the gnome-print backend, which supports PS and PDF creation, - as well as direct printing. - - If you only have latin text, the PDF option will produce - a smalled PDF compared to that created by gnome-print, simply because - no font information will be embedded. - + + Frequently Asked Questions + + + This appendix contains the list of questions that frequently come + up in mailing list discussions and forums. This list is by no + means complete. If you would like to add questions/answers to this + list, please email your suggestions to gramps-devel@lists.sf.net + + + + + What is &app;? + + + &app; is the Genealogical Research and Analysis Management + Program System. In other words, it is a personal genealogy + program letting you store, edit, and research genealogical + data using the powers of your computer. + - + - Why can I not add/remove/edit columns to the lists - in People View and Family View? - Now you can! Just try out the current - version, &appversion;. - - + + Where do I get it and how much does it cost? + + + &app; can be downloaded from http://sf.net/projects/gramps at no + charge. &app; is an Open Source project covered by the GNU + General Public License. You have full access to the source + code and are allowed to distribute the program and source + code freely. + + + - I would like to contribute to &app; by writing - my favorite report. How do I do that? - -The easiest way to contribute to reports, filters, tools, etc. is to copy -an existing &app; report, filter, or tool. If you can create what you want -by modifying existing code -- great! If your idea does not fit into the logic -of any existing &app; tool, the following page may provide some help in writing your -own plugin from scratch. + + Does it work with Windows (tm)? + + + No. &app; uses the GTK and GNOME libraries. While the GTK + libraries have been ported to Windows, the GNOME libraries + have not. This, however, may change in the future. + + + -If you need more help or would like to discuss your idea with us, -please do not hesitate to contact us at gramps-devel@lists.sf.net - + + Does it work with the Mac? + + + + The Fink project has ported + some older versions of + &app; to OSX (tm). The Mac OSX port is not directly supported by + the &app; project, primarily because none of the &app; developers + have access to Mac OSX and because OSX is not Free Software. + + This version of &app; (&appversion;) does not appear to have been + ported by the Fink project. Please contact the Fink project for + more information. + + Some people have had success using the DarwinPorts instead of the + Fink project. + + + - -To test your work in progress, you may save your plugin under -$HOME/.gramps/plugins directory and it should -be found and imported on startup. -The correctly written plugin will register itself with &app;, create menu -item, and so on. + + Does it work with KDE? + + + Yes, as long as the required GNOME libraries are installed. + + + - -If you are happy with your plugin and would like to contribute your code -back to the &app; project, you are very welcome to do so by contacting us -at gramps-devel@lists.sf.net - - + + Do I really have to have GNOME installed? + + + Yes, but you do not have to be running the GNOME desktop. + + + + + What version of GNOME do I need? + + + This version of gramps requires GNOME 2.8.0 or higher. + Previous versions in 1.0.x series required GNOME 2.0. + + + - I found a bug and I want it fixed right now! - What do I do? - -The best thing you can do is to fix the bug and send the patch to -gramps-devel@lists.sf.net :-) + + Is &app; compatible with other genealogical software? + + + &app; makes every effort to maintain compatibility with + GEDCOM, the general standard of recording genealogical + information. We have import and export filters that enable + &app; to read and write GEDCOM files. + + It is important to understand that the GEDCOM standard is + poorly implemented -- virtually every genealogical software + has its own "flavor" of GEDCOM. As we learn about new + flavor, the import/export filters can be created very + quickly. However, finding out about the unknown flavors + requires user feedback. Please feel free to inform us about + any GEDCOM flavor not supported by &app;, and we will do our + best to support it! + + + - -The next best thing would be to submit a good bug report. This can be done in -one of the two ways: (1) send your report to -gramps-bugs@lists.sf.net -or (2) file your report with the bug tracker system at - -http://sf.net/tracker/?group_id=25770&atid=385137 -(this function is also available by selecting -HelpReport a -bug from gramps main menu). + + Can &app; read files created by other genealogy programs? + + See above. + + -A good bug report would include: + + Can &app; write files readable by other genealogy programs? + + See above. + + - + + Can &app; print a genealogical tree for my family? + + + Yes. Different people have different ideas of what a + genealogical tree is. Some think of it as a chart going + from the distant ancestor and listing all his/her + descendants and their families. Others think it should be a + chart going from the person back in time, listing the + ancestors and their families. Yet other people think of a + table, text report, etc. + + &app; can produce any of the above, and many more different + charts and reports. Moreover, the plugin architecture + enables users (you) to create their own plugins which could + be new reports, charts, or research tools. + + + - -Version of gramps you were using when you encountered the bug -(available through Help -About menu item). - + + In what formats can &app; output its reports? + + + Text reports are available in HTML, PDF, AbiWord, KWord, + LaTeX, RTF, and OpenOffice formats. Graphical reports + (charts and diagrams) are available in PostScript, PDF, SVG, + OpenOffice, and GraphViz formats. + + + - -Language under which gramps was run -(available by executing - echo $LANG -in your terminal). - + + Is &app; compatible with the Internet? + + + &app; can store web addresses and direct your browser to + them. It can import data that you download from the + Internet. It can export data that you could send over the + Internet. &app; is familiar with the standard file formats + widely used on the Internet (e.g. JPEG, PNG, and GIF images, + MP3, OGG, and WAV sound files, QuickTime, MPEG, and AVI + movie files, etc). Other than that, there is little that a + genealogical program can do with the Internet. + + + - -Symptoms indicating that this is indeed a bug. - + + Can I create custom reports/filters/whatever? + + + Yes. There are many levels of customization. One is creating + or modifying the templates used for the reports. This gives + you some control over the fonts, colors, and some layout of + the reports. You can also use &app; controls in the report + dialogs to tell what contents should be used for a + particular report. In addition to this, you have an ability + to create your own filters -- this is useful in selecting + people based on criteria set by you. You can combine these + filters to create new, more complex filters. Finally, you + have an option to create your own plugins. These may be new + reports, research tools, import/export filters, etc. This + assumes some knowledge of programming in Python. + + + - -Any Traceback messages, error messages, warnings, etc, -that showed up in your terminal or a in separate traceback window. - + + What standards does &app; support? + + + The nice thing about standards is that there never is a + shortage of them. &app; is tested to support the following + flavors of GEDCOM: GEDCOM5.5, Brother's Keeper, Family + Origins, Family Tree Maker, Ftree, GeneWeb, Legacy, Personal + Ancestral File, Pro-Gen, Reunion, and Visual Genealogie. + + + - + + What is the maximum database size (bytes) &app; can handle? + + + &app; has no hard limits on the size of a database that it + can handle. Starting with this release, &app; no longer + loads all data into memory, which allows it to work with a + much larger database than before. In reality, however, + there are practical limits. The main limiting factors are + the available memory on the system and the cache size used + for BSDDB database access. With common memory sizes these + days, &app; should have no problem using databases with tens + of thousands of people. + + + -Most problems can be fixed quickly provided there is enough information. -To ensure this, please follow up on your bug reports. In particular, if you -file a bug report with sf.net bug tracker, PLEASE log in to sf.net before -filing -(register your free account if you don't have one). Then we will have a way -of contacting you should we need more information. If you choose to file your -report anonymously, at least check every so often whether your report page -has something new posted, as it probably would. + + How many people can &app; database handle? + + + We have found that on a typical system, &app; tends to bog + down after the database has around 150,000 people. Again, + this is dependent on how much memory you have. + + + -If the above explanations seem vague, please follow -this link. + + Why is &app; running so slowly? + + + It does not anymore! Just try out the current + version, &appversion;. + + + - - + + + My database is really big. Is there a way around loading + all the data into memory? + + + + Starting with this release, &app; no longer loads all data + into memory, which allows it to work with a much larger + database than before. + + + - It is obvious that &app; absolutely needs to - become a (client-server/web-based/PHP/weblog/Javascript/C++/distributed/KDE/Motif/Tcl/Win32/C#/You-name-it) - application. When is this going to happen? - -The surest way to see it happen is to get it done by yourself. Since -&app; is free/open source, nobody prevents you from taking all of the -code and continuing its development in whatever direction you see fit. -In doing so, you may consider giving your new project another name to -avoid confusion with the continuing &app; development. If you would -like the &app; project to provide advice, expertise, filters, etc., -we will gladly cooperate with your new project, to ensure compatibility -or import/export options to your new format of a project. + + I want to rerun the Startup dialog. How do I do this? + + + &app; keeps a flag in the GNOME configuration database to + indicate that the startup dialog has been run. To cause + &app; to rerun this, the flag needs to be reset. This can be + done with the following command: + + + gconftool-2 -u /apps/gramps/behavior/startup + + + - -If, however, you would like the &app; project to to adopt your strategy, -you would need to convince &app; developers that your strategy is good -for &app; and superior to the present development strategy. + + + Why are non-latin characters displayed as garbage in PDF/PS + reports? + + + + This is a limitation of the builtin fonts of PS and PDF + formats. To print non-latin text, use the Print... in the + format selection menu of the report dialog. This will use + the gnome-print backend, which supports PS and PDF creation, + as well as direct printing. + + + If you only have latin text, the PDF option will produce a + smalled PDF compared to that created by gnome-print, simply + because no font information will be embedded. + + + - -If &app; developers are still not convinced after about three -messages sent to gramps-devel, maybe you are better off on your own -rather than with a company of retards who can't fully realize the -potential of your great idea :-) + + + Why can I not add/remove/edit columns to the lists in People + View and Family View? + + + + Now you can! Just try out the current version, &appversion;. + + + - - + + + I would like to contribute to &app; by writing my favorite + report. How do I do that? + + + + The easiest way to contribute to reports, filters, tools, + etc. is to copy an existing &app; report, filter, or + tool. If you can create what you want by modifying existing + code -- great! If your idea does not fit into the logic of + any existing &app; tool, the following page may provide some help in + writing your own plugin from scratch. + + + If you need more help or would like to discuss your idea + with us, please do not hesitate to contact us at gramps-devel@lists.sf.net + + + To test your work in progress, you may save your plugin + under $HOME/.gramps/plugins + directory and it should be found and imported on startup. + The correctly written plugin will register itself with + &app;, create menu item, and so on. + + + If you are happy with your plugin and would like to + contribute your code back to the &app; project, you are very + welcome to do so by contacting us at gramps-devel@lists.sf.net + + + - + + + I found a bug and I want it fixed right now! What do I do? + + + + The best thing you can do is to fix the bug and send the + patch to gramps-devel@lists.sf.net :-) + + A good bug report would include: + + + + Version of gramps you were using when you encountered + the bug (available through + Help + About menu + item). + + + + + Language under which gramps was run (available by executing + + echo $LANG + in your terminal). + + + Symptoms indicating that this is indeed a bug. + + + + Any Traceback messages, error messages, warnings, etc, + that showed up in your terminal or a in separate + traceback window. + + + + + Most problems can be fixed quickly provided there is enough + information. To ensure this, please follow up on your bug + reports. In particular, if you file a bug report with sf.net + bug tracker, PLEASE log in to sf.net before filing (register + your free account if you don't have one). Then we will have + a way of contacting you should we need more information. If + you choose to file your report anonymously, at least check + every so often whether your report page has something new + posted, as it probably would. + + + If the above explanations seem vague, please follow this link. + + + + + + It is obvious that &app; absolutely needs to become a + (client-server/web-based/PHP/weblog/Javascript/C++/distributed/KDE/Motif/Tcl/Win32/C#/You-name-it) + application. When is this going to happen? + + + + The surest way to see it happen is to get it done by + yourself. Since &app; is free/open source, nobody prevents + you from taking all of the code and continuing its + development in whatever direction you see fit. In doing so, + you may consider giving your new project another name to + avoid confusion with the continuing &app; development. If + you would like the &app; project to provide advice, + expertise, filters, etc., we will gladly cooperate with your + new project, to ensure compatibility or import/export + options to your new format of a project. + + + If, however, you would like the &app; project to to adopt + your strategy, you would need to convince &app; developers + that your strategy is good for &app; and superior to the + present development strategy. + + + + diff --git a/doc/gramps-manual/C/getstart.xml b/doc/gramps-manual/C/getstart.xml index 15dfe2e6e..02d0ed902 100644 --- a/doc/gramps-manual/C/getstart.xml +++ b/doc/gramps-manual/C/getstart.xml @@ -22,163 +22,237 @@ - - Getting Started + Getting Started - This chapter provides the most basic information on starting &app; - and obtaining help. Please procede to the following chapters for more - information. + + This chapter provides the most basic information on starting + &app; and obtaining help. Please proceed to the following + chapters for more information. + - - + + + To Start GRAMPS - You can start &app; in the following ways: + + You can start &app; in the following ways: + - + Applications menu - The method of starting &app; from the menus may vary from - distribution to distribution. On default GNOME desktop, - choose Other - Gramps. - - + + + The method of starting &app; from the menus may vary + from distribution to distribution. On default GNOME + desktop, choose + Other + Gramps. + + + + Command line - To start &app; from a command line, type - gramps, then press Enter. - - If you would like &app; to open a specific database or to - import a specific file on startup, you can supply the filename - as a command line argument: - - - gramps filename.grdb - - - where filename.grdb is the name - of the file you want to open. The command line provides many more ways - to start &app; and perform different tasks. The detailed reference to the - command line options is found in the . - - + + + To start &app; from a command line, type + gramps, then press + Enter. + + + If you would like &app; to open a specific database or to + import a specific file on startup, you can use the + filename as a command line argument: + + + gramps filename.grdb + + + where filename.grdb is the name of + the file you want to open. The command line provides many + more ways to start &app; and perform different tasks. The + detailed reference to the command line options is found + in . + + + - + - - - Running GRAMPS for the first time + + + + Running GRAMPS for the first time - The first time you run the program, GRAMPS will display its - Getting Started dialogs. Follow the directions guiding you through - Researcher information, Numerical date - formats, Alternate calendar support, - and LDS extensions sections. Most of the dialogs - are self-explanatory and will not be covered here. + The first time you run the program, GRAMPS will display the + Getting Started dialogs. Follow the directions that guide you through + Researcher information, Numerical date + formats, Alternate calendar support, + and the LDS extensions sections. Most of the dialogs + are self-explanatory and will not be covered here. - -
- GRAMPS Getting Started Window: Researcher Information - - - Shows Researcher Information Window. -
- + - Enter your personal information in the corresponding - text entry fields. Although &app; requests information about you, - this information is used only so that &app; can create valid GEDCOM - output files. A valid GEDCOM file requires information about the file's - creator. If you choose, you may leave the information empty, however - all the GEDCOM files you export will not be valid. - +
+ GRAMPS Getting Started Window: Researcher Information + + + + + + + Shows Researcher Information Window. + + + +
+ + + + + Enter your personal information in the corresponding text entry + fields. Although &app; requests information about you, this + information is used only so that &app; can create valid GEDCOM + output files. A valid GEDCOM file requires information about the + file's creator. If you choose, you may leave the information + empty, however all the GEDCOM files you export will be invalid. + + + This information can be entered at any time in the + Preferences dialog, under the + Database/Researcher Information category. + +
+ + + + + Choosing a database on startup + + If &app; is started without a database selected, the following + window will appear prompting you to choose one to open. + + + - This information can be entered at any time in the - Preferences dialog, under the - Database/Researcher Information category. - - - - - - - Choosing a database on startup - If &app; is started without any - database to open, the following window will appear prompting you to - choose what database to open. +
+ Open Database Window + + + + + + + Shows Open Database Window. + + + +
+ + - -
- Open Database Window - - - Shows Open Database Window. -
- + + If you would like to open an existing database, check the top + radio button and click the OK + button. You will then be asked to specify the name of your + existing database. If you would like to immediately create a + brand new database from scratch right away, choose new + database. + + + + Selecting file + + This version of &app; does not require selecting a directory + for the database. Please select filename, as you would in any + other application. + + + +
- If you would like to open an existing database, check the top radio - button and click the OK button. You will then be asked to - specify the name of your existing database. If you would like to start - creating your brand new database from scratch right away, choose new - database. + - - Selecting file - - Unlike the version 1.0.X of &app;, this version does not require selecting directory - for the database. Please select filename, as you would in any other application. - - + + Obtaining Help + + The following items are available from the + Help to provide + immediate assistance: + + - - + + User manual + + + Select this item to access this manual in the help browser. + + + - - - Obtaining Help - At any time, the following items are available for immediate aid - from the Help menu: - - + + FAQ + + + Select this item to read the Frequently Asked Questions about + &app; in the browser. + + + - User manual - Choose this item to read the text of this manual - in the help browser. - + + GRAMPS home page + + + Select this item to open the home page of &app; in your + default web browser. + + + - FAQ - Use this item to read Frequently Asked Questions - about &app; in the browser. - + + GRAMPS mailing lists + + + Select this item to direct your web browser + to the &app; mailing list archives. + + + - GRAMPS home page - Select this item to open home page of &app; in your - default web browser. - + + Report a bug + + + Select this item to file a bug report regarding &app; + with the bug tracking system. + + + - GRAMPS mailing lists - Choose this item to direct your web browser - to the &app; mailing list archives. - + + Show plugin status + + + Select this item to display the status of loaded plugins. + + + - Report a bug - Use this item to file a bug report against &app; - with the bug tracking system. - - - Show plugin status - Use this item to display the status of loaded - plugins. - - - Open example database - Select this item to load the example database shipped - with &app;. This database is composed of fictitious people and serves as - a useful example for learning how to work with &app;. - - - - - - + + Open example database + + + Select this item to load the example database shipped + with &app;. This database is composed of fictitious + people and serves as a useful example for learning how + to work with &app;. + + + + +
+ diff --git a/doc/gramps-manual/C/gramps-manual-C.omf b/doc/gramps-manual/C/gramps-manual-C.omf index 9cc1def88..f416a4dd2 100644 --- a/doc/gramps-manual/C/gramps-manual-C.omf +++ b/doc/gramps-manual/C/gramps-manual-C.omf @@ -3,16 +3,15 @@ Alex Roitman shura@alex.neuro.umn.edu GRAMPS Manual - 2003-12-01 - - + 2005-10-16 + + User Manual for GRAMPS. User Manual - + - diff --git a/doc/gramps-manual/C/gramps-manual.xml b/doc/gramps-manual/C/gramps-manual.xml index fa61b2a84..4ba08bf78 100644 --- a/doc/gramps-manual/C/gramps-manual.xml +++ b/doc/gramps-manual/C/gramps-manual.xml @@ -1,4 +1,4 @@ - + @@ -50,6 +50,7 @@ + ]> @@ -66,9 +67,14 @@ GRAMPS Manual V&manrevision; - - 2001 Donald N. Allingham - 2003-2005 Alex Roitman + + 2001 + Donald N. Allingham + + + 2003-2005 + Alex Roitman + - - GRAMPS Project +--> + + + + + GRAMPS Project + &legal; - + + - Alex - Roitman - - GRAMPS Project -
shura@gramps-project.org
-
+ Alex + Roitman + + GRAMPS Project +
shura@gramps-project.org
+
- Donald N. - Allingham - - GRAMPS Project -
don@gramps-project.org
-
+ Donald N. + Allingham + + GRAMPS Project +
don@gramps-project.org
+
@@ -135,108 +150,104 @@ - GRAMPS Manual V&manrevision; - &date; - - Alex Roitman - shura@gramps-project.org - GRAMPS Project - + GRAMPS Manual V&manrevision; + &date; + + Alex Roitman + shura@gramps-project.org + + GRAMPS Project + - GRAMPS Manual V2.5 - February 2004 - - Alex Roitman - shura@gramps-project.org - GRAMPS Project - + GRAMPS Manual V2.5 + February 2004 + + Alex Roitman + shura@gramps-project.org + + GRAMPS Project + - GRAMPS Manual V2.4 - December 2003 - - Alex Roitman - shura@gramps-project.org - GRAMPS Project - + GRAMPS Manual V2.4 + December 2003 + + Alex Roitman + shura@gramps-project.org + + GRAMPS Project + - GRAMPS Manual V2.3 - September 2003 - - Alex Roitman - shura@gramps-project.org - GRAMPS Project - + GRAMPS Manual V2.3 + September 2003 + + Alex Roitman + shura@gramps-project.org + + GRAMPS Project + - GRAMPS Manual V2.2 - July 2003 - - Alex Roitman - shura@gramps-project.org - Donald A. Peterson - dpeterson@sigmaxi.org - GRAMPS Project - + GRAMPS Manual V2.2 + July 2003 + + Alex Roitman + shura@gramps-project.org + + Donald A. Peterson + dpeterson@sigmaxi.org + + GRAMPS Project + - GRAMPS Manual V2.1 - May 2003 - - Alex Roitman - shura@gramps-project.org - - GRAMPS Project - + GRAMPS Manual V2.1 + May 2003 + + Alex Roitman + shura@gramps-project.org + + GRAMPS Project + - GRAMPS Manual V2.0 - April 2003 - - Alex Roitman - shura@gramps-project.org - - GRAMPS Project - + GRAMPS Manual V2.0 + April 2003 + + Alex Roitman + shura@gramps-project.org + + GRAMPS Project + - GRAMPS User Manual V1.1 - 2001 - - Donald N. Allingham - don@gramps-project.org - - GRAMPS Project - + GRAMPS User Manual V1.1 + 2001 + + Donald N. Allingham + don@gramps-project.org + + GRAMPS Project + - gramps User Manual V1.0 - 2001 - - Donald N. Allingham - don@gramps-project.org - - GRAMPS Project - + gramps User Manual V1.0 + 2001 + + Donald N. Allingham + don@gramps-project.org + + GRAMPS Project + - This manual describes version &appversion; of GRAMPS. + + This manual describes version &appversion; of GRAMPS. - - Feedback - - To report a bug or make a suggestion regarding this application or - this manual, use the help menu in &app;, or follow the directions - found on this site. - - - -
diff --git a/doc/gramps-manual/C/mainwin.xml b/doc/gramps-manual/C/mainwin.xml index 5ccf6045d..e100c513b 100644 --- a/doc/gramps-manual/C/mainwin.xml +++ b/doc/gramps-manual/C/mainwin.xml @@ -22,538 +22,788 @@ - Main Window - When you open a database (either existing or brand new), - the following window is displayed. + Main Window - -
- GRAMPS Main Window - + + When you open a database (either existing or brand new), the + following window is displayed: + + + + +
+ GRAMPS Main Window + + + + + - Shows GRAMPS main window. Contains titlebar, menubar, - toolbar, sidebar, display area, statusbar, progressbar, and - scrollbars. Menubar contains File, Edit, View, Go, Bookmarks, - Reports, Tools, Settings, and Help menus. -
- + + Shows GRAMPS main window. Contains titlebar, menubar, + toolbar, sidebar, display area, statusbar, progressbar, and + scrollbars. Menubar contains File, Edit, View, Go, Bookmarks, + Reports, Tools, Settings, and Help menus. + + +
+
+
+ + + + + The &app; window contains the following elements: + + + + + + Menubar + + + The menubar is located at the very top of the window (right + below the window title) and provides access to all features + of &app; through its menus. + + + + + + Toolbar + + + The toolbar is located immediately below the menubar. The + toolbar provides access to the most frequently used + functions of &app;. The appearance of the toolbar can be + adjusted in the Preferences dialog. + + + + + + Progressbar + + + The progressbar is located in the lower left corner of the + &app; window. It displays the progress of time consuming + operations, such as opening and saving large data bases, + importing and exporting to other formats, generating web + sites, etc. + + + + + + Statusbar + + + The statusbar is located to the right of the progressbar, on + the very bottom of the &app; window. It displays + information about current &app; activity and contextual + information about the menu items. The behavior of the + statusbar can be adjusted in + Preferences dialog. + + + + + + Display area + + + The largest area in the center of the &app; window is the + display area. It shows certain aspects of genealogical + information, depending on the currently selected View. The + following six Views are available in &app;: + + People View + Family View + Pedigree View + Sources View + Places View + Media View + + + + + + + + + + Views + + Views are the various ways to display different aspects of + genealogical information. It is best to split the relevant + information display into smaller categories, uniform in context + and modality; since it is very broad and non-uniform in both + context and modality. Each View represents such a split and + displays a certain portion of overall available + information. Before reviewing the detailed description of + available Views, you will be guided through the ways of + switching between the Views. + + + + + + Switching Views and Viewing Modes + + Depending on the state of the + ViewSidebar + menu item, the View could be switched either in + the sidebar or in the notebook tabs in the top part of the + window. + - The &app; window contains the following elements: - Menubar - The menubar is located at the very top of the window - (right below the window title) and provides access to all features of - &app; through its menus. - - Toolbar - The toolbar is located immediately below the menubar. - The toolbar provides access to the most frequently used functions - of &app;. The appearance of the toolbar - can be adjusted in the Preferences - dialog. - - Progressbar - The progressbar is located in the lower left corner - of the &app; window. It displays the - progress of time consuming operations, such as opening and saving - large data bases, importing and exporting to other formats, generating - web sites, etc. - - Statusbar - The statusbar is located to the right of the - progressbar, on the very bottom of the &app; window. - It displays information about current &app; - activity and contextual information about the menu items. - The behavior of the statusbar can be adjusted in - Preferences dialog. - - Display area - The largest area in the center of the - &app; window is the display area. - It shows certain aspects of genealogical information, depending on the - currently selected View. The following six Views are available - in &app;: - - People View - Family View - Pedigree View - Sources View - Places View - Media View + + + To switch the View while in a Sidebar mode, + click on the desired sidebar icon. + + - - - + + +
+ Sidebar Viewing Mode + + + + + + + Shows sidebar viewing mode. + + + +
+ + + + + + + + + To switch the View while in a Tabbed mode, + click on the desired notebook tab. + + + + + +
+ Tabbed Viewing Mode + + + + + + + Shows tabbed viewing mode. + + + +
+ +
+
- - - Views - Views are the various ways to display different aspects of - genealogical information, as described below. Since the relevant - information is very broad and non-uniform in both context and modality, - it is best to split its display into smaller categories, uniform in - context and modality. Each View represents such a split and displays a - certain portion of overall available information. Before the detailed - description of available Views, let us guide you through the ways of - switching between the Views. - - - - Switching Views and Viewing Modes - Depending on the state of the - ViewSidebar - menu item, the View could be switched either in the - sidebar or in the notebook tabs in the top part of the window. - - - - To switch the View while in a Sidebar mode, - click on the desired sidebar icon. - - -
- Sidebar Viewing Mode - - - Shows sidebar viewing mode. -
- -
- - To switch the View while in a Tabbed mode, - click on the desired notebook tab. - - -
- Tabbed Viewing Mode - - - Shows tabbed viewing mode. -
- -
-
- - To switch between sidebar and tabbed viewing modes, - choose View - Sidebar - from the &app; menu. + + To switch between sidebar and tabbed viewing modes, choose + View + Sidebar from the + &app; menu. + -
+
- - - People View - When &app; first opens a database, - the View is set to the People View ( - and ). The People View lists - individuals whose data is stored in the database. - - The individuals are arranged in a tree-like structure, - according to their family names. Every family name is a node of the - tree. Clicking the arrow on the left of the node will toggle its - expansion state. When expanded, the node's content is listed in the - window. When collapsed, the contents is rolled up and not visible. - However, all the data is still intact, it is just not being displayed. - - - The People View in its default state - displays people's Names, - &app; ID numbers, - Gender, and - their Birth and Death dates. - The list can be ordered by any field. + + + + People View + + When &app; first opens a database, the View is set to the + People View ( and ). The People View lists + individuals whose data is stored in the database. + + + The individuals are arranged in a tree-like structure, + according to their family names. Every family name is a node + of the tree. Clicking the arrow on the left of the node will + toggle its expansion state. When expanded, the node's content + is listed in the window. When collapsed, the content is + rolled up and not visible. All the data is still + intact. It is just not being displayed. + + + The People View, in its default state, displays people's + Names, &app; ID + numbers, Gender, and their + Birth and Death + dates. The list can be ordered by any field. + - Order list by selected column - To order list by the Birth date, click on the - Birth date column heading. To order list in - reverse (descending) order, click one more time on the desired column - heading. + + Order list by selected column + + To order list by the Birth date, click on the + Birth date column heading. To order + list in reverse (descending) order, click one more time on + the desired column heading. + + - The columns of the view may be - added, removed, or reordered in a Column Editor Dialog, - see . Only checked columns will be shown - in the view. To change their order, drag any column to its desired place inside - the editor. Clicking OK will reflect the changes - in the People View. To invoke Column Editor Dialog, - choose EditColumn + + The columns of the view may be added, removed, or reordered in + a Column Editor Dialog, see . Only checked columns will be + shown in the view. To change their order, drag any column to + its desired location inside the editor. Clicking + OK will reflect the changes in the + People View. To invoke Column Editor + Dialog, choose + EditColumn Editor. - + - Other Views - The Column Editor is available - and works in the same way for all list views, not only People View. + + Other Views + + The Column Editor is available and + works in the same way for all list views, not only People + View. + + - -
+ + +
Column Editor Dialog - - - Shows column editor dialog. -
- + + + + + + + Shows column editor dialog. + + + +
- - - Filters - Genealogical databases may contain huge numbers of people. - Since the long lists are hard for humans to handle, - &app; provides a convenient way to limit - the scope of browsing by using the filter. To save screen space, - filter controls may be hidden, depending on the state of - View - Filter menu item. + + + + Filters + + Genealogical databases may contain huge numbers of people. + Since the long lists are hard for humans to manage, &app; + provides a convenient way to limit the scope of browsing by + using the filter. To save screen space, filter controls may + be hidden, depending on the state of + View Filter + menu item. + - + +
- Filter Controls Displayed - - - Shows filter controls. -
- + Filter Controls Displayed + + + + + + + Shows filter controls. + + + + - When &app; opens a database, the - filter is set to the trivial filter called All - people, i.e. no filtering is in effect. To choose a - filter, use the pop-up Filter menu above the - people's list. Once the filter is chosen, click the - Apply button in the upper right corner of the - window. The filtering will take effect upon clicking the - Apply button. + + + + When &app; opens a database, the filter is set to the + trivial filter called All people, + i.e. no filtering is in effect. To choose a filter, use the + pop-up Filter menu above the people's + list. Once the filter is chosen, click the + Apply button in the upper right + corner of the window. The filtering will take effect upon + clicking the Apply button. + - Example filter use - To show males only, choose - Males filter, then click the - Apply button. To cancel any filtering, set - the filter to Entire Database - and then click the Apply button. + + Example filter use + + To show males only, choose Males + filter, then click the Apply + button. To cancel any filtering, set the filter to + Entire Database and then click the + Apply button. + - Filtering is persistent - Even if the filter controls are not displayed - ( View - Filter menu item is - unchecked), the filtering might still be in place. In other words, - the visibility of the filter controls is not related to the actual - filtering imposed on the list. - - This may be a cause of confusion, when - you enable the filtering and then remove the controls from the - display. If in doubt, enable the display of filter controls by - checking View - Filter menu item and check - what kind of filtering is currently set. + Filtering is persistent + + Even if the filter controls are not displayed + ( View + Filter menu + item is unchecked), the filtering might still be in + place. In other words, the visibility of the filter + controls is not related to the actual filtering imposed + on the list. + + + This may be a cause of confusion, when you enable the + filtering and then remove the controls from the + display. If in doubt, enable the display of filter + controls by checking + View + Filter menu + item and check what kind of filtering is currently set. +
-
- + + Family View - Family View displays the family information of a currently - selected (or Active) person. Specifically, this view shows the - relationships (e.g marriages, partnerships, etc.) of the active - person, his/her parents (or step parents, or guardians, etc), and - his/her children (could be step children, adopted children, etc.). - + + Family View displays the family information of a currently + selected (or Active) person. Specifically, this view shows + the relationships (e.g. marriages, partnerships, etc.) of the + active person, his/her parents (or step parents, or + guardians, etc), and his/her children (could be step + children, adopted children, etc.). + - + +
- Family View - - - Shows Family View. -
+ Family View + + + + + + + Shows Family View. + + + + + - The Active person's data is in the list box in the upper left - corner of the window. Directly below it, another box lists the Spouse's - data, for each relationship of Active person (can be more than one). - The double-arrow button to the right of the Active person list box - allows you to exchange the currently selected spouse (Current spouse) - with the Active person. Double-clicking on the Active person allows the - editing of Active person's data. Double-clicking on the Current spouse - allows you to edit their relationship information. Shift-clicking on - the Current spouse allows the editing of the Current spouse's data. + + The Active person's data is in the list box in the upper + left corner of the window. Directly below it, another box + lists the Spouse's data, for each relationship of Active + person (can be more than one). The double-arrow button to + the right of the Active person list box allows you to + exchange the currently selected spouse (Current spouse) with + the Active person. Double-clicking on the Active person + allows the editing of Active person's data. Double-clicking + on the Current spouse allows you to edit their relationship + information. Shift-clicking on the Current spouse allows the + editing of the Current spouse's data. + + + To add a new relationship, use one of the two upper buttons + to the right of the spouse box. Click the top one to add a + new person to a database and to the new relationship. Click + the middle one to add a person already existing in the + database to the new relationship. To remove Current spouse, + click the lowest button (-) to the + right of the spouse box. Note that removing a spouse from + the relationship does not remove the person from the + database. Most of these functions are also available by + right-clicking into the spouse box and selecting an + appropriate item from the context menu. + + + The parents of both the Active person and the Current spouse + are listed in the corresponding list boxes in the right-hand + part of the window (Active person's parents on top, Current + spouse parents on the bottom). Both list boxes have a set of + three buttons on their right side. The + + and - + buttons allow you to add and remove parents of the Active + person and the Current spouse, respectively. Clicking the + right arrow button makes the family in the corresponding + list box an active family. That is, it makes the selected + Father the Active person, and the selected Mother the + Current spouse. Most of these functions are also available + by right-clicking into the parent box and selecting an + appropriate item from the context menu. + + + The bottom list box displays children of the Active person + and the Current Spouse. The Children's list can be ordered + by the Birth date in the usual way of clicking on the + Birth date column header. In addition + to the Name, ID, + Gender, and Birth + date columns, the list includes a + Status column. The pair of status words + reflect the relationship between the child and his + Father/Mother (such as Birth, Adoption, + etc.). Column Editor Dialog can be used + to change column arrangement. Four buttons are available on + the right side of the children list box. The top (left + arrow) button makes the selected child the Active + person. The next two buttons add a new child to the family: + the upper one adds a new person to the database and to the + family, the lower one just adds a person existing in the + database to the family. Finally, the lowest + - button removes the selected child + from the family. Note that removing a child from the family + does not remove the person from the database. Most of these + functions are also available by right-clicking into the + children box and selecting an appropriate item from the + context menu. + + + The layout of the Family View can be switched from the + left-to-right arrangement (shown above) to the top-to-bottom + arrangement (shown below). This can be done in the + Display section of the + Preferences dialog. The top-to-bottom + view has the same functionality as the left-to-right view. + - To add a new relationship, use one of the two upper buttons to the - right of the spouse box. Click the top one to add a new person to a - database and to the new relationship. Click the middle one to add a - person already existing in the database to the new relationship. - To remove Current spouse, click the lowest button - (-) to the - right of the spouse box. Note that removing a spouse from the - relationship does not remove the person from the database. Most of these - functions are also available by right-clicking into the spouse box and - selecting an appropriate item from the context menu. - - The parents of both the Active person and the Current spouse - are listed in the corresponding list boxes in the right-hand part of - the window (Active person's parents on top, Current spouse parents - on the bottom). Both list boxes have a set of three buttons on their - right side. The + and - - buttons allow you to add and remove parents of the Active person and the - Current spouse, respectively. Clicking the right arrow button - makes the family in the corresponding list box an active family. - That is, it makes the selected Father the Active person, and the - selected Mother the Current spouse. Most of these - functions are also available by right-clicking into the parent box and - selecting an appropriate item from the context menu. - - The bottom list box displays children of the Active person and - the Current Spouse. The Children's list can be ordered by the Birth date - in the usual way of clicking on the Birth date column - header. In addition to the Name, - ID, Gender, and - Birth date columns, the list includes a - Status column. The pair of status words reflect the - relationship between the child and his Father/Mother (such as Birth, Adoption, - etc.). Column Editor Dialog can be used to change - column arrangement. - Four buttons are available on the right side of the - children list box. The top (left arrow) button makes - the selected child the Active person. The next two buttons add a new - child to the family: the upper one adds a new person to the database - and to the family, the lower one just adds a person existing in the - database to the family. Finally, the lowest - - button removes the selected child from the family. Note that removing - a child from the family does not remove the person from the - database. Most of these functions are also available by right-clicking - into the children box and selecting an appropriate item from the - context menu. + - The layout of the Family View can be switched from the - left-to-right arrangement (shown above) to the top-to-bottom - arrangement (shown below). This can be done in the - Display section of the - Preferences dialog. The top-to-bottom view - has the same functionality as the left-to-right view. - -
- Alternative Family View - - - Shows Alternative Family View. -
- + Alternative Family View + + + + + + + Shows Alternative Family View. + + + + + +
- + Pedigree View - + +
- Pedigree View - - - Shows Pedigree View. -
- + Pedigree View + + + + + + + Shows Pedigree View. + + + + - The Pedigree View helps to visualize the place of the Active - person in the tree of his/her ancestors. The Pedigree View shows four - generations, going back in time from the Active person - 1 to his/her parents 2, - to grandparents 3, to great-grandparents - 4. - Each person is denoted by a box bearing the person's name. - The two lines that converge on the box represent ties with the - person's Father (top line) and mother (bottom line). Solid lines - represent birth relations, while dashed lines represent non-birth - relations (such as adoption, step-parenthood, guardianship, etc.). - When the mouse moves over the white box, it expands to display the - corresponding person's dates of birth and death. When the mouse is - placed over the family line, the line becomes highlighted to indicate - an active link: double-clicking on the line makes the corresponding - ancestor the Active person. The display in that case is re-adjusted - to show four generations, starting from the newly selected Active - person. + + + + + The Pedigree View helps to visualize the place of the Active + person in the tree of his/her ancestors. The Pedigree View + shows four generations, going back in time from the Active + person 1 to his/her parents + 2, to grandparents + 3, to great-grandparents + 4. Each person is denoted by a box + bearing the person's name. The two lines that converge on + the box represent ties with the person's Father (top line) + and mother (bottom line). Solid lines represent birth + relations, while dashed lines represent non-birth relations + (such as adoption, step-parenthood, guardianship, etc.). + When the mouse moves over the white box, it expands to + display the corresponding person's dates of birth and + death. When the mouse is placed over the family line, the + line becomes highlighted to indicate an active link: + double-clicking on the line makes the corresponding ancestor + the Active person. The display in that case is re-adjusted + to show four generations, starting from the newly selected + Active person. + + - + +
- Children Menu - - - Shows Children Menu in Pedigree View. -
- + Children Menu + + + + + + + Shows Children Menu in Pedigree View. + + + + - The left-hand side of the window shows the left arrow button. - Upon clicking, the button expands to the menu listing the children - of the Active person. Selecting the menu item makes the corresponding - child the Active person. The appearance of the children's names - in the menu serves to differentiate the "dead ends" of the tree from - the continuing branches as follows. The children who have children - appear in the menu in the boldface and italic typeset, while the - children without children ("dead ends") appear in a regular - font. If the Active person has a single child, no menu will be - displayed (since there is no choice) and the child will become - the Active person upon clicking the arrow button. + - The right-hand side of the window shows two right arrow buttons. - When the top button is clicked, the Father of the Active person - becomes the Active person. Clicking the bottom button makes the Mother of - the Active person the Active person. Again, the display is re-adjusted - to show four generations, starting from the newly selected Active - person. + + + The left-hand side of the window shows the left arrow + button. Upon clicking, the button expands to the menu + listing the children of the Active person. Selecting the + menu item makes the corresponding child the Active + person. The appearance of the children's names in the menu + serves to differentiate the "dead ends" of the tree from the + continuing branches as follows. The children who have + children appear in the menu in the boldface and italic + typeset, while the children without children ("dead ends") + appear in a regular font. If the Active person has a single + child, no menu will be displayed (since there is no choice) + and the child will become the Active person upon clicking + the arrow button. + + + + The right-hand side of the window shows two right arrow + buttons. When the top button is clicked, the Father of the + Active person becomes the Active person. Clicking the bottom + button makes the Mother of the Active person the Active + person. Again, the display is re-adjusted to show four + generations, starting from the newly selected Active person. + + + + -
- Personal Context Menu - - - Shows Context Menu in Pedigree View. -
- + Personal Context Menu + + + + + + + Shows Context Menu in Pedigree View. + + + + + + - Right-clicking on any person's box in the Pedigree View will bring up the - context menu. Among other useful items, the context menu has submenus - listing Spouses, Siblings, - Children, and Parents - of that person. Insensitive (greyed out) submenus indicate the absence - of the data in the appropriate category. Similarly to the children menu above, - children's and parents' menus distinguish continuing lines from dead ends. + + Right-clicking on any person's box in the Pedigree View will + bring up the context menu. Among other useful items, the + context menu has submenus listing + Spouses, Siblings, + Children, and + Parents of that person. Insensitive + (grayed out) sub-menus indicate the absence of the data in + the appropriate category. Similarly to the children menu + above, children's and parents' menus distinguish continuing + lines from dead ends. + - + +
- Pedigree View with the Anchor - - - Shows Pedigree View with the anchor set. -
- + Pedigree View with the Anchor + + + + + + + Shows Pedigree View with the anchor set. + + + + + + - An additional advanced scheme of labeling generations exists in - Pedigree View. It becomes available by setting the anchor on some active - person. If the anchor is set, the generations are labeled as follows. - The anchor - person (and his/her generation) is labeled as 0. - The ancestor generations are numbered with positive integers - (1, 2, 3, - etc.) while the descendant generations are numbered with negative integers - (-1, -2, -3, - etc.). In all cases, the number represents the number of generations - between the labeled generation and the anchor person. In this mode, - you can travel along the extensive pedigree line and see the number - of generations counting from the anchor person. - - To set the anchor, select the Set anchor menu - item from the right-click context menu, when the desired person is the - Active person in the Pedigree View. The labels will change immediately, - and the name of the anchor person will appear at the lower left corner - of the display area. - The set anchor person will stay in effect until either the anchor is - removed (by selecting the Remove anchor item from the - context menu), or until the active person chosen is unrelated to the anchor - person. The latter move can be made using extensive navigation tools - available in &app;, see for the detailed - reference. - + + + An additional advanced scheme of labeling generations exists + in Pedigree View. It becomes available by setting the anchor + on some active person. If the anchor is set, the generations + are labeled as follows. The anchor person (and his/her + generation) is labeled as 0. The + ancestor generations are numbered with positive integers + (1, 2, + 3, etc.) while the descendant + generations are numbered with negative integers + (-1, -2, + -3, etc.). In all cases, the number + represents the number of generations between the labeled + generation and the anchor person. In this mode, you can + travel along the extensive pedigree line and see the number + of generations counting from the anchor person. + + + + To set the anchor, select the Set + anchor menu item from the right-click context + menu, when the desired person is the Active person in the + Pedigree View. The labels will change immediately, and the + name of the anchor person will appear at the lower left + corner of the display area. The set anchor person will stay + in effect until either the anchor is removed (by selecting + the Remove anchor item from the context + menu), or until the active person chosen is unrelated to the + anchor person. The latter move can be made using extensive + navigation tools available in &app;, see for the detailed reference. + +
- + + Sources View - + +
- Sources View - - - Shows Sources View. -
+ Sources View + + + + + + + Shows Sources View. + + + + - The Sources View lists the sources of information stored in the - database. This can include various documents (birth, death, and - marriage certificates, etc.), books, films, journals, private diaries, - i.e. virtually anything that can be classified as a source of - information. The sources can be used as a reference for any event - stored in the database. The Source View lists the - Title, ID, and the - Author of the source. Any column can be - used for sorting the list. The usual rules apply: one click for - ascending order, another click for descending order. - Column Editor Dialog may be used to rearrange - the displayed columns. + + + The Sources View lists the sources of information stored in + the database. This can include various documents (birth, + death, and marriage certificates, etc.), books, films, + journals, private diaries; virtually anything that can + be classified as a source of information. The sources can be + used as a reference for any event stored in the + database. The Source View lists the + Title, ID, and the + Author of the source. Any column can be + used for sorting the list. The usual rules apply: one click + for ascending order, another click for descending order. + Column Editor Dialog may be used to + rearrange the displayed columns. + +
- + + Places View - -
- Places View - - - Shows Places View. -
- + + +
+ Places View + + + + + + + Shows Places View. + + + +
- The Places View lists the geographical places in which the events - of the database took place. These could be places of birth, death, - and marriages of people, as well as their home, employment, education - addresses, or any other conceivable reference to the geographical - location. The Places View lists the places' Name, - ID, Church Parish, - City, County, - State, and Country. All of - these columns can be used for sorting by the usual sorting rules. - Column Editor Dialog may be used to rearrange - the displayed columns. + + + + The Places View lists the geographical places in which the + events of the database took place. These could be places of + birth, death, and marriages of people, as well as their + home, employment, education addresses, or any other + conceivable reference to the geographical location. The + Places View lists the places' Name, + ID, Church Parish, + City, County, + State, and + Country. All of these columns can be + used for sorting by the usual sorting rules. + Column Editor Dialog may be used to + rearrange the displayed columns. +
- + + Media View - -
- Media View - - - Shows Media View. -
- + - The Media View is a list of Media Objects used in the database. - Media Objects are any files that relate somehow to the stored - genealogical data. Technically, any file can be stored as a Media - Object. Most frequently, these are images, audio files, animation - files, etc. The list box on the bottom lists the Name, - ID, Type, and - Path of the Media Object. - Column Editor Dialog - may be used to rearrange the displayed columns, which obey usual - sorting rules. The top part of the GRAMPS window shows - a preview (if available) and information about the Media - Object. +
+ Media View + + + + + + + Shows Media View. + + + +
+ + + + + + The Media View is a list of Media Objects used in the + database. Media Objects are any files that relate somehow + to the stored genealogical data. Technically, any file can + be stored as a Media Object. Most frequently, these are + images, audio files, animation files, etc. The list box on + the bottom lists the Name, + ID, Type, and + Path of the Media Object. + Column Editor Dialog may be used to + rearrange the displayed columns, which obey usual sorting + rules. The top part of the GRAMPS window shows a preview (if + available) and information about the Media Object. + +
diff --git a/doc/gramps-manual/C/preface.xml b/doc/gramps-manual/C/preface.xml index aec0ffa02..6c3bb4767 100644 --- a/doc/gramps-manual/C/preface.xml +++ b/doc/gramps-manual/C/preface.xml @@ -23,202 +23,340 @@ Preface - &app; is a genealogical - application. &app; is an acronym for the - Genealogical Research and Analysis Management Programming System. To put - it shortly, it allows you to store, edit, and research genealogical data - using your computer. Its functionality is somewhat common to other - genealogical programs. However, &app; offers some unique features. + + + &app; is a free software package designed to help you with + genealogical research. It allows you to store, edit, and research + genealogical data using your computer. &app; is an open source + software package, which means you are free to run it on any number + of computers, examine the code, make changes, and redistribute as + many copies as you like. It is developed and maintained by a + worldwide team of volunteers and is available at no cost from the + project web site and from many software distributions + + - Why GRAMPS? - &app; was conceived under the concept - that most genealogy programs were designed to provide the researcher the - capability to input information related to a particular family tree. - Most of these programs have allowed for the arranging and storing of - information consistent with the GEDCOM standards. They usually provide - means for displaying descendant or ancestral relationships by means of - graphical displays, charts, or reports. These may be augmented with - pictures or other media to enhance the data. Most provide for inputting - data on unconnected individuals/families that may or may not have a - relationship to the primary surname being researched. Various other - enhancements may also be provided in the genealogical program that - allows for different degrees of importing and exporting data from other - programs and printing the data contained in the various reports. - - &app;, on the other hand, attempts to - provide all of the common capabilities of these programs, but, more - importantly, to provide an additional capability of integration not common - to these programs. This is the ability to input any bits and pieces of - information directly into &app; and - rearrange/manipulate any/all data events in the entire data base (in any - order or sequence) to assist the user in doing research, analysis and - correlation with the potential of filling relationship gaps. In short, it - is a tool that provides a way to input all your research into one place and - do your analysis and correlation using the speed, power, and accuracy of - your computer instead of pencils and unmanageable reams of paper. + Why use GRAMPS? + + + + Most genealogy programs allow the researcher to input + information related to a family tree. They can usually display + descendant or ancestral relationships through graphical + displays, charts, or reports. Some allow pictures or other media + to be inserted to enhance the raw data. Most provide a means to + include data on individuals or families that may or may not be + related to the primary family being researched. And they may + include other features such as exporting or importing to and + from other programs and printing data contained in various + reports. + + + + &app; has all these capabilities and more. Notably, it allows + you to integrate bits and pieces of stray data as the arise from + your research and put all this information in one place - your + computer. You can then use the speed, power, and accuracy of + your computer to store, manipulate, correlate, and analyze your + data, rather than messing with reams of paper. + + + + &app; has the power to let you rearrange your data in any order + or sequence and to help you fill gaps in genealogical + relationships. + + What's new since 1.0.X - This section lists most notable changes from the previous stable branch of - &app;, the 1.0.X. + + + This section lists most notable changes from the previous + stable branch of &app;, the 1.0.X. + + Berkeley database backend - The default format for &app; is now the BSDDB database. - This change allowed us to overcome performance issues and memory - requirements of the 1.0.X branch. With the database backend, the database - sizes of up to a hundred thousand people do not - present a major obstacle any longer. - - - The default extension for &app; BSDDB database files is grdb. The new format is open and - fully documented in the developer's API reference distributed with the source of &app;. - + + - A consequence of the new database backend is that the changes, once approved - by the user, are applied immediately. In short, once you click OK - in the Person, Family, Source, Place, Media object, or Event editor, all the changes made to - this object are recorded in the database. No saving is necessary (or even possible). The analog - of quitting without saving would be abandoning all changes and quitting. Also, it is possible - to undo recent actions. + The default format for &app; is now the BSDDB database. + This change allowed us to overcome performance issues and + memory requirements of the 1.0.X branch. With the database + backend, the database sizes of up to a hundred thousand + people do not present a major obstacle any longer. + + + + The default extension for &app; BSDDB database files is + grdb. The new format is open and fully documented in the + developer's API reference distributed with the source of + &app;. + + + + A consequence of the new database backend is that the + changes, once approved by the user, are applied + immediately. In short, once you click + OK in the Person, Family, Source, + Place, Media object, or Event editor, all the changes made + to this object are recorded in the database. No saving is + necessary (or even possible). The analog of quitting + without saving would be abandoning all changes and + quitting. Also, it is possible to undo recent actions. Interface improvements - - There were numerous changes in the interface. Most of them are subtle and incremental - improvements, and all of them cannot be listed here. The most noticeable changes are: - - Removal of alphabetical tabs - Ability to add/remove/rearrange columns in list views - Removal of Save function and addition of Undo - Proper window management and removal of most modal windows - Support for Tip of the Day - Person-dependent context menus (right-click) in Pedigree View - listing parents, children, spouses, and siblings - Export wizard - Built-in Find function in list views - Date selector dialog - Name editor enhancements: patronymic names and non-default grouping - Recent file support (both gramps-specific and gnome-wide) - + + - + There were numerous changes in the interface. Most of them + are subtle and incremental improvements, and all of them + cannot be listed here. The most noticeable changes are: + + + + + Removal of alphabetical tabs + + + + + Ability to add/remove/rearrange columns in list views + + + + + Removal of Save function and addition of Undo + + + + + Proper window management and removal of most modal windows + + + + + Support for Tip of the Day + + + + + Person-dependent context menus (right-click) in Pedigree View + listing parents, children, spouses, and siblings + + + + + Export wizard + + + + + Built-in Find function in list views + + + + + Date selector dialog + + + + + Name editor enhancements: patronymic names and non-default + grouping + + + + + Recent file support (both gramps-specific and gnome-wide) + + + + + + - Other database backends - - Along with the BSDDB backend, the in-memory database handling for &app; XML and - GEDCOM formats has been added. Simply put, it is now possible to natively open data - in those two formats (although the preferred and default format is grdb) and work with - that data, without necessarily setting up an empty database and then importing into it. - This approach requires holding all data in memory, so it is only useful for small databases - (depending on the available memory size). In such mode, the data is automatically - saved upon exit, to mimic the functionality of the real database. + + + Other database backends + + + + Along with the BSDDB backend, the in-memory database handling + for &app; XML and GEDCOM formats has been added. Simply put, it + is now possible to natively open data in those two formats + (although the preferred and default format is grdb) and work with + that data, without necessarily setting up an empty database and + then importing into it. This approach requires holding all data in + memory, so it is only useful for small databases (depending on the + available memory size). In such mode, the data is automatically + saved upon exit, to mimic the functionality of the real database. - - GEDCOM Editing + + GEDCOM Editing - Please keep in mind that some information in GEDCOM file may be lost - during import into &app;. Simply opening and viewing the file will not change it. - However, if any changes were made and they were not abandoned upon exit, - exiting &app; will save the data, with the possible data loss. + Please keep in mind that some information in GEDCOM + file may be lost during import into &app;. Simply + opening and viewing the file will not change it. + However, if any changes were made and they were not + abandoned upon exit, exiting &app; will save the data, + with the possible data loss. - - + + - Import and Export - - New import and export filters available for the GeneWeb format. - + + Import and Export + + + New import and export filters available for the GeneWeb format. + + - Reports - - A new report -- Statistics Chart -- has been added to &app;. - - - An overall change of the whole report framework has been acomplished. - All reports now remember their options. It is possible to generate reports from the command - line, without launching the interactive &app; session. The report API is much simpler now, - making it easy to write custom report. A single code instance may be used for a standalone - report, a book item, and a command-line report. + + Reports + + + A new report -- Statistics Chart -- has been added to &app;. + + An overall change of the whole report framework has been + accomplished. All reports now remember their options. It + is possible to generate reports from the command line, + without launching the interactive &app; session. The + report API is much simpler now, making it easy to write a + custom report. A single code instance may be used for a + standalone report, a book item, and a command-line + report. + + - Command line - The new command line functionality includes opening the filename - argument given without any flags, as well as new flags and options for report generation. - Also, the addition of new formats leads to addition of available format options. - + + Command line + + + The new command line functionality includes opening the + filename argument given without any flags, as well as new + flags and options for report generation. Also, the + addition of new formats leads to additional available + format options. + + - Internationalization - - The approach for entering and displaying dates has been completely - re-worked. In particular, the new framework allows for a deeper - localization of displayed dates than was ever possible using the - translatable strings. - - The internationalization of names have also been improved. - Names can be grouped under a non-default string. Patronymic names are - supported, and it is easy to program new ways on displaying names, as - may be required by various cultures and languages. - + + Internationalization + + + The approach for entering and displaying dates has been + completely re-worked. In particular, the new framework + allows for a deeper localization of displayed dates than + was ever possible using the translatable strings. + + The internationalization of names have also been improved. + Names can be grouped under a non-default + string. Patronymic names are supported, and it is easy to + program new ways of displaying names, as may be required + by various cultures and languages. + + - Desktop integration - All formats known to &app; are now registered as mime types, each - with its icon and &app; as a default handler. Double-clicking on a file with any of these - formats will launch &app; and open that file. &app; also added support for the recent - documents functinonailty. This is on both for the GNOME-wide level and within the &app;. - - The preferences are now properly store using GConf, with schemas, partitioning - of keys into smaller directories, error checking, and notification. - + + Desktop integration + + + All formats known to &app; are now registered as mime + types, each with its icon and &app; as a default + handler. Double-clicking on a file with any of these + formats will launch &app; and open that file. &app; also + added support for the recent documents + functionality. This is on both the GNOME-wide level + and within the &app;. + + The preferences are now properly stored using GConf, with + schemas, partitioning of keys into smaller directories, + error checking, and notification. + + - - - Typographical conventions + Typographical conventions - In this book, we some words are marked with special typography: - - Applications - Commands you type at the command - line - Filenames - Replaceable text - Labels for buttons and other - portions of the graphical interface - Menu selections look like this: - - Menu - Submenu - Menu Item - + In this book, some words are marked with special typography: + + + + + Applications + + + + + Commands you type at the command line + + + + + Filenames + + + + + Replaceable text + + + + + Labels for buttons and other + portions of the graphical interface + + + + + Menu selections look like this: + + Menu + Submenu + Menu Item + + + + + + Buttons you can click + + + + + Anything you type in + - Buttons you can - click - Anything you type - in - We also provide assorted bits of additional information in tips - and notes, as follows. + + The manual also provides assorted bits of additional information in + tips and notes, as follows. Tip @@ -237,13 +375,13 @@ - Finally, we have warnings, in cases where you should be careful: + Finally, there are warnings, notifying you where you should be careful: Example Warning This is what a warning looks like. If there's a chance - you'll run into trouble, we'll warn you beforehand. + you'll run into trouble, you will be warned beforehand. diff --git a/doc/gramps-manual/C/usage.xml b/doc/gramps-manual/C/usage.xml index b31bfdf2b..d6ed44fca 100644 --- a/doc/gramps-manual/C/usage.xml +++ b/doc/gramps-manual/C/usage.xml @@ -17,3611 +17,5577 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --> - - - Usage - As commonly encountered in everyday life, in - &app; there is usually more than one way to - accomplish something. The alternatives to some actions will therefore - be listed as appropriate. + + Usage + - - - Starting a New Database - To start a new database, choose File - New. You will then be - prompted with the Create GRAMPS database dialog asking - to specify the name under which the new database will be stored. - The new database will be created in the BSDDB format, with .grdb - as the default extension. + As commonly encountered in everyday life, there is usually more + than one way to accomplish something in &app;. The alternatives to + some actions will therefore be listed as appropriate. - - Selecting file - - Unlike the version 1.0.X of &app;, this version does not require selecting directory - for the database. Please select filename, as you would in any other application. - - + - + - - - Opening a Database - To open a database, either choose - FileOpen - or click the Open button on the Toolbar. - The Open database dialog will appear. - - + + Starting a New Database + + + To start a new database, choose + + + File + New + . + + You will then be prompted with the Create GRAMPS + database dialog asking to specify the name under + which the new database will be stored. The new database will be + created in the BSDDB format, with .grdb as + the default extension. + + + + Selecting file - The filetype filter in the Open database dialog allows - you to display files of a certain type. If the All files - filter is selected (the default), all the files will be shown. The type will - be determined by the extension of the selected filename. - - Selecting file + This version does not require selecting a directory for the + database. Please select filename, as you would in any other + application. + +
+ + + + + + + Opening a Database + + + To open a database, either choose + + + File + Open + + + or click the Open button on the Toolbar. + The Open database dialog will appear. + + + + + The filetype filter in the Open database + dialog allows you to display files of a certain type. If the + All files filter is selected (the default), + all the files will be shown. The type will be determined by the + extension of the selected filename. + + + + Selecting file - Unlike the version 1.0.X of &app;, this version does not require selecting directory - for the database. Please select filename, as you would in any other application. - - - - If you do not have write permissions for the selected database, it will - be opened in a Read Only mode. In this mode, the data may be viewed, but - no changes will be made to the database. To indicate this mode, the title of the - main window will be appended with (Read Only) text. - - Opening XML and GEDCOM databases + Unlike the version 1.0.X of &app;, this version does not + require selecting directory for the database. Please select + filename, as you would in any other application. + +
+ + + + If you do not have write permissions for the selected database, + it will be opened in a Read Only mode. In this mode, the data + may be viewed, but no changes will be made to the database. To + indicate this mode, the title of the main window will be + appended with (Read Only) text. + + + + Opening XML and GEDCOM databases - This version allows direct opening and editing of &app; XML and GEDCOM - databases. Please keep in mind that, unlike using the native grdb format, - these formats require holding all data in memory. This leads to performance - and memory consumption problems which grdb was designed to solve. - - While direct opening of a &app; XML or GEDCOM file is convenient - for a small database, it may prove burdensome for large databases. - If you experience this, please consider creating a new native (grdb) database - and importing your XML or GEDCOM data into it. This will make accessing - your data much more efficient and quick. - - - - GEDCOM Editing - - Please keep in mind that some information in GEDCOM file may be lost - during import into &app;. Simply opening and viewing the file will not change it. - However, if any changes were made and they were not abandoned upon exit, - exiting &app; will save the data, with the possible data loss. - - - - To open a recently opened database, choose - FileOpen - Recent and select the filename from the list. - You can also use Actions - Recent Documents - from the GNOME Actions menu. - - - - - - - Saving a Database - - A consequence of the new database backend is that the changes, once approved - by the user, are applied immediately. In short, once you click OK - in the Person, Family, Source, Place, Media object, or Event editor, all the changes made to - this object are recorded in the database. No saving is necessary, or even possible. - - - Choosing EditUndo - allows you to undo the changes you made, one step at a time. - - Reverting the whole session - If you would like to revert the whole editing session, choose - FileAbandon changes - and quit. This will be analogous to quitting - without saving any changes in other applications. - - - - If you would like to save your database under a different name, - you can do so by choosing File - Save as... and specifying - the name (and, optionally, format) of your new database. - - - "Save as" continues editing - If you use the Save as... function, the editing in the - main window is performed on the newly made copy. If this is not what you want - to do, please consider using Export... instead. - - - - - - - Importing Data - Importing allows you to incorporate the data from other - databases into your currently open &app; database. Currently, - &app; can import data from the following formats: &app; database (grdb), - GEDCOM, &app; XML, &app; package, and GeneWeb. All of these are - available by choosing File - Import and - selecting an appropriate file. - - &app; database (grdb), &app; XML, and &app; package are - all native &app; formats in that there is no information loss resulting - from reading from and writing into these formats. - - - &app; database (grdb) - - The native &app; database format is a specific form of Berkeley database (BSDDB) - with special structure of data tables. This format is binary and architecture-dependent. - It is very quick and efficient, but not generally portable across computers with - different binary architecture (e.g. i386 vs alpha). - - - - &app; XML - - The &app; XML file was the default format for the previous stable - version of &app;. Unlike the grdb format, it is architecture - independent and human-readable. The database may also have references - to non-local (external) media objects, therefore it is not guaranteed - to be completely portable. The &app; XML database is created by saving - (FileSave - As...) or exporting ( - FileExport... - ) data in that format. - - - - &app; package - - The package is a compressed archive containing the &app; XML - file and all media objects (images, sound files, etc.) to which the - database refers. The &app; package is created by exporting - ( File - Export...) data in that format. - - - - + This version allows direct opening and editing of &app; XML + and GEDCOM databases. Please keep in mind that, unlike using + the native grdb format, these formats require holding all data + in memory. This leads to performance and memory consumption + problems which grdb was designed to solve. - - Opening vs importing - The difference between opening &app; database (in any format) and - importing from &app; or GEDCOM database is that importing incorporates all the - data into your currently open database, if any. In contrast, opening the database - will switch from editing your current data to editing another file. - - After choosing an import format, you will be prompted with the - Import database dialog asking you to specify the - file name from which to import. - - - Selecting file - Unlike the version 1.0.X of &app;, this version does not require selecting directory - for the database. Please select filename, as you would in any other application. - - - - Upon starting the GEDCOM import, &app; - will display the following GEDCOM import dialog with the summary of the - information about the data. The information is updated as the import - progresses. - - -
- GEDCOM Import - - - Shows GEDCOM Import Window. -
- - - Upon starting the &app; database or &app; package import, - &app; will display the progress in the - progressbar of its main window. - - If a media file is not found during import, the following dialog - will prompt you for the possible actions: - - -
- Missing Media dialog - - - Shows Missing Media dialog. -
- - - - - To remove the object corresponding to the missing file as well as - all the references to that object from various database records, click the - Remove Object button. This will alter your - database so that it will be in a consistent state, but all the - references to the missing file will be gone. Use this option if the - file is irrevocably lost and there is no possibility of ever replacing - it. - - - - To keep the reference to the object corresponding to the missing - file, click the Keep Reference button. - This will leave things as is, i.e. in an inconsistent state. - You could supply the missing file later, in which case you will have - to copy it into your database directory. Choose this option if the - replacement is possible, but not available right now. - - - To supply the missing file during import, click the - Select File button. This will copy the file you - select in place of the missing file. No references will be altered - in the database, and it will be in the consistent state. Use this option - if the replacement is readily available. - - - - To automatically use the selection made in this dialog for - all missing media files, check the Use this selection for all - missing media files box. This will remember your choice - and use it for all media files missing during this import, so that no - further dialogs will be presented. Use this option if you anticipate - many missing files and want to deal with all of them in the same manner. - - - - -
- - - - Exporting Data - - Exporting allows you to share any portion of your &app; database - with other researchers as well as to make your database completely - portable to another computer. Currently, &app; - can export data to the following formats: &app; database (grdb), &app; XML, - GEDCOM, &app; package, Web Family Tree, and GeneWeb. - - Export is saving a copy - Exporting will create another file with the copy of your data. - The database currently opened in your &app; window is NOT - the file saved by your export. Future editing of the currently - opened database will not alter the copy produced by the export. - + While direct opening of a &app; XML or GEDCOM file is + convenient for a small database, it may prove burdensome for + large databases. If you experience this, please consider + creating a new native (grdb) database and importing your XML + or GEDCOM data into it. This will make accessing your data + much more efficient and quick. + + + + GEDCOM Editing - To export data, choose File - Export. This will bring up the - Export druid. Its pages will guide you through the - format selection (see ), file selection, - and format specific export options (see ). - After a final confirmation page, the export will be performed according - to the choices you have made. At any time, you can click the - Back and revise any selection, and then go - forward to redo the export. + + Please keep in mind that some information in a GEDCOM file may + be lost during import into &app;. Simply opening and viewing + the file will not change it. However, if any changes were + made and they were not abandoned upon exit, exiting &app; will + save the data, with possible data loss. + + + + To open a recently opened database, choose - -
- Export druid: format selection - - - Shows format selection page of an Export druid -
+ + File + Open Recent + - - GEDCOM export + and select the filename from the list. You can also use - GEDCOM export options allow you to fine tune your export - (see ). - Choose the desired Encoding of the exported file. - Use the Filter - pop-up menu to limit the scope of the export according to the stated rule. - Use the Target menu to select the desired GEDCOM - dialect. Select your copyright statement from the - Copyright menu. Check Do not include - records marked private to disable the output of private - records. Check Restrict data on living people - to limit living people's data to family ties. With this option, - information concerning birth, death, addresses, various events, - etc. will be omitted in the exported GEDCOM file. If this option is selected, - you can further choose whether to use the word "Living" as first name, exclude - notes, and exclude sources for the living people. Check Reference - images from path to tell &app; to use the specific path for your - images when writing image references in GEDCOM. - + + Actions + Recent Documents + - -
- Export druid: GEDCOM options - - - Shows GEDCOM options page of an Export druid -
- -
+ from the GNOME Actions menu. +
+
- - Export into &app; formats + - - &app; database (grdb) export - Exporting to the native format will simply make a copy - of your data under another name. It also may be useful if you have - directly opened XML or GEDCOM file and would like to save it - as the grdb file. + + Saving a Database + - &app; XML database export - Exporting into &app; XML format will - produce a database compatible with the previous versions of &app;. - As XML is a text-based human-readable format, you may also use it - to take a look at your data. - + A consequence of the new database backend is that the changes, + once approved by the user, are applied immediately. Once you + click OK in the Person, Family, Source, + Place, Media object, or Event editor, all the changes made to + this object are recorded in the database. No saving is + necessary, or even possible. - &app; package export - Exporting to &app; package will create a gzip-compressed tar - archive (also known as tarball) which contains gramps database - and copies of all media objects files. This is a - useful format for moving your database to another machine or for sharing - it with somebody, while retaining all the features provided - by &app;. - - - Export to CD - - Exporting to CD will prepare your database and copies of all media - objects files to be recorded to the CD. This is done through the - burn:/// location in Nautilus. After exporting to - CD, go to the burn:/// location by - selecting Go - CD Creator in Nautilus menu - (unless this location is already displayed by &app;). Your - database directory will show up. To record it on to the CD, click the CD - icon on the Nautilus toolbar, or select File - Write to CD in Nautilus menu. - - - - - If a media file is not found during export, the following dialog - will prompt you for the possible actions: - - -
- Missing Media dialog - - - Shows Missing Media dialog. -
- - - - - To remove the object corresponding to the missing file as well as - all the references to that object from various database records, click - the Remove Object button. This will alter your - database so that it will be in the consistent state, but all the - references to the missing file will be gone. Use this option if the - file is irrevocably lost and there is no possibility of ever replacing - it. - - - - To keep the reference to the object corresponding to the missing - file, click the Keep Reference button. - This will leave things as is, i.e. in the inconsistent state. - You could supply the missing file later, in which case you will have - to copy it into your database directory. Choose this option if the - replacement is possible, but not available right now. - - - To supply the missing file during export, click the - Select File button. This will copy the file you - select in place of the missing file. No references will be altered - in the database, and it will be in the consistent state. Use this option - if the replacement is readily available. - - - - To automatically use the selection made in this dialog for - all missing media files, check the Use this selection for all - missing media files box. This will remember your choice - and use it for all media files missing during this export, so that no - further dialogs will be presented. Use this option if you anticipate - many missing files and want to deal with all of them in the same manner. - - - - - -
- - - Export into other formats - - - Web Family Tree - - Exporting to Web Family Tree will create the text file suitable - as an input for the WFT program. Specific options include filter selecton - and the ability to restrict data on living people, that is to limit living - people's data to family ties. - - - GeneWeb - - Exporting to GeneWeb will save a copy of your data into - a popular web genealogy format. To find out more about GeneWeb - and its format, visit this site. - - - vCalendar and vCard - - Exporting to vCalendar or vCard will save information in a - format used in many calendaring and addressbook applications, - sometimes called PIM for Personal Information Manager. - - - - - - - - - - Editing Data: Quick Start - Editing any portion of data allows you to amend and/or - modify information stored in the database. The available editing - options include editing personal data, relationship data, data about - children and parents, and information about sources, places, and media - objects used in the database. In short, any data stored in the - database can be edited! Adding a new piece of information is the process - of creating an appropriate empty data structure and subsequently - editing that empty structure. - - This section refers mainly to the menu items and buttons as the main - way of interacting with &app;. In addition to this, &app; provides an - extensive set of keybindings. The detailed reference to the keybindings - is found in the . + + + Choosing + + Edit + Undo + + allows you to undo the changes you made, one step at a time. - - - To Add a Person - To add a person to the database, switch to the People View - () and then click the - Add on the toolbar. - Enter any data you know about this person into the Edit - Person Dialog (see - for details). To edit information about a person already present - in the database, select an entry you would like to view/modify, - and then click the Edit icon on the toolbar. - - You can also use Add... and - Edit... menu items available under - the Edit. Or you can right-click on the person - and select Add... or Edit... - from the invoked context menu. + + Reverting the whole session + + + If you would like to revert the whole editing session, choose + FileAbandon + changes and quit. This will be + analogous to quitting without saving any changes in other + applications. + + + + + + If you would like to save your database under a different name, + you can do so by choosing + + File + Save as... + + and specifying the name (and, optionally, format) of your new + database. + + + + "Save as" continues editing + + If you use the Save as... function, the + editing in the main window is performed on the newly made + copy. If this is not what you want to do, please consider + using Export... instead. + + + + + + + + Importing Data + + + Importing allows you to incorporate the data from other + databases into your currently open &app; database. Currently, + &app; can import data from the following formats: &app; database + (grdb), GEDCOM, &app; XML, &app; package, and GeneWeb. All of + these are available by choosing + + + File + Import + + and selecting an appropriate file. + + + + + &app; database (grdb), &app; XML, and &app; package are all + native &app; formats in that there is no information loss + resulting from reading from and writing into these formats. + + + + &app; database (grdb) + + + The native &app; database format is a specific form of + Berkeley database (BSDDB) with special structure of data + tables. This format is binary and + architecture-dependent. It is very quick and efficient, + but not generally portable across computers with + different binary architecture (e.g. i386 vs alpha). + + + + + &app; XML + + + + The &app; XML file was the default format for the + previous stable version of &app;. Unlike the grdb + format, it is architecture independent and + human-readable. The database may also have references to + non-local (external) media objects, therefore it is not + guaranteed to be completely portable. The &app; XML + database is created by saving ( + + File + Save As... + + ) or exporting ( + + File + Export... + + ) data in that format + + + + + &app; package + + + The package is a compressed archive containing the &app; + XML file and all media objects (images, sound files, + etc.) to which the database refers. The &app; package is + created by exporting ( + + File + Export... + + ) data in that format. + + + + + + + + Opening vs importing + + The difference between opening &app; database (in any format) + and importing from &app; or GEDCOM database is that importing + incorporates all the data into your currently open database, + if any. In contrast, opening the database will switch from + editing your current data to editing another file. + + + + + After choosing an import format, you will be prompted with the + Import database dialog asking you to + specify the file name from which to import. + + + + Selecting file + + This version does not require selecting a directory for the + database. Please select filename, as you would in any other + application. + + + + + Upon starting the GEDCOM import, &app; will display the + following GEDCOM import dialog with the summary of the + information about the data. The information is updated as the + import progresses. + + + +
+ GEDCOM Import + + + + + + + Shows GEDCOM Import Window. + + + +
+ + + + Upon starting the &app; database or &app; package import, &app; + will display the progress in the progress bar of its main window. + + + + If a media file is not found during import, the following dialog + will prompt you for the possible actions: + + + + +
+ Missing Media dialog + + + + + + + Shows Missing Media dialog. + + + +
+ + + + + + To remove the object corresponding to the missing file as + well as all the references to that object from various + database records, click the Remove + Object button. This will alter your database so + that it will be in a consistent state, but all the + references to the missing file will be gone. Use this option + if the file is irrevocably lost and there is no possibility + of ever replacing it. - - - - - To Specify a Relationship - To specify a relationship, first switch to the Family View - (). Then click one of the two top buttons on - the right of the spouse box. The topmost button adds a new person to the - database and to the relationship, while the second top button adds a person - that is already in a database to the relationship. - - If using the second button, select the spouse/partner from the list - and specify the relationship using the menu at the bottom. If necessary, you - can add a person to the list by clicking the + - button. &app; will filter the displayed list of people based on the apparent - relation possibility. Specifically, shown are the people who could possibly - be in relationship with the active person, as judged by the available birth - and death information. To override this and display all people from the - database, check the Show all box. - - - - To edit information about a relationship already present in the database, - move the mouse over the Spouse box and double-click. - If the relationship lists has more than one person, you can specify the - preferred spouse/partner by selecting an appropriate item from the context - menu available upon right-clicking into the spouse box. Also, most of the - above function are available from the items of this context menu. - - - - - - To Specify Parents - To specify parents of an active person, first switch to the - Family View (). Then click the - + button on the right of the active person's - parents list box. Select the parents from two lists and specify the - parents' relationships to the active person using menus at the bottom. - You can also specify parents' relationship to each other. - If necessary, you can add a person to the list by clicking the - Add... button. - - The top and bottom lists contain males and females, - respectively. By default, &app; will - limit both lists to people who could possibly be the parents (judged - by the date of birth) of the active person. To override this, check - the Show all box for each list. - - - To specify parents of the active person's spouse, switch to the - Family View and then click the + button on the - right of the spouse's parents list box. To edit information about - parents already present in the database, move the mouse over - the corresponding parents' box and double-click. All these functions can - also be performed by right-clicking on the parents' box and selecting - an appropriate item from the context menu. - - - - - To Specify Children - To specify children of an active person, switch to the - Family View () and then click either the - second or the third button from the top on the right of the children list - box. The second button adds a child to the database and to the family, while - the third button adds a child already present in the database to the family. - - - If using the third button, select a child from the list and - specify the child's relationship with father and mother using menus - at the bottom. If necessary, you can add a person to the list by - clicking the Add... button. By default, &app; will - limit the lists to people who could possibly be the child (judged - by the date of birth) of the active person. To override this, check - the Show all box. - - - - The relationship of the child to the parents can be modified by selecting - an appropriate item from the context menu available upon right-clicking - into the children box. Also, most of the above function are available from - the items of this context menu. - - - - - - To Add Images - You can add images (as well as other media objects) to - individual people, events, sources, places, as well as images - generally related to the database (e.g. group family photos). - - To add images related to a single person, switch to the - People View (), select a person, and - then click the Edit icon on the toolbar to - invoke the Edit Person Dialog - (). Then, select the - Gallery tab, and click the - + button to invoke - the Select a media - object dialog. Type the filename or select a file with the - image, then provide a title for that image. Keep adding images until you are - done. - - To add images related to a relationship (e.g. marriage), - switch to the Family View () and then - double-click on the Spouse box invoke the Marriage/Relationship - editor dialog. Select the Gallery - tab and click the + button to add - an image. - - To add images related to a source or a place, first switch to - the Sources View () or Places - View (), respectively. Then select the - appropriate source or place and then either double-click on it - or click the Edit icon on the toolbar to invoke the - Source Editor (or Place - Editor) dialog. Select the Gallery - tab and click the + button to add - an image. - - Finally, to add images that are generally related to the - database but not limited to any person, relationship, source, or place - in particular, switch to the Media View (). - Then click the Add icon on the toolbar to - add an image. - If you have already added any images to any individual galleries, - you will also find them listed in the Media View. - - In any gallery, you can also use the Edit - and - buttons to edit image information - and to remove the image reference from that gallery. Note that in all - galleries removing the reference to the image does not remove the image - from the database. To completely remove the image from the database, - delete it from Media View by first selecting it and then - clicking the Remove icon on the toolbar. - - - - - - To Edit Sources and Places - - To add a source or a place to the database, switch to - the appropriate Sources View () or - Places View (). - Then click the Add icon on the toolbar to add a - source/place. Enter the information into the Source - Editor (or Place Editor) dialog. - - - To edit information about sources and places already present - in the database, switch to the appropriate view, select an entry - you would like to view/modify, and then click the - Edit icon on the toolbar. Alternatively, you - may double-click on the entry to edit it. - - - -
- - - - Editing Data: Complete Description - This section provides a complete description of all editing - options for all pieces of data in the &app; database. It refers mainly - to the menu items and buttons as the main way of interacting with &app;. - In addition to this, &app; provides an extensive set of keybindings. - The detailed reference to the keybindings is found in - the . - - -Add, Remove, and Edit buttons -In order to save precious screen space, most of the -Add, Remove, -and Edit buttons no longer are labeled -with text. Instead, the first two use + and -- icons, and the third uses the icon -depicting a pen on top of a paper sheet. - -We will continue referring to the latter as the Edit -button, while using + and -- to denote the former two buttons. - - - - - Personal Information - Editing of personal data can be performed in the - following ways: - - From the People View: - Double-click the name of the person whose data you would like - to edit, or select the name by single click and then click the - Edit icon on the toolbar. You may also select - the name and then press Enter. Finally, you may select - Edit... from the Edit - menu of &app; or choose Edit from the context - menu that appears upon right-click on the name. - - - From the Family View: - To edit active person's data, move the mouse into the - Active person box, then double-click, - or use any of the menu items described above. - To edit Spouse's data, Shift-click desired spouse entry. Also, from - Spouse and Children boxes - you may select the desired person, right-click, and then select the - menu item from the context menu to edit the selected person's data. - - - From the Pedigree View: - Move the mouse into the box bearing the name of the person whose - data you would like to edit, then double-click. - - - - - With either method, the following Edit - Person dialog will appear: - - -
- Edit Person dialog - - - Shows Edit Person dialog. -
- - - The top of the window shows the name of the person whose - data is being edited. The main part of the window displays ten - notebook tabs containing different categories of available - information. You can bring any tab to the top for viewing - or editing by clicking on the appropriate tab heading. - The bottom part has OK and - Cancel buttons. Clicking the - OK button - at any time will apply all the changes made in all tabs and close the - dialog window. Clicking the Cancel button at any time will - close the window without applying any changes. If any of the data - in any tab were modified, the alert window will appear with the - choices of closing the dialog without saving changes, canceling the - initial cancel request, or saving the changes. - - -Clicking OK will immediately -save changes to the database (write on disk). Unlike previous versions, -this version of &app; does not have a separate saving function, -all changes are immediate. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - The tabs provide the following information categories of - personal data: - - - - General - - The General tab allows editing of - general information about the person. This includes the text - entry fields of Given name, - Family name, Family prefix - (such as de or van), Suffix (e.g. Jr. or III), - Title (e.g. Dr. or Rev.), - Nickname (Bob for Robert), - Type of the name (birth name, married name, etc.) - and Date and Place of birth - and death. Some of these (Family name, - Type, and both Place fields), - also provide autocompletion feature: as you type in these fields, the menu - is displayed below the field with the available entries from the database - that are compatible with your partial input. This allows for a quick selection - of an available entry by selecting in from the menu, either using - the mouse or arrows and Enter key. - - -The Edit button located by the Family name -entry allows editing the preferred name in complete detail, by invoking the Name -Editor dialog (see ). - - - - - The Gender radio buttons offer - the choice of person's gender between male, - female, and unknown. - Clicking the colored circle buttons (green, yellow, or red, also called LED buttons) - located next to - the birth and death Date fields will bring up the Date Selection - dialog allowing detailed modification of the date, see . - Clicking either Edit button located next to - the birth and death LED buttons will bring up a dialog allowing you to - edit the corresponding event (birth or death) details, see . - - The field ID displays an internal - &app; ID number which identifies the user in the - database. The Image area shows the first - image available in the Gallery of this - person (if any exist). - - - Finally, the Information is complete and - Information is private check buttons provides - the way to mark whether this person's record is complete or not and - whether it is a private record. - - - - - Names - - - -
- Edit Person dialog - Names - - - Shows Names Tab of Edit Person dialog. -
- - - The Names tab displays information concerning - alternate names of the person and the controls allowing their - modification. The bottom part displays the list of all alternate names - of the person stored in the database. The top part shows the details - of the currently selected name in the list (if any). The buttons - +, Edit, - and - allow the addition, - modification, and removal of an alternate name record from the database. - Note that the Edit and - - buttons become available only when - an alternate name is selected from the list. - -
-
- - - Events - - - -
- Edit Person dialog - Events - - - Shows Events Tab of Edit Person dialog. -
- - - The Events tab displays information about - the events relevant to the person and controls allowing its - modification. The bottom part displays the list of all such events - stored in the database. The top part shows the details - of the currently selected event in the list (if any). The buttons - +, Edit, - and - allow you to correspondingly add, - modify, and remove an event record from the database. - Note that the Edit and - - buttons become available only when - an event is selected from the list. - -
-
- - - Attributes - - - -
- Edit Person dialog - Attributes - - - Shows Attributes Tab of Edit Person dialog. -
- - - The Attributes tab displays information about - the attributes of the person and controls allowing their - modification. These could be any personal attributes of a person whose - description naturally fits into Parameter-Value pairs (e.g. enormous - generosity can be stored as the parameter "Generosity" with the - value "Enormous", etc.). The bottom part displays the list of all - attributes stored in the database. The top part shows the details - of the currently selected attribute in the list (if any). The buttons - +, Edit, - and - allow you to correspondingly add, - modify, and remove an attribute record from the database. - Note that the Edit and - - buttons become available only when - an attribute is selected from the list. - -
-
- - - Addresses - - - -
- Edit Person dialog - Addresses - - - Shows Addresses Tab of Edit Person dialog. -
- - - The Addresses tab displays information about - the addresses of the person and the controls allowing their - modification. The bottom part displays the list of all - addresses stored in the database. The top part shows the details - of the currently selected address in the list (if any). The buttons - +, Edit, - and - allow you to correspondingly add, - modify, and remove an address record from the database. - Note that the Edit and - - buttons become available only when - an address is selected from the list. - - - Some reports allow you to restrict data on living people. - In particular, that option will omit the addresses of people who - are currently alive. -
-
- - - Notes - - - -
- Edit Person dialog - Notes - - - Shows Notes Tab of Edit Person dialog. -
- - - The Notes tab displays information about - the notes concerning the person. These could be any notes which do not - naturally fit into the Parameter-Value pairs available to Attributes. - To add a note or modify existing notes simply edit the text in the - text entry field. +
+ + + To keep the reference to the object corresponding to the + missing file, click the Keep + Reference button. This will leave things as is, + i.e. in an inconsistent state. You could supply the missing + file later, in which case you will have to copy it into your + database directory. Choose this option if the replacement is + possible, but not available right now. + + + + + To supply the missing file during import, click the + Select File button. This will copy + the file you select in place of the missing file. No + references will be altered in the database, and it will be + in the consistent state. Use this option if the replacement + is readily available. + + + + + To automatically use the selection made in this dialog for + all missing media files, check the Use this + selection for all missing media files box. This + will remember your choice and use it for all media files + missing during this import, so that no further dialogs will + be presented. Use this option if you anticipate many missing + files and want to deal with all of them in the same manner. + + + +
+ + + Exporting Data + + Exporting allows you to share any portion of your &app; database + with other researchers as well as to make your database + completely portable to another computer. Currently, &app; can + export data to the following formats: &app; database (grdb), + &app; XML, GEDCOM, &app; package, Web Family Tree, and GeneWeb. + + + Export is saving a copy + + Exporting will create another file with the copy of your data. + The database currently opened in your &app; window is NOT the + file saved by your export. Future editing of the currently + opened database will not alter the copy produced by the + export. + + + + To export data, choose + + File + Export + . + This will bring up the Export druid. Its + pages will guide you through the format selection (see ), file selection, and format + specific export options (see ). After a final confirmation + page, the export will be performed according to the choices you + have made. At any time, you can click the + Back and revise any selection, and then + go forward to redo the export. - - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - - - Sources - + - -
- Edit Person dialog - Sources - - - Shows Sources Tab of Edit Person dialog. -
- +
+ Export druid: format selection + + + + + + + Shows format selection page of an Export druid + + + +
+ + GEDCOM export + + GEDCOM export options allow you to fine tune your export (see + ). Choose the desired + Encoding of the exported file. Use the + Filter pop-up menu to limit the scope of + the export according to the stated rule. Use the + Target menu to select the desired GEDCOM + dialect. Select your copyright statement from the + Copyright menu. Check Do not + include records marked private to disable the + output of private records. Check Restrict data on + living people to limit living people's data to + family ties. With this option, information concerning birth, + death, addresses, various events, etc. will be omitted in the + exported GEDCOM file. If this option is selected, you can + further choose whether to use the word "Living" as first name, + exclude notes, and exclude sources for the living + people. Check Reference images from path + to tell &app; to use the specific path for your images when + writing image references in GEDCOM. + + +
+ Export druid: GEDCOM options + + + + + + + Shows GEDCOM options page of an Export druid + + + +
+ +
+ + Export into &app; formats + + + &app; database (grdb) export + + + Exporting to the native format will simply make a copy + of your data under another name. It also may be useful + if you have directly opened XML or GEDCOM file and + would like to save it as the grdb file. + + + + + &app; XML database export + + + Exporting into &app; XML format will produce a database + compatible with the previous versions of &app;. As XML + is a text-based human-readable format, you may also use + it to take a look at your data. + + + + + &app; package export + + + Exporting to &app; package will create a gzip-compressed + tar archive (also known as tarball) which contains + gramps database and copies of all media objects + files. This is a useful format for moving your database + to another machine or for sharing it with somebody, + while retaining all the features provided by &app; . + + + + + Export to CD + + + Exporting to CD will prepare your database and copies of + all media objects files to be recorded to the CD. This + is done through the burn:/// + location in Nautilus. After exporting to CD, go to the + burn:/// location by selecting + + Go + CD Creator + - The Sources tab displays information about - the sources related to the person and controls allowing its modification. - These could be any general sources which refer to the person but do not - describe specifically any event. - For example, Aunt Martha's memoirs may mention her great grandson Paul, - so the researcher may assume that this person (Paul) existed and cite - the memoirs as the source for this assumption. - - - Sources documenting - specific events are better recorded in relation to those events, under the - Events tab. The person's Sources - tab is best used for general source references. - - The central part displays the list of all source references stored - in the database in relation to the person. The - buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove a source reference - to this person. Note that the Edit and - - buttons become available only when - a source reference is selected from the list. + in Nautilus menu (unless this location is already + displayed by &app;). Your database directory will show + up. To record it on to the CD, click the CD icon on the + Nautilus toolbar, or select + + File + Write to CD + + in Nautilus menu. + + + + + + If a media file is not found during export, the following + dialog will prompt you for the possible actions: + -
-
+ +
+ Missing Media dialog + + + + + + + Shows Missing Media dialog. + + + +
- - Gallery - + - - - - - The Gallery tab displays information about - media objects associated with the person and controls allowing subsequent - modification. The central part shows the list of all such media objects. - For media object which are valid image files, previews of images are - displayed. For other objects such as audio files, movie files, etc., a - corresponding file type icon is displayed instead. - - The first available - image in the gallery will be also displayed in the - Image area in the General - tab. - - - The buttons +, - Select, - Edit, and - allow - you to correspondingly add a new image, add a reference to an image already - stored in the database, modify, and remove a media object reference - to this person. Note that the Edit and - - buttons become available only when - a media object is selected from the list. - - - Removing a media object from a person's gallery does not - remove it from the database. It only removes the reference to that - object from this person's record. - - - - - - Internet - - - -
- Edit Person dialog - Internet - - - Shows Internet Tab of Edit Person dialog. -
- - - The Internet tab displays information about - Internet addresses relevant to the person and the controls - allowing data modification. The bottom part displays the list of all - such Internet addresses stored in the database. The top part shows the - details of the currently selected addresses in the list (if any). - The buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove an Internet address - record from the database. The button Go allows - opening a web-page with the corresponding address with your default - browser. Note that the Edit, - -, and Go buttons - become available only when an address is selected from the list. - -
-
- - - LDS - - - -
- Edit Person dialog - LDS - - - Shows LDS Tab of Edit Person dialog. -
- - - The LDS tab displays information - about LDS ordinances of the person and controls allowing - modification. These are LDS baptism, - Endowment, and Sealed to - parents ordinances, as labeled inside the tab. - Each ordinance is described by its date, LDS temple, and Place where - it happened. An additional pop-up menu Parents is - available for the Sealed to parents ordinance. - Each ordinance can further be described by its status through the - selections available in the Status pop-up - menu and can also be referenced by sources and notes via corresponding - Sources... and Note - buttons. - -
-
- - - - - - Dates - This section describes the details of entering and modifying dates. - Dates are important in genealogical research, so &app; goes a long - way to preserve and use any date information available. - - - Date types and validity indicators -&app; uses color circles to indicate the validity of the entered date. - -Date LED buttons -The color circles are also referred to as the LED buttons. -Clicking on an LED button will invoke the Date selection -dialog described in detail below, see - - - - Green circle means that the date is valid and - complete regular date (e.g. May 24, 1961). In simple terms, green - means that the date is uniquely defined up to a day. - - Yellow circle means that the date is valid but is - not a regular date. This could be the date of an alternative type: - a before date (before May 25, 1962), an after date (after May, 1960), - an about date (about May 23, 1961), a range (between May 1, 1961 and May 31, 1961), - or a span (from May 1, 1961 to May 31, 1961). It can also be a complete - single date, but with quality of Estimated or Calculated. Finally, it could - be a partial date, i.e. a regular quality single date missing some - portion, e.g. May 1961 or 1961. - - While partial dates do - not uniquely define the day, they allow at least for some type of - comparisons between the dates. - - Red circle means that the date is not recognized as - a valid date (e.g. "Christmas week of 61", or "the summer when I had surgery"). - n that case the date will be stored as a text string. Therefore, no comparison - with other dates will be available. It is best to avoid such date entries. Same - information can be entered as a note for the event of interest instead - of a date. In the example considered, a better things to do is to - enter December 1961 as a date and "Christmas week of 61" as a note. - - - - - - - Acceptable date entries - - &app; recognizes many - formats of exact dates. The numeric formats are determined - by the default environment &app; is running under. Most European - countries use DD.MM.YYYY, the US commonly uses MM/DD/YYYY, - and so on. - -Besides exact dates, &app; - recognizes many dates that are not regular: before, after, about, ranges - and spans. It also understands the quality: estimated or calculated. - Finally, it supports partial dates and many alternative calendars. - Below is the list of date entry rules to allow precise date parsing. - - Date parsing rules - The list below is only valid for English. If you are using localized version - of &app;, your version may or may not provide a localized date parser. - At the time of this writing, localized parsers exist for French, Russian, and - Spanish languages. - - If the localized parser is available for your version, chances are - that other rules are in effect. If there's no manual in your language yet, - you may try following your instinct and go with the common ways - of denoting dates in your language. If all else fails, use the Date - selection dialog described below. - - - - Regular single dates can be entered just as you would - write them in the letter: May 24, 1961 or January 1, 2004. - - Dates that are not regular should start with the quality: - estimated or calculated, if applicable. Regular quality does not need to be - specified, as it is the default. Example: est. 1961, or calc 2005. + + + + To remove the object corresponding to the missing file + as well as all the references to that object from + various database records, click the Remove + Object button. This will alter your database + so that it will be in the consistent state, but all the + references to the missing file will be gone. Use this + option if the file is irrevocably lost and there is no + possibility of ever replacing it. + + + + To keep the reference to the object corresponding to the + missing file, click the Keep + Reference button. This will leave things as + is, i.e. in the inconsistent state. You could supply + the missing file later, in which case you will have to + copy it into your database directory. Choose this option + if the replacement is possible, but not available right + now. + + + + + To supply the missing file during export, click the + Select File button. This will + copy the file you select in place of the missing + file. No references will be altered in the database, and + it will be in the consistent state. Use this option if + the replacement is readily available. + + + + + To automatically use the selection made in this dialog + for all missing media files, check the Use + this selection for all missing media files + box. This will remember your choice and use it for all + media files missing during this export, so that no + further dialogs will be presented. Use this option if + you anticipate many missing files and want to deal with + all of them in the same manner. + + + + + + Export into other formats + + + Web Family Tree + + + Exporting to Web Family Tree will create the text file + suitable as an input for the WFT program. Specific + options include filter selection and the ability to + restrict data on living people, that is to limit living + people's data to family ties. + + + + + GeneWeb + + + Exporting to GeneWeb will save a copy of your data into + a popular web genealogy format. To find out more about + GeneWeb and its format, visit + this site. + + + + + vCalendar and vCard + + + Exporting to vCalendar or vCard will save information in + a format used in many calendaring and addressbook + applications, sometimes called PIM for Personal + Information Manager. + + + + + +
+ + + Editing Data: Quick Start + + Editing any portion of data allows you to amend and/or modify + information stored in the database. The available editing + options include editing personal data, relationship data, data + about children and parents, and information about sources, + places, and media objects used in the database. In short, any + data stored in the database can be edited! Adding a new piece + of information is the process of creating an appropriate empty + data structure and subsequently editing that empty structure. + + + This section refers mainly to the menu items and buttons as + the main way of interacting with &app;. In addition to this, + &app; provides an extensive set of key bindings. The detailed + reference to the key bindings is found in the + . + + + + To Add a Person + + To add a person to the database, switch to the People View + () and then click the + Add on the toolbar. Enter any data you + know about this person into the Edit + Person Dialog (see + for details). To edit information about a person already + present in the database, select an entry you would like to + view/modify, and then click the Edit + icon on the toolbar. + + + You can also use Add... and + Edit... menu items available under the + Edit. Or you can right-click on the + person and select Add... or + Edit... from the invoked context menu. + + + + + To Specify a Relationship + - Next should appear the type: before, after, or about. - Ranges are denoted with "between DATE and DATE" and spans use "from DATE - to DATE" patterns, where DATE stands for a single date. - - Examples: est from 2001 to 2003, before June 1975, est about 2000, - calc between May 1900 and January 1, 1990. - - - Partial dates are entered simply by omitting unknown - information: May 1961, 2004. - - - Alternate calendars are calendars other than Gregorian - calendar. Currently, &app; supports Hebrew, - French Republican, Julian, Islamic, and Persian alternate calendars. - To specify the calendar other than the default Gregorian, - append the name of the calendar to the date string, e.g. - "January 9, 1905 (julian)". - + To specify a relationship, first switch to the Family View + (). Then click one of the two top + buttons on the right of the spouse box. The topmost button + adds a new person to the database and to the relationship, + while the second top button adds a person that is already in a + database to the relationship. + + + If using the second button, select the spouse/partner from the + list and specify the relationship using the menu at the + bottom. If necessary, you can add a person to the list by + clicking the + button. &app; will + filter the displayed list of people based on the apparent + relationship possibility. Specifically, shown are the people who + could possibly be in relationship with the active person, as + judged by the available birth and death information. To + override this and display all people from the database, check + the Show all box. + + + To edit information about a relationship already present in + the database, move the mouse over the + Spouse box and double-click. If the + relationship lists has more than one person, you can specify + the preferred spouse/partner by selecting an appropriate item + from the context menu available upon right-clicking into the + spouse box. Also, most of the above function are available + from the items of this context menu. + + + + + To Specify Parents + + To specify parents of an active person, first switch to the + Family View (). Then click the + + button on the right of the active + person's parents list box. Select the parents from two lists + and specify the parents' relationships to the active person + using menus at the bottom. You can also specify parents' + relationship to each other. If necessary, you can add a + person to the list by clicking the + Add... button. + + + The top and bottom lists contain males and females, + respectively. By default, &app; will limit both lists to + people who could possibly be the parents (judged by the date + of birth) of the active person. To override this, check the + Show all box for each list. + + + To specify parents of the active person's spouse, switch to + the Family View and then click the + + button on the right of the spouse's parents list box. To edit + information about parents already present in the database, + move the mouse over the corresponding parents' box and + double-click. All these functions can also be performed by + right-clicking on the parents' box and selecting an + appropriate item from the context menu. + + + + + To Specify Children + + To specify children of an active person, switch to the Family + View () and then click either the + second or the third button from the top on the right of the + children list box. The second button adds a child to the + database and to the family, while the third button adds a + child already present in the database to the family. + + + If using the third button, select a child from the list and + specify the child's relationship with father and mother using + menus at the bottom. If necessary, you can add a person to the + list by clicking the Add... button. By + default, &app; will limit the lists to people who could + possibly be the child (judged by the date of birth) of the + active person. To override this, check the Show + all box. + + + The relationship of the child to the parents can be modified + by selecting an appropriate item from the context menu + available upon right-clicking into the children box. Also, + most of the above function are available from the items of + this context menu. + + + + + To Add Images + + You can add images (as well as other media objects) to + individual people, events, sources, places, as well as images + generally related to the database (e.g. group family photos). + + + To add images related to a single person, switch to the People + View (), select a person, and + then click the Edit icon on the toolbar + to invoke the Edit Person Dialog + (). Then, select the + Gallery tab, and click the + + button to invoke the Select + a media object dialog. Type the filename or select + a file with the image, then provide a title for that + image. Keep adding images until you are done. + + + To add images related to a relationship (e.g. marriage), + switch to the Family View () and + then double-click on the Spouse box invoke the + Marriage/Relationship editor + dialog. Select the Gallery tab and click + the + button to add an image. + + + To add images related to a source or a place, first switch to + the Sources View () or Places + View (), respectively. Then select + the appropriate source or place and then either double-click + on it or click the Edit icon on the + toolbar to invoke the Source Editor (or + Place Editor) dialog. Select the + Gallery tab and click the + + button to add an image. + + + Finally, to add images that are generally related to the + database but not limited to any person, relationship, source, + or place in particular, switch to the Media View (). Then click the + Add icon on the toolbar to add an + image. If you have already added any images to any individual + galleries, you will also find them listed in the Media View. + + + In any gallery, you can also use the + Edit and - + buttons to edit image information and to remove the image + reference from that gallery. Note that in all galleries + removing the reference to the image does not remove the image + from the database. To completely remove the image from the + database, delete it from Media View by first selecting it and + then clicking the Remove icon on the + toolbar. + + + + + + To Edit Sources and Places + + To add a source or a place to the database, switch to the + appropriate Sources View () or + Places View (). Then click the + Add icon on the toolbar to add a + source/place. Enter the information into the Source + Editor (or Place Editor) + dialog. + + + To edit information about sources and places already present + in the database, switch to the appropriate view, select an + entry you would like to view/modify, and then click the + Edit icon on the + toolbar. Alternatively, you may double-click on the entry to + edit it. + + + + + + + + Editing Data: Complete Description + + This section provides a complete description of all editing + options for all pieces of data in the &app; database. It refers + mainly to the menu items and buttons as the main way of + interacting with &app;. In addition to this, &app; provides an + extensive set of keybindings. The detailed reference to the + keybindings is found in the . + + + Add, Remove, and Edit buttons + + In order to save precious screen space, most of the + Add, Remove, + and Edit buttons no longer are labeled + with text. Instead, the first two use + + and - icons, + and the third uses the icon depicting a pen on top of a paper + sheet. + + + Reference the latter as the + Edit button, while using + + and - to + denote the former two buttons. + + + + + + + Personal Information + + Editing of personal data can be performed in the following + ways: + + + + From the People View: + + + Double-click the name of the person whose data you would + like to edit, or select the name by single click and + then click the Edit icon on the + toolbar. You may also select the name and then press + Enter. Finally, you may select + Edit... from the + Edit menu of &app; or choose + Edit from the context menu + that appears upon right-click on the name. + + + + + From the Family View: + + + To edit active person's data, move the mouse into the + Active person box, then + double-click, or use any of the menu items described + above. To edit Spouse's data, Shift-click desired + spouse entry. Also, from Spouse and + Children boxes you may select the + desired person, right-click, and then select the menu + item from the context menu to edit the selected person's + data. + + + + + From the Pedigree View: + + + Move the mouse into the box bearing the name of the + person whose data you would like to edit, then + double-click. + + + + + + With either method, the following Edit + Person dialog will appear: + + + + +
+ Edit Person dialog + + + + + + + Shows Edit Person dialog. + + + +
+ + + + + The top of the window shows the name of the person whose + data is being edited. The main part of the window displays + ten notebook tabs containing different categories of + available information. You can bring any tab to the top for + viewing or editing by clicking on the appropriate tab + heading. The bottom part has OK and + Cancel buttons. Clicking the + OK button at any time will apply all + the changes made in all tabs and close the dialog + window. Clicking the Cancel button at + any time will close the window without applying any + changes. If any of the data in any tab were modified, the + alert window will appear with the choices of closing the + dialog without saving changes, canceling the initial cancel + request, or saving the changes. + + + + Clicking OK will immediately save + changes to the database (write on disk). This version of + &app; does not have a separate saving function, all + changes are immediate. + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label + appears boldface; if the tab has no data then its label + appears regular (not bold). + + + + The tabs provide the following information categories of + personal data: + + + + + General + + + + The General tab allows editing of + general information about the person. This includes + the text entry fields of Given + name, Family name, + Family prefix (such as de or + van), Suffix (e.g. Jr. or III), + Title (e.g. Dr. or Rev.), + Nickname (Bob for Robert), + Type of the name (birth name, + married name, etc.) and Date and + Place of birth and death. Some of + these (Family name, + Type, and both + Place fields), also provide + autocompletion feature: as you type in these fields, + the menu is displayed below the field with the + available entries from the database that are + compatible with your partial input. This allows for a + quick selection of an available entry by selecting it + from the menu, either using the mouse or arrows and + Enter key. + + + The Edit button located by the + Family name entry allows editing + the preferred name in complete detail, by invoking + the Name Editor dialog (see + ). + + + The Gender radio buttons offer the + choice of person's gender between + male, female, + and unknown. Clicking the colored + circle buttons (green, yellow, or red, also called LED + buttons) located next to the birth and death Date fields + will bring up the Date Selection + dialog allowing detailed modification of the date, see + . Clicking either + Edit button located next to the + birth and death LED buttons will bring up a dialog + allowing you to edit the corresponding event (birth or + death) details, see . The field + ID displays an internal &app; ID + number which identifies the user in the database. The + Image area shows the first image + available in the Gallery of this + person (if any exist). + + + Finally, the Information is + complete and Information is + private check buttons provides the way to + mark whether this person's record is complete or not and + whether it is a private record. + + + + + + + + Names + + + + + +
+ Edit Person dialog - Names + + + + + + + Shows Names Tab of Edit Person dialog. + + + +
+ + + + + The Names tab displays information + concerning alternate names of the person and the + controls allowing their modification. The bottom part + displays the list of all alternate names of the person + stored in the database. The top part shows the details + of the currently selected name in the list (if any). The + buttons +, + Edit, and + - allow the addition, + modification, and removal of an alternate name record + from the database. Note that the + Edit and - + buttons become available only when an alternate name is + selected from the list. + +
+
+
+ + + + Events + + + +
+ Edit Person dialog - Events + + + + + + + Shows Events Tab of Edit Person dialog. + + + +
+ + + The Events tab displays information + about the events relevant to the person and controls + allowing its modification. The bottom part displays the + list of all such events stored in the database. The top + part shows the details of the currently selected event + in the list (if any). The buttons + +, Edit, + and - allow you to + correspondingly add, modify, and remove an event record + from the database. Note that the + Edit and - + buttons become available only when an event is selected + from the list. + +
+
+
+ + + + Attributes + + + +
+ Edit Person dialog - Attributes + + + + + + + Shows Attributes Tab of Edit Person dialog. + + + +
+ + + The Attributes tab displays + information about the attributes of the person and + controls allowing their modification. These could be any + personal attributes of a person whose description + naturally fits into Parameter-Value pairs (e.g. enormous + generosity can be stored as the parameter "Generosity" + with the value "Enormous", etc.). The bottom part + displays the list of all attributes stored in the + database. The top part shows the details of the + currently selected attribute in the list (if any). The + buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove an attribute record from the + database. Note that the Edit and + - buttons become available only + when an attribute is selected from the list. + +
+
+
+ + + + Addresses + + + +
+ Edit Person dialog - Addresses + + + + + + + Shows Addresses Tab of Edit Person dialog. + + + +
+ + + The Addresses tab displays + information about the addresses of the person and the + controls allowing their modification. The bottom part + displays the list of all addresses stored in the + database. The top part shows the details of the + currently selected address in the list (if any). The + buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove an address record from the + database. Note that the Edit and + - buttons become available only + when an address is selected from the list. + + + Some reports allow you to restrict data on living + people. In particular, that option will omit the + addresses of people who are currently alive. + +
+
+
+ + + + Notes + + + +
+ Edit Person dialog - Notes + + + + + + + Shows Notes Tab of Edit Person dialog. + + + +
+ + + + The Notes tab displays information + about the notes concerning the person. These could be + any notes which do not naturally fit into the + Parameter-Value pairs available to Attributes. To add + a note or modify existing notes simply edit the text in + the text entry field. + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + +
+
+
+ + + + Sources + + + + + +
+ Edit Person dialog - Sources + + + + + + + Shows Sources Tab of Edit Person dialog. + + + + +
+ + + + The Sources tab displays + information about the sources related to the person and + controls allowing its modification. These could be any + general sources which refer to the person but do not + describe specifically any event. For example, Aunt + Martha's memoirs may mention her great grandson Paul, so + the researcher may assume that this person (Paul) + existed and cite the memoirs as the source for this + assumption. + + + + Sources documenting specific events are better + recorded in relation to those events, under the + Events tab. The person's + Sources tab is best used for + general source references. + + + + The central part displays the list of all source + references stored in the database in relation to the + person. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a source reference to this + person. Note that the Edit and + - buttons become available only + when a source reference is selected from the list. + +
+
+
+ + + + Gallery + + + + + + + + + + + The Gallery tab displays + information about media objects associated with the + person and controls allowing subsequent + modification. The central part shows the list of all + such media objects. For media object which are valid + image files, previews of images are displayed. For other + objects such as audio files, movie files, etc., a + corresponding file type icon is displayed instead. + + + + The first available image in the gallery will be also + displayed in the Image area in + the General tab. + + + + The buttons +, + Select, + Edit, and + - allow you to correspondingly + add a new image, add a reference to an image already + stored in the database, modify, and remove a media + object reference to this person. Note that the + Edit and - + buttons become available only when a media object is + selected from the list. + + + + Removing a media object from a person's gallery does + not remove it from the database. It only removes the + reference to that object from this person's record. + + + + + + + + + Internet + + + + + +
+ Edit Person dialog - Internet + + + + + + + Shows Internet Tab of Edit Person dialog. + + + +
+ + + + + The Internet tab displays + information about Internet addresses relevant to the + person and the controls allowing data modification. The + bottom part displays the list of all such Internet + addresses stored in the database. The top part shows the + details of the currently selected addresses in the list + (if any). The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove an Internet address record from + the database. The button Go + allows opening a web-page with the corresponding address + with your default browser. Note that the + Edit, -, + and Go buttons become available + only when an address is selected from the list. + +
+
+
+ + + + LDS + + + + + +
+ Edit Person dialog - LDS + + + + + + + Shows LDS Tab of Edit Person dialog. + + + +
+ + + The LDS tab displays information + about LDS ordinances of the person and controls allowing + modification. These are LDS + baptism, Endowment, and + Sealed to parents ordinances, as + labeled inside the tab. Each ordinance is described by + its date, LDS temple, and Place where it happened. An + additional pop-up menu Parents is + available for the Sealed to parents + ordinance. Each ordinance can further be described by + its status through the selections available in the + Status pop-up menu and can also be + referenced by sources and notes via corresponding + Sources... and + Note buttons. + +
+
+
+
+ + + + + Dates + + This section describes the details of entering and modifying + dates. Dates are important in genealogical research, so &app; + goes a long way to preserve and use any date information + available. + + + Date types and validity indicators + + &app; uses color circles to indicate the validity of the + entered date. + + + Date LED buttons + + The color circles are also referred to as the LED buttons. + Clicking on an LED button will invoke the Date + selection dialog described in detail below, see + + + + + + + Green circle means that the date is valid and complete + regular date (e.g. May 24, 1961). In simple terms, green + means that the date is uniquely defined up to a day. + + + + + Yellow circle means that the date is valid but is not a + regular date. This could be the date of an alternative + type: a before date (before May 25, 1962), an after date + (after May, 1960), an about date (about May 23, 1961), a + range (between May 1, 1961 and May 31, 1961), or a span + (from May 1, 1961 to May 31, 1961). It can also be a + complete single date, but with quality of Estimated or + Calculated. Finally, it could be a partial date, i.e. a + regular quality single date missing some portion, + e.g. May 1961 or 1961. + + + While partial dates do not uniquely define the day, they + allow at least for some type of comparisons between the + dates. + + + + + Red circle means that the date is not recognized as a + valid date (e.g. "Christmas week of 61", or "the summer + when I had surgery"). n that case the date will be + stored as a text string. Therefore, no comparison with + other dates will be available. It is best to avoid such + date entries. Same information can be entered as a note + for the event of interest instead of a date. In the + example considered, a better things to do is to enter + December 1961 as a date and "Christmas week of 61" as a + note. + + - - - Graphical User Interface for entering dates - While the above rules provide a quick and easy way for entering most - common dates, sometimes there is a need to either build a complex date or simply - check the date using graphical user interface. The Date selection - dialog can be invoked by clicking the color circle button (also known as the LED - button) next to the date entry field. - + + + Acceptable date entries + + &app; recognizes many formats of exact dates. The numeric + formats are determined by the default environment &app; is + running under. Most European countries use DD.MM.YYYY, the + US commonly uses MM/DD/YYYY, and so on. + + + Besides exact dates, &app; recognizes many dates that are + not regular: before, after, about, ranges and spans. It also + understands the quality: estimated or calculated. Finally, + it supports partial dates and many alternative calendars. + Below is the list of date entry rules to allow precise date + parsing. + + + Date parsing rules + + The list below is only valid for English. If you are using + localized version of &app;, your version may or may not + provide a localized date parser. At the time of this + writing, localized parsers exist for French, Russian, and + Spanish languages. + + + If the localized parser is available for your version, + chances are that other rules are in effect. If there's no + manual in your language yet, you may try following your + instinct and go with the common ways of denoting dates in + your language. If all else fails, use the Date + selection dialog described below. + + + + + + Regular single dates can be entered just as you would + write them in the letter: May 24, 1961 or January 1, + 2004. + + + + + Dates that are not regular should start with the + quality: estimated or calculated, if applicable. Regular + quality does not need to be specified, as it is the + default. Example: est. 1961, or calc 2005. + + + + + Next should appear the type: before, after, or about. + Ranges are denoted with "between DATE and DATE" and + spans use "from DATE to DATE" patterns, where DATE + stands for a single date. + + + Examples: est from 2001 to 2003, before June 1975, est + about 2000, calc between May 1900 and January 1, 1990. + + + + + Partial dates are entered simply by omitting unknown + information: May 1961, 2004. + + + + + Alternate calendars are calendars other than Gregorian + calendar. Currently, &app; supports Hebrew, French + Republican, Julian, Islamic, and Persian alternate + calendars. To specify the calendar other than the + default Gregorian, append the name of the calendar to + the date string, e.g. "January 9, 1905 (julian)". + + + + + + Graphical User Interface for entering dates + + While the above rules provide a quick and easy way for + entering most common dates, sometimes there is a need to + either build a complex date or simply check the date using + graphical user interface. The Date + selection dialog can be invoked by clicking the + color circle button (also known as the LED button) next to + the date entry field. + - -
- Date selection dialog - - - Shows Date selection dialog. -
- + - The Calendar menu allows the choice - of any supported calendar. The Quality menu - provides choices of Regular, Estimated, or Calculated quality. The - Type menu allows to adjust the exact date type: - Regular, Before, After, About, Range, Span, and Text only. - A set of controls labeled Date allows setting - the day, the month, and the year for a date. The second set of controls, - Second date, is disabled for all dates except - for those of Range and Span type. For ranges and spans, the - Second date controls allow setting the details - of the second date. Finally, the Text comment - text entry field allows storing an arbitrary text string along with the date. - - - If you enter the date outside this dialog, i.e. as a text - in any date entry field, that text will be copied and stored as the text - comment string during parsing of entered text. - - Therefore, the comment only lives until the next parsing. - If you have some important text corresponding to the date, you - are probably better off by saving that text as a Note for the - corresponding event. + +
+ Date selection dialog + + + + + + + Shows Date selection dialog. + + + +
+
-
+ - - - Relationship Data - Editing of relationship data is performed in the following - Marriage/Relationship Editor dialog which appears - after double-clicking on the spouse box in the Family View. Alternatively, - you may invoke this dialog by right-clicking into the spouse box - and selecting Edit relationship item from - the context menu. + + The Calendar menu allows the choice of + any supported calendar. The Quality + menu provides choices of Regular, Estimated, or Calculated + quality. The Type menu allows to adjust + the exact date type: Regular, Before, After, About, Range, + Span, and Text only. A set of controls labeled + Date allows setting the day, the month, + and the year for a date. The second set of controls, + Second date, is disabled for all dates + except for those of Range and Span type. For ranges and + spans, the Second date controls allow + setting the details of the second date. Finally, the + Text comment text entry field allows + storing an arbitrary text string along with the date. + + + + If you enter the date outside this dialog, i.e. as a text + in any date entry field, that text will be copied and + stored as the text comment string during parsing of + entered text. + + + Therefore, the comment only lives until the next parsing. + If you have some important text corresponding to the date, + you are probably better off by saving that text as a Note + for the corresponding event. + + + + - -
- Marriage/Relationship Editor dialog - - - Shows Marriage/Relationship Editor dialog. -
- - - The top of the window shows the names of the people whose - relationship is being edited. The main part of the window displays - seven notebook tabs containing different categories of available - information. You can bring any tab to the top for viewing - or editing by clicking on the appropriate tab heading. + + + + Relationship Data + + Editing of relationship data is performed in the following + Marriage/Relationship Editor dialog which + appears after double-clicking on the spouse box in the Family + View. Alternatively, you may invoke this dialog by + right-clicking into the spouse box and selecting + Edit relationship item from the context + menu. + + +
+ Marriage/Relationship Editor dialog + + + + + + + Shows Marriage/Relationship Editor dialog. + + + +
+ + + The top of the window shows the names of the people whose + relationship is being edited. The main part of the window + displays seven notebook tabs containing different categories + of available information. You can bring any tab to the top for + viewing or editing by clicking on the appropriate tab heading. The bottom part has OK and - Cancel buttons. Clicking the - OK button - at any time will apply all the changes made in all tabs and close the - dialog window. Clicking the Cancel button at any time will - close the window without applying any changes. If any of the data - in any tab were modified, the alert window will appear with the - choices of closing the dialog without saving changes, canceling the - initial cancel request, or saving the changes. - -Clicking OK will immediately -save changes to the database (write on disk). Unlike previous versions, -this version of &app; does not have a separate saving function, -all changes are immediate. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - The tabs provide the following information categories of + Cancel buttons. Clicking the + OK button at any time will apply all + the changes made in all tabs and close the dialog + window. Clicking the Cancel button at + any time will close the window without applying any + changes. If any of the data in any tab were modified, the + alert window will appear with the choices of closing the + dialog without saving changes, canceling the initial cancel + request, or saving the changes. + + + + Clicking OK will immediately save + changes to the database (write on disk). This version of + &app; does not have a separate saving function, all changes + are immediate. + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label + appears boldface; if the tab has no data then its label + appears regular (not bold). + + + + The tabs provide the following information categories of relationship data: - +
+ + + + General + + + + The General tab allows editing of + the most general information about the relationship: the + relationship type. The available types (such as + married, partners, etc.) can be chosen from the + drop-down Relationship type menu. + The ID field displays &app; ID + number which labels this relationship in the + database. The Last changed label + shows the last modification time for this relationship. + Finally, the Information is + complete check button provides the way to + mark whether this relationship's record is complete or + not. + + + + + + + + Events + + + + The Events tab displays information + about the events relevant to the relationship and the + controls allowing modification. The bottom part displays + the list of all such events stored in the database. The + top part shows the details of the currently selected + event in the list (if any). The buttons + +, Edit, + and - allow you to + correspondingly add, modify, and remove an event record + from the database. Note that the + Edit and - + buttons become available only when an event is selected + from the list. + + + + + + + + Attributes + + + + The Attributes tab displays + information about the attributes of the relationship and + the controls allowing modification. The bottom part + displays the list of all such attributes stored in the + database. The top part shows the details of the + currently selected attribute in the list (if any). The + buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove an attribute record from the + database. Note that the Edit and + - buttons become available only + when an attribute is selected from the list. + + + + + + + + Notes + + + + The Notes tab displays information + about the notes concerning the relationship. These could + be any notes which do not naturally fit into the + Parameter-Value pairs available to Attributes. To add a + note or modify existing notes simply edit the text in + the text entry field. + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + + + + Sources + + + + The Sources tab displays + information about he sources related to the relationship + and controls allowing its modification. These could be + any general sources which refer to the relationship but + do not describe specifically any event. For example, + Aunt Martha's memoirs may mention that her great + grandson Paul was married, so the researcher may assume + that this relationship (between Paul and his wife) + existed and cite the memoirs as the source for this + assumption. + + + + Sources documenting specific events such as marriages + or divorces are better filed in relation to those + events, under the Events tab. + + + + The central part displays the list of all source + references stored in the database for this + relationship. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a source reference to this + relationship. Note that the Edit + and - buttons become available + only when a source reference is selected from the list. + + + + + + + + Gallery + + + + The Gallery tab displays + information about media objects associated with the + relationship and the controls allowing modification of + such. The central part shows the list of all such media + objects. For media object which are valid image files + previews of images are displayed. For other objects such + as audio files, movie files, etc., a generic &app; icon + is displayed instead. The buttons + +, Select, + Edit, and + - allow you to correspondingly + add a new image, add a reference to an image already + stored in the database, modify, and remove a media + object reference to this relationship. Note that the + Edit and - + buttons become available only when a media object is + selected from the list. + + + + + + + + LDS + + + + The LDS tab displays information + about the LDS Sealed to spouse + ordinance of the person and the controls allowing + modification. The data can include date, LDS temple, and + Place where it happened. The ordinance can further be + described by its status through the selections available + in the Status pop-up menu and can + also be referenced by sources and notes via + corresponding Sources... and + Note buttons. + + + + + + + + Source Data + + To edit source data, switch to the Sources View and select the + desired entry in the list of sources. Double-click on that + entry or click the Edit icon on the + toolbar to invoke the following Source + Editor dialog: + - - General - - The General tab allows editing of the most general - information about the relationship: the relationship type. - The available types (such as married, partners, etc.) can be chosen - from the drop-down Relationship type menu. - The ID field displays &app; ID number - which labels this relationship in the database. The Last - changed label shows the last modification time for this - relationship. - Finally, the Information is complete check - button provides the way to mark whether this relationship's record is - complete or not. - - - - - Events - - The Events tab displays information about - the events relevant to the relationship and the controls allowing - modification. The bottom part displays the list of all such events - stored in the database. The top part shows the details - of the currently selected event in the list (if any). The buttons - +, Edit, - and - allow you to correspondingly add, - modify, and remove an event record from the database. - Note that the Edit and - - buttons become available only when - an event is selected from the list. - - - + - - Attributes - - The Attributes tab displays information about - the attributes of the relationship and the controls allowing - modification. The bottom part displays the list of all such - attributes stored in the database. The top part shows the details - of the currently selected attribute in the list (if any). The buttons - +, Edit, - and - allow you to correspondingly add, - modify, and remove an attribute record from the database. - Note that the Edit and - - buttons become available only when - an attribute is selected from the list. - - - +
+ Source Editor dialog + + + + + + + Shows Source Editor dialog. + + + +
+ - - Notes - - The Notes tab displays information about the - notes concerning the relationship. These could be any notes which do - not naturally fit into the Parameter-Value pairs available to - Attributes. To add a note or modify existing notes simply edit the - text in the text entry field. - - - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - - - - - Sources - - The Sources tab displays information about - the sources related to the relationship and controls allowing its - modification. These could be any general sources which refer to the - relationship but do not describe specifically any event. - For example, Aunt Martha's memoirs may mention that her great grandson Paul - was married, so the researcher may assume that this relationship (between - Paul and his wife) existed and cite the memoirs as the source for this - assumption. - - - Sources documenting specific events such as marriages - or divorces are better filed in relation to those events, under the - Events tab. - - The central part displays the list of all source references stored - in the database for this relationship. The - buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove a source reference - to this relationship. Note that the Edit and - - buttons become available only when - a source reference is selected from the list. - - - - - - Gallery - - The Gallery tab displays information about - media objects associated with the relationship and the controls allowing - modification of such. The central part shows the list of all such media objects. - For media object which are valid image files previews of images are - displayed. For other objects such as audio files, movie files, etc., a - generic &app; icon is displayed instead. - The buttons +, - Select, - Edit, and - allow - you to correspondingly add a new image, add a reference to an image already - stored in the database, modify, and remove a media object reference - to this relationship. - Note that the Edit and - - buttons become available only when - a media object is selected from the list. - - - - - - LDS - - The LDS tab displays information - about the LDS Sealed to spouse ordinance - of the person and the controls allowing - modification. The data can include date, LDS temple, and Place where - it happened. The ordinance can further be described by its status - through the selections available in the Status - pop-up menu and can also be referenced by sources and notes via - corresponding Sources... and - Note buttons. - - - -
- - - - Source Data - To edit source data, switch to the Sources View and select the - desired entry in the list of sources. Double-click on that entry or - click the Edit icon on the toolbar to invoke the - following Source Editor dialog: - - -
- Source Editor dialog - - - Shows Source Editor dialog. -
- - - The top of the window shows the Source - Editor - title of the dialog. The main part of the window displays four notebook - tabs containing different categories of available information. You can - bring any tab to the top for viewing or editing by clicking on the - appropriate tab heading. - The bottom part has OK - and Cancel buttons. Clicking the - OK button at any time will apply all the changes made - in all tabs and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - -Clicking OK will immediately -save changes to the database (write on disk). Unlike previous versions, -this version of &app; does not have a separate saving function, -all changes are immediate. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - + + The top of the window shows the Source + Editor title of the dialog. The main part of the + window displays four notebook tabs containing different + categories of available information. You can bring any tab to + the top for viewing or editing by clicking on the appropriate + tab heading. The bottom part has OK + and Cancel buttons. Clicking the + OK button at any time will apply all + the changes made in all tabs and close the dialog + window. Clicking the Cancel button at + any time will close the window without applying any changes. + + + + Clicking OK will immediately save + changes to the database (write on disk). This version of + &app; does not have a separate saving function, all + changes are immediate. + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label + appears boldface; if the tab has no data then its label + appears regular (not bold). + + + The tabs provide the following information categories of - source data: + source data: + + + + + General + + + + The General tab allows editing of + the most general information about the source: its + title, author, abbreviated title, and publication + information. This information can be typed in the + appropriate text entry fields. + + + + + + + + Note + + + + The Note tab displays any notes + concerning the source. To add a note or modify existing + notes simply edit the text in the text entry field. + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + + + + Data + + + + The Data tab displays Key/Value + pairs that may be associated with the source. These are + similar to the attributes used for other record + types. The difference from these Key/Value pairs and the + attributes is that the attributes may have source + references and notes, while the Key/Value data may + not. + + + The central part shows the list of all Key/Value pairs, + if any. The buttons + and + - allow you to correspondingly + add and remove pairs. To modify the text of Key or + Value, first select the desired entry (may be an empty + entry when new pair has just been added). Then click + into either Key or Value cell inside that entry and edit + the text in place. When you are done, click outside the + cell to exit editing mode. + + + + + + + + Gallery + + + + The Gallery tab displays + information about media objects associated with the + given source and controls allowing its modification. The + central part shows the list of all such media + objects. For media object which are valid image files + previews of images are displayed. For other objects such + as audio files, movie files, etc., a generic &app; icon + is displayed instead. The buttons + +, Select, + Edit, and + - allow you to correspondingly + add a new image, add a reference to an image already + stored in the database, modify, and remove a media + object reference to this source. Note that the + Edit and - + buttons become available only when a media object is + selected from the list. + + + + + + + + References + + + + The References tab displays + information about database records that refer to this + source. If the source is not referenced from any + database record, the tab shows an empty list. If the + source is referenced from many records, the tab will + list all of them. The list can be ordered by any of its + column headers: Type, + ID, or + Name. Double-clicking on the list + entry opens up an editor for a corresponding record + allowing to view or modify the record. + + + + Only primary objects can be shown in the + References tab: Person, Family, + Event, Place, or Media object. The secondary objects + such as Names and Attributes, although may refer the + source, will only show up through their primary + objects they belong to. + + + + + +
- - General - The - General tab allows editing of the most general - information about the source: its title, author, abbreviated title, - and publication information. - This information can be typed in the appropriate text entry fields. + + + + Place Data + + To edit place data, switch to the Places View and select the + desired entry in the list of places. Double-click on that + entry or click the Edit icon on the + toolbar to invoke the following Place + Editor dialog: + + + + +
+ Place Editor dialog + + + + + + + Shows Place Editor dialog. + + + +
+ + + + + The top of the window shows the Place + Editor title of the dialog. The main part of the + window displays seven notebook tabs containing different + categories of available information. You can bring any tab to + the top for viewing or editing by clicking on the appropriate + tab heading. The bottom part has OK + and Cancel buttons. Clicking the + OK button at any time will apply all + the changes made in all tabs and close the dialog + window. Clicking the Cancel button at + any time will close the window without applying any changes. + + + + Clicking OK will immediately save + changes to the database (write on disk). This version of + &app; does not have a separate saving function, all + changes are immediate. + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label + appears boldface; if the tab has no data then its label + appears regular (not bold). -
-
+ + + The tabs provide the following information categories of + place data: + + + + + General + + + + The General tab allows editing of + the most general information about the place: the title + which labels it in the database, city, church parish, + county, state, country, longitude, and latitude. This + information can be typed in the appropriate text entry + fields. + + + + + + + + Other names + + + + The Other names tab displays + information concerning other names by which the place + might be known and the controls allowing their + modification. The bottom part displays the list of all + other names of the place stored in the database. The top + part shows the details of the currently selected name in + the list (if any). The buttons + +, Edit, + and - allow you to + correspondingly add, modify, and remove a name record + from the database. Note that the + Edit and - + buttons become available only when a name is selected + from the list. + + + + + + + + Note + + + + The Note tab displays any notes + concerning the place. To add a note or modify existing + notes simply edit the text in the text entry field. + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + + + + Sources + + + + The Sources tab displays + information about sources relevant to this place and + controls allowing its modification. The central part + displays the list of all such source references stored + in the database. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a source reference to this + place. Note that the Edit and + - buttons become available only + when a source reference is selected from the + list. + + + + + + + + Gallery + + + + The Gallery tab displays + information about media objects associated with the + given place and the controls allowing its + modification. The central part shows the list of all + such media objects. For media objects which are valid + image files previews of images are displayed. For other + objects such as audio files, movie files, etc., a + generic &app; icon is displayed instead. The buttons + +, Select, + Edit., and + - allow you to correspondingly + add a new image, add a reference to an image already + stored in the database, modify, and remove a media + object reference to this place. Note that the + Edit and - + buttons become available only when a media object is + selected from the list. + + + + + + + + Internet + + + + The Internet tab displays + information about Internet addresses relevant to the + place and controls allowing its modification. The bottom + part displays the list of all such Internet addresses + stored in the database. The top part shows the details + of the currently selected addresses in the list (if + any). The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove an Internet address record from + the database. The button Go + allows you to open a web-page with the corresponding + address with your default browser. Note that the + Edit, -, + and Go buttons become available + only when an address is selected from the list. + + + + + + + + References + + + + The References tab displays + information about database records (events or LDS + ordinances) that refer to this place. If the place is + not referenced from any database record, the tab shows + an empty list. If the place is referenced from many + records, the tab will list all of them. This + information cannot be modified from the Place + Editor dialog. Instead, the corresponding + database record (e.g. birth event) has to be brought up + and its place reference edited. + + + + + - - Note - - The Note tab displays any notes concerning - the source. To add a note or modify existing notes simply edit the - text in the text entry field. - + - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - + + Media Data + + To edit media data, switch to the Media View and select the + desired entry in the list of sources. Double-click on that + entry or click Edit on the toolbar to + invoke the following Media Properties + Editor dialog: + - - Data - - The Data tab displays Key/Value - pairs that may be associated with the source. These are similar - to the attributes used for other record types. The difference - from these Key/Value paris and the attributes is that the attributes - may have source references and notes, while the Key/Value - data may not. + - The central part shows the list of all Key/Value pairs, if any. - The buttons + and - - allow you to correspondingly add and remove pairs. To modify the - text of Key or Value, first select the desired entry (may be an - empty entry when new pair has just been added). Then click into - either Key or Value cell inside that entry and edit the text in place. - When you are done, click outside the cell to exit editing mode. - - - +
+ Media Properties Editor dialog + + + + + + + Shows Media Properties Editor dialog. + + + +
+ - - Gallery - - The Gallery tab displays information about - media objects associated with the given source and controls - allowing its modification. The central part shows the list of all - such media objects. For media object which are valid image files - previews of images are displayed. For other objects such as audio - files, movie files, etc., a generic &app; icon is displayed instead. - The buttons +, - Select, - Edit, and - allow - you to correspondingly add a new image, add a reference to an image already - stored in the database, modify, and remove a media object reference - to this source. - Note that the Edit and - - buttons become available only when - a media object is selected from the list. - - - - - - References - - The References tab displays information about - database records that refer to this source. If the source is not - referenced from any database record, the tab shows an empty list. - If the source is referenced from many records, the tab will list - all of them. The list can be ordered by any of its column headers: - Type, ID, or - Name. Double-clicking on the list entry - opens up an editor for a corresponding record allowing - to view or modify the record. - - Only primary objects can be shown in the - References tab: Person, Family, Event, Place, or Media - object. The secondary objects such as Names and Attributes, although - may refer the source, will only show up through their primary - objects they belong to. - - - - -
- - - - - Place Data - To edit place data, switch to the Places View and select the - desired entry in the list of places. Double-click on that entry or - click the Edit icon on the toolbar to invoke the - following Place Editor dialog: - - -
- Place Editor dialog - - - Shows Place Editor dialog. -
- - - The top of the window shows the Place Editor - title of the dialog. The main part of the window displays seven - notebook tabs containing different categories of available information. - You can bring any tab to the top for viewing or editing by clicking on - the appropriate tab heading. - The bottom part has - OK and Cancel buttons. - Clicking the OK button at any time will apply all the - changes made in all tabs and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - -Clicking OK will immediately -save changes to the database (write on disk). Unlike previous versions, -this version of &app; does not have a separate saving function, -all changes are immediate. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - - The tabs provide the following information categories of - place data: - - - General - The - General tab allows editing of the most general - information about the place: the title which labels it in the database, - city, church parish, county, state, country, longitude, and latitude. - This information can be typed in the appropriate text entry fields. - - - - - - Other names - - The Other names tab displays information concerning - other names by which the place might be known and the controls - allowing their modification. The bottom part displays the list of all - other names of the place stored in the database. The top part shows - the details of the currently selected name in the list (if any). - The buttons +, - Edit, and - allow - you to correspondingly add, modify, and remove a name record - from the database. Note that the Edit and - - buttons become available only when - a name is selected from the list. - - - - - Note - - The Note tab displays any notes concerning - the place. To add a note or modify existing notes simply edit the - text in the text entry field. - - - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - - - - Sources - - The Sources tab displays information about sources - relevant to this place and controls allowing its modification. - The central part displays the list of all such source references - stored in the database. The buttons +, - Edit, and - allow - you to correspondingly add, modify, and remove a source reference - to this place. Note that the Edit and - - buttons become available only when - a source reference is selected from the list. - - - - - Gallery - - The Gallery tab displays information about - media objects associated with the given place and the controls - allowing its modification. The central part shows the list of all - such media objects. For media objects which are valid image files - previews of images are displayed. For other objects such as audio - files, movie files, etc., a generic &app; icon is displayed instead. - The buttons +, - Select, Edit., - and - allow - you to correspondingly add a new image, add a reference to an image already - stored in the database, modify, and remove a media object reference - to this place. - Note that the Edit and - - buttons become available only when - a media object is selected from the list. - - - - - - Internet - - The Internet tab displays information about - Internet addresses relevant to the place and controls - allowing its modification. The bottom part displays the list of all - such Internet addresses stored in the database. The top part shows the - details of the currently selected addresses in the list (if any). - The buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove an Internet address - record from the database. The button Go allows - you to open a web-page with the corresponding address with your default - browser. Note that the Edit, - -, and Go buttons - become available only when an address is selected from the list. - - - - - - References - - The References tab displays information about - database records (events or LDS ordinances) that refer to this place. If the place is not - referenced from any database record, the tab shows an empty list. - If the place is referenced from many records, the tab will list - all of them. This information cannot be modified from - the Place Editor dialog. Instead, the - corresponding database record (e.g. birth event) has to be brought - up and its place reference edited. - - - -
- - - - Media Data - To edit media data, switch to the Media View and select the - desired entry in the list of sources. Double-click on that entry or - click Edit on the toolbar to invoke the - following Media Properties Editor dialog: - - -
- Media Properties Editor dialog - - - Shows Media Properties Editor dialog. -
- - - The top of the window shows the dialog title. Below the title - is the preview of an object and the summary of its properties (ID, - path, and object type). The central part of the window displays four - notebook tabs containing different categories of available information. - You can bring any tab to the top for viewing or editing by clicking on - the appropriate tab heading. The bottom part has - OK and Cancel buttons. - Clicking the OK button at any time will apply all the - changes made in all tabs and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - -Clicking OK will immediately -save changes to the database (write on disk). Unlike previous versions, -this version of &app; does not have a separate saving function, -all changes are immediate. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - + + The top of the window shows the dialog title. Below the title + is the preview of an object and the summary of its properties + (ID, path, and object type). The central part of the window + displays four notebook tabs containing different categories of + available information. You can bring any tab to the top for + viewing or editing by clicking on the appropriate tab + heading. The bottom part has OK and + Cancel buttons. Clicking the + OK button at any time will apply all + the changes made in all tabs and close the dialog + window. Clicking the Cancel button at + any time will close the window without applying any changes. + + + + Clicking OK will immediately save + changes to the database (write on disk). This version of + &app; does not have a separate saving function, all changes + are immediate. + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label appears + boldface; if the tab has no data then its label appears + regular (not bold). + + + The tabs provide the following information categories of media object data: - + + + + + General + + + + The General tab allows editing the + title which labels this object in the database. The + title can be typed in the appropriate text entry + field. The Date field allows + entering the date by typing, while the LED button beside + it will invoke a Date selection + dialog for setting the date graphically. + + + + &app; no longer has a concept of local media objects. + Every media object is referred to by its path. The + users are responsible for keeping track of the object + files. &app; will only reference and display the + contents, not manage the files themselves. + + + + + + + + + Attributes + + + + The Attributes tab displays + information about the attributes of the media object and + controls allowing its modification. The bottom part + displays the list of all such attributes stored in the + database. The top part shows the details of the + currently selected attribute in the list (if any). The + buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove an attribute record from the + database. Note that the Edit and + - buttons become available only + when an attribute is selected from the list. + + + + + + + + Notes + + + + The Notes tab displays information + about the notes concerning the media object. These could + be any notes which do not naturally fit into the + Parameter-Value pairs available to Attributes. To add a + note or modify existing notes simply edit the text in + the text entry field. + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + + + + References + + + + The References tab displays + information about database records that refer to this + media object. If the object is not referenced from any + database record, the tab shows an empty list. If the + object is referenced from many records, the tab will + list all of them. The list can be ordered by any of its + column headers: Type, + ID, or + Name. Double-clicking on the list + entry opens up an editor for a corresponding record + allowing to view or modify the record. + + + + Only primary objects can be shown in the + References tab: Person, Family, + Event, Source, or Place. The secondary objects such + as Names and Attributes, although able to refer the + media object, will only show up through their primary + objects they belong to. + + + + + +
- - General - The - General tab allows editing the title which labels - this object in the database. The title can be typed in the appropriate - text entry field. The Date field allows entering - the date by typing, while the LED button beside it will invoke a - Date selection dialog for setting the date - graphically. - - &app; no longer has a concept of local media objects. - Every media object is referred to by its path. The users are responsible - for keeping track of the object files. &app; will only reference - and display the contents, not manage the files themselves. - - + - - Attributes - - The Attributes tab displays information about - the attributes of the media object and controls allowing its - modification. The bottom part displays the list of all such - attributes stored in the database. The top part shows the details - of the currently selected attribute in the list (if any). The buttons - +, Edit, - and - allow you to correspondingly add, - modify, and remove an attribute record from the database. - Note that the Edit and - - buttons become available only when - an attribute is selected from the list. - - + + Events + + Events are edited through the following Event + Editor dialog: + + + - - Notes - - The Notes tab displays information about the - notes concerning the media object. These could be any notes which do - not naturally fit into the Parameter-Value pairs available to - Attributes. To add a note or modify existing notes simply edit the - text in the text entry field. +
+ Event Editor dialog + + + + + + + Shows Event Editor dialog. + + + +
- The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - -
-
+ - - References - - The References tab displays information about - database records that refer to this media object. If the object is not - referenced from any database record, the tab shows an empty list. - If the object is referenced from many records, the tab will list - all of them. The list can be ordered by any of its column headers: - Type, ID, or - Name. Double-clicking on the list entry - opens up an editor for a corresponding record allowing - to view or modify the record. - - Only primary objects can be shown in the - References tab: Person, Family, Event, Source, or Place. - The secondary objects such as Names and Attributes, although - able to refer the media object, will only show up through their primary - objects they belong to. - - - + + The top of the window shows the dialog title including the + name of the persons whose event is being edited. The central + part of the window displays four notebook tabs containing + different categories of available information. You can bring + any tab to the top for viewing or editing by clicking on the + appropriate tab heading. The bottom part has + OK and Cancel + buttons. Clicking the OK button at any + time will apply all the changes made in all tabs and close the + dialog window. Clicking the Cancel + button at any time will close the window without applying any + changes. + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label appears + boldface; if the tab has no data then its label appears + regular (not bold). + + + + The tabs provide the following information categories of + the event data: + + + + + General + + + + The General tab allows editing of + the most general information about the event: its type, + date, place, cause, and description. The type can be + selected from available types listed in the + Event type drop-down menu. The + rest of the information can be typed in the appropriate + text entry fields. Check the Private + record box to mark this event record as + private. This will give you a chance to omit this event + from being included in reports, if you choose so among + the report generation options. + + + + + + + + Sources + + + + The Sources tab displays + information about sources relevant to this event and + controls allowing its modification. The central part + displays the list of all such sources references stored + in the database. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a source reference to this + event. Note that the Edit and + - buttons become available only + when a source reference is selected from the list. + + + + + + + + Note + + + + The Note tab displays any notes + concerning the event. To add a note or modify existing + notes simply edit the text in the text entry field. + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + + + + Witnesses + + + + The Witnesses tab displays + information about witnesses relevant to this event and + controls allowing its modification. The central part + displays the list of all such witnesses stored in the + database. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a witness reference to this + event, see . Note that the + Edit and - + buttons become available only when a witness reference + is selected from the list. + + + + +
- + - - - Events - Events are edited through the following Event - Editor dialog: + + Source Information + + When adding source references to events, places, etc., the + following dialog appears: + - -
- Event Editor dialog - - - Shows Event Editor dialog. -
- + - The top of the window shows the dialog title including the name - of the persons whose event is being edited. The central part of the - window displays four notebook tabs containing different categories of - available information. You can bring any tab to the top for viewing or - editing by clicking on the appropriate tab heading. The bottom part has - OK and Cancel buttons. - Clicking the OK button at any time will apply all the - changes made in all tabs and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). +
+ Source Information dialog + + + + + + + Shows Source Information dialog. + + + +
+ - - The tabs provide the following information categories of - the event data: + - - General - The - General tab allows editing of the most general - information about the event: its type, date, place, cause, and - description. The type can be selected from available types listed - in the Event type drop-down menu. The rest - of the information can be typed in the appropriate text entry fields. - Check the Private record box to mark this event - record as private. This will give you a chance to omit this event from - being included in reports, if you choose so among the report - generation options. - - + The top of the window shows the dialog title. The central part + displays the source information. The bottom part has + OK and Cancel + buttons. Clicking the OK button at any + time will apply all the changes made and close the dialog + window. Clicking the Cancel button at + any time will close the window without applying any changes. - - Sources - The - Sources tab displays information about sources - relevant to this event and controls allowing its modification. - The central part displays the list of all such sources references - stored in the database. The buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove a source reference - to this event. Note that the Edit and - - buttons become available only when - a source reference is selected from the list. - - + + - - Note - - The Note tab displays any notes concerning - the event. To add a note or modify existing notes simply edit the - text in the text entry field. - + The source can be selected from available sources listed in + the Title drop-down menu. If the source + you are referencing is not present in the database yet, you + can enter it into the database. To do this, click the + New... button and enter source + information into the invoked Source + Editor dialog. You can also set the details + specific for this particular reference: confidence, + volume/file/page, date, text, and comments. Choose the + confidence level from the Confidence + drop-down menu. The rest of the details can be typed in the + appropriate text entry fields. - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - + + + - - Witnesses - The - Witnesses tab displays information about witnesses - relevant to this event and controls allowing its modification. - The central part displays the list of all such witnesses - stored in the database. The buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove a witness reference - to this event, see . Note that the Edit and - - buttons become available only when - a witness reference is selected from the list. - - + Information in this dialog is specific to the particular + reference. A single source can be referenced many times, + and all such references will have in common the overall + source information. This dialog lets you provide + reference-specific data, such as relevant quotes, comments, + confidence, page numbers, etc, to further specify and + document the reference. -
+ + +
- - - Source Information - When adding source references to events, places, etc., - the following dialog appears: + - -
- Source Information dialog - - - Shows Source Information dialog. -
- - - The top of the window shows the dialog title. The central part - displays the source information. The bottom part has - OK and Cancel buttons. - Clicking the OK button at any time will apply all the - changes made and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - - The source can be selected from available sources listed in the - Title drop-down menu. If the source you are - referencing is not present in the database yet, you can enter it into - the database. To do this, click the New... button - and enter source information into the invoked Source - Editor dialog. You can also set the details specific for - this particular reference: confidence, volume/file/page, date, text, - and comments. Choose the confidence - level from the Confidence drop-down menu. - The rest of the details can be typed in the appropriate text entry - fields. - - Information in this dialog is specific to the particular reference. - A single source can be referenced many times, and all such references will - have in common the overall source information. This dialog lets you provide - reference-specific data, such as relevant quotes, comments, confidence, - page numbers, etc, to further specify and document the reference. - -
- - - - Names - Names are edited through the following + + Names + Names are edited through the following Name Editor dialog: - -
- Name Editor dialog - - - Shows Name Editor dialog. -
- - - The top of the window shows the dialog title including the name - of the person whose name is being edited. The central part - of the window displays three notebook tabs containing different - categories of available information. You can bring any tab to the - top for viewing or editing by clicking on the appropriate tab heading. - The bottom part has OK and - Cancel buttons. Clicking the - OK button at any time will apply all the - changes made in all tabs and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - - The tabs provide the following information categories of - the name data: + - - General - The - General tab allows editing of general - information about the name: given name, family name, - patronymic (a form of father's name used in some languages, e.g. Russian), - family prefix, suffix, title, and type of the name. The information can be - typed in the appropriate text entry fields. The family name and the - type can be also selected from available choices listed in the - appropriate drop-down menus. - - Options allow you to adjust specific - grouping, sorting, and displaying properties of this name, as well - as to provide the date corresponding to the name. The - Grouping field provides an alternative - grouping node for a given name, overriding the default grouping - based on the family name. This may be necessary with similar - family names that need to be grouped together -- for example Russian - names Ivanov and Ivanova are considered the same, but difference - in gender is reflected in different spelling. To enable - typing into this field, check the Override - check button. The Sort as and - Display as determine the manner - in which the name appears in the People View and in the reports. - The Date can provide information on - the validity of this name -- use spans as necessary. - Check the Private record box to mark this name - record as private. This will give you a chance to omit this name from - being included in reports, if you choose so among the report - generation options. - - +
+ Name Editor dialog + + + + + + + Shows Name Editor dialog. + + + +
- - Sources - The - Sources tab displays information about sources - relevant to this name and controls allowing its modification. - The central part displays the list of all such sources' references - stored in the database. The buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove a source reference - to this name. Note that the Edit and - - buttons become available only when - a source reference is selected from the list. - - + - - Note - - The Note tab displays any notes concerning - the name. To add a note or modify existing notes simply edit the - text in the text entry field. - + - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - + The top of the window shows the dialog title including the + name of the person whose name is being edited. The central + part of the window displays three notebook tabs containing + different categories of available information. You can bring + any tab to the top for viewing or editing by clicking on the + appropriate tab heading. The bottom part has + OK and Cancel + buttons. Clicking the OK button at any + time will apply all the changes made in all tabs and close the + dialog window. Clicking the Cancel + button at any time will close the window without applying any + changes. -
- - - - Attributes - Attributes are edited through the following + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label appears + boldface; if the tab has no data then its label appears + regular (not bold). + + + + + + The tabs provide the following information categories of the + name data: + + + + + + General + + + + + The General tab allows editing of + general information about the name: given name, family + name, patronymic (a form of father's name used in some + languages, e.g. Russian), family prefix, suffix, title, + and type of the name. The information can be typed in + the appropriate text entry fields. The family name and + the type can be also selected from available choices + listed in the appropriate drop-down menus. + Options allow you to adjust + specific grouping, sorting, and displaying properties of + this name, as well as to provide the date corresponding + to the name. The Grouping field + provides an alternative grouping node for a given name, + overriding the default grouping based on the family + name. This may be necessary with similar family names + that need to be grouped together -- for example Russian + names Ivanov and Ivanova are considered the same, but + difference in gender is reflected in different + spelling. To enable typing into this field, check the + Override check button. The + Sort as and Display + as determine the manner in which the name + appears in the People View and in the reports. The + Date can provide information on the + validity of this name -- use spans as necessary. Check + the Private record box to mark this + name record as private. This will give you a chance to + omit this name from being included in reports, if you + choose so among the report generation options. + + + + + + + + + Sources + + + + + The Sources tab displays + information about sources relevant to this name and + controls allowing its modification. The central part + displays the list of all such sources' references stored + in the database. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a source reference to this + name. Note that the Edit and + - buttons become available only + when a source reference is selected from the list. + + + + + + + + + Note + + + + + The Note tab displays any notes + concerning the name. To add a note or modify existing + notes simply edit the text in the text entry field. + + + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + + + + + + + Attributes + Attributes are edited through the following Attribute Editor dialog: - -
- Attribute Editor dialog - - - Shows Attribute Editor dialog. -
- + - The top of the window shows the dialog title including the name - of the person whose attribute is being edited. The central part - of the window displays three notebook tabs containing different - categories of available information. You can bring any tab to the - top for viewing or editing by clicking on the appropriate tab heading. - The bottom part has OK and - Cancel buttons. Clicking the - OK button at any time will apply all the - changes made in all tabs and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - The tabs provide the following information categories of +
+ Attribute Editor dialog + + + + + + + Shows Attribute Editor dialog. + + + +
+ + + + + + The top of the window shows the dialog title including the + name of the person whose attribute is being edited. The + central part of the window displays three notebook tabs + containing different categories of available information. You + can bring any tab to the top for viewing or editing by + clicking on the appropriate tab heading. The bottom part has + OK and Cancel + buttons. Clicking the OK button at any + time will apply all the changes made in all tabs and close the + dialog window. Clicking the Cancel + button at any time will close the window without applying any + changes. + + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label appears + boldface; if the tab has no data then its label appears + regular (not bold). + + + + The tabs provide the following information categories of the attribute data: + + + + General + + + - - General - The - General tab allows editing of the most general - information about the attribute: name of the attribute and its value. - The information can be typed in the appropriate text entry fields. - The attribute name can also be selected from available choices (if any) - listed in the Attribute drop-down menu. - Check the Private record box to mark this - attribute record as private. This will give you a chance to omit - this attribute from being included in the reports, if you choose - so among the report generation options. - - + The General tab allows editing of + the most general information about the attribute: name + of the attribute and its value. The information can be + typed in the appropriate text entry fields. The + attribute name can also be selected from available + choices (if any) listed in the Attribute + drop-down menu. Check the Private + record box to mark this attribute record as + private. This will give you a chance to omit this + attribute from being included in the reports, if you + choose so among the report generation options. - - Sources - The - Sources tab displays information about sources - relevant to this attribute and controls allowing its modification. - The central part displays the list of all such sources references - stored in the database. The buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove a source reference - to this attribute. Note that the Edit and - - buttons become available only when - a source reference is selected from the list. - - + + + + + + + + Sources + + + + + The Sources tab displays + information about sources relevant to this attribute and + controls allowing its modification. The central part + displays the list of all such sources references stored + in the database. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a source reference to this + attribute. Note that the Edit and + - buttons become available only + when a source reference is selected from the list. + + + + + + + + + Note + + + + + The Note tab displays any notes + concerning the attribute. To add a note or modify + existing notes simply edit the text in the text entry + field. + + + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + +
+ + + + + Addresses + Addresses are edited through the following + Address Editor dialog: + + + + +
+ Address Editor dialog + + + + + + + Shows Address Editor dialog. + + + +
+ + + + + + The top of the window shows the dialog title including the + name of the person whose address is being edited. The central + part of the window displays three notebook tabs containing + different categories of available information. You can bring + any tab to the top for viewing or editing by clicking on the + appropriate tab heading. The bottom part has + OK and Cancel + buttons. Clicking the OK button at any + time will apply all the changes made in all tabs and close the + dialog window. Clicking the Cancel + button at any time will close the window without applying any + changes. + + + + + + The tab labels reflect the presence of corresponding + information: if the tab contains any data, its label appears + boldface; if the tab has no data then its label appears + regular (not bold). + + + + + + The tabs provide the following information categories of the + address data: + + + + + + General + + + + + The General tab allows editing of + the most general information about the address: date, + street address, city or county, state or province, + country, the postal code, and the phone number. The + information can be typed in the appropriate text entry + fields. Check the Private record + box to mark this address record as private. This will + give you a chance to omit this address from being + included in reports, if you choose so among the report + generation options. + + + + + + + + + Sources + + + + + The Sources tab displays + information about sources relevant to this address and + controls allowing its modification. The central part + displays the list of all such sources references stored + in the database. The buttons +, + Edit, and + - allow you to correspondingly + add, modify, and remove a source reference to this + address. Note that the Edit and + - buttons become available only + when a source reference is selected from the list. + + + + + + + + + Note + + + + + The Note tab displays any notes + concerning the address. To add a note or modify existing + notes simply edit the text in the text entry field. + + + + + The Format option allows you to set + the appearance of the note in the output (i.e. in + reports and web pages). Selecting + Flowed will replace all multiple + spaces, tabs, and single end-of-line characters with + single space in the output. The two consecutive new + lines (i.e. an empty line) denote a new paragraph. + Selecting Preformatted will honor + all multiple spaces tabs, and new lines, so that the + output will appear as it is entered into the text entry + field. + + + + + +
+ + + + + Witnesses + + Witnesses are edited through the following Witness + Editor dialog: + + + + +
+ Witness Editor dialog + + + + + + + Shows Witness Editor dialog. + + + +
+ + + + + + The top of the window shows the dialog title. The central part + of the window displays information about the witness. The + bottom part has OK and + Cancel buttons. Clicking the + OK button at any time will apply all + the changes made and close the dialog window. Clicking the + Cancel button at any time will close + the window without applying any changes. + + + + + The witness name can be entered in two ways, depending upon + whether the witness is a person already stored in the database + or not (unrelated person). + + + + + + If the person you would like to add as a witness is in fact + a member of the database, it is better to use the first + method below. + + + + + + Person from the database + + + + If the person's data are stored in a database, check + Person is in the database box. Then + click the Select button to invoke + Select Person dialog. Choose the + person from that dialog and click the + OK button. The + Person text field will display the + name of the person you selected. + + + + + + Even though the person's name is displayed in the + Person field, it is not available + for direct editing. + + + + + + + + + Unrelated person + + + + If the person is not in the database, make sure that + Person is in the database box is + unchecked. Then enter the name or any description of a + person into the Person text entry + field. This information is stored as entered, and this + is the only place it is stored. In other words, there + is no reference to that person in the entire database + except for this witness reference. If the person is in + fact a member of the database, it is advised to use the + former method. + + + + + + + + The Comment text area allows you to enter + any comments concerning the witness. To add a comment or to + modify existing comments simply edit the text in the text + area. + + +
+ + + + Merging records + + + Sometime several records in the database turn out to be + describing the same object: same person, same place, or same + source. It could happen either when the data is entered twice + by mistake, or when new information reveals that the two + entries refer to the same person. It can also happen after + importing GEDCOM obtained from a relative, whose database + overlaps with your existing data. + + + + + Whenever you detect duplicate records, merging them a useful + way of correcting the situation. + + + + + + To make a merge, exactly two records have to be selected in + the appropriate view (People View, Sources View, or Places + View). This is accomplished by selecting one entry and then + selecting another person while holding down + Ctrl key. + + + + + Merge People + + + There are two ways of merging personal records: + Compare and Merge and Fast + Merge, both available from the + Edit menu. - - Note - - The Note tab displays any notes concerning - the attribute. To add a note or modify existing notes simply edit the - text in the text entry field. + + - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - - - - - - Addresses - Addresses are edited through the following - Address Editor dialog: + Merging people does not discard any information with + either method. The decisions you make during the merge + only affect which data will become primary and which will + become secondary for the resulting merged record. - -
- Address Editor dialog - - - Shows Address Editor dialog. -
- - - The top of the window shows the dialog title including the name - of the person whose address is being edited. The central part - of the window displays three notebook tabs containing different - categories of available information. You can bring any tab to the - top for viewing or editing by clicking on the appropriate tab heading. - The bottom part has OK and - Cancel buttons. Clicking the - OK button at any time will apply all the - changes made in all tabs and close the dialog window. Clicking the - Cancel button at any time will close the window without - applying any changes. - - - The tab labels reflect the presence of corresponding information: if the - tab contains any data, its label appears boldface; if the tab has no data - then its label appears regular (not bold). - - The tabs provide the following information categories of - the address data: +
+ + + + + Compare and Merge + + + - - General - The - General tab allows editing of the most general - information about the address: date, street address, city or county, - state or province, country, the postal code, and the phone number. - The information can - be typed in the appropriate text entry fields. - Check the Private record box to mark this address - record as private. This will give you a chance to omit this address - from being included in reports, if you choose so among the report - generation options. - - + When exactly two people are selected, choose + EditCompare + and Merge... to invoke + Compare People dialog. - - Sources - The - Sources tab displays information about sources - relevant to this address and controls allowing its modification. - The central part displays the list of all such sources references - stored in the database. The buttons +, - Edit, and - - allow you to correspondingly add, modify, and remove a source reference - to this address. Note that the Edit and - - buttons become available only when - a source reference is selected from the list. - - + - - Note - - The Note tab displays any notes concerning - the address. To add a note or modify existing notes simply edit the - text in the text entry field. - + - The Format option allows you to set the - appearance of the note in the output (i.e. in reports and web pages). - Selecting - Flowed will replace all multiple spaces, tabs, - and single end-of-line characters with single space in the output. - The two consecutive new lines (i.e. an empty line) denote a new paragraph. - Selecting Preformatted will honor all multiple spaces - tabs, and new lines, so that the output will appear as it is entered - into the text entry field. - - - +
+ Compare People dialog + + + + + + + Shows Compare People dialog. + + + +
+ -
- - - - Witnesses - Witnesses are edited through the following - Witness Editor dialog: + - -
- Witness Editor dialog - - - Shows Witness Editor dialog. -
- - - The top of the window shows the dialog title. The central part - of the window displays information about the witness. The bottom part - has OK and Cancel buttons. - Clicking the OK button at any time will apply all the - changes made and close the dialog window. Clicking the - Cancel button at any time will close the window - without applying any changes. - - The witness name can be entered in two ways, depending upon - whether the witness is a person already stored in the database or - not (unrelated person). + The dialog allows you to make a decision on whether or + not the selected records should be merged. If you + decide that the records should not be merged, despite + similar names, you may click + Cancel to close the dialog + without making any changes. If you decide to proceed + with merging, select the appropriate + Select radio button to specify + the record to be used as the source of primary data, + then click Merge and close. - If the person you would like to add as a wittness is in fact - a member of the database, it is better to use the first method below. - - - - Person from the database - - If the person's data are stored in a database, check Person - is in the database box. Then click the - Select button to invoke Select - Person dialog. Choose the person from that dialog and - click the OK button. The Person - text field will display the name of the person you selected. - - - Even though the person's name is displayed in the - Person field, it is not available for direct - editing. - - - - - Unrelated person - - If the person is not in the database, make sure that - Person is in the database box is unchecked. - Then enter the name or any description of a person into the - Person text entry field. This information - is stored as entered, and this is the only place it is stored. - In other words, there is no reference to that person in the entire - database except for this witness reference. If the person is in fact - a member of the database, it is advised to use the former method. - - - - - The Comment text area allows you to enter - any comments concerning the witness. To add a comment or to modify - existing comments simply edit the text in the text area. - +
+ -
- - - Merging records + The data from the other record will be kept as + alternate data. Specifically, all names from the other + record will become alternate names of the merged + record. Similarly, parents, spouses, and children of + the other record will become alternate parents, + spouses, and children of the merged record, and so on. - Sometime several records in the database turn out to be - describing the same object: same person, same place, or same source. - It could happen either when the data is entered twice by mistake, - or when new information reveals that the two entries refer to the same - person. It can also happen after importing GEDCOM obtained from a - relative, whose database overlaps with your existing data. - - Whenever you detect duplicate records, merging them - a useful way of correcting the situation. - - To make a merge, exactly two records have to be selected - in the appropriate view (People View, Sources View, or Places View). - This is accomplished by selecting one entry and then - selecting another person while holding down Ctrl key. - + + + + + + + + Fast Merge + + + - Merge People - There are two ways of merging personal records: - Compare and Merge and - Fast Merge, both available from the - Edit menu. - - - - Merging people does not discard any information with either method. - The decisions you make during the merge only affect which data will - become primary and which will become secondary for the resulting - merged record. - + When exactly two people are selected, choose + EditFast + Merge to invoke + Merge People dialog. + + +
+ Merge People dialog + + + + + + + Shows Merge People dialog. + + + +
+ + - - Compare and Merge - - When exactly two people are selected, choose - EditCompare and - Merge... to invoke Compare - People dialog. - - -
- Compare People dialog - - - Shows Compare People dialog. -
- + The dialog allows you to quickly merge two records, + specifying the record to be used as the source of + primary data. The data from the other record will be + kept as alternate data. Specifically, all names from + the other record will become alternate names of the + merged record. Similarly, parents, spouses, and + children of the other record will become alternate + parents, spouses, and children of the merged record, + and so on. - The dialog allows you to make a decision on whether or not - the selected records should be merged. If you decide that the records - should not be merged, despite similar names, you may click - Cancel to close the dialog without making - any changes. If you decide to proceed with merging, select the - appropriate Select radio button to specify - the record to be used as the source of primary data, - then click Merge and close. - - The data from the other record will be kept as alternate - data. Specifically, all names from the other record will become - alternate names of the merged record. Similarly, parents, spouses, - and children of the other record will become alternate parents, - spouses, and children of the merged record, and so on. -
-
+
+ + - - Fast Merge - - When exactly two people are selected, choose - EditFast - Merge to invoke Merge - People dialog. - - -
- Merge People dialog - - - Shows Merge People dialog. -
- - - The dialog allows you to quickly merge two records, specifying - the record to be used as the source of primary data. - The data from the other record will be kept as alternate - data. Specifically, all names from the other record will become - alternate names of the merged record. Similarly, parents, spouses, - and children of the other record will become alternate parents, - spouses, and children of the merged record, and so on. - - - If you are not certain whether or not you need - to merge the records, or which record to specify as the source - of primary data, use Compare and Merge method - described above.. - - -
-
+ If you are not certain whether or not you need to + merge the records, or which record to specify as the + source of primary data, use Compare and + Merge method described above.. + +
+
+
+
+
- - - Merge Sources - When exactly two sources are selected, choose - EditCompare and - Merge... to invoke Merge - Sources dialog. - - -
- Merge Sources dialog - - - Shows Merge Sources dialog. -
- + - The dialog allows you to make a decision on whether or not - the selected records should be merged. If you decide that the records - should not be merged, despite similar titles, you may click - Cancel to close the dialog without making - any changes. If you decide to proceed with merging, choose the - appropriate radio button to specify the title, author, abbreviated - title, publication information, and the ID to be used for the - merged record, then click OK. + + Merge Sources + + + When exactly two sources are selected, choose + + Edit + Compare and Merge... + to invoke Merge + Sources dialog. + + + + + +
+ Merge Sources dialog + + + + + + + Shows Merge Sources dialog. + + + +
+ + + + + + The dialog allows you to make a decision on whether or not + the selected records should be merged. If you decide that + the records should not be merged, despite similar titles, + you may click Cancel to close the + dialog without making any changes. If you decide to proceed + with merging, choose the appropriate radio button to specify + the title, author, abbreviated title, publication + information, and the ID to be used for the merged record, + then click OK. + +
+ + Merge Places + - - Merge Places + When exactly two places are selected, choose + + Edit + Compare and Merge... + - When exactly two places are selected, choose - EditCompare and - Merge... to invoke Select - title dialog. - - -
- Merge Places dialog - - - Shows Select title dialog. -
- + to invoke Select title dialog. +
- The dialog allows you to make a decision on whether or not - the selected records should be merged. If you decide that the records - should not be merged, despite similar titles, you may click - Cancel to close the dialog without making - any changes. If you decide to proceed with merging, choose the - appropriate radio button to specify the title of the merged record, - or specify Other and enter new text, - then click OK. + + +
+ Merge Places dialog + + + + + + + Shows Select title dialog. + + + +
+ + + + + + The dialog allows you to make a decision on whether or not + the selected records should be merged. If you decide that + the records should not be merged, despite similar titles, + you may click Cancel to close the + dialog without making any changes. If you decide to proceed + with merging, choose the appropriate radio button to specify + the title of the merged record, or specify + Other and enter new text, then click + OK. + +
+
+
- + - + + Navigation + + + As long as any database is open, &app; is focused on a single + person usually referred to as an Active person. This allows + you to view or modify the data concerning this person, his or + her immediate family, etc. Navigating in the database (i.e. + moving from person to person) is in fact nothing else but + changing the Active person. This section describes many + alternative ways to navigate through the database using both + the complex and the convenient interfaces &app; provides. All + these ways eventually accomplish the same thing, but some are + more convenient than others, depending what you are doing in + &app; at the moment. + + + - - - Navigation - As long as any database is open, &app; is focused on a - single person usually referred to as an Active person. This - allows you to view or modify the data concerning this person, - his or her immediate family, etc. Navigating in the database (i.e. - moving from person to person) is in fact nothing else but changing - the Active person. This section describes many alternative ways - to navigate through the database using both the complex and the - convenient interfaces &app; provides. All these ways eventually - accomplish the same thing, but some are more convenient than others, - depending what you are doing in &app; at the moment. - - - - Using the People View - The most intuitive way to select an active person is - to use the People View (see ). - When in the People View, just select the - name of the desired person from the list by clicking that list - entry. The person you have selected becomes active. The statusbar - updates to reflect the change of the active person. - + + Using the People View + - - - Using the Family View - When in the Family View (see ), - you can easily navigate between the members of the displayed family - as follows: + The most intuitive way to select an active person is to use + the People View (see ). When in + the People View, just select the name of the desired person + from the list by clicking that list entry. The person you have + selected becomes active. The statusbar updates to reflect the + change of the active person. - - To make the currently selected spouse the active person, - click the double-arrow button to the right of the active person box. - Alternatively, right-click into the spouse box and select - Make the selected spouse an active person item - from the context menu. - - - To make the currently selected parents the active family - (thereby making father the active person and mother the selected - spouse), click the right-arrow button to the right of the active person's - parents box. Alternatively, right-click into the active person's parents - box and select - Make the selected parents the active family item - from the context menu. - - - To make the currently selected spouse's parents - the active family (thereby making father the active person and mother - the selected spouse), click the right-arrow button to the right of the - spouse's parents box. Alternatively, right-click into the spouse's parents - box and select - Make the selected parents the active family item - from the context menu. - - To make the currently selected child the active person, - click the left-arrow button to the right of the children box. - Alternatively, right-click into the children box and select - Make the selected child an active person item - from the context menu. - + + - + + + Using the Family View + - In addition to this, &app; provides an extensive set of keyboard - navigation options. The detailed reference to the keybindings - is found in the . + When in the Family View (see ), + you can easily navigate between the members of the displayed + family as follows: - + + + + - - - Using the Pedigree View - The Pedigree View (see ) also - allows you to move along the family tree. - The benefit of this method is that you can see more than one - generation of the family tree. Also, you can jump directly from a - great-grandson to a great-grandfather without going through the - intermediate generations. + To make the currently selected spouse the active person, + click the double-arrow button to the right of the active + person box. Alternatively, right-click into the spouse + box and select Make the selected spouse an + active person item from the context menu. - Note that after changing the active person in the Pedigree - View, the display is re-adjusted to show four generations, starting - from the newly selected Active person. When in the Pedigree View, you - can easily navigate between the members of the displayed family tree - as follows: + + + + - - To make any displayed person the active person, - double-click the line that connects to the left side of the - corresponding box. + To make the currently selected parents the active family + (thereby making father the active person and mother the + selected spouse), click the right-arrow button to the + right of the active person's parents box. Alternatively, + right-click into the active person's parents box and + select Make the selected parents the active + family item from the context menu. - To make a child of the currently active person (if any) - the active person, click the left arrow button to the left of the - corresponding box. If there is more than one child, the button expands - to the menu listing the children to choose from. - - To move the whole family tree one generation back, - click on the corresponding right arrow button on the right-hand side - of the display area. Clicking the upper button will move the tree - along the paternal line. Clicking the lower button will move the - tree along the maternal line. - - Clicking either of these buttons is completely equivalent to - double-clicking the lines connecting to the left of the corresponding - boxes for father and mother. - - - You can also quickly access any of the spouses, siblings, - children, or parents of any displayed person. To do this, move the - mouse over the desired person's box and right-click to invoke - a context menu. The appropriate menu items will contain submenus - listing all spouses, siblings, children, and parents of the - corresponding person. - - - Advantages of using right-click menus - - Direct access to spouse and siblings - Complete lists of all member of all categories, - not only the preferred members. - - - - - - - - - Setting the Home Person - One and only one person in the database can be selected as the - Home person. Once the Home person is selected, moving to that - person becomes a matter of a single click, regardless of which view - you are using at the moment. - - To set the Home person, first navigate to that person using - any method you like. Then choose - Edit - Set Home person. Once this is - done, you can move to the Home person from anywhere in the - database by simply clicking the Home icon - on the toolbar. You can also choose Go - Home from the menu or select - Home item from any context menu available on the - right click. - - - - - - - - Using history-based tools - &app; also features a powerful set of history-based navigation - tools. These tools are similar to those commonly used in web browsers. - They include Back and Forward - items available from the Go - menu, context menus (available in People, Family, and Pedigree views), - and the toolbar buttons. They also include the list of the recent - selections available under the - Go menu that allows you - to jump directly to any of the recent selections. - Finally, right-clicking on the Back - and Forward toolbar buttons invokes the - popup menu with corresponding portion of the history. Select any item - from the menu to jump directly to it. - - - - - - Bookmarking People - Similar to setting the Home person, you can bookmark other - people from the database to simplify further navigation. To bookmark - a person, first navigate to that person, then choose - Bookmarks - Add bookmark. To move to that - person from anywhere in the database, choose - Bookmarks - Go to bookmark - Person's name - . - - You can manage your bookmarks by choosing - Bookmarks - Edit bookmarks.... This opens - the following Edit Bookmarks dialog with the - list of bookmarks and the controls to modify this list. - - -
- Edit Bookmarks dialog - - - Shows Edit Bookmarks dialog. -
- - -
- - - - Finding records - - To find a record in a database, first switch to the appripriate - View that provides the list of the desired records: People, Sources, - Places, or Media. Then start typing the name of a person or the title - of a Source, Place, or Media object that you are looking for, - respectively. - You may also press Ctrl+F to turn on the search - mode, but simply staring to type is also enough. - - -
- Type-ahead find - - - Shows type-ahead find. -
- - - As you type, the first record in the list that is compatible - with your input will be selected. - - - Finding People - For more complex people searches you may want to use filters. - Enable filter controls by choosing View - Filter , select the desired - filter, and click Apply. - For details, see - -
- -
- - - - Generating Reports - Reports are the most common form of the output produced by - genealogical research. The majority of genealogical software puts a lot - of emphasis on developing nice looking reports. &app; is no - exception in this regard, offering a choice of a variety of reports. - &app; can generate reports in a multitude of open formats, both - text based and graphical. &app; can also produce screen based reports - that are convenient for viewing a summary of your database. - Finally, &app; can generate a web site suitable for immediate - posting on the Internet. All of these are almost infinitely flexible. - If you wish to modify or extend the default format of &app; report, - you can design and choose the style for each of your reports. - - All reports can be accessed through the menu by choosing - Reports - Report Type - Particular - Report. Alternatively, - you can browse the complete selection of available reports along - with their brief descriptions in a Report - Selection dialog invoked by clicking the - Reports icon on the toolbar. - - - - - - Books - Currently, the only available report under this category - is the Book Report. - - The Book Report creates a single document (i.e. a Book) - containing a collection of graphical and textual reports. - Consequently, this allows for a very rich set of documents - that &app; can produce. - - - When Book Report is selected, the following book configuration - dialog appears: - - -
- Book Report dialog - - - Shows Book Report dialog. -
- - - The Book name text entry field is used to - save the book (a set of configured selections) for future use. - The top pane lists the items available for inclusion in the - book. The bottom pane lists the currently selected items in - the order they will appear in the book. - - The horizontal set of buttons by the Book - name field operates on the whole book. Click - the Clear button to clear all items from - the current book. Click the Save button to - save the current book (under the name typed in - the Book name text entry field) for future - use. - - - Saving the book also saves the configuration for each item. - - - Click the Open button to load - the book from the list of previously saved books. Finally, click the - Edit books button to invoke the editable list of - available books. - - The vertical set of buttons to the right of the bottom pane - operates on the - selected book item. Click the Add button to - add selected item from the available list to the current book. Click - the Remove button to remove an item from the - current book. Use Up and - Down to change the items order in the current - book. Click the Setup button to configure the - options of the selected item of the current book. - - - The configuration dialogs invoked by Setup - are item-specific. If you choose not to configure the item, sane - defaults will be used for all needed options. The common option for - almost all book items is the center person: the person on whom the - item is centered. Thanks to this option, you can create a book with - items centered on different people (e.g. your mom's and dad's - ancestors as separate chapters). By default, the center person is - set to the active person. - - Almost all items available for inclusion in the book are textual - or graphical reports, and are therefore available in the form of standalone - reports. The exception is the following items which are only available as - book items: - - - - Title Page - This item produces a customized Title page. You can - configure the text of title, subtitle, and the footer of the page. - An image can be optionally placed between the subtitle and the footer. - Because of its configurability, this item can be used to create - title pages for the whole book, its chapter, or even a single item. + + + + To make the currently selected spouse's parents the active + family (thereby making father the active person and mother + the selected spouse), click the right-arrow button to the + right of the spouse's parents box. Alternatively, + right-click into the spouse's parents box and select + Make the selected parents the active + family item from the context menu. + + + + + + + To make the currently selected child the active person, + click the left-arrow button to the right of the children + box. Alternatively, right-click into the children box and + select Make the selected child an active + person item from the context menu. + + + + + + + In addition to this, &app; provides an extensive set of + keyboard navigation options. The detailed reference to the key + bindings is found in the . + + +
+ + + + + Using the Pedigree View + + + The Pedigree View (see ) also + allows you to move along the family tree. The benefit of this + method is that you can see more than one generation of the + family tree. Also, you can jump directly from a great-grandson + to a great-grandfather without going through the intermediate + generations. + + + + + Note that after changing the active person in the Pedigree + View, the display is re-adjusted to show four generations, + starting from the newly selected Active person. When in the + Pedigree View, you can easily navigate between the members of + the displayed family tree as follows: + + + + + + + To make any displayed person the active person, + double-click the line that connects to the left side of + the corresponding box. + + + + + + + To make a child of the currently active person (if any) + the active person, click the left arrow button to the left + of the corresponding box. If there is more than one child, + the button expands to the menu listing the children to + choose from. + + + + + + + To move the whole family tree one generation back, click + on the corresponding right arrow button on the right-hand + side of the display area. Clicking the upper button will + move the tree along the paternal line. Clicking the lower + button will move the tree along the maternal line. + + + + + Clicking either of these buttons is completely equivalent + to double-clicking the lines connecting to the left of the + corresponding boxes for father and mother. + + + + + + + You can also quickly access any of the spouses, siblings, + children, or parents of any displayed person. To do this, move + the mouse over the desired person's box and right-click to + invoke a context menu. The appropriate menu items will contain + submenus listing all spouses, siblings, children, and parents + of the corresponding person. + + + + Advantages of using right-click menus + + + Direct access to spouse and siblings + + + + + Complete lists of all member of all categories, not only + the preferred members. + + + + + + + + + + + Setting the Home Person + + + One and only one person in the database can be selected as the + Home person. Once the Home person is selected, moving to that + person becomes a matter of a single click, regardless of which + view you are using at the moment. + + + + + To set the Home person, first navigate to that person using + any method you like. Then choose + + + Edit + Set Home person + . + + Once this is done, you can move to the Home person from + anywhere in the database by simply clicking the + Home icon on the toolbar. You can also + choose + + + Go + Home + + + from the menu or select Home item from + any context menu available on the right click. + + + + + + + + Using history-based tools + + + &app; also features a powerful set of history-based navigation + tools. These tools are similar to those commonly used in web + browsers. They include Back and + Forward items available from the + + + Go + + + menu, context menus (available in People, Family, and Pedigree + views), and the toolbar buttons. They also include the list of + the recent selections available under the + + + Go + + + menu that allows you to jump directly to any of the recent + selections. Finally, right-clicking on the + Back and Forward + toolbar buttons invokes the popup menu with corresponding + portion of the history. Select any item from the menu to jump + directly to it. + + + + + + + + Bookmarking People + + + Similar to setting the Home person, you can bookmark other + people from the database to simplify further navigation. To bookmark + a person, first navigate to that person, then choose + + + Bookmarks + Add bookmark + . + + To move to that person from anywhere in the database, choose + + + Bookmarks + Go to bookmark + + Person's name + + . + + + + + You can manage your bookmarks by choosing + + + Bookmarks + Edit bookmarks... + . + + This opens the following Edit Bookmarks + dialog with the list of bookmarks and the controls to modify + this list. + + + + + +
+ Edit Bookmarks dialog + + + + + + + Shows Edit Bookmarks dialog. + + + +
+ + +
+ + + + + Finding records + + + To find a record in a database, first switch to the + appropriate View that provides the list of the desired + records: People, Sources, Places, or Media. Then start typing + the name of a person or the title of a Source, Place, or Media + object that you are looking for, respectively. You may also + press Ctrl+F to turn on the search mode, but + simply staring to type is also enough. + + + + + +
+ Type-ahead find + + + + + + + Shows type-ahead find. + + + +
+ + + + + As you type, the first record in the list that is compatible + with your input will be selected. + + + Finding People + + + For more complex people searches you may want to use + filters. Enable filter controls by choosing + + + View + Filter + , + + select the desired filter, and click Apply. + For details, see + + + +
+
+ + + + + Generating Reports + + Reports are the most common form of the output produced by + genealogical research. The majority of genealogical software + puts a lot of emphasis on developing nice looking reports. &app; + is no exception in this regard, offering a choice of a variety + of reports. &app; can generate reports in a multitude of open + formats, both text based and graphical. &app; can also produce + screen based reports that are convenient for viewing a summary + of your database. Finally, &app; can generate a web site + suitable for immediate posting on the Internet. All of these are + almost infinitely flexible. If you wish to modify or extend the + default format of &app; report, you can design and choose the + style for each of your reports. + + + All reports can be accessed through the menu by choosing + + Reports + + Report Type + + + Particular Report + + . + Alternatively, you can browse the complete selection of + available reports along with their brief descriptions in a + Report Selection dialog invoked by clicking + the Reports icon on the toolbar. + + + + + + Substitution Values + + Many of the graphical reports allow you to customize the + information on the display. Variable substituions are used + to substitute date for a particular symbol. There are two + styles of variables. The difference between the two styles + is how empty data is handled. + + + The first style of variables are preceeded by a '$'. If + the variable evaluates to an empty string, the variable is + replaced with the empty string. The second style of + variables are preceeded by a '%'. If the variable evaluates + to an empty string, the line that contains the variable is + removed from the output. + + + + $n/%n + + + Displays the person's name in the form of FirstName LastName + + - Custom Text - This item produces a page with three paragraphs, each - containing custom text. The appearance of the text can be adjusted by - using custom styles. This item was meant to be used for epigraphs, - dedications, explanations, notes, and so forth. - + + $N/%N + + + Displays the person's name in the form of LastName, FirstName + + - + + $i/%i + + + Displays the GRAMPS ID associated with the person. + + + + + + $b/%b + + + Displays the person's date of birth + + + - + + $B/%B + + + Displays the person's place of birth + + + - - - Code Generators - This category contains reports that produce code intended - to be run through the computer, rather than the usual formatted + + $d/%d + + + Displays the person's date of death + + + + + + $D/%D + + + Displays the person's place of death + + + + + + $s/%s + + + Displays the name of the person's preferred spouse in + the form of FirstName LastName + + + + + + $S/%S + + + Displays the name of the person's preferred spouse in + the form of LastName, FirstName. + + + + + + $m/%m + + + Displays the marriage date of the person and the preferred + spouse. + + + + + + $M/%M + + + Displays the place assocated with the marriage of the + person and the preferred spouse. + + + + + + + + Books + + + Currently, the only available report under this category is + the Book Report. + + + + + The Book Report creates a single document (i.e. a Book) + containing a collection of graphical and textual reports. + Consequently, this allows for a very rich set of documents + that &app; can produce. + + + + + When Book Report is selected, the following book configuration + dialog appears: + + + + + +
+ Book Report dialog + + + + + + + Shows Book Report dialog. + + + +
+ + + + + + The Book name text entry field is used to + save the book (a set of configured selections) for future use. + The top pane lists the items available for inclusion in the + book. The bottom pane lists the currently selected items in + the order they will appear in the book. + + + + + The horizontal set of buttons by the Book + name field operates on the whole book. Click the + Clear button to clear all items from + the current book. Click the Save button + to save the current book (under the name typed in the + Book name text entry field) for future + use. + + + + + Saving the book also saves the configuration for each item. + + + + + Click the Open button to load the book + from the list of previously saved books. Finally, click the + Edit books button to invoke the + editable list of available books. + + + + + The vertical set of buttons to the right of the bottom pane + operates on the selected book item. Click the + Add button to add selected item from + the available list to the current book. Click the + Remove button to remove an item from + the current book. Use Up and + Down to change the items order in the + current book. Click the Setup button to + configure the options of the selected item of the current + book. + + + + + The configuration dialogs invoked by + Setup are item-specific. If you choose + not to configure the item, same defaults will be used for all + needed options. The common option for almost all book items is + the center person: the person on whom the item is + centered. Thanks to this option, you can create a book with + items centered on different people (e.g. your mom's and dad's + ancestors as separate chapters). By default, the center person + is set to the active person. + + + + + Almost all items available for inclusion in the book are + textual or graphical reports, and are therefore available in + the form of standalone reports. The exception is the following + items which are only available as book items: + + + + + Title Page + + + + This item produces a customized Title page. You can + configure the text of title, subtitle, and the footer of + the page. An image can be optionally placed between the + subtitle and the footer. Because of its + configurability, this item can be used to create title + pages for the whole book, its chapter, or even a single + item. + + + + + + Custom Text + + + + This item produces a page with three paragraphs, each + containing custom text. The appearance of the text can + be adjusted by using custom styles. This item was meant + to be used for epigraphs, dedications, explanations, + notes, and so forth. + + + + + +
+ + + + + Code Generators + + + This category contains reports that produce code intended to + be run through the computer, rather than the usual formatted output for human reading. The only code generator currently available in &app; is the Relationship Graph producing the - GraphViz description of the graph. - - The Relationship Graph creates a complex relationship graph in - GraphViz format. The GraphViz dot tool can - transform the graph into postscript, jpeg, png, vrml, svg, and - other formats. GraphViz tools are freely available from the - GraphViz - site. Specific options for this report - include filter and number of generations considered, as well as - several GraphViz-specific options related to pagination, color, - and details of the graph. - - If you are not interested in GraphViz code itself - and just want to generate graphical output, &app; can do it for you - under the hood. Look for Relationship Graph - in the Graphical Reports category, - + GraphViz description of the graph. - + + - - - Graphical Reports - Graphical reports represent information in forms of charts - and graphs. Most of the options are common among graphical reports, - therefore they will be described only once, at the end of this - section. The few options which are specific to a given report will be - described directly in that report's entry. + The Relationship Graph creates a complex relationship graph in + GraphViz format. The GraphViz dot tool can + transform the graph into postscript, jpeg, png, vrml, svg, and + other formats. GraphViz tools are freely available from the + GraphViz + site. Specific options for this report include filter + and number of generations considered, as well as several + GraphViz-specific options related to pagination, color, and + details of the graph. - The following graphical reports are currently - available in &app;: - - + + + - Ancestor Chart - This report generates the chart of people who are - ancestors of the Active person. Specific options include - the number of generations considered and the format of the displayed - entries. - + If you are not interested in GraphViz code itself and just + want to generate graphical output, &app; can do it for you + under the hood. Look for Relationship + Graph in the Graphical Reports category, - Ancestor Chart (Wall Chart) - This report is similar to the Ancestor Chart report. - It provides more options which make it useful for generating huge charts - suitable for a poster or a wall chart. These options include the ability - to compress the report (getting rid of an empty space) and the option - to fit the whole chart on to a single page. In the latter case, the - contents of the chart is scaled down appropriately. - + + + - Descendant Graph - This report generates a graph of people who are - descendants of the Active person. Specific options include - the format of the displayed entries. - + - Fan Chart - This report produces a chart resembling a fan, with - Active person in the center, parents the the semicircle next to it, - grandparents in the next semicircle, and so on, for a total of five - generations. - + + Graphical Reports + - Relationship Graph - This report creates a complex relationship graph in - GraphViz format and then converts into graphical output - running it through the the GraphViz dot tool - behind the scene. Specific options for this report - include filter, options for dates and places for the events, and - whether to include URLs and IDs for individuals and families. - There are also - several GraphViz-specific options related to pagination, color, - and details of the graph. - + Graphical reports represent information in forms of charts and + graphs. Most of the options are common among graphical + reports, therefore they will be described only once, at the + end of this section. The few options which are specific to a + given report will be described directly in that report's + entry. - Statistics Chart - This report can collect and display a wealth of - statistical data about your database. - Specific options include filter, sorting methods, and additional - birth- and gender-based limit for inclusion into statistics. - You can also set the minimum number of items to qualify for the - bar chart, so that the charts with fewer items will generate - a pice chart instead. - The Chart Selection tab - allows you to check which charts you want to include in your report. - - + + - Timeline Graph - This report outputs the list of people with their - lifetimes represented by intervals on a common chronological scale. - Specific options include filter, sorting method, and the title of - the report. - + The following graphical reports are currently available in + &app;: - + + + + Ancestor Chart + + - Common options for graphical reports are the filename of the - output, the format of the output, selected style, page size and - orientation. Optionally, the reports can be immediately opened - with the default application. - - The options used in reports are persistent: each report + This report generates the chart of people who are + ancestors of the Active person. Specific options include + the number of generations considered and the format of + the displayed entries. + + + + + + Ancestor Chart (Wall Chart) + + + + This report is similar to the Ancestor Chart report. It + provides more options which make it useful for + generating huge charts suitable for a poster or a wall + chart. These options include the ability to compress the + report (getting rid of an empty space) and the option to + fit the whole chart on to a single page. In the latter + case, the contents of the chart is scaled down + appropriately. + + + + + + Descendant Graph + + + + This report generates a graph of people who are + descendants of the Active person. Specific options + include the format of the displayed entries. + + + + + + Fan Chart + + + + This report produces a chart resembling a fan, with Active + person in the center, parents the the semicircle next to + it, grandparents in the next semicircle, and so on, for a + total of five generations. + + + + + + Relationship Graph + + + + This report creates a complex relationship graph in + GraphViz format and then converts into graphical output + running it through the the GraphViz + dot tool behind the scene. Specific + options for this report include filter, options for + dates and places for the events, and whether to include + URLs and IDs for individuals and families. There are + also several GraphViz-specific options related to + pagination, color, and details of the graph. + + + + + + Statistics Chart + + + + This report can collect and display a wealth of + statistical data about your database. Specific options + include filter, sorting methods, and additional birth- + and gender-based limit for inclusion into statistics. + You can also set the minimum number of items to qualify + for the bar chart, so that the charts with fewer items + will generate a pie chart instead. The Chart + Selection tab allows you to check which + charts you want to include in your report. + + + + + + Timeline Graph + + + + This report outputs the list of people with their + lifetimes represented by intervals on a common + chronological scale. Specific options include filter, + sorting method, and the title of the report. + + + + + + + + Common options for graphical reports are the filename of the + output, the format of the output, selected style, page size + and orientation. Optionally, the reports can be immediately + opened with the default application. + + + + + + The options used in reports are persistent: each report + remembers its options used last time. + + + + + + + Text Reports + + + Text reports represent the desired information as formatted + text. Most of the options are common among text reports, + therefore they will be described only once, at the end of this + section. The options which are specific to a given report will + be described directly in that report's entry. + + + + + The following text reports are currently available in &app;: + + + + + Ahnentafel Report + + + + This report lists the active person and his or her + ancestors along with their vital data. The people are + numbered in a special way which is an established + standard called Ahnentafel. The active person is given + number 1. His or her father and mother have numbers 2 + and 3, respectively. This rule holds for every person + while going back in generations: father's parents are + numbered 4 and 5, and mother's parents are numbered 6 + and 7, fathers always numbered with even and mothers + with odd numbers. Therefore, for any person having + number N in this tree, the numbers of father and mother + are 2N and 2N+1, respectively. + + + + + + Complete Individual Report + + + + This report provides individual summaries similar to + that of the Individual Summary report. The advantage of + this report is the specific filter option. Depending on + the filter choice (active person only, his or her + descendants, his or her ancestors, or entire database), + the report may contain from one to many individual + summaries. Another option for this report is the + inclusion of source information when listing events. + + + + + + Comprehensive Ancestors Report + + + + This report produces a comprehensive description of + ancestors of the active person. The highlights of this + report include elaborate layout, images of children, + present and former spouses, and source + citations. Specific options: number of backward + generations to consider, whether to cite sources, and + whether to break pages between generations. + + + + + + Descendant Report + + + + This report produces a brief description of descendants + of the active person. Specific options: number of + forward generations to consider. + + + + + + Detailed Ancestral Report + + + + This report covers in detail the ancestors of the active + person. It includes vital data (birth and death) as well + as marriages. Specific options: number of backward + generations to consider, as well as a variety of options + regarding the exact contents to include. + + + + + + Detailed Descendant Report + + + + This report covers in detail the descendants of the + active person. It includes vital (birth and death) + information as well as marriages. Specific options: + number of forward generations to consider. + + + + + + FTM Style Ancestral Report + + + + This report creates an ancestral report similar to that + produced by the Family Tree Maker (tm) program. It + covers in detail the active person and his/her ancestors + It includes vital information as well as marriages, + children, and notes. Specific options: number of + backward generations to consider. + + + + + + FTM Style Descendant Report + + + + This report creates a descendant report similar to that + produced by the Family Tree Maker (tm) program. It + covers in detail the active person and his/her + descendants. It includes vital information as well as + marriages, children, and notes. Specific options: number + of forward generations to consider. + + + + + + Family Group Report + + + + This creates a family group report, showing information + on a set of parents and their children. Specific + options: the spouse (available only if the active person + has more than one spouse). + + + + + + Individual Summary + + + + This report produces a detailed summary on the active + person. The report includes all the facts known to the + database about that person. + + + + + + + + Common options for text reports are the filename of the + output, the format of the output, selected style, page size + and orientation. For HTML reports, there is no page + information. Instead, HTML options include the choice of the + HTML template, either available in &app; or a custom template + defined by you. Optionally, the reports can be immediately + opened with the default application. + + + + The options used in reports are persistent: each report remembers its options used last time. - + + + - + - - - Text Reports - Text reports represent the desired information as formatted - text. Most of the options are common among text reports, - therefore they will be described only once, at the end of this - section. The options which are specific to a given report will be - described directly in that report's entry. - - The following text reports are currently - available in &app;: + + View Reports + - + View reports are representing overall summaries of the + database information available immediately for on-screen + viewing. The following view reports are currently available + in &app;: - Ahnentafel Report - This report lists the active person and his or her - ancestors along with their vital data. The people are numbered in a - special way which is an established standard called Ahnentafel. - The active person is given number 1. His or her father and mother - have numbers 2 and 3, respectively. This rule holds for every person - while going back in generations: father's parents are numbered 4 and 5, - and mother's parents are numbered 6 and 7, fathers always numbered - with even and mothers with odd numbers. Therefore, for any person - having number N in this tree, the numbers of father and mother - are 2N and 2N+1, respectively. - - + + + + Number of ancestors + + - Complete Individual Report - This report provides individual summaries similar to - that of the Individual Summary report. The advantage of this report - is the specific filter option. Depending on the filter choice (active - person only, his or her descendants, his or her ancestors, or entire - database), the report may contain from one to many individual - summaries. Another option for this report is the inclusion of - source information when listing events. - + This report displays the number of ancestors of the + active person. - Comprehensive Ancestors Report - This report produces a comprehensive description - of ancestors of the active person. The highlights of this report - include elaborate layout, images of children, present and former - spouses, and source citations. Specific options: number - of backward generations to consider, whether to cite sources, - and whether to break pages between generations. - + + + + + Summary of the database + + - Descendant Report - This report produces a brief description - of descendants of the active person. Specific options: number - of forward generations to consider. - + This report displays the overall statistics concerning + number of individuals of each gender, various incomplete + entries statistics, as well as family and media + statistics. - Detailed Ancestral Report - This report covers in detail the ancestors of the - active person. It includes vital data (birth and death) as well as - marriages. Specific options: number of backward generations - to consider, as well as a variety of options regarding the exact - contents to include. - + + + + + - Detailed Descendant Report - This report covers in detail the descendants of the - active person. It includes vital (birth and death) information as well as - marriages. Specific options: number of forward generations - to consider. - + - FTM Style Ancestral Report - This report creates an ancestral report similar to - that produced by the Family Tree Maker (tm) program. It covers in detail the - active person and his/her ancestors It includes vital information - as well as marriages, children, and notes. Specific options: number - of backward generations to consider. - + + Web Page + The only available report in this category + is the Narrative Web Site report. It generates a + web site (that is, a set of linked web pages), for + a set of selected individuals. + + + + Narrative Web Site - FTM Style Descendant Report - This report creates a descendant report similar to - that produced by the Family Tree Maker (tm) program. It covers in detail the - active person and his/her descendants. It includes vital information - as well as marriages, children, and notes. Specific options: - number of forward generations to consider. - + + + Introduction + + + &app; 2.0.6 introduced the Narrative Web generator. + The new tool provides considerably more functionality + than the older web generator. Instead of using HTML + templates to customize the pages, CSS style sheets are used. + + + + More information is now displayed about each person, + along with information about sources, places, and media + objects. Introduction pages can be added to provide additional + information, such as family history. + + + + Selecting the output + + + Genealogy records can generate a lot of files. Many web + servers have a difficult time with many files in a single + directory. The Narrative Web Generator strives to keep the + number of files per directory to a managable level. To do + this, a hierarchy of directores is created. The generated + files names are not intuitive, but are unique per person. + Subsequent runs will geneate identical file names, making + it easy to replace files. + + + By default, the output files are written to the specified + directory. Because of the number of files and directories + that are created, it may be difficult to transfer the files + to an external web host. To aid in this, you may directly + create a gzip'd tar file to more easily upload the data. + This is the format that should be used if you would like + to take advantage of the free genealogy page hosting at the + GRAMPS web hosting site. + + To select the gzip'd tar file, select the Store + web pages in .tar.gz archive option. + - Family Group Report - This creates a family group report, showing - information on a set of parents and their children. Specific - options: the spouse (available only if the active person has more - than one spouse). - + + Applying a filter + + + Like the previous web page generator, and most of the other + &app; reports, you can control what is included in the output + by choosing a filter. Several default filters are provided for + you, but you are free to use the Custom Filter Editor tool to + create your own. + + Any person matching this filter who is not excluded due + to the privacy rules, will be included in the output. The default + filter includes all people in the database. + - Individual Summary - This report produces a detailed summary on the - active person. The report includes all the facts known to the - database about that person. - + + Applying a style sheet + + GRAMPS provides six built in style sheets for your web page. + Each of these style sheets produces a unique look for your pages. + The generated style sheet is named narrative.css. + You may edit this file if you wish to further customize your + site. + + + If you make modifications to your style sheet, you need to be aware + the regenerating the pages with the same output directory will + overwrite your changes to this file. To prevent this from happening, + make sure you choose No style sheet for subsequent + runs. + - + + Character set encoding + + + Because of GRAMPS internationalization ability, the default character + set for the HTML pages is UTF-8. This provides support for virtually + all characters. + + The Apache web server is sometimes misconfigured to override + the character set specified in an HTML page. This causes problems with + the UTF-8 character set generated by GRAMPS, distorting characters on + the screen. + + If your web server is misconfigured and you do not have priveledge + to fix the configururation, you may solve this problem by overriding the + default character set to match what your web server may be expecting. + - Common options for text reports are the filename of the - output, the format of the output, selected style, page size and - orientation. For HTML reports, there is no page information. - Instead, HTML options include the choice of the HTML template, - either available in &app; or a custom template defined by you. - Optionally, the reports can be immediately opened - with the default application. + + Copyright notice + + International copyright law reserves all rights to your data. + You own the data, and people must get your permission to use it. + In genealogy, however, sharing data is a common ideal. It this case, you + may wish to grant the user more rights. - The options used in reports are persistent: each report - remembers its options used last time. - + While the default for GRAMPS is to place a notice indicating that + all rights are reserved, we give you the option to place your site under + one of several of the Create Commons licenses. With a Creative Commons + license, you grant user's certain permission to use your data without + requiring them to contact you directly for permission. - + See the Creative + Commons web site for more information. + + + Controlling page generation + + Three additional pages can be generated by the web page generator. + The Home page is a page that will display an image and a whatever text + you wish. To enable this page, choose a Media Object + from the Home Media/Note ID menu on the Page + Generation tab. If the Media Object contains an image, the image + is displayed at the top of the page. If the Media Object contains a Note, + the Note's text is used for the text of the page. A second page, the + Introduction page, works similarly. Just choose the Media Object in the + Introduction Media/Note ID menu. + + If you choose to include a contact page, the researcher information + stored in the database is displayed, along with the information specified + in the Publisher contact/Note ID menu. Please use + this page with caution, + since you may consider your contact information to be private. + - - - View Reports - View reports are representing overall summaries of the database - information available immediately for on-screen viewing. - The following view reports are currently available in &app;: + + Privacy + + Privacy of personal information is an important issue on the web + today. &app; tries to give you control over the information that is presented. + + + &app; provides two options to control the privacy of your information. + If you select the Do not include records marked private + option, any data that is marked as private will not be displayed on the + generated site. If you select Restrict information on living people, + &app; will attempt to determine which people have the potential of still + being alive, and will omit these people from the database. Some countries + have laws that indicate that a certain number of years must pass after + someone's death before information can be published. The Years + to restrict from person's death option allows you to specifiy + how many years a person must be deceased before the information is included. + - + Please note that it is your responsibility to double check all + information in the pages for any privacy information. &app; cannot be held + responsible for any privacy issues. + - Number of ancestors - This report displays the number of ancestors of the - active person. - + + Adding custom code your pages + + If you are not interested in customizing your pages, you may skip + the section. + + The previous web generator allowed you to customize your pages + using HTML templates. Your data would be substituted for certain markers + in the code. + + This method proved to be too cumbersome for most users. The Narrative + Web Page Generator introduces a simpler mechanism. On the Page + Generation tab, you may specify text (including HTML code) that + will be inserted into each page, separately for the header and the + footer. + + To create this code, you need to create a Media Object marked as an + internal note. To create this, add a new Media Object in the Media View, + and select the internal note option. You may then enter your HTML code. + + + + To insert the code from the internal notes into the web pages, + select the appropriate Media Objects from the HTML user + header and HTML user footer menus. + Two div sections will be added to the pages — userheader and userfooter. + The corresponding HTML code is inserted into the HTML page surrounded by div + markers. You can customize your style sheet to provide additional formatting + and positioning information to control these sections. + + + + + +
+ + + Running Tools + - Summary of the database - This report displays the overall statistics concerning - number of individuals of each gender, various incomplete entries - statistics, as well as family and media statistics. - + &app; tools allow you to perform various types of analysis of + your genealogical data. Typically, the tools do not produce + output in form of printouts or files. Instead, they produce + screen output immediately available for the + researcher. However, when appropriate, you can save the + results of running a tool into a file. Tools present one of + the major strengths of &app; compared to the most genealogical + software. - - + + - - - Web Page - - This category includes reports producing web sites - based on your data. + The tools can be accessed through the menu by choosing - + + Tools + + Tool Section + + + Particular Tool + + . - Generate Web Site - - This report generates web pages, either for a selected - individual (active person) or a set of individuals. The options - for this report are broken down into contents, privacy, and advanced - options. The contents options include the filter (determine the - scope of the database to consider), - destination directory for the images, an optional short ancestor tree, - and a link to the index page. - Privacy options allow you to omit private records, restrict - information on living people, skip images (either all or only - those of living people), and omit comments and text in source - information. Finally, the advanced options allow you to include - the optional &app; ID, create a GENDEX index, and specify the - extension of the resulting files. - - + Alternatively, you can browse the complete selection of + available tools along with their brief descriptions in a + Tool Selection dialog invoked by clicking + the Tools icon on the toolbar. - Narrative Web Site - This report is an alternative web site generator, - producing the narrative set of web pages. It is still in development, - with the goal of producing a more complete, better looking, and easily - adjustable web site. - + - + - + + Analysis and Exploration + - - - - - Running Tools - &app; tools allow you to perform various types of analyses - of your genealogical data. Typically, the tools do not produce - output in form of printouts or files. Instead, they produce screen - output immediately available for the researcher. However, when - appropriate, you can save the results of running a tool into a file. - Tools present one of the major strengths of &app; compared to the most - genealogical software. - - The tools can be accessed through the menu by choosing - Tools - Tool Section - Particular - Tool. Alternatively, - you can browse the complete selection of available tools along - with their brief descriptions in a Tool - Selection dialog invoked by clicking the - Tools icon on the toolbar. - - - - Analysis and Exploration - This section contains tools which analyze and explore the + This section contains tools which analyze and explore the database, but do not alter it. The following analysis and exploration - tools are currently available in &app;: + tools are currently available in &app;: - + + + + Compare individual events + + - Compare individual events - This tool compares events across the selected group of - people. The people for this comparison are chosen with the use of - custom filters. The custom filters can be created in the Custom Filter - Editor (see ) that can be invoked by clicking - the Custom Filter Editor button. The resulting - table produced by this tool can be saved as a spreadsheet. - - + This tool compares events across the selected group of + people. The people for this comparison are chosen with + the use of custom filters. The custom filters can be + created in the Custom Filter Editor (see ) that can be invoked by + clicking the Custom Filter Editor + button. The resulting table produced by this tool can be + saved as a spreadsheet. + + + + + + Interactive descendant browser + + + + This tool builds a tree with the active person being the + root. Children branch from their parents in the usual + manner. Use this tool for a quick glance of a person's + descendants. + + + + + Double-clicking on tree node will bring up the + Edit Person dialog allowing to + view or modify the personal data. + + + + + + + + + + Database Processing + + + This section contains tools which may modify your database. + The tools from this section are used mostly for finding and + correcting errors in the data. The following database + processing tools are currently available in &app;: + + + + + + The modifications will only be performed upon your explicit + consent, except for the automatic fixes performed by + Check and repair database tool. + + + + + + Check and repair database + + + + This tool checks the database for integrity problems, + fixing the problems it can. Specifically, the tool is + checking for: + + + + + + + Broken family links. These are the cases when a + person's record refers to a family while the + family's record does not refer to that person, and + vice versa. + + + + + + + Missing media objects. The missing media object is + the object whose file is referenced in the database + but does not exist. This can happen when the file is + accidentally deleted, renamed, or moved to another + location. + + + + + + + Empty families. These are the family entries which + have no reference to any person as their member. + + + + + + + Parent relationship. This checks all families to + ensure that father and mother are not mixed up. The + check is also made that parents have different + gender. If they have common gender then their + relationship is renamed to "Partners". + + + + + + + + Extract information from names + + + + This tool searches the entire database and attempts to + extract titles and nicknames that may be embedded in a + person's Given name field. If any + information could be extracted, the candidates for + fixing will be presented in the table. You may then + decide which to repair as suggested and which not to. + + + + + + Find possible duplicate people + + + + This tool searches the entire database, looking for the + entries that may represent the same person. + + + + + + Fix capitalization of family names + + + + This tool searches the entire database and attempts to + fix the capitalization of family names. The aim is to + have conventional capitalization: capital first letter + and lower case for the rest of the family name. If + deviations from this rule are detected, the candidates + for fixing will be presented in the table. You may then + decide which to repair as suggested and which not to. + + + + + + Rename personal event types + + + + This tool allows all the events of a certain name + to be renamed to a new name. + + + + + + Reorder &app; IDs + + + This tool reorders the &app; IDs according to the + defaults of &app;. + + + + + + + + + + Debug + + + This section contains debugging tools that are not of general + interest for many of the users of &app;. If you're not + interested in debugging or developing &app; you may safely + skip this section. + + + + + Python evaluation window + + + + Enter expression into the Evaluation + Window, get the output in Output + Window. Any errors should end up in the + Error Window. - Interactive descendant browser - This tool builds a tree with the active person being - the root. Children branch from their parents in the usual manner. - Use this tool for a quick glance of a person's descendants. - - Double-clicking on tree node will bring up the Edit - Person dialog allowing to view or modify the personal data. - - - - + + + + Reload plugins + + + Makes an attempt to reload all plugins. + + + + This tool is itself a plugin, but it will not reload itself! + + + + + + Show uncollected objects + + - - + Provides the window listing all uncollected objects. + Depending on the system settings, recently abandoned GUI + objects may still be uncollected. - - - Database Processing - This section contains tools which may modify your database. - The tools from this section are used mostly for finding and correcting - errors in the data. The following database processing tools are - currently available in &app;: - - - The modifications will only be performed upon your explicit consent, - except for the automatic fixes performed by Check and repair - database tool. - - - - Check and repair database - This tool checks the database for integrity problems, - fixing the problems it can. Specifically, the tool is checking for: - - Broken family links. These are the cases when - a person's record refers to a family while the family's record - does not refer to that person, and vice versa. - - - Missing media objects. The missing media - object is the object whose file is referenced in the database - but does not exist. This can happen when the file is - accidentally deleted, renamed, or moved to another location. - - - Empty families. These are the family entries - which have no reference to any person as their member. - - - Parent relationship. This checks all families - to ensure that father and mother are not mixed up. The check - is also made that parents have different gender. If they have - common gender then their relationship is renamed to "Partners". - - - - - - - Extract information from names - This tool searches the entire database and attempts - to extract titles and nicknames that may be embedded in a person's - Given name field. If any information could be - extracted, the candidates for fixing will be presented in the table. - You may then decide which to repair as suggested and which not to. - - - - Find possible duplicate people - This tool searches the entire database, looking - for the entries that may represent the same person. - - - - Fix capitalization of family names - This tool searches the entire database and attempts - to fix the capitalization of family names. The aim is to have - conventional capitalization: capital first letter and lower case - for the rest of the family name. If deviations from this rule - are detected, the candidates for fixing will be presented in the table. - You may then decide which to repair as suggested and which not to. - - - - Rename personal event types - This tool allows all the events of a certain name - to be renamed to a new name. - - - - Reorder &app; IDs - This tool reorders the &app; IDs according to the - defaults of &app;. - - - - - - - - - - Debug - This section contains debugging tools that are not of general - interest for many of the users of &app;. If you're not interested in - debugging or developing &app; you may safely skip this section. - - - - Python evaluation window - Enter expression into the Evaluation - Window, get the output in Output Window. - Any errors should end up in the Error Window. - - - - Reload plugins - Makes an attempt to reload all plugins. - - This tool is itself a plugin, but it will not reload itself! - - - - + + + + - Show uncollected objects - Provides the window listing all uncollected objects. - Depending on the system settings, recently abandoned GUI objects - may still be uncollected. - - + - - + + Utilities + - - - Utilities - + This section contains tools allowing you to perform a simple + operation on a portion of data. The results can be saved in + your database, but they will not modify your existing data. + The following utilities are currently available in &app;: - This section contains tools allowing you to perform a simple - operation on a portion of data. The results can be saved in your - database, but they will not modify your existing data. - The following utilities are currently available in &app;: + + + Custom Filter Editor + - - Custom Filter Editor - The Custom Filter Editor builds custom filters - that can be used to select people included in reports, exports, - and other tools and utilities. This is in fact a very powerful tool - in genealogical analysis. - - When you launch it, the User defined filters - dialog appears that lists all the filters (if any) previously defined - by you. Click the Add... button to define a new filter. - Once you have designed your filters, you can edit, test, and delete - selected filters using the Edit..., - Test..., and Delete - buttons, respectively. All the filters displayed in the list will be - automatically saved along with your database and will be available - with subsequent sessions of &app;. - - The changes made to the filters only take effect when you - click the Apply and close button. - - - Clicking the Add... button invokes the - following Define filter dialog: - - -
- Define filter dialog - - - Shows Define filter dialog. -
- + The Custom Filter Editor builds custom filters that can be + used to select people included in reports, exports, and + other tools and utilities. This is in fact a very powerful + tool in genealogical analysis. - Type the name for your new filter into the - Name field. Enter any comment that would help you - identify this filter in the future into the Comment - field. Add as many rules to the Rule list as you - would like to your filter using Add... button. - If the filter has more than one rule, - select one of the Rule operations. This allows you - to choose whether all rules must apply, only one (either) rule must - apply, or exactly one (either) rule must apply, in order for the filter - to generate a match. If your filter has only one rule, this selection - has no effect. +
+ + + When you launch it, the User defined + filters dialog appears that lists all the filters + (if any) previously defined by you. Click the + Add... button to define a new filter. + Once you have designed your filters, you can edit, test, and + delete selected filters using the + Edit..., + Test..., and + Delete buttons, respectively. All the + filters displayed in the list will be automatically saved + along with your database and will be available with + subsequent sessions of &app;. - - Check Return values that do not match the filter - rules to invert the filter rule. For example, inverting - "has a common ancestor with I1" rule will match everyone who does not - have a common ancestor with that person). - - Clicking the Add... button invokes the - following Add Rule dialog: + + - -
- Add Rule dialog - - - Shows Add Rule dialog. -
- - - The pane on the left-hand side displays available filter rules - arranged by their categories in an expandable tree. For detailed filter - rule reference, see . Click on the - arrows to fold/unfold the appropriate category. Select the rule - from the tree by clicking on its name. The right-hand side displays - the name, the description, and the values for the currently selected - rule. Once you are satisfied with your rule selection and its values, - click OK to add this rule to the rule list - of the currently edited filter. Clicking Cancel - will abort adding the rule to the filter. - - A filter you have already designed may be used as a rule - for another filter. This gives you nearly infinite flexibility in - custom-tailoring your selection criteria that can be later used in - most of the exports, reports, and some of the tools (such as comparing - individual events). -
+ The changes made to the filters only take effect when you + click the Apply and close button. + + + + + + Clicking the Add... button invokes the + following Define filter dialog: - Scratch Pad - - This tool provides a temporary note pad to store - database records for easy reuse. In short, this is a sort of the - copy-and-paste functionality extended from textual objects to - other types of records used in &app;. - - Scratch Pad makes extensive use of drag-and-drop technique. - - - To invoke Scratch Pad, either choose Tools - UtilitiesScratch - Pad or click the Scratch - Padbutton on the toolbar. The following window will - appear: - - -
- Scratch Pad tool - - - Shows Add Scratch Pad tool. -
- - - Scratch Pad supports addresses, attributes (both personal and - family), events (both personal and family), names, media objects - references, source references, URLs, and of course textual information - of notes and comments. To store any type of these records, simply drag - the existing record on to the Scratch Pad from the corresponding - editor dialog. To reuse the record, drag it from the Scratch Pad - onlto the corresponding place in the editor, e.g. Address tab, - Attribute tab, etc. + + +
+ Define filter dialog + + + + + + + Shows Define filter dialog. + + + +
+ + + + + + Type the name for your new filter into the + Name field. Enter any comment that + would help you identify this filter in the future into the + Comment field. Add as many rules to the + Rule list as you would like to your + filter using Add... button. If the + filter has more than one rule, select one of the + Rule operations. This allows you to + choose whether all rules must apply, only one (either) rule + must apply, or exactly one (either) rule must apply, in + order for the filter to generate a match. If your filter has + only one rule, this selection has no effect. + + + + + Check Return values that do not match the filter + rules to invert the filter rule. For example, + inverting "has a common ancestor with I1" rule will match + everyone who does not have a common ancestor with that + person). + - - Some objects are showing the link icon on the left. This - indicates that dragging such selection will produce a reference - to an existing object, not copy the object itself. + - For example, the media object file will not be duplicated. - Instead, the reference will be made to an existing media object, - which will result in the local gallery entry. - + Clicking the Add... button invokes + the following Add Rule dialog: - Scratch Pad storage is persistent within a single &app; - session. Closing the window will not lose the stored records. However, - exiting &app; will. - +
-
+ - Other tools - - - Generate SoundEx codes - This utility generates SoundEx codes for the names of - people in the database. Please visit the NARA Soundex Indexing page to learn more about - Soudex Indexing System. - - +
+ Add Rule dialog + + + + + + + Shows Add Rule dialog. + + + +
- Relationship calculator - This utility calculates and displays the relationship - of any person to the active person. - - + - Verify the database - This utility allows you to verify the database based - on the set of criteria specified by you. - - Difference between Verify tool and previously described - Check tool - The Check tool - detects inconsistencies in the database structure. The Verify tool, - however, is detecting the records that do not satisfy your particular - criteria. + - For example, you may want to make sure that nobody in your - database had children at the age of 98. Based on common sense, such - a record would indicate an error. However, it is not a consistency - error in the database. Besides, someone might have a child at the age of - 98 (although this rarely happens). The Verify tool will display - everything that violates your criteria so that you can check whether - the record is erroneous or not. The ultimate decision is yours. - - + The pane on the left-hand side displays available filter + rules arranged by their categories in an expandable + tree. For detailed filter rule reference, see . Click on the arrows to + fold/unfold the appropriate category. Select the rule from + the tree by clicking on its name. The right-hand side + displays the name, the description, and the values for the + currently selected rule. Once you are satisfied with your + rule selection and its values, click + OK to add this rule to the rule list + of the currently edited filter. Clicking + Cancel will abort adding the rule to + the filter. -
+
+ + - -
+ A filter you have already designed may be used as a rule + for another filter. This gives you nearly infinite + flexibility in custom-tailoring your selection criteria + that can be later used in most of the exports, reports, + and some of the tools (such as comparing individual + events). -
+ + + + + Scratch Pad + + This tool provides a temporary note pad to store database + records for easy reuse. In short, this is a sort of the + copy-and-paste functionality extended from textual objects + to other types of records used in &app;. + + + + + Scratch Pad makes extensive use of drag-and-drop technique. + + + + To invoke Scratch Pad, either choose + + + Tools + Utilities + Scratch Pad + + + or click the ScratchPad button on the + toolbar. The following window will appear: + + + + + +
+ Scratch Pad tool + + + + + + + Shows Add Scratch Pad tool. + + + +
+ + + + + + Scratch Pad supports addresses, attributes (both personal + and family), events (both personal and family), names, media + objects references, source references, URLs, and of course + textual information of notes and comments. To store any type + of these records, simply drag the existing record on to the + Scratch Pad from the corresponding editor dialog. To reuse + the record, drag it from the Scratch Pad on to the + corresponding place in the editor, e.g. Address tab, + Attribute tab, etc. + + + + + + Some objects are showing the link icon on the left. This + indicates that dragging such selection will produce a + reference to an existing object, not copy the object + itself. + + + + + For example, the media object file will not be duplicated. + Instead, the reference will be made to an existing media + object, which will result in the local gallery entry. + + + + + + + Scratch Pad storage is persistent within a single &app; + session. Closing the window will not lose the stored + records. However, exiting &app; will. + + + +
+ + Other tools + + + Generate SoundEx codes + + + + This utility generates SoundEx codes for the names of + people in the database. Please visit the NARA Soundex Indexing page to + learn more about Soundex Indexing System. + + + + + + Relationship calculator + + + + This utility calculates and displays the relationship + of any person to the active person. + + + + + + Verify the database + + + + This utility allows you to verify the database based + on the set of criteria specified by you. + + + + + + Difference between Verify tool and previously + described Check tool + + + + + The Check tool detects inconsistencies in the + database structure. The Verify tool, however, is + detecting the records that do not satisfy your + particular criteria. + + + + + + For example, you may want to make sure that nobody in + your database had children at the age of 98. Based on + common sense, such a record would indicate an + error. However, it is not a consistency error in the + database. Besides, someone might have a child at the + age of 98 (although this rarely happens). The Verify + tool will display everything that violates your + criteria so that you can check whether the record is + erroneous or not. The ultimate decision is yours. + + + + + + + +
diff --git a/doc/gramps-manual/Makefile.am b/doc/gramps-manual/Makefile.am index 03a426c20..66d753d80 100644 --- a/doc/gramps-manual/Makefile.am +++ b/doc/gramps-manual/Makefile.am @@ -1,3 +1,11 @@ # Process this file with automake to produce Makefile.in SUBDIRS = C fr + +topdocdir=$(datadir)/@PACKAGE@/gnome/help/@PACKAGE@ + +install-data-local: + cd $(DESTDIR)$(topdocdir); ln -s . gramps + +uninstall-local: + -rm $(DESTDIR)$(topdocdir)/gramps diff --git a/doc/gramps-manual/fr/gramps-manual-fr.omf b/doc/gramps-manual/fr/gramps-manual-fr.omf index a9125aec2..fe8fa4bf1 100644 --- a/doc/gramps-manual/fr/gramps-manual-fr.omf +++ b/doc/gramps-manual/fr/gramps-manual-fr.omf @@ -3,8 +3,8 @@ Alex Roitman shura@alex.neuro.umn.edu GRAMPS Manual - 2003-12-01 - + 2005-10-16 + User Manual for GRAMPS. User Manual @@ -12,7 +12,6 @@ - + - diff --git a/doc/gramps.1.in b/doc/gramps.1.in index 0fdbd7835..5dc7a1360 100644 --- a/doc/gramps.1.in +++ b/doc/gramps.1.in @@ -174,8 +174,8 @@ exports, and actions specified further on the command line by using \fB\-i\fR, .LP The order of \fB\-i\fR, \fB\-o\fR, or \fB\-a\fR options does not matter. The -actual order always is: all imports (if any) -> all exports (if any) -> -all actions (if any). But opening must always be first! +actual order always is: all imports (if any) -> all actions (if any) +-> all exports (if any). But opening must always be first! .LP If no \fB\-O\fR or \fB\-i\fR option is given, gramps will launch its main diff --git a/doc/gramps.dtd b/doc/gramps.dtd deleted file mode 100644 index 6bd69e7c1..000000000 --- a/doc/gramps.dtd +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/grampsxml.dtd b/doc/grampsxml.dtd new file mode 100644 index 000000000..af62edaa9 --- /dev/null +++ b/doc/grampsxml.dtd @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/grampsxml.rng b/doc/grampsxml.rng new file mode 100644 index 000000000..eb28af1e4 --- /dev/null +++ b/doc/grampsxml.rng @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + M + F + U + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Birth + Adopted + Stepchild + Sponsored + Foster + None + Other + Unknown + + + + + + 0 + 1 + + + + + + Also Known As + Birth Name + Married Name + Other Name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + estimated + calculated + + + + + + + + before + after + about + + + estimated + calculated + + + + + + + + + + + + 0 + 1 + + + Married + Unmarried + Civil Union + Unknown + Other + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/gedcom/sample.ged b/example/gedcom/sample.ged index 02076f73c..b487b83f3 100755 --- a/example/gedcom/sample.ged +++ b/example/gedcom/sample.ged @@ -70,6 +70,12 @@ 1 EDUC 2 DATE BET. 1979 - 1984 2 PLAC UC Berkeley +1 SSN 123-456-7890 +1 CAST cast keyword +1 DSCR dscr keyword +1 IDNO idno keyword +1 NATI nati keyword +1 NCHI nchi keyword 1 _DEG 2 DATE 1984 2 PLAC B.S.E.E. @@ -509,7 +515,6 @@ 2 DATE 26 JUN 34 B.C. 2 PLAC Hayward, Alameda Co., CA 0 @F01@ FAM -1 HUSB @I01@ 1 WIFE @I40@ 1 CHIL @I42@ 2 _FREL Adopted @@ -529,9 +534,6 @@ 1 CHIL @I29@ 2 _FREL Adopted 2 _MREL Adopted -1 CHIL @I01@ -2 _FREL Adopted -2 _MREL Adopted 1 MARR 2 DATE 4 JUN 1954 2 PLAC Sparks, Washoe Co., NV diff --git a/example/gramps/1897_expeditionsmannschaft_rio_a.jpg b/example/gramps/1897_expeditionsmannschaft_rio_a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..584d2dfc44cfd52b26bf92c84415eb7ce97e9734 GIT binary patch literal 27205 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⩾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 |S__icLP1aF#kv2Vd#=OgLflWaRT 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 literal 0 HcmV?d00001 diff --git a/example/gramps/Alimehemet.jpg b/example/gramps/Alimehemet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ab691c0c8f657933b8898c9d1ad4c015277fc9c GIT binary patch literal 58279 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�YHcG@^HSct}YbluCkrygM*6 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%0A?@6$Ut0Vgn}Qmv%~v_>QlwM>3ug5 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 J`EmF!|Jkx5sAc7N<^*EiALfXv`TLv(Rv4k zTIB^aBszjb5CpNWWBh(IB zL?Tfxm+$wx&1PFH7MIIK6h))aD3i%F8qIt@_jy7 z2oB^Z4kYq7Rtgr1g{4FI@dD2xNW3JMyO=p6#&7KO?MQF zqQHCGHZ$B@S(Z*`o@aXw!{DB}u2Z!v%lp1CMpE1ebWzOnd|lV<_uyeGROm}b%TNtn zJ5vXq5IDFbF!bD$b0G?P<|?-~q)o2tk|&UI<21A|ybN`sr&dOU`a#C|dfE5gCweiM zz5wu=>tJpOttU$qGDAjWEupAq3J=0pQ`B-uR2zSSO=BbFFsAq)GCoyR)%QK8p63ZErHRV3ZukL4nx91%p}e6M%<$w}B9dfiRq0b|oOu40TWnC2dSh3vfkH z#(mmr(In&<{dgG$x5ZPSSBx}uiOus+YTX*9;bYdr@H zky((Y^ZULf%3VxJpXaH|Sq7CEO0*+Za4#Tt@<*GDc{zdEZG)sIP_A|`3;2D$8Wewk z!Knmt77CrhDu*jBDZo~c#Dr8Q{#B4MOJ*J-K`xD-CYDUtNUTN5qs36DkF_{C3T3VR z)KirOktDCwW9t>@QaKlEktstcf8C`H@6;hLZJGXjI)|feQbQ^%+yki8uH=(;k@$N) z>eR-`-4h{|2{VYe2*uqxWmut026B_&S_Rh~w>4hP35kseL|1t75w zau|eRAc}5!6Hpf*vO?mV90;+1gY~Ju3zRs{#2Gu|e%|+`F0jy%<~z@2uImzt)ot4V zLI3`LIOQp?%d!Ac^6R=9uoEo`M9jD;I|>QSmDKM%&z88kxu+vOgu)qPKxUUGQ=uQn zao@K{kOG_?3q5YvrmMcD+O+DoG))s`#Vj8P!bnvm9;XY25gK_zrL5QZVir{TQ32WI z;@CuurAmacSDP5{ujPfWXR!l!sDs?glmm-ogQ}-gqb$O!;%(;>zV{{=duv;AR+4Jj zg~vfUOz{b@{*FV3CS3&})0PB)bNbYugsKn-A80lw)oNrseGP? zKQ!@c9o#ex)wAzAy^tw+)Q-;cwE7c(#Co}b7=)oHx=Bq4Q2@=;P&Scr#GS+xjBy2OIXLH_IOoKPP%q)RYwR&{>0MGDW9U!SJ`-s2?OZ<) zl)bm5O}Fz;2+BajQhb51B{Z0skoPh;jGjnwSQ$}PPka^**^+6UtYrm0ArnuZ^FG1M z1^DG2H=pzsxzq)HWkPNU@`YSL!Md?c#qD%RS~41fO+6&>DU09zQFA6~VRFW;*USnl z2X{pYA595(R_n7l7wFxM2{8fhej- zxui2H;EqHCTLuMC09|mV0BXt;Ur7!K!D7$av*XFzJHrSQr)k=@%?l#2uB(pXkaMHQ zV~l;@l?eyc!nTp)x-Nk1$2RW!CXdD?p(0w2NR0tVK#_3>CqTioIMm1&A+P6NvFrz# zlqM6JhfP#K&rRp?MRQHD>U}OG0hb!%rBI`$TRu#7D>Y2~!geE3=En8&`&kKF5(sb@ z{+>yeq$`(ZrS*=4T{Po7&jM!|eV##7SWT6;KOc=$PtrfTfZ0RE4|yM2@Opl7c?(ac z6qt&Za5_Z+^Ob;sx01p&*<+_V$fcVpy8G%J)DB+L95HB^uyjc4kxv$$39-)e)BM@ zUZ9Hj!ej6IDw_MgtGV+$#~6B+yWaCWb53IRx-N4H#&!^m#-K_p)>@7iESOXA97+r^ z#_bHORkgPg7aALK zIPFr7O^R|w?3GPmO0))}a$~jTlJriWvUg$)u9CICXQWj|OIW#&x**=1&&M8BMMRs3 z76<#lL4?}nktN*x_HcSYuQDCcO$8859Bqf%Yt7E*b&oC(LMkjMK;flO`~CW(k<_ED z3nL_b_aM%&j8}5VS(PYPZKW?EBRKgBz;nGDF$e=e7*6ce#n1#HGc>4(1}K0YsK-1i-NaE$%1-xz~hkw~Cf*A+h@l4V)$`xZUF zV%=@q(qo90KsB9N0z%-ASIvSL5Femx`Q#Xkv>h--2Ext0$P>rJZC%W7wlI+`(AA+= zk(p)j45@Y8ji{)wfb($Xro0_=I@RT+4i#=8!(O_o5^~CRe9u;Wke^Lhd-Un1R1?E>D?s;_3O?vp zOLnk6$~SRzXu@!({zHtw7-$yR7*^Y1f-khVGASI#k+uB`z=IteF$}^$6z$D7pQ(b% zsK6H&Ln)cO%fjR8rp>`MHIi{EQ40FqAejA6gABGS69>wRB&6$5ilE$}hMc%BEJ zu_QJd#*#CK?Kn|gT7s#V6Q{({A z@SuO{;;t1+sEbI9;lnP7J>nE^{A9KS&e&Kp_@-;YH;D5=&q_8JO3=@uMN3I)ewti1 zk`APXseJOsx-El^q=s&Ep(Vp3vc^i!Q4G)R6chJ-!$wE?D*z96a04+60#UT6l;IB2 zUaD{f$;CbGTYZT=tt=ZG7={V|&sVWV1B5wrwORM#}G%C0>H#8@W?jy4bL ziNd;AEjw&UOv$S)+Ux-?Z2(qRiiaBW_6=WKtldXZ&CG0`nQ(4~X-7uOR~w<(F9LJ0 zd1;`WAwn}k(U`JfU(oW}id*`gkYZt!adP>(F4CE*5lP6|dp9uq3BZFL+b|5nKoo6) zAVucz9ImyV8ZF`0^X0)Gk*dImXp=nhj(nZx8F2ss<#gXSMq6unS%M#`qyay&DBptO ziCSkxGxLx?7?Um|xqPuCHN(?SbevCtusEm)rl3>D;^@5z4nA;IUq!*{zy~mus$ll> zoEAJAI;GsL>bpd?5q71)O=oVtlR}-KMM-~7-Bqd=>T zVkjo;2i6#{m8l<+qBW?%mK`j&PoHzrNUf$hGR8QLi0KAP_}+ zu?IUfHf2+LUT#A6eQY*H6cmO5zYsKI?~P?kkStkiA@H0=j^mO91O({gH+~g&)`EDj z&3;Tm(94_;z$F!Qj1OW-D9#w)O;+2ZIQIRn1 z*_dmHm4TL}yzpb7?DpPsZWLCTDd&yIn7#Jk<9Xyc=iW0o;+GHjd z9!3ioo<*w(sxwSJ@&LJvY(*rGN9y>AY`*`e9qaJl_w6)$@7U$KuFPnQVpDBeYqfht zuz1v@$6MLZQm#1)Z;xA5Rm||jwTKXs4H!P$AY@jxBxMU~9x;WWcTy&pposa+{lwz8%3mw5(WrXQWKsN}@o8gWi;5&eOKdbpaz!`T zVX~@0r%&HzKS zD3|4|kR;@c{LH1jf8TdYg}VmEJ*E%G7@Z`K#XEIA;Vepeo@dS(Y5fG?$&PIphG8Iz zHXd6$sZ_0vJc2*`0H!dE#1ToEygO14MG^wFZrZ4YO0PP;5@_!odBuY%^hx|8ESOrq z5-YzG={c=SGE%n}2x91eI`*zA8`IA~XfUb3iYKqiE%n{jgCYgW-1~oUWeb*1-4|r{ zgc{gGl%xYH;Ra{~OFe@xK!r*7upznXz4m3hWa|yLAb}}>p(u9C)xk4_LV#+-bQqWv z*5Y>=Gdazus*~9;74jL6=@NjqzJVTaVlzC8d8;Ug(9Q$Q4)Q#^*{U!AJYA99vi#oL z{yXds-Fv^LTv+~`(|@bg@TFhZT2=2S0FQQX#83#sQ1FsMXn;28zocyPW^~Dc0QLu2 z7KV?rp8q5`_5cN^0Udj2jl3tmY=aF$dLjcVW0%rA0yDN-A;^eflHAzYyQy2O;Mx%A-L#3%SM@lnu#diXzqGILKsIH>6p5We)5aUCPVxq#P z-;&pWxB_4YvDhM-(X*!nD=H?^C+Dm0SNe+ZY}oH&^`9bxRI!vN0yun>F*DS|hkOVz zp>_xUy^qiijtkLLQTN0|t*OWl9b$1~Ed^dklWD{n1sgC$le!su&H)eP#BKb}o1yvQN#=kM(9*Q2<2XDmb`8{b^T)_n z{@6EquW>hsh92_@y*k6vj4#-g>K8Pl(%r20d{Kdk)Mg2ly$pIeg){_vRezQGqD>^} zELV-`8unylQ4jgGp8&qdVg}8A*N6*JqW(&fkj?Qqe+1NRhEs+VD}n$JuUtKN8?1R@Y6SnLdk zLIlDUrGv5Cwz!kW9+V;M?RzDV0($|tv7E0anpSaW~0F!ob zgFp-eQM3_CNCRm$rxePECt2ZySg}gHe?1;Mzr!ti@A5(Zt_$a!{$I)ontlwdZe0}? zs!?T>qa789DQHMJiSYt7)o5|im3W&ywj`N@h6>CPoSwQU7a-omgt*YOb9BlvQkp^f z1h6Pw~(3u|L~?<;B1_3`3ueUj=Mz93bwc033MM@|yB_`kmw&DdXO4A#pUS_I zB_zsuR&iLPw>DKsuE2eg-4ln14bFt3DT-FOILF72KUogJ&hv!Z+qPv@Ypskf_I}@Ya)xO!wO~xt zBhX6=v9ko&_x=06_kG)ITL&`|#B&90-Izihp|jB*gf=F&On2+U^ET>gCh*YGNqL*D z?*jNcGoe|FXj5ze#!_V>6prwHl7zZI74P`d8EeQ1v!{|j4OLB7j*!v>ElSsX(`2?7 zx=NyFQ-lS;M!-nDtdryG6?t+2h%Y}$lQ=um#HA!`6(nrFBbK+Ma3sBtHI31mo-n9^ zM0TdC{#i*kr0_p82&Fjv<2d?n_vd+@7P+n~%j;jcub%)s+Pe{hKnz9E#EsAjJwQ89 z1Jw~bb`iejj78uXb_{5>($mxDwXSPR$8iK%5vd?9lQgN=86Xt~}g=?V}6M21;qjbG{J8&?;w2O&OL3Q!m$P={K$APrtdG|J+Dc zf+`6CsFHNrNw?edVhYM(=vVN8*28Jk2QL-IYy>H&soq|qrWuC6P3<;})*56YE(Dt&p zMh45wYbx);hzEPXCd(>e0{{MKtn6iF;K-NdLvsgxqH0Ms11EQf0X^12oyWHf^P#Y| zy96g-E;!HopE>IeKUw=UL*!C6#c&-h6~Y-fw3WS^A`H7s{u4F))aT?^Y(7mBsT~n^ zM;t7Ok8F0VU<_U+oZ9m|kjH8QAr5V=1qSCFoPgJT-xzl8cuBNR03Pk+hG7^6qG($_ zxFQvz9$b`5P!p*jKY0Ls3cQF6K@Nw@FGSRq&+}x;sCrrNx-M;kj)+lZEIpEQPCDTb z=H#FP9WlAo`33Ky(D;4G4cf?{f-kw}m9;s{G;v9S3*(WvDY_ zIKNTpp^|d0L{=EsOUCfV*9Y=tz-f6%xQ;~wbP5#~zCyO9!nLxj21?xLf8`>*kOF(} zf-|@Q6IFjHQz~3*87STN-D^pC-}fs3&vtYJAPfRw_{C*9M91kc9jN>HCtt#wG1|rg z$8q3Scy;vAu6wT-jY8#QYpu*rx$eRgeTK=s!YV(Xgm9T50Gt6JlTXqOb1Jq4clUMI zB|F|$oV6VxU}loU?ntA?d8uuW%_-;^h!90C1*hl1KSc&h zVH`RAtpNFsj+QxxxZTW-lc+bPKhhf$qn9nIZ_)1 zY`*|Z+rbTlFbqV|%eDi`EnUz6Em906@ueqOdkqP3f<2ju%`XDK*4ldq0I9*ElLUR= zw_$0(tf_b2HjtAY3XjzCW@uwMll{UE9O1$U70ad;<04)avrHKx*|uiAV;-OlIG(#%l4ZR4_5K4*wOXc6~Fn;PG&^1}(-6)o@* z#c@_DNgcT`spWyFiJv<7QOrUl3~r0T?RB) zA41tqD z|JO@T(nDpf92^;C*vNCD1TT|oJ7>u5)z92Wxge z4BNQ`jGHNHkKtllmAaI!77dRnz}~wpk1_H@bI$v|pXZ5hUjcZwgDVI@AO@f%Y)e)| z1C-&_8z=5mU}c-#|6V*IB0iW&%!D7Tgs3x+BrUPCWSbv(P+molQ?uxUv~AXde3b#vuf=UQS;9wa>!c6!SXXtku&&@ zac7?_5{hL_IgFqRLG|~^sjbye76_q88zzc7;u3Z|2~A!HQw~a{TYxLHDWLH@&vjj) zJt0MFt#i&8W6pWs_uf04JA(xAz5+09=Qa=mK@dfqjfP}!@dy)_(D>4mO6v_0G^0MN zub(xh0wkDx97j4>Di_7vUFQtCKpsWz$6fPpRx*l-@_BX0&RHrf%)&S@dayM}jaAm1 zq*H=E!6S%Du09_1axB)@lRyngXvIW<_)+$Y_%c+)_jINTjF0-7h%$A)7UV`Z$!{|% zqzjn)Bg%|N<$BO~tH2_oRcY~2%XZDXE~W?!F#M02tOOvXRW5OD-p-rqCT_CXSC~P; z5BCH+;EC^;TkVnDlc0^lD1^|XoS@~5>B)WH5qX~Hx~?df{hjC8HQx6vY83=O0hqRf z8wg<-h@x#FD&Rt6T&Mwwq9|uS`y>kvh$Ry8CX=yad)}&CE{|)7+zQruc%CPyy#kv5 z;U!>3ZuE!zcPzJU+q$mzedq6{yPR~0> zGaXUR96-q*G1XDuPi+^Y%K#J*Zw|kD*U93_no1?~DP@+hB}I%&^okimoFD~5_Jd%Y z<+deAbrt!9Au<@d(dxiZmSo#`o~?D0tZI22N4(Xt29iM5ec$)%x|U^$hJFI@a0fXQ z!XOkymt=HbZq&p$?$n9f`1j`|j5U-Ngoix(ulSO<@B8ySDU|2}RmKZ|m+7``OXzi7 zt=%K@_Q!Dq(7x|mYZaXAq~+iDrD7iG|DNNhOaSMN66n{W9;BaNGO8`z?<4~O88W>? zf;qRbbjDMlq0`8xg--%eHCiIY`sRQV*jy*O{kvyjE-AoZZWpbq;O|U(O;1VX0W+mx zZr96Db86tX@Ga(KFmyS@4f^;LhgB>f*#*AaH0EY#&U_^xH7!vjf=)6^C#TG=xyuXF ztw#cZ-_d+@s_AJ9LKNl{bY>0xLeiaEC|MDTHCY7W$K|;DzR&Y436_-H$OH=5rj!`@WGx#>)34 zV%31Xk#JFHlx*pS=ckx3rpe8tOB5OP^;^J)sCPhJ?~&l21G=g5$9Cp{9)Qi=Byu3-y&A$sMXHqQrLmlYIX2D<`FDkM8@Pi^02! zZ;jIDdG7lzNv!Ky)y&V@!hheF!g&%FRMWeH?U39$B?p3H=72p8TgWMfnIKr0+I?4c z{iRO{FDZLTnWGs6nJx{dbVCbxL*Zn|AqtP4EN+syH|UflYJ!z?_4|^f5oSdKZX(zF z)fZ@czZ+4}90D|aFuTVghWKkyc`((W@Y9)wJJ@C+Ld~H}o|EB*oNhm7+%{6kp@>b%#^0LmC-5Z$f-1Ld%fjt>uIqZ=cUhJ^ z;W&=-Jd2#a06g5w4Z|Q1MbS-)NFT1itPx_(c?2Xi^}b1EGM9m|X^8%8Y13QVKpx}ZXBW*RMs-@1{TWcl2 zu~gFtWhAG!wm$)wxPw~>VHgO*m)8|#AkhFV&;SQ&p$iTawtBzxX|3fLp%9!Q9*=GQ zI;oar$pnE$c^%Fh4ouXV!pi%;F)u}{iGvA0ETk}@AU%?i zDfzVbUhy(&rI^?}%Upr8@ypjqrzP+xjx8TH-i!UZc%r)Xg^6YGDrW0nI)4DNf6|xx zNWUW?&kxsf6%(F0=QvBPcjJ#LYAoDY-`XKyW;`bW5P9qzSSEenS2qPL+n$28Bv*PR zcrkT446n)i;+Gtc2`Njj)oQ;+o`f50CL@u3fD%n$0J7fzJ2$3h znqzWX0nTtt`0J+P&+QN~MiyeoM`}u)_0TI3@Q6^HyUUuUkhoveZ(-)%TR{8^z{9=V zKnTM?7`|+AG>Fmz7mA><{iRQu+e({+U>rXtWB&@0nwgd~;rqT6=(;W~=Xwo<(X>sw zk{;8TLayvb+tP`k-M2JFra%TaMlJx0XOYl*rXjk|%Vt}-IcLrR9rkCN{`TMoGUK?aP1l5lgALq14+qH)}c8c3T< zh30T`AeF(<3lMQGuuGIfc3fLCv&5m{U$kI9BvpR_n7DTwh(Q>NqRp%@J4l-{Jqw^> z%Q@1Otm&eO$AGaNc>eqXvTQ?k<_|Q6H=|NMg*1^v!qhLM%(Im>%YoUv&a-CUJ;G{f zF^6Yw@Jz~PLyo!etS~ITJ|~r1ct%g9YT^?jxD6pizB@}3jhzmzMah=!v?HJOzcQ-0q!YpYgM5vvli zRM-xv$>({%lO$59Ex$pux&gC0`cG;XR?6AZA~~_DEkTKI63i_4ju|uKi69Kf+l~W3 ze$Kj74Z$>~RsS3RaUA=;%Y=!X+H**lgNlbBa>FZu#n(rCvF?pAnzf+tJkL2NbY8Kb zG7HLU>eyb9KTvzU9RU%(WuVZ8u4xyiK)*uIjzUG4aukT#$yCEZo=dHqj=*=_$Fhj+ zfmGSUWnFDEr1#a(FDDLh3io|WlEJJd*dbC$E8_Yi@n*icb>Zm}@w%?Q!?={ylV!5e z^VFsp+qUg501tO?!!Qg&VffPNJWEE3vW;{0CS9Sw`bqTENQsRx1|DEO>6M-dwZeuT z`=9iLw6#2oO;OgwxmJ5`GOLnb*BJL)#q?PEDe0F&P6OM*@Bb%d#;9}V`UDN^I?y}8 z>$#OS;bv8P&Z`hZ=<>R*SfEJ_CD&XHt0S4~+f%nRm)~XLRO0r2BAYVK3yDF2u6|rGMBh*4AbU`uDPp)(%YqBN4jIp2J`1ebr z`v%|l?fc%lGnyXM4gIMVgh226M)GweOVlUFZf=Qoi2O=1&TJNGa}G|NQydnfryn4l z+u{`F7`!Gu*1CQ3E&I(#0=kv1AIG6bHj!lsPV94*mc3pRqWHn|1xzbgD@?@6VcWLr zx}sLk^T@-~T_zzY$_-8Xp;kebhG+|3gILA`YXOo;Vy;?-B3Rsf1_@Enb*K;}p1CXH z=50J3<@X^a-`%F-GeJuLES`rLDbaB(P=4iZF=E zU$L1}rL0<-M=FAKgiOdF@mLHC^9i_kdexa2#gy;+nt-me)U{S-ng$?WK}8cmHAdme z(sBw1bI!>j5zIUBgWjC?LcW87Da1N%%3yw3k1`{Oa6>T=;j~iLJpq!NJ!9_F3#BAP z4AgkQT-N+`$clKnz6D zmZ*p;b#SI0#BoJu{OCzmu0XWltj9C9*T3T^+IFKy;h}1VNo9$_kO^gLrG4LfMushm z>(5lRXnP7MSOw85lpv(6fOr3o%p!c0^rza8`Q+Il`E+z}UrG>Dv8!4l3YB7b--0VTXA5mwQXAz^Sh695Fm)~`5QIPwy=*)lz0c8; zSqPJlu?R+B4o0&N9u#v~kd?LVPuXf)`}1WIZFW7r$*;9a@NmvS4vYcljWPHMXB&Dk zHEXIAri0W1=sh$=j&KcXQFk$6J_+Bv^e;ZQ6`YVk4i>L9R58+HV%hMq5CC!C}BFh1? z0>;=TOkZg6E0IGe^-elGD#n|BlbXa-^M%?#+owQO#5KTjjw8(5^zR6ObJ>y52Elgk z^?Xh}BaBeTTqHdt?V%6uf%D;c_#aaSjTnWj0Eoh6=bRYmc^-7jI)=c10hqdX8-`&R zilR;0OeDai=h1B5L>u`c2OyHlNDSGeo~S4O@(B&v;xM+cur|x*c_QhY-4Xs?I!h>2 zl>GgamU+4-j4yz|e>4AsFj-2HUcSE%rezixC%(9Dh+E8>9-p#`0|=mZnONr>g{k*_ z_vPNZrIY+?tptuO2Ds_T>4XTujuii1$7vjue$z%aIHfmo%1Y{Fxvnc35r{*l)1UAe zr_NYYAqzcyg&CxFO<^Z@hJL*omnAY+tLsX3e(3ClqGvF(& zkM~F(PNM0(>1-ZN#HeIgNbN^|!&6h=m|fU*n|B2!k%7kP{`SxoTbo<(>OnEKsKP4% zQ+IG{ArL}gc=MXE0GDp8Ks#`0EX*n_?)}M^kh@nzW zdV{;i+Q_lH(Gj?IKs#yQ_o9jMo>tQeIx<4)S{+xA1~gihrOU4C0wzmrnrEC!w6@*4 zu7YC1v);b|Jlx9-!yphv(M|fH7q>xGtZBxZ^pmR`X|k{sTL$I>^BA7z!|&>~4zNPI zo0@Wz)_mE*-mIHUm5pnw$(k28K6|ue#yLTI3foG{Ix|V>O1wb{ya#j`O4ob|iLBx) zwn<81El-t!wjn{fo)(}L?=C{s)ZY7f9;H+y7!l8hbOu>tZU`mAgA-F4ShB(arh1saX}~Vt5}U5No^$TKV3wldO%+EP0C96E9m*hl|G$*eYTfJa z`!<*&;94t$UAV9x54k7HPXM0oA^S0@KG57k#E^5qy3J75KV)RkoVh zv2wtNQ4?7F)h6*r6f$33avO-3p1$|t_A+FYd;JPEHHey?mQ6STt?9Qxau~x29lAY* zn@Fd3di;z~EKo9FI)y-zH7x=%JP5w<)FIN0YOFOwADR^VNf|iKg~*Ft*P>x7;uR*g zgn&h-f|`$vtJqbU!V)sb?7SQX06Pz!la`)#m0%$+2Rps1)>Teq9_+B6ENaTaMP?tO0jt9l>fA7_oD1{ zp2>RDo>`?B2sc1XF}x(e_s!+QTVhI4WHdS7SxqQR9%eM9wXd~`iDshRVk^qe2S=2#U;Q6V!XbH`KY}Bd;AH0#LVijs&B- z7sEsZZ2){M#aL>Zc%Hd9xYw~uh1Ih8-us*rD9)|LjzDpix%X!CUjU}=}$-Prq`G2 zV_PhJhB8+1z_q9ZWsh&Ac|hnCRa+J7>c0)s^Uve z8s(M*ZP@kN#-1IUA33(d=Xr{=vhVgReeCmn-{~ooNPJy5g$^K!%)C+{C&cz%9xFy^ zNdBom?4gd1(~S^8VOp4X@^BIHUI4^cDFnZQ!P5}9PVw?}U1hdVBH06kniQI93mHDN zp7#uK%*@ z&S}lf$)qKiDzjXJZdS2!Q!%Jp=irGZ^;^+LwGjob-;L+6_k}7_?@V>8R z^ku#cKaS%(&y*zn(Nwofd9VD|Cje7-a04+215xy{9i)*hftFHb+S;!?X|!AujAV=% zgU5W7SZGSJkB~~8`;gG|UH}!YN>D!SdRx|`Kv_a}B_yV$j`ZcI!?wjl)H?R+jVf<@ z6AY|_Ge&V#jD>p}V|Xu^CFgmbw07TjmmaPu#zn}H zu#5bE&Z#fVE}*M>UcJTIaQw<@Zd=xdSgN>Y&vMp48uNmJ%`UW#j`D9$b;*K3kzLCe z$lOa45@wDgSroiIgez5CWM_U*vLr_VlclxCe3G0p!$y`3;Xz5^UOG?t1xf8l-?u5z z+0VhOl=BmSr+d4B7=(c+`m-I;OuC>HYM~n1*()8%-w_EfV|zSIegqpu#F+eaS9&Ha zpfA8vWT4cpCj123%)M`X;v7)NTgNhBy@b(Sbx9o5Tl|3l(RH=sA)I5VoO`b#1gG{gzkey# zVIh5}oV`&uKVgHc-E%v@|Moc%Y z9!?=z?EAj#mV>{{SX^$UU&j64AZw&41*g+%L=;uVZZM`icZXj+E>sc8t3V20#^q8& zQGo+lK4pDaw{2UN1&APqw4Zi=q@KkbY)?Yc(PKz3Y4j9lDOJ!!I!F(Z zXlcLnq+GMvFg9Z_VC-Mo#{f~`{cWw)1Yh6my=9)rA{|W9ol8#4$c*MxAuh-07}>(U zUPiVDt)D9#yJ|C9Ox^_Z?%{ zt#$)5kk@t9e{m=sJ% z`U}9*z1=_z!ax))j1LN+Wg4KX+~`RDTV)kU$YA^&|5Wm3ZBPhqnD+)1L`mHaf9u6lIJRL% zBnA|1-_}|^L;Ejr<(L>w{T9WC=^f8GosS`j-XQMF7tnxhq~uoE3Z~6_?@cqHW_4Y! zPI8FzU3Gs#3r2Zmk@~4l&ZI(j!&($7P6cV9T0J4^Zf9pS0EtB%BC7xUi7C@YB^LV6=#~4VEmF#(17|G_mEEKAQ4nT&ouSu zb^7!}{ID z-n27o+t<)~1KRjl)e6u@^eO%x$t&kg&Q7`aCS+_hVbPh%+HF93^PJ-*kC)Ek-dlM% z!UUZt5)qO9PKP&JCEt>>N*+jb1iv){iU=U3eqU%WM!4qDfhH3~-zZCWW=L8YOGIt; zRF_m(P%*Liic~ulDF8;Ja!8c!>i}~rvOx85AU$BH!Y3?oeGH^0^lnF@^B~xlw5+v~ zgxE~qX_M5jUjUxY7zKh5hN8_L&I^oS<0(9Xt)~zRvA6MZ``|&EVHwuZBtJ2U8h@UX zK8BZcDY$ zlQs4+Q;f_!4v#!&ZYs;5(tOE#@0{~}A6jwm1p#9WU<5gPZ(ic9djl9aFf{AE*IF4B zpvS4_i9?W5nseryiRS1CF<6NU)G8{N#h>9Odf!?z&8T-QfjZFw*LlQQ+bsjJ83DT` znms0Otv2H?r+zw$k3<4O*FI|7c_fQgE+ayY7>c4@0Yy*^bx;R| zc+Y~4ax-T}%MifE`dGgw{|kk`?~6|RzQ+n{tzLQ@M|MD}W!tvYK=Pz6iXX>Bn3nLa z(-6^>G00BrFAYGZTAaeu!l0>((W}KC^zE2|BvNt|w+Y;l24y4>FTQV*X{qbFWYF5< zL^7L$9J{P4yp2wOaneBD8|!(V7S7Rd_kHKZBuKU!2T-?UIXH14tP6V)u^YlpAtW0y zL^3Bc?OV93#Im0m81liSQAADF7R}-bfa&QNJDn!zLJ?Hi>nW>;8ih*j+4p_34tusG zV%jt3VT1sP8(L@7R1POVsB-|QDg(MF#)!l^44mgFW6_n?v)MZ9`X>NW_jbcD48u@# zNdulJbNJVLWU=1h075@opsAwxK`SEp+2GrFBZK1_~At*yv#B91HOPzX)rz6|gJGK-t>p!J z_~Lx{#j6rGhQWAYT3bu{AbmD(tq}3E5Kd4XIBfRb^l{;Lk(Ra(bUT=77OEt_ zWCv|9dqAa<2De@R{$FihYI|nmIVXt9K|vJ+S6>E zrUhvNc5*{Z5Y6ykMBb)V2AmSVryNri1Kzl~~(x;ZpuHnm1%3TlQ( z7cc)5$A+4yO_=q{c=p`}Y2>w5X3)L2b#*->sblJGpspp|PXM0o+=yWih{AB<%E(m% zEzkq4(19{l=YQs#A(v(L&>n9OekLCx^?9Ds?9P-2iGE?7B6*Td)75R_qmRQ@6M0{> zWdPjF(Q$i2cG(zMHXNRd-+5#n>P8hDvzH$GTv*gy>}sIER*@a?<**VG#WI8pV;U8&6sN3vC0avf9ZdKrZI%2T~O zZ=);5z2ZFA!{xk*X127%bV{^_i#yO{${rkT7 z{1{+L>I*6Baf<^@NG(0mx)*d(#v3FK_H3L zWof}B#7=)x)vj4jl_YZXnBsAT3W1rzpRIbE^wKDJVYSSODhFfkArbDfut+EPBrwek>@xB`5T0!j`G0y zfP`)Cti@XC!JcBVvh~uT3ey-qGd5`@DL2oB1dw7(0DMvH1QhHBNU92N$Zl7=;qPwn zOIQ92z|@`HFbqOL6iq*rjKnVuPz&|sN+&|`mt`gF9=~N^e&Wovp1oY%E#baspvZd+ zkn2(t)AVFll5Zft*;k+rIQN~lDK%K(-73EK8cOsJksHB}x6K3mVy%c#eg3ZJNVjx^ zp&eC2^@`|74Xeg6Mo%!M@D6Y$5ky60Y7AqAv-XJIOl+!(J-7ETb84-1&dFf!t?QR| z>szevAX*`SAduHB{j6lE5@Bw39(^Se*#I6Fiu-J5Guo$gWP=lM*0lzl7lz706`c8q z{8N*#s2`4^6){>Mv49-6Nv5wdpN0T9sOn}}I>F#zW_Ppq?vEiz*wL8JIV&wwy`qFL zzXI@d2R9glAQ*-(|5RQ&LkDmKuMX5n|2KIOE=|*>3Tg%61Afeps>jq#?143kEoqFR z(&@CTVwLgJ;PQw?rI6W(PIU#;1b(7Pv`MPLLVs6s4yZ%+DQDxUTL%WoEj37{L91RR<%^@ncd*mu>~?w*4tWGB*}TDU)Ahy2t-bcxZ> zEX~U$S zvyHC1?JiirlwTY{YNWU-r?&%|fhr7IZ~}FCbYOPJPHO5AF1+^@-hbB*G<=+!S?ZD- z(SLj><@(FTRQ~L~tj}QR>RvW=-~3)rWbts6VR9S*QXs+eIDR~4M}CIwB4q!8vj7X% zIO)tUZKL#~7|CeY%4z3$>;d}k-YU;L!~i%IrSQ(~T?pTWJ!+{z6ThqRN0Y-Q@a4A{ z`t;eOYpMlEob|r?_@1Db-}~5D;K@C(*g3${Y`cPeDS>nWzA>!AzN%!p;-QM0VKX#E zNFYR4z8)PepTJ^X(-e$MilD%r1W4tLrkPrnfT^=wVR)|MU7_Iov^L*b^6P@Q$|6=R zj2rVXbo)4Pu6+DAr|rOq;ld1pHo)~THjAt%>c!*Ccy~tUiEYssWPyjhYkAYkNKAQj zER-nLv+Hd${kc5BTkig?tFh{2;-hzYZIwr=*}l78shYp*b^eTdtUr7~lR>J@fK_ZI zY*X6CNFG`c_drmGu|=PY{E$e!Rw-1ib&s#a1wUXbuvy=EQ4HdG&|~LeS@6TE%heON!l=#WggB86lvX52sr=Wib0<3^j z=dwl!40(cTZ{T;^JquOhZJs|Bub_2Zi87L+9av)-YQeAvKZ2Vmshv0W7bmbnpe=|Ls({sRJy=jL;>o)i^J7E!4V`0k z+8!pOj8t&X%H&)=NX~lMjS&$r$a1_IU&FV%PFeN{$P2Q}d%Jq8Pe}%!&rwG~#8C7| zhl9ROhoqPcN29kXnM*C1Q#%ka2)x7?!U$J%Pd%eqiLim3;!~IKYLZxfFNds{lMW;&0q=;+8l~X*B_vO1o%<74jm^X$5pcOudv=^+qr#rjlVAG@7%A&Q8z&^9 zZKwm(tIKgAz~C~rFsLOnu5_-!sQ&TDZFd~8l{g} z<|;Dv4Q*Wdo~OHVgSrL&LgPu^@3aH>(G+%8hD%GYFH%2Gs%<~-vt1qpp&(x+W?+)Z znBO4Elswn>OYz8Zk7UnGC*sF+JL=IAa+PpAH%fl8y6uR-+0R^t352be?v?2MIaVUW zrb(>N$34APj?%j!KAMB1nHT?$p6yjn>fs~ZDztdlrIw3G++Y$bb+rIE7caS5(sCu#} zf(g@fK&L-h+`u+#KckXCQ3lqc|?U-BSQyzg(4k1_o z0bX5szI{aLJ`6E{8UF3$KUhifa$?yi=If#8gxW~p2qR9QQGR$9$-Lzu1?uG z!5Z=Hj{Tb{3qAW=^w<>F(lsg5s;I{s#^(*zvFSmbqV_pf1wjAy{H)#$nx^rv8~7op zY>e0MrljWhw5h5?D=#28b@#6tF)eHd1Vi|h^UmR zQA5>Qy7O;yh{^vPInbzm5$Y}}e4Ht0FR6S-n(91{3iC~jbc=rF{{P3@-;4Q?3 zDxlR%P0@`*Zfim0NlpGZo%%Ecj6-pLgM#|>aNIYZ?9p5&<{>;8@{d6qDO!?w<+90i z-1Yr3JpHT)I*+0?6{q?Q9_9~51y1W)Z9ia=?HB#3?vULi$7{^N` zz|B1nbxY?}_*JX|>~@Wk|T<_l&>+Nm0c_Pf45h1uc5LeL7EOeEQO9c z?zT=Lc;E&S1==Cf(hu-oF}(rN|1?cD#uuO8_Y%uLVah-eO|Nvw@QOS9$+5vw3RZ2c zUp@dCdKbI5Sm6f2aC_XzumfXt0{L`8kZ}Vc1)iLQ$J3&vXhFtT>Cbm_OJxC^F1c#6 zOLq?j?Qx=%vp|$?N`YKzBS)?`8S)f!$#*^5hgOZ+CgYTFIXv^r_enT}k1r{nYi9k~ zmOJ=`;O)sUL|?qy*@s6|0>syJ6^`uFc84r_r$Tix-NUFEY*#|*GV9%!?@Ms)`BtT_ zm<8XLW8s|5&(*qx6SteRiP6C`bcoi-Uo3PXc%uTBq~Mes8@B9DE)0+(uk2>^Uh9a~ zf22fVg|%`!Me|5o`OrxB06!MA)}iiG-a0i5w9+~=JS?KM@JER>O( z>J7o~zQ-)HvP9*lJyURgok`aeTR)VarcM(}?DY5eZ4U$jTxUi4txc(>+#T&jtg#&S zsMnN!U1PGJ6s$7IDD;|%1$og8n4O=$m|otBXd|EV?aTH4;OFRUhN zZ8HREHdW_f=oMIya(}aPs`+Y16iJ39#jTi^Ik?Kg8$lvs)K+0ZH2gr(;;ezSRPe&h zV~mR1hZ7{Xa_1;i?uNLU{oG%&65X$#gYX^w1Cja5$d)BN|G z)mCC-l|qnvZ+H_ES(RC;=lthi!_FM{=t-y=<2ME{WiL;V4lb_RL}Oco%AZe%ll(g_ z*)NVgbXZWBC7tH)=OZ~7{P$BU<=}%*?O3V%b*@5eUi;WmcZ}eSpxI!r$KSz8xYpgF z{Ot4xzUJ$CnJy51{dpBe2h$ru{m(GyiMY*yu}8oare;025xNv zD8n^WG{Iq$s;jK}W>Jda`CDm&DQeV)#~ZFNSQ$+<)(#W1^LQ}SQdH5v4j~V`%(tTu zHeB(uoIuh(slWBETu&b*&rFZqUO=KMc}sL^zPzv2ZhTFr^#4!Tn#N4}E{1%bj7;E@ zUkC!G)(TJqsQ(TH?2&Y(JPGt8Q$=`==Mqc7wW=>wo9J!w!B&%RyMKG&an90M_BfQI zpEa9&BNpZg=_v~(Umh=Vr z&rikMgzrXnl8LkeBWu3e&PO3c7g|Nstf$qjnWM>|g)sxx24&iTxW>UpmbvQQaVexC zSD)S!6hxbn+Ak>Xh6#bbIwI|dNI7VcEJUvnFoPt3Aq02^)+vlHg~3_9n+qU@A`0464QR6NwHINYUg(;Vhe7w2qRQ&4b+W$IYE*kg_!(gIx&V` zAhY$M7A-V~(u3)Id6dzhp>ziPd3fWQ`LFgW0Np6^wA%giED=~bL=Y;WG}AU*E}@jW zaW+8ge~>Gaf*w`#ycCTk+8{wq78qHpm;CzYp13*klik!bPz^yZ4UT@I;kR#v6^K^l zjkC}N{gza!wHCFe+@C9O za!X*83<2?$_e&yi29qR_(NA&cV4d*_t(b!7^!4vbV7njl?2l@TAez(Sz|s$@_owP%vZ&Hr|(iB=AGj@w-kE3 ze=I)s6s_cHpj!%A=7|RI{o;G1Cp2qvku9ZTpWmx!2NE1cGi+1_F8@h<;ajJAKjd8i zS893jU)B3+!COajomqD*8u9u>fivILx~``dE2|=pZ*&;WCD`!Joqfn(74_2MlC87{ z2&VE=SFc~y5ejhr@SJR}fQ&vLi6{;->`EiI3SkFZb?Hd{Oe!f*sZBLXGYR1rjZVu5 zjZ?U{>CM3t)=JrjL1MZVFnx%8E~naGQ=K%H|H}FT^<_7)v{0bFjN8)OR)+4`1drbg zJg%Um`>>NEoR*yNqha!IAHj}Br8pXFNsQsDg~t0`iH6yfyErrc3LaL1T}NJ49gihIh_aN*LQ==qr5!-u>ppe@Ve^&>7S%~vnd zp2kOl%8}lMyr%;x8;|j=pt3;qfF+~gHf!W76?$nPg?24L)*B}j1G4Vce3gX>Ws8C| zkMHrF1XYovhk~lNS>JyX8RShzJ9JpXm0Ou*G!S50QDnkA7Y%Lp7#!urh5P_TwF za5V>C+=&=hfOz2m(6_|H_lkz8R!w{BgBk~B5gr*DCS&C)uPE52yY(bnS0nEwn&BAa3oOO8Xp+boAz4*GwpNl$YzV`(30h}e`pr00 zYDdvTK^^0f^7H68_*-of%rG-#Qt$-8%gI6Pz*%J&$ba8MQ1)91Z{;R}jbo9k?d5(j zzD1gEh7aCI^(@?hNp?=PaR{PvNh!|Eys#Mcb?*xME}L@A#JPVxd}7CDu?@kI$Wx4r z!#Nhg+PmQ}1zYK~H7pj712f39y{af5sX^QRtp3W_>Y_LLmPK08N6 z*Ebe8cO6&FhLA*q=g8n`8O=Lgttb*JSLO@zAP7-E-(URFj?`a>d7qm7Z@7k0CPpGW zNVc;oAdxjn$kgvRVU!ZRwI2pNtc{JZ?p-}pQ6)|34@`wa<=9{ZVG)So&fICG+-zZ* zTnH+;tG?_2`i985L#Gw{tG)5YC2xBe#>rPub`8j$JqX^pE1nRQMFE0LT!_TL-x}=A zIa~)WI{WqbXwAA9%rxrcMvyVw_}QAXW8K7rzGN27WB8BZRr3%0bIYX5bOx&eGz=_? z1J=}LFu!j|+D1B@hjMB(bh<#oj&eJ%Q16)^ISMqukR9pvswtwH z{_mqVbX!F03Ekf4%MnV2fdHvoTE%)qc5_xDS_ygVWIdT$Ui~4lCXaqdl7DzhX8gt# zIna}8V@#q=QGeSPxRd3R`2FWhl+w97(*!T$a)mS+;0X~xpshN#FL>FyoH3;tpGzX^ zs-yIcjt4)6Jxm1o5DORfkHOIsR?(mK7sM)|!&eRcWadd9Gm~8Q!%rq#O&^Zi4t&{r ziNDxb@sT1?o?56evW3z?u@nLYwaun4GD)eYL%NgJINOJ+vT~A(e^Q#7Y=1^TXT9;c8?A`~G2WHDVtHLT>TnZk{e_ zj7;-V7oMF8W%=K!w17~1m#*(IV4141n!u?X51jnjU~?9e@^4#%xcPT2oUXcwuf1UKP}6x@K&_H1^E+K1AC zo9`W-E=knh>ny9}nU_vQ(pIhB9D$Y@pw6N2Cew@3>=_7kd(Te_$Qm;QTxhtkya-eB zrnpIxt!RS^C@!oiDu~tkLnAhUc82zHSo={z(=Ho^9)Ww9o^co7()>usY7kYYZ)HF{ zH+3>>NZ<^dt~NCT?#e6=)S`^(5z-=YPWw2Nrw7zE61z0?tC(R{hWfvUv6tB-)3Wi{ zZ7co~Su#?cw&ZUrh;iz8D0|5j*&I!}4YH2TL>-BvQ{@(kb1rs8G_F3et_k~OQPZU1sV z-;P-=-Hn$>Awy~%(lyn@_P?H6y>cj|=GGS%WKp)~-nWf6OSb!&P+QKN!lTX_{F+)2 zQ=r-*a~$8;Gi74PF>k3ISnq+cSBvjl@Ga82rp`K^DheGn*)TZY=u0Z}T-Rk7-&3C< z-M>u~WHYwT3>ycdR*y|w#Ogll)0YvqjEciSVsA}^7HkLlC?jivHyO$YY9zEmsEl9m z;!`lxH^If)K%Dc9tf7FV2dCx~z%dKYeM^p)JWg1jH0^$|lLvt-8&JWliP<;{{l2E2u04x%xDb|*Fr|L)3uK85?rQ;B;?A4~=GXwD{H^}@{Q@$5 zWI10$%}Ug~`<PW z`<=Dq9uWHB3jeVb6M3 z=4YL$V*Mc+z6IzjVX~RoqEPbiYKlP%G;f z$W#hjN{K64{B(lUwl#YF2)5F=pVmS+FYWT0CPrF8f2|X-{1HjVkEd!)byHjXt(p8M z{G(hasV$kw-}Vmb!e@Mpu3h}1#2VK&QaEc{Td=CaP z<-rV}a3etirC}W9iRw9fTE&8f!?t+*>nYysNHpyG*1LHtQ_)UcXZ&RGQrH*PJ3>z~ zi1%3Zz6Fu&h)iq5X5pejB+Nu=spd+TLxr115K6UD@J(!1pD9ANWW zc1qfGgUS1IwTnFgv#|6cTLAII?NfBNDf@^M1ag0aR%fUo|6clvcq8j*3P}}R&~#3s zO&-cc9dq6Awg0;9`;kZII_cmwD74^%F1?W&h|0%*$3#1HQ6API#u|GSvcDEJK}E5o zQ_<8xt;|L`lRFblOJ=^PEQPGaFgMy8NCw55=eFZ31kE~6QyR_b&>}>j<^Oy`n(gA1 zA*hMtf0%`!{VQ|)R(axk&Pg_TX>{)c-+YLRNL57)fYgP47(tLS@5I3Fx?AY`weQl> zqFYM5I3Se;Ss+e{r@aqFyg28C&40Rgtz`z_ z+S1NCP{D7BNRXU0-(=ruIJ_N3_p%%0;wkeT2j#XD(DIL?Bz7sKrZW&l#qnFK^>LrP z?1?ALByqR+d5<+aQG(&sh8P(ArDvQzlOpYcbSwp?NttbH$8V(`1{UjijhEHI|DG75{ zC46n+h0|^Y^dCAZlVYyhVL7p-ixz795SC~Ak}(Ca+xAn{L*hVjWhhzHKU2LqOPocH z$=_d7Qp{~ACstT&zhxeJg(?aUcQxRicPq!e`QnugBpz)kEIZ2Rr_&X(WapZ9~;H?ciigZ zmod8~!HmayPhA8#G~dKcH)Y%GPl}yNox5xf`c9Dw$sQxG4PU$D{A9VTcaI#5FrQd9 zBmQcl^}N=A?na+vyP9O7WOS#J6v`Yv{0iYjYZc{z91Tjgb@IML{CRGMYquGjRIvO9 z#*Da@xHZ4H(s(w&32ma`V1(Kk#E?iRJiP%#PpFv~R)jj1xU^JBX zD)V@pN7xHFdkxi$4dP)lmU_IUP2~53us&{pjt3rrTAM-t-p~1$l>y_zM@=YIR>gM@ z*!J(6tVCZ6N*CCsy$x7x+7o13K*$;SI}E;mdOy*j3Tm(lrh}ygHFNYp_pGAQKwar8 zJpwuTx9>PmKWAVfb5LdAjRnW>c~2j6khl~EmI^uZT8v{U3XL*Nvf|m*pX(;$$RqWM z#o_qw95B-l*^^e7h$7Ugjpdm_Ndx$B(4!7o&mL za^dUbG*nnxE~^eewUjK)x(zoSm?o~jWM8CFnD(iQXΝnuR#eqL31#JI zg!nGJ%oFj2M4@e)wcAXhl5r4Xz2zeOn+n%CwPeU!6DI)lbrcaGh=M}i?C$zp75Yq( zj^lp>e;bhzxxtd(T+H23Q2^6b$K;4g6Kdc*RrsW=1&__)p!l%cz(11kGL)8qHY=M4 z8x*QLcD*G2QUDKD*rSghme-IX!m#g&>d12|mK;3o55vV!mF-?Ik;?B7yD@Uk8%wYZ z7OD0(V3_cT3+GsqBWh`+q04!)Qp{I!?ietYrv@+hNw@nz%?wW z%B2&zeZFXWbOIR~#LITfPuy8SPD{SA#7l-K3zv{w?Wq#AkdI$YLc9d7F$*a>mZrgik>J2&vr>kpj_p8QTNy;0!n zM3z8;0}!pqa8TWT*wMeT7hchGQxY_WX1uSu>7sY26f$WvD@HrGp|L{E-R-k%1FO66 z!xOutq9`Q^jrG=A!1s@<*5HC&w?cTk;R+c3mG%^3+bJ;vTMB#tU%LueYRDlI&^-4+L|16k{L}P`jO5o6(I?qQj2db?;cbFy-i(}j+1O1t z{D3{zj+QnxQ)3cnh+B03%G2N_6-Z6lhc89{oukY4$#u&nEfExwTD&%6Xm6#i`Eyb3 zy7*fR�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 literal 0 HcmV?d00001 diff --git a/example/gramps/E_W_Dahlgren.jpg b/example/gramps/E_W_Dahlgren.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31f6879c3ff70bfc4d453425d2d42dd4060f6d6d GIT binary patch literal 110203 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%0AItKlE0s286 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�zl=Qb7TO1?~nvtv&P_cGUZ4!rGI3 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�jCXsyS5e~BySRNQ0kc|t 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�Nykp3zyAPUpp2A- zXORdT2S)qe#-+1??q>-SpPPb;Gr7A80APiSJc8WD#ABGiUAP@{{xx1$9_?k7BNod#GL;CAxH})nI8&xXwAKB_=hRHI-O! zHV&$Kf%=-WAVhPt6B?)<)f5tWsODFSFO==|Vd+l5XPA|v{mZ+55&HKZrBS&KT~sOg z$N(Oo`cFWOgy2?IT&jtSWJ*rsZg5~_;=W_hs zTlUR8V-iU!kCme%VIQpplLtk&56kUc%PjgO!Q$~J%FPZ>k zOZ(<6`^6)GI}t;vhTP!eBR@Av3Ng;&a6uijO6H_UBax%v zE(SC_!EKn7tcvs1f(3XHDPg-7Z+AEi;1qeuC+?P5c3^`Hw-EH>)OS9npF zpYa)?NeobYzGxuSP{hQ;j=y!Va5>M~)_Vgaq=RtCy`J0({2OgO3`R17{o?@#!f>|93<8Dqx0m?M_ zC5t zrcpV{G6B0CYP2&;{{Sr8_`i-%yH})&*eVj;IBzd?BGR!7+)XJMAeUV3QIZDJ)}3$} zLq@UYHC^SlV>qUwt7SyMmOF4dfH~%@#9G-Sg^I`mbB?=DS}qM-$PTi`(X(P^$zN)c z-a^GUt2C^evYmcfo9ydy!NR%>{G;jqO)QZZvI!va$XlmM2x`PTc1;*?g+R$c@6SCy ztu4Zbx!$ECQP=UP*5RgnJFq12wBT?vQ-WSaGH1zdSTke_V@l+as`)}76`clHkMDN< zGf|6aODaUT8QkaaG^)N#+mOd0ZW&jg6=Y5VG-fgoa^8p9f%24+-Z>n;@S({#J^os) z5OgI|?vSJA@5gV-oFn<(L-H_PrFQ4#&0HzvZD!^$Ll*M-4&T;-UW8LY_JO&OqLtiO z4fb>$sE2DvsNmjlpr#<`rGHs;W$(K;gIbI2h0AK!_v@6p9xT zqAv5lu{?iD+wk~fD;9NV$PCB2jQ02Dv2JnpMUo{C7$tBkLr8T=WJ0*|@JafPpQRGm zxSD#bjM?&3F2LwY_Z(IQ$c`+$vK1`ZQhE}<{<`b6c;TB)hB>}z814(d9$rRA=hyMB zKwDx@pUlGl01_O7^{GzbBvQOGTbz&@M9Ksm3W3&$PmrvG?mCn5^{8&yWw|7gys2Hs z?*0`sLctJ*S5v{r&N1ITs)#KuuaO$g7?@8PJ&jkp1-C{YXeXB0oQzb_-AO!47;VfL z;j^5IXl2_j_Fdh--t9mSPu#|>zwa>pD#Mv~?r-(7H{bIA0Q4HK4AFesQT|-+{pYPR zY)pT5y&acz05rf*s*{F);P>rLh7T=R{oF54dVI3HTPB`8v9Tma^gSq)EY0SK!YPnr zGyv6!jN4goGEkHB%{io!6fUV5+`&U1ahh{X(;e8!XTxpjx4kk5cAu5fG&@h<&w2pT z(JzIy!Hn(w>fqz22S3ufTbEE`K`9aK+|K<-?~3DtOw*$(h8tUE-ln@-cX=a@Swlv} znaqwd#{d8gXC!M8U_mr45qHKg3;zHw(xMUkn^s4WhX^G81w3(9C59BJSjyDb_0RZydvLha!)A6R> zM&D?a(3Zd~Tz?M~!*0?BkzLp;WDoCg)}6;;jNVN1c@dzE-AbzrjPxLVGy2uoBT;J` zF63|kBWYCxDCZ-mTA{XCC5TBQtav1)Xj|Ji+TQ015s)ZzjE{b33koe~EV+Dc&Ibny z0AtAOouabtS@ZUR7>pO(12zUf%T>t|cV<@wn11OTsUV)c{{SA8tq~HkxQ*h-D7OZF9)|E zcJEe~&4@fiu!=yWKd8@o0G2qVas(?Ixl%Fz0L6bwuW`Bwyt&8=7}{2Tqx|t!nnV&L zVT5rF%2+lsM>PbiJ$ls4c7SRChpMZl?d9kf@{+r(YhC3zSGW3^@76_NFbAl{ax=~<6N#XVasYA%&~wkVXlB_|M5TA4?AZSRDC>|<=~CLDxni-F z^B5AP&H(`PgHqeVjGQgFH%W^kv>JPO8B17h`diI z>~r|i0y%cHYXir$oC5jhpZ@?=SA#LKlgz3HG6qM?J07_MAB`!U(jD>2eA!OWR|JfE zel<}qnS8iBvR`-1`-87h*B^~L65WkEtIs+?BZYS0GXMwi9-w;=KMJjQ$ZiQhyLlrA z7$U06I~9@>FlfUJg%|_o?Ny|hN4t2$fQ29&;1kxVCN5#^Aq0gX%uBiBW1ZB}=_U%t zmkXW;8UFw#pjP=90g`!aee46z<}psUouWXBfP=#`9C6mKl!nIn%4XWhxryKb(xgbv z^EwYQHNbXL!1T{J{VJJ>L*_Ol?racqR$!BTui4{wja!%bfCP{Jy-_3Ol}w5_+yN&h zpjeQqxgkM6dp$mt1cBk+&$yBO?!45J2%6mn!cH&>o(I-|7VC00?jtAo$1Hu#O%Puw zXLG&}IO86*65BiFQ|FgBC#vJ?PKrSgnm;cj{DYrP^Z_Cl5P{5rnBakmvlMb$n3Uo` zP=<`0l4=-^1LPS=>Hz8Vr@=nNMR;Ur%V9wWEB@AKES07SYUs=nmASy{p0q&=pkhF2 z3k+xG0+2=vlnShhc`V$wy-#HrxPLPMgiwS#ZOQfiRgeKX~H8INVDoJoUWaBMP6JyC;#iaf&F}K=) z3z@{SzSi>Cu6BWpW7483vM@(x4mkjvDL-18HDcR>u0s_J-8y%x5!skv-^0cf;JC** z^`Mz-Rcmn@9FW_N)lk{(&T0%KWR9RI1##2qQb{K6ELzy%5X>fp4ES>yx_tHv>d^!aKv+6t6Xp2Z==t038908iA4Z|CO9v&u9vpd1!w5=LA-G6o-A_2w@ zRO9?bCQ(*fXo8%8%a4>6=O>`0dqEM1N}&eO6b8XLH9V~pR*x!-mLZtq?tp3b@!S3H zIgw0zw=l^k`U;RKeUL{J$+4A&NZ-iDI@BxWT*2kc?G_NSH+DXibht1@y?njO2EyGB zss32^rsCX0UO|Y!Dw*o1-l-8S%uDNhW6MpT;hjeypXpi_5&gCmXH*dkuKeRT>&T|U z#lB_6!ImWV$2GGetX8lfb!ZRH5DWlu&QIe-#~p}eu(!Fkh0%PpC;eKvV}brfRQo*E zt++F7+E};ugZ6SI4p7x<6XyztRKR@6VkNlY`m#%P+qmdjz~Q-^cClV zY1JM=epwIQ1MZ%K`BIO(gw>g8;qoGuTZS>AB}NxKkULbGEy_7;ki@V9<>Zc;&p}Ei zx{F2y;bRj>PrDv7ie;>e1iox+RYp$M`crzKPRC2CT9XuU#Td?UBC!m^j0}EN&D=!6 z&+dz?QRJTFA6n`3+sQn$BSO~_GVlmF7#x2(%GK>-g<0hp+DdJV@W75Rd*IYWx3S91 z1aIa#0{k+??a%>I`Mz-mMcToLWnW|7o|q$RNw}Z`aUD;!SXOyg0IG}=yB_@yy;+#` zjwu;-Mnr@hg&hZDRPDD3xkf6Z<^<)l-#(Rccy^u22~2#%@N-FT7@MfT0OThm{{WH2 z03iBw=|YsisC!K=FXVo9Eq*Hv0W2 z0n*B$m5^m5$KN^Q82(0}GAzpRxZAjKj@YThD~QV+DxA6Y&H+B3)}oo_Y`)#kC(Oqf z1JfVYfFx5AZov%TV}Z$~^LLlrfm|G&gQ)FQU@}dRBl4RPH83Uz>s7 z-he7j%QCJr97C4D!OeA^8r5-bZ9!1PWw-icwQ}s6Tz$@1KD$iO6yoxKKW zAX9T|J4YY^+-GU;kL61$OvwVs&n$6_?{SQ0ll35h_*Pdpu@c%9W_gP$vD{8ZSYw`` z^XbhtYh9jNsCAxB4;GOTu9CtlG{Z%a1?`;T<;xd9U^AK~m_CJn)N_Q&6 zcXrXi<~#8N0?WohITa%`QrpEei0)n6$UI3oc^2N~;D5(Z^HNo+8~XQ>{>n)5)jq-9w; z26Fr}cO#09JA@Fwna>Te!NI^izaA;rHYWQ7W)&{qDQ7CH#(5ocP!(645?WZ$2EZ7~ z^x67@pK7CXblyaJ7~xMCKQ~O8sBa81#@<%_-^1UfI|;KwX@p-XN60^QdM4roWnh;Vl9ABS3* zC6A4BCFv^^a8R1%iJfBLY86_V=LCF%=ZlQ5T00Wc9X^c>MFy@ z6mC(sHVUZc{hF^d>~=02e5Z_{;}iiE$ata8ndUHKj1IhXsZavLV}ABBO0Mp_QF9TR zX<%1bq%XN-PC(+Ok|c&fB1np?z@B&nb)W{p8{EPbepxwg4mrmo=}|ahe(ST0FGoN8r_7#h2z(k>#FH^AaTL%OA)6lM6wyt`p-GV)7 zt_XynAsv2gte_lvQkh5hW!%H=o}IeZWi1I28aY{%90l0f8Q431eEwA1gn1G0e67EA zRGglkl<8F4yR11G!hzHRdj9|_WReNXfg5?Bbg<}s{{WpUkC>VzGDOQE8xJLzoP+2y zP~FC>By5BfZWNBDrdXIqgD&K9I1S&P)WD*6TgWbq2I2~V_+V2GV3l@+Shp2^ex{u? z(j*u{Nm28wbQH$CAtMTFin8#kj9!vrpO6~`yo zdefkaM*-Emwky-ArM0z)qL9kVBW>P?kN9u-H!Q94m||HFHY4Q#5MKT~rliBbOPtNlvqjFy4TY@k0hXCHNe_B{{Z#sshMFrl!xEcDBXa6164$= z63m;NoScAtYPpZhbp^=Uppbd0QMmby>q%DD+su8$x)mG70R3vBY!P{b<#KVJz>n$8 zL1(Cxkf6&hHvHgVaw|^$%`G5j1hghXLN9)q{*<1Y4R<~7#?aaPNccUXYgR=~=8%FL zsFZxz7zZQLzIKoUD>EW)&O(rQ_2RX(ZyDZre@WD=ts7{*LAVpZ!wxa{)d=1zmWv{-49FgpX}ePL@gsX`a86#D2#6)08UBgoa6AXpGL-b(PaUF z;dX(+?Z;a8E6<6sTzoEz!`>Ft&>0A0!m^IO)t%zYgh`@-l#v<4j5x_7Kh~2(c0jT)EI}o9E^>PEYc}G4 zGUb_@sV4)WKGc@wH=#;22{<7#F~$yd@zWJ*-axV7MUYde{uAx%OmK!~Sf6P?4p{JW z)|{5$i-t0U3P1~-XV(=(ibRaUGB<`K<3Bcg5IpHsu*y^*nW?#Bog;MH2?<%+0{| z6(rIntj?_nk(7~;$7=eY#)%?njD+!)z!>NY4rl_p#$<9>ftAW}!NpC)XdRefoCIFJ z`K4(Jl~SpWfMcFIii&AGm2Jv)XOsc?aZTMh0*QsEq0h4UB+{U~qc+)N{FM zRKDWG0HL~lDI^G75DO>=Y7Uvj16!T$fX^<5u8|Z7Hiu^f9xF!fC1s8$VIz&jls6pX zt#dvOyl*B*!E6qEwdy^1uCL05Nq|O`6cA2Z9ldJ?taK-GI5sW8jmh${h{$i05IuS6 z#WLX?3l!R0nKB!3Byd|88SB@twNEiwe$g5@k7Mmt-^t3Rarqip@h!E&x)_wX!06m} z_8#2z6pAx(D&lzd$&rFHyFBEao<~ZNV`cy^$YyM!#&fvm)~2^shR$bwpplfw!BLPZ ztBE}5r!k$R_a81gWA)GBK#5iahCm3BrDwqa?gV=AO-F01hgCwUhQSNL#xc+5OB{Qo zk&K}w-Q}jkfsB)pQL&M>?+qi!#Q9`!xb~ot@mom|Xygi`Z_39ff!F!c-S8S#!;G#s zDZs~ndP}BgkiPKJM!5k#=?4Q8;RI`L?l2bvCp;Plac{07mflJBBQXqkQ<6X(yHr+& zR*jV~WdIO?PjEX^;>3ioWdTM)?#AGF$LUDN>@A5;oRTSFwEe;e?@TUpkXtmeJc9@$ z#y9W{I$PN6U5r4O*$GnK{54B`arUc0F#-52caC^qdsjHuVMOXvapxI44A$y5FmkYy z&6!D36Xqm_Zb#}WNoQM~%@Hsz(Y7;^8`r1037mjfO~YR?J5O%uy+tRzy~>}-G;saSf;_ss7<*1MON6* z$B&n9JqJ7t{{Tv)t}BT(z<8Z-6^8?!qaveFqjHiD$}oKfPJbShu{WD?0{~R9Tw|vd z0#3?&kO#}aKGkbM7b9g=k8*AV1r9q5{{WoRRTQ+0%2o4#P~;Ko`cq37*<>9%uWGF< zg^I`+rsu%N`5(@K5(|O$mj^f_BzN@4{Hk@^y;v>^ea+p+zXqVY42&T-!*jTGq);G< zg6AZGl4t>ZrJ6>PPMPEbkJE~tG+Yv=Bz&bao;zZqTqMRms=)nv(qW;6ind7mxu6F~ zb2AA6O}Gn@jL{)TT`&$y0mmS5O~{xKax%Ng_Y}y=ISQbuQcitw#Q;pMv5~rM;ke*r zr)|& zm1F`oL-TWxDym4tyPSN-f$38TWK|&wgS+O)>xv4waui6Sl0zXohntlgXVd9Sh4Aso z89PwrRQh|=HuFeT8DD1cg1E@5k;@`)-c|OY?TW}^e(vBB2_G(AKXKCrr4cYbWbyz= z{n$~!_9wBW5yv!wPzo@8ryUIty3ZuC<7}#MJA?HU0Th;xZx&2pGms8_Y9@*@8Frnl zF}G;o{d-o1H%la25PZzrvCeT-(c2Qn2q~S%Bc3T-zEY%)u`!S35(UXp-3~A+FFY)< zvyy?A7$bt-wJc1)%m`EG4p@#xIsTL+EhOlCMG{H zWl;RUb;UY)mNmE$CdJ>hdi`oaB(EbPFpp+3KZ#KvPk zHr}o~aoVeeNZ=5FNfDA<^(Ts)vY8N&e(z9v(m+FPBQ!f=B+BG@SmE*yPt?@*suh?z zk1h}~c{VKS)k}3W|JfLy`9Ew=31Zw$Qki(qy&p+0v2Fzwh$cXhaXyL=T zKp2Gqd-bQ7og-CXIc{V1{AtcuEF`u_KQAAJ5lr#|&4adr;yx|WqLoH4G1}}0Po-M5 za}=NJ2|#dE4o?Q6h{j@=g(GXP%bqyv`PA__OZ6NyY@wM*>ywI1qSO(IS~(GZRm5f4 zuot+^Np3M5f;7M*m(MvJ#X)kC#~_G^%!6s(1~}Sy#U{|Yd|Qd$ppr*IGt#662^o;g z!vq3>M{(2t0IyVDe=l%wc_8i;Z6-!lo)jyysLlcH(0yu@{{ZPI70LOw4nBsR#MQ`c zc1bhfu_a4q)~y&*b2fa%RRpej8i`_$ZUO+v!2t%N+*R=>&%EHCoKqpI2|cIom2!aY z`I%cLp%$|VnFNPt@Qu8ain#<$=Dz3o0RSi+sESh^(>s3f2MPi0o+`PlG_F^I*{&dy z%1lb@ll2(?02;9!_t~ImXOHJDcCk4FrcdF=9`$n2FqvToYVtTA=g?Dc3Y&D9M#kqL zbU)`64c(8F$GW$}lq7^LyaUGk_s?pUHB$rUl;sFLxf~B#mV8_Vxh&r<0aA03RiTh0 zySUz{NF&tx)goH4=)VarZ!}o-`-^yls4QhdCLAC={f|G&x-A03!_s^Y*6#0M{{V@? zvUw5|C#fI(dh%^QQ@FK)W`bvr&QlDk4-BUj>i!PaMxmm3SHn}lpJKSxe|sPwJB2Iq zpKqG7cfHHq9&4k(pL8b^KRxyVkFWxx&q;{yKkR*ey zRO2A^t23OmXgLl6KaVs47zizhEx41pKpk-0Qvfl5OArF&=e0f=Q|!^VmORyMxz8VZ zrj91_*~8-pC2^2Pr2s`N@yisU+xNoRb?j=U~xghm99)g^q8rh7@tV3{Du6p951f&4R^13k~(`0S` z03j#mUo($hv;nu_EZl18ZYJ`hbjCL1{p?qu2;_lPE#-~jRVRMKlY`B9pNFm`ZBEuD z3Ai=`F#K!Ln^0MyXtuH;Qg$i8;Qs)PXC!YHQl8RLb8M{Jn||hSI6nUX(ylxb7|4{A zXO-BK#s&xJRW6!XZX$9-gq9;G?u?EqX(STcra|*vj!t;%kLy{Q51BTki5mj|+9YGt zeJYLYQ$=&M7Iq-+WL$>97zzeGyHcdW69h3X31<$>bCL!D{b|sA*D{uOLJKZX^*8{U z1XY50qLSu)s99fW4y5h>01p2El`qCHpMU@sB}|r398A{UY#4(iz!sH!9(F;d<1LS~%uAN|qqRz+@h3mAlJo zqFFH{V6J1_NFbm7wOWSiXI7Cw5h|Ujyp6vxpa#X}#|J7ET3b~k_ppVGFCj?Co! zehJd2_hm3Znh(@H3GQ>j#J_K+9;7KT4(z~gW1;N~fP6A60FXC#f;;WyOj>XR)K$k8 z?#`qm#0zk{Kmalh;MZQx3T^>q(gKU&Znkh|CV3rxCViNb6&&FP@bmHtiSvqz^9nQZ z3W$UM1$Y4lAolv6&lf@G;`eDil%o%D0kCR-m!F>(^TFQvnu2_+ecBbIArX5r5YTsw zh&?;OD1IaX+W#<+#)#bGN27H2`3WG6z0XetY23)Ya|cNPf1fr4X@Y&3S71SKBrbpl zf?SLedbaNyA1^QD*#T}C&-QRj2IVmK>1B|{-lsb-0e~cF&z~xgCf%oNL7FV-z=sou zXdoFEeJ-E~07==C0Z9O3pGLJi<{>^-%AWmipaRYzK1v5AD+wl4`xAg^uSG<}dHI<5 zM8pM!#RYl)m4^+=qI4_4!~`a@{XGf_lwUuOhxhs5?r1|H5Xu2whXC*Cnai6>x`Y*Pnaj;jswC1`Cig01^7CHj~!?AjnyO1bqZp1)`LZ z-M~$N2oDbrACCwhpNO20fROwcDG?FrF=|T6W0aKCLH2^^;v+vmWI!*mA?OWs7`1`; zVqjt8;NsyE5JLVe1e*o(XCWB?!Gd67U}0e6;^1Lp5($8XE2(QAUn2+G4D=QY z?Gr8zwh-C{Wm0Lm6I@`&K{mfSN?R1%Bv>qW%HERjzB;ZP=4AD5ajX8+oJzR> zFAi_aaHsLz?DB!UdbdiGG&iR;haHam@__i|YNeX*9^si!{N&R$9H5SVT#m)nS^&A8 zfa>wxfU5qc&RxRxSW`c%uvJ$hJyb%e_hkRq4#Kr9sp{%EpEv=7Rl(!pQXGO6 zb_l85ouv}r?4nl&TUiwNq%L$OX5)~w;($fl^%85|T&1zX_j2?VO-wKCW_s_}-$zK7 z_B1!v!IsT*q%`4+2t%_SZ~ZNS$E>n#LEDKgbn&0L*&Fg+*?$oF+SK$?DxPH1Sl8E; z|4fN@(Fidn;T?b!9^h7;g9HLp)NfK_B|OSiYI*iuIi!5$@;$!IFuKy*%}@r9;DG*< znL4exbFnjp-^cx3u3o?9m%O{3vwXIO=4;t2>}Z*u)r-yTLan87z%Sv9a9oo&^A|2>b`CwHV3Sd>xu1T&K2er{&`=@r|3d-KXd4;l5{ zsq9O*Swn?|LhnzdRwjp!(-nQHAsO@TeK6_ShHH22iY8;HJ|84#mIQ9u@JYL#Yo%u` zv~R*PVCw0sA+olG!rEsk2({-$sRgschV5_JZtUEAJN({kdz6g|2_PF+bdA#m%hRBO zBHkXtz#G{o_Lcc_@G?WK!XV?jysQr&j<#QHgcrd2nz#fgN5=i6s;gF_T3?5~ulG&T zbZXhouHINNnJRP2sLYm0aluesEmpBt?FkTat-R1;e@-%=VfBW1bWDrs+z-b~QP9T( zq!JP3tlT*|+KY`eAF=z^%9ggr3nr03Yf8&%eOCR0PFon1X@Q$7BWE-8P8nC%Si%)* zsZHOfbKiDr0#cB`tJCJe#Yt}h;sMP!p?MqK2oA2PEJ=dcw)paj?SQPJ1?S1e=vzca z3NG|jqyDMEADGnGETSvyg2>+D%I$n?m?#y~jc_y_{&X_+S!mN+Nv`|Cf9hb87lhX0>;68DdVzYI!#^qGi_cVMX-f7`>75ihd5kx#FaDVC<8F zgdu}{y??2nk<^Lwf=1kFn&xfzh$#7wVI*Mb>yWlfy2~YM|J?kcz1B)42lEp@xhFm$ z`7RC^qCMEwwMd|;FGw8;d?Qkl&=+7SMcnB-W|k?&^-M>nva#8?58wXr+)`|K$i|O# zE58#~x#6tkJ>Sc>fwc3H!!Z#+8nD*|>eF{UP+^V^oVVNPuU zjH`Qx59VW zCGYuNDGpPF*5cCookjx1&CdYLw8$%(HB1kLJo!|gES%CED@vkI%?PHd%w{@4VV+GJ zsacfWz46U8bmP9;7bzS5REj!+yY_vn@zJ-tI`U&}otKL*Z)Uwl0y=&Pp~l>5)3~Oo zfg*s($;sU+LhU$NHwFkWF)ug1R-Io)HXB#@qMif?pU1b)aGBRd&yOkx7O9nWmT1Fq7n1@o~Ow!anYt( z@`@C@C26*YvZ!X4xT9iGT)t~3lfk^(@ghI=`72r`KDXhl*YLt3LSbdjqL4>NSj?eyK{U4et02)k5^Lt zHQK(Mm84-^qE+9@LNu+=Zy|xrJl-io*=OzFzSz3MvO*)RIVSy=3^%F@s#SLh8FHF^ zKF4u7=WXaQy1mGnzGezu0{)h?LC~VYveE99?_r~_FD9xYfq~t`2_!JDK<<_mQ&Cr< z6h@23q}RU*znFczJAk;nzp_jIO~iojDaWm#Oq#078}hV#c^k#OJ2}tIs&~1hu7(uv zPz)~zOa+`RHi=M2s1TTOvzI1DuA{O`V9A?zvufS$^u6FXqW!gQ>o^({2G# zb4cKp-kEpV1(#NXV*)robz8<)_Kk}*l&n3h%OKM8-9>DXac%jL_`NF5=vr)c>=L0UFsPNDN=cTKUN6p)n4i(z>+Zg@{T$WF#UR@t1lT=;|k$T+TsUkc| zm%%G<*U^@^bv2;B`FT-$p}|-ohUfQwkFZ^}GdauQh*j+(fa|qw=1b}5Zc^&mW76Zm zq+fYY8-GAkd)UrYXeo^WP0SDl!;heXlWL>ogs+y1JEwOn@j4L`JKFb5}1`1RtI zHW`+-S=ueL3ElGE8MmF!^gapcaK&npsk1BgRcRsimb;C@qVY5K2>lo}LnL5liv+Nc zfS-p^#xhRtJ(bVJaT%g16=l3WA>HEaTK*^3#y=zY_d*55C%V&E;GsIzCDv45B^<@9n4q!0vD76?lxXM6A0sovRmqiN}GrHo?{AhJE{ zIjf4}SCDlLYxi=54zguZx?uciT8CX?o`q2Vp+ z7VYXLS5xQ>n8V^=x%J#PUnKA@01Vd}<`GLicl}REGf0^CJ#dQ$@{9Qq9dl_@M&q-q z4gr&Xs{zS|*7r!}F*DQ4T0S$(P(?sk8yx zsxCtU#+r(X9}EVJjd9}2PPt?5@=SsXc=r&g^dx~znFcLLKm+WRNwq@yA3tLebO_o4 zkT>B;GVK!_MqLi=kq-6gp_^Q6QS)@wQ+h4ZciK$^83+?6WhK}c!zE{B)LbWIL*Bw# z!o$)dr@s)#QR$Y#WPS`~@x6M*R2z&p9VGv4cD`3o4?8e|F(8tvg1I1V=*r^waC>># zawl8j2}k_Zmix?Ej*iXps8)+BdZi~9l$t8xe@=qCj;^EaTcaGuKq#A5r&Lv*i*pxk zL+Y9>WP5JpdCALxvMsx^=m!Wg2BODnzPj8wx}A>%=w~^fr>acPniSsMK?14C&Ef$X z_Lat0?9+n@yJvlaR%gS8+@DEeZZfKLCy=L?By?E<6 z_!zfZ=G8V=6S=JXw!+dD`oONQ*=r)piIYaLa*VuI6j(lL@t5+yFgP(k6Lg%z++nTu zU3M&Jwi!nPH7|Q%T$mG=8?Q7rV+oRpR3lmnoQrY-#yfYzTNH?@-F_5`7k^ytn!Cyc z{{4%QF}8p7xlpUF^#o~dT@!al$C~3SKMBrm#;1{VR3?a$@9x2Bh82-RxWO9*-P=V4 z;g834st0H#Ra;!g;w=j~bl!vta)c(YJ*sy|YpaucOvZY5yMHqU&+0D1zlG>nn;69v zckv%|{xN0rAnwZ>e6tA5uTY)HwpPZ30k*LB=L6c8T0>0RK9u*#ZJKgy_xEa;Ib|bC z!`;0;CioL1T=eshYRTM!bSls2Hif^g3lw8pDh+MSOBnB1Gq5(BZ6A6{X4UcWi>KP^ z6Ji(OkqyOI{&Sr-Ot&Y+7fQN!?RAYZv-oPZ)l0+VRX5GXnWTRZ=eEns-F1o#Iv&O% zGBu@Z?&y&>8*_b#>0^wS)22jK$cxqm6St}2;u^%AsI+1=Qzq~dE%7D)k!tIa_*&K> zlep;Bi=tAv4XeA#Xw|1p>5+zLwHH|`w%SS^48{RBxo=O64w%Y6yI!`|TC}uFOn_?xR;b4QV@y@O1YI(-*3BU+f<*;z6@lJNi7b-+{j; z*Q>|cAL7EWK91bL^5W`?Uun<23NfDEGQkYVw{Bt}$~X2481Hy7boUrj-8;F`N3Yjf zr>i38vCe^Y=!K7fL1t1}e`0l~%{tGr8i#!eF&;5)A}M9YT&{HWGEwyO7q{Fi zgGFC+#iy>wh&tK(X(G1S?PW4{v?u-K!oF;lMJTOaAGgSx$-j;C-S)v)nl%ox{|9nsoK@??2d^`#U+>ucpP?b>Lp`sYO9quA=d)$_^R_0-r_F#$aCNC+4XX19u&Ux4sN{eZs z+oE_boOx*_W8kPcdl~4O2iUVbdu#orF?(J~x6J`tPrX^=)tzK2H~Lj!gUexw58mNi z;f=4!ZMxd-*(tN4p(IXGels>>!EQuSH_!m!<|K_8ut98Oh|X9da7EUP1}Rjq`!~2| zT&r7cKh#oB*Ls)YR2Z%KQ9q#V^XpG|$yaa5{)($W9%~KWw7mKN^do1nMe{N}o6UV1Lcavxmg1mmpUCT6a#&=<|4U@hz*y2)!>`b98o* z{qiAy+m~K1Uu~6=x!gmhV%%vrCy)B`>#V2na_5_+2x5;5FG*#jJ&1JZ`q; z+2D=5%TIX=j5}~5mwLaEF0sN{k$~8C@8lT+Gi2L9&lKy0$3nbJ>u%}i{acoe8*Zj| z)#3LrDaAiP$UPhiW@|{Sxo|H#waHVWSGS(|tFJnlauZ@TKuDsv!)ihk8-IpNeEaG3 zglf_=iH6RJdh)mYlp>Npgw71UDp-5mpKRH?OSw@L6cg$%RGUeMU5iH{$iNs^B%i!; z;_7&N1YInV(OdD7rQ#ssp0*uQoeuC1KUr7&pWpBP!BSfaPi-QTW8HDs`7k7UYeiP_ z)aw(m*;Q@t)hUdcde&In^}61uza|80`MX0(wkVIuUZmDubW*M6j*(4KIT~ z@R%h`o5w`o65n?F6n=HLWc+k!0Rdd-#bBJ$c*&CIjO}!rh*`i6*5LS)Q1i6n+wfiI z-j@bLnXa^^^O#rsOuu!Irdt;6!m8rHNV&fwn^)KOlNThcsk)n)?lY9*80nu zQ8Mk6g{riyT0+hc?M;KRsm7BW6(zSt)+#mYFKbL&PP=c#N{Qb?h{}dHi?njDZUvmL z3#c_n?f&84Um(_fU&QH6+j>!`L{%IT@Lh({G0XLOIvqFRvUPKZWIw>goRHW|EYE}X zU+;aR;%F5gM&cCJTho_VvbL6*nkw|-MR{0fKSlEdu5FiJ^-91Xx!Gh87p!98d2HY0+yLt2%ljmR$pzd7tS({!l2Gr#%N=hb~JDM8@`jdAlWJi2WmT?QV zM=D)(PM#!v`6-6cwv)DCL%LzUT&HBgIJfng|JSX{c+yYSBFat5O{{y7fEr?qEon)! z`<$0RIQHnRT1@kA9d&+OTQYA0(spPsXb#i_EGHt{2NW0a+#?zSUh7Cjy`-z_nInCc z`D4vr_f&_GEEzCAY{vHEeBDK&ZI6rX4TX0Zu&`92iE8mUt4m8wIG_8zdcy|a&rV-| zTzM;ZFf%}KY1g%5q7qtKH@)HLwr~Wzjn?#WsMIa zfk->qw&x0_x0dxT-F4GQ2)s4~FJJ0Q zsFth|M%?1)E4&*3Mw%tZ*Dg(7_Av8sQE~?Eu{T|1?f#+Ml0CC)UGp{CB;35VsGR>C zV)7j8o7q)IuAct+P`3a+MNu6=evFAu-HSHq=F%xbHE*t8q2F5A?q2iv)v|Zml8r7( z*`Z8LXp^w43JEn-cdO*^MHI?krSDqzSE+YEm#05sYd}?b8^$kcQa;@2Y3J)7_ha+nW?>kc84wF3hHTI8h&0*dwQgGS`{#7V8?djZ%?Ndg zz*G^*kzcFhCuY-lCU!`5Ib90OE?Ye!+?0HrgY{KXsCrQ3i<(;XQ^sWQLc0)2`oeTr z_WDk_>SIX%r0AM}P4zC%HtmIgq8vD~ap|!*EbX1lRP`c^wzt1q{1danW&+bTm53;U zbuj7l1-g^e^CuZed%2Zi2=I>*^-+915{harLl-OV?v4z8onJx%m(CbP^@a?HwBwd# z(a5yfZZNmQABXxgj-~TA_AwFrV$N@#)y$55!kC=9c=hduzr_Wm)oHrUWl|PviGbLr zMbUz*QX$r5^`7l_5RVhLC&fr!-m_!lT{~HP4GGLmuuuADdC+mz_;IuK--w~+{U!-h2|^@ruCBR0Bw$vrUHgKTlfU$Ho&KH5m|@c?ZdfLBLVK}Q zZ~*Hh+`fCeOG;#O4h%>6$H**B3bodGwsv_qMcr7ro?ly`6LTe&o7VS!qQ>l|bQBUm z?DDxVT7P_B*|C<}8Y912mCv?RSUYFmfds~>M~Mc_@)8-;cCyFE=3voy{XE%kWciBv zKj$FkN_LC0EUt8Ob0Uf!SbFyaMD|G`ffTn&nI1#qFMaPi*`JkYD3ID4=B!I)Ac2cn zlC$EX(V=fX63djAtW`@Xzxh&^>_0eRXou1x&&X8H zeG}`*5LyrZiOtC`BbrB+-ZG6AJ9H&8F2lM!JNJ5X&(qrhDNb`uA`>#pAq}mWew^<$ z28v2FJoAPKRd?t^ePx7Zwnr@)#Mz4SM{_a9UVSL5yi`gz*50|QI?Hg<#ZU7G61c7E zDP}@49q?*h*_>6Z%~6`>7+=R4<4$q?Zj#D8X>IjeWtwfCZ4P87a)w#<;90oQDPWqe^$^MDgckQH7Mx-=BNjgsK<(Xoaaws ze{uNHd?PUbDIRiF|#*p1h z`zSJiT-2jma6`+|q9{y7FxxvH)FA*_22(Of-~p`q{ z>7n$0-wp}C2r-b9?0JDU;={cyof$EUo>cK{rfouve;i3;z z6%N_PwQ+@eIRD1NfxE(NU`|jc4@XdkNKpr6T@%d%kBQAa+~LYlC#b8rJJbqf0GGX; zq5HxFd%`FVszlY%h6&vLzdnCV4_AlFiUya#s`kM}f&V*4!_5Zz8wbbS!Tqwi&2Kys zODL!Z^>SBrQ@O06ZUKiopbX;uWdA0NZwq(zk#m6A{6va$@8nf}vO!H;E2y=(hl4vv z;(J0}-Ty^g?qcQ@$ajzi!8 zcBFrBi7epmV2An#pAc+f+dsw8SJY`#MF0_)ATsl4dhbf3Ler=&3_;7GBmlbmsADh% zgXtMaJ_La6K#=bYP=hlQj^;8P&1D!{J(|mKG?(FMF2m7WhNHO*M{^mD<}w`3WjLD4 za5R_UXfDIiT!y2$3`cVrj^;8P&1E>6%WyQ8;b<>W>^*7Uf9)Rvu9P5GYwParEY8E@4|T77`q67I<3W$w(w$IZ(FNXmFQn_JpL z-I*+);In2ambvn37ABaL6pOx)2Cs&*Jk%DZ;^PX{@ws@}(#PIX%!)-unn2P^+{@9~ z5$bNv$#4+|4o#NA$sMSz=+n~#f+kB>!~fQgAo($&gZTw6hD zUlTl%V%c{Qfk1F01i0a@HavV{Vq!eJ{5<^pT%ZJ(o41p@xfhp{8|$8tpLP_WZkDbv zXLlIfi3w%b9DKs>F2%xvs_56Y=b}5z`kRFy<=#lffTP_Sl{eQ7>P zo`3KT>e-Vwl(&#~)q=ahP#Q2Nn_o)*DEL#;KpW}?ckn>hBqk`t$IAmQp1{kyU+3Y{ zKQ#^iN6o{fe`+2m>N>&PrTOek!5M z|J1q&LhT7vfZ0IZK!1dUIr)V|z$6MLF;0GAeolT7K`?M6K69tnPrw~7w1o%N7Xh(z>OrWd?>R1RY2a|xH0KbHifTEZ%zZ}1uJpXwC zQ4vKxArWCEIYp84ykZLcO8h@t;5X0q-InA*^|?cR5Z%F1o#zk!f9spz<@oC&_^oUH zyiR}XnIKbK18xPg_ErF=en_KMso>%j<>D2-{Bzw9BT3X1epu)b(5Mo5S173ZU(^o? z{h_V_UgB2f?&kl+z;9xIm_Qo`r&WMcJEYMoCj9%VD0?SzSonV%dnmY&%)f(=D*5NQ zfZ~dyR-XYUjJTo31=I>Gl05%lA39%jnUaIKo2@g<>z5jMeebLNS@fqWdY*|6I8H-R z;|bc@A=W>o9i3gFZf;Pk^DuWeEvTy&%nQ5}g?J8h|5e~mJ7_fn1(+k$34NY|d}8~R z|5@^{nuZ6OLch)wt$C>APfb*Zx(wF1H_OS~VZU>WaPjh8{<#DT*tyXV{6qFX83TtC za6I;bTK$c+1K~f-DSA1>-8@{;{z>!k2>)!o-}rwjDP8n%w1B!w^NWJx`OoIw=lvDtGk5R+TU%6&M*tj_(dYZm;y(?@IfHYUKo9qn#e@!Ye=qq{@8=nu zhnc(W>GJak?AQ9wvOl#o%)Nd$f4Jg*6#hdS3Z61}rvwKya46fa6dX7Xn15=ZuNL%( z>TK@n21QNGl43#Kvpifap@#=b)Ihv<>A_sV#=q?90sYwmXvTrzUy|BT5I^ve-j~}y z{1-vAyFW2PAN-4ul82Ke`i8D#?%?*T?w`zmQP753DSAWE<_>v#h0-qecDhbD=4bl{p?GBu>aKhd7Ysf|K~{k8}m;MeOs72 z^t?IPVBme>XDz=m|I|Q_ZRQR}aL_$eObbR>Vql03X8SPwL*P#fI+oysQ+ab|)F^|x z@P5_%kAgone~X_4ghhn~IR$yegn7|97_*7+@$cpQXwF_P0P?|57|jvnL}`hjb1=RG zV>gfk<{(E>rADTv46GK}Q6GPP~hPEk&@`Rt4PnZ*oVL8FLms6Ni zgj1ALj1z>0kB^g&pOa63lTVNnjA=n3J`qkZ0Oki}!LS&Niot+c2#lS<&=-u7!QfXy zObCpEg@lCV_!N}H1mqRPgwD%}iGaU36i}}5E9`fM-&${YD5i@pqPe+xB}eL0}O54RTZQ?JYZJh=LH0K z1x5M!`Gt9f73BE9k&2&R9{lMbugJ$Qz$XI6KL5}=)W`SARGr-1QJ3Q{n}UC5^N`*@ zY$||vLQklbk}KTtZ*O{Nh{R!kI>Z0pocV{|fio!F_KL0k#O*K59@0B7`wP^All*xz z`(Nv7R+hi|nKL*+9sTD8D@z_IxONuU{BB@`&&P8(Y>>3F6t{-EI-0vn!yL_RpgeZY zP#Z~}1Ma^2|7#99|6C68m!H4=2K-h0&)*`yip0^s2Yv=6|HeLq`9ZO&yu6kx+#0-> zNxNw)pJ!54lo#d`6Bg#;=LT;<|0?&dc2r>CEzi}P=YMXyJ;1;}{eXW!;`#L#q@Oxq z5Bq<(9k_i|$zLFF1lM1HbRcpB*8vuPK^?*M7a$#o9Km&f#a~cIaQy{H2O>vs9boYn z)Dc{N0n&lU5nKmY`~`Ic*I$5iAaVrP0TzEj9l`Y%ARUMt!F7PeUr)5fyfbD2Uz?Cbp+R6fOH^o1lIu;e?c9=^%o!=h#bLnfW==>M{xZG zNCzTEa2;Ur7t|44e*w~g$PruzSo{Tb1lM1HbRcpB*8vuPK^?*M7a$#o9Km&f#a~cI zaQy{H2O>vs9boYn)c^l*5ge?^0KP*e#ex7=TtE&H8Gw`Z&9t;Nl~mOg(aT2=si?!8 z;27Yi4ji4_T~X8b4GfK#aKC|{I=~0NxB!0Cz}(W!Swlw&wH`kJPVHwx&GARk2it1f z-b(!~Tq;^jOb7hGqR1_sUBMOgAzGlcfEBnB14!QlX$OS6Gm4K|p`OaZ9z|oI)~2U& z1sw!wY7}j=M{}ZO_GnoYZRO|$e#`&^<+HPuqZNw&0Md6nJy0Jxz*Gn6U{4qn0n*<= zn$5w(5eCwzZ(>k6Le0SsFJPfozh`rYTH1m%FGv%)Ue=ZeX-V)40z@{4Xp2L%JNUH$ zP!^DfJA0$o-)A~)d4>sm151=i1&VNhy1R2}feU4ryIL{H!yTQ?oxA~H@0?Lu0L4Gv zpFp$svj4I0klg=7qS|(^eCZOp%^=6?4|oTf2RwKZ_#F=L`y-eS4tN$%0HEX+08n=w z@YtS#E0Np;fZ~Qj=W`s@Uk)wH0fSm{qX7N2{a1lslK+`FR3A60zF+U2Fe&VPu7L^F zt1ZFLFL<~zxuM>FXX5&^6aQZ;9&+oDADrOZV&H3=;5%GQdSEXD-xLL#+sO*Oo(B`m z>9;pz4q5oWR6Aq=Meg-$kf2Q21*pup0kQ@v0CT1uz@j7sFs~$lC6Hh3rjD-%E*S#= z`i$dy{T`&ja&-P%h7k@PVz|N3p8x^mwJ$SSdboP-iD032*Z={z6b%(X126!rz-fRB zTu?>?kN{)>Mc@LU30wvY0aL&dT$IKUa0L*+H6RH5ro=tq0q_Wj1rmW2ARTxGnjoE!LC7Rz5weMai9v)xg+Y&T3WEnj z6hjU}4dXI~35E@Z3x*HIO^h&%#~4W%Ss29_Z!x}Lv|bj1TYCPk7F`pa$$;M z%42F`8ev*vx?=ichG0fxCSkt9e2rO$*@8KMIgPo2g@Z+j#e~I$C4r@arHf^W<$~pp zbssAh>m^n()(5N>tU;`KtX*tk?338%u*I=eu??_ouo2k7*wNUj*hSbi*sa*3*sC}= zILC1~a71uaa13$maC~v@!6*_BsHtuZ0IgE3{=V0gJ&oyykgYWn{aVBxLa}jaLad~oOat(4H=T_&w&RxPi z%frTF#1p|&$Fs{T#OuJD!rRS9!FPf0I^S!)MgFt=mi%%2-vx*Tlmr3-nPdYx3gqe)4Y=Fcp*)LKMC!QYh*w#wzwHu_)OnWh%`p3n}|5 zzfr+fQB#RfX;-CJwNy=4oxdP*!SBKcH6k?~wOF+w^|R`(>aR60G%jdFY4luVzvy(a zL=(_d)r`{Y)#A`{(JH@$b4lw`+@&#XKJ9DTbvl$fW;z)OucjH}z`n&wI7D;BC2Pc7yx~1}>7ehBY)v?Tp!pYw01DpZw z1#fab=N#-j;3Dqw$YtJD%{A2x;%4Gj>P`g)Q}rIFJ#KjndP;l7d9EY$5CvZ3UQS;1 z-eikl>=V}5d_%>eZ9_m zJ@WeU4gDLhZ_?ikyg7VJ`Br8yNw8~h`)!HaiFdH>!0vpzD{%M8-Q5tYkk9vc??vC+ zzHfQ|b0}Zv<4|Onb=bFX;qZh9I1ij2v_;57yo@A|^obmf(ugX4$n-Ge;qoK1N1vhv zqZ4BYVmx979;-hteZuzS!ISM++t}8)^Km&(Pd>f-bS>U0zBxfQ;Z-7i;=RPpXRv1- z&y}ASC!I=)PR2?0Odd&@W#r5iW&heakxj?Q*?o{5@ytaI`{C5SS1+NO(3!fHI7KIc;ioJ{HOKeL9 zN)1b!$}W_>doA(0sGPezt%A8CuJTxAcojj_%_?NIPxZx{3&_R$OEgPq%Yw`ARBvZ0JwPg z1ccy6oiH#Dm;U~hCkzNCCI%J;4lX8`VYopsFv+n1Y-S2Rxl1^d<}5BjRQwUoagXJl zXML;PG$?S~VxGRx`9tXO>^_1qEbqs zUW@K&+Qs3e58p?Yp&qv$y(p?_9bK{Z4317Mu5BAz6;al=LEMf>E2(QAUlUa^u=Tq0 z_+{zGj*0a%VycEP@4HXZ%RY5ZZk!drU}WbL5}Wb*bJx@+c={Nim)O`?*f>~tn3#^> z`H*8`p*+UE1bU3)5){GzJa3-rZPOs@`D5A^t_uQeg7VjoN9wRAS?0gPb!!$HQn+#A zaukRTHO(nuMOqFkcU_Uitd^C!e0h_=X_i=x=C7E;kKA7D6Lt5O|Y3kkC-|mr}^Td z!>KnFB}N7K60Wvthu;QOQrHvviu<&y zG%rF+>!W+d6r854wOB1GNmJ`f`w{7a5=|7ck@+Vcq>!Ieb>YuBrK08Pn!cr3LS@$F zFRGe?m){^PZ&#(=BG_KUE1$}y?`G63q~O*UV=W*BczbQ00lx>$j|5motr)nGz@S57 zB#TYqGTKH1oKBwMEnjYLetcM7J;~Po z$;WYKK-}}uvD93)JQ3Qkcn%sO?Jo=Rw2Gf@u*pxSq}^_#=^ftb(TI6Gb9KIbL2bP{ zzUjViNL9}0y=tDx#^UVME~6`Nf|82Qwi9rla?(~itKcVeX8!a@GwN(aI$vogPsW_s z>R(FfJpb7KMfQg^ox=GJ!ycAyllmgQi_dKzbU#1005R+3z|vh$3+Vb7pYgVO@YwDo z0Dmo_y!dEltu4f8Q;W`=>bUD$01zu{x@BmIcV1%o;g)-M%v1%&y_scM(_K6A{Xv?7Xv8 zp5fjhl$9Cl2_(9kaxt>Om%epmP5*@6q7h%|ZJ%fu_#-8>m@7Dt4!gMGO^|=K2VrK7 z{pm;SMxh>45rSN0nUN)B_xuF(I&s$wxMw;w1i`0Ev&qC8x zugW}cv%M47uKU{T;v?xOVD@WsNTzxuL0CGJQg#uG@Ypm}$vK^cNV}eEUJIgfDHnvL zCTW$pwu>BX%hfWzbrrR%?u3jAHGuV|+qy zq+i!5k_Xj24P8|fpIHqVsanOq9}(v@oR8(Ii?gWs9LB~G0|Z3MkakB6?L7Q|KmspR zyRA$4UwvB8OW~WDi#(k=M6#8BvO#a>f#&Tm^f4Z0w{#8kBPK?4(}PSt8HJqtFmtiq z<;4Y_dNXE6#;e z9S=of6(S|vEIwSGtCBoJbUK*AFC%DGX~$LYp=8Lr^Io@bEhJ^S-{?*�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 O{{RroH!ElV*}wuMG+HG9 literal 0 HcmV?d00001 diff --git a/example/gramps/data.gramps b/example/gramps/data.gramps index 65d86ea43..b76d26a64 100644 --- a/example/gramps/data.gramps +++ b/example/gramps/data.gramps @@ -1,8 +1,9 @@ - - - + + +

- + Joe Smith Over There @@ -14,200 +15,37 @@ bobsmith@somewhere.net
- - + + F Anna - Streiffert + Hansdotter - - + + - - + + - + - + M - Craig Peter + Keith Lloyd Smith - - + + - - This is a simple test. - - + + - - M - - Martin - Smith - - - - - - - - - - - - - F - - Jennifer - Anderson - - - - - - - - - - - - - M - - Eric Lloyd - Smith - - - - - - - - - - M - - John Hjalmar - Smith - - - - - - - - - - M - - Hjalmar - Smith - - - - - - - - - - - - - - - - - - - - BIOGRAPHY - -Hjalmar sailed from Copenhagen, Denmark on the OSCAR II, 14 November 1912 arriving in New York 27 November 1912. He was seventeen years old. On the ship passenger list his trade was listed as a Blacksmith. He came to Reno, Nevada and lived with his sister Marie for a time before settling in Sparks. He worked for Southern Pacific Railroad as a car inspector for a time, then went to work for Standard Oil -Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corporal in the Medical Corp until his discharge 12 August 1919 at the Presidio in San Francisco, California. Both he and Marjorie are buried in the Masonic Memorial Gardens Mausoleum in Reno, he the 30th June 1975, and she the 25th of June 1980. - - - M - - Gus - Smith - - - - - - - - - - - - - - F - - Marjorie Lee - Smith - - - - - - - - - F - - Marjorie - Ohman - - - - - - - - - - - - - F - - Astrid Shermanna Augusta - Smith - - - - - - - - - - - - - - F - - Hanna - Smith - - - - - - - - + M Hans Peter @@ -215,17 +53,44 @@ Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corpo - + - + - - - + + + - + + F + + Hanna + Smith + + + + + + + + + M + + Herman Julius + Nielsen + + + + + + + + + + + F Evelyn @@ -234,57 +99,183 @@ Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corpo - + - - M - - Herman Julius - Nielsen - - - - - - - - - - - + F - Kerstina - Hansdotter - - - - - - - - - - - - - F - - Kirsti Marie + Marjorie Lee Smith - - + + + + + + + M + + Gus + Smith + + + + - - + + - - + + - + + F + + Jennifer + Anderson + + + + + + + + + + + + + F + + Lillie Harriet + Jones + + + + + + + + + + + + M + + John Hjalmar + Smith + + + + + + + + + + M + + Eric Lloyd + Smith + + + + + + + + + + F + + Amber Marie + Smith + + + + + + + + + + + + + M + + Carl Emil + Smith + + + + + + + + + + + + + M + + Hjalmar + Smith + + + + + + + + + + + + + M + + Martin + Smith + + + + + + + + + + + + + + + + BIOGRAPHY +Martin was listed as being a Husman, (owning a house as opposed to a farm) in the house records of Gladsax. + + + F + + Astrid Shermanna Augusta + Smith + + + + + + + + + + + + + M Gustaf @@ -293,270 +284,26 @@ Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corpo - + - + - + - + - - - - + + + + - - M - - Carl Emil - Smith - - - - - - - - - - - - - M - - Ingeman - Smith - - - - - - - - - F - - Alice Paula - Perkins - - - - - - - - - M - - Emil - Smith - - - - - - - - - M - - Lars Peter - Smith - - - - - - - - - F - - Elna - Jefferson - - - - - - - - - - - - - - - - F - - Lillie Harriet - Jones - - - - - - - - - - - - F - - Janice Ann - Adams - - - - - - - Retail Manager - - - - Business Management - - - - - M - - Keith Lloyd - Smith - - - - - - - - - - F - - Anna - Hansdotter - - - - - - - - - - - - - M - - Magnes - Smith - - - - - - - - - - - - - - F - - Amber Marie - Smith - - - - - - - - - - - - - M - - Mason Michael - Smith - - - - - - - - - - - - - - M - - Ingeman - Smith - - - - - - - - - F - - Ingar - Smith - - - - - - - - - M - - Edwin - Willard - - - - - - - - M - - Lloyd - Smith - - - - - - - - - + F Marta @@ -564,40 +311,127 @@ Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corpo - + - + - - M + + F - Edwin Michael + Kirsti Marie Smith - - - - + + + + + + + + + + + + M + + Ingeman + Smith + + + + + + + + + F + + Anna + Streiffert + + + + + + + + + + + + + M + + Craig Peter + Smith + + + + + + + + + This is a simple test. + + + + + + M + + Magnes + Smith + + + + + + + + + + + + + + F + + Janice Ann + Adams + + + + - - - Software Engineer - - - - + + Retail Manager - - B.S.E.E. + + Business Management - - - + - + + F + + Marjorie + Ohman + + + + + + + + + + + + F Darcy @@ -605,50 +439,150 @@ Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corpo - + - + - + M - Hjalmar + Lloyd Smith - - + + + + + + + + F + + Alice Paula + Perkins + + + + + + + + + M + + Lars Peter + Smith + + + + + + + + + F + + Elna + Jefferson + + + + - - + + - + + + + + - + + M + + Edwin Michael + Smith + + + + + + + + + + + + + + + + + + + Software Engineer + + + + + + + + B.S.E.E. + + + + + + + F + + Kerstina + Hansdotter + + + + + + + + + + + + M Martin Smith - - + + - - + + - - - - - - - BIOGRAPHY -Martin was listed as being a Husman, (owning a house as opposed to a farm) in the house records of Gladsax. + + - + + M + + Ingeman + Smith + + + + + + + + F Marjorie Alice @@ -656,12 +590,12 @@ Martin was listed as being a Husman, (owning a house as opposed to a farm) in th - + - - + + - + F Janis Elaine @@ -670,205 +604,282 @@ Martin was listed as being a Husman, (owning a house as opposed to a farm) in th - + + + + M + + Mason Michael + Smith + + + + + + + + + + + + + + M + + Edwin + Willard + + + + + + + + F + + Ingar + Smith + + + + + + + + + M + + Hjalmar + Smith + + + + + + + + + + + + + + + + + + + + BIOGRAPHY + +Hjalmar sailed from Copenhagen, Denmark on the OSCAR II, 14 November 1912 arriving in New York 27 November 1912. He was seventeen years old. On the ship passenger list his trade was listed as a Blacksmith. He came to Reno, Nevada and lived with his sister Marie for a time before settling in Sparks. He worked for Southern Pacific Railroad as a car inspector for a time, then went to work for Standard Oil +Company. He enlisted in the army at Sparks 7 December 1917 and served as a Corporal in the Medical Corp until his discharge 12 August 1919 at the Presidio in San Francisco, California. Both he and Marjorie are buried in the Masonic Memorial Gardens Mausoleum in Reno, he the 30th June 1975, and she the 25th of June 1980. + + + M + + Emil + Smith + + + + + + - - - + + + - + - - - - + + + + - - - + + + - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - + - - - - - - - + + + + + + + - - - + + + - - - + + + - + - - - + + + - + - - + + - - - + + + - - - + + + - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - Birth, Death and Marriage Records - - - Birth Records - - + Birth Certificate - + + Birth Records + + + + Birth, Death and Marriage Records + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - diff --git a/example/gramps/example.gramps b/example/gramps/example.gramps new file mode 100644 index 000000000..590e7c144 --- /dev/null +++ b/example/gramps/example.gramps @@ -0,0 +1,37614 @@ + + + +
+ + + Alex Roitman + +
+ + + F + + Sarah Suzanne + Warner + + + + + + + + + + + + + M + + Howard Lane + Garner + + + + + + + + + + + M + + John + Schultz + + + + + + + + + + + + + + + + + M + + Henry + Sanders + + + + + + + + + + + + + F + + Ann + Spencer + + + + + + + + + + + + + + M + + Thomas + Foster + + + + + + + + + + + + + + + F + + Jane + Black + + + + + + + + + F + + Frances + Abbott + + + + + + + + + F + + ?? + Кириллов + + + + + + + + + + M + + Hugh + Jones + + + + + + + + + + F + + Ann + Jones + + + + + + + + + + + M + + Eudo + Смирнов + + + + + + + + + F + + Agnes + Rios + + + + + + + + + M + + James + Reeves + + + + + + + + + + + + + + + + + + + M + + Ribald + Смирнов + + + + + + + + + + + + + F + + Beatrix + Gray + + + + + + + + + + + + F + + Agatha + Rodríguez + + + + + + + + + + + + M + + Ralph + Пономарев + + + + + + + + + + + + + M + + Robert + Hanson + + + + + + + + + + + + + F + + Helewisa + Schwartz + + + + + + + + + + + + + M + + Robert + Knudsen + + + + + + + + + + + + + F + + Mary + Copeland + + + + + + + + + M + + Ranulf + Knudsen + + + + + + + + + + + + F + + Bertrama + Huff + + + + + + + + + F + + Catherine + Meyer + + + + + + + + + + + + + + + + + + + M + + Ralph + Knudsen + + + + + + + + + + + + + + F + + Theophania(Tiffany) + Walton + + + + + + + + + M + + Ralph + Knudsen + + + + + + + + + + + + + + F + + Isabel + Huff + + + + + + + + + + M + + John + Knudsen + + + + + + + + + + + + + + F + + Maud + Чернов + + + + + + + + M + + John + Knudsen + + + + + + + + + + + M + + John + Massey + + + + + + + + + F + + Joan + Мальцев + + + + + + + + + M + + John + Christiansen + + + + + + + + + + + + + F + + Alma Katherine + Klein + + + + + + + + + + + + + + + + + + M + + Culthbert + Gomez + + + + + + + + + M + + Christopher + Christiansen + + + + + + + + + + + + + F + + Jane Joane + Gomez + + + + + + + + + + + + + M + + John + Foster + + + + + + + + + + F + + Elizabeth + Ryan + + + + + + + + + M + + Thomas + Foster + + + + + + + + + + + + + + + F + + Margret + KozÅ‚owski + + + + + + + + + + + + + + M + + John + Foster + + + + + + + + + + + + + + + F + + Margaret Ann + Garner + + + + + + + + + + + + + + M + + Joseph + Garner + + + + + + + + + + + + + + F + + Connie + Gibbs + + + + + + + + + + + + F + + Melissa Sue + Garner + + + + + + + + + + + + + M + + Martín + + + + + + M + + Tyler William + Martín + + + + + + + + + + + + F + + Elaine + Gibbs + + + + + + F + + Heather Jo + Garner + + + + + + + + + + + + F + + Regina Lynne + Garner + + + + + + + + + + + + M + + Jason Richard + Garner + + + + + + + + + + + + + F + + Victoria Laine + Garner + + + + + + F + + ?? + Harper + + + + + + F + + Lucy + Edwards + + + + + + + + + + + + + + + + + + F + + Vanichia Elaine + Garner + + + + + + + + + + + + F + + Sharon + Gibbs + + + + + + M + + Michael Christopher + Garner + + + + + + + + + + + + F + + Megan Ann + Garner + + + + + + + + + + + + M + + William George + Díez + + + + + + M + + William George Jr. + Díez + + + + + + + + + + + + M + + Jon Dennis + Сергеев + + + + + + + + + + + + + M + + William + Christensen + + + + + + M + + John(?) + Holloway + + + + + + + + + + + + + + M + + ?? + Demers + + + + + M + + Robert W. + Garner + + + + + + + + + + + + + + + + + + + F + + Adria Maria + Сергеев + + + + + + + + + + + + + + F + + Jacqueline Denise + Сергеев + + + + + + + + + + + + + M + + Joshua David + Сергеев + + + + + + + + + + + + + F + + Joy + Gibbs + + + + + + F + + Allison Renee + Garner + + + + + + + + + + + + F + + Amy Elizabeth + Garner + + + + + + + + + + + + M + + Hill + + + + + + F + + Jo Lynn + Hill + + + + + + + + + + + + F + + Leigh Ann + Hill + + + + + + + + + + + + M + + Sean Michael + Hill + + + + + + + + + + + + F + + Phoebe Emily + ZieliÅ„ski + + + + + + + + + + + + + + + + + + + F + + Lori + Crawford + + + + + + F + + Lori + Gibbs + + + + + + M + + ?? + Demers + + + + + + M + + Robert? + Mullins + + + + + + + + + + + + + + + + + + F + + Ellender + Houston + + + + + + + + + + + + + + + + + F + + Margaret(?) + Орлов + + + + + + + + + + + + + + F + + Sarah + Holloway + + + + + + + + + + + + + + + M + + Steven Matthew + Weaver + + + + + + + + + + M + + Justin Matthew + Weaver + + + + + + + + + + + + + M + + Nicholas Ian + Matthews + + + + + + + + + + + + + F + + JenniferMae(Ganoe) + Warner + + + + + + + + + + + + + + F + + Matea Elizabeth + Willis + + + + + + + + + + + + + M + + Cole Randall + Poulsen + + + + + + + + + + + + + F + + LeAnn + Hayes + + + + + + + + + + + + F + + Madeleine Christine + Welch + + + + + + + + + + + + + M + + Steve + Graham + + + + + + M + + Mark + Townsend + + + + + + M + + Douglas + Wilson + + + + + + M + + Kevin Wayne + West + + + + + + + + + + + + + M + + Jeffery + Alvarado + + + + + + + + + + + + F + + Nicole Lynn + Warner + + + + + + + + + + + + + F + + Anita Irene + Phillips + + + + + + + + + + + + + F + + Mattea Elizabeth + Willis + + + + + + + + + + + + + M + + John III + Rubio + + + + + + M + + William Waller + Brooks + + + + + + + + + + + + + + + F + + Lucy + ВаÑильев + + + + + + + + + + + + + + M + + Marquis IV + Brooks + + + + + + + + + + + + M + + Henry + Brooks + + + + + + M + + Spencer + Brooks + + + + + + F + + Isabella + Brooks + + + + + + M + + Fielding + Brooks + + + + + + U + + William + Brooks + + + + + + F + + Mary Anne + Marín + + + + + + + + + + + + + + M + + Christopher Arthur + Warner + + + + + + + + + + + + + U + + Miriam + Brooks + + + + + + U + + George + Brooks + + + + + + F + + Isabella + Guzman + + + + + + + + + + + + + + M + + Guillaume de + Brooks + + + + + + + + + M + + Thomas + Grant + + + + + M + + Lewis + Garner + + + + + + + + + + + + + + + + + + M + + Anderson + Garner + + + + + + + + + + + + + + + + + + F + + Cora Ellen + Jackson + + + + + + M + + Willoughby M. + Тимофеев + + + + + + + + + + + + + + + + + + F + + Mary Ann + Тимофеев + + + + + + + + + + + + + + + + + + M + + Michael Edward + Warner + + + + + + + + + + + + + M + + John P. + Тимофеев + + + + + + + + + + U + + Sarah Jane + Тимофеев + + + + + + + + + + F + + Тимофеев + + + + + + + + + F + + Phebe + Garner + + + + + + + + + + + + + F + + Mary J. + Garner + + + + + + + + + + + + + + + + F + + Mary M. + Garner + + + + + + + + + + + + + + + + F + + Garner + + + + + + F + + Rebecca Catharine + Garner + + + + + + + + + + + + + + + + + + + M + + John B. + Ramírez + + + + + + F + + Zelpha Josephine + Carr + + + + + + + + + + + + + + + + + + + F + + Jamie Lee + Flores + + + + + + + + + + + + + M + + John Morgan + Floyd + + + + + + F + + Iola Elizabeth Betty + Garner + + + + + + + + + + + + + + + + + + + M + + Stephen Jacob + Ford + + + + + + M + + Robert F. + Garner + + + + + + + + + + + + + + + + + + + F + + Mary Jane + Cannon + + + + + + F + + Emma A. + Garner + + + + + + + + + + + + + + + + F + + Anetta + Garner + + + + + + + + + + + + + + + + + + + M + + Frank R. + Parker + + + + + + F + + Antoinette + Garner + + + + + + + + + + + + + F + + Catherine + Rhodes + + + + + + + + + + + + + + F + + Melissa Lee + Warner + + + + + + + + + + + + + M + + Don + Muñoz + + + + + M + + Don + Wheeler + + + + + + M + + Edward + Reed + + + + + + + + + + + + + + + F + + Ellen + Reed + + + + + + + + + + F + + Sarah + Reed + + + + + + + + + + F + + Catherine + Reed + + + + + + + + + + + + + + + M + + Patrick + Reed + + + + + + + + + + + + + + F + + Mary + 伊藤 + + + + + + + + + M + + William + Jordan + + + + + + F + + Katherine + Казанцев + + + + + + + + + + + + + M + + Martin Kelly + Gosselin + + + + + + + + + + + + F + + Pearline + Washington + + + + + + M + + John + Dean + + + + + + F + + Margaret + Bernier + + + + + + + + + + M + + Eugene Stanley + Hudson + + + + + F + + Hannah + Kowalski + + + + + + + + + + + + + + + M + + John + Kowalski + + + + + + + + + + + + + + F + + Alice + Wells + + + + + + + + + + + + + + M + + Thomas + Kowalski + + + + + + + + + + F + + Alice + Santos + + + + + + + + + + M + + John + Ramos + + + + + + + + + + M + + David Martin + Gosselin + + + + + + + + + + + + + F + + Margaret + Curtis + + + + + + + + + + + M + + Thomas + Гончаров + + + + + + M + + John + Curtis + + + + + + F + + Margaret + Gibbs + + + + + + + + + + M + + Robert + Molina + + + + + + + + + + + M + + Robert + Guerrero + + + + + + + + + + M + + Robert + Guerrero + + + + + + + + + + M + + Walter + Guerrero + + + + + + + + + + M + + Walter + Guerrero + + + + + + + + + + M + + Walter + Guerrero + + + + + + M + + Joel Thomas + Gosselin + + + + + + + + + + + + + F + + Sarah + Pratt + + + + + + F + + Mary Meriwether + Vaughn + + + + + + + + + + + + + + F + + Susannah + Murray + + + + + + + + + + F + + Elizabeth + Mazur + + + + + + + + + + + + + + M + + William + Mazur + + + + + + + + + F + + Margaret + Crawford + + + + + + + + + + + + + M + + John + Reynolds + + + + + + + + + + + + + + + F + + Sarah + Ковалев + + + + + + + + + + + + + + + + M + + Lodowick + Elliott + + + + + + M + + Ralph + Goodman + + + + + + + + + + + + + + F + + Andrea Lynn + Gosselin + + + + + + + + + + + + + F + + Martha + Powell + + + + + + + + + + + + + + M + + John + Reynolds + + + + + + + + + + F + + Elizabeth + Stevens + + + + + + + + + + M + + Nicholas + Murray + + + + + + + + + M + + John + Lapointe + + + + + + + M + + William + Дмитриев + + + + + + + + + + + + + + F + + Sarah + Page + + + + + + F + + new + Thomsen + + + + + M + + Charles + Дмитриев + + + + + + + + + + + + F + + Mary + Дмитриев + + + + + + + + + + M + + Lawrence Paul + Hale + + + + + + + + + + + + + + M + + Swanson + Bédard + + + + + + F + + Lucy + Дмитриев + + + + + + + + + + M + + Charles + Erickson + + + + + + M + + Isaac + Дмитриев + + + + + + + + + + + + M + + Lazarus + Дмитриев + + + + + + + + + + + + M + + James + Дмитриев + + + + + + + + + + + + M + + Veltin + Ðиколаев + + + + + + M + + Quirinus + Bishop + + + + + + + + + + + + + + F + + Maria + Simmons + + + + + + + + + + M + + Conrad + Webster + + + + + + M + + Joseph Brendan + Hale + + + + + + + + + + + + + F + + Margaretha + Castillo + + + + + + F + + Catherine + Madsen + + + + + + M + + William + Lapointe + + + + + + + M + + Sir Thomas + Lapointe + + + + + + M + + Peter + Baldwin + + + + + + F + + Ðикифоров + + + + + + F + + Jane + Комаров + + + + + + M + + William + Swanson + + + + + + + + + + + + + + + + F + + Elizabeth + Jensen + + + + + + M + + Richard + Swanson + + + + + + + + + + + + + + + M + + Arthur Maurice + Warner + + + + + + + + + + + + + + M + + Michael Patrick + Hale + + + + + + + + + + + + + F + + Avis + Fernández + + + + + + M + + William (Rev.) + Diaz + + + + + + + + + + + + + + F + + Fay + Hoffman + + + + + + M + + Edward + Swanson + + + + + + M + + John + Swanson + + + + + + U + + Urselie + Diaz + + + + + + U + + Clemence + Diaz + + + + + + M + + John + Diaz + + + + + + + + + + M + + Cuthbert + Diaz + + + + + + M + + William + Diaz + + + + + + F + + Gina Marie + Hale + + + + + + + + + + + + + M + + John + Diaz + + + + + + M + + James + Diaz + + + + + + F + + Anne + Diaz + + + + + + M + + Gabriel Gustave + 山本 + + + + + + F + + Louise + Соколов + + + + + + F + + Holly Ruth + Сорокин + + + + + + + + + + M + + Robert + Сорокин + + + + + + + + + F + + Candy + Сорокин + + + + + + + + + M + + Elias + Webb + + + + + + F + + Nancy + Gibbs + + + + + + M + + Jeffrey Brian + Hale + + + + + + + + + + + + + M + + Alex + Webb + + + + + + F + + Nancy + Макаров + + + + + + + F + + Sallie + Webb + + + + + + + + + + F + + Mary + Webb + + + + + + + + + + + M + + John + Waters + + + + + + M + + Robert + Webb + + + + + + M + + R. Eaken + Webb + + + + + + F + + Nancy + Webb + + + + + + F + + Mary + Webb + + + + + + + + + + + M + + William John + Webb + + + + + + + + + + + + + + F + + Elizabeth + George + + + + + + + + + + + + F + + Sarah Margarite + Webb + + + + + + + + + + M + + Charles Leroy Boyd + Webb + + + + + + + + + + M + + John McCrea + Webb + + + + + + + + + + M + + James McPheeters + Webb + + + + + + + + + + M + + Newton Kitridge + Webb + + + + + + + + + + + + + + + + + + M + + Joseph + Макаров + + + + + + + + + + F + + Martha Ann + Wagner + + + + + + M + + James Marshall + Webb + + + + + + + + + + + + + + + + + + + M + + Stephen Gerard + Garner + + + + + + + + + + + + + M + + Charles Edward + Webb + + + + + + + + + + F + + Judith Ellen + Ballard + + + + + + + + + + + + M + + William Herman + Webb + + + + + + + + + + + + + + + M + + Noble A. + Webb + + + + + + + + + + + + + + M + + George + Warner + + + + + + M + + Samuel Harvey + Warner + + + + + + F + + Amanda + Warner + + + + + + M + + Eden + Warner + + + + + + F + + Mary + Warner + + + + + + M + + Daniel Patrick + Garner + + + + + + + + + + + + + F + + Eliza Frances + Warner + + + + + + F + + Lucy + Warner + + + + + + M + + David Brant + Warner + + + + + + M + + Lewis + Warner + + + + + + M + + Sylvester + Warner + + + + + + M + + Edward Randolph + Warner + + + + + + F + + Sarah Jane + Walker + + + + + + M + + Christopher + Warner + + + + + + M + + Greenleaf + Warner + + + + + + F + + unnamed girl + Warner + + + + + + + + + + + + + + M + + Michael Warren + Warner + + + + + + + + + + + + + + + M + + Ezra + Warner + + + + + + F + + Dorcas + Warner + + + + + + M + + Johnathan + Warner + + + + + + M + + Humphrey Martin + Warner + + + + + + M + + Randolph + Warner + + + + + + M + + Edward + Warner + + + + + + M + + William Waller + Warner + + + + + + M + + Nathaniel M. + Warner + + + + + + F + + Eunice + Warner + + + + + + F + + Sarah Maria + Warner + + + + + + M + + David Luther + Warner + + + + + + + + + + + + + + M + + John Quincy Adams + Warner + + + + + + U + + Warner + + + + + + M + + Dr. Brent + Богданов + + + + + + M + + Jacob + Farmer + + + + + + + + + + F + + Mary Elizabeth + Морозов + + + + + + + + + M + + Johann Simon + Beaulieu + + + + + + + + + + F + + Anna Maria + Григорьев + + + + + + + + + M + + Johann Michael + Beaulieu + + + + + + + + + + F + + Anna Elisabeth + López + + + + + + + + + M + + Johann Simon + Beaulieu + + + + + + + + + + M + + Donald Louis + Warner + + + + + + + + + + + + + + F + + Anna Margaretha + Holland + + + + + + + + + M + + Simon + Farmer + + + + + + + + + + + + + F + + Susan + Баранов + + + + + + + + + F + + Caroline + Farmer + + + + + + + + + + M + + Peter + Shelton + + + + + + F + + Elizabeth + Farmer + + + + + + + M + + new + Thomsen + + + + + + F + + Magdalena + Farmer + + + + + + + + + M + + Valentine + Farmer + + + + + + + + + + + + + F + + Anna Catherine + Miller + + + + + + M + + Robert Eugene + Warner + + + + + + + + + + + + + + M + + George William + Farmer + + + + + + + F + + Mary + Bradley + + + + + + + + + F + + Susanna + Farmer + + + + + + + + + + M + + Jacob + Taylor + + + + + + + + + F + + Anna Marie + Farmer + + + + + + + + + + M + + Jacob + Dubé + + + + + + M + + Peter Simon + Farmer + + + + + + + + + + + + + F + + Elizabeth + Bowen + + + + + + F + + Elizabeth + Farmer + + + + + + + + + + M + + George + Patterson + + + + + + M + + Fred Loren + Warner + + + + + + + + + + + + + + M + + Richard Kenneth + Warner + + + + + + + + + + + + + + + F + + Eva + Farmer + + + + + + + + + + + + + M + + George + Butler + + + + + + F + + Catharine + Farmer + + + + + + + + + + M + + Samuel + Ford + + + + + + M + + Michael + Farmer + + + + + + + + + + F + + Elizabeth + Dubé + + + + + + + + + M + + Johann Adam + Beaulieu + + + + + + + + + M + + Johann Valentin + Beaulieu + + + + + + + + + + F + + Elisabeth Margaretha + Morgan + + + + + + + + + M + + Johann Franciskus + Beaulieu + + + + + + + + + + + + + M + + Andrew Vincent + Walker + + + + + + + + + + + + + + F + + Anna Gertrude + Barnett + + + + + + + + + F + + Anna Maria + Beaulieu + + + + + + + + + + + + F + + Anna Eva + Hicks + + + + + + + + + + + + + M + + Johann Adam + Frazier + + + + + + + + + F + + Anna Margaretha + Beaulieu + + + + + + + + + + + + + M + + Johann Walter + Frazier + + + + + + + + + F + + Anna Elisabeth + Beaulieu + + + + + + + + + + + + + M + + Valentine + Steele + + + + + + M + + Johann Valentin + Beaulieu + + + + + + + + + + + + + F + + Maria Margaretha + Frazier + + + + + + + + + F + + Dorothy Louise + Lessard + + + + + + + + + + + + + + F + + Anna Catharina + Beaulieu + + + + + + + + + F + + Anna Maria + Beaulieu + + + + + + + + + + + + + M + + Jakob + Hardy + + + + + + + + + M + + Johann Adam + Beaulieu + + + + + + + + + + + + + F + + Anna Eva + Michaud + + + + + + + + + M + + Johann Theobald + Beaulieu + + + + + + + + + + + + + F + + Anna Maria + Sutton + + + + + + + + + F + + Anna Ottilia + Beaulieu + + + + + + + + + + + + + M + + Hans Valentin + López + + + + + + F + + Anna Eva + Beaulieu + + + + + + + + + + + + + F + + Mary Alice + Lessard + + + + + + + + + + + + + + M + + Valentin + Michaud + + + + + + + + + F + + Anna Margaretha + Beaulieu + + + + + + + + + + M + + Johann Adam + ÐлекÑандров + + + + + + + + + M + + Johann Simon + Beaulieu + + + + + + + + + + + + + F + + Anna Margaretha + ÐлекÑандров + + + + + + + + + + + + F + + Alecia "Allie" Clare + Garner + + + + + + + + + + + + + M + + John + ВлаÑов + + + + + + U + + Gibbs + + + + + U + + Gibbs + + + + + F + + Emma Jane + Lessard + + + + + + + + + + + + + + + F + + Elizabeth Therese + Marín + + + + + + + + + + + + + + + + + + F + + Mary Anne + Кузьмин + + + + + M + + Howard Lane + Hudson + + + + + M + + Howard Lane + Hudson + + + + + M + + Conrad + КолеÑников + + + + + + F + + Amanda E. + Jiménez + + + + + + + + + + + + + + + + + M + + Nathan M. + Jiménez + + + + + + + + + + + + + + + + + M + + James T. + Jiménez + + + + + + + + + + + + + + + + + + M + + John T. L. + Jiménez + + + + + + + + + + + + + + + + + + F + + Mary C. + Jiménez + + + + + + + + + + + + + + + + + + F + + Nancy E. + Jiménez + + + + + + + + + + M + + Eugene Stanley, Jr. + Garner + + + + + + + + + + + + + + + M + + Richard? Cornelius + Jiménez + + + + + + + + + + F + + Lucinda + Jiménez + + + + + + + + + + F + + Zorada + Domínguez + + + + + + + + + + M + + James W. + Lévesque + + + + + + + + + + + + + + F + + Izora + Lessard + + + + + + + + + + + + + + + M + + Charles Newton + Boyd + + + + + + + + + + + + + F + + Elizabeth + Domínguez + + + + + + F + + Olive + Lévesque + + + + + + + + + + F + + Jennie + Lévesque + + + + + + + + + + F + + Wilma + Lévesque + + + + + + + + + + + M + + John Roger + Garner + + + + + + + + + + + + + + M + + ?? + Gilbert + + + + + + F + + Elsie + Lévesque + + + + + + + + + + + M + + ?? + Mack + + + + + + F + + Mary + Lévesque + + + + + + + + + + + M + + ?? + Blais + + + + + + M + + John C. + Lévesque + + + + + + + + + + M + + Clarence + Lévesque + + + + + + + + + + M + + Howard + Lévesque + + + + + + + + + + F + + Sarah M. + Jiménez + + + + + + + + + + F + + Mary C. + Jiménez + + + + + + + + + + F + + Julia Angeline + Warner + + + + + + + + + + + + + + + + + M + + Armand E. + Jiménez + + + + + + + + + + M + + Tolbert A. + Jiménez + + + + + + + + + + M + + Lincoln F. + Jiménez + + + + + + + + + + M + + Philip + Jiménez + + + + + + + + + + M + + George H. + Jiménez + + + + + + + + + + F + + Mahala + Domínguez + + + + + + + + + + F + + Elizabeth + Page + + + + + + + + + + + + + + M + + James + Neal + + + + + + + + + + M + + Andrew + Neal + + + + + + + + + + F + + Belle + Neal + + + + + + + + + + + + + + + F + + Mary Grace Elizabeth + Warner + + + + + + + + + + + + + + + + + + M + + James + Neal + + + + + + + + + + M + + John + Neal + + + + + + + + + + + + + + + F + + Margaret + Neal + + + + + + + + + + + M + + Schneider + + + + + + F + + Matilda + Neal + + + + + + + + + + + + + + M + + William + Waters + + + + + + + + + + + + + + + + + M + + David + Neal + + + + + + + + + + M + + Robert + Page + + + + + + + + + + + + + + + F + + Margaret + Page + + + + + + + + + + + + + + + + + + + M + + Joseph William + Marín + + + + + + + + + + + + + + + + + + M + + George + Jankowski + + + + + + + + + + + + + + + + + + M + + Robert + Jankowski + + + + + + + + + + + + + + + + + + F + + Sarah + Jankowski + + + + + + + + + + + + + + + M + + John + Sanz + + + + + + + + + + + + + M + + Willie + Jankowski + + + + + + + + + + + + + + M + + John + Jankowski + + + + + + + + + + + + + + + + + + F + + Isabella Belle + Jankowski + + + + + + + + + + + + + + + M + + Thomas + Lewandowski + + + + + + M + + George Jr. + Jankowski + + + + + + + + + + + + + + + + + + F + + Matilda + Jankowski + + + + + + + + + + + + + + + F + + Marcia Jane + Warner + + + + + + + + + + + + + + M + + Dwight Billington + Osborne + + + + + + + + + + + + M + + Wilford + Owens + + + + + + M + + David + Jankowski + + + + + + + + + + + + + + + + + + F + + Margaret Jane "Maggie" + Jankowski + + + + + + + + + + + + + + + M + + Thomas + Черкашин + + + + + + + + + + + + + F + + Minnie + Jankowski + + + + + + + + + + + + + + + M + + Ernest + Romero + + + + + + M + + John James + Page + + + + + + + + + + + + + + + + + + + + F + + Margaret + Mcdaniel + + + + + + + + + + F + + Minnie + Adkins + + + + + + + + + + F + + Ferne + Page + + + + + + + + + + + M + + Earl William + Данилов + + + + + + M + + Raymond + Ortiz + + + + + + M + + Robert Francis + Page + + + + + + + + + + F + + Florence + Page + + + + + + + + + + + + + + + M + + Dean + McCormick + + + + + + M + + George Kenneth (Red) + Page + + + + + + + + + + + + + + + + + + M + + Everett Glenn (Ezra) + Page + + + + + + + + + + F + + Mildred + Page + + + + + + + + + + + M + + Wong + + + + + + F + + Maude + Page + + + + + + + + + + + + + + + + + + M + + Elmer + Page + + + + + + F + + Eileen Ruth + Pearson + + + + + + + + + + + + M + + John + Page + + + + + + F + + Edith (Dolly) + Page + + + + + + + M + + Daniels + + + + + + F + + Anna + Page + + + + + + + + + + + M + + Thomas + Cross + + + + + + + + + + F + + Alta M. + Cross + + + + + + + + + + + + + + + + + + + M + + Frank O. + Peters + + + + + + + + + M + + Ralph (Scotty) + Cross + + + + + + + + + + F + + Loraine (Fanny) + Cross + + + + + + + + + + F + + Evelyn + Cross + + + + + + + + + + F + + Marylou + Мельников + + + + + + + + + + + + + F + + Louise + Cross + + + + + + + + + + M + + John + Cross + + + + + + + + + + F + + Gertrude + Cross + + + + + + + + + + + + + + + + + + + M + + Teddy C. + Armstrong + + + + + + + + + + + + + + F + + Mary + Page + + + + + + + + + + + + + + + F + + Rebecca + Page + + + + + + + + + + + + + + F + + Belle + Page + + + + + + + + + + + + + + + M + + Morin + + + + + + + + + + F + + Matilda + Page + + + + + + + + + + + + + + + M + + Christy + Moss + + + + + + + + + + F + + Mary Elizabeth + Barber + + + + + + + + + + + + + M + + Cecil + Waters + + + + + + + + + + + + + + + M + + Cecil Glenn + Waters + + + + + + + + + + + + + F + + Grace + Фомин + + + + + + F + + Donna + Hubbard + + + + + + + + + M + + Randy + Waters + + + + + + + + + F + + Debby + Waters + + + + + + + + + F + + Sarah + Armstrong + + + + + + + M + + Reyes + + + + + + F + + Linda + Armstrong + + + + + + F + + Dorothy + Peters + + + + + + + F + + Merida Lorene + Robbins + + + + + + + + + + + + + M + + Gross + + + + + + F + + Eleanor + Peters + + + + + + F + + Belle Irene + Schneider + + + + + + + + + + + + F + + Helen M. + Neal + + + + + + + + + + + M + + Adrian + Bélanger + + + + + + M + + Donald + Bélanger + + + + + + + + + + + F + + Joanne + Pierce + + + + + + F + + Amy Jo + Bélanger + + + + + + + + + + M + + Don + Ortiz + + + + + + + + + + F + + Shirley + Welch + + + + + + F + + Joy A. + Wade + + + + + + F + + Rhonda + Lynch + + + + + + + + + F + + Nancy + Lynch + + + + + + M + + Ted + Ortiz + + + + + + M + + Jacob W. + Alvarado + + + + + + + + + + + + + + M + + John + Alvarado + + + + + + + + + + + F + + Eliza + Alvarado + + + + + + + + + + + M + + Franklin + Alvarado + + + + + + + + + + + M + + William + Alvarado + + + + + + + + + + + M + + Thomas C. + Alvarado + + + + + + + + + + + F + + Mary Helen + Черных + + + + + + + + + + + + + M + + Marshall + Alvarado + + + + + + + + + + + M + + James + Alvarado + + + + + + + + + + + + + + M + + William + Douglas + + + + + + + + + + + + + + F + + Eliza Jane + Douglas + + + + + + + + + + + + + + M + + Hines + + + + + + M + + Charles + Douglas + + + + + + + + + + M + + Jacob + Douglas + + + + + + + + + + F + + Mary Wein + Greer + + + + + + M + + William + Douglas + + + + + + + + + + M + + Frank + Douglas + + + + + + + + + + M + + Michael Louis + Warner + + + + + + + + + + + + + + M + + Arthur + Douglas + + + + + + + + + + M + + Charles + Alvarado + + + + + + + + + + + + + + F + + Marsha + Alvarado + + + + + + + + + + + + + + F + + Pamela + James + + + + + + M + + Capt. + Boyd + + + + + + F + + Comfort + Hodges + + + + + + F + + Martha + Moody + + + + + + F + + Mary + Медведев + + + + + + F + + Jane + Bouchard + + + + + + F + + Elizabeth + Douglas + + + + + + + + + + + F + + Betty Louise + Warner + + + + + + + + + + + + + M + + Julius + Gauthier + + + + + + + + + + M + + Jacob + Douglas + + + + + + + + + + + + + + F + + Catherine + Douglas + + + + + + + + + + + M + + Alfred + Douglas + + + + + + + + + + + + + + F + + Ellen + Douglas + + + + + + + + + + + F + + Lucinda J. + Douglas + + + + + + + + + + + M + + Samuel + Douglas + + + + + + + + + + F + + Susan + Douglas + + + + + + + + + + + M + + John + Douglas + + + + + + + + + + + + + + M + + Montgomery + Parent + + + + + + + + + + + M + + Barry Joseph + Garner + + + + + + + + + + + + + + M + + John William + Warner + + + + + + + + + + + + + + F + + Nancy + Parent + + + + + + M + + John + Parent + + + + + + M + + Harry + Parent + + + + + + M + + Jacob G. + Parent + + + + + + F + + Patsy + Parent + + + + + + M + + Abraham + Douglas + + + + + + M + + Jacob + Douglas + + + + + + M + + Samuel + Douglas + + + + + + M + + John + Douglas + + + + + + U + + Douglas + + + + + + F + + Beverly Ann + Warner + + + + + + + + + + + + + + F + + Barbara + Rogers + + + + + + + + + + + + M + + Thomas + Hernández + + + + + + M + + Thomas + Kelley + + + + + + M + + Edgar + Douglas + + + + + + M + + Henry + Parsons + + + + + + M + + Reuben + Павлов + + + + + + M + + Thomas + Павлов + + + + + + + + + + M + + Calvin + Павлов + + + + + + + + + + M + + William + Ðндреев + + + + + + F + + Christena Wiseman + Larson + + + + + + + + + + + + + + M + + David Warren + Warner + + + + + + + + + + + + + + F + + Catherine + Douglas + + + + + + M + + Johnathon + Douglas + + + + + + M + + Frederick + Douglas + + + + + + F + + Elizabeth + Douglas + + + + + + F + + Barbara + Douglas + + + + + + M + + Peter + Douglas + + + + + + M + + Frederick + Douglas + + + + + + M + + Henry + Douglas + + + + + + M + + Andrew + Douglas + + + + + + F + + Leonnah + Cummings + + + + + + M + + Harold Lowell + Warner + + + + + + + + + + + + + + M + + Hugh + James + + + + + + M + + Robert + James + + + + + + + + + M + + Joseph + James + + + + + + M + + William + James + + + + + + + + + F + + Mary + James + + + + + + + + + + M + + Mr. + Gibson + + + + + + F + + Martha + James + + + + + + + + + + M + + Mr. + Page + + + + + + F + + Jane + James + + + + + + + + + M + + John + James + + + + + + + + + F + + Martha Ellen + Warner + + + + + + + + + + + + + + + M + + James + + + + + + + + + M + + Hugh Jr. + James + + + + + + + + + + + + + + + F + + Molly + James + + + + + + + + + + + M + + Joseph + James + + + + + + + + + + + + + + + M + + Thomas + James + + + + + + + + + + + + M + + Isaac + James + + + + + + + + + + + M + + Walter Crockett + James + + + + + + + + + + + + F + + Patsy + James + + + + + + + + M + + Henry + Lavoie + + + + + + F + + Margaret Ruth + Warner + + + + + + + + + + + + + + M + + Mathias + Santiago + + + + + + M + + Dr. John + Poole + + + + + + F + + Lucy + Poole + + + + + + F + + Polly + Poole + + + + + + M + + Thomas + Poole + + + + + + F + + Patsy + Alvarado + + + + + + + F + + Polly + Parent + + + + + + + + M + + Herod + Быков + + + + + + F + + Harriet + Быков + + + + + + + F + + Nancy Elizabeth + Warner + + + + + + + + + + + + + + M + + Philip + Taylor + + + + + + M + + Charles + Быков + + + + + + + F + + Margaret + Girard + + + + + + F + + Margaret + Быков + + + + + + + M + + George + Moore + + + + + + M + + Samuel + Быков + + + + + + + F + + Nelly + Larsen + + + + + + F + + Janie + Быков + + + + + + + M + + Joseph + Logan + + + + + + F + + Annie + Быков + + + + + + + F + + Sarah Jane + Warner + + + + + + + + + + + + + + M + + Henry + King + + + + + + F + + Bettie + Быков + + + + + + + M + + John W. + Bergeron + + + + + + M + + Mr. + Lawson + + + + + + M + + John + Lawson + + + + + + F + + Phoebe + Lawson + + + + + + M + + Willard + Lawson + + + + + + F + + Permelia + Lawson + + + + + + F + + Susan + Lawson + + + + + + M + + Henry Clay + Parent + + + + + + F + + Mary Christine + Warner + + + + + + + + + + + + + + M + + Thomas Stewart + Benson + + + + + + + + + + M + + John + Benson + + + + + + + + + + M + + James Edwin + Benson + + + + + + + + + + M + + Jason Spotswood + Benson + + + + + + + + + + F + + Elizabeth + Benson + + + + + + + + + + F + + Martha Ellen + Benson + + + + + + + + + + U + + Benson + + + + + + U + + Benson + + + + + + M + + James + Benson + + + + + + + + + + M + + Robert Watkins + Benson + + + + + + + + + + F + + Stephanie Sue + Warner + + + + + + + + + + + + + U + + Louise DeSoix + Benson + + + + + + + + + + F + + Mary Frances + Benson + + + + + + + + + + F + + Elizabeth + Benson + + + + + + + + + + M + + Gabriel Gustav + 山本 + + + + + + + + + + M + + Walter + Benson + + + + + + + F + + Margaret Steel + Ellis + + + + + + M + + Hugh + Benson + + + + + + + F + + Rebecca + Ouellet + + + + + + M + + Robert + Benson + + + + + + + + + + M + + Samuel Sr. + Benson + + + + + + + + + + F + + Anne Therese + Garner + + + + + + + + + + + + + + M + + Stephen Paul + Warner + + + + + + + + + + + + + + F + + Jane + Wong + + + + + + F + + Mary + Benson + + + + + + + M + + Jacob + ÐлекÑеев + + + + + + F + + Elizabeth + Benson + + + + + + + M + + William + Pedersen + + + + + + F + + Nancy + Benson + + + + + + + M + + Henry + Floyd + + + + + + F + + Polly Mary + Jiménez + + + + + + + + + + M + + Thomas + ä¸­æ‘ + + + + + + F + + Elizabeth + Jiménez + + + + + + + + + + + + + M + + Stuart Bogarte + Warner + + + + + + + + + + + + + + M + + Thomas Jr. + Williams + + + + + + M + + James + Williams + + + + + + M + + Andrew + Jiménez + + + + + + + + + + F + + Sarah + Palmer + + + + + + M + + John + Jiménez + + + + + + + + + + + + + F + + Mary + Palmer + + + + + + F + + Sarah + Jiménez + + + + + + + + + + M + + Valentine Thomas + McCarthy + + + + + + F + + Rebecca + Jiménez + + + + + + + + + + M + + Kenner S. + Curry + + + + + + M + + Stanley Louis + Warner + + + + + + + + + + + + + M + + Cornelius + Jiménez + + + + + + + + + + + + + F + + Jane + Blair + + + + + + + + + + + + M + + Mr. + Hébert + + + + + + + + + + M + + Fred + Moss + + + + + + + + + + M + + Thomas + Moss + + + + + + + + + + M + + Henry + Moss + + + + + + + + + + F + + Mary + Moss + + + + + + + + + + F + + Florence + Moss + + + + + + + + + + F + + Mattie + Moss + + + + + + + + + + F + + Margaret + Page + + + + + + + + + + F + + Sharon Lynette + Walker + + + + + + + + + + + + + + + F + + Matilda + Page + + + + + + + + + + M + + John + Page + + + + + + + + + + M + + John H. + Nowak + + + + + + + + + + M + + Dr. Charles J. + Егоров + + + + + + + + + + M + + David + Page + + + + + + + + + + + + + + F + + Ruth Ellen + Page + + + + + + M + + Marvin + Lewandowski + + + + + + M + + Everett + Lewandowski + + + + + + M + + Paul + Lewandowski + + + + + + U + + Carroll + Lewandowski + + + + + + M + + Thomas Frederick + Warner + + + + + + + + + + + + + + M + + Louis + Черкашин + + + + + + + + + M + + Merritt + Черкашин + + + + + + M + + Richard C. + Page + + + + + + + + + + F + + D. + WiÅ›niewski + + + + + + F + + Nancy + Floyd + + + + + + + + + + + + + + F + + Martha + Andersen + + + + + + F + + Betsy + Parent + + + + + + F + + Kate Teel + Marshall + + + + + + M + + Col. Robert + Strickland + + + + + + F + + Nancy + Hernández + + + + + + F + + Shirley Kay + Warner + + + + + + + + + + + + + + F + + Margaret + Захаров + + + + + + F + + Edith + Waters + + + + + + + + + + + M + + Mr. + Young + + + + + + F + + Nellie + Waters + + + + + + + + + + + M + + Mr. + å°æž— + + + + + + F + + Lola + Waters + + + + + + + + + + + M + + Mr. + Grabowski + + + + + + M + + William + Waters + + + + + + + + + + M + + Everett + Waters + + + + + + + + + + F + + Helen M. + Rodriguez + + + + + + M + + Robert Douglas + Warner + + + + + + + + + + + + + + M + + Kenneth Fritz + Page + + + + + + + + + + + F + + June Christine + Pittman + + + + + + + + + M + + Brandon Kelly + Page + + + + + + + + + + + + + M + + Joseph LeRoy + Webb + + + + + + + + + + F + + Lucinda E. + Webb + + + + + + + + + + M + + Homer + Webb + + + + + + F + + Catherine + Delgado + + + + + + + + + + + M + + Archibald + Serrano + + + + + + + + + + + + + + + + + M + + Joseph + Serrano + + + + + + + + + + + + + + + + + + + M + + Joseph + Serrano + + + + + + + + + + + F + + Kathryn Louise + Данилов + + + + + + + + + + + + + + M + + Abraham + Quinn + + + + + + + + + + + + + F + + Elizabeth Marium + Quinn + + + + + + + + + + + + + + + M + + Abraham + Serrano + + + + + + + + + + + M + + Henry + Blanco + + + + + + + + + + F + + Peggy + Fournier + + + + + + M + + Peter + Blanco + + + + + + + F + + Catherine + Leonard + + + + + + F + + Mary + Blanco + + + + + + F + + Elizabeth + Blanco + + + + + + F + + Margareta + Blanco + + + + + + F + + Elaine Suzanne + Данилов + + + + + + + + + + + + + + F + + Barbara + Blanco + + + + + + F + + Catarina + Blanco + + + + + + M + + John + Johansen + + + + + + + + + + + + + + M + + Samuel + Blanco + + + + + + + + + + + + + M + + Daniel + Blanco + + + + + + + + + + + + F + + Anna Maria + Blanco + + + + + + + M + + Adam + Stephens + + + + + + F + + Carrie + Serrano + + + + + + + + + + + M + + Roy + Hammond + + + + + + F + + Dot + Serrano + + + + + + + + + + + M + + Darrell Edwin + Данилов + + + + + + + + + + + + + + M + + Charles + Day + + + + + + M + + O. D. + Little + + + + + + M + + Ernest Arlington + Webb + + + + + + + + + + + + + + M + + James + Webb + + + + + + + + + + M + + John David + Webb + + + + + + M + + David Festus + Webb + + + + + + + + + + + + + M + + James Leslie + Webb + + + + + + + + + + + + + M + + Gerard Stephen + Garner + + + + + + + + + + + + + + F + + Barbara Joanne + Данилов + + + + + + + + + + + + + + M + + Michael Christie + Webb + + + + + + + + + + + + + F + + Anna Mabel + Webb + + + + + + + + + + + + + + F + + Mary Ruth + Webb + + + + + + + + + + + + + M + + Harry Noble + Webb + + + + + + + + + + + + + F + + Frances Mae + Webb + + + + + + + + + + + + + M + + Phillip D. + Ford + + + + + + + + + M + + Robert B. + 鈴木 + + + + + + M + + Cliff + Parks + + + + + + + + + M + + Robert + Lessard + + + + + + M + + Rodriquez + + + + + + F + + Lucinda Elinor + Данилов + + + + + + + + + + + + + + M + + John + Rodriquez + + + + + + + + + + + F + + Eve + ПолÑков + + + + + + + + + + + + + M + + William Frederick + Rodriquez + + + + + + + + + + M + + John + Rodriquez + + + + + + + + + + M + + Alvin + Rodriquez + + + + + + + + + + F + + Elizabeth Jane + Rodriquez + + + + + + + + + + M + + William M. + Rodriquez + + + + + + + + + + F + + Barbara Ann + Rodriquez + + + + + + + + + + + + + + F + + Oma + Rodriquez + + + + + + + + + + F + + Mary Ann + Rodriquez + + + + + + + + + + M + + Paul Daniel + Osborne + + + + + + + + + + + + + F + + Maria Louisa + Rodriquez + + + + + + + + + + M + + Michael Mordica + Rodriquez + + + + + + + + + + M + + Peter + Rodriquez + + + + + + + + + + F + + Mary + Rodriquez + + + + + + + + + + + M + + John + Cook + + + + + + M + + Mordica + Rodriquez + + + + + + + + + + + + + + + + F + + Jane + Казаков + + + + + + + + + + + + + F + + Katherine + Воронов + + + + + + + + + M + + Charles + Rodriquez + + + + + + + + + + M + + James + Rodriquez + + + + + + + + + + F + + Julia Marie + Osborne + + + + + + + + + + + + + M + + Richard + Rodriquez + + + + + + + + + + + F + + Hannah + Жуков + + + + + + F + + Margaret + Rodriquez + + + + + + + + + + M + + Thomas + Rodriquez + + + + + + + + + + F + + Elizabeth + Rodriquez + + + + + + + + + + M + + Dean + Serrano + + + + + + + + + F + + Reh Dawn + Serrano + + + + + + + M + + Martínez + + + + + + M + + Lessard + + + + + + + + + + F + + Mary Josephine + Boucher + + + + + + + + + + F + + Josephine + Pelletier + + + + + + + + + + + + + + + M + + Patrick + Gardner + + + + + + F + + Ellen + Boucher + + + + + + M + + Daniel + Walters + + + + + + F + + Catherine + Boucher + + + + + + + F + + Margaret + Boucher + + + + + + M + + Patrick + Boucher + + + + + + + + + + + F + + Susan + Dennis + + + + + + + + + + M + + James + Bush + + + + + + + + + M + + William + Boucher + + + + + + M + + Thomas + Boucher + + + + + + F + + Louise + Nielsen + + + + + F + + Mary + Boucher + + + + + + M + + Martin + Boucher + + + + + + M + + Patrick + Bush + + + + + + + + + M + + John Joseph + Bush + + + + + + F + + Honora + Bush + + + + + + M + + Martin + Bush + + + + + + F + + Bridget + Bush + + + + + + F + + Catherine + Bush + + + + + + M + + Thomas + Bush + + + + + + M + + Michael Shannon + Boucher + + + + + + + + + + + M + + Francis William + Garner + + + + + + + + + + + + + M + + John + Boucher + + + + + + + F + + woman + Boucher + + + + + + + M + + Garrett + Boucher + + + + + + F + + Kate + Iglesias + + + + + + M + + Bishop Patrick + Boucher + + + + + + + + + + M + + John + Hamilton + + + + + + + + + + + + M + + Joe + St-Pierre + + + + + + + + + M + + Michael + Brady + + + + + + + + + M + + Shane + Brady + + + + + + + + + F + + Clara + Brady + + + + + + + + + M + + Richard Eugene + Garner + + + + + + + + + + + + + + M + + Tony + Brady + + + + + + + + + F + + Roisin + Brady + + + + + + + + + + + + M + + Aidinn + Brady + + + + + + + + + M + + Enda + Brady + + + + + + + + + M + + Paul + Caldwell + + + + + + + + + M + + Colm + Caldwell + + + + + + + + + + + + M + + Niall + Caldwell + + + + + + + + + + + + M + + Fergl + Caldwell + + + + + + + + + + + + M + + Gerry + Hart + + + + + + + + + F + + Laura + Hart + + + + + + + + + M + + Michael Stanley + Garner + + + + + + + + + + + + + + M + + Raymond + Hart + + + + + + + + + + + + F + + Lisa + Hart + + + + + + + + + M + + Paul + Hart + + + + + + + + + M + + Michael + Boucher + + + + + + + + + F + + Michelle + Boucher + + + + + + + + + M + + Tony + Boucher + + + + + + + + + + + + M + + Martin + Boucher + + + + + + + + + F + + Tracy + Boucher + + + + + + + + + M + + John + Lindsey + + + + + + M + + Noah Stuart + Warner + + + + + + + + + + + + + F + + Barbara Jo + Garner + + + + + + + + + + + + + + M + + Michael + Fernandez + + + + + + + + + + M + + Thomas Michael + McCoy + + + + + + + + + + + + + + F + + new + Thomsen + + + + + F + + Mary + Howell + + + + + + + + + + + + + F + + Celine Bridget + McCoy + + + + + + + + + + + + + + M + + Gabriel + Stokes + + + + + + + + + + + + + M + + Liam Michael + Stokes + + + + + + + + + + + + + M + + Canice Oliver + McCoy + + + + + + + + + + + + + F + + Paula + McCoy + + + + + + + + + + + + + + M + + Kieran Thomas + Obrien + + + + + + + + + + + + + M + + David Walter + Garner + + + + + + + + + + + + + F + + Kathryn Mary + Garner + + + + + + + + + + + + + + F + + Orla Sarah + McCoy + + + + + + + + + + + + + M + + Francis + McCoy + + + + + + + + + + + + + + F + + Sarah + Reed + + + + + + + + + + + + + + + M + + Matthew + Reed + + + + + + + + + + + + + F + + Mary + Gibbs + + + + + + + + + + M + + Michael + Reed + + + + + + + + + + M + + Peter + Reed + + + + + + + + + + + + + + + F + + Hanora + Кузнецов + + + + + + + + + M + + Terrence + Reed + + + + + + + + + + + + + + F + + Joan + Reed + + + + + + + + + + + + + + M + + Peter George + Garner + + + + + + + + + + + + + + F + + Peggy + Reed + + + + + + + + + + + + + + F + + Carmel + Reed + + + + + + + + + + + + + + F + + Noreen + Reed + + + + + + + + + + + + + + M + + Valdez + + + + + + M + + Berry + + + + + + M + + БелÑев + + + + + + M + + Duncan + + + + + + + + + + M + + Michael + Duncan + + + + + + + + + + + + + F + + Noella + Duncan + + + + + + + + + F + + Clare + Duncan + + + + + + + + + F + + Bernadette + Garner + + + + + + + + + + + + + + M + + Colin + Duncan + + + + + + + + + F + + Maria + Gibbs + + + + + + + + + M + + Patrick + Reed + + + + + + + + + + + + + + + F + + Anastasia + Reed + + + + + + + + + + + M + + Dawson + + + + + + F + + Catherine + Reed + + + + + + + + + + + + + + M + + Martinez + + + + + + F + + Rose + Reed + + + + + + + M + + Poulin + + + + + + F + + Bridget + Reed + + + + + + + F + + Louella Marie + Garner + + + + + + + + + + + + + + + M + + Федоров + + + + + + F + + Mary Ann + Reed + + + + + + + M + + White + + + + + + F + + Jane + Reed + + + + + + + + + + + + + + M + + Мартынов + + + + + + M + + Patrick + Федоров + + + + + + + + + + M + + Федоров + + + + + + M + + Федоров + + + + + + F + + Федоров + + + + + + F + + Hannah + Reed + + + + + + + + + + + + + F + + Cecilia + Garner + + + + + + + + + + + + + + F + + Ann + McCoy + + + + + + + + + M + + Francis + McCoy + + + + + + M + + Mary + Dawson + + + + + + F + + Elizabeth + Gibbs + + + + + + + + + + M + + Poulin + + + + + + M + + Peter James? + Reed + + + + + + + + + + M + + Owen + Reed + + + + + + + + + + + F + + Bridget Ann + Reed + + + + + + + + + + + + + + F + + Norah + Reed + + + + + + + + + + + + + M + + Terence + Reed + + + + + + + + + + M + + Mark Gerard + Garner + + + + + + + + + + + + + + F + + Catherine + Reed + + + + + + M + + Peter + Reed + + + + + + + + + + F + + Mary + Reed + + + + + + + + + + M + + Reed + + + + + + + + + + M + + Edward + Reed + + + + + + F + + Jane + Reed + + + + + + + M + + KamiÅ„ski + + + + + + M + + Terrence (TyNed) + Reed + + + + + + + + + + + + + + + M + + Michael + Reed + + + + + + + + + + + F + + Alice + Goodwin + + + + + + M + + John Joseph + Garner + + + + + + + + + + + + + + F + + Jenny + Reed + + + + + + + + + + M + + Jamesy + Reed + + + + + + F + + Minnie + Reed + + + + + + + + + + + M + + Johnnie + Sandoval + + + + + + F + + Kate + Reed + + + + + + + + + + M + + Michael + Reed + + + + + + + + + + + + + + F + + Liz + Sandoval + + + + + + + M + + Goodwin + + + + + + M + + Terry + Sandoval + + + + + + M + + John Joe + Sandoval + + + + + + + M + + Ralph Raymond + Lessard + + + + + + + + + + + + + + F + + Jean + Sandoval + + + + + + + M + + Johnston + + + + + + M + + Sean + Sandoval + + + + + + + + + F + + Jennie + Gibbs + + + + + + + + + + M + + Michael + Reed + + + + + + + + + + F + + Mary + Gibbs + + + + + + M + + Thomas + Reed + + + + + + + F + + Carmel + Reed + + + + + + + M + + Love + + + + + + + + + + F + + Maureen + Reed + + + + + + + F + + Susanna Marie + Lessard + + + + + + + + + + + + + + M + + John Noel + Reed + + + + + + M + + Thomas + Reed + + + + + + M + + Brendan + Reed + + + + + + M + + Jimenez + + + + + + M + + George + Payne + + + + + + M + + Fielding + Payne + + + + + + + + + + + F + + Dorcas C. + Lawrence + + + + + + F + + Winifred + Payne + + + + + + + + + + + M + + William + Ford + + + + + + F + + Nancy + Payne + + + + + + F + + Helen Belle + Lessard + + + + + + + + + + + + + + + F + + Lucretia + Payne + + + + + + M + + Moses + Payne + + + + + + M + + James + Payne + + + + + + + + + + M + + Willis + Payne + + + + + + M + + Alexander + Payne + + + + + + + + F + + Catherine + Salazar + + + + + + F + + Elizabeth + KamiÅ„ski + + + + + + F + + Margaret + Newman + + + + + + M + + Robert + Reynolds + + + + + + M + + George + Дмитриев + + + + + + + + + + + + + + M + + Thomas James + Garner + + + + + + + + + + + + + + F + + Laura Eloise + Lessard + + + + + + + + + + + + + + M + + James + Diaz + + + + + + + + + + + + + + + + + + + F + + Nancy + Woods + + + + + + + M + + James + Woods + + + + + + F + + Mary + ЗырÑнов + + + + + + F + + Nancy Ann + Дмитриев + + + + + + + M + + Isaac + Hunt + + + + + + M + + Travis + Дмитриев + + + + + + + + + + + + + + F + + Elizabeth + Payne + + + + + + + + + + + + + M + + William + Дмитриев + + + + + + + + + + + + + + + F + + Polly + Wood + + + + + + + + + + + + + + + F + + Lucy Mabel + Webb + + + + + + + + + + + + + + + + + + M + + Peter + Wood + + + + + + F + + Lucy + Gibbs + + + + + + F + + Margaret Jane + Дмитриев + + + + + + + + + + + + + + + M + + William + Petersen + + + + + + M + + Alexander Carroll Sr. + Дмитриев + + + + + + + + + + + + + + + F + + Mary Polly + Woods + + + + + + + + + + + + + + + F + + Mary Polly + Diaz + + + + + + + + + + + + + + M + + Robert Gove + Doyle + + + + + + + + + + F + + Joane + Swanson + + + + + + M + + Charles + Swanson + + + + + + M + + John Raymond + Webb + + + + + + + + + + + + + + + + + + + M + + Benjamin + Swanson + + + + + + M + + Thomas + Swanson + + + + + + F + + Judith + Swanson + + + + + + M + + Esiquio + Pelletier + + + + + + F + + Sesaria + Leclerc + + + + + + M + + Coleman + + + + + + M + + Jack + Beck + + + + + + M + + Matt + Горбунов + + + + + + F + + Madeline Kathleen + Osborne + + + + + + + + + + + + + M + + John + Reeves + + + + + + M + + Lewis I. + Webb + + + + + + + + + + + + + + + + + + + M + + Mathew + Reeves + + + + + + M + + William + Reeves + + + + + + + + + F + + Elizabeth + Reeves + + + + + + + M + + M. + Perry + + + + + + F + + Bridget + Reeves + + + + + + + M + + J. + Terry + + + + + + F + + Ann + Reeves + + + + + + + + + + + M + + Thomas + Gagné + + + + + + + + + + F + + Catherine + Reeves + + + + + + + + + + + M + + J. + Desjardins + + + + + + M + + Andrew Vincent + Page + + + + + + + + + + + + + + + + + + + M + + John + Reeves + + + + + + + F + + Mary A. + Flowers + + + + + + F + + Elizabeth + Ryan + + + + + + + + + + + + + + M + + David + Foster + + + + + + + + + M + + George + Warner + + + + + + + + + + + + F + + Mary + Warner + + + + + + + + + + + M + + Thomas + Dixon + + + + + + + + + + F + + Hannah + Warner + + + + + + + + + M + + Daniel + Warner + + + + + + + + + + + F + + Charity + Higgins + + + + + + + + + F + + Eleanor Maude + Page + + + + + + + + + + + + + + + + + + + F + + Elizabeth + Warner + + + + + + + + + + F + + Johanna + Warner + + + + + + + M + + Trustum + Лебедев + + + + + + + + + + M + + George + Warner + + + + + + + + + + + F + + Elizabeth + Nichols + + + + + + + + + + + + + + M + + Johnathon + Warner + + + + + + + + + + + + + + F + + Mary + Montgomery + + + + + + + + + + M + + John + Warner + + + + + + M + + John + Warner + + + + + + M + + Robert + Warner + + + + + + + F + + Edith Mae + Page + + + + + + + + + + + + + + + + + + + M + + John + Warner + + + + + + M + + Robert Lee + Ball + + + + + + + + + + F + + Maude Waldon + Ball + + + + + + + + + + + + + + F + + Katie E. + Ball + + + + + + + + + + + + + + F + + Lucy A. + Ball + + + + + + + + + + F + + Ida B. + Ball + + + + + + + + + + F + + Margaret + Ball + + + + + + + + + + F + + Jane + Ball + + + + + + + + + + + F + + Martha + Ball + + + + + + + + + + + F + + Ann Louisa + Snyder + + + + + + + + + F + + Anita June + Osborne + + + + + + + + + + + + + M + + Matthias + Ball + + + + + + + + + F + + Eliza Jane + Gonzalez + + + + + + M + + William M. + Ball + + + + + + M + + John DeKalb + Ball + + + + + + F + + Mary Elizabeth + Ball + + + + + + M + + Nathanial Green + Ball + + + + + + F + + Ida E. + Ball + + + + + + M + + Avery + Gill + + + + + + + + + + + + + M + + Roland + Morris + + + + + + + + + + M + + Carlisle + Morris + + + + + + + + + + M + + Frank + Marín + + + + + + + + + + + + + + M + + Cyrus + Morris + + + + + + + + + + M + + Robert + Morris + + + + + + + + + + F + + Martha + Morris + + + + + + + + + + F + + Mary + Morris + + + + + + + + + + M + + John + Morris + + + + + + + + + + F + + Frances Coppage + Marín + + + + + + + + + + + + + + + + + + + M + + Prince Alfred + Roy + + + + + + M + + John Franklin + Nadeau + + + + + + + + + + M + + Shadrach M. + Munoz + + + + + + M + + Alvah F. + Munoz + + + + + + M + + Albert + Marín + + + + + + + + + + + + + + + + M + + Moses Romulus? + Munoz + + + + + + + + + + M + + Robert + Munoz + + + + + + + + + + M + + Willis E. + Munoz + + + + + + + + + + F + + Lulu + Munoz + + + + + + M + + William + Norris + + + + + + + + + + F + + Mary + Allen + + + + + + + + + + M + + Enos + Allen + + + + + + + + + + + + + + F + + Sarah + Allen + + + + + + + + + + + + + + + M + + Edward + Harrison + + + + + + M + + John + Allen + + + + + + + + + + + + + + + M + + James Jeffrey + Warner + + + + + + + + + + + + + M + + Martin Bogarte + Warner + + + + + + + + + + + + + + + + + + + + M + + Thomas Willis + Marín + + + + + + + + + + + + + + + + F + + Mary (Hannah?) + Dennis + + + + + + F + + Sarah + Ðовиков + + + + + + + + + + F + + Abigail + Allen + + + + + + + + + + + + M + + МакÑимов + + + + + + M + + James + Mendoza + + + + + + M + + Joseph + Allen + + + + + + + + + + F + + Mary + Barker + + + + + + M + + Job + Allen + + + + + + + + + F + + Rachel + Allen + + + + + + + + + + + + + + M + + Thomas + Ðовиков + + + + + + M + + Wilbur + Marín + + + + + + + + + + + + + + F + + Lydia + Allen + + + + + + + + + + M + + Benjamin + Allen + + + + + + + + + + + + + + + F + + Experience + Griffith + + + + + + U + + Lediah + Allen + + + + + + + + + + + + + + F + + Elizabeth + Norris + + + + + + + + + + + + + + + + + + + M + + John + Hernandez + + + + + + M + + Jonathan + Allen + + + + + + + + + + + + + + M + + Gershom + Allen + + + + + + + + + + + + + + + F + + Ann + Kennedy + + + + + + F + + Rosina M. + Gibbs + + + + + + F + + Lilla Estella + Marín + + + + + + + + + + + + + + + F + + Carmen Alberta + Boyd + + + + + + + + + + + + + F + + Lauretta Esther + Boyd + + + + + + + + + + F + + Martha Elizabeth + Jones + + + + + + + + + M + + БориÑов + + + + + + M + + Walter Harmon + Gutiérrez + + + + + + + + + F + + Virginia Elizabeth + Gutiérrez + + + + + + + + + + F + + Dorothy Jean + Gutiérrez + + + + + + + + + + F + + Joan Arlene + Gutiérrez + + + + + + + + + + M + + Alfred Wayne + Stone + + + + + + M + + William + Colon + + + + + + F + + Nellie + Marín + + + + + + M + + Wesley G. + Medina + + + + + + M + + Beckham + Hawkins + + + + + + F + + Angie + ÐфанаÑьев + + + + + + M + + Richard W. + Hawkins + + + + + + + + + + M + + William Melvin + Hawkins + + + + + + + + + + + + + + + + + + + + F + + Ruth + Gibbs + + + + + + + + + F + + Gail + Hawkins + + + + + + + + + + M + + Torres + + + + + + F + + Janelle + Hawkins + + + + + + + + + + M + + Stewart + + + + + + M + + Arthur Otto + Thornton + + + + + + + + + + M + + Gerald L. + Hawkins + + + + + + + + + M + + James R. + Hawkins + + + + + + + + + F + + Jean + Hawkins + + + + + + + + + + M + + Becker + + + + + + M + + Andrew Joseph + Garner + + + + + + + + + + + + + M + + Waters + + + + + + M + + Давыдов + + + + + + M + + González + + + + + + M + + Thomas H. + Moreno + + + + + + + + + + + M + + Joseph McDowell + Moreno + + + + + + + + + + + + + M + + James Arthur + Thornton + + + + + + + + + + + + + + + + + F + + Letitia C. + DÄ…browski + + + + + + M + + Darius + Moreno + + + + + + + + + + + M + + Green P. + Moreno + + + + + + + + + U + + Moreno + + + + + + U + + Moreno + + + + + + U + + Moreno + + + + + + F + + Delilah + Moreno + + + + + + + + + + + + + + + M + + Samuel + Andersen + + + + + + + + + + + + + + M + + Aaron B. + Andersen + + + + + + M + + Samuel A. + Andersen + + + + + + F + + Helen + Lachance + + + + + M + + William + Andersen + + + + + + M + + Marion + Andersen + + + + + + F + + Mary H. + Moreno + + + + + + + + + + + M + + David + Porter + + + + + + F + + Mahala J. + Porter + + + + + + + M + + Ãlvarez + + + + + + F + + Rachel D. + Porter + + + + + + U + + Porter + + + + + + U + + Porter + + + + + + M + + Cyrus W. + Moreno + + + + + + + + + + F + + Dorothy Eleanor + Thornton + + + + + + + + + + + + + + F + + Minerva + Moreno + + + + + + + + + + M + + Alfred + Joseph + + + + + + M + + Joseph + + + + + + M + + Joseph + + + + + + M + + Joseph + + + + + + F + + Joseph + + + + + + F + + Joseph + + + + + + M + + Solon + Moreno + + + + + + + + + + F + + Lydia + Perkins + + + + + + F + + Mary J. + Craig + + + + + + M + + Joseph Robert + Lane + + + + + + + + + + + + + + + + + + + F + + Phebe J. + Moreno + + + + + + + + + + M + + William M. + Ball + + + + + + F + + Lelia L. + Moreno + + + + + + + + + + M + + Adolph + Patton + + + + + + F + + Flora E. + Moreno + + + + + + + + + F + + Martha A. + Moreno + + + + + + + + + F + + Lydia M. + Moreno + + + + + + + + + M + + Christian + Moreno + + + + + + + F + + Mary + Price + + + + + + F + + Elizabeth + Moreno + + + + + + + M + + Joseph Edward + Lane + + + + + + + + + + + + + + M + + Ford + + + + + + F + + Rosan + Moreno + + + + + + M + + John + Moreno + + + + + + + + + M + + Absalom + Moreno + + + + + + + + + + + + + + + + M + + Noah + Moreno + + + + + + M + + Enoch + Moreno + + + + + + F + + Leah + Moreno + + + + + + + + + + + + + M + + William + Chambers + + + + + + F + + Delilah + Moreno + + + + + + + M + + John + Романов + + + + + + M + + Warren W. + Warner + + + + + + + + + + + + + + + + + + + M + + Philip + Thornton + + + + + M + + Esau + Moreno + + + + + + + + + + F + + Mary E. + Caron + + + + + + F + + Mary Ann + Moreno + + + + + + + M + + Martin + + + + + + M + + Enoch T. + Moreno + + + + + + + + + + M + + Everett + Cruz + + + + + + + + + M + + Paul Eugene + Cruz + + + + + + + + + + + + + F + + Marguerite + Lambert + + + + + + + + + + + + + + + + + + M + + Thomas Everett + Cruz + + + + + + + + + + + + + F + + Linda Helen + Cruz + + + + + + + + + + + + + M + + Dale Eugene + Cruz + + + + + + + + + + + + + M + + Arthur Ray + Cruz + + + + + + + + + + + + + F + + Myrabel + Robbins + + + + + + + + + + + + M + + Gerald Ray + Cruz + + + + + + + + + + + + + F + + Abigail + Ball + + + + + + + + + + + + + + + + + + + F + + Janis Marlene + Cruz + + + + + + + + + + + + + M + + James Richard + Cruz + + + + + + + + + + + + + M + + Ivan Wayne + Cruz + + + + + + + + + + + + + F + + Bettie Lou + Gagnon + + + + + + + + + + + + M + + David Wayne + Cruz + + + + + + + + + + + + + M + + William Everett + Cruz + + + + + + + + + + + + + F + + Ellen Marie + Hawkins + + + + + + + + + + + + + F + + Joyce Marie + Cruz + + + + + + + + + + + + + F + + Judy Denise + Cruz + + + + + + + + + + + + + + M + + William Walker + Garrett + + + + + + + + + M + + Noah + Warner + + + + + + + + + + + + + + + + + + + F + + Carmen Eloise + Garrett + + + + + + + + + + + + + + + M + + Raymond A. + Лопатин + + + + + + + + + + + + F + + Carmen Diana + Лопатин + + + + + + + + + + + + + + + F + + Donna Elaine + Лопатин + + + + + + + + + + + + + + M + + William Forest + Garrett + + + + + + + + + + + + + F + + Wilma Mae + Perkins + + + + + + + + + F + + Doris Mae + Garrett + + + + + + + + + + + + + + + M + + Keith William + Garrett + + + + + + + + + + + + + M + + Lloyd Willis + Garrett + + + + + + + + + + + + M + + Norman + Russell + + + + + + + + + + + + + + + + + F + + Margaret + Burns + + + + + + + + + + + + + M + + Melvin Glen + Russell + + + + + + + + + + + + + + F + + Janet Gail + Russell + + + + + + + + + + + + + + M + + Willis H. + Marín + + + + + + + + + + + + + + + + + + + M + + Noah, Jr. + Marín + + + + + F + + Nancy H. + Marín + + + + + + + + + + + F + + Alice + Marín + + + + + + + + M + + ??????? + Olson + + + + + + M + + Allen + 鈴木 + + + + + + M + + Earl Kieble + 鈴木 + + + + + + F + + Mollie + Landry + + + + + + M + + David + Fox + + + + + + + + + + + + + + + + + + + F + + Kitty + Landry + + + + + + M + + John S. + Floyd + + + + + + + + + + + + + + + + + + F + + Mary + Coleman + + + + + + + + + + + + + + + + + + M + + Michael Edward + Landry + + + + + + + + + + + + + + + + + + F + + CatherineJosephine + Brady + + + + + + F + + Theresa A. + Landry + + + + + + + + + + F + + Mary A. + Landry + + + + + + + + + + + + + M + + Maurice T. + Landry + + + + + + + + + + + + + + + M + + Charles M. + Landry + + + + + + + + + + + + + F + + Catherine M. + Landry + + + + + + + + + + + + + F + + Frances + Green + + + + + + + + + + + + + + + + + + + M + + John Anthony + Landry + + + + + + + + + + + + + + F + + Sarah + Landry + + + + + + + + + F + + Honora + Couture + + + + + + + + + + F + + Alice + Landry + + + + + + + + + + + + + + F + + Josephine Grace + Landry + + + + + + + + + + + + + F + + Helen Margaret + Landry + + + + + + + + + + + + + + M + + Lawrence + Harris + + + + + + F + + Mary Alice + Harris + + + + + + F + + Patricia Anne + Harris + + + + + + F + + Theresa Frances + Harris + + + + + + M + + Matthias, Jr. + Ball + + + + + + + + + + + + + + + + + + + + + F + + Mary Claire + Estrada + + + + + + M + + Maurice, Jr. + Landry + + + + + + + + + + + + M + + Charles Doyle + Landry + + + + + + + + + + + + + F + + Caroline Metzger + Vargas + + + + + + F + + Rose Marie + Landry + + + + + + F + + Ella Mae + Harris + + + + + + F + + Eleanor Jean + Landry + + + + + + + + + + + + M + + John Chandler + Landry + + + + + + + + + + + + + M + + Michael Douglas + Warner + + + + + + + + + + + + + F + + Pansy L. + Warren + + + + + + F + + Abigail Chapman + Moreno + + + + + + + + + + + + + + + + + + + F + + Michelle Lorraine + Warner + + + + + + + + + + + + + M + + Darin Kane + Warner + + + + + + + + + + + + + M + + Carl + Ford + + + + + M + + Lee William + Lopez + + + + + + + + + + + + M + + John Warren + Lopez + + + + + + + + + + + + F + + Andrea Susan + Warner + + + + + + + + + + + + + + F + + Rebecca J. + Miles + + + + + + F + + Deirdra Denise + Warner + + + + + + + + + + + + + M + + Alvin E. + Watson + + + + + + + + + + + + + F + + Mary Grace + Watson + + + + + + + + + + + + + M + + John + Зыков + + + + + + + + + + + + + + + + + + F + + Geraldine Ann + Simpson + + + + + + + + + + + + + F + + Sheryl Ann + Warner + + + + + + + + + + + + + M + + Robert Warren + Warner + + + + + + + + + + + + + F + + Nancy Lou + Powers + + + + + + + + + + + + + F + + Belle Marie + Warner + + + + + + + + + + + + + M + + Curtis Andrew + Warner + + + + + + + + + + + + + + + + + + M + + Douglas Lowell + Warner + + + + + + + + + + + + + M + + Jimmy Michael + French + + + + + + + + + + + + + M + + Kevin Wayne + French + + + + + + + + + + + + + F + + Erin Jenny + French + + + + + + + + + + + + + M + + Carl Thomas + Warner + + + + + + + + + + + + + F + + Mary Eve + Hopkins + + + + + + + + + + + + + + + + + + F + + Laura Gail + Warner + + + + + + + + + + + + + + M + + Marc W. + Haynes + + + + + + + + + + + + + M + + Michael Walter + Haynes + + + + + + + + + + + + + F + + Elizabeth Ellen + Haynes + + + + + + + + + + + + + M + + David William Sigfred + Haynes + + + + + + + + + + + + + M + + David J. + Ward + + + + + + + + + + + + + M + + Michael David + Ward + + + + + + + + + + + + + F + + Catherine Marie + Ward + + + + + + + + + + + + + M + + Dennis John + КиÑелев + + + + + + + + + + + + + M + + Timothy Andrew + КиÑелев + + + + + + + + + + + + + M + + Piatt D. + Warner + + + + + + + + + + + + + + + + + + + M + + Aaron D. + КиÑелев + + + + + + + + + + + + + M + + Daniel + Mortensen + + + + + + + + + + + + + M + + Robert Alan + Mortensen + + + + + + + + + + + + + F + + Maria Christine + Mortensen + + + + + + + + + + + + + M + + Bruce Edward + Watkins + + + + + + + + + + + + + F + + Laura Kathryn + Watkins + + + + + + + + + + + + + F + + Elisa Ann + Long + + + + + + + + + + + + + F + + Diana + Richards + + + + + + M + + Martin B. + Warner + + + + + + + + + + + + + M + + Clayton James + Warner + + + + + + + + + F + + Julia Colville + Fox + + + + + + + + + + + + + + + + + + + M + + James A. + Poirier + + + + + + F + + Janelle Marie + Poirier + + + + + + + + + + + + + + M + + Jeffrey Alan + Poirier + + + + + + + + + + + + + M + + John Harry + Nguyen + + + + + + + + + + + + F + + Laurie Ann + Nguyen + + + + + + + + + + + + + F + + Elizabeth Diane + Nguyen + + + + + + + + + + + + + M + + James Andrew + Warner + + + + + + + + + + + + + F + + Cindy Lynn + Warner + + + + + + + + + + + + + F + + Debra J. + Carter + + + + + + + + + + + + M + + Jack D. + Alvarado + + + + + + + + + + + + M + + Jasper + Ball + + + + + + + + + + + + + + + + + + + F + + Michelle Lynn + Alvarado + + + + + + + + + + + + + M + + Douglas David + Alvarado + + + + + + + + + + + + + M + + Andrew David + Alvarado + + + + + + + + + + + + + M + + Matthew Vincent + Alvarado + + + + + + + + + + + + + F + + Christina + Norton + + + + + + + + + + + + F + + Amber Lynne + Warner + + + + + + + + + + + + + M + + William Robert + Bates + + + + + + + + + + + + M + + Timothy Christian + Bates + + + + + + + + + + + + + M + + Stephen Michael + Bates + + + + + + + + + + + + + M + + John Allen + Bates + + + + + + + + + + + + + F + + Angeline + Зыков + + + + + + + + + + + + + + + + + + + M + + Robert William + Floyd + + + + + + + + + + + + M + + Gregory Scott + Floyd + + + + + + + + + + + + + + M + + Christopher Randall + Floyd + + + + + + + + + + + + + F + + Joan Louise + Floyd + + + + + + + + + + + + + F + + Rebecca Kristine Ramos + Данилов + + + + + + + + + + + + + M + + Jeffrey Adam Ramos + Garza + + + + + + + + + + + + + M + + Paul Allen + Harrison + + + + + + + + + + + + M + + Benjamin Allen + Harrison + + + + + + + + + + + + M + + Michael + Welch + + + + + + + + + + + + M + + Jeremy Quentin + Welch + + + + + + + + + + + + + M + + Carl Tolbert + Lessard + + + + + + + + + + + + + + + + + + + F + + Flora Belle + Todd + + + + + + + + + + + + + + + + + + M + + Robert Arthur + Todd + + + + + + + + + + + + M + + George Walter + Todd + + + + + + + + + + + + M + + Jesse Elmer + Todd + + + + + + + + + + + + + F + + Lena Viola + Todd + + + + + + + + + + + + + + + + + F + + Irene Frances + Todd + + + + + + + + + + + + + + + + + F + + Cora Olive + Todd + + + + + + + + + + + + + + + + + M + + Benjamin Harrison + Todd + + + + + + + + + + + + + + + + + M + + Percy Haye + Todd + + + + + + + + + + + + + + + + + F + + Sarah Jane + Farmer + + + + + + + + + + F + + Luella Florence + Webb + + + + + + + + + + + + + + + + + + + F + + Mary Ann + Farmer + + + + + + + + + + F + + Susanne Delilah + Farmer + + + + + + + + + + M + + Winfield Scott + Farmer + + + + + + + + + + F + + Miranda Keziah + Farmer + + + + + + + + + + M + + Cyrus Melville + Farmer + + + + + + + + + + F + + Flora Alice + Farmer + + + + + + + + + + M + + John + Farmer + + + + + + + + + + F + + Melinda Lou + Cruz + + + + + + + + + + + + + F + + Joan Lorinda + Webb + + + + + + + + + + + + + + + + F + + Marilyn Jean + Webb + + + + + + + + + + + + + + F + + Clara Belle + Page + + + + + + + + + + + + + + + + + + + F + + Ruth L. + Зайцев + + + + + + F + + Nancy Lou + Webb + + + + + + + + + + + + + + M + + James Lee + Webb + + + + + + + + + + + + + + + + + + M + + Richard L. + Webb + + + + + + + + + + + + + + + + + + F + + Nora A. + Boucher + + + + + + + + + + + + + + M + + Michael J. + Boucher + + + + + + + + + + M + + Thomas W. + Boucher + + + + + + + + + + + + + + M + + James + Boucher + + + + + + + + + + + M + + Thomas + Gutierrez + + + + + + F + + Catherine + Gutierrez + + + + + + + + + + + + + + M + + David + Page + + + + + + + + + + + + + + + + + + + M + + Thomas + Boucher + + + + + + + + + + + + F + + Margaret A. + Nielsen + + + + + F + + Nancy A. + Boucher + + + + + F + + Ella + Boucher + + + + + M + + William C. + Boucher + + + + + + + + F + + Sylvia B. + Boucher + + + + + M + + Thomas + Boucher + + + + + F + + Honora + Boucher + + + + + M + + Michael + Boucher + + + + + M + + David + Boucher + + + + + F + + Elizabeth + Douglas + + + + + + + + + + + + + + + + + + + M + + Michael + Boucher + + + + + + + + + F + + Honorah + Berry + + + + + + + + + + + F + + Catherine + Boucher + + + + + + + + + + + M + + William + Boucher + + + + + + + + + + + F + + Bridget + Boucher + + + + + + + + + + + + M + + Mathew + Reeves + + + + + + F + + Catherine + Reeves + + + + + M + + Mathew + Reeves + + + + + M + + James + Reeves + + + + + F + + Mary + Reeves + + + + + + + + + + + M + + John Allen + Warner + + + + + + + + + + + + + M + + Ira Willis + Lessard + + + + + + + + + + + + + + + + + + + F + + Margaret + Reeves + + + + + + + + + + + F + + Honora + Reeves + + + + + + + + + + + F + + Jesse + Reeves + + + + + F + + Catherine + Boucher + + + + + + M + + Charles + Boucher + + + + + + M + + Willis + Marín + + + + + + F + + Sarah (Sally) + Floyd + + + + + + + + + + + + + + + F + + Lorinda Catherine + Ford + + + + + + + + + + + + + + + + + + M + + Gary + Ильин + + + + + + + + + + + + M + + Eric Scott + Ильин + + + + + + + + + + + + + F + + Lucinda Ellen + Jiménez + + + + + + + + + + + + + + + + + + + M + + Timothy Ryan + Ильин + + + + + + + + + + + + + M + + Lawrence + Gill + + + + + + M + + Lawrence + Gill + + + + + + + + + + + + + + F + + Lorie Ann + Gill + + + + + + + + + + + + + + M + + Simon + ТараÑов + + + + + + M + + Daniel James Ramos + Данилов + + + + + + + + + + + + + F + + Evelyn Almazon + Ross + + + + + + + + + + + + + M + + Paul + Mcbride + + + + + + + + + + + + M + + Douglas Glenn + Harrison + + + + + + + + + + + + + M + + Jeffrey + Jørgensen + + + + + + + + + + + + M + + Francis Irvin + Webb + + + + + + + + + + + + + + + + + + + M + + Isaac + Lessard + + + + + + + + + + + F + + Mary E. + Domínguez + + + + + + + + + + + + + + + + + + + F + + Marilyn Joan + Rasmussen + + + + + + + + + + + + + F + + Joella Lynn + Cruz + + + + + + + + + + + + + F + + Jill Suzanne + Cruz + + + + + + + + + + + + + F + + Gayle Joan + Cruz + + + + + + + + + + + + + F + + Joy Leanne + Cruz + + + + + + + + + + + + + M + + Rodney Herman + МакÑимов + + + + + + + + + + + + + F + + Heather Michelle + МакÑимов + + + + + + + + + + + + + + F + + Hyla Rae + МакÑимов + + + + + + + + + + + + + F + + Louella Jane + Todd + + + + + + + + + + + + + + + + + + + F + + Penelope Margot + Morales + + + + + + + + + + + + + F + + Joyce Inez + Briggs + + + + + + + + + + + + + M + + Paul Allen + Welch + + + + + + + + + + + + F + + Linda + Gill + + + + + + + + + + + + F + + Barbara Ann + Nunez + + + + + + + + + + + + M + + Ronald David + West + + + + + + + + + + + + M + + John C. + Peters + + + + + + + + + + + + M + + Gary Richard + Bell + + + + + + + + + + + + F + + Patti Jo + Cruz + + + + + + + + + + + + + + M + + Douglas + Krawczyk + + + + + + + + + + + + M + + Lewis Anderson + Garner + + + + Louis + Garner + + Names can notes, too. This is a note for the alternate name of Louse Garner for Lewis Anderson Garner. + + Page 11 2/3. + Strange, isn't it. + On every third blue moon, Lewis Anderson Garner would dress in a purple dress and claim that his name was Louis Garner. + + + + + Louie + Garner + + + Big Louie + + + + + + + + + + + + + + +
+ + 1600 Pennsylvania Ave. + Washington DC + District of Columbia + USA +
+ + + + + + We have committed to synergistically disseminate resource-leveling methods of empowerment to set us apart from the competition. We envision to globally integrate inexpensive paradigms and professionally engineer timely technology while promoting personal employee growth. Our mission is to assertively build world-class methods of empowerment so that we may professionally promote parallel services to set us apart from the competition. It's our responsibility to dramatically maintain value-added services as well as to professionally simplify principle-centered technology for 100% customer satisfaction. + +Thanks to the Mission Statement Generator from http://www.dilbert.com. + +
+ + F + + Ann Lynn + Cruz + + + + + + + + + + + + + F + + Jane Elizabeth + Cruz + + + + + + + + + + + + F + + Lisa Dawn + Welch + + + + + + + + + + + + + M + + Randall Lee + Poulsen + + + + + + + + + + + + M + + Christopher Paul + Welch + + + + + + + + + + + + + + F + + Laura Joy + Cruz + + + + + + + + + + + + + F + + Susan Marguerite + Cruz + + + + + + + + + + + + F + + Marsha Ann + Cruz + + + + + + + + + + + + + F + + Karla Sue + Cruz + + + + + + + + + + + + F + + Karen Kay + Cruz + + + + + + + + + + + + F + + Luella Jacques + Martel + + + + + + + + + + + + + + + + + + + + + F + + Erin Kathleen + West + + + + + + + + + + + + + F + + Elissa Marie + Peters + + + + + + + + + + + + M + + William Austin + Bell + + + + + + + + + + + + F + + Brandy Nichole + Bell + + + + + + + + + + + + F + + Chelsea Dawn + Poulsen + + + + + + + + + + + + + M + + Curtis Theobald + Poulsen + + + + + + + + + + + + + M + + Vernett Gail + Page + + + + + + + + + + + + + + F + + Eleanor Irene + Page + + + + + + + + + + + + + + + F + + Reese + + + + + + + + + + + + + + M + + Andrew Cole + Osborne + + + + + + + + + + + + + M + + Eugene Stanley + Garner + + + + + + + + + + + + + + + + + + + + + M + + John Henry + Bergeron + + + + + + + + + + + + + M + + Dr. Charles J. + Wright + + + + + + + + + M + + George, Sr. + Jiménez + + + + + + + + + + + + + + + + + M + + George + Blake + + + + + + + + + + + + + + + + + + + F + + Sally Sarah + Cunningham + + + + + + + + + + + + + + + + + + + M + + Conrad + Blake + + + + + + + + + + + + + + F + + Catherine + Ruiz + + + + + + + + + + + + + + + + + + M + + William Philip + Cunningham + + + + + + + + + + + + + + + + + + + F + + Susannah + Park + + + + + + + + + + + M + + Peter Sr. + Cunningham + + + + + + + + + + + + + + + + + + M + + Francis Vincent + Reed + + + + + + + + + + + + + + + + + + + + M + + James + Park + + + + + + M + + Abraham + Douglas + + + + + + + + + + + + + + + + + + + + F + + Nancy + Alvarado + + + + + + + + + + + + + + + M + + Col. Charles + Alvarado + + + + + + + + + + + + + + + + + + + F + + Eleanor + Parent + + + + + + + + + + + + + + + + + + + M + + Capt.Jacob C. + Parent + + + + + + + + + + + + + + + + + + + F + + Jane + James + + + + + + + + + + + + + + + + M + + Thomas Sr. + James + + + + + + + + + + + + + + + F + + Martha Ellen M. + Benson + + + + + + + + + + + + + + + M + + Hugh Sr. + James + + + + + + + + + + + + + + + F + + Catherine Virginia + Тихонов + + + + + + + + + + + + + + + + + + + F + + Caroline + Serrano + + + + + + + + + + + + + + F + + Monica Jane + Warner + + + + + + + + + + + + + F + + Molly Marie + Jørgensen + + + + + + + + + + + + + M + + Craig Richard + Gosselin + + + + + + + + + + + + + F + + Helen + Lachance + + + + + + + + + + + + M + + Jesse Christopher + Cruz + + + + + + + + + + + + + M + + Thomas + Boucher + + + + + + + + + + + + + + + + + + + M + + Sean + Boucher + + + + + + + + + + + + + + + + + + + M + + Michael + Boucher + + + + + + + + + + + + + + + + + + + M + + John + Boucher + + + + + + + + + + + + + + M + + Moses Wallace + Marín + + + + + + + + + + + + + + + + + + + M + + Phillip James + Thornton + + + + + + + + + + + + + + F + + Linda Mae + Козлов + + + + + + + M + + Anthony David + Lane + + + + + + + + + + + + + F + + Donna Elizabeth + Lane + + + + + + + + + + + + + F + + Rose + Dubé + + + + + + M + + William J. + Boucher + + + + + + + F + + Marie + Howell + + + + + + + + + + M + + William J. + Boucher + + + + + + + + + + + + + + + + + + F + + Sharon + Boucher + + + + + + + + + + + + + M + + Wayne + Alvarado + + + + + + M + + Allen Carl + Warner + + + + + + + + + + + + + + F + + Eleanor (Nellie) Therese + Landry + + + + + + + + + + + + + + + + + + + F + + Cynthia Diane + Alvarado + + + + + + F + + Jacqueline + Alvarado + + + + + + M + + Richard + Alvarado + + + + + + M + + James + Boucher + + + + + F + + Mary + SzymaÅ„ski + + + + + + M + + Francis + Boucher + + + + + + M + + Fr.Lawrence M. + Boucher + + + + + + + + + + + + + + + M + + Capt. George + Warner + + + + + + + + + + + + + + + + + + + F + + Mary + Alvarez + + + + + + + + + + + + + + M + + Capt. Andrew + Warner + + + + + + + + + + + + + + + + + + + M + + William Bernard + Boucher + + + + + + + + + + + + + + + + + + + M + + Edward + Warner + + + + + + + + + + + + + + + + + + + F + + Mary Molly + Anderson + + + + + + + + + + + + + + M + + Andrew + Warner + + + + + + + + + + + + + + F + + Eunice + Maldonado + + + + + + + + + + + + + + + + + + M + + Edward + Maldonado + + + + + + M + + Samuel + Fox + + + + + + + + + + + + + + + + + + + M + + David + Fox + + + + + + + + + + + + + + + + + + + F + + Mary + Harris + + + + + + M + + Jacob, Sr. + Fox + + + + + + + + + + + + + + M + + Robert + Palmer + + + + + + F + + Maria + Reeves + + + + + + + + + + + + + + + + + + + F + + ??????? + Попов + + + + + + F + + Sarah + Palmer + + + + + + + + + + + M + + Christopher + Christiansen + + + + + + + + + + + + + + + + + + + F + + Anne + Barrett + + + + + + + + + + M + + Elder Thomas + Thomas + + + + + + + + + + + + + M + + Edward + Christiansen + + + + + + + + + + + + + + + + + + + + M + + Edward + Christiansen + + + + + + + + + + + + + + + F + + Elizabeth + Thomas + + + + + + + + + + + + + + + F + + Mary + Grenier + + + + + + + + + + + + + + + M + + Nathaniel + Christiansen + + + + + + + + + + + + + + + F + + Frances Lucille (Babe) + Reed + + + + + + + + + + + + + + + + + + + + M + + Samuel + Christiansen + + + + + + + + + + + + + + + F + + Mary + Alvarado + + + + + + + + + + + + + + + M + + Rev. John L. + Lefebvre + + + + + + + + + + + + + + + + M + + Joseph + Lefebvre + + + + + + + + + + + M + + John + González + + + + + M + + Edward + Green + + + + + + + + + + + + + + + F + + Mary + Lefebvre + + + + + + + + + + M + + George + МакÑимов + + + + + + F + + Annabell Gordon + Жуков + + + + + + F + + Elizabeth + González + + + + + + + + + M + + Walter Matthew + Marín + + + + + + + + + + + + + + + + + + + M + + Joseph + Christiansen + + + + + + + + + + + + + + + F + + Christina + МакÑимов + + + + + + + + + + M + + Edward + Green + + + + + + + + + + + + + + F + + Mary + Mitchell + + + + + + + + + + + + M + + Jonathan + Davis + + + + + + + + + + + + + F + + Frances + Christiansen + + + + + + + + + + M + + James + Green + + + + + + + + + + + + + + M + + Randolph + Green + + + + + + + + + + + + + + + + + + F + + Sabra + Davis + + + + + + + + + + + + + + + + + + M + + Jonathan + Burns + + + + + + + + + + F + + Mary Cecilia + Boucher + + + + + + + + + + + + + + + + + + + F + + Dorcas + Rubio + + + + + + + + + + M + + Robert Sr. + Adkins + + + + + + + + + + F + + Martha + Nielsen + + + + + + M + + John + Adkins + + + + + + + + + + + + + + + F + + Jane + Adams + + + + + + + + + + + + + + + M + + Col. Joseph + Злобин + + + + + + + + + + + + + + + + + + + F + + Virginia Margaret + Rice + + + + + + + + + + + + + + + + + + + M + + Ezekiel + Ball + + + + + + + + + + + + + + F + + Martha + Adkins + + + + + + + + + + + + + + + + + + + M + + Herman + Moreno + + + + + + + + + + M + + Joseph Jr. + Злобин + + + + + + + + + + + + + + + F + + Mary + Bass + + + + + + + + + + + + + + F + + Elizabeth + Nielsen + + + + + + M + + William + Maxwell + + + + + + F + + Mary + Шадрин + + + + + + + + + M + + Thomas + Ball + + + + + + + + + + + F + + Martha + Злобин + + + + + + + + + + + + + + + + + + F + + Ann + Maxwell + + + + + + + M + + Matthias Sr. + Ball + + + + + + + + + + + + + + + M + + Joseph + Hopkins + + + + + + + + + + + + + + M + + Johann Henrich + Moreno + + + + + + + + + + + + + + + F + + Sarah + Clark + + + + + + + + M + + Michael + Howard + + + + + + F + + Juliana + Howard + + + + + + + M + + Hans Peter + Douglas + + + + + + + + + + + + + + + + + + + M + + John Sr. + Douglas + + + + + + + + + + + + + + + + + + + + M + + Andrew + Moran + + + + + + + + + + + + + + + + + + + F + + Ann Delilah "Tilley" + Moran + + + + + + + + + + + + + + + M + + John Jr. + Douglas + + + + + + + + + + + + + + + + M + + Henry + Johnson + + + + + + F + + Catherine + Sparks + + + + + + M + + Christian, I + Moreno + + + + + + + + + + + + + + + + + + + F + + Mary Elizabeth + Kristensen + + + + + + + + + + + + + + M + + John + Pope + + + + + + + + + F + + Sarah "Sr. Sabina" + Kristensen + + + + + + + + + + + + + + + + + + F + + Catherine Virginia + Kristensen + + + + + + + + + + + + + + M + + Frank + Kim + + + + + + M + + John Francis"Chick" + Kristensen + + + + + + + + + + + + + M + + Miles Joseph"Dutch" + Kristensen + + + + + + + + + + + + + + + + + + F + + Margaret Agnes"Maudy" + Kristensen + + + + + + + + + + + + + + + + + + + M + + Guy + Логинов + + + + + + F + + Anna June + Kristensen + + + + + + + + + + + + + + + + + + + M + + Johann Christian II + Moreno + + + + + + + + + + + + + + + M + + William Sr. + Rhodes + + + + + + + + + + F + + Beth Ann + Russell + + + + + + + + + + + + + + F + + Judith Ann + Manning + + + + + + + + + + + + + M + + Raymond Patrick + Côté + + + + + + + + + + + + M + + Bruce Lynn + Russell + + + + + + + + + + + + + + M + + David + Жуков + + + + + + M + + Walter + Savard + + + + + + M + + William M. + Rodriquez + + + + + + + + + + + + + + + + + + + F + + Mariam + Rodriquez + + + + + + + + + + + + + + + + + + + M + + Rufus + Blanco + + + + + + + + + + + + + + + + + + + F + + Rita Marie + Garner + + + + + + + + + + + + + + M + + Maj. Christopher + Moreno + + + + + + + + + + + + + + + M + + P.D. + Meyer + + + + + + + + + + + + + + + + + + M + + John + Reeves + + + + + + + + + + + + + + + + + + F + + Mary + McCarthy + + + + + + + + + + + + + + + + + + F + + Elizabeth + Johnson + + + + + + + + + + + M + + Joseph + Douglas + + + + + + + + + + + + + + + + + + + M + + Matthias Sr. + Carroll + + + + + + + + + + + + + + + F + + Eva + Воробьев + + + + + + + F + + Grace + Carroll + + + + + + + + + + + + + + + + + + + M + + Cadwallader + Alvarado + + + + + + + + + + + + + + F + + Martha + Mendez + + + + + + + + + + + + + + + + + + M + + Aaron + Moreno + + + + + + + + + + + + + + + + + + + M + + Hans Michael + Oliver + + + + + + M + + Harmonas I + Oliver + + + + + + + + + + + + + + + + + + + M + + Harmonas II + Oliver + + + + + + + + + + + F + + Elizabeth + Oliver + + + + + + + + + + + + + + + M + + Adam + Morris + + + + + + + + + + M + + Cyrus + Morris + + + + + + + + + + + + + + + + + + + F + + Martha + Graves + + + + + + + + + + + + + + + + + + F + + Cathy Sue + Henderson + + + + + + + + + + + + + M + + Nicholas Glen + Russell + + + + + + + + + + + + + M + + Casey John + Russell + + + + + + + + + + + + + M + + John + Page + + + + + + + + + + + + + + + + + + M + + Scott + Жуков + + + + + + + + + + M + + Curtis Dale + Жуков + + + + + + + + + + + F + + Bernice + Davidson + + + + + + + + + + + + M + + Jesse V. + Garner + + + + + + + + + + + + + + + + + + + + + M + + Raymond E. + Garner + + + + + + + + + + + + + + + F + + Jennie S. + Garner + + + + + + + + + + + + + + + + + + + M + + Walter E. + Garner + + + + + + + + + + + + + + + + + + + M + + Daniel Webster + Garner + + + + + + + + + + + + + + + + + + + F + + Bertha P. + Garner + + + + + + + + + + + + + + + + + + + F + + Elizabeth + Garner + + + + + + + + + + + + + F + + Isabella + Kaczmarek + + + + + + + + + + + + + + + + + + F + + Cora Ellen + Jackson + + + + + + + + + + + + + F + + Cecile Elizabeth + Garner + + + + + + + + + + + + + + + + + + F + + Helen Bernice + Garner + + + + + + + + + + + + + F + + Bernetha Ellen + Garner + + + + + + + + + + + + M + + Daniel Burton + Garner + + + + + + + + + + + + + + + + + M + + Raymond Webster + Garner + + + + + + + + + + + + + F + + Betty Jane + Garner + + + + + + + + + + + + + M + + Richard F. + Johnson + + + + + + + + + + + + + + + + + M + + Harold + Andrews + + + + + + + + + + M + + Arnold + Wójcik + + + + + + + + + + + + + M + + George Henry, Jr. + Jiménez + + + + + + + + + + + + + + + + + + + M + + James + Bélanger + + + + + + + + + + + + + + + + F + + Viola + Taylor + + + + + + F + + Marie + Garner + + + + + + + M + + Edward + Burgess + + + + + + M + + Victor + Garner + + + + + + M + + George + Яковлев + + + + + + + + + + M + + Everett + Яковлев + + + + + + F + + Esther Faye + Яковлев + + + + + + + F + + Georgia + Яковлев + + + + + + M + + ??????? + Arnold + + + + + + F + + Mildred + Silva + + + + + + + + + + + + + + + + + + F + + Maude + García + + + + + + + + + + F + + Maude + Garner + + + + + + + M + + ??????? + Cooper + + + + + + F + + Marguarite + Garner + + + + + + M + + Clarence + Robinson + + + + + + + + + + M + + Robert + Robinson + + + + + + M + + Luther + Robinson + + + + + + M + + Albert Raymond + Robinson + + + + + + M + + Hugh Martin + Robinson + + + + + + M + + William Arthur + Andrews + + + + + + + + + + + + M + + George Henry, III + Jiménez + + + + + + + + + + + + + + + F + + Suzanne + Wójcik + + + + + + + + + + + + M + + Richard + Wójcik + + + + + + + + + + + + F + + Patricia + Wójcik + + + + + + + + + + + + M + + James + Wójcik + + + + + + + + + + + + M + + Arnold Clark + Wójcik + + + + + + + + + + + + M + + Daniel Burton + Wójcik + + + + + + + + + + + + F + + Linda Ellen + Bélanger + + + + + + + + + + + + + M + + Edward + Потылицин + + + + + + F + + Pamela Ann + Bélanger + + + + + + + + + + + + F + + Kathryn Ladon + Bryant + + + + + + F + + M. Susannah + Blake + + + + + + + + + + + + + + + + + + + F + + Jane McClellan + Garner + + + + + + + + + + + + + + M + + Raymond Scott + Garner + + + + + + + + + + + + + + M + + Robert C. + Cox + + + + + + F + + Angela Gay + Pérez + + + + + + M + + William + Foster + + + + + + + + + + + F + + Mary + Sanders + + + + + + + + + + + F + + Violet Louise + Брюханов + + + + + + + + + + + + + M + + Joseph + Christiansen + + + + + + + + + + + + + + + F + + Joanna + Allen + + + + + + + + + + + F + + Hannah + Christiansen + + + + + + + + + + + + + + + M + + Livingstone Martin + Webb + + + + + + + + + + + + + + + + + + + M + + Rev. John + Anderson + + + + + + + + + + + + + + + F + + Martha + Christiansen + + + + + + + + + + + + + + M + + William + Fox + + + + + + + + + + + + + + + + + + F + + Hannah + Mason + + + + + + F + + Susannah + Mason + + + + + + M + + John + Sanchez + + + + + + + + + + + + + + + M + + Robert + Lefebvre + + + + + + + + + + + + + + + M + + Thomas + Wise + + + + + + + + + + + + + + + F + + Grace + Navarro + + + + + F + + Mary + Gregory + + + + + + F + + Lucinda Catherine + Blanco + + + + + + + + + + + + + + + + + + + M + + John + Davis + + + + + + F + + Hannah + Knight + + + + + + M + + Benjamin + Davis + + + + + + + F + + Mary + Alexander + + + + + + M + + ??????? + Зыков + + + + + + + + + M + + Abraham + Wallace + + + + + + + + + + F + + Marcy + Greene + + + + + + M + + Wayne + Todd + + + + + + + + + + + + + F + + Lucille + Todd + + + + + + + + + + + + + + + + + M + + Melvin + Patrick + + + + + + M + + George Edward + Warner + + + + + + + + + + + + + + M + + John + Todd + + + + + + M + + Robert + Patrick + + + + + + + + + + M + + William + Adams + + + + + + + + + + + + + + + + + + F + + Eleanor + Aguilar + + + + + + + + + + + + + + + F + + Agnes + Mann + + + + + + + + + + F + + Elizabeth + Матвеев + + + + + + + + + + + + + + M + + Hugh + Reed + + + + + + + + + + + + + + M + + John + Reed + + + + + + + + + + + + + + F + + Bridgette + Reed + + + + + + + + + + + + + + F + + Mary + Reed + + + + + + + + + + + + + + M + + Myles + Тихонов + + + + + + + + + + F + + Elizabeth + Warner + + + + + + + + + + M + + John + Тихонов + + + + + + + + + + F + + Mary Ellen + Тихонов + + + + + + + + + + + M + + ????? + Brown + + + + + + M + + William Jr. + Rhodes + + + + + + + + + + M + + Donald E. + Rhodes + + + + + + + + + + + + + + + + + + F + + Mary Jane + Rhodes + + + + + + + + + + + + + + + M + + ?m.MaryJane + Evans + + + + + + M + + James Patrick + Evans + + + + + + + + + + + + + + F + + Patricia Kay + Evans + + + + + + + + + + + + + M + + Michael Patrick + Evans + + + + + + + + + + + + + M + + John + Piotrowski + + + + + + + + + + + + + + F + + Christian Anne + Evans + + + + + + + + + + + + + F + + Heather Lee + Evans + + + + + + + + + + + + + F + + Jane Coppage + Payne + + + + + + + + + + + + + + + + + + + M + + Sir John + Piotrowski + + + + + + + + + + + + + + M + + Mathew + Keller + + + + + + M + + Sir Michael + Piotrowski + + + + + + + + + + + + + + F + + ????? + Keller + + + + + + F + + Olive + Todd + + + + + + M + + John Sr. + Parent + + + + + + M + + James + James + + + + + + M + + Hodges + Todd + + + + + + + + + + + M + + Robert + James + + + + + + + M + + Joseph Louis(Jr.) + Benson + + + + + + + + + + + + + + + + + + + F + + Jeanne + Richard + + + + + + + + + + + + + + + + + + M + + John + Harvey + + + + + + F + + Lydia + Harvey + + + + + + + F + + Mary + Malone + + + + + + F + + ??? + Frank + + + + + + + + + M + + Capt. Francis + Warner + + + + + + + + + + + + + + + F + + Mary + Ingram + + + + + + + + + + + + + + M + + Miles? + Тихонов + + + + + + + + + + + + + + F + + Lucy + Piotrowski + + + + + + F + + Anastasia? + Smith + + + + + + + + + + + + + + F + + ??? + Sharp + + + + + + + + + + + + + + + + + + M + + John Jr. + Piotrowski + + + + + + + + + F + + Alice + Jacobs + + + + + M + + Thomas + Anderson + + + + + + + + + + + + + + F + + Sarah + Carpenter + + + + + + + + + + M + + Samuel + Anderson + + + + + + + + + + + + + + + F + + Elizabeth + Филиппов + + + + + + + + + + + + + + M + + John + Christiansen + + + + + + + + + + + + + + + F + + Martha + Harmon + + + + + + + + + M + + Hardy + Todd + + + + + + + + + + + + + + M + + John + Norris + + + + + + + + + + + + + + + + + + + + F + + Mary (Sarah) + Howell + + + + + + + + + + + + + + + + + + + M + + Joseph + Grenier + + + + + + + + + + + + + + + + + + F + + Rose + Peters + + + + + + + + + + + + + + + + + + + M + + Jeffrey + Alvarado + + + + + + F + + Ellen + Гончаров + + + + + + + + + + + + + + F + + Mary + Ramos + + + + + + + + + + + + + + + + + + + M + + John + Злобин + + + + + + + + + + + + + + M + + Lord Samuel + Ferguson + + + + + + + + + + M + + Johanne(John) + Webster + + + + + + + + + + + + + + + F + + Susannah + Cole + + + + + + + + + F + + Ursula + Saunders + + + + + + + + + + + + + + M + + Zariakius Cyriacus + æ–Žè—¤ + + + + + + + + + + + + + + + F + + Anna Barbara + Bishop + + + + + + + + + + + + + + + M + + Jacob A. + Carroll + + + + + + + + + + + + + + + F + + Maria Catharina + Ðиколаев + + + + + + + + + + + M + + Rev. Samuel + Воробьев + + + + + + M + + Antoine Desaure Perronett + 山本 + + + + + + + + + + + M + + Joseph Louis(Sr.) + Benson + + + + + + + + + + + F + + Sarah + Simard + + + + + + + + + + + M + + Thomas + Simard + + + + + + + + + + M + + Charles + Todd + + + + + + + + + + + + + + M + + Col. Joseph + Benson + + + + + + + + + + M + + William + Benson + + + + + + + + + + + M + + David + Benson + + + + + + + + + + + + + M + + John + Benson + + + + + + + + + + M + + Col. David + Benson + + + + + + + + + + + + + + M + + Romaine + Thornton + + + + + + F + + Harriet + Soto + + + + + + F + + Katherine + Белов + + + + + + M + + Jacob Earl + Wheeler + + + + + + M + + Richard Max + Wheeler + + + + + + + + + + + + + F + + Eurydice + Cole + + + + + + + + + F + + Lynnett Diane + Wheeler + + + + + + + + + + + + + M + + Jason Earl + Wheeler + + + + + + + + + + + + + M + + David + Kelly + + + + + F + + Ashley Diane + Kelly + + + + + + + + + + + + M + + David Lee + Fitzgerald + + + + + + M + + Terry Lee + Garrett + + + + + + + + + + + + + + F + + Gail + Holloway + + + + + + + + + + + + M + + Wayne Allen + Garrett + + + + + + + + + + + + + + M + + John + Rodgers + + + + + + F + + Shawna Marie + Rodgers + + + + + + + + + + + + + M + + John + Todd + + + + + + + + + + + + + + + F + + Crystal Mae + Rodgers + + + + + + + + + + + + + M + + John + ГераÑимов + + + + + + + + + + + + M + + Remo + Lane + + + + + + + + + + + + + + + + + F + + Ernestina + Barnes + + + + + + + + + + + + + + + + + + M + + Samuel C. + Козлов + + + + + + F + + Julia + Pena + + + + + + M + + Clarence + Webb + + + + + + + + + + + + + + + + + + M + + Lawrence + Webb + + + + + + + + + + + + + + + + + + F + + Margaret Mary? + Dunn + + + + + + + + + + M + + John + Henry + + + + + + F + + Elinor Jane + Lessard + + + + + + + + + + + + + + F + + Elizabeth + Лалетин + + + + + + F + + Elizabeth + Henry + + + + + + + + + + + + + + + + + + M + + David + Boucher + + + + + + + + + + + + + + + + + + F + + Nancy + Morrison + + + + + + + + + + + + + + + + + + F + + Catherine + Boucher + + + + + + + + + + + + + + + + + + + M + + Patrick + Boucher + + + + + + + + + + + + + + + + + + + F + + Bridget + Boucher + + + + + + + + + + M + + William + Boucher + + + + + + + + + + + + + + + + + + + F + + Monica + Ðикитин + + + + + + + + + + + + + + M + + Flannan + Boucher + + + + + + + + + + + + + F + + Miread + Boucher + + + + + + + + + + + + + + M + + William + Todd + + + + + + + + + + + + + + + + + + + M + + Michael + Boucher + + + + + + + + + M + + William + Boucher + + + + + + + + + + + + + + + + + + + M + + William + Boucher + + + + + + + + + + + + + + + + + + + M + + Stephen Francis + Boucher + + + + + + + + + + + + + + + + + + + F + + Rose Mary + Boucher + + + + + + + + + + + + + + M + + Thomas + Hansen + + + + + + + + + + + + + M + + Noel + Hansen + + + + + + + + + + + + + + F + + Nula + Hansen + + + + + + + + + + + F + + Irene + Hansen + + + + + + + + + + + F + + Monica + Hansen + + + + + + + + + + + F + + Mary (Polly) + 渡辺 + + + + + + + + + + + + + + + + + + M + + Damian + Карпов + + + + + + + + + + F + + Sarah + Карпов + + + + + + + + + + + + + F + + Helen + Ramirez + + + + + + + + + + M + + Barry + Hansen + + + + + + + + + + M + + Kevin + Hansen + + + + + + + + + + M + + Joseph + Alonso + + + + + + + + + + F + + Roisine + Alonso + + + + + + + + + + F + + Laura + Alonso + + + + + + + + + + F + + Anne + Boucher + + + + + + + + + + + + + + F + + Mary + Boucher + + + + + + + + + + + + + + M + + George W. + Todd + + + + + + + + + + + + + + + + + + + F + + Martha + Boucher + + + + + + + + + + + + + + F + + Bridget + Boucher + + + + + + + + + + + + + + F + + Agnes + Boucher + + + + + + + + + + + + + + F + + Norene + Boucher + + + + + + + + + + + + + + F + + Bridget M. + Fields + + + + + + + + + + + + + + + + + + F + + Bridget + Thompson + + + + + + + + + + + + + + + + + + F + + Mary + Gardner + + + + + + + + + + + + + + + + + + F + + Nora + Gil + + + + + + + + + + + + + + + + + + F + + Honora + Savard + + + + + + + + + + + + + + + + + + F + + Jane + Morris + + + + + + + + + + + + + + + + + + + M + + Fr. Patrick + Boucher + + + + + + + + + + M + + Fr. Daniel Gabriel + Boucher + + + + + + + + + + + + + + M + + Prof. William Joseph + Boucher + + + + + + + + + + + + + + M + + William Donel + Boucher + + + + + + + + + M + + Michael + Gardner + + + + + + + + + + M + + Thomas + Warner + + + + + + + + + + + M + + Rev. Edmund + Warner + + + + + + + + + + + + + + + M + + Sir Francis + Warner + + + + + + + + + + + + + + + + + + M + + Yelverton + Green + + + + + + + + + F + + Elizabeth + Robertson + + + + + + + + + M + + John M. + Todd + + + + + + + + + + + + + + + + + + + M + + John + Peters + + + + + + M + + George Sr. + Peters + + + + + + + + + + + + + + + + + + + F + + Joan + Ramsey + + + + + + M + + Irwin Arthur + Welch + + + + + + + + + + + + + + + + + + M + + Otis Earl + Padilla + + + + + + M + + Russell Eugene + Welch + + + + + + + + + + + + + + + F + + Dorothy + Norton + + + + + + + + + + + + F + + Penelope + Walsh + + + + + + + + + + + + F + + Annabelle Elaine + Welch + + + + + + + + + + + + + + M + + Stephen + Brock + + + + + + + + + + + + M + + Benjamin H. + Farmer + + + + + + + + + + + + + + + + + + + F + + Rosalie Jane + Welch + + + + + + + + + + + + + + M + + David Andrew + Sánchez + + + + + + + + + + + + M + + Lance Edward + Brock + + + + + + + + + + + + + F + + Celeste Ellen + Brock + + + + + + + + + + + + + F + + Roxanne Marie + Sánchez + + + + + + + + + + + + + M + + Jonathan Andrew + Sánchez + + + + + + + + + + + + + F + + Jennifer Leigh + Hawkins + + + + + + + + + + + + + + F + + Edith Irene + Zimmerman + + + + + + + + + + + + + + + + + + M + + Mark John + Matthews + + + + + + M + + Jeffrey George + Warner + + + + + + + + + + + + + F + + Isabella + Mills + + + + + + + + + + + + + + + + + + F + + April Lynn + Vázquez + + + + + + + + + + + + + F + + Mary Jane + Gardner + + + + + + + + + + + + + + + F + + Mary + Walters + + + + + + + + + + + + + + + + + + + F + + Malvina + Blanco + + + + + + + + + + + + + + + + + + + M + + John W. + Blanco + + + + + + + + + + F + + Mary F. + Blanco + + + + + + + + + + + M + + Paris + Blanco + + + + + + + + + + M + + Abram + Quinn + + + + + + + + + + + + + + + + + M + + Stephen + Blanco + + + + + + + + + + + + + + + + + + M + + Milton + Blanco + + + + + + + + + + F + + Elizabeth Ellen + Farmer + + + + + + + + + + + + + + + + + + + F + + L. J. + Blanco + + + + + + + + + + M + + James + Myers + + + + + + + + + + + + + + + + + M + + James Joseph Jr. + Myers + + + + + + + + + + + + + + + + + F + + Nina Mae + Myers + + + + + + + + + + + F + + Marilyn + Coleman + + + + + + + + + + + + F + + Linda S. + Gonzales + + + + + + + + + + + + M + + Mark R. + Gonzales + + + + + + + + + + + + M + + ??? + Lessard + + + + + + + + + + F + + ??? + Castro + + + + + + + + + + + M + + George + Domínguez + + + + + + + + + + M + + John + Reed + + + + + + + + + + + + + + + + + + F + + Nancy + МакÑимов + + + + + + + + + + + + + + + + + + + F + + Edith Irene + Zimmerman + + + + + + + + F + + Dorothy Louise + Norman + + + + + + + + + + + + + M + + Dwayne Alan + Page + + + + + + + + + + + + + + F + + Cheryl Lee + Scott + + + + + + F + + Sylvia Louise + Page + + + + + + + + + + + + + + M + + Roger Joseph + Boucher + + + + + + + + + + + + M + + Marvin Ray + Page + + + + + + + + + + + + + + F + + Gail Darlene + Morton + + + + + + M + + David Alan + Page + + + + + + + + + + + + + M + + Matthew Steven + Warner + + + + + + + + + + + + + F + + Sarah + Goodwin + + + + + + + + + + + + + + + + + + M + + Mitchell Lee + Page + + + + + + + + + + + + + M + + Todd Christopher + Page + + + + + + + + + + + + + F + + Cynthia Louise + Boucher + + + + + + + + + + + + + + M + + Merrick + Cobb + + + + + + M + + Steven Joseph + Boucher + + + + + + + + + + + + + + F + + Arlene + Nelson + + + + + + M + + Kyle Joseph + Boucher + + + + + + + + + + + + F + + Debra Dale + Page + + + + + + + + + + + + + + M + + Thomas + Woźniak + + + + + + M + + Darvin Ray + Page + + + + + + + + + + + + + M + + Moses + Тихонов + + + + + + + + + + + + + + + + + + + M + + Loren + Collins + + + + + + F + + Susan + Stevenson + + + + + + M + + Daniel Arthur + Warner + + + + + + + + + + + + M + + Michael + Watts + + + + + M + + Dennis + Сергеев + + + + + + M + + Gerhard + Blanco + + + + + + + + + + + + + + + F + + Catharine + БелоуÑов + + + + + + + + + + + + + + + + + + + M + + Peter + Blanco + + + + + + + F + + Elizabeth + Glover + + + + + + M + + John Sr. + Blanco + + + + + + + + + + + + + + + + + + + F + + Bridget + Holt + + + + + + + + + + + + + + + + + + + F + + Christina + Lucas + + + + + + + + + + + + + + + + + + F + + Mary"Polly" + Douglas + + + + + + + + + + + + + + + + + + + M + + Mr. + Blanco + + + + + + + + + M + + Hans + Blanco + + + + + + + + + M + + Hans + Blanco + + + + + + + + + F + + Bendichtli + Fisher + + + + + + + + + M + + Bendicht + Blanco + + + + + + + + + + M + + Hans + Blanco + + + + + + + + + + + F + + Elsbeth + Buchanan + + + + + + + + + M + + Heinrich + Blanco + + + + + + + + + + + M + + Alfred Franklin(Frank) + Marín + + + + + + + + + + + + + + + + + + + F + + Barbli + Schmidt + + + + + + + + + + M + + Hans(Johannes) + Blanco + + + + + + + + + + + + + + + F + + Anna + Sullivan + + + + + + + + + + M + + Hans + Austin + + + + + + F + + Maria + Burke + + + + + + M + + Peter + Jenkins + + + + + + + + + + + + F + + Margaret + Marsh + + + + + + + + + + + + M + + Mathas + Fortin + + + + + M + + Johannas + Austin + + + + + + + + + + F + + Margaret + Jenkins + + + + + + + + + + + + + F + + Martha Frances "Fannie" + Floyd + + + + + + + + + + + + + + + + + + + + M + + Hans + Reid + + + + + + + + + + + + F + + Cathern + Семенов + + + + + + + + + + + + M + + Jacob + БелоуÑов + + + + + + + + + + + + + + + + + + F + + Marie + Suárez + + + + + + + + + + + + + M + + Matthias + Fortin + + + + + + + + + + + + + F + + Margaret + Baker + + + + + + + + + + + + M + + Johannas Jacob + БелоуÑов + + + + + + + + + + + + + + + + + + + F + + Anna Catherina + Reid + + + + + + + + + + + + + + + + + + M + + William + Marín + + + + + + + + + + + + + + M + + Rev.Isaac + Schultz + + + + + + + + + + + + + + + + + + + M + + Michael + Boucher + + + + + + + + + + + + + + + + + + + F + + Elizabeth + Francis + + + + + + + + + + + + + + F + + Mary + Turner + + + + + + M + + John + Aguilar + + + + + + + + + + + + + + M + + JOHN + Howell + + + + + + + + + + + + + M + + George + Payne + + + + + + + + + + + + + + + + + + + M + + Marquis I + Brooks + + + + + + + + + + + + + + + M + + Major Marquis II + Brooks + + + + + + + + + + + + + + + F + + Winifred + Rubio + + + + + + + + + + + + + + + + + + + F + + Elizabeth"Betty" + Brooks + + + + + + + + + + + + + + + + + + + F + + Honora + Boucher + + + + + + + + + + + + + + + + + + M + + Leonard + Payne + + + + + + + + + + + + + + + + + + F + + Elizabeth + Hall + + + + + + + + + + + + + + M + + Leonard? + Payne + + + + + + + + + + + + + + + + + + + M + + David + Reynolds + + + + + + + + + + + + + + + + + + + M + + Col. John + Reynolds + + + + + + + + + + + + + + + + + + + M + + Nicholas + Reynolds + + + + + + + + + + + + + + + + + + + M + + William + Reynolds + + + + + + + + + + + + + + + + + + + M + + John + Reynolds + + + + + + + + + + + + + + + F + + Mary Jane + Reynolds + + + + + + + + + + + + + + + M + + Moses Aaron + Дмитриев + + + + + + + + + + + + + + + + + + + M + + Thomas + Fernandez + + + + + + + + + + + + + + + + + + + + F + + Frances + Diaz + + + + + + + + + + + + + + + + + + + F + + Maggie Leigh + Jørgensen + + + + + + + + + + + + + M + + George + ШеÑтаков + + + + + + + + + + + + + + + + + + F + + Phoebe + Daniels + + + + + + + + + + M + + Thomas + Riley + + + + + + + + + + + + + + M + + Henry + Martel + + + + + + + + + + + + + + + + + + F + + Ruth Ann + Hébert + + + + + + + + + + + + + M + + Aaron Patrick + Osborne + + + + + + + + + + + + + + + + + + F + + Heather Kathleen + Gordon + + + + + + M + + Corey + Willis + + + + + + F + + Catherine + Ortega + + + + + + + + + + + + + F + + Carissa Nicole + Willis + + + + + + + + + + + + + F + + Melany + Haynes + + + + + + + + + + + + + F + + Patricia + Худоногов + + + + + + F + + Whitney Lianne + Warner + + + + + + + + + + + + + M + + William + Diaz + + + + + + + + + + + + + + + + F + + Anne + Baldwin + + + + + + + + + + + + + + + + + + M + + Charles Sr. + Дмитриев + + + + + + + + + + + + + + + F + + Lucy aka Sarah + Lapointe + + + + + + + + + + + + + M + + John + Howell + + + + + + + + + + + + + + + + + + F + + Sarah + Yates + + + + + + + + + + + + + + + + + + M + + Thomas + Fernandez + + + + + + + + + + + + + + M + + Andrew + Webb + + + + + + + + + + + + + + + + + + + F + + Margaret Margarite? + Webb + + + + + + + + + + + + + + + + + + + M + + Delgado + + + + + + + + + + + + + + F + + Mary A. + Tyler + + + + + + + + + + + + + + + + + + M + + Alexander + Webb + + + + + + + + + + + + + + + + + + + F + + Mary Ann + Delgado + + + + + + + + + + + + + + + M + + Frederick + Douglas + + + + + + + + + + F + + Barbara + Stanley + + + + + + + + + + M + + William J. + Boucher + + + + + + + + + F + + Ann + Rose + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page pi + + + Courtesy of pyschoanalyze-pinhead from Emacs. + +I am the psychotherapist. Please, describe your problems. Each time +you are finished talking, type RET twice. + +SHHHH!! I hear SIX TATTOOED TRUCK-DRIVERS tossing ENGINE BLOCKS + into empty OIL DRUMS.. + +Why do you say that? + +I have accepted Provolone into my life! + +What makes you believe you have accepted provolone into your life? + +It's 74 degrees, 12 minutes NORTH, and 41 degrees, 3 minutes EAST!! + Soon, it will be TUESDAY!! + +Maybe your plans have something to do with this. + +GOOD-NIGHT, everybody.. Now I have to go administer FIRST-AID + to my pet LEISURE SUIT!! + +I don't understand. + +I'm QUIETLY reading the latest issue of ``BOWLING WORLD'' + while my wife and two children stand QUIETLY BY.. + +Tell me something about your family. + +How do I get HOME? + +Is it because do you get home that you came to me? + +Kids, the seven basic food groups are GUM, PUFF PASTRY, PIZZA, + PESTICIDES, ANTIBIOTICS, NUTRA-SWEET and MILK DUDS!! + + GRAMPS aid to look for its tree to him of family. It allows that you store data of genealogische to draw for above and investigating. GRAMPS tries to make all the general capacities available of other programs of genealogischer more importantly but, to put an additional capacity of integration at your service not generally for these programs. This one is the capacity to directly incorporate all the possible pieces of the information in Gramps and the cases of the data cambiar/manipulateany/all in the whole data base (in any order or order) around the user to support, if it makes the investigation, analysis and interrelation with the potential of the distances of the relation that fill. + +This is a paragraph from the gramps-project.org page that was translated by Google's Language Tools to German, back to English, then to Spanish, and once again back to English. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + World of the Wierd + John Jacob Jinglehiemerschmitt + WOTW + His name is my name, too. + + + Import from test2.ged + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/gramps.sh.in b/gramps.sh.in index b42bbee73..f12b319db 100644 --- a/gramps.sh.in +++ b/gramps.sh.in @@ -36,4 +36,4 @@ else export PYTHONPATH=$GRAMPSDIR:$GRAMPSLIBDIR:$GRAMPSPLUGINSDIR:$PYTHONPATH fi -exec @PYTHON@ $GRAMPSDIR/gramps.py $* +exec @PYTHON@ $GRAMPSDIR/gramps.py "$@" diff --git a/src/AddMedia.py b/src/AddMedia.py index e3c814fa8..bca7fb1d7 100644 --- a/src/AddMedia.py +++ b/src/AddMedia.py @@ -30,6 +30,7 @@ Provides the interface to allow a person to add a media object to the database. # #------------------------------------------------------------------------- import os +import gc #------------------------------------------------------------------------- # @@ -45,8 +46,8 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- from QuestionDialog import ErrorDialog +from WindowUtils import GladeIf import gtk.glade -import gnome #------------------------------------------------------------------------- # @@ -58,6 +59,7 @@ import Utils import RelImage import RelLib import GrampsMime +import GrampsDisplay #------------------------------------------------------------------------- # @@ -89,12 +91,9 @@ class AddMediaObject: Utils.set_titles(self.window,self.glade.get_widget('title'), _('Select a media object')) - - self.glade.signal_autoconnect({ - "on_fname_update_preview" : self.on_name_changed, - "on_help_imagesel_clicked" : self.on_help_imagesel_clicked, - }) - + + self.gladeif = GladeIf(self.glade) + self.gladeif.connect('fname', 'update_preview', self.on_name_changed) self.window.show() def internal_toggled(self, obj): @@ -102,7 +101,7 @@ class AddMediaObject: def on_help_imagesel_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-edit-quick') + GrampsDisplay.help('gramps-edit-quick') self.val = self.window.run() def on_savephoto_clicked(self): @@ -156,8 +155,9 @@ class AddMediaObject: if old_title == '' or old_title == self.temp_name: self.description.set_text(root) self.temp_name = root - - if os.path.isfile(filename): + + filename = Utils.find_file( filename) + if filename: mtype = GrampsMime.get_type(filename) if mtype and mtype.startswith("image"): image = RelImage.scale_image(filename,const.thumbScale) @@ -172,10 +172,12 @@ class AddMediaObject: if val == gtk.RESPONSE_OK: self.on_savephoto_clicked() self.window.destroy() + gc.collect() return self.object elif val == gtk.RESPONSE_HELP: self.on_help_imagesel_clicked(None) else: self.window.destroy() + gc.collect() return None return None diff --git a/src/AddSpouse.py b/src/AddSpouse.py index ceccf4f92..3442b7a6e 100644 --- a/src/AddSpouse.py +++ b/src/AddSpouse.py @@ -34,6 +34,7 @@ __version__ = "$Revision$" # #------------------------------------------------------------------------- from gettext import gettext as _ +import gc #------------------------------------------------------------------------- # @@ -41,7 +42,6 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk.glade -import gnome import gobject #------------------------------------------------------------------------- @@ -49,17 +49,18 @@ import gobject # gramps modules # #------------------------------------------------------------------------- +import GrampsDisplay import RelLib import const import Utils import PeopleModel import Date -import DateHandler import Marriage import NameDisplay import GenericFilter from QuestionDialog import ErrorDialog, QuestionDialog2 import AutoComp +from WindowUtils import GladeIf #------------------------------------------------------------------------- # @@ -94,6 +95,7 @@ class AddSpouse: # the same gender as the current person. self.glade = gtk.glade.XML(const.gladeFile, "spouseDialog","gramps") + self.gladeif = GladeIf(self.glade) self.rel_combo = self.glade.get_widget("rel_combo") self.spouse_list = self.glade.get_widget("spouse_list") @@ -115,15 +117,14 @@ class AddSpouse: Utils.set_titles(self.window, self.glade.get_widget('title'),title, _('Choose Spouse/Partner')) - - self.glade.signal_autoconnect({ - "on_select_spouse_clicked" : self.select_spouse_clicked, - "on_spouse_help_clicked" : self.on_spouse_help_clicked, - "on_show_toggled" : self.on_show_toggled, - "on_new_spouse_clicked" : self.new_spouse_clicked, - "destroy_passed_object" : Utils.destroy_passed_object - }) + self.gladeif.connect('button117','clicked',self.close) + self.gladeif.connect('spouseDialog','delete_event',self.delete_event) + self.gladeif.connect('spouse_ok','clicked',self.select_spouse_clicked) + self.gladeif.connect('spouse_help','clicked',self.on_spouse_help_clicked) + self.gladeif.connect('spouseNewPerson','clicked',self.new_spouse_clicked) + self.gladeif.connect('showall','clicked',self.on_show_toggled) + self.rel_selector = AutoComp.StandardCustomSelector( Utils.family_relations,self.rel_combo, RelLib.Family.CUSTOM,RelLib.Family.MARRIED) @@ -132,6 +133,13 @@ class AddSpouse: self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) gobject.idle_add(self.update_data) + def delete_event(self,obj): + self.gladeif.close() + + def close(self,obj): + self.gladeif.close() + self.window.destroy() + def build_all(self): return None @@ -169,7 +177,7 @@ class AddSpouse: def on_spouse_help_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-edit-quick') + GrampsDisplay.help('gramps-edit-quick') def get_selected_ids(self): mlist = [] @@ -289,7 +297,9 @@ class AddSpouse: if not self.active_family: self.active_family = RelLib.Family() - self.db.add_family(self.active_family,trans) + gid = self.db.find_next_family_gramps_id() + self.active_family.set_gramps_id(gid) + self.active_family.set_handle(self.db.create_id()) self.person.add_family_handle(self.active_family.get_handle()) self.db.commit_person(self.person,trans) @@ -309,63 +319,13 @@ class AddSpouse: self.db.transaction_commit(trans,_("Add Spouse")) Utils.destroy_passed_object(obj) + gc.collect() m = Marriage.Marriage(self.parent, self.active_family, self.parent.db) m.on_add_clicked() def relation_type_changed(self,obj): gobject.idle_add(self.update_data) - def all_filter(self, person): - return person.get_gender() != self.sgender - - def likely_filter(self, person): - if person.get_gender() == self.sgender: - return False - - pd_id = person.get_death_handle() - pb_id = person.get_birth_handle() - - if pd_id: - pdday = self.db.get_event_from_handle(pd_id).get_date_object() - else: - pdday = Date.Date() - - if pb_id: - pbday = self.db.get_event_from_handle(pb_id).get_date_object() - else: - pbday = Date.Date() - - if self.bday.get_year_valid(): - if pbday.get_year_valid(): - # reject if person birthdate differs more than - # 100 years from spouse birthdate - if abs(pbday.get_year() - self.bday.get_year()) > 100: - return 0 - - if pdday.get_year_valid(): - # reject if person birthdate is after the spouse deathdate - if self.bday.get_year() + 10 > pdday.get_high_year(): - return 0 - - # reject if person birthdate is more than 100 years - # before the spouse deathdate - if self.bday.get_high_year() + 100 < pdday.get_year(): - return 0 - - if self.dday.get_year_valid(): - if pbday.get_year_valid(): - # reject if person deathdate was prior to - # the spouse birthdate - if self.dday.get_high_year() < pbday.get_year() + 10: - return 0 - - if pdday.get_year_valid(): - # reject if person deathdate differs more than - # 100 years from spouse deathdate - if abs(pdday.get_year() - self.dday.get_year()) > 100: - return 0 - return 1 - def set_gender(self): rel_i,rel_s = self.rel_selector.get_values() if rel_i == RelLib.Family.CIVIL_UNION: diff --git a/src/AddrEdit.py b/src/AddrEdit.py index 417b90b3b..844458a51 100644 --- a/src/AddrEdit.py +++ b/src/AddrEdit.py @@ -31,6 +31,7 @@ mechanism for the user to edit address information. # #------------------------------------------------------------------------- from gettext import gettext as _ +import gc #------------------------------------------------------------------------- # @@ -38,13 +39,13 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk.glade -import gnome #------------------------------------------------------------------------- # # gramps modules # #------------------------------------------------------------------------- +import GrampsDisplay import const import Utils import Date @@ -54,6 +55,8 @@ import DateEdit import DateHandler import Spell +from WindowUtils import GladeIf + #------------------------------------------------------------------------- # # AddressEditor class @@ -87,23 +90,36 @@ class AddressEditor: # Get the important widgets from the glade description self.top = gtk.glade.XML(const.dialogFile, "addr_edit","gramps") + self.gladeif = GladeIf(self.top) + self.window = self.top.get_widget("addr_edit") self.addr_start = self.top.get_widget("address_start") + self.addr_start.set_editable(not self.db.readonly) self.street = self.top.get_widget("street") + self.street.set_editable(not self.db.readonly) self.city = self.top.get_widget("city") + self.city.set_editable(not self.db.readonly) self.state = self.top.get_widget("state") + self.state.set_editable(not self.db.readonly) self.country = self.top.get_widget("country") + self.country.set_editable(not self.db.readonly) self.postal = self.top.get_widget("postal") + self.postal.set_editable(not self.db.readonly) self.phone = self.top.get_widget("phone") + self.phone.set_editable(not self.db.readonly) self.note_field = self.top.get_widget("addr_note") + self.note_field.set_editable(not self.db.readonly) self.spell = Spell.Spell(self.note_field) self.priv = self.top.get_widget("priv") + self.priv.set_sensitive(not self.db.readonly) self.slist = self.top.get_widget("slist") self.sources_label = self.top.get_widget("sources_tab") self.notes_label = self.top.get_widget("note_tab") self.general_label = self.top.get_widget("general_tab") self.flowed = self.top.get_widget("addr_flowed") + self.flowed.set_sensitive(not self.db.readonly) self.preform = self.top.get_widget("addr_preform") + self.preform.set_sensitive(not self.db.readonly) title_label = self.top.get_widget("title") @@ -123,9 +139,9 @@ class AddressEditor: if self.addr.get_note(): self.note_field.get_buffer().set_text(self.addr.get_note()) Utils.bold_label(self.notes_label) - if addr.get_note_format() == 1: + if addr.get_note_format() == 1: self.preform.set_active(1) - else: + else: self.flowed.set_active(1) Utils.bold_label(self.general_label) else: @@ -143,16 +159,17 @@ class AddressEditor: self.top.get_widget('del_src'), self.db.readonly) date_stat = self.top.get_widget("date_stat") + date_stat.set_sensitive(not self.db.readonly) self.date_check = DateEdit.DateEdit( self.addr_date_obj, self.addr_start, date_stat, self.window) - self.top.signal_autoconnect({ - "on_switch_page" : self.on_switch_page, - "on_help_addr_clicked" : self.on_help_clicked, - "on_ok_addr_clicked" : self.ok_clicked, - "on_cancel_addr_clicked" : self.close, - "on_addr_edit_delete_event" : self.on_delete_event, - }) + self.gladeif.connect('addr_edit','delete_event',self.on_delete_event) + self.gladeif.connect('button122','clicked',self.close) + self.gladeif.connect('button121','clicked',self.ok_clicked) + okbtn = self.top.get_widget('button121') + okbtn.set_sensitive(not self.db.readonly) + self.gladeif.connect('button129','clicked',self.on_help_clicked) + self.gladeif.connect('notebook2','switch_page',self.on_switch_page) if parent_window: self.window.set_transient_for(parent_window) @@ -162,11 +179,15 @@ class AddressEditor: def on_delete_event(self,obj,b): self.close_child_windows() self.remove_itself_from_menu() + self.gladeif.close() + gc.collect() def close(self,obj): self.close_child_windows() self.remove_itself_from_menu() + self.gladeif.close() self.window.destroy() + gc.collect() def close_child_windows(self): for child_window in self.child_windows.values(): @@ -197,7 +218,7 @@ class AddressEditor: def on_help_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','adv-ad') + GrampsDisplay.help('adv-ad') def ok_clicked(self,obj): """ diff --git a/src/ArgHandler.py b/src/ArgHandler.py index e371ff117..7d999d32f 100644 --- a/src/ArgHandler.py +++ b/src/ArgHandler.py @@ -33,7 +33,6 @@ Module responsible for handling the command line arguments for GRAMPS. #------------------------------------------------------------------------- import os import getopt -import time from gettext import gettext as _ #------------------------------------------------------------------------- @@ -50,6 +49,7 @@ import GrampsKeys import RecentFiles import PluginMgr import Report +import Tool #------------------------------------------------------------------------- # @@ -203,8 +203,8 @@ class ArgHandler: outformat = 'geneweb' elif outfname[-6:].upper() == "GRAMPS": outformat = 'gramps-xml' - elif fname[-3:].upper() == "GRDB": - format = 'grdb' + elif outfname[-4:].upper() == "GRDB": + outformat = 'grdb' else: print "Unrecognized format for output file %s" % outfname print "Ignoring output file: %s" % outfname @@ -212,7 +212,7 @@ class ArgHandler: self.exports.append((outfname,outformat)) elif o in ( '-a', '--action' ): action = v - if action not in ( 'check', 'summary', 'report' ): + if action not in ( 'check', 'summary', 'report', 'tool' ): print "Unknown action: %s. Ignoring." % action continue options_str = "" @@ -372,24 +372,24 @@ class ArgHandler: "supply at least one input file to process." print "Launching interactive session..." -# if self.parent.cl: -# for expt in self.exports: -# print "Exporting: file %s, format %s." % expt -# self.cl_export(expt[0],expt[1]) + if self.parent.cl: + for (action,options_str) in self.actions: + print "Performing action: %s." % action + if options_str: + print "Using options string: %s" % options_str + self.cl_action(action,options_str) -# for (action,options_str) in self.actions: -# print "Performing action: %s." % action -# if options_str: -# print "Using options string: %s" % options_str -# self.cl_action(action,options_str) - -# print "Cleaning up." -# # remove import db after use -# self.parent.db.close() -# if self.imports: -# os.remove(self.imp_db_path) -# print "Exiting." -# os._exit(0) + for expt in self.exports: + print "Exporting: file %s, format %s." % expt + self.cl_export(expt[0],expt[1]) + + print "Cleaning up." + # remove import db after use + self.parent.db.close() + if self.imports: + os.remove(self.imp_db_path) + print "Exiting." + os._exit(0) if self.imports: self.parent.import_tool_callback() @@ -495,7 +495,14 @@ class ArgHandler: Try to write into filename using the format. Any errors will cause the os._exit(1) call. """ - if format == 'gedcom': + if format == 'grdb': + import WriteGrdb + try: + WriteGrdb.exportData(self.parent.db,filename) + except: + print "Error exporting %s" % filename + os._exit(1) + elif format == 'gedcom': import WriteGedcom try: gw = WriteGedcom.GedcomWriter(self.parent.db,None,1,filename) @@ -592,18 +599,44 @@ class ArgHandler: category = item[1] report_class = item[2] options_class = item[3] - if category in (const.CATEGORY_BOOK,const.CATEGORY_CODE, - const.CATEGORY_WEB): + if category in (Report.CATEGORY_BOOK,Report.CATEGORY_CODE, + Report.CATEGORY_WEB): options_class(self.parent.db,name, category,options_str_dict) else: Report.cl_report(self.parent.db,name,category, - report_class,options_class,options_str_dict) + report_class,options_class, + options_str_dict) return print "Unknown report name. Available names are:" for item in PluginMgr.cl_list: print " %s" % item[0] + elif action == "tool": + try: + options_str_dict = dict( [ tuple(chunk.split('=')) for + chunk in options_str.split(',') ] ) + except: + options_str_dict = {} + print "Ignoring invalid options string." + + name = options_str_dict.pop('name',None) + if not name: + print "Tool name not given. Please use name=toolname" + os._exit(1) + + for item in PluginMgr.cli_tool_list: + if name == item[0]: + category = item[1] + tool_class = item[2] + options_class = item[3] + Tool.cli_tool(self.parent.db,name,category, + tool_class,options_class,options_str_dict) + return + + print "Unknown tool name. Available names are:" + for item in PluginMgr.cli_tool_list: + print " %s" % item[0] else: print "Unknown action: %s." % action os._exit(1) diff --git a/src/AttrEdit.py b/src/AttrEdit.py index 1491378c0..2e70fefe9 100644 --- a/src/AttrEdit.py +++ b/src/AttrEdit.py @@ -34,6 +34,8 @@ __version__ = "$Revision$" # #------------------------------------------------------------------------- from gettext import gettext as _ +import gc +from cgi import escape #------------------------------------------------------------------------- # @@ -41,7 +43,6 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk.glade -import gnome #------------------------------------------------------------------------- # @@ -54,8 +55,10 @@ import Sources import AutoComp import RelLib import Spell +import GrampsDisplay from QuestionDialog import WarningDialog +from WindowUtils import GladeIf #------------------------------------------------------------------------- # @@ -125,7 +128,7 @@ class AttributeEditor: if title == ", ": title = _("Attribute Editor") else: - title = _("Attribute Editor for %s") % title + title = _("Attribute Editor for %s") % escape(title) l = self.top.get_widget("title") Utils.set_titles(self.window,l,title,_('Attribute Editor')) @@ -144,14 +147,23 @@ class AttributeEditor: else: Utils.unbold_label(self.notes_label) - self.top.signal_autoconnect({ - "on_help_attr_clicked" : self.on_help_clicked, - "on_ok_attr_clicked" : self.on_ok_clicked, - "on_cancel_attr_clicked" : self.close, - "on_attr_edit_delete_event" : self.on_delete_event, - "on_switch_page" : self.on_switch_page - }) + self.gladeif = GladeIf(self.top) + self.gladeif.connect('attr_edit','delete_event', self.on_delete_event) + self.gladeif.connect('button116', 'clicked', self.close) + self.gladeif.connect('button115', 'clicked', self.on_ok_clicked) + self.gladeif.connect('button127', 'clicked', self.on_help_clicked) + self.gladeif.connect('notebook', 'switch_page', self.on_switch_page) + if self.db.readonly: + w = self.top.get_widget("button115") + w.set_sensitive(False) + self.value_field.set_editable(False) + self.note_field.set_editable(False) + self.attrib_menu.set_sensitive(False) + self.priv.set_sensitive(False) + self.flowed.set_sensitive(False) + self.preform.set_sensitive(False) + if parent_window: self.window.set_transient_for(parent_window) self.add_itself_to_menu() @@ -161,11 +173,15 @@ class AttributeEditor: def on_delete_event(self,obj,b): self.close_child_windows() self.remove_itself_from_menu() + self.gladeif.close() + gc.collect() def close(self,obj): self.close_child_windows() self.remove_itself_from_menu() + self.gladeif.close() self.window.destroy() + gc.collect() def close_child_windows(self): for child_window in self.child_windows.values(): @@ -202,7 +218,7 @@ class AttributeEditor: def on_help_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','adv-at') + GrampsDisplay.help('adv-at') def on_ok_clicked(self,obj): """ diff --git a/src/BaseDoc.py b/src/BaseDoc.py index 7f99aaf8c..f7c6dc2ee 100644 --- a/src/BaseDoc.py +++ b/src/BaseDoc.py @@ -499,8 +499,8 @@ class ParagraphStyle: """ Defines the characteristics of a paragraph. The characteristics are: font (a FontStyle instance), right margin, left margin, first indent, - alignment, level, top border, bottom border, right border, left - border, padding, and background color. + top margin, bottom margin, alignment, level, top border, bottom border, + right border, left border, padding, and background color. """ def __init__(self,source=None): @@ -513,6 +513,8 @@ class ParagraphStyle: self.rmargin = source.rmargin self.lmargin = source.lmargin self.first_indent = source.first_indent + self.tmargin = source.tmargin + self.bmargin = source.bmargin self.align = source.align self.level = source.level self.top_border = source.top_border @@ -526,6 +528,8 @@ class ParagraphStyle: self.font = FontStyle() self.rmargin = 0 self.lmargin = 0 + self.tmargin = 0 + self.bmargin = 0 self.first_indent = 0 self.align = PARA_ALIGN_LEFT self.level = 0 @@ -543,17 +547,19 @@ class ParagraphStyle: def get_description(self): return self.description - def set(self,rmargin=None,lmargin=None,first_indent=None,align=None, + def set(self,rmargin=None,lmargin=None,first_indent=None, + tmargin=None,bmargin=None,align=None, tborder=None,bborder=None,rborder=None,lborder=None,pad=None, bgcolor=None,font=None): """ Allows the values of the object to be set. - @param rmargin: right margin in centimeters - @param lmargin: left margin in centimeters + @param rmargin: right indent in centimeters + @param lmargin: left indent in centimeters @param first_indent: first line indent in centimeters - align - alignment type (PARA_ALIGN_LEFT, PARA_ALIGN_RIGHT, - PARA_ALIGN_CENTER, or PARA_ALIGN_JUSTIFY) + @param tmargin: space above paragraph in centimeters + @param bmargin: space below paragraph in centimeters + @param align: alignment type (PARA_ALIGN_LEFT, PARA_ALIGN_RIGHT, PARA_ALIGN_CENTER, or PARA_ALIGN_JUSTIFY) @param tborder: non zero indicates that a top border should be used @param bborder: non zero indicates that a bottom border should be used @param rborder: non zero indicates that a right border should be used @@ -584,6 +590,10 @@ class ParagraphStyle: self.set_left_margin(lmargin) if first_indent != None: self.set_first_indent(first_indent) + if tmargin != None: + self.set_top_margin(tmargin) + if bmargin != None: + self.set_bottom_margin(bmargin) def set_header_level(self,level): """ @@ -719,29 +729,45 @@ class ParagraphStyle: return "unknown" def set_left_margin(self,value): - "sets the left paragraph margin in centimeters" + "sets the left indent in centimeters" self.lmargin = value def set_right_margin(self,value): - "sets the right paragraph margin in centimeters" + "sets the right indent in centimeters" self.rmargin = value def set_first_indent(self,value): - "sets the first indent margin in centimeters" + "sets the first line indent in centimeters" self.first_indent = value + def set_top_margin(self,value): + "sets the space above paragraph in centimeters" + self.tmargin = value + + def set_bottom_margin(self,value): + "sets the space below paragraph in centimeters" + self.bmargin = value + def get_left_margin(self): - "returns the left margin in centimeters" + "returns the left indent in centimeters" return self.lmargin def get_right_margin(self): - "returns the right margin in centimeters" + "returns the right indent in centimeters" return self.rmargin def get_first_indent(self): - "returns the first indent margin in centimeters" + "returns the first line indent in centimeters" return self.first_indent + def get_top_margin(self): + "returns the space above paragraph in centimeters" + return self.tmargin + + def get_bottom_margin(self): + "returns the space below paragraph in centimeters" + return self.bmargin + #------------------------------------------------------------------------ # # StyleSheetList @@ -832,10 +858,14 @@ class StyleSheetList: rm = float(p.get_right_margin()) lm = float(p.get_left_margin()) fi = float(p.get_first_indent()) + tm = float(p.get_top_margin()) + bm = float(p.get_bottom_margin()) pa = float(p.get_padding()) f.write('rmargin="%s" ' % Utils.gformat(rm)) f.write('lmargin="%s" ' % Utils.gformat(lm)) f.write('first="%s" ' % Utils.gformat(fi)) + f.write('tmargin="%s" ' % Utils.gformat(tm)) + f.write('bmargin="%s" ' % Utils.gformat(bm)) f.write('pad="%s" ' % Utils.gformat(pa)) f.write('bgcolor="#%02x%02x%02x" ' % p.get_background_color()) f.write('level="%d" ' % p.get_header_level()) @@ -963,6 +993,13 @@ class SheetParser(handler.ContentHandler): self.p.set_right_margin(Utils.gfloat(attrs['rmargin'])) self.p.set_left_margin(Utils.gfloat(attrs['lmargin'])) self.p.set_first_indent(Utils.gfloat(attrs['first'])) + try: + # This is needed to read older style files + # lacking tmargin and bmargin + self.p.set_top_margin(Utils.gfloat(attrs['tmargin'])) + self.p.set_bottom_margin(Utils.gfloat(attrs['bmargin'])) + except KeyError: + pass self.p.set_padding(Utils.gfloat(attrs['pad'])) self.p.set_alignment(int(attrs['align'])) self.p.set_right_border(int(attrs['rborder'])) diff --git a/src/Bookmarks.py b/src/Bookmarks.py index 4c5751730..2d89c40c1 100644 --- a/src/Bookmarks.py +++ b/src/Bookmarks.py @@ -38,13 +38,13 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk -import gnome #------------------------------------------------------------------------- # # gramps modules # #------------------------------------------------------------------------- +import GrampsDisplay import NameDisplay import ListModel @@ -168,7 +168,7 @@ class Bookmarks : if person: name = NameDisplay.displayer.display(person) gramps_id = person.get_gramps_id() - new_iter = self.namemodel.add([name,gramps_id,person_handle]) + self.namemodel.add([name,gramps_id,person_handle]) self.namemodel.connect_model() self.response = self.top.run() @@ -211,5 +211,5 @@ class Bookmarks : def help_clicked(self): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-nav') + GrampsDisplay.help('gramps-nav') self.response = self.top.run() diff --git a/src/CalSdn.py b/src/CalSdn.py index 764e63951..699cc2911 100644 --- a/src/CalSdn.py +++ b/src/CalSdn.py @@ -205,12 +205,12 @@ def hebrew_sdn(year, month, day): else: length_of_adarI_andII = 59 - if month == 4: - sdn = tishri1_after + day - length_of_adarI_andII - 237 - elif month == 5: - sdn = tishri1_after + day - length_of_adarI_andII - 208 - else: - sdn = tishri1_after + day - length_of_adarI_andII - 178 + if month == 4: + sdn = tishri1_after + day - length_of_adarI_andII - 237 + elif month == 5: + sdn = tishri1_after + day - length_of_adarI_andII - 208 + else: + sdn = tishri1_after + day - length_of_adarI_andII - 178 else: # It is Adar II or later - don't need the year length. (metonic_cycle,metonic_year,molad_day,molad_halakim,tishri1_after) = _start_of_year(year+1) diff --git a/src/ChooseParents.py b/src/ChooseParents.py index 0a439b0ab..613d18ab0 100644 --- a/src/ChooseParents.py +++ b/src/ChooseParents.py @@ -34,6 +34,7 @@ __version__ = "$Revision$" # #------------------------------------------------------------------------- from gettext import gettext as _ +import gc #------------------------------------------------------------------------- # @@ -43,13 +44,13 @@ from gettext import gettext as _ import gtk.glade import gtk.gdk import gobject -import gnome #------------------------------------------------------------------------- # # gramps modules # #------------------------------------------------------------------------- +import GrampsDisplay import RelLib import const import Utils @@ -58,8 +59,9 @@ import Date import NameDisplay import DateHandler import GenericFilter -from QuestionDialog import ErrorDialog, WarningDialog import AutoComp +from QuestionDialog import ErrorDialog, WarningDialog +from WindowUtils import GladeIf #------------------------------------------------------------------------- # @@ -108,10 +110,11 @@ class ChooseParents: self.parent_selected = 0 self.renderer = gtk.CellRendererText() - db.connect('person-add', self.person_added) - db.connect('person-update', self.redraw) - db.connect('person-delete', self.redraw) - db.connect('person-rebuild', self.redraw_all) + self.sig_keys = [ + db.connect('person-add', self.person_added), + db.connect('person-update', self.redraw), + db.connect('person-delete', self.redraw), + db.connect('person-rebuild', self.redraw_all)] # set default filters self.all_males_filter = GenericFilter.GenericFilter() @@ -139,6 +142,7 @@ class ChooseParents: self.father = None self.glade = gtk.glade.XML(const.gladeFile,"familyDialog","gramps") + self.gladeif = GladeIf(self.glade) self.window = self.glade.get_widget("familyDialog") self.flabel = self.glade.get_widget("flabel") self.mlabel = self.glade.get_widget("mlabel") @@ -186,18 +190,15 @@ class ChooseParents: RelLib.Family.CUSTOM,RelLib.Family.MARRIED) self.prel_selector.set_values(self.type) self.redrawm() - - self.glade.signal_autoconnect({ - "on_add_parent_clicked" : self.add_parent_clicked, - "on_prel_changed" : self.parent_relation_changed, - "destroy_passed_object" : self.close, - "on_showallf_toggled" : self.showallf_toggled, - "on_showallm_toggled" : self.showallm_toggled, - "on_save_parents_clicked" : self.save_parents_clicked, - "on_help_familyDialog_clicked" : self.on_help_clicked, - "on_familyDialog_delete_event" : self.on_delete_event, - }) + self.gladeif.connect('familyDialog','delete_event', self.on_delete_event) + self.gladeif.connect('button44','clicked', self.close) + self.gladeif.connect('button42','clicked', self.save_parents_clicked) + self.gladeif.connect('button167','clicked', self.on_help_clicked) + self.gladeif.connect('button123','clicked', self.add_parent_clicked) + self.gladeif.connect('showallf','toggled', self.showallf_toggled) + self.gladeif.connect('prel_combo','changed', self.parent_relation_changed) + self.frel_selector = AutoComp.StandardCustomSelector( Utils.child_relations,self.fcombo, RelLib.Person.CHILD_CUSTOM,RelLib.Person.CHILD_BIRTH) @@ -207,6 +208,10 @@ class ChooseParents: self.frel_selector.set_values(frel) self.mrel_selector.set_values(mrel) + +# self.keys = const.child_rel_list +# self.build_list(self.mcombo,mrel) +# self.build_list(self.fcombo,frel) self.window.show() @@ -293,13 +298,17 @@ class ChooseParents: tree.append_column(column) def on_delete_event(self,obj,b): + self.gladeif.close() self.remove_itself_from_menu() self.close_child_windows() + gc.collect() def close(self,obj): + self.gladeif.close() self.remove_itself_from_menu() self.close_child_windows() self.window.destroy() + gc.collect() def close_child_windows(self): for child_window in self.child_windows.values(): @@ -329,7 +338,7 @@ class ChooseParents: def on_help_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-edit-quick') + GrampsDisplay.help('gramps-edit-quick') def person_added(self,handle_list): update_father = False @@ -416,7 +425,7 @@ class ChooseParents: self.mother_filter = self.likely_females_filter self.redrawm() - def find_family(self,father_handle,mother_handle,trans): + def find_family(self,father_handle,mother_handle): """ Finds the family associated with the father and mother. If one does not exist, it is created. @@ -429,30 +438,25 @@ class ChooseParents: if (family.get_father_handle() == father_handle and family.get_mother_handle() == mother_handle): family.add_child_handle(self.person.get_handle()) - self.db.commit_family(family,trans) return family elif (family.get_father_handle() == mother_handle and family.get_mother_handle() == father_handle): family.add_child_handle(self.person.get_handle()) - self.db.commit_family(family,trans) return family family = RelLib.Family() family.set_father_handle(father_handle) family.set_mother_handle(mother_handle) family.add_child_handle(self.person.get_handle()) - self.db.add_family(family,trans) + family.set_handle(self.db.create_id()) + family.set_gramps_id(self.db.find_next_family_gramps_id()) if father_handle: self.father = self.db.get_person_from_handle(father_handle) self.father.add_family_handle(family.get_handle()) - self.db.commit_person(self.father,trans) if mother_handle: self.mother = self.db.get_person_from_handle(mother_handle) self.mother.add_family_handle(family.get_handle()) - self.db.commit_person(self.mother,trans) - - self.db.commit_family(family,trans) return family def father_select_function(self,store,path,iter,id_list): @@ -530,6 +534,10 @@ class ChooseParents: Called with the OK button is pressed. Saves the selected people as parents of the main person. """ + + for key in self.sig_keys: + self.db.disconnect(key) + try: mother_rel = self.mrel_selector.get_values() except KeyError: @@ -541,25 +549,23 @@ class ChooseParents: father_rel = BIRTH_REL trans = self.db.transaction_begin() + father_handle = None + mother_handle = None if self.father or self.mother: if self.mother and not self.father: if self.mother.get_gender() == RelLib.Person.MALE: self.father = self.mother father_handle = self.father.get_handle() self.mother = None - mother_handle = None else: mother_handle = self.mother.get_handle() - father_handle = None elif self.father and not self.mother: if self.father.get_gender() == RelLib.Person.FEMALE: self.mother = self.father self.father = None mother_handle = self.mother.get_handle() - father_handle = None else: father_handle = self.father.get_handle() - mother_handle = None elif self.mother.get_gender() != self.father.get_gender(): if self.type[0] == RelLib.Family.CIVIL_UNION: self.type = FAM_UNKNOWN_REL @@ -579,10 +585,15 @@ class ChooseParents: return if father_handle or mother_handle: - self.family = self.find_family(father_handle,mother_handle,trans) + self.family = self.find_family(father_handle,mother_handle) self.family.add_child_handle(self.person.get_handle()) self.family.set_relationship(self.type) - self.change_family_type(self.family,mother_rel,father_rel) + self.change_family_type(self.family,mother_rel,father_rel,trans) + self.db.commit_person(self.person,trans) + if self.father: + self.db.commit_person(self.father,trans) + if self.mother: + self.db.commit_person(self.mother,trans) self.db.commit_family(self.family,trans) else: self.family = None @@ -636,7 +647,7 @@ class ChooseParents: class to create a new person.""" person = RelLib.Person() - person.set_gender(RelLib.Person.MALE) + person.set_gender(RelLib.Person.UNKNOWN) try: import EditPerson @@ -645,7 +656,7 @@ class ChooseParents: import DisplayTrace DisplayTrace.DisplayTrace() - def change_family_type(self,family,mother_rel,father_rel): + def change_family_type(self,family,mother_rel,father_rel,trans): """ Changes the family type of the specified family. If the family is None, the the relationship type shoud be deleted. @@ -666,15 +677,6 @@ class ChooseParents: self.person.add_parent_family_handle(family_handle, mother_rel,father_rel) - trans = self.db.transaction_begin() - self.db.commit_person(self.person,trans) - self.db.commit_family(family,trans) - if self.father: - self.db.commit_person(self.father,trans) - if self.mother: - self.db.commit_person(self.mother,trans) - self.db.transaction_commit(trans,_("Choose Parents")) - #------------------------------------------------------------------------- # # ModifyParents @@ -699,6 +701,7 @@ class ModifyParents: self.mother = self.db.get_person_from_handle(mid) self.glade = gtk.glade.XML(const.gladeFile,"modparents","gramps") + self.gladeif = GladeIf(self.glade) self.window = self.glade.get_widget("modparents") self.title = self.glade.get_widget("title") @@ -720,9 +723,7 @@ class ModifyParents: self.orig_mrel = mr self.orig_frel = fr - self.glade.signal_autoconnect({ - "on_parents_help_clicked" : self.on_help_clicked, - }) + self.gladeif.connect('button165','clicked', self.on_help_clicked) self.title.set_use_markup(True) @@ -775,11 +776,13 @@ class ModifyParents: self.val = self.window.run() if self.val == gtk.RESPONSE_OK: self.save_parents_clicked() + self.gladeif.close() self.window.destroy() + gc.collect() def on_help_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-spec-par') + GrampsDisplay.help('gramps-spec-par') self.val = self.window.run() def save_parents_clicked(self): @@ -826,6 +829,10 @@ class LikelyFilter(GenericFilter.Rule): labels = [ 'Person handle' ] category = _('General filters') + def __init__(self,data_list,gender): + GenericFilter.Rule.__init__(self,data_list) + self.gender = gender + def prepare(self,db): person = db.get_person_from_handle(self.list[0]) birth = db.get_event_from_handle(person.birth_handle) @@ -848,12 +855,10 @@ class LikelyFilter(GenericFilter.Rule): class LikelyFather(LikelyFilter): name = _('Likely Father') - description = _('Matches likely fathers') + description = _('Matches likely fathersn') def __init__(self,data_list): - GenericFilter.Rule.__init__(self,data_list) - self.gender = RelLib.Person.MALE - + LikelyFilter.__init__(self,data_list,RelLib.Person.MALE) class LikelyMother(LikelyFilter): @@ -861,6 +866,5 @@ class LikelyMother(LikelyFilter): description = _('Matches likely mothers') def __init__(self,data_list): - GenericFilter.Rule.__init__(self,data_list) - self.gender = RelLib.Person.FEMALE + LikelyFilter.__init__(self,data_list,RelLib.Person.FEMALE) diff --git a/src/ColumnOrder.py b/src/ColumnOrder.py index fcbb3a45a..8920c1879 100644 --- a/src/ColumnOrder.py +++ b/src/ColumnOrder.py @@ -25,6 +25,9 @@ #------------------------------------------------------------------------- import gobject import gtk.glade + +import gc + import const from gettext import gettext as _ @@ -72,9 +75,11 @@ class ColumnOrder: self.model.get_value(node,2))) self.callback(newlist) self.top.destroy() + gc.collect() def cancel_clicked(self,obj): self.top.destroy() + gc.collect() def toggled(self, cell, path, model): node = model.get_iter((int(path),)) diff --git a/src/Date.py b/src/Date.py index 04ad5e534..49b19fce8 100644 --- a/src/Date.py +++ b/src/Date.py @@ -122,7 +122,7 @@ class Date: self.sortval = source.sortval else: self.calendar = CAL_GREGORIAN - self.modifier = MOD_TEXTONLY + self.modifier = MOD_NONE self.quality = QUAL_NONE self.dateval = EMPTY self.text = u"" @@ -157,12 +157,13 @@ class Date: at the sorting value, and ignores the modifiers/comments. """ if self.modifier == other.modifier and self.modifier == MOD_TEXTONLY: - return self.text == other.text - return (self.calendar == other.calendar and - self.modifier == other.modifier and - self.quality == other.quality and - self.dateval == other.dateval and - self.sortval == other.sortval) + value = self.text == other.text + else: + value = (self.calendar == other.calendar and + self.modifier == other.modifier and + self.quality == other.quality and + self.dateval == other.dateval) + return value def __str__(self): """ @@ -455,7 +456,10 @@ class Date: year = max(value[_POS_YR],1) month = max(value[_POS_MON],1) day = max(value[_POS_DAY],1) - self.sortval = _calendar_convert[calendar](year,month,day) + if year == 0 and month == 0 and day == 0: + self.sortval = 0 + else: + self.sortval = _calendar_convert[calendar](year,month,day) if text: self.text = text @@ -463,7 +467,10 @@ class Date: year = max(self.dateval[_POS_YR],1) month = max(self.dateval[_POS_MON],1) day = max(self.dateval[_POS_DAY],1) - self.sortval = _calendar_convert[self.calendar](year,month,day) + if year == 0 and month == 0 and day == 0: + self.sortval = 0 + else: + self.sortval = _calendar_convert[self.calendar](year,month,day) def convert_calendar(self,calendar): """ @@ -504,7 +511,8 @@ class Date: """ Returns True if the date contains no information (empty text). """ - return self.modifier == MOD_TEXTONLY and not self.text + return (self.modifier == MOD_TEXTONLY and not self.text) or \ + (self.get_start_date()==EMPTY and self.get_stop_date()==EMPTY) def is_compound(self): """ diff --git a/src/DateDisplay.py b/src/DateDisplay.py index cfdddc464..46e0c0803 100644 --- a/src/DateDisplay.py +++ b/src/DateDisplay.py @@ -186,17 +186,13 @@ class DateDisplay: def _slash_year(self,val,slash): if val < 0: val = - val - # self._bce_str is a localizes string that prints B.C.E. at the apropriate place - format_string = self._bce_str - else: - format_string = "%s" if slash: year = "%d/%d" % (val,(val%10)+1) else: year = "%d" % (val) - return format_string % year + return year def display_iso(self,date_val): # YYYY-MM-DD (ISO) @@ -208,7 +204,10 @@ class DateDisplay: value = "%s-%02d" % (year,date_val[1]) else: value = "%s-%02d-%02d" % (year,date_val[1],date_val[0]) - return value + if date_val[2] < 0: + return self._bce_str % value + else: + return value def text_display(self,date): """ @@ -221,14 +220,14 @@ class DateDisplay: def _display_gregorian(self,date_val): year = self._slash_year(date_val[2],date_val[3]) if self.format == 0: - value = self.display_iso(date_val) + return self.display_iso(date_val) elif self.format == 1: if date_val[0] == 0 and date_val[1] == 0: value = str(date_val[2]) else: value = self._tformat.replace('%m',str(date_val[1])) value = value.replace('%d',str(date_val[0])) - value = value.replace('%Y',str(date_val[2])) + value = value.replace('%Y',str(abs(date_val[2]))) elif self.format == 2: # Month Day, Year if date_val[0] == 0: @@ -265,27 +264,48 @@ class DateDisplay: value = "%s %s" % (self._MONS[date_val[1]],year) else: value = "%d %s %s" % (date_val[0],self._MONS[date_val[1]],year) - return value + if date_val[2] < 0: + return self._bce_str % value + else: + return value def _display_julian(self,date_val): # Julian date display is the same as Gregorian return self._display_gregorian(date_val) def _display_calendar(self,date_val,month_list): - year = date_val[2] + year = abs(date_val[2]) if self.format == 0 or self.format == 1: return self.display_iso(date_val) else: if date_val[0] == 0: if date_val[1] == 0: - return year + value = year else: - return u"%s %d" % (month_list[date_val[1]],year) + value = u"%s %d" % (month_list[date_val[1]],year) else: - return u"%s %d, %s" % (month_list[date_val[1]],date_val[0],year) + value = u"%s %d, %s" % (month_list[date_val[1]],date_val[0],year) + if date_val[2] < 0: + return self._bce_str % value + else: + return value def _display_french(self,date_val): - return self._display_calendar(date_val,self._french) + year = abs(date_val[2]) + if self.format == 0 or self.format == 1: + return self.display_iso(date_val) + else: + if date_val[0] == 0: + if date_val[1] == 0: + value = year + else: + value = u"%s %d" % (self._french[date_val[1]],year) + else: + value = u"%d %s %s" % (date_val[0],self._french[date_val[1]],year) + if date_val[2] < 0: + return self._bce_str % value + else: + return value def _display_hebrew(self,date_val): return self._display_calendar(date_val,self._hebrew) diff --git a/src/DateEdit.py b/src/DateEdit.py index 1ff7046f6..4db35a787 100644 --- a/src/DateEdit.py +++ b/src/DateEdit.py @@ -42,6 +42,7 @@ __version__ = "$Revision$" # #------------------------------------------------------------------------- from gettext import gettext as _ +import gc #------------------------------------------------------------------------- # @@ -51,8 +52,6 @@ from gettext import gettext as _ import gtk import gtk.gdk import gtk.glade -import gobject -import gnome #------------------------------------------------------------------------- # @@ -63,7 +62,7 @@ import Date import DateHandler import const import Utils -import QuestionDialog +import GrampsDisplay #------------------------------------------------------------------------- # @@ -80,8 +79,8 @@ MOD_TEXT = ( (Date.MOD_TEXTONLY , _('Text only')) ) QUAL_TEXT = ( - (Date.QUAL_NONE, _('Regular')), - (Date.QUAL_ESTIMATED, _('Estimated')), + (Date.QUAL_NONE, _('Regular')), + (Date.QUAL_ESTIMATED, _('Estimated')), (Date.QUAL_CALCULATED, _('Calculated')) ) CAL_TO_MONTHS_NAMES = { @@ -119,6 +118,7 @@ class DateEdit: self.parent_window = parent_window self.pixmap_obj = button_obj.get_child() + self.text_obj.connect('focus-out-event',self.parse_and_check) self.button_obj.connect('clicked',self.invoke_date_editor) @@ -130,11 +130,11 @@ class DateEdit: Check current date object and display LED indicating the validity. """ if self.date_obj.get_modifier() == Date.MOD_TEXTONLY: - self.pixmap_obj.set_from_pixbuf(self.bad) + self.pixmap_obj.set_from_pixbuf(self.pixmap_obj.render_icon(gtk.STOCK_DIALOG_ERROR,gtk.ICON_SIZE_MENU)) elif self.date_obj.is_regular(): - self.pixmap_obj.set_from_pixbuf(self.good) + self.pixmap_obj.set_from_pixbuf(self.pixmap_obj.render_icon(gtk.STOCK_YES,gtk.ICON_SIZE_MENU)) else: - self.pixmap_obj.set_from_pixbuf(self.caution) + self.pixmap_obj.set_from_pixbuf(self.pixmap_obj.render_icon(gtk.STOCK_DIALOG_WARNING,gtk.ICON_SIZE_MENU)) def parse_and_check(self,obj,val): """ @@ -258,10 +258,8 @@ class DateEditorDialog: while 1: response = self.top_window.run() if response == gtk.RESPONSE_HELP: - try: - gnome.help_display('gramps-manual','adv-dates') - except gobject.GError, msg: - QuestionDialog.ErrorDialog(_("Could not open help"),str(msg)) + GrampsDisplay.help('adv-dates') + elif response == gtk.RESPONSE_OK: (the_quality,the_modifier,the_calendar,the_value,the_text) = \ self.build_date_from_ui() @@ -276,6 +274,7 @@ class DateEditorDialog: else: break self.top_window.destroy() + gc.collect() def build_date_from_ui(self): """ diff --git a/src/DateParser.py b/src/DateParser.py index ae58b0e3c..9fefbc849 100644 --- a/src/DateParser.py +++ b/src/DateParser.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2004 Donald N. Allingham +# Copyright (C) 2004-2005 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 @@ -119,6 +119,7 @@ class DateParser: unicode(locale.nl_langinfo(locale.ABMON_12),_codeset).lower(): 12, } + # modifiers before the date modifier_to_int = { 'before' : Date.MOD_BEFORE, 'bef' : Date.MOD_BEFORE, 'bef.' : Date.MOD_BEFORE, 'after' : Date.MOD_AFTER, @@ -127,6 +128,9 @@ class DateParser: 'abt' : Date.MOD_ABOUT, 'circa' : Date.MOD_ABOUT, 'c.' : Date.MOD_ABOUT, 'around' : Date.MOD_ABOUT, } + # in some languages some of above listed modifiers are after the date, + # in that case the subclass should put them into this dictionary instead + modifier_after_to_int = {} hebrew_to_int = { "tishri" : 1, "heshvan" : 2, "kislev" : 3, @@ -205,6 +209,7 @@ class DateParser: self.parser = { Date.CAL_GREGORIAN : self._parse_greg_julian, Date.CAL_JULIAN : self._parse_greg_julian, + Date.CAL_FRENCH : self._parse_french, Date.CAL_PERSIAN : self._parse_persian, Date.CAL_HEBREW : self._parse_hebrew, Date.CAL_ISLAMIC : self._parse_islamic, @@ -236,8 +241,13 @@ class DateParser: self._qual_str = '(' + '|'.join( [ key.replace('.','\.') for key in self.quality_to_int.keys() ] ) + ')' + keys = self.modifier_to_int.keys() + keys.sort(lambda x, y: cmp(len(y), len(x))) self._mod_str = '(' + '|'.join( - [ key.replace('.','\.') for key in self.modifier_to_int.keys() ] + [ key.replace('.','\.') for key in keys ] + ) + ')' + self._mod_after_str = '(' + '|'.join( + [ key.replace('.','\.') for key in self.modifier_after_to_int.keys() ] ) + ')' # Need to reverse-sort the keys, so that April matches before Apr does. @@ -264,29 +274,31 @@ class DateParser: re.IGNORECASE) self._modifier = re.compile('%s\s+(.*)' % self._mod_str, re.IGNORECASE) + self._modifier_after = re.compile('(.*)\s+%s' % self._mod_after_str, + re.IGNORECASE) self._abt2 = re.compile('<(.*)>',re.IGNORECASE) - self._text = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?' % self._mon_str, + self._text = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._mon_str, re.IGNORECASE) - self._text2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?' % self._mon_str, + self._text2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._mon_str, re.IGNORECASE) - self._jtext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?' % self._jmon_str, + self._jtext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._jmon_str, re.IGNORECASE) - self._jtext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?' % self._jmon_str, + self._jtext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._jmon_str, re.IGNORECASE) - self._ftext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?' % self._fmon_str, + self._ftext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._fmon_str, re.IGNORECASE) - self._ftext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?' % self._fmon_str, + self._ftext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._fmon_str, re.IGNORECASE) - self._ptext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?' % self._pmon_str, + self._ptext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._pmon_str, re.IGNORECASE) - self._ptext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?' % self._pmon_str, + self._ptext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._pmon_str, re.IGNORECASE) - self._itext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?' % self._imon_str, + self._itext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._imon_str, re.IGNORECASE) - self._itext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?' % self._imon_str, + self._itext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._imon_str, re.IGNORECASE) - self._numeric = re.compile("((\d+)[/\.])?((\d+)[/\.])?(\d+)") - self._iso = re.compile("(\d+)-(\d+)-(\d+)") + self._numeric = re.compile("((\d+)[/\.])?((\d+)[/\.])?(\d+)\s*$") + self._iso = re.compile("(\d+)-(\d+)-(\d+)\s*$") self._rfc = re.compile("(%s,)?\s+(\d|\d\d)\s+%s\s+(\d+)\s+\d\d:\d\d(:\d\d)?\s+(\+|-)\d\d\d\d" % (self._rfc_day_str,self._rfc_mon_str)) @@ -371,6 +383,8 @@ class DateParser: """ if subparser == None: subparser = self._parse_greg_julian + + if subparser == self._parse_greg_julian: check = gregorian_valid else: check = None @@ -493,6 +507,7 @@ class DateParser: On success, set the date and return 1. On failure return 0. """ + # modifiers before the date match = self._modifier.match(text) if match: grps = match.groups() @@ -503,6 +518,18 @@ class DateParser: else: date.set(qual,mod,cal,start) return True + # modifiers after the date + if self.modifier_after_to_int: + match = self._modifier_after.match(text) + if match: + grps = match.groups() + start = self._parse_subdate(grps[0]) + mod = self.modifier_after_to_int.get(grps[1].lower(),Date.MOD_NONE) + if bc: + date.set(qual,mod,cal,self.invert_year(start)) + else: + date.set(qual,mod,cal,start) + return True match = self._abt2.match(text) if match: grps = match.groups() @@ -519,12 +546,15 @@ class DateParser: """ Parses the text and sets the date according to the parsing. """ + + date.set_text_value(text) qual = Date.QUAL_NONE cal = Date.CAL_GREGORIAN (text,cal) = self.match_calendar(text,cal) (text,qual) = self.match_quality(text,qual) + if self.match_span(text,cal,qual,date): return if self.match_range(text,cal,qual,date): @@ -533,27 +563,15 @@ class DateParser: (text,bc) = self.match_bce(text) if self.match_modifier(text,cal,qual,bc,date): return - - subdate = self._parse_subdate(text) - if subdate == Date.EMPTY: - subdate = self._parse_hebrew(text) - if subdate == Date.EMPTY: - subdate = self._parse_persian(text) - if subdate == Date.EMPTY: - subdate = self._parse_islamic(text) - if subdate == Date.EMPTY: - subdate = self._parse_french(text) - if subdate == Date.EMPTY: - date.set_as_text(text) - return - else: - cal = Date.CAL_FRENCH - else: - cal = Date.CAL_ISLAMIC - else: - cal = Date.CAL_PERSIAN - else: - cal = Date.CAL_HEBREW + + try: + subdate = self._parse_subdate(text,self.parser[cal]) + if subdate == Date.EMPTY and text != "": + date.set_as_text(text) + return + except: + date.set_as_text(text) + return if bc: date.set(qual,Date.MOD_NONE,cal,self.invert_year(subdate)) diff --git a/src/DdTargets.py b/src/DdTargets.py index 61c049e28..57889c524 100644 --- a/src/DdTargets.py +++ b/src/DdTargets.py @@ -135,11 +135,11 @@ class _DdTargets(object): # List of all the test types. These are types # that can be interpreted as text. - self._all_text_types = (self.TEXT, + self._all_text_types = (self.UTF8_STRING, + self.TEXT, self.TEXT_MIME, self.STRING, - self.COMPOUND_TEXT, - self.UTF8_STRING) + self.COMPOUND_TEXT) def insert(self,dd_type): """Add a target to the lookup lists. These lists are diff --git a/src/DisplayModels.py b/src/DisplayModels.py index 7c9692bbd..4b2985339 100644 --- a/src/DisplayModels.py +++ b/src/DisplayModels.py @@ -170,7 +170,7 @@ class BaseModel(gtk.GenericTreeModel): def on_iter_children(self,node): """Return the first child of the node""" - if node == None: + if node == None and self.datalist: return self.datalist[0] return None @@ -481,10 +481,16 @@ class MediaModel(BaseModel): return len(self.fmap)+1 def column_description(self,data): - return unicode(data[4]) + try: + return unicode(data[4]) + except: + return unicode(data[4],'latin1') def column_path(self,data): - return unicode(data[2]) + try: + return unicode(data[2]) + except: + return unicode(data[2].encode('iso-8859-1')) def column_mime(self,data): if data[3]: diff --git a/src/DisplayTrace.py b/src/DisplayTrace.py index 49719f45f..d74692abf 100644 --- a/src/DisplayTrace.py +++ b/src/DisplayTrace.py @@ -116,7 +116,9 @@ class DisplayTrace: window.get_buffer().set_text(msg.getvalue()) print msg.getvalue() - self.glade.signal_autoconnect({'on_close_clicked':self.close}) + + window.connect('delete_event',self.close) + self.glade.get_widget('button107').connect('clicked',self.close) def close(self,obj): self.top.destroy() diff --git a/src/Errors.py b/src/Errors.py index cc890f35f..9f869f59c 100644 --- a/src/Errors.py +++ b/src/Errors.py @@ -42,6 +42,15 @@ class DateError(Exception): def __str__(self): return self.value +class DatabaseError(Exception): + """Error used to report Date errors""" + def __init__(self,value=""): + Exception.__init__(self) + self.value = value + + def __str__(self): + return self.value + class ReportError(Exception): """Error used to report Report errors""" def __init__(self,value,value2=""): diff --git a/src/Exporter.py b/src/Exporter.py index 64c7f32d5..e1cb27012 100644 --- a/src/Exporter.py +++ b/src/Exporter.py @@ -28,7 +28,6 @@ # #------------------------------------------------------------------------- import os -import shutil from gettext import gettext as _ #------------------------------------------------------------------------- @@ -37,7 +36,6 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk -import gnome from gnome.ui import Druid, DruidPageEdge, DruidPageStandard #------------------------------------------------------------------------- @@ -50,6 +48,7 @@ import Utils import PluginMgr import QuestionDialog import GrampsKeys +import GrampsDisplay #------------------------------------------------------------------------- # @@ -120,7 +119,7 @@ class Exporter: """ Help handler. """ - gnome.help_display('gramps-manual','export-data') + GrampsDisplay.help('export-data') def build_info_page(self): """ diff --git a/src/GenericFilter.py b/src/GenericFilter.py index 52e2fd231..64a5187f8 100644 --- a/src/GenericFilter.py +++ b/src/GenericFilter.py @@ -39,6 +39,7 @@ from xml.sax import make_parser,handler,SAXParseException import os import sets from gettext import gettext as _ +from TransUtils import strip_context as __ #------------------------------------------------------------------------- # @@ -416,7 +417,7 @@ class IsDescendantOfFilterMatch(IsDescendantOf): """Rule that checks for a person that is a descendant of someone matched by a filter""" - labels = [ _('Filter name:'), _('Inclusive:') ] + labels = [ _('Filter name:') ] name = _('Descendants of match') category = _('Descendant filters') description = _("Matches people that are descendants of anybody matched by a filter") @@ -435,8 +436,8 @@ class IsDescendantOfFilterMatch(IsDescendantOf): first = 1 except IndexError: first = 1 - - filt = MatchesFilter(self.list) + + filt = MatchesFilter(self.list[0:1]) filt.prepare(db) for person_handle in db.get_person_handles(sort_handles=False): person = db.get_person_from_handle( person_handle) @@ -611,7 +612,7 @@ class IsSiblingOfFilterMatch(Rule): fam = self.db.get_family_from_handle(fam_id) if fam: for child_handle in fam.get_child_handle_list(): - if child_handle != handle: + if child_handle != person.handle: self.map[child_handle] = 1 #------------------------------------------------------------------------- @@ -724,7 +725,7 @@ class IsAncestorOfFilterMatch(IsAncestorOf): """Rule that checks for a person that is an ancestor of someone matched by a filter""" - labels = [ _('Filter name:'), _('Inclusive:') ] + labels = [ _('Filter name:') ] name = _('Ancestors of match') category = _("Ancestral filters") description = _("Matches people that are ancestors " @@ -745,7 +746,7 @@ class IsAncestorOfFilterMatch(IsAncestorOf): except IndexError: first = 1 - filt = MatchesFilter(self.list) + filt = MatchesFilter(self.list[0:1]) filt.prepare(db) for person_handle in db.get_person_handles(sort_handles=False): person = db.get_person_from_handle( person_handle) @@ -926,10 +927,13 @@ class HasCommonAncestorWith(Rule): def init_ancestor_cache(self,db): # list[0] is an Id, but we need to pass a Person to for_each_ancestor. - handle = db.get_person_from_gramps_id(self.list[0]).get_handle() - if handle: - def init(self,handle): self.ancestor_cache[handle] = 1 - for_each_ancestor(db,[handle],init,self) + try: + handle = db.get_person_from_gramps_id(self.list[0]).get_handle() + if handle: + def init(self,handle): self.ancestor_cache[handle] = 1 + for_each_ancestor(db,[handle],init,self) + except: + pass def apply(self,db,person): # On the first call, we build the ancestor cache for the @@ -1287,7 +1291,7 @@ class HasNameOf(Rule): labels = [ _('Given name:'), _('Family name:'), _('Suffix:'), - _('Title:')] + __('person|Title:')] name = _('People with the ') description = _("Matches people with a specified (partial) name") category = _('General filters') @@ -1385,7 +1389,7 @@ class MatchesFilter(Rule): def apply(self,db,person): for filt in SystemFilters.get_filters(): if filt.get_name() == self.list[0]: - return filt.check(person.handle) + return filt.check(db,person.handle) for filt in CustomFilters.get_filters(): if filt.get_name() == self.list[0]: return filt.check(db,person.handle) @@ -1405,8 +1409,11 @@ class IsSpouseOfFilterMatch(Rule): description = _("Matches people married to anybody matching a filter") category = _('Family filters') + def prepare(self,db): + self.filt = MatchesFilter (self.list) + self.filt.prepare(db) + def apply(self,db,person): - filt = MatchesFilter (self.list) for family_handle in person.get_family_handle_list (): family = db.get_family_from_handle(family_handle) for spouse_id in [family.get_father_handle (), family.get_mother_handle ()]: @@ -1414,7 +1421,7 @@ class IsSpouseOfFilterMatch(Rule): continue if spouse_id == person.handle: continue - if filt.apply (db, db.get_person_from_handle( spouse_id)): + if self.filt.apply (db, db.get_person_from_handle( spouse_id)): return True return False @@ -1994,7 +2001,7 @@ class GenericFilter: def xor_test(self,db,person): test = False for rule in self.flist: - test = test ^ rule.apply(db,handle) + test = test ^ rule.apply(db,person) return test def one_test(self,db,person): @@ -2004,7 +2011,7 @@ class GenericFilter: if count: return False count += 1 - return count != 1 + return count == 1 def or_test(self,db,person): for rule in self.flist: @@ -2031,6 +2038,121 @@ class GenericFilter: rule.reset() return res +#------------------------------------------------------------------------- +# +# IsLessThanNthGenerationAncestorOfBookmarked +# +#------------------------------------------------------------------------- +class IsLessThanNthGenerationAncestorOfBookmarked(Rule): + # Submitted by Wayne Bergeron + """Rule that checks for a person that is an ancestor of bookmarked persons + not more than N generations away""" + + labels = [ _('Number of generations:') ] + name = _('Ancestors of bookmarked people not more ' + 'than generations away') + category = _('Ancestral filters') + description = _("Matches ancestors of the people on the bookmark list" + "not more than N generations away") + + def prepare(self,db): + self.db = db + bookmarks = self.db.get_bookmarks() + if len(bookmarks) == 0: + self.apply = lambda db,p : False + else: + self.map = {} + self.bookmarks = sets.Set(bookmarks) + self.apply = self.apply_real + for self.bookmarkhandle in self.bookmarks: + self.init_ancestor_list(self.bookmarkhandle, 1) + + + def init_ancestor_list(self,handle,gen): +# if self.map.has_key(p.get_handle()) == 1: +# loop_error(self.orig,p) + if not handle: + return + if gen: + self.map[handle] = 1 + if gen >= int(self.list[0]): + return + + p = self.db.get_person_from_handle(handle) + fam_id = p.get_main_parents_family_handle() + fam = self.db.get_family_from_handle(fam_id) + if fam: + f_id = fam.get_father_handle() + m_id = fam.get_mother_handle() + + if f_id: + self.init_ancestor_list(f_id,gen+1) + if m_id: + self.init_ancestor_list(m_id,gen+1) + + def apply_real(self,db,person): + return person.handle in self.map + + def reset(self): + self.map = {} + +#------------------------------------------------------------------------- +# +# IsLessThanNthGenerationAncestorOfDefaultPerson +# +#------------------------------------------------------------------------- +class IsLessThanNthGenerationAncestorOfDefaultPerson(Rule): + # Submitted by Wayne Bergeron + """Rule that checks for a person that is an ancestor of the default person + not more than N generations away""" + + labels = [ _('Number of generations:') ] + name = _('Ancestors of the default person ' + 'not more than generations away') + category = _('Ancestral filters') + description = _("Matches ancestors of the default person " + "not more than N generations away") + + def prepare(self,db): + self.db = db + p = db.get_default_person() + if p == 0: + self.apply = lambda db,p: False + else: + self.def_handle = p.get_handle() + self.apply = self.apply_real + self.map = {} + self.init_ancestor_list(self.def_handle, 1) + + + def init_ancestor_list(self,handle,gen): +# if self.map.has_key(p.get_handle()) == 1: +# loop_error(self.orig,p) + if not handle: + return + if gen: + self.map[handle] = 1 + if gen >= int(self.list[0]): + return + + p = self.db.get_person_from_handle(handle) + fam_id = p.get_main_parents_family_handle() + fam = self.db.get_family_from_handle(fam_id) + if fam: + f_id = fam.get_father_handle() + m_id = fam.get_mother_handle() + + if f_id: + self.init_ancestor_list(f_id,gen+1) + if m_id: + self.init_ancestor_list(m_id,gen+1) + + def apply_real(self,db,person): + return person.handle in self.map + + def reset(self): + self.map = {} + #------------------------------------------------------------------------- # # Name to class mappings @@ -2125,12 +2247,14 @@ editor_rule_list = [ IsWitness, IsDescendantOf, IsDescendantFamilyOf, + IsLessThanNthGenerationAncestorOfDefaultPerson, IsDescendantOfFilterMatch, IsLessThanNthGenerationDescendantOf, IsMoreThanNthGenerationDescendantOf, IsAncestorOf, IsAncestorOfFilterMatch, IsLessThanNthGenerationAncestorOf, + IsLessThanNthGenerationAncestorOfBookmarked, IsMoreThanNthGenerationAncestorOf, HasCommonAncestorWith, HasCommonAncestorWithFilterMatch, @@ -2281,8 +2405,14 @@ class FilterParser(handler.ContentHandler): def endElement(self,tag): if tag == "rule" and self.r != None: - if len(self.r.labels) != len(self.a): - print "ERROR: Invalid number of arguments in filter '%s'!" %\ + if len(self.r.labels) < len(self.a): + print "WARNING: Invalid number of arguments in filter '%s'!" %\ + self.f.get_name() + nargs = len(self.r.labels) + rule = self.r(self.a[0:nargs]) + self.f.add_rule(rule) + elif len(self.r.labels) > len(self.a): + print "ERROR: Invalid number of arguments in filter '%s'!" %\ self.f.get_name() else: rule = self.r(self.a) @@ -2393,7 +2523,7 @@ class GrampsFilterComboBox(gtk.ComboBox): active = self.get_active() if active < 0: return None - key = self.store[active][0] + key = unicode(self.store[active][0]) return self.map[key] diff --git a/src/GrampsBSDDB.py b/src/GrampsBSDDB.py index 486b7c985..d36ffbe48 100644 --- a/src/GrampsBSDDB.py +++ b/src/GrampsBSDDB.py @@ -258,7 +258,6 @@ class GrampsBSDDB(GrampsDbBase): if callback: callback() self.person_map[key] = self.person_map[key] - self.person_map.sync() # Repair secondary indices related to family_map @@ -481,7 +480,7 @@ class GrampsBSDDB(GrampsDbBase): def remove_place(self,handle,transaction): if not self.readonly and handle and str(handle) in self.place_map: if transaction != None: - old_data = self.place_map.get(handle) + old_data = self.place_map.get(str(handle)) transaction.add(PLACE_KEY,handle,old_data) self.emit('place-delete',([handle],)) self.place_map.delete(str(handle)) @@ -489,7 +488,7 @@ class GrampsBSDDB(GrampsDbBase): def remove_object(self,handle,transaction): if not self.readonly and handle and str(handle) in self.media_map: if transaction != None: - old_data = self.media_map.get(handle) + old_data = self.media_map.get(str(handle)) transaction.add(MEDIA_KEY,handle,old_data) self.emit('media-delete',([handle],)) self.media_map.delete(str(handle)) @@ -1015,3 +1014,21 @@ class GrampsBSDDB(GrampsDbBase): data = cursor.next() cursor.close() self.transaction_commit(trans,"Upgrade to DB version 9") + + +if __name__ == "__main__": + + import sys + + d = GrampsBSDDB() + d.load(sys.argv[1],lambda x: x) + + c = d.get_person_cursor() + data = c.first() + while data: + person = Person(data[1]) + print data[0], person.get_primary_name().get_name(), + data = c.next() + c.close() + + print d.surnames.keys() diff --git a/src/GrampsCfg.py b/src/GrampsCfg.py index 75fa359d8..54847ec2a 100644 --- a/src/GrampsCfg.py +++ b/src/GrampsCfg.py @@ -26,6 +26,7 @@ # #------------------------------------------------------------------------- import os +import sets from gettext import gettext as _ #------------------------------------------------------------------------- @@ -36,7 +37,6 @@ from gettext import gettext as _ import gobject import gtk import gtk.glade -import gnome #------------------------------------------------------------------------- # @@ -48,6 +48,9 @@ import RelLib import const import Utils import DateHandler +import GrampsDisplay +import QuestionDialog +from WindowUtils import GladeIf #------------------------------------------------------------------------- # @@ -143,13 +146,13 @@ class GrampsPreferences: self.built = 0 self.db = db self.top = gtk.glade.XML(const.prefsFile,"preferences","gramps") - self.top.signal_autoconnect({ - "on_close_clicked" : self.on_close_clicked, - "on_help_clicked" : self.on_propertybox_help, - "on_tree_select_row" : self.select - }) + self.gladeif = GladeIf(self.top) + self.gladeif.connect('button6','clicked',self.on_close_clicked) + self.gladeif.connect('button7','clicked',self.on_propertybox_help) + self.window = self.top.get_widget("preferences") + self.window.connect('delete_event',self.on_close_clicked) self.tree = self.top.get_widget("tree") self.store = gtk.TreeStore(gobject.TYPE_STRING) self.selection = self.tree.get_selection() @@ -187,31 +190,26 @@ class GrampsPreferences: auto.connect('toggled', lambda obj: GrampsKeys.save_autoload(obj.get_active())) + spell = self.top.get_widget("spellcheck") + spell.set_active(GrampsKeys.get_spellcheck()) + spell.connect('toggled', + lambda obj: GrampsKeys.save_spellcheck(obj.get_active())) + lds = self.top.get_widget("uselds") lds.set_active(GrampsKeys.get_uselds()) lds.connect('toggled', lambda obj: GrampsKeys.save_uselds(obj.get_active())) - ipr = self.top.get_widget("iprefix") - ipr.set_text(GrampsKeys.get_person_id_prefix()) - ipr.connect('changed', - lambda obj: GrampsKeys.save_iprefix(obj.get_text())) - opr = self.top.get_widget("oprefix") - opr.set_text(GrampsKeys.get_object_id_prefix()) - opr.connect('changed', - lambda obj: GrampsKeys.save_oprefix(obj.get_text())) - fpr = self.top.get_widget("fprefix") - fpr.set_text(GrampsKeys.get_family_id_prefix()) - fpr.connect('changed', - lambda obj: GrampsKeys.save_fprefix(obj.get_text())) - spr = self.top.get_widget("sprefix") - spr.set_text(GrampsKeys.get_source_id_prefix()) - spr.connect('changed', - lambda obj: GrampsKeys.save_sprefix(obj.get_text())) - ppr = self.top.get_widget("pprefix") - ppr.set_text(GrampsKeys.get_place_id_prefix()) - ppr.connect('changed', - lambda obj: GrampsKeys.save_pprefix(obj.get_text())) + self.ipr = self.top.get_widget("iprefix") + self.ipr.set_text(GrampsKeys.get_person_id_prefix()) + self.opr = self.top.get_widget("oprefix") + self.opr.set_text(GrampsKeys.get_object_id_prefix()) + self.fpr = self.top.get_widget("fprefix") + self.fpr.set_text(GrampsKeys.get_family_id_prefix()) + self.spr = self.top.get_widget("sprefix") + self.spr.set_text(GrampsKeys.get_source_id_prefix()) + self.ppr = self.top.get_widget("pprefix") + self.ppr.set_text(GrampsKeys.get_place_id_prefix()) sb2 = self.top.get_widget("stat2") sb3 = self.top.get_widget("stat3") @@ -319,7 +317,61 @@ class GrampsPreferences: resemail.set_text(GrampsKeys.get_researcher_email()) resemail.connect('changed', lambda obj: GrampsKeys.save_researcher_email(obj.get_text())) + + def save_prefix(self): + """ Validate the GRAMPS ID definitions to be usable""" + ip = self.ipr.get_text() + op = self.opr.get_text() + fp = self.fpr.get_text() + sp = self.spr.get_text() + pp = self.ppr.get_text() + + # Do validation to the GRAMPS-ID format strings + invalid_chars = sets.Set("# \t\n\r") + prefixes = [ip,op,fp,sp,pp] + testnums = [1,234,567890] + testresult = {} # used to test that IDs for different objects will be different + formaterror = False # true if formatstring is invalid + incompatible = False # true if ID string is possibly not GEDCOM compatible + for p in prefixes: + if invalid_chars & sets.Set(p): + incompatible = True + for n in testnums: + try: + testresult[p % n] = 1 + except: + formaterror = True + + idexampletext = _('Example for valid IDs are:\n'+ + 'I%d which will be displayed as I123 or\n'+ + 'S%06d which will be displayed as S000123.') + if formaterror: + QuestionDialog.ErrorDialog( _("Invalid GRAMPS ID prefix"), + _("The GRAMPS ID prefix is invalid.\n")+ + idexampletext, + self.window) + return False + elif incompatible: + QuestionDialog.OkDialog( _("Incompatible GRAMPS ID prefix"), + _("The GRAMPS ID prefix is in an unusual format and may"+ + " cause problems when exporting the database to GEDCOM format.\n")+ + idexampletext, + self.window) + elif len(testresult) != len(prefixes)*len(testnums): + QuestionDialog.ErrorDialog( _("Unsuited GRAMPS ID prefix"), + _("The GRAMPS ID prefix is unsuited because it does not"+ + " distinguish between different objects.\n")+ + idexampletext, + self.window) + return False + GrampsKeys.save_iprefix(ip) + GrampsKeys.save_oprefix(op) + GrampsKeys.save_fprefix(fp) + GrampsKeys.save_sprefix(sp) + GrampsKeys.save_pprefix(pp) + return True + def select(self,obj): store,node = self.selection.get_selected() if node: @@ -328,10 +380,13 @@ class GrampsPreferences: self.panel.set_current_page(self.imap[path]) def on_propertybox_help(self,obj): - gnome.help_display('gramps-manual','gramps-prefs') + GrampsDisplay.help('gramps-prefs') - def on_close_clicked(self,obj): - Utils.destroy_passed_object(self.window) + def on_close_clicked(self,obj=None,dummy=None): + if not self.save_prefix(): + return False + self.gladeif.close() + self.window.destroy() #------------------------------------------------------------------------- # diff --git a/src/GrampsDBCallback.py b/src/GrampsDBCallback.py index 3c0e40b9f..b9d3144ab 100644 --- a/src/GrampsDBCallback.py +++ b/src/GrampsDBCallback.py @@ -36,6 +36,7 @@ or the UI code. """ import sys +import os import types import traceback import inspect @@ -58,9 +59,8 @@ class GrampsDBCallback(object): Classes that want to emit signals need to inherit from the GrampsDBCallback class and ensure that its __init__ method is called. They then need to declare the signals that they - can emit and the types of each callbacks arguments. - - e.g. + can emit and the types of each callbacks arguments. For + example:: class TestSignals(GrampsDBCallback): @@ -87,27 +87,23 @@ class GrampsDBCallback(object): Emitting signals ================ - Signals are emitted using the emit method. + Signals are emitted using the emit method. e.g.:: - e.g. - def emit_signal(self): self.emit('test-signal',(1,)) The parameters are passed as a tuple so a single parameter must be passed as a 1 element tuple. - - Connecting callbacks to signals - ============================== + =============================== Attaching a callback to the signals is similar to the gtk - connect methods. e.g. + connect methods. e.g.:: # connect to a function. def fn(i): - print "got signal value = ", i + print 'got signal value = ', i t = TestSignals() t.connect('test-signal', fn) @@ -116,7 +112,7 @@ class GrampsDBCallback(object): class C(object): def cb_func(self, i): - print "got class signal = ", 1 + print 'got class signal = ', 1 r = R() t.connect('test-signal', r.cb_func) @@ -129,7 +125,7 @@ class GrampsDBCallback(object): key returned from the connect call. This key can be passed to the disconnect method to remove the callback from the signals callback list. - e.g. + e.g.:: t = TestSignals() @@ -137,7 +133,7 @@ class GrampsDBCallback(object): class C(object): def cb_func(self, i): - print "got class signal = ", 1 + print 'got class signal = ', 1 r = R() key = t.connect('test-signal', r.cb_func) @@ -155,7 +151,7 @@ class GrampsDBCallback(object): be used to block the signals for a single instance and disable_all_signals() can be used to block signals for the class: - e.g. + e.g.:: class TestSignals(GrampsDBCallback): @@ -213,7 +209,10 @@ class GrampsDBCallback(object): # If this is True logging will be turned on for all instances # whether or not instance based logging is enabled. - __LOG_ALL = False + try: + __LOG_ALL = int(os.environ.get('GRAMPS_SIGNAL',"0")) == 1 + except: + __LOG_ALL = False def __init__(self): self.__enable_logging = False # controls whether lots of debug diff --git a/src/GrampsDbBase.py b/src/GrampsDbBase.py index dbadbeca4..d25fb1a62 100644 --- a/src/GrampsDbBase.py +++ b/src/GrampsDbBase.py @@ -37,8 +37,11 @@ import locale import re from sys import maxint import sets +import sys from gettext import gettext as _ +log = sys.stderr.write + #------------------------------------------------------------------------- # # GRAMPS libraries @@ -54,7 +57,6 @@ import GrampsDBCallback # #------------------------------------------------------------------------- _UNDO_SIZE = 1000 -_id_reg = re.compile("%\d+d") PERSON_KEY = 0 FAMILY_KEY = 1 @@ -156,6 +158,14 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): 'repository-rebuild' : None, } + + # If this is True logging will be turned on. + try: + __LOG_ALL = int(os.environ.get('GRAMPS_SIGNAL',"0")) == 1 + except: + __LOG_ALL = False + + def __init__(self): """ Creates a new GrampsDbBase instance. A new GrampDbBase class should @@ -261,7 +271,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): def get_repository_cursor(self): assert False, "Needs to be overridden in the derived class" - def load(self,name,callback): + def load(self,name,callback,mode="w"): """ Opens the specified database. The method needs to be overridden in the derived class. @@ -305,6 +315,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): """ if self.readonly or not obj or not obj.handle: return + if change_time: obj.change = int(change_time) else: @@ -891,6 +902,22 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): return self.repository_map.keys() return [] + def _validated_id_prefix(self, val, default): + if val: + try: + junk = val % 1 + prefix_var = val # use the prefix as is because it works fine + except: + try: + val = val + "%d" + junk = val % 1 + prefix_var = val # format string was missing + except: + prefix_var = default+"%04d" # use default + else: + prefix_var = default+"%04d" + return prefix_var + def set_person_id_prefix(self,val): """ Sets the naming template for GRAMPS Person ID values. The string is @@ -898,13 +925,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): that contains a C/Python style format string using %d, such as I%d or I%04d. """ - if val: - if _id_reg.search(val): - self.iprefix = val - else: - self.iprefix = val + "%d" - else: - self.iprefix = "I%04d" + self.iprefix = self._validated_id_prefix(val,"I") def set_source_id_prefix(self,val): """ @@ -913,13 +934,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): that contains a C/Python style format string using %d, such as S%d or S%04d. """ - if val: - if _id_reg.search(val): - self.sprefix = val - else: - self.sprefix = val + "%d" - else: - self.sprefix = "S%04d" + self.sprefix = self._validated_id_prefix(val,"S") def set_object_id_prefix(self,val): """ @@ -928,13 +943,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): that contains a C/Python style format string using %d, such as O%d or O%04d. """ - if val: - if _id_reg.search(val): - self.oprefix = val - else: - self.oprefix = val + "%d" - else: - self.oprefix = "O%04d" + self.oprefix = self._validated_id_prefix(val,"O") def set_place_id_prefix(self,val): """ @@ -943,13 +952,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): that contains a C/Python style format string using %d, such as P%d or P%04d. """ - if val: - if _id_reg.search(val): - self.pprefix = val - else: - self.pprefix = val + "%d" - else: - self.pprefix = "P%04d" + self.pprefix = self._validated_id_prefix(val,"P") def set_family_id_prefix(self,val): """ @@ -958,13 +961,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): that contains a C/Python style format string using %d, such as F%d or F%04d. """ - if val: - if _id_reg.search(val): - self.fprefix = val - else: - self.fprefix = val + "%d" - else: - self.fprefix = "F%04d" + self.fprefix = self._validated_id_prefix(val,"F") def set_event_id_prefix(self,val): """ @@ -973,41 +970,33 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): that contains a C/Python style format string using %d, such as E%d or E%04d. """ - if val: - if _id_reg.search(val): - self.eprefix = val - else: - self.eprefix = val + "%d" - else: - self.eprefix = "E%04d" + self.eprefix = self._validated_id_prefix(val,"E") def set_repository_id_prefix(self,val): """ Sets the naming template for GRAMPS Repository ID values. The string is expected to be in the form of a simple text string, or in a format - that contains a C/Python style format string using %d, such as E%d - or E%04d. + that contains a C/Python style format string using %d, such as R%d + or R%04d. """ - if val: - if _id_reg.search(val): - self.rprefix = val - else: - self.rprefix = val + "%d" - else: - self.rprefix = "R%04d" - + self.rprefix = self._validated_id_prefix(val,"R") + def transaction_begin(self,msg=""): """ Creates a new Transaction tied to the current UNDO database. The transaction has no effect until it is committed using the transaction_commit function of the this database object. """ + if self.__LOG_ALL: + log("%s: Transaction begin '%s'\n" % (self.__class__.__name__, str(msg))) return Transaction(msg,self.undodb) def transaction_commit(self,transaction,msg): """ Commits the transaction to the assocated UNDO database. """ + if self.__LOG_ALL: + log("%s: Transaction commit '%s'\n" % (self.__class__.__name__, str(msg))) if not len(transaction) or self.readonly: return transaction.set_description(msg) diff --git a/src/latin_utf8.py b/src/GrampsDisplay.py similarity index 67% rename from src/latin_utf8.py rename to src/GrampsDisplay.py index e5a24fc6c..1b66d15ac 100644 --- a/src/latin_utf8.py +++ b/src/GrampsDisplay.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000-2003 Donald N. Allingham +# Copyright (C) 2002-2005 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 @@ -18,12 +18,15 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -def utf8_to_latin(s): - return s.encode('iso-8859-1','replace') +import gnome +import gobject +from QuestionDialog import ErrorDialog -def latin_to_utf8(s): - if type(s) == type(u''): - return s - else: - return unicode(s,'iso-8859-1') - +def help(target): + try: + gnome.help_display('gramps-manual',target) + except gobject.GError, msg: + gnome.url_show('http://gramps-project.org/gramps-manual/gramps-manual-en/index.html') + +def url(target): + gnome.url_show(target) diff --git a/src/GrampsGconfKeys.py b/src/GrampsGconfKeys.py index b80cb04be..6cf0a5ad9 100644 --- a/src/GrampsGconfKeys.py +++ b/src/GrampsGconfKeys.py @@ -155,9 +155,15 @@ def save_screen_size_checked(val): def get_autoload(): return get_bool("/apps/gramps/behavior/autoload") +def get_spellcheck(): + return get_bool("/apps/gramps/behavior/spellcheck") + def save_autoload(val): set_bool("/apps/gramps/behavior/autoload",val) +def save_spellcheck(val): + set_bool("/apps/gramps/behavior/spellcheck",val) + def get_betawarn(): return get_bool("/apps/gramps/behavior/betawarn") diff --git a/src/GrampsIniKeys.py b/src/GrampsIniKeys.py index e1a624d7d..102b7cbea 100644 --- a/src/GrampsIniKeys.py +++ b/src/GrampsIniKeys.py @@ -34,6 +34,7 @@ NL = "\n" # FIX: newlines on Mac/Windows, if different? _ini_schema = { 'behavior/autoload' : '0', + 'behavior/spellcheck' : '1', 'behavior/betawarn' : '0', 'behavior/welcome' : '100', 'preferences/date-format' : '0', @@ -305,9 +306,15 @@ def save_screen_size_checked(val): def get_autoload(): return get_bool("behavior", "autoload") +def get_spellcheck(): + return get_bool("behavior", "spellcheck") + def save_autoload(val): set_bool("behavior", "autoload",val) +def save_spellcheck(val): + set_bool("behavior", "spellcheck",val) + def get_betawarn(): return get_bool("behavior", "betawarn") diff --git a/src/GraphLayout.py b/src/GraphLayout.py deleted file mode 100644 index 24bf55725..000000000 --- a/src/GraphLayout.py +++ /dev/null @@ -1,77 +0,0 @@ -# -# 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$ - -class GraphLayout: - - def __init__(self,database,plist,person_handle): - self.database = database - self.plist = plist - self.person_handle = person_handle - self.v = [] - self.e = [] - self.maxx = 0 - self.maxy = 0 - - def max_size(self): - return (self.maxx,self.maxy) - - def layout(self): - return ([],[]) - -class DescendLine(GraphLayout): - - def layout(self): - self.elist = [(0,0)] - self.space_for(self.person_handle) - return (self.v,self.e[1:]) - - def space_for(self,person_handle,level=1.0,pos=1.0): - last = self.elist[-1] - self.elist.append((level,pos)) - self.e.append((last[0],last[1],level,pos)) - self.v.append((person_handle,level,pos)) - if level > self.maxx: - self.maxx = level - if pos > self.maxy: - self.maxy = pos - - person = self.database.get_person_from_handle(person_handle) - for family_handle in person.get_family_handle_list(): - family = self.database.get_family_from_handle(family_handle) - for child_handle in family.get_child_handle_list(): - self.space_for(child_handle,level+1.0,pos) - pos = pos + max(self.depth(child_handle),1) - if pos > self.maxy: - self.maxy = pos - self.elist.pop() - - def depth(self,person_handle,val=0): - person = self.database.get_person_from_handle(person_handle) - for family_handle in person.get_family_handle_list(): - family = self.database.get_family_from_handle(family_handle) - clist = family.get_child_handle_list() - val = val + len(clist) - for child_handle in clist: - d = self.depth(child_handle) - if d > 0: - val = val + d - 1 #first child is always on the same - return val #row as the parent, so subtract 1 diff --git a/src/ImageSelect.py b/src/ImageSelect.py index 869589d2d..e48049fd3 100644 --- a/src/ImageSelect.py +++ b/src/ImageSelect.py @@ -26,6 +26,7 @@ # #------------------------------------------------------------------------- import os +import gc import urlparse from gettext import gettext as _ @@ -59,8 +60,11 @@ import DateHandler import Date import ImgManip import Spell +import GrampsDisplay + from QuestionDialog import ErrorDialog from DdTargets import DdTargets +from WindowUtils import GladeIf _IMAGEX = 140 _IMAGEY = 150 @@ -69,6 +73,12 @@ _PAD = 5 _last_path = "" _iconlist_refs = [] +_drag_targets = [ + ('STRING', 0, 0), + ('text/plain',0,0), + ('text/uri-list',0,2), + ('application/x-rootwin-drop',0,1)] + #------------------------------------------------------------------------- # # ImageSelect class @@ -95,28 +105,32 @@ class ImageSelect: "should be overrridden" pass + def internal_toggled(self, obj): + self.fname.set_sensitive(not obj.get_active()) + def create_add_dialog(self): """Create the gnome dialog for selecting a new photo and entering its description.""" if self.path == '': return - + self.glade = gtk.glade.XML(const.imageselFile,"imageSelect","gramps") self.window = self.glade.get_widget("imageSelect") self.fname = self.glade.get_widget("fname") self.image = self.glade.get_widget("image") + self.internal = self.glade.get_widget("internal") + self.internal.connect('toggled',self.internal_toggled) self.description = self.glade.get_widget("photoDescription") self.temp_name = "" Utils.set_titles(self.window,self.glade.get_widget('title'), _('Select a media object')) - self.glade.signal_autoconnect({ - "on_fname_update_preview" : self.on_name_changed, - "on_help_imagesel_clicked" : self.on_help_imagesel_clicked, - }) + + self.gladeif = GladeIf(self.glade) + self.gladeif.connect('fname', 'update_preview', self.on_name_changed) if os.path.isdir(_last_path): self.fname.set_current_folder(_last_path) @@ -128,10 +142,11 @@ class ImageSelect: if self.val == gtk.RESPONSE_OK: self.on_savephoto_clicked() self.window.destroy() + gc.collect() def on_help_imagesel_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-edit-quick') + GrampsDisplay.help('gramps-edit-quick') self.val = self.window.run() def on_name_changed(self, obj): @@ -146,7 +161,8 @@ class ImageSelect: self.description.set_text(root) self.temp_name = root - if os.path.isfile(filename): + filename = Utils.find_file( filename) + if filename: mtype = GrampsMime.get_type(filename) if mtype and mtype.startswith("image"): image = RelImage.scale_image(filename,const.thumbScale) @@ -164,37 +180,45 @@ class ImageSelect: description = unicode(self.description.get_text()) - if os.path.exists(filename) == 0: - msgstr = _("Cannot import %s") - msgstr2 = _("The filename supplied could not be found.") - ErrorDialog(msgstr % filename, msgstr2) - return + internal = self.internal.get_active() - already_imported = None + if not internal: + if os.path.exists(filename) == 0: + msgstr = _("Cannot import %s") + msgstr2 = _("The filename supplied could not be found.") + ErrorDialog(msgstr % filename, msgstr2) + return - trans = self.db.transaction_begin() - for o_id in self.db.get_media_object_handles(): - o = self.db.get_object_from_handle(o_id) - if o.get_path() == filename: - already_imported = o - break + already_imported = None - if (already_imported): - oref = RelLib.MediaRef() - oref.set_reference_handle(already_imported.get_handle()) - self.dataobj.add_media_reference(oref) - self.add_thumbnail(oref) + for o_id in self.db.get_media_object_handles(): + o = self.db.get_object_from_handle(o_id) + if o.get_path() == filename: + already_imported = o + break + + if already_imported: + oref = RelLib.MediaRef() + oref.set_reference_handle(already_imported.get_handle()) + self.dataobj.add_media_reference(oref) + self.add_thumbnail(oref) + else: + mtype = GrampsMime.get_type(filename) + mobj = RelLib.MediaObject() + if description == "": + description = os.path.basename(filename) + mobj.set_description(description) + mobj.set_mime_type(mtype) + mobj.set_path(filename) else: - mtype = GrampsMime.get_type(filename) mobj = RelLib.MediaObject() - if description == "": - description = os.path.basename(filename) mobj.set_description(description) - mobj.set_mime_type(mtype) - mobj.set_path(filename) - self.savephoto(mobj,trans) + mobj.set_mime_type(None) - self.db.transaction_commit(trans,'Edit Media Objects') + if not already_imported: + trans = self.db.transaction_begin() + self.savephoto(mobj,trans) + self.db.transaction_commit(trans,'Edit Media Objects') self.parent.lists_changed = 1 self.load_images() @@ -203,12 +227,6 @@ class ImageSelect: """Save the photo in the dataobj object - must be overridden""" pass -_drag_targets = [ - ('STRING', 0, 0), - ('text/plain',0,0), - ('text/uri-list',0,2), - ('application/x-rootwin-drop',0,1)] - #------------------------------------------------------------------------- # # Gallery class - This class handles all the logic underlying a @@ -226,7 +244,8 @@ class Gallery(ImageSelect): [DdTargets.MEDIAOBJ.target()]+_drag_targets, gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE) icon_list.connect('event',self.item_event) - icon_list.connect("drag_data_received", + if not db.readonly: + icon_list.connect("drag_data_received", self.on_photolist_drag_data_received) icon_list.connect("drag_data_get", self.on_photolist_drag_data_get) @@ -271,13 +290,15 @@ class Gallery(ImageSelect): if const.dnd_images: handle = self.sel_obj.get_reference_handle() media_obj = self.db.get_object_from_handle(handle) - pix = ImgManip.get_thumbnail_image(media_obj.get_path()) + pix = ImgManip.get_thumbnail_image(media_obj.get_path(), + media_obj.get_mime_type()) context.set_icon_pixbuf(pix,0,0) def item_event(self, widget, event=None): if self.in_event: - return + return False + self.in_event = 1 if self.button and event.type == gtk.gdk.MOTION_NOTIFY : if widget.drag_check_threshold(int(self.remember_x),int(self.remember_y), @@ -290,8 +311,12 @@ class Gallery(ImageSelect): for i in self.dataobj.get_media_list(): handle = i.get_reference_handle() m = self.db.get_object_from_handle(handle) - - self.sel_obj = self.dataobj.get_media_list()[icon_index] + + media_list = self.dataobj.get_media_list() + + if icon_index >= len(media_list): + return False + self.sel_obj = media_list[icon_index] handle = self.sel_obj.get_reference_handle() media_obj = self.db.get_object_from_handle(handle) @@ -377,12 +402,7 @@ class Gallery(ImageSelect): try: mtype = media_obj.get_mime_type() - if mtype and mtype.startswith("image"): - image = ImgManip.get_thumbnail_image(media_obj.get_path()) - else: - image = Utils.find_mime_type_pixbuf(mtype) - if not image: - image = gtk.gdk.pixbuf_new_from_file(const.icon) + image = ImgManip.get_thumbnail_image(media_obj.get_path(),mtype) except gobject.GError,msg: ErrorDialog(str(msg)) image = gtk.gdk.pixbuf_new_from_file(const.icon) @@ -463,10 +483,10 @@ class Gallery(ImageSelect): def on_photolist_drag_data_received(self,w, context, x, y, data, info, time): if data and data.format == 8: icon_index = self.get_index(w,x,y) - d = data.data.replace('\0',' ').strip() + d = Utils.fix_encoding(data.data.replace('\0',' ').strip()) protocol,site,mfile,j,k,l = urlparse.urlparse(d) if protocol == "file": - name = mfile + name = Utils.fix_encoding(mfile) mime = GrampsMime.get_type(name) photo = RelLib.MediaObject() photo.set_path(name) @@ -492,6 +512,7 @@ class Gallery(ImageSelect): t = _("Could not import %s") % d ErrorDialog(t,str(msg)) return + tfile = Utils.fix_encoding(tfile) mime = GrampsMime.get_type(tfile) photo = RelLib.MediaObject() photo.set_mime_type(mime) @@ -595,8 +616,20 @@ class Gallery(ImageSelect): if self.sel: (i,t,b,photo,oid) = self.p_map[self.sel] - LocalMediaProperties(photo,self.path,self,self.parent_window) + base_obj = self.db.get_object_from_handle(photo.get_reference_handle()) + + if base_obj.get_mime_type(): + LocalMediaProperties(photo,self.path,self,self.parent_window) + else: + import NoteEdit + NoteEdit.NoteEditor(base_obj,self.parent,self.parent_window, + self.note_callback) + def note_callback(self,data): + trans = self.db.transaction_begin() + self.db.commit_media_object(data,trans) + self.db.transaction_commit(trans,_("Edit Media Object")) + def show_popup(self, photo, event): """Look for right-clicks on a picture and create a popup menu of the available actions.""" @@ -661,7 +694,8 @@ class LocalMediaProperties: self.lists_changed = 0 fname = self.obj.get_path() - self.change_dialog = gtk.glade.XML(const.imageselFile,"change_description","gramps") + self.change_dialog = gtk.glade.XML(const.imageselFile, + "change_description","gramps") title = _('Media Reference Editor') self.window = self.change_dialog.get_widget('change_description') @@ -689,7 +723,8 @@ class LocalMediaProperties: self.slist = self.change_dialog.get_widget("src_list") self.sources_label = self.change_dialog.get_widget("source_label") if self.obj: - self.srcreflist = [RelLib.SourceRef(ref) for ref in self.photo.get_source_references()] + self.srcreflist = [RelLib.SourceRef(ref) + for ref in self.photo.get_source_references()] else: self.srcreflist = [] @@ -703,16 +738,26 @@ class LocalMediaProperties: descr_window.set_text(self.obj.get_description()) mtype = self.obj.get_mime_type() - self.pix = ImgManip.get_thumbnail_image(self.obj.get_path()) + self.pix = ImgManip.get_thumbnail_image(self.obj.get_path(),mtype) self.pixmap.set_from_pixbuf(self.pix) self.change_dialog.get_widget("private").set_active(photo.get_privacy()) + coord = photo.get_rectangle() + if coord and type(coord) == tuple: + self.change_dialog.get_widget("upperx").set_value(coord[0]) + self.change_dialog.get_widget("uppery").set_value(coord[1]) + self.change_dialog.get_widget("lowerx").set_value(coord[2]) + self.change_dialog.get_widget("lowery").set_value(coord[3]) + self.change_dialog.get_widget("gid").set_text(self.obj.get_gramps_id()) self.change_dialog.get_widget("path").set_text(fname) mt = Utils.get_mime_description(mtype) - self.change_dialog.get_widget("type").set_text(mt) + if mt: + self.change_dialog.get_widget("type").set_text(mt) + else: + self.change_dialog.get_widget("type").set_text("") self.notes = self.change_dialog.get_widget("notes") self.spell = Spell.Spell(self.notes) if self.photo.get_note(): @@ -723,17 +768,16 @@ class LocalMediaProperties: else: self.flowed.set_active(1) - self.change_dialog.signal_autoconnect({ - "on_add_attr_clicked": self.on_add_attr_clicked, - "on_notebook_switch_page": self.on_notebook_switch_page, - "on_update_attr_clicked": self.on_update_attr_clicked, - "on_delete_attr_clicked" : self.on_delete_attr_clicked, - "on_help_clicked" : self.on_help_clicked, - "on_ok_clicked" : self.on_ok_clicked, - "on_cancel_clicked" : self.close, - "on_local_delete_event" : self.on_delete_event, - }) - + self.gladeif = GladeIf(self.change_dialog) + self.gladeif.connect('change_description','delete_event',self.on_delete_event) + self.gladeif.connect('button84','clicked',self.close) + self.gladeif.connect('button82','clicked',self.on_ok_clicked) + self.gladeif.connect('button104','clicked',self.on_help_clicked) + self.gladeif.connect('notebook1','switch_page',self.on_notebook_switch_page) + self.gladeif.connect('button86','clicked',self.on_add_attr_clicked) + self.gladeif.connect('button100','clicked',self.on_update_attr_clicked) + self.gladeif.connect('button88','clicked',self.on_delete_attr_clicked) + media_obj = self.db.get_object_from_handle(self.photo.get_reference_handle()) gnote = self.change_dialog.get_widget('global_notes') spell = Spell.Spell(gnote) @@ -747,13 +791,17 @@ class LocalMediaProperties: self.window.show() def on_delete_event(self,obj,b): + self.gladeif.close() self.close_child_windows() self.remove_itself_from_menu() + gc.collect() def close(self,obj): + self.gladeif.close() self.close_child_windows() self.remove_itself_from_menu() self.window.destroy() + gc.collect() def close_child_windows(self): for child_window in self.child_windows.values(): @@ -805,17 +853,29 @@ class LocalMediaProperties: def on_apply_clicked(self): priv = self.change_dialog.get_widget("private").get_active() + coord = ( + self.change_dialog.get_widget("upperx").get_value_as_int(), + self.change_dialog.get_widget("uppery").get_value_as_int(), + self.change_dialog.get_widget("lowerx").get_value_as_int(), + self.change_dialog.get_widget("lowery").get_value_as_int(), + ) + if (coord[0] == None and coord[1] == None + and coord[2] == None and coord[3] == None): + coord = None + t = self.notes.get_buffer() text = unicode(t.get_text(t.get_start_iter(),t.get_end_iter(),False)) note = self.photo.get_note() format = self.preform.get_active() - if text != note or priv != self.photo.get_privacy(): + if text != note or priv != self.photo.get_privacy() \ + or coord != self.photo.get_rectangle() \ + or format != self.photo.get_note_format(): + self.photo.set_rectangle(coord) self.photo.set_note(text) self.photo.set_privacy(priv) + self.photo.set_note_format(format) self.parent.lists_changed = 1 self.parent.parent.lists_changed = 1 - if format != self.photo.get_note_format(): - self.photo.set_note_format(format) if self.lists_changed: self.photo.set_attribute_list(self.alist) self.photo.set_source_reference_list(self.srcreflist) @@ -828,7 +888,7 @@ class LocalMediaProperties: def on_help_clicked(self, obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-edit-complete') + GrampsDisplay.help('gramps-edit-complete') def on_ok_clicked(self,obj): self.on_apply_clicked() @@ -889,10 +949,12 @@ class GlobalMediaProperties: self.win_key = obj.get_handle() else: self.win_key = self + self.pdmap = {} self.child_windows = {} self.obj = obj self.lists_changed = 0 self.db = db + self.idle = None if obj: self.date_object = Date.Date(self.obj.get_date_object()) self.alist = self.obj.get_attribute_list()[:] @@ -905,6 +967,7 @@ class GlobalMediaProperties: self.path = self.db.get_save_path() self.change_dialog = gtk.glade.XML(const.imageselFile, "change_global","gramps") + self.gladeif = GladeIf(self.change_dialog) mode = not self.db.readonly @@ -958,7 +1021,8 @@ class GlobalMediaProperties: self.slist = self.change_dialog.get_widget("src_list") self.sources_label = self.change_dialog.get_widget("sourcesGlobal") if self.obj: - self.srcreflist = [RelLib.SourceRef(ref) for ref in self.obj.get_source_references()] + self.srcreflist = [RelLib.SourceRef(ref) + for ref in self.obj.get_source_references()] else: self.srcreflist = [] @@ -973,10 +1037,11 @@ class GlobalMediaProperties: self.descr_window.set_text(self.obj.get_description()) mtype = self.obj.get_mime_type() if mtype: - pb = ImgManip.get_thumbnail_image(self.obj.get_path()) + pb = ImgManip.get_thumbnail_image(self.obj.get_path(),mtype) self.pixmap.set_from_pixbuf(pb) descr = Utils.get_mime_description(mtype) - self.change_dialog.get_widget("type").set_text(descr) + if descr: + self.change_dialog.get_widget("type").set_text(descr) else: self.change_dialog.get_widget("type").set_text(_('Note')) self.pixmap.hide() @@ -993,20 +1058,16 @@ class GlobalMediaProperties: else: self.flowed.set_active(1) - self.change_dialog.signal_autoconnect({ - "on_cancel_clicked" : self.close, - "on_up_clicked" : self.on_up_clicked, - "on_down_clicked" : self.on_down_clicked, - "on_ok_clicked" : self.on_ok_clicked, - "on_apply_clicked" : self.on_apply_clicked, - "on_add_attr_clicked" : self.on_add_attr_clicked, - "on_notebook_switch_page": self.on_notebook_switch_page, - "on_delete_attr_clicked" : self.on_delete_attr_clicked, - "on_update_attr_clicked" : self.on_update_attr_clicked, - "on_help_clicked" : self.on_help_clicked, - "on_global_delete_event" : self.on_delete_event, - }) - + self.gladeif.connect('change_global','delete_event', + self.on_delete_event) + self.gladeif.connect('button91','clicked',self.close) + self.gladeif.connect('ok','clicked',self.on_ok_clicked) + self.gladeif.connect('button102','clicked',self.on_help_clicked) + self.gladeif.connect('notebook2','switch_page', + self.on_notebook_switch_page) + self.gladeif.connect('add_attr','clicked',self.on_add_attr_clicked) + self.gladeif.connect('button101','clicked',self.on_update_attr_clicked) + self.gladeif.connect('del_attr','clicked',self.on_delete_attr_clicked) for name in ['gl_del_src','gl_add_src','add_attr','del_attr','ok']: self.change_dialog.get_widget(name).set_sensitive(mode) @@ -1018,16 +1079,21 @@ class GlobalMediaProperties: self.window.show() if not self.refs: Utils.temp_label(self.refs_label,self.window) - gobject.idle_add(self.display_refs) + self.cursor_type = None + self.idle = gobject.idle_add(self.display_refs) def on_delete_event(self,obj,b): self.close_child_windows() self.remove_itself_from_menu() + gc.collect() def close(self,obj): self.close_child_windows() self.remove_itself_from_menu() self.window.destroy() + if self.idle != None: + gobject.source_remove(self.idle) + gc.collect() def close_child_windows(self): for child_window in self.child_windows.values(): @@ -1087,62 +1153,167 @@ class GlobalMediaProperties: Utils.unbold_label(self.attr_label) def button_press(self,obj): - store,node = self.refmodel.selection.get_selected() - if not node: + data = self.refmodel.get_selected_objects() + if not data: return + (data_type,handle) = data[0] + if data_type == 0: + import EditPerson + person = self.db.get_person_from_handle(handle) + EditPerson.EditPerson(self.parent.parent,person,self.db) + elif data_type == 1: + import Marriage + family = self.db.get_family_from_handle(handle) + Marriage.Marriage(self.parent.parent,family,self.db) + elif data_type == 2: + import EventEdit + event = self.db.get_event_from_handle(handle) + event_name = event.get_name() + if const.family_events.has_key(event_name): + EventEdit.FamilyEventEditor( + self,", ", event, None, 0, None, None, self.db.readonly) + elif const.personal_events.has_key(event_name): + EventEdit.PersonEventEditor( + self,", ", event, None, 0, None, None, self.db.readonly) + elif event_name in ["Birth","Death"]: + EventEdit.PersonEventEditor( + self,", ", event, None, 1, None, None, self.db.readonly) + elif data_type == 3: + import EditPlace + place = self.db.get_place_from_handle(handle) + EditPlace.EditPlace(self.parent.parent,place) + elif data_type == 4: + source = self.db.get_source_from_handle(handle) + import EditSource + EditSource.EditSource(source,self.db,self.parent.parent, + None,self.db.readonly) def display_refs(self): + media_handle = self.obj.get_handle() self.refs = 1 - (person_list,family_list,event_list,place_list,source_list - ) = Utils.get_media_referents(self.obj.get_handle(),self.db) + # Initialize things if we're entering this functioin + # for the first time + if not self.cursor_type: + self.cursor_type = 'Person' + self.cursor = self.db.get_person_cursor() + self.data = self.cursor.first() - any = person_list or family_list or event_list or place_list or source_list + self.any_refs = False + titles = [(_('Type'),0,150),(_('ID'),1,75),(_('Name'),2,150)] + self.refmodel = ListModel.ListModel( + self.change_dialog.get_widget("refinfo"), + titles, + event_func=self.button_press) - titles = [(_('Type'),0,150),(_('ID'),1,75),(_('Name'),2,150)] - self.refmodel = ListModel.ListModel( - self.change_dialog.get_widget("refinfo"), - titles,event_func=self.button_press) + if self.cursor_type == 'Person': + while self.data: + handle,val = self.data + person = RelLib.Person() + person.unserialize(val) + if person.has_media_reference(media_handle): + name = NameDisplay.displayer.display(person) + gramps_id = person.get_gramps_id() + self.refmodel.add([_("Person"),gramps_id,name], + (0,handle)) + self.any_refs = True + self.data = self.cursor.next() + if gtk.events_pending(): + return True + self.cursor.close() + + self.cursor_type = 'Family' + self.cursor = self.db.get_family_cursor() + self.data = self.cursor.first() - for handle in person_list: - person = self.db.get_person_from_handle(handle) - name = NameDisplay.displayer.display(person) - gramps_id = person.get_gramps_id() - self.refmodel.add([_("Person"),gramps_id,name]) + if self.cursor_type == 'Family': + while self.data: + handle,val = self.data + family = RelLib.Family() + family.unserialize(val) + if family.has_media_reference(media_handle): + name = Utils.family_name(family,self.db) + gramps_id = family.get_gramps_id() + self.refmodel.add([_("Family"),gramps_id,name], + (1,handle)) + self.any_refs = True + self.data = self.cursor.next() + if gtk.events_pending(): + return True + self.cursor.close() + + self.cursor_type = 'Event' + self.cursor = self.db.get_event_cursor() + self.data = self.cursor.first() - for handle in family_list: - family = self.db.get_family_from_handle(handle) - name = Utils.family_name(family,self.db) - gramps_id = family.get_gramps_id() - self.refmodel.add([_("Family"),gramps_id,name]) + if self.cursor_type == 'Event': + while self.data: + handle,val = self.data + event = RelLib.Event() + event.unserialize(val) + if event.has_media_reference(media_handle): + name = event.get_name() + gramps_id = event.get_gramps_id() + self.refmodel.add([_("Event"),gramps_id,name], + (2,handle)) + self.any_refs = True + self.data = self.cursor.next() + if gtk.events_pending(): + return True + self.cursor.close() + + self.cursor_type = 'Place' + self.cursor = self.db.get_place_cursor() + self.data = self.cursor.first() - for handle in event_list: - event = self.db.get_event_from_handle(handle) - name = event.get_name() - gramps_id = event.get_gramps_id() - self.refmodel.add([_("Event"),gramps_id,name]) + if self.cursor_type == 'Place': + while self.data: + handle,val = self.data + place = RelLib.Place() + place.unserialize(val) + if place.has_media_reference(media_handle): + name = place.get_title() + gramps_id = place.get_gramps_id() + self.refmodel.add([_("Place"),gramps_id,name], + (3,handle)) + self.any_refs = True + self.data = self.cursor.next() + if gtk.events_pending(): + return True + self.cursor.close() + + self.cursor_type = 'Source' + self.cursor = self.db.get_source_cursor() + self.data = self.cursor.first() - for handle in place_list: - place = self.db.get_place_from_handle(handle) - name = place.get_title() - gramps_id = place.get_gramps_id() - self.refmodel.add([_("Place"),gramps_id,name]) + if self.cursor_type == 'Source': + while self.data: + handle,val = self.data + source = RelLib.Source() + source.unserialize(val) + if source.has_media_reference(media_handle): + name = source.get_title() + gramps_id = source.get_gramps_id() + self.refmodel.add([_("Source"),gramps_id,name], + (4,handle)) + self.any_refs = True + self.data = self.cursor.next() + if gtk.events_pending(): + return True + self.cursor.close() - for handle in source_list: - source = self.db.get_source_from_handle(handle) - name = source.get_title() - gramps_id = source.get_gramps_id() - self.refmodel.add([_("Source"),gramps_id,name]) - - if any: + if self.any_refs: Utils.bold_label(self.refs_label,self.window) else: Utils.unbold_label(self.refs_label,self.window) + + self.cursor_type = None + return False def on_notebook_switch_page(self,obj,junk,page): if page == 3 and not self.refs: Utils.temp_label(self.refs_label,self.window) - gobject.idle_add(self.display_refs) + self.idle = gobject.idle_add(self.display_refs) t = self.notes.get_buffer() text = unicode(t.get_text(t.get_start_iter(),t.get_end_iter(),False)) if text: @@ -1162,7 +1333,6 @@ class GlobalMediaProperties: self.db.add_place(place,trans) self.db.transaction_commit(trans,_('Add Place (%s)' % text)) self.pdmap[text] = place.get_handle() - self.add_places.append(place) return place.get_handle() else: return None @@ -1175,6 +1345,9 @@ class GlobalMediaProperties: desc = unicode(self.descr_window.get_text()) note = self.obj.get_note() path = self.change_dialog.get_widget('path').get_text() + if path != self.obj.get_path(): + mime = GrampsMime.get_type(path) + self.obj.set_mime_type(mime) self.obj.set_path(path) if not self.date_object.is_equal(self.obj.get_date_object()): @@ -1195,7 +1368,7 @@ class GlobalMediaProperties: def on_help_clicked(self, obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','adv-media') + GrampsDisplay.help('adv-media') def on_ok_clicked(self, obj): self.on_apply_clicked(obj) diff --git a/src/ImgManip.py b/src/ImgManip.py index bfa3e5ad5..21fd3a0ab 100644 --- a/src/ImgManip.py +++ b/src/ImgManip.py @@ -25,12 +25,18 @@ import md5 import gtk import gobject +import GrampsKeys +import Utils + class ImgManip: def __init__(self,source): self.src = source def size(self): - img = gtk.gdk.pixbuf_new_from_file(self.src) + try: + img = gtk.gdk.pixbuf_new_from_file(self.src) + except gobject.GError: + return (0,0) return (img.get_width(),img.get_height()) def fmt_thumbnail(self,dest,width,height,cnv): @@ -95,34 +101,63 @@ class ImgManip: def _build_thumb_path(path): base = os.path.expanduser('~/.gramps/thumb') m = md5.md5(path) - return os.path.join(base,m.hexdigest()+'.jpg') + return os.path.join(base,m.hexdigest()+'.png') -def set_thumbnail_image(path): - try: - pixbuf = gtk.gdk.pixbuf_new_from_file(path) - w = pixbuf.get_width() - h = pixbuf.get_height() - scale = const.thumbScale / (float(max(w,h))) - - pw = int(w*scale) - ph = int(h*scale) - - pixbuf = pixbuf.scale_simple(pw,ph,gtk.gdk.INTERP_BILINEAR) - pixbuf.save(_build_thumb_path(path),"jpeg") - except: - print "Could not create thumbnail for",path +def run_thumbnailer(mtype, frm, to, size=const.thumbScale): + sublist = { + '%s' : "%dx%d" % (int(size),int(size)), + '%u' : frm, + '%o' : to, + } -def get_thumbnail_image(path): + base = '/desktop/gnome/thumbnailers/%s' % mtype.replace('/','@') + cmd = GrampsKeys.client.get_string(base + '/command') + enable = GrampsKeys.client.get_bool(base + '/enable') + + if cmd and enable: + cmdlist = map(lambda x: sublist.get(x,x),cmd.split()) + if os.fork() == 0: + os.execvp(cmdlist[0],cmdlist) + os.wait() + return True + return False + +def set_thumbnail_image(path,mtype=None): + if mtype and not mtype.startswith('image/'): + run_thumbnailer(mtype,path,_build_thumb_path(path)) + else: + try: + pixbuf = gtk.gdk.pixbuf_new_from_file(path) + w = pixbuf.get_width() + h = pixbuf.get_height() + scale = const.thumbScale / (float(max(w,h))) + + pw = int(w*scale) + ph = int(h*scale) + + pixbuf = pixbuf.scale_simple(pw,ph,gtk.gdk.INTERP_BILINEAR) + pixbuf.save(_build_thumb_path(path),"png") + except: + pass + +def get_thumbnail_image(path,mtype=None): filename = _build_thumb_path(path) - if not os.path.isfile(filename): - set_thumbnail_image(path) + try: + path = Utils.find_file( path) + if not os.path.isfile(filename): + set_thumbnail_image(path,mtype) + elif os.path.getmtime(path) > os.path.getmtime(filename): + set_thumbnail_image(path,mtype) return gtk.gdk.pixbuf_new_from_file(filename) - except gobject.GError: - return None + except (gobject.GError, OSError): + if mtype: + return Utils.find_mime_type_pixbuf(mtype) + else: + return gtk.gdk.pixbuf_new_from_file(os.path.join(const.dataDir,"document.png")) -def get_thumbnail_path(path): +def get_thumbnail_path(path,mtype=None): filename = _build_thumb_path(path) if not os.path.isfile(filename): - set_thumbnail_image(path) + set_thumbnail_image(path,mtype) return filename diff --git a/src/LocEdit.py b/src/LocEdit.py index 21ce0a6f3..07f8d44bf 100644 --- a/src/LocEdit.py +++ b/src/LocEdit.py @@ -27,7 +27,6 @@ #------------------------------------------------------------------------- import gtk import gtk.glade -import gnome #------------------------------------------------------------------------- # @@ -37,6 +36,8 @@ import gnome import const import Utils import RelLib +import GrampsDisplay +from WindowUtils import GladeIf from gettext import gettext as _ @@ -59,6 +60,8 @@ class LocationEditor: self.win_key = self self.location = location self.top = gtk.glade.XML(const.dialogFile, "loc_edit","gramps") + self.gladeif = GladeIf(self.top) + self.window = self.top.get_widget("loc_edit") self.city = self.top.get_widget("city") self.state = self.top.get_widget("state") @@ -81,22 +84,23 @@ class LocationEditor: self.parish.set_text(location.get_parish()) self.window.set_data("o",self) - self.top.signal_autoconnect({ - "on_help_loc_clicked" : self.on_help_clicked, - "on_ok_loc_clicked" : self.on_location_edit_ok_clicked, - "on_cancel_loc_clicked" : self.close, - "on_loc_delete_event" : self.on_delete_event, - }) + self.gladeif.connect('loc_edit','delete_event',self.on_delete_event) + self.gladeif.connect('button119','clicked',self.close) + self.gladeif.connect('button118','clicked',self.on_ok_clicked) + self.gladeif.connect('button128','clicked',self.on_help_clicked) + if parent_window: self.window.set_transient_for(parent_window) self.add_itself_to_menu() self.window.show() def on_delete_event(self,obj,b): + self.gladeif.close() self.remove_itself_from_menu() def close(self,obj): + self.gladeif.close() self.remove_itself_from_menu() self.window.destroy() @@ -116,9 +120,9 @@ class LocationEditor: def on_help_clicked(self,obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-edit-complete') + GrampsDisplay.help('gramps-edit-complete') - def on_location_edit_ok_clicked(self,obj): + def on_ok_clicked(self,obj): city = unicode(self.city.get_text()) county = unicode(self.county.get_text()) country = unicode(self.country.get_text()) diff --git a/src/Makefile.am b/src/Makefile.am index aa54fdd70..b1ff1d56e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -58,13 +58,13 @@ gdir_PYTHON = \ GrampsBSDDB.py\ GrampsDbBase.py\ GrampsDBCallback.py\ + GrampsDisplay.py\ GrampsInMemDB.py\ GrampsXMLDB.py\ GrampsGEDDB.py\ GrampsMime.py\ gramps_main.py\ gramps.py\ - GraphLayout.py\ ImageSelect.py\ ImgManip.py\ latin_ansel.py\ @@ -126,7 +126,11 @@ gdir_PYTHON = \ WriteGrdb.py\ EventView.py\ SelectEvent.py\ - Spell.py + Spell.py\ + Options.py\ + Tool.py\ + TransUtils.py\ + WindowUtils.py # Could use GNU make's ':=' syntax for nice wildcard use. # If not using GNU make, then list all files individually @@ -179,3 +183,6 @@ pycheck: docs: epydoc -o doc --url http://gramps.sourceforge.net --name GRAMPS --html $(docfiles) epydoc --pdf $(docfiles) + +cmdplug: + ./build_cmdplug diff --git a/src/MergeData.py b/src/MergeData.py index 14944aa51..1bdf55994 100644 --- a/src/MergeData.py +++ b/src/MergeData.py @@ -33,7 +33,6 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk -from gnome import help_display #------------------------------------------------------------------------- # @@ -42,6 +41,7 @@ from gnome import help_display #------------------------------------------------------------------------- import Utils import const +import GrampsDisplay #------------------------------------------------------------------------- # @@ -80,7 +80,7 @@ class MergePlaces: def help(self,obj): """Display the relevant portion of GRAMPS manual""" - help_display('gramps-manual','adv-merge-places') + GrampsDisplay.help('adv-merge-places') def on_merge_places_clicked(self,obj): """ @@ -220,7 +220,7 @@ class MergeSources: def help(self,obj): """Display the relevant portion of GRAMPS manual""" - help_display('gramps-manual','adv-merge-sources') + GrampsDisplay.help('adv-merge-sources') def merge(self,obj): """ diff --git a/src/MergePeople.py b/src/MergePeople.py index 5334db96a..cc895aefe 100644 --- a/src/MergePeople.py +++ b/src/MergePeople.py @@ -35,7 +35,6 @@ import sets #------------------------------------------------------------------------- import gtk import pango -from gnome import help_display #------------------------------------------------------------------------- # @@ -49,6 +48,7 @@ import NameDisplay import const import DateHandler import QuestionDialog +import GrampsDisplay sex = ( _("female"), _("male"), _("unknown")) @@ -79,7 +79,7 @@ class Compare: def help(self,obj): """Display the relevant portion of GRAMPS manual""" - help_display('gramps-manual','adv-merge-people') + GrampsDisplay.help('adv-merge-people') def merge(self,obj): @@ -99,9 +99,9 @@ class Compare: merge = MergePeople(self.db,self.p1,self.p2) else: merge = MergePeople(self.db,self.p2,self.p1) - self.top.destroy() - merge.merge() - self.update() + self.top.destroy() + merge.merge() + self.update() def add(self, tobj, tag, text): text += "\n" @@ -157,9 +157,9 @@ class Compare: slist = person.get_family_handle_list() if len(slist) > 0: for fid in slist: - (fn,mn,id) = self.get_parent_info(fid) + (fn,mn,pid) = self.get_parent_info(fid) family = self.db.get_family_from_handle(fid) - self.add(tobj,normal,"%s:\t%s" % (_('Family ID'),id)) + self.add(tobj,normal,"%s:\t%s" % (_('Family ID'),pid)) spouse_id = ReportUtils.find_spouse(person,family) if spouse_id: spouse = self.db.get_person_from_handle(spouse_id) @@ -168,8 +168,8 @@ class Compare: self.add(tobj,indent,"%s:\t%s" % (_('Type'),relstr)) event = ReportUtils.find_marriage(self.db,family) if event: - self.add(tobj,indent,"%s:\t%s" % (_('Marriage'), - self.get_event_info(event.get_handle()))) + self.add(tobj,indent,"%s:\t%s" % ( + _('Marriage'), self.get_event_info(event.get_handle()))) for child_id in family.get_child_handle_list(): child = self.db.get_person_from_handle(child_id) self.add(tobj,indent,"%s:\t%s" % (_('Child'),name_of(child))) @@ -294,7 +294,7 @@ class MergePeopleUI: def help(self,obj): """Display the relevant portion of GRAMPS manual""" - help_display('gramps-manual','adv-merge-people') + GrampsDisplay.help('adv-merge-people') def name_of(p): @@ -355,7 +355,11 @@ class MergePeople: trans = self.db.transaction_begin() self.merge_person_information(new,trans) + self.debug_person(new, "NEW") + self.merge_family_information(new,trans) + self.debug_person(new, "NEW") + self.db.commit_person(new,trans) self.debug_person(new, "NEW") self.db.remove_person(self.old_handle,trans) @@ -538,6 +542,7 @@ class MergePeople: """ self.merge_parents(new, trans) self.merge_relationships(new, trans) + self.debug_person(new, "NEW") def merge_parents(self, new, trans): """ @@ -558,6 +563,8 @@ class MergePeople: for fid in self.p2.get_parent_family_handle_list(): if fid not in parent_list: parent_list.append(fid) + if __debug__: + print "Adding family to parent list", fid # loop through the combined list, converting the child handles # of the families, and adding the families to the merged @@ -600,6 +607,7 @@ class MergePeople: family_num = 0 family_list = self.p1.get_family_handle_list() + new.set_family_handle_list(family_list) for src_handle in self.p2.get_family_handle_list(): @@ -636,6 +644,8 @@ class MergePeople: for fid in self.p1.get_family_handle_list(): if fid not in new.get_family_handle_list(): new.add_family_handle(fid) + if __debug__: + print "Adding family %s" % fid if src_handle in new.get_family_handle_list(): continue @@ -750,6 +760,8 @@ class MergePeople: if child_handle != self.new_handle: child = self.db.get_person_from_handle(child_handle) if child.remove_parent_family_handle(src_family_handle): + if __debug__: + print "Remove parent family %s from %s" % (src_family_handle,child_handle) self.db.commit_person(child,trans) # delete the old source family @@ -757,7 +769,8 @@ class MergePeople: if __debug__: print "Deleted src_family %s" % src_family_handle self.db.commit_family(tgt_family,trans) - new.add_family_handle(tgt_family.get_handle()) + if tgt_family.get_handle() not in new.get_family_handle_list(): + new.add_family_handle(tgt_family.get_handle()) def merge_family_pair(self,tgt_family,src_family,trans): diff --git a/src/NameDisplay.py b/src/NameDisplay.py index 92aec0b4a..74c1603b6 100644 --- a/src/NameDisplay.py +++ b/src/NameDisplay.py @@ -24,14 +24,6 @@ Class handling language-specific displaying of names. """ -#------------------------------------------------------------------------- -# -# Standard python modules -# -#------------------------------------------------------------------------- -import os -import locale - #------------------------------------------------------------------------- # # GRAMPS modules @@ -112,6 +104,13 @@ class NameDisplay: else: return self._lnfn(name) + def display_given(self,person): + name = person.get_primary_name() + if name.patronymic: + return "%s %s" % (name.first_name, name.patronymic) + else: + return name.first_name + def display(self,person): """ Returns a text string representing the L{RelLib.Person} instance's @@ -126,9 +125,27 @@ class NameDisplay: """ name = person.get_primary_name() if name.display_as == RelLib.Name.LNFN: - return self._lnfn(name) + return self._lnfn(name,"") else: - return self._fnln(name) + return self._fnln(name,"") + + def display_formal(self,person): + """ + Returns a text string representing the L{RelLib.Person} instance's + L{RelLib.Name} in a manner that should be used for normal displaying. + + @param person: L{RelLib.Person} instance that contains the + L{RelLib.Name} that is to be displayed. The primary name is used for + the display. + @type person: L{RelLib.Person} + @returns: Returns the L{RelLib.Person} instance's name + @rtype: str + """ + name = person.get_primary_name() + if name.display_as == RelLib.Name.LNFN: + return self._lnfn(name,'') + else: + return self._fnln(name,'') def display_name(self,name): """ @@ -175,17 +192,21 @@ class NameDisplay: else: return "%s %s, %s" % (last, name.suffix, first) - def _fnln(self,name): + def _fnln(self,name,nickname=""): """ Prints the Western style first name, last name style. Typically this is:: FirstName Patronymic SurnamePrefix Surname SurnameSuffix """ + + first = name.first_name + + if nickname: + first = '%s "%s"' % (first,nickname) + if name.patronymic: - first = "%s %s" % (name.first_name, name.patronymic) - else: - first = name.first_name + first = "%s %s" % (first, name.patronymic) if self.force_upper: last = name.surname.upper() @@ -218,33 +239,40 @@ class NameDisplay: val = pn.first_name return db.get_name_group_mapping(val) - def _lnfn(self,name): + def _lnfn(self,name,nickname=u""): """ Prints the Western style last name, first name style. Typically this is:: SurnamePrefix Surname, FirstName Patronymic SurnameSuffix """ + + first = name.first_name + + if nickname: + first = '%s "%s"' % (first,nickname) + if name.patronymic: - first = "%s %s" % (name.first_name, name.patronymic) - else: - first = name.first_name + first = "%s %s" % (first, name.patronymic) if self.force_upper: last = name.surname.upper() else: last = name.surname + if last: + last += "," + if name.suffix: if name.prefix: - return "%s %s, %s %s" % (name.prefix, last, first, name.suffix) + return "%s %s %s %s" % (name.prefix, last, first, name.suffix) else: - return "%s, %s %s" % (last, first, name.suffix) + return "%s %s %s" % (last, first, name.suffix) else: if name.prefix: - return "%s %s, %s" % (name.prefix, last, first) + return "%s %s %s" % (name.prefix, last, first) else: - return "%s, %s" % (last, first) + return "%s %s" % (last, first) displayer = NameDisplay() diff --git a/src/NameEdit.py b/src/NameEdit.py index a6b0b6664..be3769c75 100644 --- a/src/NameEdit.py +++ b/src/NameEdit.py @@ -26,6 +26,8 @@ # #------------------------------------------------------------------------- from gettext import gettext as _ +import gc +from cgi import escape #------------------------------------------------------------------------- # @@ -33,7 +35,6 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk.glade -import gnome #------------------------------------------------------------------------- # @@ -50,6 +51,9 @@ import Date import DateEdit import DateHandler import Spell +import GrampsDisplay + +from WindowUtils import GladeIf #------------------------------------------------------------------------- # @@ -74,16 +78,25 @@ class NameEditor: self.callback = callback self.child_windows = {} self.top = gtk.glade.XML(const.dialogFile, "name_edit","gramps") + self.gladeif = GladeIf(self.top) self.window = self.top.get_widget("name_edit") self.given_field = self.top.get_widget("alt_given") + self.given_field.set_editable(not self.db.readonly) self.sort_as = self.top.get_widget("sort_as") + self.sort_as.set_sensitive(not self.db.readonly) self.display_as = self.top.get_widget("display_as") + self.display_as.set_sensitive(not self.db.readonly) self.group_as = self.top.get_widget("group_as") self.title_field = self.top.get_widget("alt_title") + self.title_field.set_editable(not self.db.readonly) self.suffix_field = self.top.get_widget("alt_suffix") + self.suffix_field.set_editable(not self.db.readonly) self.patronymic_field = self.top.get_widget("patronymic") + self.patronymic_field.set_editable(not self.db.readonly) self.combo = self.top.get_widget("alt_surname_list") + self.combo.set_sensitive(not self.db.readonly) self.date = self.top.get_widget('date') + self.date.set_editable(not self.db.readonly) if self.name: self.srcreflist = self.name.get_source_references() @@ -94,16 +107,21 @@ class NameEditor: self.date.set_text(DateHandler.displayer.display(self.date_obj)) + date_stat = self.top.get_widget("date_stat") + date_stat.set_sensitive(not self.db.readonly) self.date_check = DateEdit.DateEdit( self.date_obj, self.date, - self.top.get_widget("date_stat"), self.window) + date_stat, self.window) AutoComp.fill_combo(self.combo,self.parent.db.get_surname_list()) self.surname_field = self.combo.get_child() self.prefix_field = self.top.get_widget("alt_prefix") + self.prefix_field.set_editable(not self.db.readonly) self.type_combo = self.top.get_widget("name_type") + self.type_combo.set_sensitive(not self.db.readonly) self.note_field = self.top.get_widget("alt_note") + self.note_field.set_editable(not self.db.readonly) self.spell = Spell.Spell(self.note_field) self.slist = self.top.get_widget('slist') @@ -111,9 +129,13 @@ class NameEditor: self.general_label = self.top.get_widget("general_tab") self.sources_label = self.top.get_widget("sources_tab") self.notes_label = self.top.get_widget("note_tab") + self.priv.set_sensitive(not self.db.readonly) self.flowed = self.top.get_widget("alt_flowed") + self.flowed.set_sensitive(not self.db.readonly) self.preform = self.top.get_widget("alt_preform") + self.preform.set_sensitive(not self.db.readonly) self.group_over = self.top.get_widget('group_over') + self.group_over.set_sensitive(not self.db.readonly) self.type_selector = AutoComp.StandardCustomSelector( Utils.name_types, self.type_combo, RelLib.Name.CUSTOM, @@ -126,7 +148,7 @@ class NameEditor: if full_name == "": tmsg = _("Name Editor") else: - tmsg = _("Name Editor for %s") % full_name + tmsg = _("Name Editor for %s") % escape(full_name) Utils.set_titles(self.window, alt_title, tmsg, _('Name Editor')) @@ -137,14 +159,14 @@ class NameEditor: self.note_buffer = self.note_field.get_buffer() - self.top.signal_autoconnect({ - "on_help_name_clicked" : self.on_help_clicked, - "on_name_edit_ok_clicked" : self.on_name_edit_ok_clicked, - "on_name_edit_cancel_clicked" : self.close, - "on_name_edit_delete_event" : self.on_delete_event, - "on_group_over_toggled" : self.on_group_over_toggled, - "on_switch_page" : self.on_switch_page - }) + self.gladeif.connect('name_edit','delete_event',self.on_delete_event) + self.gladeif.connect('button119','clicked',self.close) + self.gladeif.connect('button118','clicked',self.on_name_edit_ok_clicked) + okbtn = self.top.get_widget('button118') + okbtn.set_sensitive(not self.db.readonly) + self.gladeif.connect('button131','clicked',self.on_help_clicked) + self.gladeif.connect('notebook3','switch_page',self.on_switch_page) + self.gladeif.connect('group_over','toggled',self.on_group_over_toggled) if name != None: self.given_field.set_text(name.get_first_name()) @@ -206,13 +228,17 @@ class NameEditor: self.group_as.set_editable(False) def on_delete_event(self,*obj): + self.gladeif.close() self.close_child_windows() self.remove_itself_from_menu() + gc.collect() def close(self,*obj): + self.gladeif.close() self.close_child_windows() self.remove_itself_from_menu() self.window.destroy() + gc.collect() def close_child_windows(self): for child_window in self.child_windows.values(): @@ -249,7 +275,7 @@ class NameEditor: def on_help_clicked(self,*obj): """Display the relevant portion of GRAMPS manual""" - gnome.help_display('gramps-manual','adv-an') + GrampsDisplay.help('adv-an') def on_name_edit_ok_clicked(self,obj): first = unicode(self.given_field.get_text()) @@ -265,6 +291,12 @@ class NameEditor: the_type = self.type_selector.get_values() + # FIXME: this remained from gramps20 -- check + # if const.NameTypesMap.has_value(mtype): + # mtype = const.NameTypesMap.find_key(mtype) + # if not mtype: + # mtype = "Also Known As" + if self.name == None: self.name = RelLib.Name() self.parent.nlist.append(self.name) diff --git a/src/NoteEdit.py b/src/NoteEdit.py index 995d36877..b6885ea19 100644 --- a/src/NoteEdit.py +++ b/src/NoteEdit.py @@ -34,6 +34,8 @@ import gtk.glade # #------------------------------------------------------------------------- from gettext import gettext as _ +import gc + import const import Utils import Spell @@ -96,10 +98,12 @@ class NoteEditor: def on_delete_event(self,*obj): self.remove_itself_from_menu() + gc.collect() def close(self,*obj): self.remove_itself_from_menu() self.top.destroy() + gc.collect() def add_itself_to_menu(self): self.parent.child_windows[self.win_key] = self diff --git a/src/Options.py b/src/Options.py new file mode 100644 index 000000000..871f5a26a --- /dev/null +++ b/src/Options.py @@ -0,0 +1,513 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2004-2005 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$ + +# Written by Alex Roitman + +""" +General option handling, including saving and parsing. +""" + +#------------------------------------------------------------------------- +# +# Standard Python modules +# +#------------------------------------------------------------------------- +import os +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# SAX interface +# +#------------------------------------------------------------------------- +try: + from xml.sax import make_parser,handler,SAXParseException +except: + from _xmlplus.sax import make_parser,handler,SAXParseException + +#------------------------------------------------------------------------- +# +# gramps modules +# +#------------------------------------------------------------------------- +import Utils + +#------------------------------------------------------------------------- +# +# List of options for a single module +# +#------------------------------------------------------------------------- +class OptionList: + """ + Implements a set of options to parse and store for a given module. + """ + + def __init__(self): + self.options = {} + + def set_options(self,options): + """ + Sets the whole bunch of options for the OptionList. + @param options: list of options to set. + @type options: list + """ + self.options = options + + def get_options(self): + """ + Returns the whole bunch of options for the OptionList. + @returns: list of options + @rtype: list + """ + return self.options + + def set_option(self,name,value): + """ + Sets a particular option in the OptionList. + @param name: name of the option to set. + @type name: str + @param value: value of the option to set. + @type str + """ + self.options[name] = value + + def remove_option(self,name): + """ + Removes a particular option from the OptionList. + @param name: name of the option to remove. + @type name: str + """ + if self.options.has_key(name): + del self.options[name] + + def get_option(self,name): + """ + Returns the value of a particular option in the OptionList. + @param name: name of the option to retrieve + @type name: str + @returns: value associated with the passed option + @rtype: str + """ + return self.options.get(name,None) + +#------------------------------------------------------------------------- +# +# Collection of option lists +# +#------------------------------------------------------------------------- +class OptionListCollection: + """ + Implements a collection of option lists. + """ + + def __init__(self,filename): + """ + Creates an OptionListCollection instance from the list defined + in the specified file. + @param filename: XML file that contains option definitions + @type filename: str + """ + + self.filename = os.path.expanduser(filename) + self.option_list_map = {} + self.init_common() + self.parse() + + def init_common(self): + pass + + def get_option_list_map(self): + """ + Returns the map of module names to option lists. + @returns: Returns the map of module names to option lists. + @rtype: dictionary + """ + return self.option_list_map + + def get_option_list(self,name): + """ + Returns the option_list associated with the module name + @param name: name associated with the desired module. + @type name: str + @returns: returns the option list associated with the name, + or None of no such option exists + @rtype: str + """ + return self.option_list_map.get(name,None) + + def get_module_names(self): + """ + Returns a list of all the module names in the OptionListCollection + @returns: returns the list of module names + @rtype: list + """ + return self.option_list_map.keys() + + def set_option_list(self,name,option_list): + """ + Adds or replaces an option_list in the OptionListCollection. + @param name: name assocated with the module to add or replace. + @type name: str + @param option_list: list of options + @type option_list: str + """ + self.option_list_map[name] = option_list + + def write_common(self,f): + """ + Stub function for common options. Overridden by reports. + """ + pass + + def write_module_common(self,f,option_list): + """ + Stub function for common options. Overridden by reports. + """ + pass + + def save(self): + """ + Saves the current OptionListCollection to the associated file. + """ + f = open(self.filename,"w") + f.write("\n") + f.write('\n') + + self.write_common(f) + + for module_name in self.get_module_names(): + option_list = self.get_option_list(module_name) + f.write('\n' % module_name) + options = option_list.get_options() + for option_name in options.keys(): + if type(options[option_name]) in (type(list()),type(tuple())): + f.write(' \n') + else: + f.write(' \n') + + f.write('\n') + f.close() + + def parse(self): + """ + Loads the OptionList from the associated file, if it exists. + """ + try: + p = make_parser() + p.setContentHandler(OptionParser(self)) + p.parse('file://' + self.filename) + except (IOError,OSError,SAXParseException): + pass + +#------------------------------------------------------------------------- +# +# OptionParser +# +#------------------------------------------------------------------------- +class OptionParser(handler.ContentHandler): + """ + SAX parsing class for the OptionListCollection XML file. + """ + + def __init__(self,collection): + """ + Creates a OptionParser class that populates the passed collection. + + collection: OptionListCollection to be loaded from the file. + """ + handler.ContentHandler.__init__(self) + self.collection = collection + + self.mname = None + self.option_list = None + self.oname = None + self.o = None + self.an_o = None + self.list_class = OptionList + + def startElement(self,tag,attrs): + """ + Overridden class that handles the start of a XML element + """ + if tag in ("report","module"): + self.mname = attrs['name'] + self.option_list = self.list_class() + self.o = {} + elif tag == "option": + self.oname = attrs['name'] + if attrs.has_key('length'): + self.an_o = [] + else: + self.an_o = attrs['value'] + elif tag == "listitem": + self.an_o.append(attrs['value']) + + def endElement(self,tag): + "Overridden class that handles the end of a XML element" + if tag == "option": + self.o[self.oname] = self.an_o + elif tag in ("report","module"): + self.option_list.set_options(self.o) + self.collection.set_option_list(self.mname,self.option_list) + +#------------------------------------------------------------------------- +# +# Class handling options for plugins +# +#------------------------------------------------------------------------- +class OptionHandler: + """ + Implements handling of the options for the plugins. + """ + + def __init__(self,module_name,options_dict,person_id=None): + self.module_name = module_name + self.default_options_dict = options_dict.copy() + self.options_dict = options_dict + + # Retrieve our options from whole collection + self.init_subclass() + self.option_list_collection = self.collection_class(self.filename) + self.init_common() + self.saved_option_list = self.option_list_collection.get_option_list(module_name) + self.person_id = person_id + + # Whatever was found should override the defaults + if self.saved_option_list: + self.set_options() + else: + # If nothing was found, set up the option list + self.saved_option_list = self.list_class() + self.option_list_collection.set_option_list(module_name, + self.saved_option_list) + + def init_subclass(self): + self.collection_class = OptionListCollection + self.list_class = OptionList + self.filename = None + + def init_common(self): + pass + + def set_options(self): + """ + Sets options to be used in this plugin according to the passed + options dictionary. + + Dictionary values are all strings, since they were read from XML. + Here we need to convert them to the needed types. We use default + values to determine the type. + """ + # First we set options_dict values based on the saved options + options = self.saved_option_list.get_options() + bad_opts = [] + for option_name in options.keys(): + if not self.options_dict.has_key(option_name): + print "Option %s is present in the %s but is not known "\ + "to the module." % (option_name, + self.option_list_collection.filename) + print "Ignoring..." + bad_opts.append(option_name) + continue + try: + converter = Utils.get_type_converter(self.options_dict[option_name]) + self.options_dict[option_name] = converter(options[option_name]) + except ValueError: + pass + + for option_name in bad_opts: + options.pop(option_name) + + # Then we set common options from whatever was found + self.set_common_options() + + def set_common_options(self): + pass + + def save_options(self): + """ + Saves options to file. + + We need to only store non-default options. Therefore, we remove all + options whose values are the defaults prior to saving. + """ + + # First we save options from options_dict + for option_name in self.options_dict.keys(): + if self.options_dict[option_name] == self.default_options_dict[option_name]: + self.saved_option_list.remove_option(option_name) + else: + self.saved_option_list.set_option(option_name,self.options_dict[option_name]) + + # Handle common options + self.save_common_options() + + # Finally, save the whole collection into file + self.option_list_collection.save() + + def save_common_options(self): + pass + + def get_filter_number(self): + if self.default_options_dict.has_key('filter'): + return self.options_dict.get('filter', + self.default_options_dict['filter']) + else: + return None + + def set_filter_number(self,val): + self.options_dict['filter'] = val + + def get_person_id(self): + return self.person_id + + def set_person_id(self,val): + self.person_id = val + +#------------------------------------------------------------------------ +# +# Base Options class +# +#------------------------------------------------------------------------ +class Options: + + """ + Defines options and provides handling interface. + + This is a base Options class for the modules. All modules' options + classes should derive from it. + """ + + def __init__(self,name,person_id=None): + """ + Initializes the class, performing usual house-keeping tasks. + Subclasses MUST call this in their __init__() method. + """ + self.set_new_options() + self.enable_options() + + if self.enable_dict: + self.options_dict.update(self.enable_dict) + self.handler = OptionHandler(name,self.options_dict,person_id) + + def set_new_options(self): + """ + Sets options specific for this module. + + Modules that need custom options need to override this method. + Two dictionaries MUST be defined here: + + self.options_dict + This is a dictionary whose keys are option names + and values are the default option values. + + self.options_help + This is a dictionary whose keys are option names + and values are 3- or 4- lists or tuples: + ('=example','Short description',VALUES,DO_PREPEND) + The VALUES is either a single string (in that case + the DO_PREPEND does not matter) or a list/tuple of + strings to list. In that case, if DO_PREPEND evaluates + as True then each string will be preneded with the ordinal + number when help is printed on the command line. + + NOTE: Both dictionaries must have identical keys. + + NOTE: If a particular module does not use custom options, + then it should not override this method. + """ + self.options_dict = {} + self.options_help = {} + + def enable_options(self): + """ + Enables semi-common options for this module. + + The semi-common option is the option which GRAMPS is aware of, + but not common enough to be present in all modules. Here's the list + of possible keys for semi-commons: + + 'filter' - Filter number, selected among filters + available for this module. If defined, + get_module_filters() method must be defined + which returns the list of available filters. + + A self.enable_dict dictionary MUST be defined here, whose keys + are the valid semi-common keys above, and whose values are the + desired default values for semi-commons. + + NOTE: If a particular module does not use semi-common options, + then it should not override this method. + """ + self.enable_dict = {} + + def add_user_options(self,dialog): + """ + Sets up UI controls (widgets) for the options specific for this modul. + + This method MUST be overridden by modules that define new options. + The single argument 'dialog' is the Report.BareReportDialog instance. + Any attribute of the dialog is available. + + After the widgets are defined, they MUST be added to the dialog + using the following call: + dialog.add_options(LABEL,widget) + + NOTE: To really have any effect besides looking pretty, each widget + set up here must be also parsed in the parse_user_options() + method below. + """ + pass + + def parse_user_options(self,dialog): + """ + Parses UI controls (widgets) for the options specific for this module. + + This method MUST be overridden by modules that define new options. + The single argument 'dialog' is the Report.BareReportDialog instance. + Any attribute of the dialog is available. + + After obtaining values from the widgets, they MUST be used to set the + appropriate options_dict values. Otherwise the values will not have + any user-visible effect. + + NOTE: Any widget parsed here MUST be defined and added to the dialog + in the add_user_options() method above. + """ + pass + + def get_filter_number(self): + """ + Return number of a filter to use. + + This method MUST NOT be overridden by subclasses. + """ + return self.handler.get_filter_number() diff --git a/src/PeopleView.py b/src/PeopleView.py index 6c68993d8..391df02e4 100644 --- a/src/PeopleView.py +++ b/src/PeopleView.py @@ -65,7 +65,7 @@ column_names = [ _('Death Place'), _('Spouse'), _('Last Change'), - _('Cause of Death'), + _('Cause of death'), ] #------------------------------------------------------------------------- @@ -145,8 +145,6 @@ class PeopleView: column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0) column.set_resizable(True) - #column.set_clickable(True) - #column.connect('clicked',self.sort_clicked) column.set_min_width(225) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) self.person_tree.append_column(column) diff --git a/src/PluginMgr.py b/src/PluginMgr.py index 4f5540d4c..30710db15 100644 --- a/src/PluginMgr.py +++ b/src/PluginMgr.py @@ -43,7 +43,6 @@ from gettext import gettext as _ # GRAMPS modules # #------------------------------------------------------------------------- -import const import Errors #------------------------------------------------------------------------- @@ -64,6 +63,7 @@ drawdoc_list = [] failmsg_list = [] bkitems_list = [] cl_list = [] +cli_tool_list = [] _success_list = [] @@ -77,6 +77,7 @@ _relcalc_class = Relationship.RelationshipCalculator #------------------------------------------------------------------------- # +# Constants # #------------------------------------------------------------------------- _unavailable = _("No description was provided"), @@ -146,33 +147,95 @@ def register_export(exportData,title,description='',config=None,filename=''): and the list of patterns for the filename matching. """ if description and filename: + del_index = -1 + for i in range(0,len(export_list)): + if export_list[i][1] == title: + del_index = i + if del_index != -1: + del export_list[del_index] + export_list.append((exportData,title,description,config,filename)) def register_import(task, ffilter, mime=None, native_format=0, format_name=""): """Register an import filter, taking the task and file filter""" if mime: + del_index = -1 + for i in range(0,len(import_list)): + if import_list[i][2] == mime: + del_index = i + if del_index != -1: + del import_list[del_index] + import_list.append((task, ffilter, mime, native_format, format_name)) - +#------------------------------------------------------------------------- +# +# Tool registration +# +#------------------------------------------------------------------------- def register_tool( - task, name, - category=_("Uncategorized"), - description=_unavailable, + category, + tool_class, + options_class, + modes, + translated_name, status=_("Unknown"), + description=_unavailable, author_name=_("Unknown"), - author_email=_("Unknown") + author_email=_("Unknown"), + unsupported=False ): - """Register a tool with the plugin system""" + """ + Register a tool with the plugin system. + + This function should be used to register tool in GUI and/or + command-line mode. The low-level functions (starting with '_') + should not be used on their own. Instead, this functino will call + them as needed. + """ + + import Tool + (junk,gui_task) = divmod(modes,2**Tool.MODE_GUI) + if gui_task: + _register_gui_tool(tool_class,options_class,translated_name, + name,category,description, + status,author_name,author_email,unsupported) + + (junk,cli_task) = divmod(modes-gui_task,2**Tool.MODE_CLI) + if cli_task: + _register_cli_tool(name,category,tool_class,options_class, + translated_name,unsupported) + +def _register_gui_tool(tool_class,options_class,translated_name, + name,category, + description=_unavailable, + status=_("Unknown"), + author_name=_("Unknown"), + author_email=_("Unknown"), + unsupported=False): del_index = -1 for i in range(0,len(tool_list)): val = tool_list[i] - if val[2] == name: + if val[4] == name: del_index = i if del_index != -1: del tool_list[del_index] - tool_list.append((task, category, name, description, - status, author_name, author_name)) + tool_list.append((tool_class,options_class,translated_name, + category,name,description,status, + author_name,author_email,unsupported)) + +def _register_cli_tool(name,category,tool_class,options_class, + translated_name,unsupported=False): + del_index = -1 + for i in range(0,len(cli_tool_list)): + val = cli_tool_list[i] + if val[0] == name: + del_index = i + if del_index != -1: + del cli_tool_list[del_index] + cli_tool_list.append((name,category,tool_class,options_class, + translated_name,unsupported)) #------------------------------------------------------------------------- # @@ -189,12 +252,14 @@ def register_report( status=_("Unknown"), description=_unavailable, author_name=_("Unknown"), - author_email=_("Unknown") + author_email=_("Unknown"), + unsupported=False ): """ Registers report for all possible flavors. - This function should be used to register report as a stand-alone, book item, or command-line flavor in any combination of those. + This function should be used to register report as a stand-alone, + book item, or command-line flavor in any combination of those. The low-level functions (starting with '_') should not be used on their own. Instead, this function will call them as needed. """ @@ -204,26 +269,28 @@ def register_report( if standalone_task: _register_standalone(report_class,options_class,translated_name, name,category,description, - status,author_name,author_email) + status,author_name,author_email,unsupported) (junk,book_item_task) = divmod(modes-standalone_task,2**Report.MODE_BKI) if book_item_task: - book_item_category = const.book_categories[category] + book_item_category = Report.book_categories[category] register_book_item(translated_name,book_item_category, - report_class,options_class,name) + report_class,options_class,name,unsupported) (junk,command_line_task) = divmod(modes-standalone_task-book_item_task, 2**Report.MODE_CLI) if command_line_task: - _register_cl_report(name,category,report_class,options_class) + _register_cl_report(name,category,report_class,options_class, + translated_name,unsupported) def _register_standalone(report_class, options_class, translated_name, - name, category, - description=_unavailable, - status=_("Unknown"), - author_name=_("Unknown"), - author_email=_("Unknown") - ): + name, category, + description=_unavailable, + status=_("Unknown"), + author_name=_("Unknown"), + author_email=_("Unknown"), + unsupported=False + ): """Register a report with the plugin system""" import Report @@ -231,28 +298,40 @@ def _register_standalone(report_class, options_class, translated_name, del_index = -1 for i in range(0,len(report_list)): val = report_list[i] - if val[2] == name: + if val[4] == name: del_index = i if del_index != -1: del report_list[del_index] report_list.append((report_class, options_class, translated_name, - category, name, description, status, author_name, author_email)) + category, name, description, status, + author_name, author_email, unsupported)) def register_book_item(translated_name, category, report_class, - option_class, name): + option_class, name, unsupported): """Register a book item""" - for n in bkitems_list: - if n[0] == name: - return - bkitems_list.append((translated_name, category, report_class, - option_class, name)) + del_index = -1 + for i in range(0,len(bkitems_list)): + val = bkitems_list[i] + if val[4] == name: + del_index = i + if del_index != -1: + del bkitems_list[del_index] -def _register_cl_report(name,category,report_class,options_class): - for n in cl_list: - if n[0] == name: - return - cl_list.append((name,category,report_class,options_class)) + bkitems_list.append((translated_name, category, report_class, + option_class, name, unsupported)) + +def _register_cl_report(name,category,report_class,options_class, + translated_name,unsupported): + del_index = -1 + for i in range(0,len(cl_list)): + val = cl_list[i] + if val[0] == name: + del_index = i + if del_index != -1: + del cl_list[del_index] + cl_list.append((name,category,report_class,options_class, + translated_name,unsupported)) #------------------------------------------------------------------------- # @@ -262,11 +341,17 @@ def _register_cl_report(name,category,report_class,options_class): def register_text_doc(name,classref, table, paper, style, ext, print_report_label=None,clname=''): """Register a text document generator""" - for n in textdoc_list: - if n[0] == name: - return + del_index = -1 + for i in range(0,len(textdoc_list)): + val = textdoc_list[i] + if val[0] == name: + del_index = i + if del_index != -1: + del textdoc_list[del_index] + if not clname: clname = ext[1:] + textdoc_list.append( (name, classref, table, paper, style, ext, print_report_label, clname)) @@ -278,9 +363,14 @@ def register_text_doc(name,classref, table, paper, style, ext, #------------------------------------------------------------------------- def register_book_doc(name,classref, table, paper, style, ext, clname=''): """Register a text document generator""" - for n in bookdoc_list: - if n[0] == name: - return + del_index = -1 + for i in range(0,len(bookdoc_list)): + val = bookdoc_list[i] + if val[0] == name: + del_index = i + if del_index != -1: + del bookdoc_list[del_index] + if not clname: clname = ext[1:] bookdoc_list.append((name,classref,table,paper,style,ext,None,clname)) @@ -293,14 +383,60 @@ def register_book_doc(name,classref, table, paper, style, ext, clname=''): def register_draw_doc(name,classref,paper,style, ext, print_report_label=None,clname=''): """Register a drawing document generator""" - for n in drawdoc_list: - if n[0] == name: - return + del_index = -1 + for i in range(0,len(drawdoc_list)): + val = drawdoc_list[i] + if val[0] == name: + del_index = i + if del_index != -1: + del drawdoc_list[del_index] if not clname: clname = ext[1:] drawdoc_list.append((name, classref, paper,style, ext, print_report_label, clname)) +#------------------------------------------------------------------------- +# +# Remove plugins whose reloading failed from the already-registered lists +# +#------------------------------------------------------------------------- +def purge_failed(failed_list,export_list,import_list,tool_list,cli_tool_list, + report_list,bkitems_list,cl_list,textdoc_list,bookdoc_list, + drawdoc_list): + failed_module_names = [ + os.path.splitext(os.path.basename(filename))[0] + for filename,junk in failed_list + ] + + export_list = [ item for item in export_list + if item[0].__module__ not in failed_module_names ] + import_list = [ item for item in import_list + if item[0].__module__ not in failed_module_names ] + tool_list = [ item for item in tool_list + if item[0].__module__ not in failed_module_names ] + cli_tool_list = [ item for item in cli_tool_list + if item[2].__module__ not in failed_module_names ] + report_list = [ item for item in report_list + if item[0].__module__ not in failed_module_names ] + bkitems_list = [ item for item in bkitems_list + if item[2].__module__ not in failed_module_names ] + cl_list = [ item for item in cl_list + if item[2].__module__ not in failed_module_names ] + textdoc_list = [ item for item in textdoc_list + if item[1].__module__ not in failed_module_names ] + bookdoc_list = [ item for item in bookdoc_list + if item[1].__module__ not in failed_module_names ] + drawdoc_list = [ item for item in drawdoc_list + if item[1].__module__ not in failed_module_names ] + + # For some funky reason this module's global variables + # are not seen inside this function. But they are seen + # from other modules, so we pass them back and forth. + # Sucks, but I don't know why this happens :-( + return (export_list,import_list,tool_list,cli_tool_list, + report_list,bkitems_list,cl_list,textdoc_list,bookdoc_list, + drawdoc_list) + #------------------------------------------------------------------------- # # Relationship calculator registration diff --git a/src/Plugins.py b/src/Plugins.py index 9225cf88c..f179a2743 100644 --- a/src/Plugins.py +++ b/src/Plugins.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000-2004 Donald N. Allingham +# Copyright (C) 2000-2005 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 @@ -36,7 +36,6 @@ importers, exporters, and document generators. import gobject import gtk import gtk.glade -import gnome #------------------------------------------------------------------------- # @@ -59,7 +58,18 @@ import Utils import GrampsKeys import Errors import Report +import Tool import PluginMgr +import GrampsDisplay + +#------------------------------------------------------------------------- +# +# Constants +# +#------------------------------------------------------------------------- +REPORTS = 0 +TOOLS = 1 +UNSUPPORTED = _("Unsupported") #------------------------------------------------------------------------- # @@ -71,8 +81,8 @@ class PluginDialog: """Displays the dialog box that allows the user to select the report that is desired.""" - def __init__(self,parent,db,active,item_list,msg,label=None, - button_label=None,tool_tip=None): + def __init__(self,parent,db,active,item_list,categories,msg,label=None, + button_label=None,tool_tip=None,content=REPORTS): """Display the dialog box, and build up the list of available reports. This is used to build the selection tree on the left hand side of the dailog box.""" @@ -86,6 +96,7 @@ class PluginDialog: self.update = None self.imap = {} self.msg = msg + self.content = content self.dialog = gtk.glade.XML(const.pluginsFile,"report","gramps") self.dialog.signal_autoconnect({ @@ -116,6 +127,7 @@ class PluginDialog: self.author_name = self.dialog.get_widget("author_name") self.author_email = self.dialog.get_widget("author_email") + self.statbox = self.dialog.get_widget("statbox") self.apply_button = self.dialog.get_widget("apply") @@ -132,12 +144,8 @@ class PluginDialog: except AttributeError: pass - self.run_tool = None - self.report_vs_tool = len(item_list[0]) == 9 - if self.report_vs_tool: - self.build_report_tree(item_list) - else: - self.build_tool_tree(item_list) + self.item = None + self.build_plugin_tree(item_list,categories) self.add_itself_to_menu() self.top.show() @@ -165,15 +173,14 @@ class PluginDialog: def on_apply_clicked(self,obj): """Execute the selected report""" - if self.report_vs_tool: - (report_class,options_class,title,category,name) = self.run_tool + (item_class,options_class,title,category,name) = self.item + if self.content == REPORTS: Report.report(self.db,self.active, - report_class,options_class,title,name,category) - elif self.run_tool: - if self.update: - self.run_tool(self.db,self.active,self.update,self.parent) - else: - self.run_tool(self.db,self.active) + item_class,options_class,title,name,category) + else: + Tool.gui_tool(self.db,self.active, + item_class,options_class,title,name,category, + self.update,self.parent) def on_node_selected(self,obj): """Updates the informational display on the right hand side of @@ -188,98 +195,62 @@ class PluginDialog: self.statbox.show() data = self.imap[path] - if self.report_vs_tool: - (report_class,options_class,title, - category,name,doc,status,author,email) = data - else: - title = data[0] - task = data[1] - doc = data[2] - status = data[3] - author = data[4] - email = data[5] - + (report_class,options_class,title,category,name, + doc,status,author,email,unsupported) = data self.description.set_text(doc) + if unsupported: + status = UNSUPPORTED self.status.set_text(status) self.title.set_text('%s' % title) self.title.set_use_markup(1) self.author_name.set_text(author) self.author_email.set_text(email) - if self.report_vs_tool: - self.run_tool = (report_class,options_class,title,category,name) - else: - self.run_tool = task + self.item = (report_class,options_class,title,category,name) - def build_tool_tree(self,item_list): + def build_plugin_tree(self,item_list,categories): """Populates a GtkTree with each menu item assocated with a entry in the lists. The list must consist of a tuples with the following format: - (task_to_call, category, report name, description, image, status, author_name, author_email) - - Items in the same category are grouped under the same submen. The - task_to_call is bound to the 'select' callback of the menu entry.""" + (item_class,options_class,title,category,name, + doc,status,author,email) + + Items in the same category are grouped under the same submenu. + The categories must be dicts from integer to string. + """ ilist = [] # build the tree items and group together based on the category name item_hash = {} - for report in item_list: - t = (report[2],report[0],report[3],report[4],report[5],report[6]) - if item_hash.has_key(report[1]): - item_hash[report[1]].append(t) + for plugin in item_list: + if plugin[9]: + category = UNSUPPORTED else: - item_hash[report[1]] = [t] + category = categories[plugin[3]] + if item_hash.has_key(category): + item_hash[category].append(plugin) + else: + item_hash[category] = [plugin] # add a submenu for each category, and populate it with the # GtkTreeItems that are associated with it. - key_list = item_hash.keys() + key_list = [ item for item in item_hash.keys() if item != UNSUPPORTED] key_list.sort() key_list.reverse() prev = None - for key in key_list: + if item_hash.has_key(UNSUPPORTED): + key = UNSUPPORTED data = item_hash[key] node = self.store.insert_after(None,prev) self.store.set(node,0,key) next = None - data.sort() + data.sort(lambda x,y: cmp(x[2],y[2])) for item in data: next = self.store.insert_after(node,next) ilist.append((next,item)) - self.store.set(next,0,item[0]) - for next,tab in ilist: - path = self.store.get_path(next) - self.imap[path] = tab - - def build_report_tree(self,item_list): - """Populates a GtkTree with each menu item assocated with a entry - in the lists. The list must consist of a tuples with the following - format: - - (task_to_call, category, report name, description, image, status, author_name, author_email) - - Items in the same category are grouped under the same submen. The - task_to_call is bound to the 'select' callback of the menu entry.""" - - ilist = [] - - # build the tree items and group together based on the category name - item_hash = {} - for report in item_list: - category = const.standalone_categories[report[3]] - if item_hash.has_key(category): - item_hash[category].append(report) - else: - item_hash[category] = [report] - - # add a submenu for each category, and populate it with the - # GtkTreeItems that are associated with it. - key_list = item_hash.keys() - key_list.sort() - key_list.reverse() - - prev = None + self.store.set(next,0,item[2]) for key in key_list: data = item_hash[key] node = self.store.insert_after(None,prev) @@ -311,9 +282,12 @@ class ReportPlugins(PluginDialog): self,parent, db, active, - PluginMgr.report_list,_("Report Selection"), + PluginMgr.report_list, + Report.standalone_categories, + _("Report Selection"), _("Select a report from those available on the left."), - _("_Generate"), _("Generate selected report")) + _("_Generate"), _("Generate selected report"), + REPORTS) #------------------------------------------------------------------------- # @@ -335,10 +309,12 @@ class ToolPlugins(PluginDialog): db, active, PluginMgr.tool_list, + Tool.tool_categories, _("Tool Selection"), _("Select a tool from those available on the left."), _("_Run"), - _("Run selected tool")) + _("Run selected tool"), + TOOLS) self.update = update #------------------------------------------------------------------------- @@ -411,7 +387,7 @@ class PluginStatus: def help(self,obj): """Display the GRAMPS manual""" - gnome.help_display('gramps-manual','gramps-getting-started') + GrampsDisplay.help('gramps-getting-started') def pop_button_update(self, client,cnxn_id,entry,data): self.pop_button.set_active(GrampsKeys.get_pop_plugin_status()) @@ -421,85 +397,80 @@ class PluginStatus: # Building pulldown menus # #------------------------------------------------------------------------- -def build_menu(top_menu,list,callback): - report_menu = gtk.Menu() - report_menu.show() +def build_tools_menu(top_menu,callback): + build_plugin_menu(PluginMgr.tool_list, + Tool.tool_categories, + Tool.gui_tool, + top_menu,callback) - hash_data = {} - for report in list: - if hash_data.has_key(report[1]): - hash_data[report[1]].append((report[2],report[0])) - else: - hash_data[report[1]] = [(report[2],report[0])] - - catlist = hash_data.keys() - catlist.sort() - for key in catlist: - entry = gtk.MenuItem(key) - entry.show() - report_menu.append(entry) - submenu = gtk.Menu() - submenu.show() - entry.set_submenu(submenu) - lst = hash_data[key] - lst.sort() - for name in lst: - subentry = gtk.MenuItem("%s..." % name[0]) - subentry.show() - subentry.connect("activate",callback,name[1]) - submenu.append(subentry) - top_menu.set_submenu(report_menu) - -#------------------------------------------------------------------------- -# -# build_report_menu -# -#------------------------------------------------------------------------- def build_report_menu(top_menu,callback): -# build_menu(top_menu,_reports,callback) -#def build_menu(top_menu,list,callback): - report_menu = gtk.Menu() - report_menu.show() + build_plugin_menu(PluginMgr.report_list, + Report.standalone_categories, + Report.report, + top_menu,callback) + +def build_plugin_menu(item_list,categories,func,top_menu,callback): + menu = gtk.Menu() + menu.show() hash_data = {} - for report in PluginMgr.report_list: - standalone_category = const.standalone_categories[report[3]] - if hash_data.has_key(standalone_category): - hash_data[standalone_category].append( - (report[0],report[1],report[2],report[4],report[3])) + for item in item_list: + if item[9]: + category = UNSUPPORTED else: - hash_data[standalone_category] = [ - (report[0],report[1],report[2],report[4],report[3])] + category = categories[item[3]] + if hash_data.has_key(category): + hash_data[category].append( + (item[0],item[1],item[2],item[4],item[3])) + else: + hash_data[category] = [ + (item[0],item[1],item[2],item[4],item[3])] -# 0 1 2 3 4 -#report_class, options_class, translated_name, name, category, - - catlist = hash_data.keys() + # Sort categories, skipping the unsupported + catlist = [item for item in hash_data.keys() if item != UNSUPPORTED] catlist.sort() for key in catlist: entry = gtk.MenuItem(key) entry.show() - report_menu.append(entry) + menu.append(entry) submenu = gtk.Menu() submenu.show() entry.set_submenu(submenu) lst = hash_data[key] - lst.sort() + lst.sort(by_menu_name) for name in lst: subentry = gtk.MenuItem("%s..." % name[2]) subentry.show() - subentry.connect("activate",callback,Report.report,name[0],name[1],name[2],name[3],name[4]) + subentry.connect("activate",callback,func, + name[0],name[1],name[2],name[3],name[4]) submenu.append(subentry) - top_menu.set_submenu(report_menu) + # If there are any unsupported items we add separator + # and the unsupported category at the end of the menu + if hash_data.has_key(UNSUPPORTED): + entry = gtk.MenuItem(None) + entry.show() + menu.append(entry) + key = UNSUPPORTED + entry = gtk.MenuItem(key) + entry.show() + menu.append(entry) + submenu = gtk.Menu() + submenu.show() + entry.set_submenu(submenu) + lst = hash_data[key] + lst.sort(by_menu_name) + for name in lst: + subentry = gtk.MenuItem("%s..." % name[2]) + subentry.show() + subentry.connect("activate",callback,func, + name[0],name[1],name[2],name[3],name[4]) + submenu.append(subentry) -#------------------------------------------------------------------------- -# -# build_tools_menu -# -#------------------------------------------------------------------------- -def build_tools_menu(top_menu,callback): - build_menu(top_menu,PluginMgr.tool_list,callback) + top_menu.set_submenu(menu) + +def by_menu_name(a,b): + return cmp(a[2],b[2]) #------------------------------------------------------------------------- # @@ -649,81 +620,126 @@ class GrampsBookFormatComboBox(gtk.ComboBox): #------------------------------------------------------------------------- # -# reload_plugins +# Reload plugins # #------------------------------------------------------------------------- -def reload_plugins(obj=None,junk1=None,junk2=None,junk3=None): - """Treated as a callback, causes all plugins to get reloaded. This is - useful when writing and debugging a plugin""" +class Reload(Tool.Tool): + def __init__(self,db,person,options_class,name,callback=None,parent=None): + Tool.Tool.__init__(self,db,person,options_class,name) + + """ + Treated as a callback, causes all plugins to get reloaded. + This is useful when writing and debugging a plugin. + """ - pymod = re.compile(r"^(.*)\.py$") + pymod = re.compile(r"^(.*)\.py$") - oldfailmsg = PluginMgr.failmsg_list[:] - PluginMgr.failmsg_list = [] + oldfailmsg = PluginMgr.failmsg_list[:] + PluginMgr.failmsg_list = [] - # attempt to reload all plugins that have succeeded in the past - for plugin in PluginMgr._success_list: - filename = os.path.basename(plugin.__file__) - filename = filename.replace('pyc','py') - filename = filename.replace('pyo','py') - try: - reload(plugin) - except: - PluginMgr.failmsg_list.append((filename,sys.exc_info())) + # attempt to reload all plugins that have succeeded in the past + for plugin in PluginMgr._success_list: + filename = os.path.basename(plugin.__file__) + filename = filename.replace('pyc','py') + filename = filename.replace('pyo','py') + try: + reload(plugin) + except: + PluginMgr.failmsg_list.append((filename,sys.exc_info())) - # attempt to load the plugins that have failed in the past - - for (filename,message) in oldfailmsg: - name = os.path.split(filename) - match = pymod.match(name[1]) - if not match: - continue - PluginMgr.attempt_list.append(filename) - plugin = match.groups()[0] - try: - # For some strange reason second importing of a failed plugin - # results in success. Then reload reveals the actual error. - # Looks like a bug in Python. - a = __import__(plugin) - reload(a) - PluginMgr._success_list.append(a) - except: - PluginMgr.failmsg_list.append((filename,sys.exc_info())) + # Remove previously good plugins that are now bad + # from the registered lists + (PluginMgr.export_list, + PluginMgr.import_list, + PluginMgr.tool_list, + PluginMgr.cli_tool_list, + PluginMgr.report_list, + PluginMgr.bkitems_list, + PluginMgr.cl_list, + PluginMgr.textdoc_list, + PluginMgr.bookdoc_list, + PluginMgr.drawdoc_list) = PluginMgr.purge_failed( + PluginMgr.failmsg_list, + PluginMgr.export_list, + PluginMgr.import_list, + PluginMgr.tool_list, + PluginMgr.cli_tool_list, + PluginMgr.report_list, + PluginMgr.bkitems_list, + PluginMgr.cl_list, + PluginMgr.textdoc_list, + PluginMgr.bookdoc_list, + PluginMgr.drawdoc_list) - # attempt to load any new files found - for directory in PluginMgr.loaddir_list: - for filename in os.listdir(directory): + # attempt to load the plugins that have failed in the past + for (filename,message) in oldfailmsg: name = os.path.split(filename) match = pymod.match(name[1]) if not match: continue - if filename in PluginMgr.attempt_list: - continue PluginMgr.attempt_list.append(filename) plugin = match.groups()[0] try: + # For some strange reason second importing of a failed plugin + # results in success. Then reload reveals the actual error. + # Looks like a bug in Python. a = __import__(plugin) - if a not in PluginMgr._success_list: - PluginMgr._success_list.append(a) + reload(a) + PluginMgr._success_list.append(a) except: PluginMgr.failmsg_list.append((filename,sys.exc_info())) - if GrampsKeys.get_pop_plugin_status() and len(PluginMgr.failmsg_list): - PluginStatus() - else: - global status_up - if status_up: - status_up.close(None) - status_up = None + # attempt to load any new files found + for directory in PluginMgr.loaddir_list: + for filename in os.listdir(directory): + name = os.path.split(filename) + match = pymod.match(name[1]) + if not match: + continue + if filename in PluginMgr.attempt_list: + continue + PluginMgr.attempt_list.append(filename) + plugin = match.groups()[0] + try: + a = __import__(plugin) + if a not in PluginMgr._success_list: + PluginMgr._success_list.append(a) + except: + PluginMgr.failmsg_list.append((filename,sys.exc_info())) + + if GrampsKeys.get_pop_plugin_status() and len(PluginMgr.failmsg_list): + PluginStatus() + else: + global status_up + if status_up: + status_up.close(None) + status_up = None + + # Re-generate tool and report menus + parent.build_plugin_menus(rebuild=True) + +class ReloadOptions(Tool.ToolOptions): + """ + Defines options and provides handling interface. + """ + + def __init__(self,name,person_id=None): + Tool.ToolOptions.__init__(self,name,person_id) #------------------------------------------------------------------------- # # Register the plugin reloading tool # #------------------------------------------------------------------------- -PluginMgr.register_tool( - reload_plugins, - _("Reload plugins"), - category=_("Debug"), - description=_("Attempt to reload plugins. Note: This tool itself is not reloaded!"), - ) + +if __debug__: + PluginMgr.register_tool( + name = 'reload', + category = Tool.TOOL_DEBUG, + tool_class = Reload, + options_class = ReloadOptions, + modes = Tool.MODE_GUI, + translated_name = _("Reload plugins"), + description=_("Attempt to reload plugins. " + "Note: This tool itself is not reloaded!"), + ) diff --git a/src/QuestionDialog.py b/src/QuestionDialog.py index 82bf29d36..3092afbd1 100644 --- a/src/QuestionDialog.py +++ b/src/QuestionDialog.py @@ -44,7 +44,10 @@ from gtk.gdk import pixbuf_new_from_file import const import GrampsKeys -ICON = pixbuf_new_from_file(const.icon) +try: + ICON = pixbuf_new_from_file(const.icon) +except: + pass class SaveDialog: def __init__(self,msg1,msg2,task1,task2,parent=None): diff --git a/src/ReadGedcom.py b/src/ReadGedcom.py index 0683dcf8f..ff1d2381c 100644 --- a/src/ReadGedcom.py +++ b/src/ReadGedcom.py @@ -54,11 +54,26 @@ import Date import DateParser import DisplayTrace from ansel_utf8 import ansel_to_utf8 -import latin_utf8 import Utils import GrampsMime +from bsddb import db from GedcomInfo import * -from QuestionDialog import ErrorDialog +from QuestionDialog import ErrorDialog, WarningDialog + +#------------------------------------------------------------------------- +# +# latin/utf8 conversions +# +#------------------------------------------------------------------------- + +def utf8_to_latin(s): + return s.encode('iso-8859-1','replace') + +def latin_to_utf8(s): + if type(s) == type(u''): + return s + else: + return unicode(s,'iso-8859-1') #------------------------------------------------------------------------- # @@ -71,8 +86,6 @@ UPDATE = 25 callback = None -_title_string = _("GEDCOM") - def nocnv(s): return unicode(s) @@ -125,6 +138,7 @@ snameRegexp= re.compile(r"/([^/]*)/([^/]*)") calRegexp = re.compile(r"\s*(ABT|BEF|AFT)?\s*@#D([^@]+)@\s*(.*)$") rangeRegexp = re.compile(r"\s*BET\s+@#D([^@]+)@\s*(.*)\s+AND\s+@#D([^@]+)@\s*(.*)$") spanRegexp = re.compile(r"\s*FROM\s+@#D([^@]+)@\s*(.*)\s+TO\s+@#D([^@]+)@\s*(.*)$") +whitespaceRegexp = re.compile(r"\s+") #------------------------------------------------------------------------- # @@ -171,24 +185,25 @@ def import2(database, filename, cb, codeset, use_trans): glade_file = "plugins/gedcomimport.glade" statusTop = gtk.glade.XML(glade_file,"status","gramps") - statusWindow = statusTop.get_widget("status") + status_window = statusTop.get_widget("status") - Utils.set_titles(statusWindow,statusTop.get_widget('title'), + Utils.set_titles(status_window,statusTop.get_widget('title'), _('GEDCOM import status')) - - statusTop.get_widget("close").set_sensitive(0) - statusTop.signal_autoconnect({ - "destroy_passed_object" : Utils.destroy_passed_object - }) + closebtn = statusTop.get_widget("close") + closebtn.set_sensitive(0) + closebtn.connect('clicked',lambda x: Utils.destroy_passed_object(status_window)) + try: - g = GedcomParser(database,filename,statusTop, codeset) + np = NoteParser(filename, False) + g = GedcomParser(database,filename,statusTop, codeset, np.get_map(), + np.get_lines()) except IOError,msg: - Utils.destroy_passed_object(statusWindow) + status_window.destroy() ErrorDialog(_("%s could not be opened\n") % filename,str(msg)) return except: - Utils.destroy_passed_object(statusWindow) + status_window.destroy() DisplayTrace.DisplayTrace() return @@ -198,31 +213,39 @@ def import2(database, filename, cb, codeset, use_trans): try: close = g.parse_gedcom_file(use_trans) except IOError,msg: - Utils.destroy_passed_object(statusWindow) + status_window.destroy() errmsg = _("%s could not be opened\n") % filename ErrorDialog(errmsg,str(msg)) return except Errors.GedcomError, val: (m1,m2) = val.messages() - Utils.destroy_passed_object(statusWindow) + status_window.destroy() ErrorDialog(m1,m2) return + except db.DBSecondaryBadError, msg: + status_window.destroy() + WarningDialog(_('Database corruption detected'), + _('A problem was detected with the database. Please ' + 'run the Check and Repair Database tool to fix the ' + 'problem.')) + return except: - Utils.destroy_passed_object(statusWindow) + Utils.destroy_passed_object(status_window) DisplayTrace.DisplayTrace() return - - statusTop.get_widget("close").set_sensitive(True) - statusWindow.set_modal(False) - if close: - statusWindow.destroy() - if cb: - statusWindow.destroy() + statusTop.get_widget("close").set_sensitive(True) + status_window.set_modal(False) + if close: + status_window.destroy() + elif cb: + status_window.destroy() cb(1) elif callback: callback() + + #------------------------------------------------------------------------- # # @@ -241,6 +264,58 @@ class GedcomDateParser(DateParser.DateParser): 'sep' : 9, 'oct' : 10, 'nov' : 11, 'dec' : 12, } +#------------------------------------------------------------------------- +# +# +# +#------------------------------------------------------------------------- + +noteRE = re.compile(r"\s*\d+\s+\@(\S+)\@\s+NOTE(.*)$") +contRE = re.compile(r"\s*\d+\s+CONT\s(.*)$") +concRE = re.compile(r"\s*\d+\s+CONC\s(.*)$") + + +class NoteParser: + def __init__(self, filename,broken): + self.name_map = {} + + self.count = 0 + f = open(filename,"rU") + innote = False + + for line in f.xreadlines(): + + self.count += 1 + if innote: + match = contRE.match(line) + if match: + noteobj.append("\n" + match.groups()[0]) + continue + + match = concRE.match(line) + if match: + if broken: + noteobj.append(" " + match.groups()[0]) + else: + noteobj.append(match.groups()[0]) + continue + innote = False + else: + match = noteRE.match(line) + if match: + data = match.groups()[0] + noteobj = RelLib.Note() + self.name_map["@%s@" % data] = noteobj + noteobj.append(match.groups()[1]) + innote = True + f.close() + + def get_map(self): + return self.name_map + + def get_lines(self): + return self.count + #------------------------------------------------------------------------- # # @@ -251,7 +326,8 @@ class GedcomParser: SyntaxError = "Syntax Error" BadFile = "Not a GEDCOM file" - def __init__(self, dbase, filename, window, codeset): + def __init__(self, dbase, filename, window, codeset, note_map, lines): + self.maxlines = float(lines) self.dp = GedcomDateParser() self.db = dbase self.person = None @@ -259,8 +335,7 @@ class GedcomParser: self.media_map = {} self.fmap = {} self.smap = {} - self.nmap = {} - self.share_note = [] + self.note_map = note_map self.refn = {} self.added = {} self.gedmap = GedcomInfoDB() @@ -304,7 +379,7 @@ class GedcomParser: if self.override == 1: self.cnv = ansel_to_utf8 elif self.override == 2: - self.cnv = latin_utf8.latin_to_utf8 + self.cnv = latin_to_utf8 else: self.cnv = nocnv else: @@ -328,10 +403,13 @@ class GedcomParser: self.close_done = window.get_widget('close_done') self.error_text_obj = window.get_widget("error_text") self.info_text_obj = window.get_widget("info_text") + self.progressbar = window.get_widget('progressbar') self.error_count = 0 - amap = Utils.personalConstantAttributes + self.current = 0.0 + self.oldval = 0.0 + self.attrs = amap.values() self.gedattr = {} for val in amap.keys(): @@ -421,6 +499,15 @@ class GedcomParser: def get_next(self): if self.backoff == 0: next_line = self.f.readline() + self.current += 1.0 + + newval = self.current/self.maxlines + if newval != self.oldval: + self.progressbar.set_fraction(min(newval,1.0)) + self.progressbar.set_text("%d%%" % int(newval*100)) + self.oldval = newval + while gtk.events_pending(): + gtk.main_iteration() # EOF ? if next_line == "": @@ -444,7 +531,7 @@ class GedcomParser: self.text = string.translate(self.text,self.transtable2) self.index += 1 - l = self.text.split(' ', 2) + l = whitespaceRegexp.split(self.text, 2) ln = len(l) try: if ln == 2: @@ -512,10 +599,11 @@ class GedcomParser: src.set_note(note) self.db.add_source(src,self.trans) - self.break_note_links() t = time.time() - t msg = _('Import Complete: %d seconds') % t + self.progressbar.set_fraction(1.0) + self.progressbar.set_text(_("Complete")) if use_trans: self.db.transaction_commit(self.trans,_("GEDCOM import")) self.db.enable_signals() @@ -529,10 +617,6 @@ class GedcomParser: print "Individuals: %d" % self.indi_count return None - def break_note_links(self): - for o in self.share_note: - o.unique_note() - def parse_trailer(self): matches = self.get_next() if matches[0] >= 0 and matches[1] != "TRLR": @@ -564,13 +648,10 @@ class GedcomParser: def parse_source(self,name,level): self.source = self.find_or_create_source(name[1:-1]) - note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: - if note: - self.source.set_note(note) if not self.source.get_title(): self.source.set_title("No title - ID %s" % self.source.get_gramps_id()) self.db.commit_source(self.source, self.trans) @@ -589,25 +670,28 @@ class GedcomParser: self.source.set_author(matches[2] + self.parse_continue_data(level+1)) elif matches[1] == "PUBL": self.source.set_publication_info(matches[2] + self.parse_continue_data(level+1)) - elif matches[1] == "OBJE": - self.ignore_sub_junk(2) elif matches[1] == "NOTE": note = self.parse_note(matches,self.source,level+1,note) + self.source.set_note(note) elif matches[1] == "TEXT": note = self.source.get_note() d = self.parse_continue_data(level+1) if note: - note = "%s\n%s %s%s" % (note,matches[1],matches[2],d) + note = "%s\n%s %s" % (note,matches[2],d) else: - note = "%s %s%s" % (matches[1],matches[2],d) + note = "%s %s" % (matches[2],d) + self.source.set_note(note.strip()) elif matches[1] == "ABBR": self.source.set_abbreviation(matches[2] + self.parse_continue_data(level+1)) + elif matches[1] in ["OBJE","CHAN","_CAT"]: + self.ignore_sub_junk(2) else: note = self.source.get_note() if note: note = "%s\n%s %s" % (note,matches[1],matches[2]) else: note = "%s %s" % (matches[1],matches[2]) + self.source.set_note(note.strip()) def parse_record(self): while True: @@ -668,15 +752,7 @@ class GedcomParser: source.set_title( matches[2][5:]) self.db.commit_source(source, self.trans) elif matches[2][0:4] == "NOTE": - if self.nmap.has_key(matches[1]): - noteobj = self.nmap[matches[1]] - else: - noteobj = RelLib.Note() - self.nmap[matches[1]] = noteobj - text = matches[2][4:] -# noteobj.append(text + self.parse_continue_data(1)) - noteobj.append(text + self.parse_note_continue(1)) - self.parse_note_data(1) + self.ignore_sub_junk(1) elif matches[2] == "_LOC": # TODO: Add support for extended Locations. # See: http://en.wiki.genealogy.net/index.php/Gedcom_5.5EL @@ -919,15 +995,12 @@ class GedcomParser: def parse_note_base(self,matches,obj,level,old_note,task): note = old_note - if matches[2] and matches[2][0] == "@": - if self.nmap.has_key(matches[2]): - self.share_note.append(obj) - obj.set_note_object(self.nmap[matches[2]]) + if matches[2] and matches[2][0] == "@": # reference to a named note defined elsewhere + note_obj = self.note_map.get(matches[2]) + if note_obj: + return note_obj.get() else: - noteobj = RelLib.Note() - self.nmap[matches[2]] = noteobj - self.share_note.append(obj) - obj.set_note_object(noteobj) + return u"" else: if old_note: note = "%s\n%s%s" % (old_note,matches[2],self.parse_continue_data(level)) @@ -951,6 +1024,8 @@ class GedcomParser: if int(matches[0]) < 1: self.backup() + if note: + self.person.set_note(note) return elif matches[1] == "NAME": name = RelLib.Name() @@ -1121,7 +1196,7 @@ class GedcomParser: elif self.gedattr.has_key(n): attr = RelLib.Attribute() attr.set_type(self.gedattr[n]) - attr.set_value(event.get_description()) + attr.set_value(event.get_description() + matches[2]) self.person.add_attribute(attr) self.parse_person_attr(attr,2) continue @@ -1628,6 +1703,7 @@ class GedcomParser: matches = self.get_next() if int(matches[0]) < level: + source.set_note(note) self.backup() return elif matches[1] == "PAGE": @@ -1640,15 +1716,18 @@ class GedcomParser: d = self.dp.parse(date) source.set_date_object(d) source.set_text(text) - elif matches[1] in ["OBJE","REFN","TEXT"]: + elif matches[1] in ["OBJE","REFN"]: self.ignore_sub_junk(level+1) elif matches[1] == "QUAY": - val = int(matches[2]) + try: + val = int(matches[2]) + except ValueError: + return if val > 1: source.set_confidence_level(val+1) else: source.set_confidence_level(val) - elif matches[1] == "NOTE": + elif matches[1] in ["NOTE","TEXT"]: note = self.parse_comment(matches,source,level+1,note) else: self.barf(level+1) @@ -1781,12 +1860,12 @@ class GedcomParser: self.gedsource = self.gedmap.get_from_source_tag(matches[2]) self.broken_conc = self.gedsource.get_conc() elif matches[1] == "CHAR" and not self.override: - if matches[2] == "UNICODE" or matches[2] == "UTF-8" or matches[2] == "UTF8": + if matches[2] in ["UNICODE","UTF-8","UTF8"]: self.cnv = nocnv elif matches[2] == "ANSEL": self.cnv = ansel_to_utf8 else: - self.cnv = latin_utf8.latin_to_utf8 + self.cnv = latin_to_utf8 self.ignore_sub_junk(2) if self.window: self.update(self.encoding_obj,matches[2]) @@ -2071,3 +2150,9 @@ def extract_temple(matches): def create_id(): return Utils.create_id() + + +if __name__ == "__main__": + import sys + + a = NoteParser(sys.argv[1],False) diff --git a/src/ReadXML.py b/src/ReadXML.py index 2ff296e93..8ef3b7c28 100644 --- a/src/ReadXML.py +++ b/src/ReadXML.py @@ -91,6 +91,9 @@ def importData(database, filename, callback=None,cl=0,use_trans=True): change = os.path.getmtime(filename) parser = GrampsParser(database,callback,basefile,change,filename) + ro = database.readonly + database.readonly = False + if gzip_ok: use_gzip = 1 try: @@ -159,6 +162,8 @@ def importData(database, filename, callback=None,cl=0,use_trans=True): xml_file.close() + database.readonly = ro + # copy all local images into .images directory db_dir = os.path.abspath(os.path.dirname(database.get_save_path())) db_base = os.path.basename(database.get_save_path()) @@ -347,6 +352,7 @@ class GrampsParser: "status" : (self.start_status, None), "sealed_to" : (self.start_sealed_to, None), "coord" : (self.start_coord,None), + "patronymic" : (None, self.stop_patronymic), "pos" : (self.start_pos, None), "postal" : (None, self.stop_postal), "researcher" : (None, self.stop_research), @@ -588,7 +594,8 @@ class GrampsParser: def start_sealed_to(self,attrs): try: - family = self.db.find_family_from_handle(attrs['hlink'],self.trans) + family = self.db.find_family_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: handle = self.map_fid(attrs['ref']) family = self.find_family_by_gramps_id(handle) @@ -596,8 +603,8 @@ class GrampsParser: def start_place(self,attrs): try: - self.placeobj = self.db.find_place_from_handle(attrs['hlink'], - self.trans) + self.placeobj = self.db.find_place_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: handle = self.map_pid(attrs['ref']) self.placeobj = self.find_place_by_gramps_id(handle) @@ -605,8 +612,8 @@ class GrampsParser: def start_placeobj(self,attrs): handle = self.map_pid(attrs['id']) try: - self.placeobj = self.db.find_place_from_handle(attrs['handle'], - self.trans) + self.placeobj = self.db.find_place_from_handle( + attrs['handle'].replace('_',''),self.trans) self.placeobj.set_gramps_id(handle) except KeyError: self.placeobj = self.find_place_by_gramps_id(handle) @@ -650,7 +657,8 @@ class GrampsParser: self.in_witness = 1 self.witness_comment = "" if attrs.has_key('hlink'): - self.witness = RelLib.Witness(RelLib.Event.ID,attrs['hlink']) + self.witness = RelLib.Witness(RelLib.Event.ID, + attrs['hlink'].replace('_','')) elif attrs.has_key('ref'): person = self.find_person_by_gramps_id(self.map_gid(attrs["ref"])) self.witness = RelLib.Witness(RelLib.Event.ID,person.get_handle()) @@ -714,7 +722,8 @@ class GrampsParser: def start_bmark(self,attrs): try: - person = self.db.find_person_from_handle(attrs['hlink'],self.trans) + person = self.db.find_person_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: handle = self.map_gid(attrs["ref"]) person = self.find_person_by_gramps_id(handle) @@ -725,7 +734,8 @@ class GrampsParser: self.callback(True) new_id = self.map_gid(attrs['id']) try: - self.person = self.db.find_person_from_handle(attrs['handle'],self.trans) + self.person = self.db.find_person_from_handle( + attrs['handle'].replace('_',''),self.trans) self.person.set_gramps_id(new_id) except KeyError: self.person = self.find_person_by_gramps_id(new_id) @@ -737,27 +747,30 @@ class GrampsParser: def start_people(self,attrs): if attrs.has_key('home'): - self.home = attrs['home'] + self.home = attrs['home'].replace('_','') elif attrs.has_key("default"): self.tempDefault = attrs["default"] def start_father(self,attrs): try: - person = self.db.find_person_from_handle(attrs['hlink'],self.trans) + person = self.db.find_person_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: person = self.find_person_by_gramps_id(self.map_gid(attrs["ref"])) self.family.set_father_handle(person.get_handle()) def start_mother(self,attrs): try: - person = self.db.find_person_from_handle(attrs['hlink'],self.trans) + person = self.db.find_person_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: person = self.find_person_by_gramps_id(self.map_gid(attrs["ref"])) self.family.set_mother_handle(person.get_handle()) def start_child(self,attrs): try: - person = self.db.find_person_from_handle(attrs['hlink'],self.trans) + person = self.db.find_person_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: person = self.find_person_by_gramps_id(self.map_gid(attrs["ref"])) self.family.add_child_handle(person.get_handle()) @@ -790,7 +803,7 @@ class GrampsParser: handle = self.map_fid(attrs["id"]) try: self.family = self.db.find_family_from_handle( - attrs["handle"],self.trans) + attrs['handle'].replace('_',''),self.trans) self.family.set_gramps_id(handle) except KeyError: self.family = self.find_family_by_gramps_id(handle) @@ -809,7 +822,8 @@ class GrampsParser: def start_childof(self,attrs): try: - family = self.db.find_family_from_handle(attrs["hlink"],self.trans) + family = self.db.find_family_from_handle( + attrs["hlink"].replace('_',''),self.trans) except KeyError: family = self.find_family_by_gramps_id(self.map_fid(attrs["ref"])) @@ -829,7 +843,8 @@ class GrampsParser: def start_parentin(self,attrs): try: - family = self.db.find_family_from_handle(attrs['hlink'],self.trans) + family = self.db.find_family_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: family = self.find_family_by_gramps_id(self.map_fid(attrs["ref"])) self.person.add_family_handle(family.get_handle()) @@ -853,6 +868,10 @@ class GrampsParser: self.name.conf = 2 if attrs.has_key("priv"): self.name.set_privacy(int(attrs["priv"])) + if attrs.has_key("alt"): + self.alt_name = int(attrs["alt"]) + else: + self.alt_name = 0 def start_last(self,attrs): if attrs.has_key('prefix'): @@ -869,7 +888,8 @@ class GrampsParser: def start_sourceref(self,attrs): self.source_ref = RelLib.SourceRef() try: - source = self.db.find_source_from_handle(attrs["hlink"],self.trans) + source = self.db.find_source_from_handle( + attrs["hlink"].replace('_',''),self.trans) except KeyError: source = self.find_source_by_gramps_id(self.map_sid(attrs["ref"])) @@ -904,8 +924,8 @@ class GrampsParser: def start_source(self,attrs): handle = self.map_sid(attrs["id"]) try: - self.source = self.db.find_source_from_handle(attrs["handle"], - self.trans) + self.source = self.db.find_source_from_handle( + attrs['handle'].replace('_',''),self.trans) self.source.set_gramps_id(handle) except KeyError: self.source = self.find_source_by_gramps_id(handle) @@ -913,7 +933,8 @@ class GrampsParser: def start_objref(self,attrs): self.objref = RelLib.MediaRef() try: - obj = self.db.find_object_from_handle(attrs['hlink'],self.trans) + obj = self.db.find_object_from_handle( + attrs['hlink'].replace('_',''),self.trans) except KeyError: obj = self.find_object_by_gramps_id(self.map_oid(attrs['ref'])) @@ -936,8 +957,8 @@ class GrampsParser: def start_object(self,attrs): handle = self.map_oid(attrs['id']) try: - self.object = self.db.find_object_from_handle(attrs['handle'], - self.trans) + self.object = self.db.find_object_from_handle( + attrs['handle'].replace('_',''),self.trans) self.object.set_gramps_id(handle) except KeyError: self.object = self.find_object_by_gramps_id(handle) @@ -1048,7 +1069,18 @@ class GrampsParser: else: cal = Date.CAL_GREGORIAN - dv.set(Date.QUAL_NONE,Date.MOD_RANGE,cal,(d,m,y,False,rd,rm,ry,False)) + if attrs.has_key('quality'): + val = attrs['quality'] + if val == 'estimated': + qual = Date.QUAL_ESTIMATED + elif val == 'calculated': + qual = Date.QUAL_CALCULATED + else: + qual = Date.QUAL_NONE + else: + qual = Date.QUAL_NONE + + dv.set(qual,Date.MOD_RANGE,cal,(d,m,y,False,rd,rm,ry,False)) def start_dateval(self,attrs): if self.source_ref: @@ -1100,8 +1132,19 @@ class GrampsParser: mod = Date.MOD_BEFORE else: mod = Date.MOD_NONE + + if attrs.has_key('quality'): + val = attrs['quality'] + if val == 'estimated': + qual = Date.QUAL_ESTIMATED + elif val == 'calculated': + qual = Date.QUAL_CALCULATED + else: + qual = Date.QUAL_NONE + else: + qual = Date.QUAL_NONE - dv.set(Date.QUAL_NONE,mod,cal,(d,m,y,False)) + dv.set(qual,mod,cal,(d,m,y,False)) def start_datestr(self,attrs): if self.source_ref: @@ -1232,10 +1275,17 @@ class GrampsParser: #if self.in_witness: # self.witness = RelLib.Witness(RelLib.Event.NAME,tag) #else: - if self.name.get_type() == "": - self.name.set_type("Birth Name") - self.person.set_primary_name (self.name) - self.person.get_primary_name().build_sort_name() + if self.alt_name: + # former aka tag -- alternate name + if self.name.get_type() == "": + self.name.set_type("Also Known As") + self.person.add_alternate_name(self.name) + else: + if self.name.get_type() == "": + self.name.set_type("Birth Name") + self.person.set_primary_name (self.name) + self.person.get_primary_name().build_sort_name() + self.name = None def stop_ref(self,tag): @@ -1363,6 +1413,10 @@ class GrampsParser: if self.name: self.name.set_suffix(tag) + def stop_patronymic(self,tag): + if self.name: + self.name.set_patronymic(tag) + def stop_title(self,tag): if self.name: self.name.set_title(tag) diff --git a/src/RelLib.py b/src/RelLib.py index d16744c12..bf45ae9aa 100644 --- a/src/RelLib.py +++ b/src/RelLib.py @@ -449,7 +449,7 @@ class SourceNote(BaseObject,NoteBase): @param source: Object used to initialize the new object @type source: SourceNote """ - + BaseObject.__init__(self) NoteBase.__init__(self,source) if source: self.source_list = [SourceRef(sref) for sref in source.source_list] @@ -2368,8 +2368,9 @@ class Event(PrimaryObject,PrivateSourceNote,MediaBase,DateBase,PlaceBase): """ if other == None: other = Event (None) + if self.type[0] != other.type[0] or \ - (self.type[0] == Event.CUSTOM and self.type[1] != other.type[1]) or \ + (self.type[0] == Event.CUSTOM and self.type[1] != other.type[1]) or\ ((self.place or other.place) and (self.place != other.place)) or \ self.description != other.description or self.cause != other.cause \ or self.private != other.private or \ @@ -2926,7 +2927,9 @@ class Source(PrimaryObject,MediaBase,NoteBase): @return: Returns the list of all textual attributes of the object. @rtype: list """ - return [self.title,self.author,self.pubinfo,self.abbrev,self.gramps_id] + return [self.title,self.author,self.pubinfo,self.abbrev,self.gramps_id]\ + + self.datamap.keys() + self.datamap.values() + def get_text_data_child_list(self): """ @@ -3317,6 +3320,7 @@ class Location(BaseObject): def __init__(self,source=None): """creates a Location object, copying from the source object if it exists""" + BaseObject.__init__(self) if source: self.city = source.city self.parish = source.parish @@ -3417,6 +3421,7 @@ class Note(BaseObject): """ Creates a new Note object, initializing from the passed string. """ + BaseObject.__init__(self) self.text = text self.format = 0 @@ -4056,6 +4061,7 @@ class Url(BaseObject,PrivacyBase): def __init__(self,source=None): """creates a new URL instance, copying from the source if present""" + BaseObject.__init__(self) PrivacyBase.__init__(self,source) if source: self.path = source.path @@ -4111,6 +4117,7 @@ class SourceRef(BaseObject,DateBase,PrivacyBase,NoteBase): def __init__(self,source=None): """creates a new SourceRef, copying from the source if present""" + BaseObject.__init__(self) DateBase.__init__(self,source) PrivacyBase.__init__(self,source) NoteBase.__init__(self,source) @@ -4195,12 +4202,7 @@ class SourceRef(BaseObject,DateBase,PrivacyBase,NoteBase): if self.ref and other.ref: if self.page != other.page: return False - if (self.date and other.date and \ - not self.date.is_equal(other.date)) \ - or ((not self.date) and other.date and \ - not other.date.is_empty()) \ - or ((not other.date) and self.date and \ - not self.date.is_empty()): + if not self.get_date_object().is_equal(other.get_date_object()): return False if self.get_text() != other.get_text(): return False diff --git a/src/Relationship.py b/src/Relationship.py index 779568a35..cf9aa1379 100644 --- a/src/Relationship.py +++ b/src/Relationship.py @@ -29,7 +29,7 @@ import RelLib import types from gettext import gettext as _ -from Utils import strip_context as __ +from TransUtils import strip_context as __ #------------------------------------------------------------------------- # @@ -156,6 +156,8 @@ _niece_level = [ "", "niece", "grandniece", "great grandniece", "second great gr # #------------------------------------------------------------------------- +MAX_DEPTH = 15 + class RelationshipCalculator: def __init__(self,db): @@ -164,19 +166,27 @@ class RelationshipCalculator: def set_db(self,db): self.db = db - def apply_filter(self,person,rel_str,plist,pmap): - if person == None: + def apply_filter(self,person,rel_str,plist,pmap,current_gen=1): + if person == None or current_gen > MAX_DEPTH: return - plist.append(person.get_handle()) - pmap[person.get_handle()] = rel_str + current_gen += 1 + plist.append(person.handle) + pmap[person.handle] = rel_str family_handle = person.get_main_parents_family_handle() - family = self.db.get_family_from_handle(family_handle) - if family_handle != None and family: - father = self.db.get_person_from_handle(family.get_father_handle()) - mother = self.db.get_person_from_handle(family.get_mother_handle()) - self.apply_filter(father,rel_str+'f',plist,pmap) - self.apply_filter(mother,rel_str+'m',plist,pmap) + try: + if family_handle: + family = self.db.get_family_from_handle(family_handle) + fhandle = family.father_handle + if fhandle: + father = self.db.get_person_from_handle(fhandle) + self.apply_filter(father,rel_str+'f',plist,pmap,current_gen) + mhandle = family.mother_handle + if mhandle: + mother = self.db.get_person_from_handle(mhandle) + self.apply_filter(mother,rel_str+'m',plist,pmap,current_gen) + except: + return def get_cousin(self,level,removed): if removed > len(_removed_level)-1 or level>len(_level_name)-1: diff --git a/src/Report.py b/src/Report.py index c3e7a0930..1e7e1a536 100644 --- a/src/Report.py +++ b/src/Report.py @@ -40,7 +40,64 @@ from types import ClassType, InstanceType # #------------------------------------------------------------------------- import gtk -from gnome.ui import FileEntry + + +class FileEntry(gtk.HBox): + def __init__(self,defname,title): + gtk.HBox.__init__(self) + + self.title = title + self.dir = False + self.entry = gtk.Entry() + self.entry.set_text(defname) + self.set_filename(defname) + self.set_spacing(6) + self.set_homogeneous(False) + self.button = gtk.Button() + im = gtk.Image() + im.set_from_stock(gtk.STOCK_OPEN,gtk.ICON_SIZE_BUTTON) + self.button.add(im) + self.button.connect('clicked',self.select_file) + self.pack_start(self.entry,True,True) + self.pack_end(self.button,False,False) + + def select_file(self,obj): + f = gtk.FileChooserDialog(self.title, + action=gtk.FILE_CHOOSER_ACTION_SAVE, + buttons=(gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, + gtk.RESPONSE_OK)) + + f.set_current_name(os.path.basename(self.entry.get_text())) + f.set_current_folder(self.spath) + status = f.run() + if status == gtk.RESPONSE_OK: + self.set_filename(f.get_filename()) + f.destroy() + + def set_filename(self,path): + if os.path.dirname(path): + self.spath = os.path.dirname(path) + self.defname = os.path.basename(path) + + else: + self.spath = os.getcwd() + self.defname = path + self.entry.set_text(os.path.join(self.spath,self.defname)) + + def gtk_entry(self): + return self.entry + + def get_full_path(self,val): + return self.entry.get_text() + + def set_directory_entry(self,opt): + self.dir = False + + + +#from gnome.ui import FileEntry #------------------------------------------------------------------------- # @@ -87,6 +144,28 @@ MODE_GUI = 1 # Standalone report using GUI MODE_BKI = 2 # Book Item interface using GUI MODE_CLI = 4 # Command line interface (CLI) +# Report categories +CATEGORY_TEXT = 0 +CATEGORY_DRAW = 1 +CATEGORY_CODE = 2 +CATEGORY_WEB = 3 +CATEGORY_VIEW = 4 +CATEGORY_BOOK = 5 + +standalone_categories = { + CATEGORY_TEXT : _("Text Reports"), + CATEGORY_DRAW : _("Graphical Reports"), + CATEGORY_CODE : _("Code Generators"), + CATEGORY_WEB : _("Web Page"), + CATEGORY_VIEW : _("View"), + CATEGORY_BOOK : _("Books"), +} + +book_categories = { + CATEGORY_TEXT : _("Text"), + CATEGORY_DRAW : _("Graphics"), +} + #------------------------------------------------------------------------- # # Support for printing generated files @@ -185,25 +264,6 @@ class Report: sub-classed to create a functional report generator. """ - # Ordinal generation names. Used by multiple reports. - gen = { - 1 : _("First Generation"), 2 : _("Second Generation"), - 3 : _("Third Generation"), 4 : _("Fourth Generation"), - 5 : _("Fifth Generation"), 6 : _("Sixth Generation"), - 7 : _("Seventh Generation"), 8 : _("Eighth Generation"), - 9 : _("Ninth Generation"), 10: _("Tenth Generation"), - 11: _("Eleventh Generation"), 12: _("Twelfth Generation"), - 13: _("Thirteenth Generation"), 14: _("Fourteenth Generation"), - 15: _("Fifteenth Generation"), 16: _("Sixteenth Generation"), - 17: _("Seventeenth Generation"), 18: _("Eighteenth Generation"), - 19: _("Nineteenth Generation"), 20: _("Twentieth Generation"), - 21: _("Twenty-first Generation"), 22: _("Twenty-second Generation"), - 23: _("Twenty-third Generation"), 24: _("Twenty-fourth Generation"), - 25: _("Twenty-fifth Generation"), 26: _("Twenty-sixth Generation"), - 27: _("Twenty-seventh Generation"), 28: _("Twenty-eighth Generation"), - 29: _("Twenty-ninth Generation") - } - def __init__(self, database, person, options_class): self.database = database self.start_person = person @@ -337,8 +397,8 @@ class BareReportDialog: self.init_interface() def init_interface(self): - self.output_notebook = None - self.notebook_page = 1 + #self.output_notebook = None + #self.notebook_page = 1 self.pagecount_menu = None self.filter_combo = None self.extra_menu = None @@ -366,7 +426,7 @@ class BareReportDialog: self.ok.connect('clicked',self.on_ok_clicked) self.cancel.connect('clicked',self.on_cancel) - self.window.set_resize_mode(0) + self.window.set_default_size(600,-1) # Set up and run the dialog. These calls are not in top down # order when looking at the dialog box as there is some @@ -389,11 +449,17 @@ class BareReportDialog: self.setup_target_frame() self.setup_format_frame() self.setup_style_frame() - self.setup_output_notebook() + #self.setup_output_notebook() + + self.notebook = gtk.Notebook() + self.notebook.set_border_width(6) + self.window.vbox.add(self.notebook) + self.setup_paper_frame() self.setup_html_frame() self.setup_report_options_frame() self.setup_other_frames() + self.notebook.set_current_page(0) self.window.show_all() def get_title(self): @@ -601,8 +667,10 @@ class BareReportDialog: self.style_button.connect('clicked',self.on_style_edit_clicked) self.tbl.attach(label,1,2,self.col,self.col+1,gtk.SHRINK|gtk.FILL) - self.tbl.attach(self.style_menu,2,3,self.col,self.col+1) - self.tbl.attach(self.style_button,3,4,self.col,self.col+1,gtk.SHRINK|gtk.FILL) + self.tbl.attach(self.style_menu,2,3,self.col,self.col+1, + yoptions=gtk.SHRINK) + self.tbl.attach(self.style_button,3,4,self.col,self.col+1, + xoptions=gtk.SHRINK|gtk.FILL,yoptions=gtk.SHRINK) self.col += 1 # Build the default style set for this report. @@ -657,16 +725,8 @@ class BareReportDialog: label.set_alignment(0.0,0.5) label.set_use_markup(True) - if len(self.frame_names) == 0: - table.attach(label,0,3,0,1) - table.set_border_width(12) - self.window.vbox.add(table) - else: - table.set_border_width(6) - self.notebook = gtk.Notebook() - self.notebook.set_border_width(6) - self.window.vbox.add(self.notebook) - self.notebook.append_page(table,label) + table.set_border_width(6) + self.notebook.append_page(table,label) row += 1 if len(self.local_filters): @@ -686,7 +746,7 @@ class BareReportDialog: if self.max_gen: self.generations_spinbox = gtk.SpinButton(digits=0) self.generations_spinbox.set_numeric(1) - adjustment = gtk.Adjustment(self.max_gen,1,31,1,0) + adjustment = gtk.Adjustment(self.max_gen,1,999,1,0) self.generations_spinbox.set_adjustment(adjustment) adjustment.value_changed() label = gtk.Label("%s:" % _("Generations")) @@ -701,7 +761,8 @@ class BareReportDialog: msg = _("Page break between generations") self.pagebreak_checkbox = gtk.CheckButton(msg) self.pagebreak_checkbox.set_active(self.page_breaks) - table.attach(self.pagebreak_checkbox,2,3,row,row+1) + table.attach(self.pagebreak_checkbox,2,3,row,row+1, + yoptions=gtk.SHRINK) row += 1 # Now the "extra" option menu @@ -836,7 +897,7 @@ class BareReportDialog: if self.filter_combo: try: self.filter = self.filter_combo.get_value() - active = self.filter_combo.get_active() + active = max(0,self.filter_combo.get_active()) self.options.handler.set_filter_number(active) except: print "Error setting filter. Proceeding with 'Everyone'" @@ -889,7 +950,8 @@ class BareReportDialog: style sheet editor object and let them play. When they are done, the previous routine will be called to update the dialog menu for selecting a style.""" - StyleEditor.StyleListDisplay(self.style_sheet_list,self.build_style_menu,self.window) + StyleEditor.StyleListDisplay(self.style_sheet_list,self.build_style_menu, + self.window) def on_center_person_change_clicked(self,*obj): import SelectPerson @@ -942,6 +1004,7 @@ class ReportDialog(BareReportDialog): for a basic *stand-alone* report.""" self.style_name = "default" + self.page_html_added = False BareReportDialog.__init__(self,database,person,option_class, name,translated_name) @@ -963,7 +1026,7 @@ class ReportDialog(BareReportDialog): def get_title(self): """The window title for this dialog""" name = self.report_name - category = const.standalone_categories[self.category] + category = standalone_categories[self.category] return "%s - %s - GRAMPS" % (name,category) def get_header(self, name): @@ -1063,15 +1126,18 @@ class ReportDialog(BareReportDialog): # Is this to be a printed report or an electronic report # (i.e. a set of web pages) + if self.page_html_added: + self.notebook.remove_page(0) if obj.get_paper() == 1: - self.notebook_page = 0 + self.paper_label = gtk.Label('%s'%_("Paper Options")) + self.paper_label.set_use_markup(True) + self.notebook.insert_page(self.paper_table,self.paper_label,0) + self.paper_table.show_all() else: - self.notebook_page = 1 - - if self.output_notebook == None: - return - - self.output_notebook.set_current_page(self.notebook_page) + self.html_label = gtk.Label('%s' % _("HTML Options")) + self.html_label.set_use_markup(True) + self.notebook.insert_page(self.html_table,self.html_label,0) + self.html_table.show_all() if not self.get_target_is_directory(): fname = self.target_fileentry.get_full_path(0) @@ -1088,6 +1154,7 @@ class ReportDialog(BareReportDialog): if self.style_button: self.style_button.set_sensitive(obj.get_styles()) self.style_menu.set_sensitive(obj.get_styles()) + self.page_html_added = True #------------------------------------------------------------------------ # @@ -1114,7 +1181,6 @@ class ReportDialog(BareReportDialog): if hid[-4:]==".xml": hid = hid[0:-4] self.target_fileentry = FileEntry(hid,_("Save As")) - self.target_fileentry.set_modal(True) if self.get_target_is_directory(): self.target_fileentry.set_directory_entry(1) @@ -1124,14 +1190,13 @@ class ReportDialog(BareReportDialog): self.doc_label.set_alignment(0.0,0.5) self.tbl.attach(self.doc_label, 1, 2, self.col, self.col+1, - gtk.SHRINK|gtk.FILL) + xoptions=gtk.SHRINK|gtk.FILL,yoptions=gtk.SHRINK) self.tbl.attach(self.target_fileentry, 2, 4, self.col, self.col+1, - gtk.EXPAND|gtk.FILL) + xoptions=gtk.EXPAND|gtk.FILL,yoptions=gtk.SHRINK) self.col += 1 spath = self.get_default_directory() - self.target_fileentry.set_default_path(spath) self.target_fileentry.set_filename(spath) self.target_fileentry.gtk_entry().set_position(len(spath)) @@ -1141,7 +1206,8 @@ class ReportDialog(BareReportDialog): work.""" self.print_report = gtk.CheckButton (_("Print a copy")) - self.tbl.attach(self.print_report,2,4,self.col,self.col+1) + self.tbl.attach(self.print_report,2,4,self.col,self.col+1, + yoptions=gtk.SHRINK) self.col += 1 self.make_doc_menu(self.options.handler.get_format_name()) @@ -1149,7 +1215,8 @@ class ReportDialog(BareReportDialog): label = gtk.Label("%s:" % _("Output Format")) label.set_alignment(0.0,0.5) self.tbl.attach(label,1,2,self.col,self.col+1,gtk.SHRINK|gtk.FILL) - self.tbl.attach(self.format_menu,2,4,self.col,self.col+1) + self.tbl.attach(self.format_menu,2,4,self.col,self.col+1, + yoptions=gtk.SHRINK) self.col += 1 ext = self.format_menu.get_ext() @@ -1168,13 +1235,7 @@ class ReportDialog(BareReportDialog): """Set up the output notebook of the dialog. This sole purpose of this function is to grab a pointer for later use in the callback from when the file format is changed.""" - - self.output_notebook = gtk.Notebook() - self.output_notebook.set_show_tabs(0) - self.output_notebook.set_show_border(0) - self.output_notebook.set_border_width(12) - self.output_notebook.set_current_page(self.notebook_page) - self.window.vbox.add(self.output_notebook) + pass def size_changed(self,obj): (paper,name) = self.papersize_menu.get_value() @@ -1196,19 +1257,13 @@ class ReportDialog(BareReportDialog): (pagecount_map, start_text) = self.get_print_pagecount_map() if pagecount_map: - self.paper_table = gtk.Table(3,6) + self.paper_table = gtk.Table(2,6) else: - self.paper_table = gtk.Table(4,6) + self.paper_table = gtk.Table(3,6) self.paper_table.set_col_spacings(12) self.paper_table.set_row_spacings(6) - self.paper_table.set_border_width(0) - self.output_notebook.append_page(self.paper_table,gtk.Label(_("Paper Options"))) + self.paper_table.set_border_width(6) - paper_label = gtk.Label("%s" % _("Paper Options")) - paper_label.set_use_markup(True) - paper_label.set_alignment(0.0,0.5) - self.paper_table.attach(paper_label,0,6,0,1,gtk.SHRINK|gtk.FILL) - self.papersize_menu = PaperMenu.GrampsPaperComboBox() self.papersize_menu.connect('changed',self.size_changed) @@ -1216,35 +1271,37 @@ class ReportDialog(BareReportDialog): l = gtk.Label("%s:" % _("Size")) l.set_alignment(0.0,0.5) - self.paper_table.attach(l,1,2,1,2,gtk.SHRINK|gtk.FILL) - self.paper_table.attach(self.papersize_menu,2,3,1,2) + self.paper_table.attach(l,1,2,0,1,gtk.SHRINK|gtk.FILL) + self.paper_table.attach(self.papersize_menu,2,3,0,1, + yoptions=gtk.SHRINK) l = gtk.Label("%s:" % _("Height")) l.set_alignment(0.0,0.5) - self.paper_table.attach(l,3,4,1,2,gtk.SHRINK|gtk.FILL) + self.paper_table.attach(l,3,4,0,1,gtk.SHRINK|gtk.FILL) self.pheight = gtk.Entry() self.pheight.set_sensitive(0) - self.paper_table.attach(self.pheight,4,5,1,2) + self.paper_table.attach(self.pheight,4,5,0,1) l = gtk.Label(_("cm")) l.set_alignment(0.0,0.5) - self.paper_table.attach(l,5,6,1,2,gtk.SHRINK|gtk.FILL) + self.paper_table.attach(l,5,6,0,1,gtk.SHRINK|gtk.FILL) l = gtk.Label("%s:" % _("Orientation")) l.set_alignment(0.0,0.5) - self.paper_table.attach(l,1,2,2,3,gtk.SHRINK|gtk.FILL) - self.paper_table.attach(self.orientation_menu,2,3,2,3) + self.paper_table.attach(l,1,2,1,2,gtk.SHRINK|gtk.FILL) + self.paper_table.attach(self.orientation_menu,2,3,1,2, + yoptions=gtk.SHRINK) l = gtk.Label("%s:" % _("Width")) l.set_alignment(0.0,0.5) - self.paper_table.attach(l,3,4,2,3,gtk.SHRINK|gtk.FILL) + self.paper_table.attach(l,3,4,1,2,gtk.SHRINK|gtk.FILL) self.pwidth = gtk.Entry() self.pwidth.set_sensitive(0) - self.paper_table.attach(self.pwidth,4,5,2,3) + self.paper_table.attach(self.pwidth,4,5,1,2) l = gtk.Label(_("cm")) l.set_alignment(0.0,0.5) - self.paper_table.attach(l,5,6,2,3,gtk.SHRINK|gtk.FILL) + self.paper_table.attach(l,5,6,1,2,gtk.SHRINK|gtk.FILL) self.papersize_menu.set(PaperMenu.paper_sizes, self.options.handler.get_paper_name()) @@ -1257,8 +1314,8 @@ class ReportDialog(BareReportDialog): self.pagecount_menu.set_menu(myMenu) l = gtk.Label("%s:" % _("Page Count")) l.set_alignment(0.0,0.5) - self.paper_table.attach(l,1,2,3,4,gtk.SHRINK|gtk.FILL) - self.paper_table.attach(self.pagecount_menu,2,3,3,4) + self.paper_table.attach(l,1,2,2,3,gtk.SHRINK|gtk.FILL) + self.paper_table.attach(self.pagecount_menu,2,3,2,3) def html_file_enable(self,obj): active = obj.get_active() @@ -1281,13 +1338,6 @@ class ReportDialog(BareReportDialog): self.html_table.set_col_spacings(12) self.html_table.set_row_spacings(6) self.html_table.set_border_width(0) - html_label = gtk.Label("%s" % _("HTML Options")) - html_label.set_alignment(0.0,0.5) - html_label.set_use_markup(True) - self.html_table.attach(html_label,0,3,0,1) - - label = gtk.Label(_("HTML Options")) - self.output_notebook.append_page(self.html_table,label) label = gtk.Label("%s:" % _("Template")) label.set_alignment(0.0,0.5) @@ -1318,7 +1368,6 @@ class ReportDialog(BareReportDialog): self.html_table.attach(label, 1, 2, 2, 3, gtk.SHRINK|gtk.FILL) self.html_fileentry = FileEntry("HTML_Template", _("Choose File")) - self.html_fileentry.set_modal(True) if template_name and not active_index: active_index = template_index user_template = template_name @@ -1465,7 +1514,7 @@ class TextReportDialog(ReportDialog): """Initialize a dialog to request that the user select options for a basic text report. See the ReportDialog class for more information.""" - self.category = const.CATEGORY_TEXT + self.category = CATEGORY_TEXT ReportDialog.__init__(self,database,person,options,name,translated_name) #------------------------------------------------------------------------ @@ -1503,7 +1552,7 @@ class DrawReportDialog(ReportDialog): """Initialize a dialog to request that the user select options for a basic drawing report. See the ReportDialog class for more information.""" - self.category = const.CATEGORY_DRAW + self.category = CATEGORY_DRAW ReportDialog.__init__(self,database,person,opt,name,translated_name) #------------------------------------------------------------------------ @@ -1580,19 +1629,20 @@ class CommandLineReport: """ - def __init__(self,database,name,category,option_class,options_str_dict): + def __init__(self,database,name,category,option_class,options_str_dict, + noopt=False): self.database = database self.category = category self.option_class = option_class(name) self.show = options_str_dict.pop('show',None) self.options_str_dict = options_str_dict - self.init_options() + self.init_options(noopt) self.parse_option_str() self.show_options() - def init_options(self): + def init_options(self,noopt): self.options_dict = { - 'of' : self.option_class.handler.report_name, + 'of' : self.option_class.handler.module_name, 'off' : self.option_class.handler.get_format_name(), 'style' : self.option_class.handler.get_default_stylesheet_name(), 'papers' : self.option_class.handler.get_paper_name(), @@ -1615,6 +1665,9 @@ class CommandLineReport: 'dispf' : ["=str","Display format for the outputbox."], } + if noopt: + return + # Add report-specific options for key in self.option_class.handler.options_dict.keys(): if key not in self.options_dict.keys(): @@ -1677,7 +1730,7 @@ class CommandLineReport: self.option_class.handler.output = self.options_dict['of'] self.options_help['of'].append(os.path.expanduser("~/whatever_name")) - if self.category == const.CATEGORY_TEXT: + if self.category == CATEGORY_TEXT: for item in PluginMgr.textdoc_list: if item[7] == self.options_dict['off']: self.format = item[1] @@ -1685,7 +1738,7 @@ class CommandLineReport: [ item[7] for item in PluginMgr.textdoc_list ] ) self.options_help['off'].append(False) - elif self.category == const.CATEGORY_DRAW: + elif self.category == CATEGORY_DRAW: for item in PluginMgr.drawdoc_list: if item[6] == self.options_dict['off']: self.format = item[1] @@ -1693,7 +1746,7 @@ class CommandLineReport: [ item[6] for item in PluginMgr.drawdoc_list ] ) self.options_help['off'].append(False) - elif self.category == const.CATEGORY_BOOK: + elif self.category == CATEGORY_BOOK: for item in PluginMgr.bookdoc_list: if item[6] == self.options_dict['off']: self.format = item[1] @@ -1722,7 +1775,7 @@ class CommandLineReport: self.template_name = self.options_dict['template'] self.options_help['template'].append(os.path.expanduser("~/whatever_name")) - if self.category in (const.CATEGORY_TEXT,const.CATEGORY_DRAW): + if self.category in (CATEGORY_TEXT,CATEGORY_DRAW): default_style = BaseDoc.StyleSheet() self.option_class.make_default_style(default_style) @@ -1778,12 +1831,12 @@ def report(database,person,report_class,options_class,translated_name,name,categ its arguments. """ - if category == const.CATEGORY_TEXT: + if category == CATEGORY_TEXT: dialog_class = TextReportDialog - elif category == const.CATEGORY_DRAW: + elif category == CATEGORY_DRAW: dialog_class = DrawReportDialog - elif category in (const.CATEGORY_BOOK,const.CATEGORY_VIEW, - const.CATEGORY_CODE,const.CATEGORY_WEB): + elif category in (CATEGORY_BOOK,CATEGORY_VIEW, + CATEGORY_CODE,CATEGORY_WEB): report_class(database,person) return else: @@ -1804,6 +1857,8 @@ def report(database,person,report_class,options_class,translated_name,name,categ except Errors.ReportError, msg: (m1,m2) = msg.messages() ErrorDialog(m1,m2) + except Errors.DatabaseError,msg: + ErrorDialog(_("Report could not be created"),str(msg)) except: import DisplayTrace DisplayTrace.DisplayTrace() diff --git a/src/ReportOptions.py b/src/ReportOptions.py index 2014b2b81..56764ced7 100644 --- a/src/ReportOptions.py +++ b/src/ReportOptions.py @@ -30,7 +30,6 @@ Report option handling, including saving and parsing. # Standard Python modules # #------------------------------------------------------------------------- -import os from gettext import gettext as _ #------------------------------------------------------------------------- @@ -52,70 +51,26 @@ import const import GrampsKeys import Utils import BaseDoc +import Options #------------------------------------------------------------------------- # # List of options for a single report # #------------------------------------------------------------------------- -class OptionList: +class OptionList(Options.OptionList): """ Implements a set of options to parse and store for a given report. """ def __init__(self): - self.options = {} + Options.OptionList.__init__(self) self.style_name = None self.paper_name = None self.orientation = None self.template_name = None self.format_name = None - def set_options(self,options): - """ - Sets the whole bunch of options for the OptionList. - @param options: list of options to set. - @type options: list - """ - self.options = options - - def get_options(self): - """ - Returns the whole bunch of options for the OptionList. - @returns: list of options - @rtype: list - """ - return self.options - - def set_option(self,name,value): - """ - Sets a particular option in the OptionList. - @param name: name of the option to set. - @type name: str - @param value: value of the option to set. - @type str - """ - self.options[name] = value - - def remove_option(self,name): - """ - Removes a particular option from the OptionList. - @param name: name of the option to remove. - @type name: str - """ - if self.options.has_key(name): - del self.options[name] - - def get_option(self,name): - """ - Returns the value of a particular option in the OptionList. - @param name: name of the option to retrieve - @type name: str - @returns: value associated with the passed option - @rtype: str - """ - return self.options.get(name,None) - def set_style_name(self,style_name): """ Sets the style name for the OptionList. @@ -203,26 +158,20 @@ class OptionList: # Collection of option lists # #------------------------------------------------------------------------- -class OptionListCollection: +class OptionListCollection(Options.OptionListCollection): + """ + Implements a collection of option lists. + """ + def __init__(self,filename): + Options.OptionListCollection.__init__(self,filename) - # Default values for common options - default_style_name = "default" - default_paper_name = GrampsKeys.get_paper_preference() - default_template_name = "" - default_orientation = BaseDoc.PAPER_PORTRAIT - default_format_name = 'print' - - def __init__(self,filename=None): - """ - Creates an OptionListCollection instance from the list defined - in the specified file. - @param filename: XML file that contains option definitions - @type filename: str - """ - - if not filename or not os.path.isfile(filename): - filename = const.report_options - self.filename = os.path.expanduser(filename) + def init_common(self): + # Default values for common options + self.default_style_name = "default" + self.default_paper_name = GrampsKeys.get_paper_preference() + self.default_template_name = "" + self.default_orientation = BaseDoc.PAPER_PORTRAIT + self.default_format_name = 'print' self.last_paper_name = self.default_paper_name self.last_orientation = self.default_orientation @@ -230,45 +179,6 @@ class OptionListCollection: self.last_format_name = self.default_format_name self.option_list_map = {} - self.parse() - - def get_option_list_map(self): - """ - Returns the map of reports names to option lists. - @returns: Returns the map of reports names to option lists. - @rtype: dictionary - """ - return self.option_list_map - - def get_option_list(self,name): - """ - Returns the option_list associated with the report name - @param name: name associated with the desired report. - @type name: str - @returns: returns the option list associated with the name, - or None of no such option exists - @rtype: str - """ - return self.option_list_map.get(name,None) - - def get_report_names(self): - """ - Returns a list of all the report names in the OptionListCollection - @returns: returns the list of report names - @rtype: list - """ - return self.option_list_map.keys() - - def set_option_list(self,name,option_list): - """ - Adds or replaces an option_list in the OptionListCollection. - @param name: name assocated with the report to add or replace. - @type name: str - @param option_list: list of options - @type option_list: str - """ - self.option_list_map[name] = option_list - def set_last_paper_name(self,paper_name): """ Sets the last paper name used for the any report in this collection. @@ -330,14 +240,7 @@ class OptionListCollection: """ return self.last_format_name - def save(self): - """ - Saves the current OptionListCollection to the associated file. - """ - f = open(self.filename,"w") - f.write("\n") - f.write('\n') - + def write_common(self,f): f.write('\n') if self.get_last_paper_name() != self.default_paper_name: f.write(' \n' % self.get_last_paper_name() ) @@ -348,42 +251,24 @@ class OptionListCollection: if self.get_last_orientation() != self.default_orientation: f.write(' \n' % self.get_last_orientation() ) f.write('\n') - - for report_name in self.get_report_names(): - option_list = self.get_option_list(report_name) - f.write('\n' % report_name) - options = option_list.get_options() - for option_name in options.keys(): - if type(options[option_name]) in (type(list()),type(tuple())): - f.write(' \n') - else: - f.write('