Merge changes from gramps20 made since 2.0.5

svn: r5105
This commit is contained in:
Alex Roitman 2005-08-18 05:58:28 +00:00
parent b9f4134fdd
commit 704e0c4787
111 changed files with 31121 additions and 20132 deletions

View File

@ -1,3 +1,6 @@
2005-08-17 Alex Roitman <shura@gramps-project.org>
* various: merge changes made in gramps20 branch with main trunk.
2005-08-17 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/Makefile.am
* src/plugins/Makefile.am: ScratchPad moved folder.
@ -1142,6 +1145,7 @@
2005-04-26 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/PedView.py: Removed navigation buttons in flavour of a menu;
<<<<<<< ChangeLog
2005-04-23 Don Allingham <don@gramps-project.org>
* src/ListModel.py: keep track of data index
* src/EventEdit.py: use new label scheme for tabs that uses an
@ -1170,6 +1174,77 @@
2005-04-23 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/GrampsDbBase.py (_find_from_handle,find_object_from_handle,
find_place_from_handle): Fix typo
=======
2005-04-24 Don Allingham <don@gramps-project.org>
* src/gramps.glade: remove REDO menu item
2005-04-24 Eero Tamminen <eerot@sf>
* configure.in: Add Finnish back to installed languages
* src/po/fi.po: Make translations more consistent + some fixes
2005-04-24 Alex Roitman <shura@gramps-project.org>
* src/plugins/rel_ru.py (get_parents): Remove gettext string.
* src/ReportUtils.py (list_person_str): Add missing periods;
Use burial_date and burial_place for named format string parameters.
* src/ReportUtils.py (died_str): Typo.
* src/gramps_main.py (on_home_clicked): Typo.
* src/rule.glade: Translate label.
* src/po/fi.po: Add to gramps20 branch.
* src/po/template.po: Update translation template.
* src/po/ru.po: Translation update.
* src/EditSource.py (button_press): Proper invokation of editors.
* src/ImageSelect.py: Remove workarounds for window management.
* src/Report.py (GrampsStyleComboBox): Use non-translated style name.
2005-04-23 Julio Sanchez <jsanchez@users.sourceforge.net>
* src/po/es.po: Nearly complete update, but completely untested
2005-04-23 Eero Tamminen <eerot@sf>
* src/po/fi.po: Improved translations for style and filter names
and some other things. Still not tested
2005-04-22 Don Allingham <don@gramps-project.org>
* src/Date.py (__cmp__): check for Date instance before compare
2005-04-21 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/ReadGedcom.py (parse_family_object): Set MediaRef properly;
(parse_individual): Set Adoption event properly;
(importData): Dont crash because of a short line;
Support _WITN, _WTN and _GODP; Ignore _LOC extended locations
* src/Marriage.py (__init__): Properly get place title
2005-04-20 Don Allingham <don@gramps-project.org>
* src/DbPrompter.py: handle runtime errors issued by
gnomevfs.get_mime_type
2005-04-21 Eero Tamminen <eerot@sf>
* src/po/fi.po: Translation updated, but not yet tested & fixed
2005-04-20 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/plugins/ExportVCalendar.py: Mark strings for translation; use
proper family name
2005-04-20 Eero Tamminen <eerot@sf>
* src/plugins/changenames.glade: fix typo
* src/plugins/TestcaseGenerator.py: fix typos in description
* src/plugins/DetAncestralReport.py: fix gettext usage
* src/plugins/DetDescendantReport.py: fix gettext usage
* src/plugins/ChangeNames.py: fix typo
2005-04-20 Don Allingham <don@gramps-project.org>
* src/plugins/DetAncestralReport.py: fixed i18n strings
* src/ReadGedcom.py: handle FTM style of child/parent relationship
translation
* src/gedcomimport.py:
* src/DisplayModels.py: fix bad index into list
* 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 <Martin.Hawlisch@gmx.de>
* src/PedView.py: Replaced gnome canvas by an implementation

6
NEWS
View File

@ -1,3 +1,9 @@
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).
* Progress meters in plugins.
* Numerous bug fixes.
Version 2.0.5 -- the "It's certainly uncontaminated by cheese" release
* New filters based on personal notes.
* New routine for checking and removing corrupted source references in

View File

@ -1,6 +1,6 @@
dnl AM_GCONF2_REPLACEMENT
dnl Defines GCONF_SCHEMA_CONFIG_SOURCE which is where you should install schemas
dnl (i.e. pass to gconftool-2
dnl (i.e. pass to $GCONFTOOL
dnl Defines GCONF_SCHEMA_FILE_DIR which is a filesystem directory where
dnl you should install foo.schemas files
dnl
@ -10,7 +10,7 @@ dnl By copying it here we remove the requirement for having it on the system.
AC_DEFUN([AM_GCONF2_REPLACEMENT],
[
if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then
GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source`
GCONF_SCHEMA_CONFIG_SOURCE=`$GCONFTOOL --get-default-source`
else
GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE
fi

View File

@ -16,6 +16,12 @@ then
VERSIONSTRING="$VERSION-$RELEASE"
fi
dnl Checking for gconftool-2
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
if test "x$GCONFTOOL" = xno; then
AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
fi
AM_GCONF2_REPLACEMENT
AM_SHARED_MIME
AM_PACKAGER
@ -254,6 +260,7 @@ src/po/Makefile
doc/Makefile
doc/gramps-manual/Makefile
doc/gramps-manual/C/Makefile
doc/gramps-manual/fr/Makefile
example/Makefile
example/gramps/Makefile
gramps.spec

View File

@ -70,7 +70,7 @@
<varlistentry><term>gramps-xml</term>
<listitem><para> &app; XML database. This format is available
for opening, import, and export. When not specified, it can be
guessed if the filename represents a directory.
guessed if the filename ends with .gramps
</para></listitem></varlistentry>
<varlistentry><term>gedcom</term>
@ -82,13 +82,13 @@
<varlistentry><term>gramps-pkg</term>
<listitem><para> &app; package. This format is available
for import and export. When not specified, it can be
guessed if the filename ends with .tgz
guessed if the filename ends with .gpkg
</para></listitem></varlistentry>
<varlistentry><term>geneweb</term>
<listitem><para> GeneWen file This format is available
for import and export. When not specified, it can be
guessed if the filename ends with gw
guessed if the filename ends with .gw
</para></listitem></varlistentry>
<varlistentry><term>wft</term>
@ -134,12 +134,7 @@
<command>--format=<replaceable>format</replaceable></command>
option, immediately following the <filename>filename</filename>.
If not specified, the guess will be attempted based on
the <filename>filename</filename>. For gramps-xml
format, the <filename>filename</filename> is actually the
name of directory under which the gramps database resides. For
grdb and gedcom,
the <filename>filename</filename> is the name of the
corresponding file.
the <filename>filename</filename>.
</para>
<tip><para>Only grdb, gramps-xml,
@ -163,12 +158,7 @@
<command>--format=<replaceable>format</replaceable></command>
option, immediately following the <filename>filename</filename>.
If not specified, the guess will be attempted based on
the <filename>filename</filename>. For gramps-xml
format, the <filename>filename</filename> is actually the
name of directory under which the gramps database resides. For
grdb, gedcom, gramps-pkg, and geneweb,
the <filename>filename</filename> is the name of the
corresponding file.
the <filename>filename</filename>.
</para>
<tip><para>More than one file can be imported in one command.
@ -195,10 +185,10 @@
option. The format can be specified with the <command>-f</command>
option immediately following the <filename>filename</filename>.
If not specified, the guess will be attempted based on
the <filename>filename</filename>. For gramps-xml
and iso formats, the <filename>filename</filename>
the <filename>filename</filename>. For iso format,
the <filename>filename</filename>
is actually the name of directory the gramps database will be written
into. For grdb, gedcom, wft, geneweb,
into. For grdb, gramps-xml, gedcom, wft, geneweb,
and gramps-pkg, the <filename>filename</filename>
is the name of the resulting file.
</para>
@ -411,8 +401,8 @@
<listitem>
<para><command>gramps
-i<filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-i <filename>~/db3</filename>
-i <filename>file2.gpkg</filename>
-i <filename>~/db3.gramps</filename>
-i <filename>file4.wft</filename>
-a <filename>check</filename></command>
</para> </listitem></varlistentry>
@ -424,10 +414,10 @@
<para><command>gramps
-i <filename>file1.ged</filename>
-f <replaceable>gedcom</replaceable>
-i <filename>file2.tgz</filename>
-i <filename>file2.gpkg</filename>
-f <replaceable>gramps-pkg</replaceable>
-i <filename>~/db3</filename>
-f <replaceable>gramps</replaceable>
-i <filename>~/db3.gramps</filename>
-f <replaceable>gramps-xml</replaceable>
-i <filename>file4.wft</filename>
-f <replaceable>wft</replaceable>
-a <replaceable>check</replaceable></command>
@ -441,7 +431,7 @@
<listitem>
<para><command>gramps
-i <filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-i <filename>file2.gpkg</filename>
-o <filename>~/new-package</filename>
-f <replaceable>gramps-pkg</replaceable></command>
</para></listitem>
@ -454,7 +444,7 @@
<listitem>
<para><command>gramps
-i <filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-i <filename>file2.dpkg</filename>
-o <filename>~/new-package</filename>
-f <replaceable>gramps-pkg</replaceable>
&gt;<filename>outfile</filename>
@ -468,8 +458,8 @@
<listitem>
<para><command>gramps
-i <filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-i <filename>~/db3</filename>
-i <filename>file2.gpkg</filename>
-i <filename>~/db3.gramps</filename>
</command>
</para> </listitem>
</varlistentry>

View File

@ -1,3 +1,3 @@
# Process this file with automake to produce Makefile.in
SUBDIRS = C
SUBDIRS = C fr

View File

@ -10,6 +10,10 @@ entities = legal.xml\
faq.xml\
keybind.xml\
filtref.xml\
cmdline.xml
cmdline.xml \
authors.xml \
bugs.xml \
preface.xml
include $(top_srcdir)/doc/xmldocs.make
dist-hook: app-dist-hook

View File

@ -0,0 +1,96 @@
<appendix id="gramps-about">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003-2005 Alexander Roitman
This document 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 document 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$ -->
<title>Au sujet de GRAMPS</title>
<para> &app; a été écrit par Donald N. Allingham</para>
<para>
La liste quelque peu inachevée de contribuants inclut (dans l'ordre alphabétique)
<itemizedlist>
<listitem><para>Larry Allingham</para></listitem>
<listitem><para>Jens Arvidsson</para></listitem>
<listitem><para>Marcos Bedinelli</para></listitem>
<listitem><para>Douglas S. Blank</para></listitem>
<listitem><para>Radu Bogdan Mare</para></listitem>
<listitem><para>Alexander Bogdashevsky</para></listitem>
<listitem><para>Richard Bos</para></listitem>
<listitem><para>Nathan Bullock</para></listitem>
<listitem><para>Lorenzo Cappelletti</para></listitem>
<listitem><para>Pier Luigi Cinquantini</para></listitem>
<listitem><para>Bruce J. DeGrasse</para></listitem>
<listitem><para>Alexandre Duret-Lutz</para></listitem>
<listitem><para>Billy C. Earney</para></listitem>
<listitem><para>Baruch Even</para></listitem>
<listitem><para>Bernd Felsche</para></listitem>
<listitem><para>Egyeki Gergely</para></listitem>
<listitem><para>Michel Guitel</para></listitem>
<listitem><para>Steve Hall</para></listitem>
<listitem><para>David R. Hampton</para></listitem>
<listitem><para>Martin Hawlisch</para></listitem>
<listitem><para>Frode Jemtland</para></listitem>
<listitem><para>Greg Kuperberg</para></listitem>
<listitem><para>Arkadiusz Lipiec</para></listitem>
<listitem><para>Lars Kr. Lundin</para></listitem>
<listitem><para>Radek Malcic</para></listitem>
<listitem><para>Leonid Mamtchenkov</para></listitem>
<listitem><para>Tino Meinen</para></listitem>
<listitem><para>Frederick Noronha</para></listitem>
<listitem><para>Jeffrey C. Ollie</para></listitem>
<listitem><para>Donald A. Peterson</para></listitem>
<listitem><para>Guillaume Pratte</para></listitem>
<listitem><para>Laurent Protois</para></listitem>
<listitem><para>Matthieu Pupat</para></listitem>
<listitem><para>Alexander Roitman</para></listitem>
<listitem><para>Jason Salaz</para></listitem>
<listitem><para>Julio Sanchez</para></listitem>
<listitem><para>Bernd Schandl</para></listitem>
<listitem><para>Martin Senftleben</para></listitem>
<listitem><para>Gary Shao</para></listitem>
<listitem><para>Jim Smart</para></listitem>
<listitem><para>Steve Swales</para></listitem>
<listitem><para>Eero Tamminen</para></listitem>
<listitem><para>Samuel Tardieu</para></listitem>
<listitem><para>Richard Taylor</para></listitem>
<listitem><para>James Treacy</para></listitem>
<listitem><para>Sebastian Voecking</para></listitem>
<listitem><para>Xing Wang</para></listitem>
<listitem><para>Tim Waugh</para></listitem>
<listitem><para>Jesper Zedlitz</para></listitem>
</itemizedlist>
Si quelqu'un d'autre devrait être énuméré ici, svp faites-nous le savoir.
</para>
<para>
Pour trouver plus d'informations sur GRAMPS, visitez
<ulink url="http://gramps.sourceforge.net" type="http">la page web du projet GRAMPS</ulink>.</para>
<para>
Pour rapporter un bug ou faire une suggestion concernant cette application ou ce manuel, employez le menu d'aide dans GRAMPS, ou suivez les directions sur
<ulink url="http://gramps.sourceforce.net/contact.html" type="http">cet emplacement.</ulink>
</para>
<para> Ce programme est distribué en vertu de la licence de Grand Public de GNU, comme publiée par la Free Software Foundation; version 2 de la licence, ou (à votre option) toute version postérieure. Une copie de cette licence peut être trouvée à ce
<ulink url="ghelp:gpl" type="help">lien</ulink>,ou dans le fichier COPIER inclus avec le code source de ce programme. </para>
</appendix>

View File

@ -0,0 +1,35 @@
<appendix id="mayapp-bugs">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003-2005 Alexander Roitman
This document 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 document 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$ -->
<title>Bugs et limitations connus</title>
<para>Les bugs sont dépistés par
<ulink url="http://sourceforge.net/tracker/?group_id=25770&amp;atid=385137" type="http">
le suivi système de sourceforge.net </ulink>.
</para>
<para>Les limitations connues incluent les issues d'exécution de BSDDB, liées à la capacité de la mémoire. Aussi longtemps que le cache de BSDDB s'adapte complètement dans la mémoire disponible du système, l'exécution devrait être proportionnée. Quand la taille du cache excède celle de la mémoire libre, des parties du cache de la base de données commencent à être permutées sur le disque, l'exécution se dégrade sensiblement. Ceci peut être résolu en ajustant la taille du cache de BSDDB aux grandes bases de données.
</para>
</appendix >

View File

@ -1,229 +1,405 @@
<?xml version="1.0" encoding="UTF-8"?>
<appendix id="append-cmdline">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Copyright (C) 2003-2005 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
This document 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 document 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$ -->
<!-- =============== Appendices Subsection ================ -->
<sect2 id="append-cmdline">
<title>Manuel de référence pour l'utilisation en ligne de commande</title>
<para>Cette annexe décrit les possibilités offertes par &app; en
ligne de commande, depuis un terminal. </para>
<title>Références en ligne de commande</title>
<para>Cette annexe décrit les possibilités offertes par GRAMPS en ligne de commande, depuis un terminal.</para>
<para>Notons ici que &app; est écrit pour être piloté à travers
son interface graphique. Il ne peut pas être utilisé dans un mode
strictement limité au texte. Les modifications pour le faire seraient
très importantes. C'est pourquoi les options de la ligne de commande
ne visent pas l'indépendance par rapport au mode graphique.
En fait, elles rendent seulement certaines tâches fréquentes plus
commodes et exécutables depuis des scripts. L'affichage
graphique doit cependant toujours être accessible.
</para>
<note><para>&app; est écrit pour être piloté à travers son interface graphique. Il ne peut pas être utilisé dans un mode strictement limité au texte. Les modifications pour le faire seraient très importantes. C'est pourquoi les options de la ligne de commande ne visent pas l'indépendance par rapport au mode graphique. En fait, elles rendent seulement certaines tâches fréquentes plus commodes et exécutables depuis des scripts. L'affichage graphique doit cependant toujours être accessible.
</para></note>
<para>En résumé, les options de la ligne de commande fournissent
un mode non-interactif mais n'affranchissent pas d'un
affichage graphique. C'est comme çà !
</para>
<tip><para> En résumé, les options de la ligne de commande fournissent un mode non-interactif mais n'affranchissent pas d'un affichage graphique. C'est comme çà !
</para></tip>
<sect3 id="cmdline-options">
<sect1 id="cmdline-options">
<title>Options disponibles</title>
<para>Voici la liste des options de lancement de &app; : </para>
<variablelist>
<varlistentry><term>Options de format</term>
<listitem><para> Le format des fichiers de lecture ou d'écriture est donné par l'option
<command>-f</command> <replaceable>format</replaceable>.
Le <replaceable>format</replaceable> est à choisir parmi un des choix suivants :
<para>Voici la liste des options de lancement de GRAMPS. Si vous voulez connaître plus d'options, voir <xref linkend="cmdline-operation"/>
et <xref linkend="cmdline-examples"/>.
</para>
<sect2 id="cmdline-opt-format"><title>Options de format</title>
<para> Le format des fichiers de lecture ou d'écriture est donné par l'option
<command>-f <replaceable>format</replaceable></command>
Les valeurs acceptables <replaceable>format</replaceable> sont énumérées ci-dessous.</para>
<variablelist>
<varlistentry><term>gramps</term>
<listitem><para> &app; chemin. Ce format est disponible
en lecture comme en écriture. Il est deviné d'après la nature
la nature (fichier ou répertoire) du chemin.
<varlistentry><term>grdb</term>
<listitem><para>Base de données de &app;.Ce format est prêt à l'ouverture, à l'importation, et à l'exportation. Une fois indiqué, il peut deviner si le fichier porte l'extension grdb
</para></listitem></varlistentry>
<varlistentry><term>gramps-xml</term>
<listitem><para>Base de données de &app;. Ce format est prêt à l'ouverture, à l'importation, et à l'exportation. Une fois indiqué, il peut deviner si le fichier représente un dossier-gramps.
</para></listitem></varlistentry>
<varlistentry><term>gedcom</term>
<listitem><para> fichier GEDCOM. Ce format est disponible
en lecture comme en écriture. Il est deviné
si le nom de fichier a comme suffixe .ged.
<listitem><para>Fichier GEDCOM.Ce format est prêt à l'ouverture, à l'importation, et à l'exportation. Une fois indiqué, il peut deviner si le fichier porte l'extension ged
</para></listitem></varlistentry>
<varlistentry><term>gramps-pkg</term>
<listitem><para> &app; package. Ce format est disponible
en lecture comme en écriture. Il est deviné
si le nom de fichier a comme suffixe .tgz .
<listitem><para>Paquet de &app;.Ce format est prêt à l'importation et à l'exportation. Une fois indiqué, il peut deviner si le fichier porte l'extension tgz
</para></listitem></varlistentry>
<varlistentry><term>geneweb</term>
<listitem><para>Le fichier de GeneWen.Ce format est prêt à l'importation et à l'exportation. Une fois indiqué, il peut deviner si le fichier porte l'extension gw
</para></listitem></varlistentry>
<varlistentry><term>wft</term>
<listitem><para>Web Family Tree. Ce format est disponible
en écriture seulement. Il est deviné
si le nom de fichier a comme suffixe .wft.
<listitem><para> Web Family Tree. Ce format est prêt à l'exportation seulement. Une fois indiqué, il peut deviner si le fichier porte l'extension wft
</para></listitem></varlistentry>
<varlistentry><term>iso</term>
<listitem><para>image de CD. Ce format est disponible
en écriture seulement. Il doit toujours être
précisé explicitement.
<listitem><para> Image de CD. Ce format est prêt à l'exportation seulement. Il doit toujours être indiquer explicitement.
</para></listitem></varlistentry>
</variablelist>
</sect2>
<sect2 id="cmdline-opt-open"><title>Options d'ouverture</title>
<para>Il y a deux manières de donner à &app; le nom du fichier à ouvrir:</para>
<itemizedlist>
<listitem><para>chemin du fichier </para></listitem>
<listitem><para>use the
<command>-O <filename>nom du fichier</filename></command> ou
<command>-open=<filename>nom du fichier</filename></command>
</para></listitem>
</varlistentry>
<varlistentry><term>Options de lecture</term>
<listitem><para> Les fichiers à lire sont spécifiés avec l'option
<command>-i</command> <replaceable>chemin</replaceable>.
Le format peut être précisé avec l'option <command>-f</command>
immédiatement après le <replaceable>chemin</replaceable>.
Si le format n'est pas précisé, il sera deviné d'après le
<replaceable>chemin</replaceable> donné. Pour le format <term>gramps</term>,
le <replaceable>chemin</replaceable> est en fait le
nom du répertoire dans lequel les données gramps sont placées. Pour les formats
<term>gedcom</term> et <term>gramps-pkg</term>, le
<replaceable>chemin</replaceable> est le nom du fichier de données. </para>
</itemizedlist>
<para>Quand plusieurs fichiers sont à lire, chaque nom de fichier doit être
précédé par une commande <command>-i</command>.
Les fichiers sont lus dans l'ordre des arguments, c'est à dire que
<command>-i</command> <replaceable>chemin1</replaceable>
<command>-i</command> <replaceable>chemin2</replaceable>
et
<command>-i</command> <replaceable>chemin2</replaceable>
<command>-i</command> <replaceable>chemin1</replaceable>
peuvent ne pas donner les mêmes identifications gramps dans les données après chargement.
</para></listitem>
</varlistentry>
<para>Si le nom du fichier est donné sans options, &app; ouvrira sa fenêtre principale et commencera une session.
</para>
<tip><para>Si aucune option n'est donnée, juste le nom de fichier, &app; ignorera le reste des arguments de ligne de commande. Employer -o pour ouvrir le fichier et pour faire quelque chose avec les données.
</para></tip>
<varlistentry><term>Options d'écriture</term>
<listitem><para> Les fichiers à écrire sont précisés par l'option
<command>-o</command> <replaceable>chemin</replaceable>.
Le format peut être spécifié par l'option <command>-f</command>
placée immédiatement après le <replaceable>chemin</replaceable>.
Si ce n'est pas le cas, il sera deviné d'après le
<replaceable>chemin</replaceable>. Pour les formats <term>gramps</term>
et <term>iso</term>, le <replaceable>chemin</replaceable>
est en fait le nom du répertoire où seront écrites les données gramps.
Pour les formats <term>gedcom</term>, <term>wft</term>,
et <term>gramps-pkg</term>, le <replaceable>chemin</replaceable>
est le nom du fichier écrit.
<para>Le format peut être indiqué avec l'option
<command>-f <replaceable>format</replaceable></command> ou
<command>--format=<replaceable>format</replaceable></command>
juste après <filename>le nom du fichier</filename>.
Pour le format gramps-xml,<filename>nom de fichier</filename> est réellement le nom du répertoire sous lequel la base de données de gramps réside. Pour le grdb et le gedcom, <filename>le nom de fichier</filename> est le nom du fichier correspondant.
</para>
<para>Quand plusieurs fichiers de sortie sont précisés, chacun doit être
précédé par une option <command>-o</command> . Les fichiers sont écrits
un par un dans l'ordre des arguments. </para></listitem>
</varlistentry>
<tip><para>Seulement grdb, gramps-xml, et les formats gedcom peuvent être ouverts directement. Pour d'autres formats, vous devrez employer l'option d'importation qui installera la base de données vide puis importera des données.
</para></tip>
<tip><para>Seulement un fichier simple peut être ouvert. Si vous devez combiner des données depuis plusieurs sources, vous devrez employer l'option d'importation.</para></tip>
</sect2>
<varlistentry><term>Options d'action</term>
<listitem><para>L'action à exécuter sur les données lues peut être précisée
avec l'option <command>-a</command> <replaceable>action</replaceable>.
Ceci est fait après que toutes les lectures ont été faites avec succès.
Les actions actuellement disponibles sont <term>summary</term> (comme
<menuchoice><guimenu>Reports</guimenu> <guisubmenu>View</guisubmenu>
<guimenuitem>Summary</guimenuitem></menuchoice>)
et <term>check</term> (comme <menuchoice><guimenu>Tools</guimenu>
<guisubmenu>Database Processing</guisubmenu>
<guimenuitem>Check and Repair</guimenuitem></menuchoice>).
<sect2 id="cmdline-opt-import"><title>Options d'importation</title>
<para> Les dossiers destinés à l'importation peuvent être indiqués avec
<command>-i <filename>nom du fichier</filename></command>
ou <command>--import=<filename>nom du fichier</filename></command>
Le format peut être indiqué avec l'option
<command>-f <replaceable>format</replaceable></command> ou
<command>--format=<replaceable>format</replaceable></command>
juste après<filename>nom de fichier</filename>.
Pour le format gramps-xml,<filename>le nom du fichier</filename> est réellement le nom du répertoire sous lequel la base de données de gramps réside. Pour grdb, gedcom, gramps-pkg, et geneweb, <filename>le nom du fichier</filename> est le nom du fichier correspondant.
</para>
<para>Si plusieurs actions de sorties sont données, chacune doit être précédée par une option
<command>-a</command>. Les actions sont exécutées une par une dans l'ordre des arguments.
<tip><para>Plus d'un fichier peut être importé dans une commande. Si c'est le cas,
&app; incorporera les données à partir du prochain fichier à la base de données disponible à l'heure actuelle.
</para></tip>
<para>Quand plus d'un dossier d'entrée est donné, chacun doit être par précédé de<command>-i</command>Les dossiers sont importés dans l'ordre indiqué, c.-à-d..
<command>
-i <filename>fichier1</filename>
-i <filename>fichier2</filename>
</command> and <command>
-i <filename>fichier2</filename>
-i <filename>fichier1</filename>
</command>
pourraient produire différentes versions dans la base de données résultant.
</para></sect2>
<sect2 id="cmdline-opt-export"><title>Options d'exportation</title>
<para> Les dossiers destinés à l'exportation peuvent être indiqués avec
<command>-o <filename>nom du fichier</filename></command> ou
<command>--output=<filename>nom du fichier</filename></command>
Le format peut être indiqué avec l'option <command>-f</command>
juste après <filename>le nom du fichier</filename>.
Pour gramps-xml et les formats iso, <filename>nom du fichier</filename>
est réellement le nom du répertoire la base de données de gramps. Pour grdb, gedcom, wft, geneweb, et gramps-pkg,<filename>le nom du fichier</filename>
est le nom du dossier résultant.
</para>
<tip><para>Plus d'un fichier peut être exporté dans une commande. Si c'est le cas, &app; essayera d'écrire plusieurs fichiers en utilisant les données de la base de données disponible à l'heure actuelle.
</para></tip>
<para> Quand plus d'un fichier est donné, chacun doit être par précédé par <command>-o</command> Les dossiers sont écrits dans l'ordre indiqué.
</para></sect2>
<sect2 id="cmdline-opt-action"><title>Options d'action</title>
<para> L'action à exécuter sur les données importées peut être indiquée avec
<command>-a <replaceable>action</replaceable></command> ou
<command>--action=<replaceable>action</replaceable></command>
Ceci est fait après que toutes les importations soient accomplies avec succès.
</para>
<para>Les actions actuellement disponibles sont:</para>
<variablelist>
<varlistentry><term>summary</term>
<listitem><para>Cette action est identique à
<menuchoice><guimenu>Rapports</guimenu><guisubmenu>Vue</guisubmenu>
<guimenuitem>Sommaire</guimenuitem></menuchoice>
</para></listitem></varlistentry>
<varlistentry><term>check</term>
<listitem><para>Cette action est identique à
<menuchoice><guimenu>Outils</guimenu>
<guisubmenu>Traitement de la Base de données</guisubmenu>
<guimenuitem>contrôle et réparation</guimenuitem></menuchoice>.
</para> </listitem> </varlistentry>
<varlistentry><term>report</term>
<listitem><para>Cette action laisse produire des rapports à partir de la ligne de commande. Car les rapports ont généralement beaucoup d'options propres, cette action devrait être suivie de la chaîne d'option du rapport. La chaîne est donnée en utilisant
<command>-p <replaceable>option_string</replaceable></command> ou
<command>--options=<replaceable>option_string</replaceable></command>
</para>
<tip><para>
La chaîne d'option de rapport devrait satisfaire les conditions suivantes:
</para>
<itemizedlist>
<listitem><para>Elle ne doit contenir aucun espaces. Si quelques arguments doivent inclure les espaces, la chaîne devrait être enfermée avec des guillemets.
</para></listitem>
</varlistentry>
<listitem><para>Option string must list pairs of option names
and values.
</para></listitem>
<listitem><para>La chaîne d'option doit énumérer des paires de noms et de valeurs séparées par le signe égal.
</para></listitem>
<listitem><para>Différentes paires doivent être séparées par des virgules.
</para></listitem>
</itemizedlist>
</tip>
<para>La plupart des options de rapport sont spécifiques pour chaque rapport. Cependant, il y a quelques options communes.
</para>
<variablelist>
<varlistentry><term>name=report_name</term>
<listitem> <para>
Cette option obligatoire détermine quel rapport sera produit. Si le report_name ne correspond à aucun rapport disponible, le message d'erreur sera affiché à la suite de la liste de rapports disponibles.
</para>
</listitem> </varlistentry>
<varlistentry><term>show=all</term>
<listitem> <para>
Ceci affichera la liste de noms pour toutes les options disponibles pour un rapport présenté.
</para>
</listitem> </varlistentry>
<varlistentry><term>show=option_name</term>
<listitem> <para>
Ceci affichera la description de la fonctionnalité assurée par l'option_name, pour les types et les valeurs acceptables pour cette option.
</para>
</listitem> </varlistentry>
</variablelist>
<para>
Employez les options ci-dessus pour découvrir tout au sujet d'un rapport présenté.
</para>
<tip><para>
Si une option n'est pas assurée, la dernière valeur utilisée sera employée. Si ce rapport n'a jamais été produit avant, alors la valeur du dernier rapport produit sera employée comme applicable. Autrement, la valeur par défaut sera employée.
</para></tip>
</listitem> </varlistentry>
</variablelist>
</sect3>
<para>Quand plus d'une action à produire est donnée, chacunes doivent être par précédé<command>-a</command> . Les actions sont effectuées dans l'ordre indiqué.
</para></sect2>
<sect3 id="cmdline-operation">
<title>Operation</title>
</sect1>
<sect1 id="cmdline-operation">
<title>Opération</title>
<itemizedlist>
<listitem>
<para>Si le premier argument sur la ligne de commande ne commence pas par le tiret, &app; essayera d'ouvrir le dossier avec le nom donné par le premier argument et de commencer la session interactive, ignorant le reste des arguments de ligne de commande.
</para></listitem>
<listitem>
<para>Si <command>-O</command> est donné, alors &app; essayera d'ouvrir le nom de fichier fourni et fonctionnera alors avec ces données.
</para>
<note><para>Seulement, un fichier peut être ouvert par
&app;. Si vous avez besoin d'ouvrir depuis plusieurs sources, utilisez l'option d'importation
<command>-i</command>.
</para></note>
</listitem>
<listitem>
<para>L'ordre des options <command>-i</command>, <command>-o</command>,
ou <command>-a</command> entre elles n'a pas de signification.
L'ordre réel d'exécution est toujours : les lectures (s'il y en a) puis les
écritures (s'il y en a) et enfin les actions (s'il y en a).</para>
<para>Si aucune option<command>-i</command> n'est donnée, gramps ouvrira
sa fenêtre principale et commencera une session interactive avec un ensemble vide de données
puisqu'il n'y a pas de données à traiter.</para>
ou <command>-a</command> entre elles n'a pas de signification. L'ordre réel d'exécution est toujours : les lectures (s'il y en a) puis les écritures (s'il y en a) et
enfin les actions (s'il y en a).</para>
<note><para>Mais l'ouverture doit toujours être première!</para></note>
</listitem>
<listitem>
<para>Si aucune option <command>-O</command> ou <command>-i</command>
n'est donnée, gramps ouvrira sa fenêtre principale et commencera une session interactive avec un ensemble vide de données puisqu'il n'y a pas de données à traiter.
</para></listitem>
<para>Si aucune option<command>-o</command> ou <command>-a</command> n'est donnée,
gramps ouvrira sa fenêtre principale et commencera une session interactive
avec les données lues. Cet ensemble de données se situe dans le répertoire
<replaceable>~/.gramps/import</replaceable> .</para>
<para>Les erreurs trouvées pendant les phases de lecture, d'écriture et d'action sont
rapportées soit sur la sortie standard quand elles sont gérées par gramps,
soit sur la sortie d'erreur dans le cas contraire. Utilisez les redirections
du shell pour les conserver dans des fichiers. </para>
<listitem>
<para>Si aucune option <command>-o</command> ou <command>-a</command>n'est donnée, gramps ouvrira sa fenêtre principale et commencera une session interactive avec les données lues.
<filename>import_db.grdb</filename> se situera dans le répertoire
<filename>~/.gramps/import/</filename>.
</para></listitem>
<listitem>
<para>Les erreurs trouvées pendant les phases de lecture, d'écriture et d'action sont rapportées soit sur la sortie standard quand elles sont gérées par gramps, soit sur la sortie d'erreur dans le cas contraire. Utilisez les redirections du shell pour les conserver dans des fichiers.
</para></listitem>
</itemizedlist>
</sect3>
</sect1>
<sect3 id="cmdline-examples">
<sect1 id="cmdline-examples">
<title>Exemples</title>
<para>Lecture de quatre bases de données dont les formats peuvent être devinés d'après les noms,
puis vérification des données : </para>
<para><command>gramps -i</command> <replaceable>chemin1.ged</replaceable>
<command>-i</command> <replaceable>chemin2.tgz</replaceable>
<command>-i</command> <replaceable>~/db3</replaceable>
<command>-i</command> <replaceable>chemin4.wft</replaceable>
<command>-a</command> <replaceable>check</replaceable>
<variablelist>
<varlistentry>
<term>Lecture de quatre bases de données dont les formats peuvent être devinés d'après les noms, puis vérification des données :</term>
<listitem>
<para><command>gramps
-i<filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-i <filename>~/db3</filename>
-i <filename>file4.wft</filename>
-a <filename>check</filename></command>
</para> </listitem></varlistentry>
<varlistentry>
<term>Si vous voulez préciser les formats de fichiers dans l'exemple ci-dessus, complétez les noms de fichiers par les options <command>-f</command> appropriées :</term>
<listitem>
<para><command>gramps
-i <filename>file1.ged</filename>
-f <replaceable>gedcom</replaceable>
-i <filename>file2.tgz</filename>
-f <replaceable>gramps-pkg</replaceable>
-i <filename>~/db3</filename>
-f <replaceable>gramps</replaceable>
-i <filename>file4.wft</filename>
-f <replaceable>wft</replaceable>
-a <replaceable>check</replaceable></command>
</para></listitem>
</varlistentry>
<varlistentry>
<term>Pour enregistrer le résultat des lectures, donnez l'option
<command>-o</command>(utiliser <command>-f</command>
si le nom de fichier ne permet pas à gramps de deviner le format) :</term>
<listitem>
<para><command>gramps
-i <filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-o <filename>~/new-package</filename>
-f <replaceable>gramps-pkg</replaceable></command>
</para></listitem>
</varlistentry>
<varlistentry>
<term>Pour sauver les erreurs de l'exemple précédent dans les fichiers
<filename>outfile</filename> et
<filename>errfile</filename>, lancez :</term>
<listitem>
<para><command>gramps
-i <filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-o <filename>~/new-package</filename>
-f <replaceable>gramps-pkg</replaceable>
&gt;<filename>outfile</filename>
2&gt;<filename>errfile</filename> </command>
</para></listitem>
</varlistentry>
<varlistentry>
<term>Pour lire trois ensembles de données puis lancer une session interactive de gramps sur le tout :</term>
<listitem>
<para><command>gramps
-i <filename>file1.ged</filename>
-i <filename>file2.tgz</filename>
-i <filename>~/db3</filename>
</command>
</para> </listitem>
</varlistentry>
<varlistentry>
<term>Pour ouvrir une base de données, produisant un rapport temporel dans le format pdf et l'enregistrant sous le fichier
<filename>my_timeline.pdf</filename> :</term>
<listitem>
<para><command>gramps
-O <filename>file.grdb</filename>
-a <replaceable>report</replaceable>
-p <replaceable>name=timeline,off=pdf,of=my_timeline.pdf</replaceable>
</command>
</para>
<para>Si vous voulez préciser les formats de fichiers dans l'exemple ci-dessus,
complétez les noms de fichiers par les options
<command>-f</command> appropriées : </para>
<para><command>gramps -i</command> <replaceable>chemin1.ged</replaceable>
<command>-f</command> <replaceable>gedcom</replaceable>
<command>-i</command> <replaceable>chemin2.tgz</replaceable>
<command>-f</command> <replaceable>gramps-pkg</replaceable>
<command>-i</command> <replaceable>~/db3</replaceable>
<command>-f</command> <replaceable>gramps</replaceable>
<command>-i</command> <replaceable>chemin4.wft</replaceable>
<command>-f</command> <replaceable>wft</replaceable>
<command>-a</command> <replaceable>check</replaceable>
<tip><para>Employez <replaceable>name=timeline,show=all</replaceable>
pour découvrir toutes les options disponibles au sujet du rapport de timeline. Pour découvrir des détails d'une option particulière, employez
<replaceable>show=option_name</replaceable>,
par exemple :<replaceable>name=timeline,show=off</replaceable>
</para>
<para>Pour enregistrer le résultat des lectures, donnez l'option
<command>-o</command> (utilisez l'option <command>-f</command>
si le nom de fichier ne permet pas à gramps de deviner le format) : </para>
<para><command>gramps -i</command> <replaceable>chemin1.ged</replaceable>
<command>-i</command> <replaceable>chemin2.tgz</replaceable>
<command>-o</command> <replaceable>~/nouvel-ensemble-gramps</replaceable>
<command>-f</command> <replaceable>gramps-pkg</replaceable>
</para>
<para>Pour sauver les erreurs de l'exemple précédent dans les fichiers
<replaceable>sortie</replaceable> et
<replaceable>erreur</replaceable>, lancez : </para>
<para><command>gramps -i</command> <replaceable>chemin1.ged</replaceable>
<command>-i</command> <replaceable>chemin2.tgz</replaceable>
<command>-o</command> <replaceable>~/nouvel-ensemble-gramps</replaceable>
<command>-f</command> <replaceable>gramps-pkg</replaceable>
&gt;<replaceable>sortie</replaceable>
2&gt;<replaceable>erreur</replaceable>
<para>Pour se renseigner sur les noms disponibles de rapport, employez
<replaceable>name=show</replaceable>.
</para>
</tip>
<para>Pour lire trois ensembles de données puis lancer une session interactive de gramps
sur le tout : </para>
<para><command>gramps -i</command> <replaceable>chemin1.ged</replaceable>
<command>-i</command> <replaceable>chemin2.tgz</replaceable>
<command>-i</command> <replaceable>~/db3</replaceable>
</para>
<para>Enfin, pour lancer une session interactive normale, entrez : </para>
<para> <command>gramps</command></para>
</sect3>
</listitem>
</varlistentry>
</sect2>
<varlistentry>
<term>Enfin, pour lancer une session interactive normale, entrez :</term>
<listitem><para> <command>gramps </command></para></listitem>
</varlistentry>
</variablelist>
</sect1>
</appendix>

View File

@ -1,408 +1,234 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter id="gramps-settings">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Copyright (C) 2003-2005 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
This document 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 document 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$ -->
<!-- ================ Customization ================================ -->
<title>Configuration</title>
<sect1 id="gramps-prefs">
<title>Préférences</title>
<sect1 id="gramps-prefs">
<title>Personnalisation</title>
<para>Choisissez
<menuchoice><guimenu>Edition</guimenu>
<guimenuitem>Préférences...</guimenuitem></menuchoice> pour configurer &app;.
Le dialogue <guilabel>Préférences</guilabel> propose les
catégories suivantes : </para>
<para>La plupart des configuration &app;, sont affichables dans la boîte de dialogue
<guilabel>Préférences</guilabel> Choisissez,
<menuchoice><guimenu>Edition</guimenu>
<guimenuitem>Préférences...</guimenuitem></menuchoice>. </para>
<!-- ==== Figure: Type-ahead find ==== -->
<figure id="prefs-fig">
<title>Dialogue de préférences</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/prefs.png" format="PNG"/></imageobject>
<textobject>
<phrase>Shows Preferences dialog. </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>La fenêtre du côté gauche montre l'arbre des options disponibles. Le choix d'un noeud montrera les options correspondantes du côté droit. </para>
<itemizedlist>
<listitem><para><xref linkend="gramps-prefs-usage"/></para></listitem>
<listitem><para><xref linkend="gramps-prefs-display"/></para></listitem>
<listitem><para><xref linkend="gramps-prefs-db"/></para></listitem>
</itemizedlist>
<!-- =============== Customization Subsection ================ -->
<sect2 id="gramps-prefs-usage">
<title>Utilisation</title>
<para> Cette catégorie regroupe les préférences à propos de l'utilisation
générale de &app;. Les sous-catégories suivantes sont disponibles : </para>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-usage-find">
<title>Recherche</title>
<variablelist>
<varlistentry><term><guilabel>Active la terminaison automatique</guilabel></term>
<listitem><para>Si cette option est validée, &app; essaiera de terminer seul
le texte entré dans les zones de saisie comme le nom de famille,
les lieux... La terminaison est tentée en s'appuyant sur la correspondance
entre le début de texte saisi et les données du même type déjà dans la base de données.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-usage-report">
<title>Préférences d'impression</title>
<variablelist>
<varlistentry><term><guilabel>Format de texte</guilabel></term>
<listitem><para> Sélectionne le format pour les impressions textuelles
parmi les formats disponibles.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Format graphique</guilabel></term>
<listitem><para> Sélectionne le format pour les impressions graphiques
parmi les formats disponibles.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Taille de page</guilabel></term>
<listitem><para> Sélectionne la taille de feuille utilisée pour les impressions
parmi les formats disponibles.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Répertoire par défaut des impressions</guilabel></term>
<listitem><para> Choisissez le répertoire par défaut pour les fichiers d'impression
en utilisant le bouton
<guibutton>Parcourir...</guibutton> ou entrez-le dans la zone de saisie de
texte. </para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Répertoire par défaut pour la création de site web</guilabel></term>
<listitem><para> Choisissez le répertoire par défaut pour la création de site web
en utilisant le bouton
<guibutton>Parcourir...</guibutton> ou entrez-le dans la zone de saisie de
texte. </para></listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-usage-res">
<title>Informations sur le chercheur</title>
<variablelist>
<varlistentry><term><guilabel>Informations sur le chercheur</guilabel></term>
<listitem><para> Entrez vos informations personnelles dans les champs
de saisie. Bien que &app; vous interroge,
cette information ne sert quà créer des fichiers GEDCOM valides.
Le format GEDCOM a besoin de données sur l'auteur du fichier.
Vous pouvez laissez les données vides mais les fichiers GEDCOM
exportés ne seront pas valides.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-usage-guess">
<title>Hypothèse</title>
<variablelist>
<varlistentry><term><guilabel>Hypothèse de nom de famille</guilabel></term>
<listitem><para> Cette option affecte le nom de famille initial
d'un enfant lors de sa création dans la base de données. NOTE : cela
ne change que le nom de famille initial proposé par &app; quand la fenêtre
<guilabel>Affiche Personne</guilabel> est ouverte. Vous pouvez modifier
ce nom comme vous voulez ensuite. Positionnez cette option selon ce que vous
faites le plus souvent, et elle vous économisera beaucoup
de frappe. </para>
<para>Si <guilabel>Aucun</guilabel> est sélectionné, aucune hypothèse
ne sera faite. Choisir <guilabel>Nom du père</guilabel> prendra
le nom du père et le proposera comme nom de l'enfant.
Choisir <guilabel>Combinaison du nom du père et de la mère</guilabel>
proposera le nom du père suivi du nom de la mère.
Enfin, choisir <guilabel>Style Islandais</guilabel> prendra le nom
du père suivi du suffixe &quot;sson&quot; (c'est à dire que le fils d'Erik
aura comme nom de famille Eriksson).
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect2>
<!-- =============== Customization Subsection ================ -->
<sect2 id="gramps-prefs-display">
<title>Affichage</title>
<para> Cette catégorie regroupe les préférences pour
afficher le contenu de la base de données et les contrôles.
Les sous-catégories suivantes existent : </para>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-display-gen">
<title>Général</title>
<variablelist>
<varlistentry><term><guilabel>Vue par défault</guilabel></term>
<listitem><para> Ceci définit quelle vue sera affichée au lancement
de &app;. Vous avez le choix entre la vue des Individus et
la vue par Famille.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Style de Vue par Famille</guilabel></term>
<listitem><para> Ceci sélectionne une des deux dispositions possibles
pour la vue par Famille. Le style
<guilabel>de Gauche à Droite</guilabel> ressemble à
Family Tree Maker (tm), alors que le style <guilabel>de Haut en Bas</guilabel>
ressemble à Réunion.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Toujours afficher l'onglet LDS</guilabel></term>
<listitem><para> Validez ce choix si vous souhaiter toujours afficher
l'onglet des données LDS (Later Days Saints, Mormons en français).
Si vous ne savez pas ce que c'est, ne le validez pas.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Montrer l'index dans les listes d'enfants</guilabel></term>
<listitem><para>
Cette option n'est actuellement pas programmée.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-display-date">
<title>Dates et Calendriers</title>
<variablelist>
<varlistentry><term><guilabel>Affichage : Format de Date</guilabel></term>
<listitem><para> Sélectionne le format d'affichage des dates
parmi les choix du menu.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Format des Noms</guilabel></term>
<listitem><para> Sélectionne le format d'affichage des noms
parmi les choix du menu.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Saisie : Format de Date</guilabel></term>
<listitem><para> Sélectionne le format de saisie des dates
parmi les choix du menu.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Sélection des formats de calendriers proposés</guilabel></term>
<listitem><para> Cochez ce choix si vous voulez avoir plusieurs calendriers disponibles
lors des saisies de dates dans le dialogue
<guilabel>Modification d'évènement</guilabel>. Ceci vous permettra alors de choisir
parmi plusieurs calendriers pour modifier les dates.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-display-bars">
<title>Barres d'outils et de status</title>
<variablelist>
<varlistentry><term><guilabel>Barre d'outils</guilabel></term>
<listitem><para> Sélectionne l'affichage des icônes de la barre d'outils.
Les <guilabel>paramètres GNOME</guilabel> seront utilisés
par &app;. Il est possible d'afficher seulement les icônes, seulement le texte
ou encore d'afficher les deux.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Barre de Status</guilabel></term>
<listitem><para> Sélectionne ce qui est affiché dans la barre de status.
Il est possible d'afficher le nom de l'individu seul, accompagné de l'identifiant Gramps
ou aussi le lien entre la personne sélectionnée et le probant (individu origine
de la recherche généalogique ascendante). Cette dernière option n'est correctement
rédigée qu'en langue Anglaise pour le moment.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect2>
<!-- =============== Customization Subsection ================ -->
<sect2 id="gramps-prefs-db">
<title>Base de données</title>
<para> Cette catégorie regroupe les préférences liées à la
base de données elle-même. Vous y trouvez les sous-catégories suivantes : </para>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-db-gen">
<title>Général</title>
<para> Cette catégorie regroupe les préférences liées à la base de données elle-même. Vous y trouvez les sous-catégories suivantes : </para>
<variablelist>
<varlistentry><term><guilabel>Général</guilabel></term>
<listitem>
<variablelist>
<varlistentry><term><guilabel>Chargement automatique de la dernière base</guilabel></term>
<listitem><para>Cochez ce choix pour charger automatiquement la dernière base ouverte, lors du lancement de &app;.</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Estimation du nom de famille </guilabel></term>
<listitem><para> Cette option affecte le nom de famille initial d'un enfant quand il/elle est ajouté à la base de données. </para>
<tip><para>Cette option affecte seulement le nom de famille initial deviné par &app; quand le
<guilabel>dialogue d'édition</guilabel> de la personne est lancé. Placez cette option à la valeur que vous emploierez le plus fréquemment, car elle vous évitera beaucoup de dactylographie.
</para></tip>
<varlistentry><term><guilabel>Chargement automatique de la dernière base</guilabel></term>
<listitem><para> Cochez ce choix pour charger automatiquement la dernière
base ouverte, lors du lancement de &app;. </para></listitem>
<para>Si <guilabel>Aucun</guilabel> est choisi, aucune estimation sera essayé. Choix <guilabel>du nom de famille du père</guilabel>
emploiera le nom. de famille du père. Choix
<guilabel>de la combinaison
du nom de famille de la mère et du père</guilabel>
emploiera le nom du père suivi du nom de la mère. En conclusion,
<guilabel>le modèle islandais</guilabel> emploiera le nom donné du père suivi du suffixe de "sson" (par exemple le fils d'Edwin sera deviné comme Edwinsson).
</para></listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry><term><guilabel>Ne pas compresser les fichiers XML</guilabel></term>
<listitem><para> Cochez ce choix pour désactiver la compression des
fichiers XML. La compression réduit considérablement la taille du fichier.
Cela coûte un tout petit peu plus en terme de puissance CPU. Les erreurs
de compression ont été corrigées depuis bien longtemps et il n'y a
plus aucune raison de désactiver la compression.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel> Intervalle de sauvegarde automatique</guilabel></term>
<listitem><para> Ceci fixe le délai (en minutes) entre deux sauvegardes
automatiques de la base de données. La valeur zéro (0) désactive
la sauvegarde automatique. </para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Répertoire par defaut de la base de données</guilabel></term>
<listitem><para> Ceci précise le répertoire utilisé par défaut avant une sauvegarde.
Ceci sert quand on valide le bouton <guibutton>Parcourir...</guibutton> après
la commande de sauvegarde, ou quand on saisit un chemin d'accès directement
dans la zone de saisie de texte. </para></listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-db-media">
<title>Medias</title>
<para>Avant de décrire les préférences pour les objets Médias,
il faut revoir les notions d'objet local et non local.
Un objet local a ses données conservées dans le répertoire de
la base de données.
Au contraire, un objet non local est conservé ailleurs et la base
de données ne conserve qu'une référence du chemin d'accès
au fichier ainsi que quelques informations sur l'objet. </para>
<para>Vous pouvez décider de conserver vos objets médias localement
ou pas. Les objets locaux augmentent l'espace-disque consommé par la base
de données. si le fichier externe est détruit ou déplacé, &app;
en aura toujours une copie.
Au contraire, les objets non locaux réduisent l'espace-disque consommé,
mais il ne faut pas perdre les fichiers sous peine de
perdre aussi le contenu des objets non locaux.
<varlistentry><term><guilabel>Identifications de &app;</guilabel></term>
<listitem><para> Écrivez les préfixes d'identification pour différents genres d'entrées de base de données dans les champs correspondants d'enregistrement de texte.
</para>
<para>Remarque : l'exportation de la base de données en n'importe
quel format intègre tous les objets, qu'ils soient locaux
ou pas. En particulier, exporter en un paquetage gramps
inclut tous les objets médias dans le fichier produit, et change
les références en conséquence. Exporter vers un CD-Rom copie tous les objets
médias dans le répertoire de <guilabel>gravure:///</guilabel> dans Nautilus
et ajuste leur référence. Enfin, l'export en Gedcom met les fichiers de médias
à côté du fichier de données Gedcom en mettant à jour les chemins
d'accès conservés dans le fichier Gedcom.
<tip><para>Les préfixes d'identification emploient des conventions de formatage communes pour C, Python, et d'autres langages de programmation. Par exemple, le %04d augmente à un nombre entier ajouté au début de zéros, pour avoir toute la largeur des chiffres. Si vous voudriez que les identifications soient 1, 2, 3, etc.., placé simplement le paramètre de formatage à %d.
</para></tip>
</listitem>
</varlistentry>
<varlistentry><term><guilabel>Informations sur le chercheur</guilabel></term>
<listitem><para> Entrez vos informations personnelles dans les champs de saisie. Bien que &app; vous interroge, cette information ne sert qu' à créer des fichiers GEDCOM valides. Le format GEDCOM a besoin de données sur l'auteur du fichier. Vous pouvez laissez les données vides mais les fichiers GEDCOM exportés ne seront pas valides. &app; requests information about you,
</para>
<variablelist>
<varlistentry><term><guilabel>Glisser-Déposer à partir d'une Source externe
</guilabel></term>
<listitem><para> Ceci choisit entre une référence et une copie locale
quand un fichier est déposé dans la galerie. Une référence
économise l'espace-disque en ne copiant pas l'objet. La copie locale
rend votre base de données déplaçable puisqu'elle ne dépend pas de
fichiers externes. Réfléchissez à votre besoin pour faire le meilleur choix.</para>
<para>Cochez le choix <guilabel>Ouvrir l'éditeur de propriétés quand
un objet est déposé</guilabel> pour lancer l'éditeur de propriétés
après qu'un objet a été déposé dans la Galerie.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Glisser-Déposer depuis une source interne</guilabel></term>
<listitem><para>Cochez le choix <guilabel>Ouvrir l'éditeur de propriétés quand
un objet est déposé</guilabel> pour lancer l'éditeur de propriétés
après qu'un objet interne (à la base de données) a été déposé dans la Galerie.
</para></listitem>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-db-id">
<title>Identifiants internes gramps</title>
<variablelist>
<varlistentry><term><guilabel> Préfixes d'identifiants &app;</guilabel></term>
<listitem><para> Saisissez les préfixes utilisés par &app; pour générer
les identifiants pour différents éléments de données.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Autorise la modification des identifiants internes de
Gramps</guilabel></term>
<listitem><para> Cochez ce choix pour autoriser la modification des identifiants internes
utilisés par &app;. N'autorisez cela que si vous savez vraiment ce que vous faites.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
<!-- =============== Customization Sub-subsection ================ -->
<sect3 id="prefs-db-rcs">
<title>Contrôle de Révision</title>
<variablelist>
<varlistentry><term><guilabel>Utiliser le contrôle de révision</guilabel></term>
<listitem><para> Cochez ce choix si vous autorisez &app; à utiliser
la gestion des versions pour votre base de données.
Si vous le faites, choisissez le système de gestion de version
par le menu.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Prompt pour un commentaire de sauvegarde</guilabel></term>
<listitem><para> Cochez ce choix pour que &app; demande un commentaire lors de la sauvegarde
de la base de données.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect2>
</sect1> <!-- ================ End Customization ================== -->
<sect2 id="gramps-prefs-display">
<title>Affichage</title>
<para> Cette catégorie regroupe les préférences pour afficher le contenu de la base de données et les contrôles. Les sous-catégories suivantes existent :</para>
<variablelist>
<varlistentry><term><guilabel>Général</guilabel></term>
<listitem>
<variablelist>
<varlistentry><term><guilabel>Vue de défaut</guilabel></term>
<listitem><para> Ceci détermine quelle vue apparaîtra quand vous commencez &app;. Choisissez entre les vues de personne et de famille.</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Modèle de vue de famille</guilabel></term>
<listitem><para> Ceci choisit entre les deux modèles disponibles de vue de famille. Le style <guilabel>Gauche vers la Droite</guilabel>
ressemble à Family Tree Maker (tm), alors que le style
<guilabel>de Haut en Bas</guilabel> est proche de Réunion.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Toujours afficher l'onglet LDS</guilabel></term>
<listitem><para> Validez ce choix si vous souhaiter toujours afficher l'onglet des données LDS (Later Days Saints, Mormons en français). Si vous ne savez pas ce que c'est, ne le validez pas. </para></listitem></varlistentry>
<varlistentry><term><guilabel>Astuce d'affichage du jour</guilabel></term>
<listitem><para> Vérifiez cette boîte pour avoir <guilabel>l'astuce du jour</guilabel> à chaque démarrage. Les astuces sont montrés aléatoirement de la base de
&app;.
</para>
<tip><para><guilabel>L'astuce du jour</guilabel> est susceptible d'être utile pour le nouvel utilisateur de &app;.
</para></tip>
</listitem></varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry><term><guilabel>Dates</guilabel></term>
<listitem>
<para> Choisissez le format d'affichage pour les dates à partir des formats disponibles énumérés dans ce menu.
</para>
<tip><para>Les formats d'affichage disponibles sont spécifiques à une langue. Selon le displayer &app; pour votre langue, vous pouvez ou ne pouvez pas avoir beaucoup de choix.
</para></tip>
</listitem>
</varlistentry>
<varlistentry><term><guilabel>Barre d'outils et Barre de Status</guilabel></term>
<listitem>
<variablelist>
<varlistentry><term><guilabel>Barre d'outils</guilabel></term>
<listitem><para> Sélectionne l'affichage des icônes de la barre d'outils. Les <guilabel>paramètres GNOME
</guilabel> seront utilisés par &app;. Il est possible d'afficher seulement les icônes, seulement le texte ou encore d'afficher les deux.
</para></listitem>
</varlistentry>
<varlistentry><term><guilabel>Barre de Status</guilabel></term>
<listitem><para> Sélectionne ce qui est affiché dans la barre de status. Il est possible d'afficher le nom de l'individu seul, accompagné de l'identifiant Gramps ou aussi le lien entre la personne sélectionnée et le probant (individu origine de la recherche
généalogique ascendante). Cette dernière option n'est correctement rédigée qu'en langue Anglaise pour le moment.
</para></listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>
<sect1 id="gramps-prefs-other">
<title>D'autres personnalisations</title>
<para>Sans compter que d'autres <guilabel>Préférences</guilabel> sont disponibles dans &app;.Pour différentes raisons ils ont été rendus plus aisément accessibles, comme énuméré ci-dessous.
</para>
<variablelist>
<varlistentry>
<term>Rédacteur de Colonne</term>
<listitem>
<para>Les colonnes des vues de liste peuvent être ajoutées, enlevées, ou déplacées à nouveau dans un dialogue de <guilabel>rédacteur de colonne</guilabel>,
voir <xref linkend="column-editor-fig"/>. Seulement des colonnes vérifiées seront montrées dans la vue. Pour changer leur ordre, glisser n'importe quelle colonne à son endroit désiré à l'intérieur de la fenêtre. Cliquer sur <guibutton>Valider</guibutton>
reflétera les changements de la vue appropriée. Pour appeler la fenêtre d'édition de colonne choisissez<menuchoice><guimenu>Edition</guimenu><guimenuitem>
Editeur de Colonne...</guimenuitem></menuchoice>.
</para>
<tip>
<para>L'<guilabel>éditeur de Colonne</guilabel> est disponible et travaille de la même manière pour toutes les vues. Spécifiquement, elle est disponible pour la vue des Individus, vue de famille (liste d'enfants), vue des sources, vue des Lieux et vue des médias.</para> </tip>
</listitem>
</varlistentry>
<varlistentry><term>Réglage de la personne de référence</term>
<listitem><para>La personne de référence est la personne qui devient active
quand le bouton <guibutton>personne de référence</guibutton> est utilisé
ou le menu contextuel (clic-droit)</para>
<para>Pour éditer la personne de référence, sélectionner la personne désirée puis choisissez
<menuchoice><guimenu>Edition</guimenu><guimenuitem>personne de référence...</guimenuitem></menuchoice>.</para>
</listitem>
</varlistentry>
<varlistentry><term>Ajustement des commandes de visionnement</term>
<listitem> Les Barre d'outils, Barre de Status et Filtres (vue des Individus seulement) sont ajustables dans
<guimenu>Affichage</guimenu>.
</listitem>
</varlistentry>
</variablelist>
</sect1>
<sect1 id="gramps-prefs-adv">
<title>Manipulation avançée des préférences</title>
<warning><para>Le contenu de cette section est en dehors de la portée d'un utilisateur général de &app;.
Si vous continuez, vous pouvez endommager votre installation de &app; Faites attention. VOUS AVEZ ÉTÉ AVERTIS!
</para></warning>
<para>Par défaut, &app; stocke ses préférences en utilisant le système gconf2. Toutes les préférences utilisés dans cette version de &app;
&app; sont stockés dans les sous-répertoires <filename>/apps/gramps/</filename> L'accès aux clefs peut être fait avec
<command>gconftool-2</command> en ligne de commande, ou
<command>gconf-editor</command> Outil de GUI.
</para>
<para>Toutes les clefs sont documentées, et les mécanismes d'avis sont employés comme appropriés. Par conséquent, la mise à jour des clefs à l'extérieur de &app;
devrait mener à mettre à jour &app; en temps réel, sans le remettre en marche nécessairement.</para>
</sect1>
</chapter>

View File

@ -1,398 +1,266 @@
<?xml version="1.0" encoding="UTF-8"?>
<appendix id="faq">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Copyright (C) 2003-2005 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
This document 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 document 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$ -->
<!-- =============== Appendices Subsection ================ -->
<sect2 id="faq">
<title>Foire Aux Questions</title>
<para>Cette annexe répond aux questions fréquemment posées sur les listes
de discussions et les forums. Elle n'est évidemment pas limitative.
Si vous souhaitez y ajouter des questions et/ou des réponses,
envoyez un message électronique à
<ulink url="mailto:gramps-devel@lists.sf.net" type="mailto">gramps-devel@lists.sf.net</ulink>
<title>Questions Fréquemment Posées</title>
<para>Cette annexe répond aux questions les plus fréquemment posées sur les listes de discussions et les forums. Elle n'est évidemment pas limitative. Si vous souhaitez ajouter des questions et/ou des réponses, envoyez un message électronique à <ulink url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink>
</para>
<variablelist>
<varlistentry><term>Qu'est ce que &app; ? </term>
<listitem><para>&app; est le Système de Recherche et Analyse Généalogique
(Genealogical Research and Analysis Management Program System).
Autrement dit, c'est un programme personnel de généalogie qui vous permet
de conserver, modifier et chercher dans des données généalogiques, avec
l'aide de l'ordinateur.
<varlistentry><term>Qu'est ce que &app; ?</term>
<listitem><para> &app; est un Système de Recherche et d'Analyse Généalogique (Genealogical Research and Analysis Management Program System). Autrement dit, c'est un
programme personnel de généalogie qui vous permet de conserver, modifier et chercher dans des données généalogiques, avec l'aide de l'ordinateur.
</para></listitem>
</varlistentry>
<varlistentry><term>Où puis-je le trouver et que coûte-t'il ? </term>
<varlistentry><term>D'où l'obtiens-je et combien coûte-t-il?</term>
<listitem><para>
&app; peut être téléchargé gratuitement depuis le site Internet
<ulink url="http://sf.net/projects/gramps" type="http">http://sf.net/projects/gramps</ulink>.
C'est un projet Open Source publié sous la licence GNU GPL.
Vous avez complètement accès aux programmes sources et vous avez
le droit de redistribuer le programme et les sources librement.
&app; peut être téléchargé gratuitement depuis le site Internet <ulink url="http://sf.net/projects/gramps"
type="http">http://sf.net/projects/gramps</ulink> C'est un projet Open Source publié sous la licence GNU GPL. Vous avez complètement accès aux programmes sources et vous avez le droit de redistribuer le programme et les sources librement.
</para></listitem>
</varlistentry>
<varlistentry><term>Fonctionne-t'il avec Windows (tm) ? </term>
<varlistentry><term>Fonctionne-t'il avec Windows (tm)?</term>
<listitem><para>
Non. &app; utilise les librairies GTK et GNOME. Les librairies GTK
ont été portées sous Windows, mais pas les librairies GNOME.
Cependant, cela pourrait changer un jour.
Non. &app; utilise les librairies GTK et GNOME. Les librairies GTK ont été portées sous Windows, mais pas les librairies GNOME. Cependant, cela pourrait changer un jour.
</para></listitem>
</varlistentry>
<varlistentry><term>Fonctionne-t'il sur le Macintosh ? </term>
<varlistentry><term>Fonctionne-t'il sur Macintosh</term>
<listitem><para>
Le projet Fink (<ulink url="http://fink.sf.net"
type="http">http://fink.sf.net</ulink>) a porté une vieille version de
&app; (0.8.0) sur OSX. La version Mac OSX n'est pas directement supportée
par le projet &app;, surtout parce qu'aucun développeur de &app;
n'a accès à Mac OSX.</para>
<para>La version Gnome 2 de &app; (0.9.x) n'a pas été portée par le
projet Fink. Vous êtes priés de contacter le projet Fink pour plus
d'information.
</para></listitem>
<ulink url="http://fink.sourceforge.net"
type="http">Le projet Fink </ulink> a porté
<ulink url="http://fink.sourceforge.net/pdb/package.php/gramps"
type="http"> quelques anciennes versions </ulink> de
&app; à OSX (tm). La version Mac OSX n'est pas directement supportée par le projet &app; surtout parce qu'aucun développeur de &app; n'a accès à
Mac OSX. La version Gnome 2 de &app; (0.9.x) n'a pas été portée par le projet Fink. Vous êtes priés de contacter le projet Fink pour plus d'information.</para>
</listitem>
</varlistentry>
<varlistentry><term>Fonctionne-t'il avec KDE ? </term>
<varlistentry><term>Fonctionne-t'il avec KDE ?</term>
<listitem><para>
Oui, à condition que les librairies GNOME nécessaires soient installées.
Oui, à condition que les librairies GNOME nécessaires soient installées.
</para></listitem>
</varlistentry>
<varlistentry><term>Dois-je vraiment installer GNOME ? </term>
<listitem><para>Oui, mais il n'est pas obligatoire d'utiliser le bureau GNOME.
<varlistentry><term>Dois-je vraiment installer GNOME ?</term>
<listitem><para> Oui, mais il n'est pas obligatoire d'utiliser le bureau GNOME.
</para></listitem>
</varlistentry>
<varlistentry><term>De quelle version de GNOME ai-je besoin ? </term>
<varlistentry><term>De quelle version de GNOME ai-je besoin ?</term>
<listitem><para>
Les dernières versions de &app; (0.9.0 et suivantes) ont besoin de GNOME 2.0 ou ultérieures.
Les versions précédentes utilisaient GNOME 1.X.
Cette version de &app; exige GNOME 2,8,0 ou plus haut. Les versions précédentes des séries 1.0.x ont exigé GNOME 2,0.
</para></listitem>
</varlistentry>
<varlistentry><term>&app; est-il compatible avec
d'autres logiciels de généalogie ? </term>
<varlistentry><term>&app; est-il compatible avec d'autres logiciels de généalogie ? (GenApps)</term>
<listitem><para>
&app; fait tout ce qui est possible pour rester compatible avec
le format de données généalogique standard Gedcom. Nous avons
des filtres de lecture et d'écriture pour les fichiers Gedcom. </para>
&app; fait tout ce qui est possible pour rester compatible avec le format de données généalogique standard Gedcom. Nous avons des filtres de lecture et d'écriture pour les fichiers Gedcom. </para>
<para>
Il faut savoir que le format Gedcom est mal utilisé. Chaque logiciel
de généalogie a sa propre variante de Gedcom. Quand nous avons connaissance
d'une variante, il est très rapide de créer les filtres de lecture et d'écriture.
Par contre, trouver les variantes demande d'avoir l'information de la part
des utilisateurs. N'hésitez pas à nous signaler une variante non supportée
par &app;, nous ferons ensuite de notre mieux pour la supporter !
<para>
Il faut savoir que le format Gedcom est mal utilisé. Chaque logiciel de généalogie a sa propre variante de Gedcom. Quand nous avons connaissance d'une variante, il est très rapide de créer les filtres de lecture et d'écriture. Par contre, trouver les variantes demande d'avoir l'information de la part des
utilisateurs. N'hésitez pas à nous signaler une variante non supportée par &app;,
, nous ferons ensuite de notre mieux pour la supporter !
</para></listitem>
</varlistentry>
<varlistentry><term>&app; peut-il lire les fichiers créés par le logiciel de
généalogie SuperGenWare ? </term>
<listitem><para>Voir la question précédente.
<varlistentry><term>&app; peut-il lire des fichiers créés par GenApp X?</term>
<listitem><para> Voir ci-dessus.
</para></listitem>
</varlistentry>
<varlistentry><term>&app; peut-il écrire les fichiers lisibles par le logiciel de
généalogie SuperGenWare ?</term>
<listitem><para>Voir au-dessus..
<varlistentry><term>&app; peut-il écrire des fichiers pour GenApp X?</term>
<listitem><para> Voir ci-dessus.
</para></listitem>
</varlistentry>
<varlistentry><term>&app; peut-il imprimer mon arbre généalogique ? </term>
<varlistentry><term>&app; peut-il imprimer mon arbre généalogique?</term>
<listitem><para>
Oui. Chacun a son idée sur comment doit être dessiné un arbre généalogique.
Certains pensent qu'il faut montrer toutes les familles depuis un ancêtre lointain
jusqu'à la racine de l'arbre, d'autres qu'il faut remonter de la personne
actuelle et montrer tous ses ancêtres et leurs familles. D'autres encore
pensent à un tableau, à des éditions en mode texte... </para>
Oui. Chacun a son idée sur comment doit être dessiné un arbre généalogique. Certains pensent qu'il faut montrer toutes les familles depuis un ancêtre lointain jusqu'à la racine de l'arbre, d'autres qu'il faut remonter de la personne actuelle et montrer tous ses ancêtres et leurs familles. D'autres encore pensent à un tableau, à des éditions en mode texte.</para>
<para>
&app; peut faire tout cela, en des présentations très variées ainsi que d'autres encore.
Plus généralement, le principe de greffons (plugins) permet aux utilisateurs
et donc à vous-même, de créer vos propres greffons qui créent vos propres rapports,
états ou sorties papier pour aider vos recherches.
<para>
&app; peut faire tout cela, en des présentations très variées ainsi que d'autres encore. Plus généralement, le principe de greffons (plugins) permet aux utilisateurs et donc à vous-même, de créer vos propres greffons qui créent vos propres rapports, états ou sorties papier pour aider vos recherches.
</para></listitem>
</varlistentry>
<varlistentry><term>Quel est le format des sorties d'impression de &app; ? </term>
<varlistentry><term>Dans quels formats &app; peut-il produire ses rapports? </term>
<listitem><para>
Les sorties de texte pour impression sont disponibles dans les formats HTML, PDF, AbiWord,
KWord, LaTeX, RTF, et OpenOffice. Les impressions graphiques (dessins et diagrammes)
sont disponibles en formats PostScript, PDF, SVG, OpenOffice et GraphViz.
Les formats de texte disponibles dans les formats sont : HTML, PDF, AbiWord, KWord, LaTeX, RTF, et OpenOffice. Les impressions graphiques (dessins et diagrammes) sont disponibles en formats PostScript, PDF, SVG, OpenOffice et GraphViz.
</para></listitem>
</varlistentry>
<varlistentry><term>&app; est-il compatible avec Internet ? </term>
<listitem><para>
&app; peut garder des liens web et envoyer votre navigateur web vers eux.
Il peut importer des données que vous téléchargez depuis le Réseau. Il
peut exporter des données que vous y enverrez. Il connait les formats
de fichiers courants (JPEG, PNG et GIF pour les images, MP3, OGG et
WAV pour les sons, QuickTime, MPEG et AVI pour les video). A part cela,
il n'y a pas grand chose d'autre qu'un généalogiste puisse faire avec
Internet :-) .
</para></listitem>
</varlistentry>
<varlistentry><term>Puis-je créer une édition, un filtre ou un machin ? </term>
<listitem><para>
Oui. Il y a beaucoup de façons de personnaliser &app;. Vous pouvez
modifier ou créer les modèles d'impressions. Vous avez ainsi le contrôle des
polices de caractères, des couleurs et d'éléments de la disposition
des impressions. Vous pouvez aussi utiliser les réglages de &app;
pour choisir les informations servant à préparer l'impression.
En plus de tout cela, vous pouvez créer vos propres filtres.
Cela sert à sélectionner des individus selon vos besoins.
Vous pouvez combiner ces filtres pour constituer des filtres
plus élaborés. Enfin, vous pouvez créer vos greffons. Ils peuvent
servir à définir des rapports, des outils d'aide à la recherche
ou encore des filtres de lecture ou d'écriture de données. Cela
demande la connaissance de la programmation en Python.
</para></listitem>
</varlistentry>
<varlistentry><term>Quels standards &app; supporte-t'il ? </term>
<listitem><para>
L'amusant à propos des standards est qu'on ne risque pas d'en manquer :-).
&app; supporte les variantes suivantes de Gedcom :
GEDCOM5.5, Brother's Keeper, Family Origins, Familty Tree Maker, Ftree,
GeneWeb, Legacy, Personal Ancestral File, Pro-Gen, Reunion et
Visual Genealogie.
</para></listitem>
</varlistentry>
<varlistentry><term>Quelle est la taille maximale d'une base de données
&app; ? </term>
<listitem><para>
&app; n'a pas de limite stricte sur la taille de sa base de données.
Il y a seulement des limites pratiques. Pour le moment, &app; charge
ses données en mémoire, qui devient alors la ressource critique.
</para></listitem>
</varlistentry>
<varlistentry><term>Combien de personnes peut-on mettre dans une base
de données &app; ? </term>
<listitem><para>
Nous avons expérimenté que &app; tient jusqu'environ 15000 personnes
sur une configuration moyenne. Encore une fois, cela dépend en fait
de la taille mémoire du système.
</para></listitem>
</varlistentry>
<varlistentry><term>Pourquoi &app; est-il si lent ? </term>
<listitem><para>
Si &app; vous parait si lent, c'est probablement que vous avez une
grosse base de données. Pour le moment, &app; charge les données en
mémoire. En conséquence, les temps de réponse s'allongent pour de gros
volumes de données. En particulier, le résultat sera catastrophique
si les données de &app; occasionnent de la pagination (swap).
</para>
<para>
Ceci sera traité dans la première version stable après le version 1.0 .
En attendant, ajouter de la mémoire peut tout changer mais nous sommes
conscients que ce n'est pas la meilleure façon de traiter le problème.
Si vous souhaitez aider à l'implémentation avec une vraie base de donnée,
n'hésitez pas à nous contacter par courrier électronique à
<ulink url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink>
</para></listitem>
</varlistentry>
<varlistentry><term>Ma base de données est vraiment très grosse.
Y-a t'il un moyen de la charger sans tout charger en mémoire ? </term>
<listitem><para>
Actuellement, il n'y a pas d'autre moyen. C'est notre plus grosse
priorité après la finition de la version 1.0 . L'utilisation d'une
vraie base de données se fera dans la prochaine version stable (1.2),
qui améliorera grandement les performances, tant en vitesse
d'exécution qu'en empreinte mémoire.
</para></listitem>
</varlistentry>
<varlistentry><term>Je veux relancer le dialogue d'installation (druid). Comment fais-je ? </term>
<listitem><para>
&app; gère un état dans les données de configuration GNOME pour mémoriser le fait
que le dialogue d'installation a été exécuté. Ceci peut se faire par la commande
suivante :</para>
<para><command>gconftool-2 -u /apps/gramps/startup</command>
</para></listitem>
</varlistentry>
<varlistentry><term>Pourquoi les caractères non latins sont-ils mal
affichés dans les impressions PDF ou Postscript ? </term>
<listitem><para>
C'est un problème connu. Le Postscript (et le PDF) utilisent des
polices de caractères internes qui correspondent bien au jeu de caractère
latin-1. En principe, on pourrait utiliser n'importe quel police de caractères
mais il faudrait l'embarquer dans le fichier. C'est délicat parce que
chaque système gère à sa façon les polices et leur définition. </para>
<para>
Ce devrait être réglé quand nous serons passés avec Gnome-print.
Entre temps, une solution de contournement est de générer des éditions
en format OpenOffice.org, puis de générer le PDF depuis OpenOffice.org.
</para></listitem>
</varlistentry>
<varlistentry><term>Pourquoi ne peut-on pas ajouter, enlever ou modifier
des colonnes aux listes dans les Vues Individus et Famille ? </term>
<listitem><para>
Ceci sera traité quand l'erreur dans TreeModelSort de pygtk sera corrigée
(voir <ulink url="http://bugzilla.gnome.org/show_bug.cgi?id=125172"
type="http">http://bugzilla.gnome.org/show_bug.cgi?id=125172</ulink>
pour les détails).
Dès que la correction sera validée et mise dans pygtk, nous ajouterons
la capacité d'ajouter, retirer et éditer des colonnes avec tri.
</para></listitem>
</varlistentry>
<varlistentry><term>Je souhaiterais contribuer à &app; en écrivant
mon édition favorite. Comment fais-je ? </term>
<listitem><para>
La façon la plus simple pour écrire de nouveaux rapports, filtres
ou outils est d'en copier un qui existe déjà puis de le modifier.
Si cela vous convient, tant mieux ! Si votre idée ne rentre
dans la logique d'aucun outil existant, le <ulink
url="http://gramps.sourceforge.net/phpwiki/index.php/GrampsDevelopersPage"
type="http">lien</ulink> peut vous aider à écrire un greffon en partant de rien.
Si vous avez besoin de plus d'aide, ou si vous voulez discuter de
votre idée avec nous, n'hésitez pas à nous contacter par messagerie
électronique à <ulink
url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink>
</para>
<para>
Pour tester votre réalisation, vous pouvez sauver le greffon dans le répertoire
<replaceable>$HOME/.gramps/plugins</replaceable> où il devrait être
trouvé par &app; et chargé lors du lancement.
Un greffon bien écrit s'enregistre lui-même dans &app; et crée son
entrée dans un menu.
</para>
<para>
Si votre greffon vous satisfait et que vous voulez contribuer vers
le projet &app;, vous êtes le bienvenu : contactez-nous à
<ulink url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink>
</para></listitem>
</varlistentry>
<varlistentry><term>J'ai trouvé une erreur et je veux qu'elle soit
corrigée tout de suite ! Que puis-je faire ? </term>
<varlistentry><term>&app; est-il compatible avec Internet?</term>
<listitem><para>
La meilleure chose à faire est de corriger l'erreur, puis d'envoyer
la correction à
<ulink url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink> :-)</para>
<para>
Autrement, la meilleure chose ensuite est d'envoyer un bon
rapport d'anomalie. Ceci peut se faire de deux façons différentes :
(1) envoyez votre rapport à
<ulink url="mailto:gramps-bugs@lists.sf.net"
type="mailto">gramps-bugs@lists.sf.net</ulink>
ou (2) enregistrez votre rapport avec les système de suivi d'erreur à
<ulink url="http://sf.net/tracker/?group_id=25770" type="http">
http://sf.net/tracker/?group_id=25770&amp;atid=385137</ulink>
(cette fonction est aussi disponible en choisissant
<menuchoice><guisubmenu>Aide</guisubmenu><guimenuitem>Signaler une erreur
</guimenuitem></menuchoice> dans le menu principal de &app;). </para>
<para>Un bon rapport d'anomalie devrait comprendre : </para>
<itemizedlist>
<listitem><para>
La version de &app; que vous utilisez (disponible par l'entrée de menu
<menuchoice><guisubmenu>Aide</guisubmenu>
<guimenuitem>A propos</guimenuitem></menuchoice>).
&app; cpeut garder des liens web et envoyer votre navigateur web vers eux. Il peut importer des données que vous téléchargez depuis le Réseau. Il peut exporter des données que vous y enverrez. Il connait les formats de fichiers courants (JPEG, PNG et GIF pour les images, MP3, OGG et WAV pour les sons, QuickTime, MPEG et AVI pour les video). A part cela, il n'y a pas grand chose d'autre qu'un généalogiste puisse faire avec Internet :-) .
</para></listitem>
</varlistentry>
<listitem><para>
La langue d'utilisation de &app; (faites </para>
<para><command>echo $LANG</command></para>
<para>dans votre terminal de commande).
<varlistentry><term>Puis-je créer une édition, un filtre ou un machin ?</term>
<listitem><para>
Oui. Il y a beaucoup de façons de personnaliser &app;. Vous pouvez modifier ou créer les modèles d'impressions. Vous avez ainsi le contrôle des polices de caractères, des couleurs et d'éléments de la disposition des impressions. Vous pouvez aussi utiliser les réglages de &app;
pour choisir
les informations servant à préparer l'impression. En plus de tout cela, vous pouvez créer vos propres filtres. Cela sert à sélectionner des individus selon vos besoins. Vous pouvez combiner ces filtres pour constituer des filtres plus élaborés. Enfin, vous pouvez créer vos greffons. Ils peuvent servir à définir des rapports, des outils d'aide à la recherche ou encore des filtres de lecture ou d'écriture de données. Cela demande la connaissance de la programmation en Python.
</para></listitem>
</varlistentry>
<listitem><para>
Les symptomes indiquant que c'est effectivement une erreur.
<varlistentry><term>Quels standards &app; supporte-t'il ?</term>
<listitem><para>
L'amusant à propos des standards est qu'on ne risque pas d'en manquer :-). &app; supporte les variantes suivantes de Gedcom : GEDCOM5.5, Brother's Keeper, Family Origins, Familty Tree Maker, Ftree, GeneWeb, Legacy, Personal Ancestral File, Pro-Gen, Reunion et Visual Genealogie.
</para></listitem>
</varlistentry>
<listitem><para>
Tous les messages de trace, d'erreur ou avertissement
qui ont été affichés dans le terminal ou dans une fenêtre de trace séparée.
<varlistentry><term>Quelle est la taille maximale d'une base de données &app; ?</term>
<listitem><para>
&app; n'a pas de limite stricte sur la taille de sa base de données. Il y a seulement des limites pratiques. Pour le moment, &app;
charge ses données en mémoire, qui devient alors la ressource critique.
</para></listitem>
</varlistentry>
</itemizedlist>
<varlistentry><term>Combien de personnes peut-on mettre dans une base de données &app; ?</term>
<listitem><para>
Nous avons expérimenté que &app; tient jusqu'environ 15000 personnes sur une configuration moyenne. Encore une fois, cela dépend en fait de la taille mémoire du système
</para></listitem>
</varlistentry>
<para>La plupart des erreurs peuvent être corrigées rapidement
quand suffisamment d'information est fournie. Pour garantir
la qualité de l'information, nous vous invitons à suivre
vos rapports d'anomalie. En particulier, si vous enregistrez
un rapport sur le système de suivi sf.net bug, PAR PITIE enregistrez-vous
sur sf.net avant de soumettre votre rapport
(enregistrez-vous sur un compte libre si vous n'en avez pas encore).
Nous aurons ainsi un moyen de vous joindre si nous avons besoin de plus d'information.
Si vous préférez enregistrer un rapport de façon anonyme, au moins
surveillez souvent si votre page de rapport a quelque chose de nouveau,
comme ce sera probablement le cas. </para>
<varlistentry><term>Pourquoi &app; est-il si lent ?</term>
<listitem><para> Essayez juste la version en cours, &appversion;.
</para></listitem>
</varlistentry>
<para>Si tout cela ne vous parait pas clair, suivez
<ulink url="http://www.chiark.greenend.org.uk/~sgtatham/bugs.html"
type="http">ce lien.</ulink>
<varlistentry><term>Ma base de données est vraiment très grosse. Y-a t'il un moyen de la charger sans tout charger en mémoire ?</term>
<listitem><para>
&app; ne charge plus toutes les données en mémoire, ce qui lui permet de fonctionner avec une base de données beaucoup plus grande qu'avant.
</para></listitem>
</varlistentry>
<varlistentry><term>Je veux relancer le dialogue d'installation (assistant). Comment faire ?</term>
<listitem><para>
&app; gère un état dans les données de configuration GNOME pour mémoriser le fait que le dialogue d'installation a été exécuté. Ceci peut se faire par la commande suivante :</para>
<para><command>gconftool-2 -u /apps/gramps/behavior/startup</command>
</para></listitem>
</varlistentry>
<varlistentry><term>Pourquoi est-ce que des caractères non-latins sont montrés comme ordures dans des rapports de PDF/ps?</term>
<listitem><para> C'est une limitation des polices des formats de pdf. Pour imprimer le texte non-latin, utilisez l'impression de GNOME.</para>
</listitem>
</varlistentry>
<varlistentry><term>Pourquoi ne peut on pas modifier les colonnes dans la vue des Familles et des Individus ?</term>
<listitem><para> Maintenant vous pouvez! Essayez juste la version en cours, &appversion;.
</para></listitem>
</varlistentry>
<varlistentry><term>Je souhaiterais contribuer à &app; en écrivant mon rapport favoris. Comment faire ?</term>
<listitem><para>
La façon la plus simple pour écrire de nouveaux rapports, filtres ou outils est d'en copier un qui existe déjà puis de le modifier. Si cela vous convient, tant mieux ! Si votre idée ne rentre dans la logique d'aucun outil existant, <ulink
url="http://gramps.sourceforge.net/phpwiki/index.php/GrampsDevelopersPage"
type="http">ce lien</ulink>peut fournir de l'aide en écrivant votre propre plugin à partir de zéro. Si vous avez besoin de plus d'aide ou vous voudriez discuter de votre idée avec nous, n'hésitez à nous contacter <ulink
url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink>
</para>
<para>
Pour tester votre réalisation, vous pouvez sauver le plugin dans le répertoire
<replaceable>$HOME/.gramps/plugins</replaceable> où il devrait être trouvé par &app; et chargé lors du lancement. Un plugin bien écrit s'enregistre lui-même dans &app; et crée son entrée dans un menu.</para>
<para>
Si votre plugin vous satisfait et que vous voulez contribuer vers le projet &app;, vous êtes le bienvenu : contactez-nous à <ulink url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink>
</para></listitem>
</varlistentry>
<varlistentry><term>J'ai trouvé une erreur et je veux qu'elle soit corrigée tout de suite! Que puis-je faire ?</term>
<listitem><para>
La meilleure chose à faire est de corriger l'erreur, puis d'envoyer la correction
<ulink url="mailto:gramps-devel@lists.sf.net"
type="mailto">gramps-devel@lists.sf.net</ulink> :-)</para>
<para>Autrement, la meilleure chose ensuite est d'envoyer un bon rapport d'anomalie. Ceci peut se faire de deux façons différentes : (1) envoyez votre rapport à
<ulink url="mailto:gramps-bugs@lists.sf.net"
type="mailto">gramps-bugs@lists.sf.net</ulink>
ou (2) enregistrez votre rapport avec les système de suivi d'erreur à
<ulink url="http://sf.net/tracker/?group_id=25770" type="http">
http://sf.net/tracker/?group_id=25770&amp;atid=385137</ulink>
(cette fonction est également disponible sous
<menuchoice><guisubmenu>Aide</guisubmenu><guimenuitem>Signaler une erreur</guimenuitem></menuchoice> ans le menu principal de &app;). </para>
<para>Un bon rapport d'anomalie devrait comprendre : </para>
<itemizedlist>
<listitem><para>
La version de &app; que vous utilisez <menuchoice><guisubmenu>Aide</guisubmenu>
<guimenuitem>A propos</guimenuitem></menuchoice> menu item).
</para></listitem>
<listitem><para>
La langue d'utilisation de &app; (faites </para>
<para><command>echo $LANG</command></para>
<para>dans votre terminal).
</para></listitem>
<listitem><para>
Les symptomes indiquant que c'est effectivement une erreur.
</para></listitem>
<listitem><para>
Tous les messages de trace, d'erreur ou avertissement qui ont été affichés dans le terminal ou dans une fenêtre de trace séparée.
</para></listitem>
</itemizedlist>
<para>La plupart des erreurs peuvent être corrigées rapidement quand suffisamment d'information est fournie. Pour garantir la qualité de l'information, nous vous invitons à suivre vos rapports d'anomalie. En particulier, si vous enregistrez un rapport sur le système de suivi sf.net bug, PAR PITIE enregistrez-vous sur sf.net avant de soumettre votre rapport
(enregistrez-vous sur un compte libre si vous n'en avez pas encore). Nous aurons ainsi un moyen de vous joindre si nous avons besoin de plus d'information. Si vous préférez enregistrer un rapport de façon anonyme, au moins surveillez souvent si votre page de rapport a quelque chose de nouveau, comme ce sera probablement le cas.</para>
<para>Si tout cela ne vous parait pas clair, suivez
<ulink url="http://www.chiark.greenend.org.uk/~sgtatham/bugs.html"
type="http">ce lien.</ulink>
</para></listitem>
</varlistentry>
<varlistentry><term>Il est évident que &app; doit absolument
devenir une application (client-serveur/web/PHP/weblog/Javascript/C++/distribuée/KDE/Motif/Tcl/Win32/C#/Je-ne-sais-pas-encore-quoi).
Quand cela va-t'il se faire ? </term>
<varlistentry><term>Il est évident que &app; doit absolument devenir une application (clientserveur/ web/PHP/weblog/Javascript/C++/ distribuée/KDE/Motif/Tcl/Win32/C#/Jene- sais-pas-encore-quoi). Quand cela va-t'il se faire ?</term>
<listitem><para>
Le meilleur moyen que cela se fasse est de le faire vous-même.
Comme &app; est libre et open-source, personne ne vous interdit
de prendre tout le code et de continuer le développement dans
la direction qui vous convient. Vous devrez donner un autre nom
à votre projet pour éviter les confusions avec la suite de &app;.
Si vous voulez que le projet &app; vous fournisse des avis,
de l'expertise, des outils ou n'importe quoi, nous serons heureux
de coopérer avec votre projet, pour assurer la compatibilité
ou bien des opérations de lecture-écriture de et vers le format
de données de votre projet. </para>
Le meilleur moyen que cela se fasse est de le faire vous-même. Comme
&app; iest libre et open-source, personne ne vous interdit de prendre tout le code et de continuer le développement dans la direction qui vous convient. Vous devrez donner un autre nom à votre projet pour éviter les confusions avec la suite de &app;
development. Si vous voulez que le projet &app; pvous fournisse des avis, de l'expertise, des outils ou n'importe quoi, nous serons heureux de coopérer avec votre projet, pour assurer la compatibilité ou bien des opérations de lecture-écriture de et vers le format de données de votre projet. </para>
<para>
Cependant, si vous souhaitez que le projet &app; suive votre
stratégie, vous devrez convaincre les développeurs de &app;
que votre stratégie est bonne pour &app; et meilleure que
celle prévue. </para>
<para>
Cependant, si vous souhaitez que le projet &app; suive votre stratégie, vous devrez convaincre les développeurs de &app; que votre stratégie est bonne pour &app; et meilleure que celle prévue.</para>
<para>
TRUC : si les développeurs de &app; ne sont pas convaincus
après trois messages envoyés à gramps-devel, peut-être vous feriez mieux
d'aller seul plutôt qu'avec un groupe d'idiots qui ne
peuvent pas comprendre votre génie :-) .
<tip><para>
si les développeurs de &app; ne sont pas convaincus après trois messages envoyés à gramps-devel, peut-être vous feriez mieux d'aller seul plutôt qu'avec un groupe d'idiots qui ne peuvent pas comprendre votre génie
:-).
</para></listitem>
</para></tip></listitem>
</varlistentry>
</variablelist>
</sect2>
</appendix>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -1,376 +1,365 @@
<?xml version="1.0" encoding="UTF-8"?>
<appendix id="append-filtref">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003-2005 Alexander Roitman
This document 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 document 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$ -->
<!-- =============== Appendices Subsection ================ -->
<sect2 id="append-filtref">
<title>Documentation de référence sur les règles de filtrage</title>
<para>Cette annexe décrit les fonctions de filtrage actuellement définies
dans &app;. Ces règles sont disponibles quand vous créez des filtres
personnalisés. Elles sont ici présentées par catégories.
<title>Les règles de filtrage</title>
<para>Cette annexe décrit les fonctions de filtrage actuellement définies dans &app; (voir <xref linkend="tools-util-cfe"/>. Ces règles sont présentées ici par catégories.
</para>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="filtref-general">
<sect1 id="filtref-general">
<title>Filtres généraux</title>
<para>Cette catégorie comprend les fonctions les plus générales : </para>
<para>Cette catégorie comprend les fonctions les plus générales :</para>
<variablelist>
<varlistentry><term>A un enregistrement complet</term>
<listitem><para> Cette règle accepte toutes les personnes
dont l'enregistrement est marqué comme complet. Pour le moment,
la complétude de l'enregistrement est marquée par le chercheur
dans le dialogue <guilabel>Modifie Personne</guilabel>.
<listitem><para>
Cette règle accepte toutes les personnes dont l'enregistrement est marqué comme complet. Pour le moment, la complétude de l'enregistrement est marquée par le chercheur dans le dialogue Modifie Personne.
</para></listitem>
</varlistentry>
<varlistentry><term>Tout le monde</term>
<listitem><para> Cette fonction accepte toutes les personnes de la base de données.
Elle n'est pas très utile seule sauf pour tester. Par contre, elle
sert en combinaison avec d'autres fonctions.
<varlistentry><term>Individus ayant des noms incomplets</term>
<listitem><para> Cette règle sélectionne toutes les personnes ayant des noms incomplets.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus marqués</term>
<listitem><para> Cette règle sélectionne toutes les personnes qui sont sur la liste de signet.
</para></listitem>
</varlistentry>
<varlistentry><term>Noms qui contiennent une chaîne</term>
<listitem><para> Cette fonction sélectionne toutes les personnes
dont l'identité contient la chaîne donnée. Par exemple,
Jacques Dupont, Jean Dupond et seront sélectionnés par cette
fonction, utilisée avec la valeur "pon".
<listitem><para> Cette fonction sélectionne toutes les personnes dont l'identité contient la chaîne donnée. Par exemple, Jacques Dupont, Jean Dupond seront sélectionnés par cette fonction, utilisée avec la valeur "pon".
Des chaînes séparées peuvent être utilisées pour le prénom, le nom de famille, le suffixe et le titre. La fonction sélectionne un individu quand toutes les chaînes non vides font partie du nom d'une personne. Si vous voulez utiliser une seule valeur, laissez les autres vides.
</para></listitem>
</varlistentry>
<varlistentry><term>Tout le monde</term>
<listitem><para> Cette fonction accepte toutes les personnes de la base de données. Elle n'est pas très utile seule sauf pour tester. Par contre, elle sert en combinaison avec d'autres fonctions.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus probablement en vie</term>
<listitem><para> Cette règle sélectionne toutes les personnes dont les dates n'indiquent pas leur mort et qui ne sont pas anormalement vieilles, jugeant à leurs données disponibles de naissance et aujourd'hui.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus dont le nom contient</term>
<listitem><para>Cette règle sélectionne toute personne dont le nom contient la valeur indiquée, complètement ou en partie. Par exemple, Marta Ericsdotter sera trouvée par la règle sous-chaîne= "eric" pour le nom de famille.
</para>
<para> Des chaînes séparées peuvent être utilisées pour
le prénom, le nom de famille, le suffixe et le titre.
La fonction sélectionne un individu quand toutes les chaînes
non vides font partie du nom d'une personne. Si vous voulez
utiliser une seule valeur, laissez les autres vides.
<para>Des valeurs séparées peuvent être employées pour le nom indiqué, le nom de famille, le suffixe, et le titre. La règle est efficace si et seulement si, toutes les valeurs non vides (partiellement) sont assorties par le nom d'une personne. Pour employer juste une valeur, laissez les autres valeurs vides.
</para></listitem>
</varlistentry>
<varlistentry><term>A l'identifiant</term>
<listitem><para> Cette fonction sélectionne la personne ayant
exactement l'identifiant &app; donné.
<listitem><para> Cette fonction sélectionne la personne ayant exactement l'identifiant &app; donné.
</para>
<para> Vous pouvez entrer l'identifiant dans un champ texte,
ou bien sélectionner une personne dans la liste en cliquant le bouton
<guibutton>Select...</guibutton>. Dans ce cas, l'identifiant apparaîtra
dans le champ de saisie de texte après la sélection.
<para> Vous pouvez entrer l'identifiant dans un champ texte, ou bien sélectionner une personne dans la liste en cliquant le bouton
<guibutton>Sélectionner...</guibutton>. Dans ce cas, l'identifiant apparaîtra dans le champ de saisie de texte après la sélection.
</para></listitem>
</varlistentry>
<varlistentry><term>Est la personne de référence</term>
<listitem><para> Cette règle sélectionne la personne de référence.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus marqués comme privés</term>
<listitem><para> Cette règle sélectionne les personnes dont les informations sont marquées comme privés.
</para></listitem>
</varlistentry>
<varlistentry><term>Est une femme</term>
<listitem><para> Cette fonction sélectionne les femmes.
<listitem><para> Cette fonction sélectionne les femmes.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus qui ont des images</term>
<listitem><para> Cette règle sélectionne les personnes avec des images dans leurs galeries.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus sans date de naissance</term>
<listitem><para> Cette règle sélectionne les personnes sans date de naissance.
</para></listitem>
</varlistentry>
<varlistentry><term>Est un homme</term>
<listitem><para> Ce filtre sélectionne les hommes.
<listitem><para> Ce filtre sélectionne les hommes.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect1>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="filtref-event">
<title>Fonctions sur évènements</title>
<para>Cette catégorie regroupe les fonctions qui utilisent les évènements des personnes : </para>
<sect1 id="filtref-event">
<title> Filtres d'événements</title>
<para>Cette catégorie regroupe les fonctions qui utilisent les évènements des personnes :</para>
<variablelist>
<varlistentry><term>A la naissance</term>
<listitem><para>Cette fonction sélectionne les personnes dont
la naissance correspond aux valeurs données pour Date, Lieu, et Description.
La correspondance est faite même quand l'évènement n'est que partiellement
identique. Les correspondances sont insensibles à la casse des caractères.
Par exemple, toute personne née en France sera sélectionnée par
la valeur "fr" pour le lieu.
</para>
<para> La règle sélectionne l'entrée si et seulement si toutes les
valeurs non vides correspondent (partiellement) à la naissance
de la personne. Si vous voulez sélectionner sur un seul champ,
laissez les autres champs vides.
<listitem><para> Cette fonction sélectionne les personnes dont la naissance correspond aux valeurs données pour Date, Lieu, et Description. La correspondance est faite même quand l'évènement n'est que partiellement identique.
</para>
<para> Les
correspondances sont insensibles à la casse des caractères. Par exemple, toute personne née en France sera sélectionnée par la valeur "fr" pour le lieu. La règle sélectionne l'entrée si et seulement si toutes les valeurs non vides correspondent (partiellement) à la naissance de la personne. Si vous voulez sélectionner sur un seul champ, laissez les autres champs vides.
</para></listitem>
</varlistentry>
<varlistentry><term>A le décès</term>
<listitem><para>Cette fonction sélectionne les personnes dont
le décès correspond aux valeurs données pour Date, Lieu, et Description.
La correspondance est faite même quand l'évènement n'est que partiellement
identique. Les correspondances sont insensibles à la casse des caractères.
Par exemple, toute personne décédée en France sera sélectionnée par
la valeur "fr" pour le lieu.
<varlistentry><term>Au décès</term>
<listitem><para> Cette fonction sélectionne les personnes dont le décès correspond aux valeurs données pour Date, Lieu, et Description. La correspondance est faite même quand l'évènement n'est que partiellement identique. Les correspondances sont insensibles à la casse des caractères. Par exemple, toute personne décédée en France sera sélectionnée par la valeur "fr" pour le lieu.
</para>
<para> La règle sélectionne l'entrée si et seulement si toutes les
valeurs non vides correspondent (partiellement) à la naissance
de la personne. Si vous voulez sélectionner sur un seul champ,
laissez les autres champs vides.
<para> La règle sélectionne l'entrée si et seulement si toutes les valeurs non vides correspondent (partiellement) à la naissance de la personne. Si vous voulez sélectionner sur un seul champ, laissez les autres champs vides.
</para></listitem>
</varlistentry>
<varlistentry><term>A la source</term>
<listitem><para> Cette règle sélectionne les personnes dont les informations se rapportent à la source indiquée.
</para></listitem>
</varlistentry>
<varlistentry><term>A l'évènement personnel</term>
<listitem><para>Cette fonction sélectionne les personnes dont
un évènement personnel correspond aux valeurs données pour Date, Lieu, Type et Description.
La correspondance est faite même quand l'évènement n'est que partiellement
identique. Les correspondances sont insensibles à la casse des caractères.
Par exemple, toute personne ayant obtenu un diplômee en France sera sélectionnée par
la valeur "fr" pour le lieu.
<listitem><para> Cette fonction sélectionne les personnes dont un évènement personnel correspond aux valeurs données pour Date, Lieu, Type et Description. La correspondance est faite même quand l'évènement n'est que partiellement identique. Les correspondances sont insensibles à la casse des caractères. Par exemple, toute personne ayant obtenu un diplômee en France sera sélectionnée par la valeur "fr" pour le lieu.
</para>
<para> L'évènement personnel est sélectionné dans une liste déroulante.
La règle sélectionne l'entrée si et seulement si toutes les
valeurs non vides correspondent (partiellement) à un évènement
de la personne. Si vous voulez sélectionner sur un seul champ,
laissez les autres champs vides.
<para> L'évènement personnel est sélectionné dans une liste déroulante. La règle sélectionne l'entrée si et seulement si toutes les valeurs non vides correspondent (partiellement) à un évènement de la personne. Si vous voulez sélectionner sur un seul champ, laissez les autres champs vides.
</para></listitem>
</varlistentry>
<varlistentry><term>A l'évènement familial</term>
<listitem><para>Cette fonction sélectionne les personnes dont
un évènement familial correspond aux valeurs données pour Date, Lieu, Type et Description.
La correspondance est faite même quand l'évènement n'est que partiellement
identique. Les correspondances sont insensibles à la casse des caractères.
Par exemple, toute personne s'étant mariée en France sera sélectionnée par
la valeur Mariage pour l'évènement et "fr" pour le lieu.
<listitem><para> Cette fonction sélectionne les personnes dont un évènement familial correspond aux valeurs données pour Date, Lieu, Type et Description. La correspondance est faite même quand l'évènement n'est que partiellement identique. Les correspondances sont insensibles à la casse des caractères. Par exemple, toute personne s'étant mariée en France sera sélectionnée par la valeur Mariage pour l'évènement et "fr" pour le lieu.
</para>
<para> L'évènement familial est sélectionné dans une liste déroulante.
La règle sélectionne l'entrée si et seulement si toutes les
valeurs non vides correspondent (partiellement) à un évènement
de la famille de la personne. Si vous voulez sélectionner sur un seul champ,
laissez les autres champs vides.
<para> L'évènement familial est sélectionné dans une liste déroulante. La règle sélectionne l'entrée si et seulement si toutes les valeurs non vides correspondent (partiellement) à un évènement de la famille de la personne. Si vous voulez sélectionner sur un seul champ, laissez les autres champs vides.
</para></listitem>
</varlistentry>
<varlistentry><term>Témoin</term>
<listitem><para> Cette règle sélectionne les personnes qui sont présentes comme témoin. Si et seulement si le type d'événement (Individuel ou Familial) est indiqué, les événements de ce type seront recherchés.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus ayant des événements incomplets</term>
<listitem><para> Cette règle recherche la date ou le lieu absent dans n'importe quel événement personnel.
</para></listitem>
</varlistentry>
<varlistentry><term> Familles ayant des événements incomplets</term>
<listitem><para> Cette règle recherche la date ou le lieu absent dans n'importe quel événement familial.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect1>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="filtref-family">
<title>Filtres Familiaux</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent
les personnes d'après leurs relations familiales : </para>
<sect1 id="filtref-family">
<title>Filtres familiaux</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent les personnes d'après leurs relations familiales :</para>
<variablelist>
<varlistentry><term>Individus avec des enfants :</term>
<listitem><para> Cette règle sélectionne les personnes avec des enfants.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus avec mariages multiples</term>
<listitem><para> Cette règle sélectionne des personnes avec plus d'un conjoint.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus sans mariage</term>
<listitem><para> Cette règle sélectionne des personnes sans conjoints.
</para></listitem>
</varlistentry>
<varlistentry><term>Individus adoptés</term>
<listitem><para> Cette règle sélectionne les personnes adoptées.
</para></listitem>
</varlistentry>
<varlistentry><term>A les relations</term>
<listitem><para> Cette règle sélectionne les personnes
possédant un type de relation, sélectionné dans le menu.
On peut spécifier le nombre de relations et d'enfants en option.
<listitem><para> Cette règle sélectionne des personnes avec une relation particulière. Le nombre de relations et le nombre d'enfants peuvent être indiqués.
</para>
<para> La règle sélectionne l'entrée si et seulement si toutes les
valeurs non vides correspondent (partiellement) à un évènement
de la famille de la personne. Si vous voulez sélectionner sur un seul champ,
laissez les autres champs vides.
<para> La règle est efficace si, et seulement si, toutes les valeurs non vides (partiellement) correspondent. Pour employer juste une valeur, laissez les autres valeurs vides.
</para></listitem>
</varlistentry>
<varlistentry><term>Est l'époux(se) d'un individu résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes mariées
à une personne choisie par un filtre.
Le filtre est choisi par son nom dans un menu.
<varlistentry><term>Est le conjoint résultant du filtrage</term>
<listitem><para> Cette règle sélectionne des personnes mariées à un individu associé à un filtre. Le nom du filtre doit être choisi parmi le menu.
</para></listitem>
</varlistentry>
<varlistentry><term>Est l'enfant d'un individu résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes enfant
d'une personne choisie par un filtre.
Le filtre est choisi par son nom dans un menu.
<varlistentry><term> Est un enfant résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes pour qui l'un ou l'autre parent est associé à un filtre. Le nom du filtre doit être choisi parmi le menu.
</para></listitem>
</varlistentry>
<varlistentry><term>Est le parent d'un individu résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes parentes
(père ou mère) d'une personne choisie par un filtre.
Le filtre est choisi par son nom dans un menu.
<varlistentry><term> Est un parent résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes dont l'enfant est associé à un filtre. Le nom du filtre doit être choisi parmi le menu.
</para></listitem>
</varlistentry>
<varlistentry><term> Est un enfant résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes dont l'enfant de mêmes parents est associé à un filtre. Le nom du filtre doit être choisi parmi le menu.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect1>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="filtref-ancestral">
<title>Filtres ascendants</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent
les personnes d'après leurs relations d'ascendance avec d'autres personnes : </para>
<sect1 id="filtref-ancestral">
<title> Filtres ascendants</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent les personnes d'après leurs relations d'ascendance avec d'autres personnes :</para>
<variablelist>
<varlistentry><term>Est l'ancêtre de</term>
<listitem><para>Cette règle sélectionne les personnes ancêtres
de la personne désignée. L'option Inclusif précise
si la personne désignée est à considérer comme ancêtre
d'elle-même, ce qui est utile pour construire des éditions.
<listitem><para> Cette règle sélectionne les personnes ancêtres de la personne désignée. L'option Inclusif précise si la personne désignée est à considérer comme ancêtre d'elle-même, ce qui est utile pour construire des éditions.
</para>
<para> Vous pouvez soit saisir l'identifiant dans une zone de saisie,
soit sélectionner une personne dans la liste en cochant le bouton
<guibutton>Sélectionner...</guibutton>. Dans ce cas, son identifiant
apparaîtra dans la zone de saisie après la sélection.
<para> Vous pouvez soit saisir l'identifiant dans une zone de saisie, soit sélectionner une personne dans la liste en cochant le bouton
<guibutton>Sélectionner...</guibutton> . Dans ce cas, son identifiant apparaîtra dans la zone de saisie après la sélection.
</para></listitem>
</varlistentry>
<varlistentry><term>Est l'ascendant d'un individu sur au moins N générations</term>
<listitem><para>Cette règle sélectionne les personnes ancêtres
de la personne désignée à au moins N générations d'écart.
Par exemple, un écart de 2 sélectionnera les grands-parents, les
arrière-grands-parents..., mais pas les parents de la personnes
désignée.
<listitem><para> Cette règle sélectionne les personnes ancêtres de la personne désignée à au moins N générations d'écart. Par exemple, un écart de 2 sélectionnera les grands-parents, les arrière-grands-parents..., mais pas les parents de la
personnes désignée.
</para></listitem>
</varlistentry>
<varlistentry><term>Est l'ascendant d'un individu sur moins de N générations</term>
<listitem><para>Cette règle sélectionne les personnes ancêtres
de la personne désignée à au plus N générations d'écart.
Par exemple, un écart de 2 sélectionnera les parents et les grands-parents,
mais pas les arrière-grands-parents... de la personnes
désignée.
</para></listitem>
<listitem><para> Cette règle sélectionne les personnes ancêtres de la personne désignée à au plus N générations d'écart. Par exemple, un écart de 2 sélectionnera les parents et les grands-parents, mais pas les arrière-grands-parents... de la personnes désignée.
</para></listitem>
</varlistentry>
<varlistentry><term>A un ancêtre commun avec</term>
<listitem><para> Cette règle sélectionne les personnes qui ont un ancêtre
commun avec la personne désignée.
<listitem><para> Cette règle sélectionne les personnes qui ont un ancêtre commun avec la personne désignée.
</para></listitem>
</varlistentry>
<varlistentry><term>A un ascendant commun avec les individus résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes qui ont un ancêtre
commun avec les personnes sélectionnées par un filtre.
Le filtre est choisi par son nom dans un menu.
<listitem><para> Cette règle sélectionne les personnes qui ont un ancêtre commun avec les personnes sélectionnées par un filtre. Le filtre est choisi par son nom dans un menu.
</para></listitem>
</varlistentry>
<varlistentry><term>Est l'ascendant d'un individu résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes qui sont ancêtres
d'une des personnes sélectionnées par un filtre.
Le filtre est choisi par son nom dans un menu.
</para></listitem>
<listitem><para> Cette règle sélectionne les personnes qui sont ancêtres d'une des personnes sélectionnées par un filtre. Le filtre est choisi par son nom dans un menu.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect1>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="filtref-descendant">
<title>Filtres des Descendants</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent
les personnes d'après leurs relations de descendance avec d'autres personnes : </para>
<sect1 id="filtref-descendant">
<title>Filtres descendants</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent les personnes d'après leurs relations de descendance avec d'autres personnes :</para>
<variablelist>
<varlistentry><term>Est descendant(e) de</term>
<listitem><para>Cette règle sélectionne les personnes qui descendent
de la personne désignée. L'option Inclusif précise
si la personne désignée est à considérer comme descendant
d'elle-même, ce qui est utile pour construire des éditions.
<listitem><para> Cette règle sélectionne les personnes qui descendent de la personne désignée. L'option Inclusif précise si la personne désignée est à considérer comme descendant d'elle-même, ce qui est utile pour construire des rapports.
</para>
<para> Vous pouvez soit saisir l'identifiant dans une zone de saisie,
soit sélectionner une personne dans la liste en cochant le bouton
<guibutton>Sélectionner...</guibutton>. Dans ce cas, son identifiant
apparaîtra dans la zone de saisie après la sélection.
<para> Vous pouvez soit saisir l'identifiant dans une zone de saisie, soit sélectionner une personne dans la liste en cochant le bouton
<guibutton>Sélectionner...</guibutton>.Dans ce cas, son identifiant apparaîtra dans la zone de saisie après la sélection.
</para></listitem>
</varlistentry>
<varlistentry><term>Est descendant d'un individu sur au moins N générations</term>
<listitem><para>Cette règle sélectionne les personnes qui descendent
de la personne désignée à au moins N générations d'écart.
Par exemple, un écart de 2 sélectionnera les petits-enfants, les
arrière-petits-enfants..., mais pas les enfants de la personnes
désignée.
<listitem><para> Cette règle sélectionne les personnes qui descendent de la personne désignée à au moins N générations d'écart. Par exemple, un écart de 2 sélectionnera les petits-enfants, les arrière-petits-enfants..., mais pas les enfants de la personnes désignée.
</para></listitem>
</varlistentry>
<varlistentry><term>Est descendant d'un individu sur moins de N générations</term>
<listitem><para>Cette règle sélectionne les personnes qui descendent
de la personne désignée à au plus N générations d'écart.
Par exemple, un écart de 2 sélectionnera les enfants et les petits-enfants,
mais pas les arrière-petits-enfants... de la personnes
désignée.
<listitem><para> Cette règle sélectionne les personnes qui descendent de la personne désignée à au plus N générations d'écart. Par exemple, un écart de 2 sélectionnera les enfants et les petits-enfants, mais pas les arrière-petits-enfants... de la personnes désignée.
</para></listitem>
</varlistentry>
<varlistentry><term>Est descendant d'un individu résultant du filtrage</term>
<listitem><para> Cette règle sélectionne les personnes qui descendent
d'une des personnes sélectionnées par un filtre.
Le filtre est choisi par son nom dans un menu.
</para></listitem>
<listitem><para> Cette règle sélectionne les personnes qui descendent d'une des personnes sélectionnées par un filtre. Le filtre est choisi par son nom dans un menu.
</para></listitem>
</varlistentry>
<varlistentry><term>Est un membre de la famille descendante de</term>
<listitem><para> Cette règle sélectione en plus des descendants directs
de la personne désignée, ceux des époux(ses) des descendants directs.
<listitem><para> Cette règle sélectione en plus des descendants directs de la personne désignée, ceux des époux(ses) des descendants directs.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect1>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="filtref-relat">
<title>Filtres relationnels</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent
les personnes d'après leurs relations : </para>
<sect1 id="filtref-relat">
<title> Filtres relationnels</title>
<para>Cette catégorie comprend les règles suivantes qui sélectionnent les personnes d'après leurs relations :
</para>
<variablelist>
<varlistentry><term>Relation entre deux individus</term>
<listitem><para> Cette règle sélectionne les ancêtres des deux personnes
jusqu'à leur ancêtre commun s'il existe. Ceci donne la
&quot;liaison relationnelle&quot; entre ces individus à travers leur(s)
ancêtre(s) commun(s).
</para>
<para> Vous pouvez soit saisir l'identifiant des personnes dans une zone de saisie,
soit les sélectionner dans la liste en cochant leur bouton
<guibutton>Sélectionner...</guibutton>. Dans ce cas, l'identifiant
apparaîtra dans la zone de saisie après la sélection.
<listitem><para> Cette règle sélectionne les ancêtres des deux personnes jusqu'à leur ancêtre commun s'il existe. Ceci donne la "liaison relationnelle" entre ces individus à travers leur(s) ancêtre(s) commun(s).
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<para> Vous pouvez soit saisir l'identifiant des personnes dans une zone de saisie, soit les sélectionner dans la liste en cochant leur bouton <guibutton>Sélectionner...</guibutton>.Dans ce cas, l'identifiant apparaîtra dans la zone de saisie après la sélection.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect1>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="filtref-misc">
<title>Filtres divers</title>
<para>Cette catégorie comprend les règles suivantes qui n'appartiennent
pas à une autre catégorie : </para>
<sect1 id="filtref-misc">
<title> Filtres divers</title>
<para>Cette catégorie comprend les règles suivantes qui n'appartiennent pas aux autres catégories :</para>
<variablelist>
<varlistentry><term>A l'attribut individuel</term>
<listitem><para> Cette règle sélectionne les personnes
qui ont l'attribut individuel avec une valeur donnée.
L'attribut sur lequel porte la sélection est choisi dans un menu déroulant.
La valeur désirée pour cet attribut est saisie dans une zone de texte.
<listitem><para> Cette règle sélectionne les personnes qui ont l'attribut individuel avec une valeur donnée. L'attribut sur lequel porte la sélection est choisi dans un menu déroulant. La valeur désirée pour cet attribut est saisie dans une zone de texte.
</para></listitem>
</varlistentry>
<varlistentry><term>A l'attribut familial</term>
<listitem><para> Cette règle sélectionne les personnes
qui ont l'attribut familial avec une valeur donnée.
L'attribut sur lequel porte la sélection est choisi dans un menu déroulant.
La valeur désirée pour cet attribut est saisie dans une zone de texte.
<listitem><para> Cette règle sélectionne les personnes qui ont l'attribut familial avec une valeur donnée. L'attribut sur lequel porte la sélection est choisi dans un menu déroulant. La valeur désirée pour cet attribut est saisie dans une zone de texte.
</para></listitem>
</varlistentry>
<varlistentry><term>Correspond au filtre suivant</term>
<listitem><para> Cette règle sélectionne les personnes par un filtre.
Le filtre est choisi par son nom dans un menu.
<listitem><para> Cette règle sélectionne les personnes par un filtre. Le filtre est choisi par son nom dans un menu.
</para></listitem>
</varlistentry>
</variablelist>
</sect3>
</sect1>
</sect2>
</appendix>

View File

@ -1,33 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter id="gramps-getting-started">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
Copyright (C) 2003-2005 Alexander Roitman
This document 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 document 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$ -->
<!-- =========== Getting Started ============================== -->
<sect1 id="gramps-getting-started">
<title>Initiation</title>
<title>Commencer</title>
<para>Ce chapitre fournit les informations les plus basiques sur &app;.</para>
<!-- ================ Getting Started Subsection ====== -->
<sect2 id="gramps-start">
<title>Pour lancer gramps</title>
<sect1 id="gramps-start">
<title>Pour Lancer &app;</title>
<para>Vous pouvez lancer &app; comme suit :</para>
<variablelist>
<varlistentry>
<term><guimenu>Applications</guimenu> menu</term>
<listitem><para>Choisissez <menuchoice><guisubmenu>Autres</guisubmenu>
<listitem><para>Les menus peuvent changer selon votre distribution. Pour le bureau GNOME par défaut,
<menuchoice><guisubmenu>Autre</guisubmenu>
<guimenuitem>Gramps</guimenuitem></menuchoice>. </para></listitem>
</varlistentry>
<varlistentry>
@ -35,63 +43,56 @@
<listitem><para>Pour lancer &app; en ligne de commande, entrez
<command>gramps</command>, puis <keycap>Entrée</keycap>.</para>
<para>Si vous voulez que &app; ouvre un ensemble de données
lors de son lancement, spécifiez le fichier au lancement comme argument
de la ligne de commande :</para>
<para>Si vous voulez que &app; ouvre un ensemble de données lors de son lancement, spécifiez le fichier au lancement comme argument de la ligne de commande :</para>
<para>
<command>gramps -i</command> <replaceable>chemin.ged</replaceable>
<command>gramps</command> <filename>nom_du_fichier.grdb</filename>
</para>
<para><replaceable>chemin.ged</replaceable> est le nom du fichier
que vous voulez ouvrir ou importer. La documentation de référence
des options en ligne de commande est dans <xref linkend="append-cmdline"/>.
<para>ou <filename>nom_du_fichier.grdb</filename> est le nom du fichier que vous voulez ouvrir ou importer. La documentation de référence des options en ligne de commande est dans <xref linkend="append-cmdline"/>.
</para></listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>
<!-- ================ Getting Started Subsection ==== -->
<sect2 id="run-1st-time">
<title>La première utilisation de gramps</title>
<sect1 id="run-1st-time">
<title> La première utilisation de &app;</title>
<para>
La première fois que vous l'utilisez, GRAMPS affiche un
dialogue de premier lancement. Suivez les directives qui vous guident
à travers les sections
<guilabel>Informations sur le chercheur</guilabel>, <guilabel>Formats de dates
numériques</guilabel>, <guilabel>Utilisation d'autres calendriers</guilabel>,
et <guilabel>extensions LDS</guilabel> . La plupart de ces dialogues
sont simples et ne seront pas décrits ici.
La première fois que vous l'utilisez, &app; affiche un dialogue de premier lancement.
Suivez les directives qui vous guident à travers les sections
<guilabel>Informations sur le chercheur</guilabel>, <guilabel>Formats de dates numériques</guilabel>,
<guilabel>Utilisation d'autres calendriers</guilabel>,
et <guilabel>extensions LDS</guilabel> La plupart de ces dialogues sont simples et ne seront pas décrits ici.
</para>
<!-- ==== Figure: Getting Started Druid Window ==== -->
<figure id="druid-fig">
<title>Dialogue de premier lancement : Informations sur le chercheur en généalogie</title>
<title>Dialogue de premier lancement : Informations sur le chercheur</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/researcher.png" format="PNG"/></imageobject>
<textobject>
<phrase>Affiche le dialogue d'information sur le chercheur en généalogie. </phrase>
<phrase>La fenêtre d'informations sur le chercheur</phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>Saisissez vos informations personnelles dans les champs
de texte. &app; vous demande ces données uniquement pour pouvoir créer
des fichiers Gedcom valides. Ceux-ci décrivent le créateur du fichier.
Si vous le souhaitez, vous pouvez tout laisser à blanc mais les fichiers
Gedcom créés seront alors incorrects.
<para>Saisissez vos informations personnelles dans les champs de texte.
&app; vous demande ces données uniquement pour pouvoir créer des fichiers Gedcom valides.
Ceux-ci décrivent le créateur du fichier.
Si vous le souhaitez, vous pouvez tout laisser en blanc mais les fichiers Gedcom créés seront
alors incorrects.
</para>
<para>Ces informations peuvent être saisies plus tard dans le dialogue
<guilabel>Préférences</guilabel>, dans la catégorie
<guilabel>Usage</guilabel> , sous le choix
<guilabel>Recherche d'information/Information sur le chercheur en généalogie</guilabel>.
</para></sect2>
<para>Ces informations peuvent être saisies plus tard dans le
dialogue <guilabel>Préférences</guilabel> / <guilabel>chercheur</guilabel>.
</para>
<!-- ================ Getting Started Sub-section -->
<sect2 id="choose-db-start">
<title>Choix d'une banque de données au démarrage</title>
<para>Si &app; est lancé sans base de données à ouvrir,
le dialogue suivant s'ouvrira pour vous le demander.</para>
</sect1>
<!-- ================ Getting Started Subsection -->
<sect1 id="choose-db-start">
<title> Choix d'une base de données au démarrage</title>
<para>Si &app; est lancé sans base de données à ouvrir, le dialogue suivant s'ouvrira pour vous le demander.</para>
<!-- ==== Figure: Open existing/new database window ==== -->
<figure id="first-open">
@ -99,107 +100,58 @@
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/first-open.png" format="PNG"/></imageobject>
<textobject>
<phrase>Présente le dialogue d'ouverture d'une base de données. </phrase>
<phrase>L'ouverture d'une base de données</phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>Si vous voulez ouvrir une base existante, cochez le bouton radio du haut
puis le bouton <guibutton>OK</guibutton> . Il vous sera alors demandé le nom
d'une base existante à ouvrir. Au contraire, si vous voulez partir en créant
une base vide, sélectionnez Créer une nouvelle base XML. </para>
<para>Si vous voulez ouvrir une base existante, cochez le bouton radio du haut puis le bouton OK . Il vous sera alors demandé le nom d'une base existante à ouvrir. Au contraire, si vous voulez partir en créant une base vide, sélectionnez Créer une nouvelle base</para>
<para>NOTE : quand vous partez avec une base de données nouvelle, vous devez
choisir un <replaceable>REPERTOIRE</replaceable> vide et
<replaceable>NON UN FICHIER</replaceable>. Cela créera un répertoire vide
si besoin est. Le répertoire que vous donnez servira à &app; pour ranger
le fichier de données <replaceable>data.gramps</replaceable> et éventuellement les
copies des objets multimedia. Ce répertoire sera mis à jour par &app;
lors de chaque sauvegarde de la base de données. </para>
<note id="file-notdir-note">
<title>Choix du fichier</title>
<para>
À la différence de la version 1.0.X de &app;, cette version n'exige pas de choisir un dossier pour la base de données. Choisissez juste un Nom de fichier, comme dans n'importe quelle autre application.
</para>
</note>
<para>NOTE : quand vous ouvrez une base de données existantes, spécifiez
un <replaceable>REPERTOIRE</replaceable> et
<replaceable>NON UN FICHIER</replaceable>. Le répertoire que vous voulez
ouvrir doit contenir le fichier de données <replaceable>data.gramps</replaceable>
et éventuellement les copies d'objets multimedia. Un tel répertoire est créé
par &app; quand vous créez une base vide et est mis à jour lors de chaque
sauvegarde. </para>
</sect2>
</sect1>
<!-- ================ Getting Started Sub-subsection -->
<!--
<sect3 id="zodb-support">
<title>Support optionnel du format ZODB</title>
<para>Dans le cas où StandaloneZODB ou bien Zope sont installés sur votre système,
&app; vous proposera en plus la possibilité de créer une base ZODB nouvelle.
Vous pouvez alors choisir de créer une base nouvelle au format XML ou ZODB.
Chaque format a ses avantages et ses inconvénients. </para>
<para>XML signifie eXtensible Markup Language et conserve les données
dans une forme structurée, lisible en clair. En cas de besoin, il peut être
facilement analysé par d'autres programmes. Il ne conserve que les données
"pures" (sans index par exemple). Son point faible est le coût de
traitement plus lourd de gros fichiers de données. </para>
<para>ZODB signifie "Zope Object Database" et fournit toutes les capacités
d'une base de données. Les fichiers ZODB ne peuvent être lus simplement.
Ils comprennent des données supplémentaires pour mieux traiter de grandes
quantités de données. ZODB est nettement plus rapide pour
des ensembles de données de plusieurs milliers de personnes. </para>
<para>Dire quel format de données est le meilleur est difficile dans l'absolu.
Si vous commencez vos recherches, une base XML vous conviendra probablement.
Par contre, si vous avez des milliers de personnes dans vos données, vous serez
probablement mieux servis avec ZODB. </para>
</sect3>
</sect2>
-->
<!-- ================ Getting Started Subsection ==== -->
<sect2 id="get-help">
<title>Avoir de l'aide</title>
<para> Les possibilités suivantes vous sont toujours accessibles à partir du menu
<menuchoice><guimenu>Aide</guimenu></menuchoice> : </para>
<sect1 id="get-help">
<title> Obtenir de l'Aide</title>
<para> Les possibilités suivantes vous sont toujours accessibles à partir du menu <menuchoice><guimenu>Aide</guimenu></menuchoice></para>
<variablelist>
<varlistentry><term>Manuel utilisateur</term>
<listitem><para> Ce choix vous permet de lire ce manuel dans le navigateur
d'aide. </para></listitem>
<listitem><para> Ce choix vous permet de lire ce manuel dans le navigateur d'aide.</para></listitem>
</varlistentry>
<varlistentry><term>FAQ</term>
<listitem><para> Ce choix vous donne accès à la Foire Aux Questions
de &app; dans le navigateur web. </para></listitem>
</varlistentry>
<varlistentry><term>GRAMPS page d'accueil</term>
<listitem><para> Ce choix ouvre la page d'accueil de &app; dans votre navigateur
web. </para></listitem>
<varlistentry><term>FAQ</term>
<listitem><para> Ce choix vous donne accès à la Foire Aux Questions de &app; dans le navigateur web.</para></listitem>
</varlistentry>
<varlistentry><term>Listes de diffusion GRAMPS</term>
<listitem><para> Ce choix envoie votre navigateur web vers les archives
des listes de diffusion de &app; . </para></listitem>
<varlistentry><term>La page d'accueil de &app;</term>
<listitem><para> Ce choix ouvre la page d'accueil de &app; dans votre navigateur web.</para></listitem>
</varlistentry>
<varlistentry><term>Rapporter une anomalie</term>
<listitem><para> Ce choix vous permet d'enregistrer un rapport d'anomalie sur &app;
dans le système de suivi d'anomalies. </para></listitem>
<varlistentry><term>Listes de diffusion &app;</term>
<listitem><para> Ce choix envoie votre navigateur web vers les archives des listes de diffusion de &app; .</para></listitem>
</varlistentry>
<varlistentry><term>Lister les greffons</term>
<listitem><para> Ce choix liste les greffons chargés par &app;. </para></listitem>
<varlistentry><term>Rapporter une erreur</term>
<listitem><para> Ce choix vous permet d'enregistrer un rapport d'anomalie sur &app; dans le système de suivi d'anomalies.</para></listitem>
</varlistentry>
<varlistentry><term>Montrez le statut plugin </term>
<listitem><para> Employez cet article pour montrer le statut de plugins chargés.</para></listitem>
</varlistentry>
<varlistentry><term>Ouvrir une base exemple</term>
<listitem><para> Ce choix ouvre la base de données exemple installée avec
&app;. Elle décrit des personnes fictives et sert à apprendre à utiliser
&app;. </para></listitem>
<listitem><para> Ce choix ouvre la base de données exemple installée avec &app;. Elle décrit des personnes fictives et sert à apprendre à utiliser &app;.</para></listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>
</sect1> <!-- ================ End Getting Started ======================== -->
</chapter>

View File

@ -1,24 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0"?>
<?yelp:chunk-depth 3?>
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Copyright (C) 2003-2005 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
This document 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 document 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$ -->
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!-- Information about the entities
The legal.xml file contains legal information, there is no need to edit the file.
Use the appversion entity to specify the version of the application.
Use the manrevision entity to specify the revision number of this manual.
Use the date entity to specify the release date of this manual.
Use the app entity to specify the name of the application. -->
<!ENTITY legal SYSTEM "legal.xml">
<!ENTITY appversion "2.0.0">
<!ENTITY manrevision "2.6">
<!ENTITY date "May 2005">
<!ENTITY app "GRAMPS">
<!-- The rest of the entities is simply the chapters of the manual.. -->
<!ENTITY preface SYSTEM "preface.xml">
<!ENTITY getstart SYSTEM "getstart.xml">
<!ENTITY mainwin SYSTEM "mainwin.xml">
<!ENTITY usage SYSTEM "usage.xml">
@ -27,16 +50,8 @@
<!ENTITY keybind SYSTEM "keybind.xml">
<!ENTITY filtref SYSTEM "filtref.xml">
<!ENTITY cmdline SYSTEM "cmdline.xml">
<!ENTITY appversion "1.0.0">
<!ENTITY manrevision "2.5">
<!ENTITY date "February 2004">
<!ENTITY app "<application>GRAMPS</application>">
<!-- Information about the entities
The legal.xml file contains legal information, there is no need to edit the file.
Use the appversion entity to specify the version of the application.
Use the manrevision entity to specify the revision number of this manual.
Use the date entity to specify the release date of this manual.
Use the app entity to specify the name of the application. -->
<!ENTITY bugs SYSTEM "bugs.xml">
<!ENTITY authors SYSTEM "authors.xml">
]>
<!--
(Do not remove this comment block.)
@ -46,30 +61,31 @@
Template last modified Apr 11, 2002
-->
<!-- =============Document Header ============================= -->
<article id="index" lang="fr">
<book id="index" lang="fr">
<!-- please do not change the id; for translations, change lang to -->
<!-- appropriate code -->
<articleinfo>
<title>gramps Manuel V&manrevision;</title>
<bookinfo>
<title>GRAMPS Manual V&manrevision;</title>
<copyright> <year>2001</year> <holder>Donald N. Allingham</holder> </copyright>
<copyright> <year>2003-2004</year> <holder>Alex Roitman</holder> </copyright>
<copyright> <year>2003-2005</year> <holder>Alex Roitman</holder> </copyright>
<!-- translators: uncomment this:
<copyright>
<year>2003-2004</year>
<holder>Michel Guitel (french translation)</holder>
<year>2002</year>
<holder>ME-THE-TRANSLATOR (Latin translation)</holder>
</copyright>
-->
<!-- An address can be added to the publisher information. If a role is
not specified, the publisher/author is the same for all versions of the
document. -->
<publisher> <publishername> GRAMPS Project </publishername> </publisher>
&legal;
<!-- This file contains link to license for the documentation (GNU FDL), and
other legal stuff such as "NO WARRANTY" statement. Please do not change
any of this. -->
<!-- This file contains link to license for the documentation (GNU GPL), and
other legal stuff such as "NO WARRANTY" statement. -->
<authorgroup>
<author>
@ -77,7 +93,7 @@
<surname>Roitman</surname>
<affiliation>
<orgname>GRAMPS Project</orgname>
<address> <email>shura@alex.neuro.umn.edu</email> </address>
<address> <email>shura@gramps-project.org</email> </address>
</affiliation>
</author>
<author>
@ -85,27 +101,26 @@
<surname>Allingham</surname>
<affiliation>
<orgname>GRAMPS Project</orgname>
<address> <email>dallingham@users.sourceforge.net</email> </address>
<address> <email>don@gramps-project.org</email> </address>
</affiliation>
</author>
<!-- This is appropriate place for other contributors: translators,
maintainers, etc. Commented out by default.
-->
<othercredit role="translator">
<firstname>Michel</firstname>
<surname>Guitel</surname>
<firstname>Latin</firstname>
<surname>Translator 1</surname>
<affiliation>
<orgname>French Translation Team</orgname>
<address> <email>michel.guitel@free.fr</email> </address>
<orgname>Latin Translation Team</orgname>
<address> <email>translator@gnome.org</email> </address>
</affiliation>
<contrib>French translation</contrib>
<contrib>Latin translation</contrib>
</othercredit>
<!--
-->
</authorgroup>
<!-- According to GNU FDL, revision history is mandatory if you are -->
<!-- According to GNU GPL, revision history is mandatory if you are -->
<!-- modifying/reusing someone else's document. If not, you can omit it. -->
<!-- Remember to remove the &manrevision; entity from the revision entries other
-->
@ -124,7 +139,16 @@
<date>&date;</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@alex.neuro.umn.edu</email></para>
<email>shura@gramps-project.org</email></para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
</revision>
<revision>
<revnumber>GRAMPS Manual V2.5</revnumber>
<date>February 2004</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@gramps-project.org</email></para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
</revision>
@ -133,25 +157,25 @@
<date>December 2003</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@alex.neuro.umn.edu</email></para>
<email>shura@gramps-project.org</email></para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
</revision>
<revision>
<revnumber>GRAMPS Manual V2.3</revnumber>
<date>September 2003</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@gramps-project.org</email></para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
</revision>
<revision>
<revnumber>GRAMPS Manual V2.3</revnumber>
<date>September 2003</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@alex.neuro.umn.edu</email></para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
</revision>
<revision>
<revnumber>GRAMPS Manual V2.2</revnumber>
<date>July 2003</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@alex.neuro.umn.edu</email></para>
<email>shura@gramps-project.org</email></para>
<para role="author">Donald A. Peterson
<email>dpeterson@sigmaxi.org</email></para>
<para role="publisher">GRAMPS Project</para>
@ -162,7 +186,7 @@
<date>May 2003</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@alex.neuro.umn.edu</email>
<email>shura@gramps-project.org</email>
</para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
@ -172,7 +196,7 @@
<date>April 2003</date>
<revdescription>
<para role="author">Alex Roitman
<email>shura@alex.neuro.umn.edu</email>
<email>shura@gramps-project.org</email>
</para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
@ -182,7 +206,7 @@
<date>2001</date>
<revdescription>
<para role="author">Donald N. Allingham
<email>dallingham@users.sourceforge.net</email>
<email>don@gramps-project.org</email>
</para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
@ -192,137 +216,44 @@
<date>2001</date>
<revdescription>
<para role="author">Donald N. Allingham
<email>dallingham@users.sourceforge.net</email>
<email>don@gramps-project.org</email>
</para>
<para role="publisher">GRAMPS Project</para>
</revdescription>
</revision>
</revhistory>
<releaseinfo>This manual describes version &appversion; of GRAMPS.
<releaseinfo>Ce manuel décrit la version &appversion; de GRAMPS.
</releaseinfo>
<legalnotice>
<title>Feedback</title>
<para>To report a bug or make a suggestion regarding the &app; application or
this manual, follow the directions in the <ulink url="ghelp:gnome-feedback"
type="help">GNOME Feedback Page</ulink>.
</para>
<!-- Translators may also add here feedback address for translations -->
<title>Signalements</title>
<para>Pour signaler une erreur ou faire une suggestion sur &app;
ou sur ce manuel, allez à la <ulink url="ghelp:gnome-feedback"
type="help">Page GNOME</ulink>.
</para>
</legalnotice>
</articleinfo>
<indexterm zone="index"> <primary>GRAMPS</primary> </indexterm>
<indexterm zone="index"> <primary>gramps</primary> </indexterm>
<!-- ============= Document Body ============================= -->
<!-- ============= Introduction ============================== -->
<sect1 id="gramps-intro">
<title>Introduction</title>
<para> &app; est une application de généalogie.
&app; est l'acronyme pour
Genealogical Research and Analysis Management Programming System
(Systeme de Programmation pour Recherche, Analyse et Gestion de données généalogiques).
En bref, il vous permet de conserver, modifier et chercher des données de généalogie
à l'aide d'un ordinateur. Il est semblable à d'autres programmes de généalogie
mais il offre en plus des possibilités qui lui sont uniques. </para>
<sect2 id="why-gramps">
<title>Pourquoi gramps? </title>
<para> &app; a été pensé avec l'idée que la plupart des logiciels
de généalogie permettent de saisir des données. Ils suivent en général
le modèle de données standard Gedcom. Habituellement, on peut afficher
des arbres ascendants ou descendants sur l'écran ou bien les imprimer.
On peut ajouter des images aux données. On peut souvent saisir des
informations sur des personnes ou des familles non obligatoirement
liées avec l'objet de la recherche. D'autres extensions portent sur
l'importation ou l'exportation de données ainsi que sur les impressions
d'états. </para>
<para> &app; cherche à fournir toutes les fonctions
communes de ces logiciels et aussi la capacité d'intégrer des informations
éparses directement, puis de traiter/réorganiser
n'importe quel évènement et/ou donnée dans toute la base de données,
pour aider l'utilisateur dans ses recherches, analyses, recoupements
et éventuellement mises en relation de données. En bref, cet outil
traite toutes les données en un lieu unique avec l'aide de l'ordinateur,
en remplaçant le crayon et les montagnes de papier. </para>
</sect2>
</sect1> <!-- ================ End Intro ================================ -->
&getstart; <!-- Getting Started -->
&mainwin; <!-- Main window -->
&usage; <!-- Usage -->
&custom; <!-- Customization -->
<!-- ============= Bugs ================================== -->
<!-- This section is optional and is commented out by default.
You can use it to describe known bugs and limitations of the
program if there are any - please be frank and list all
problems you know of.
-->
<sect1 id="mayapp-bugs">
<title>Erreurs connues, limitations</title>
<para>Pour le moment, &app; charge toutes ses données en mémoire ce qui
charge lourdement le système quand la base de données est très grande
(au dessus de 15000 individus sur une configuration moyenne).
Ceci sera traité dans la version 1.2 par l'utilisation d'une base de données
intégrée. L'utilisation mémoire comme les performances seront grandement améliorées. </para>
<para>L'envoi direct sur une imprimante n'est pas supporté.
Il est prévu de corriger celà après la version stable 1.0 par le recours
à l'architecture gnome-print.</para>
<para>Les impressions PS et PDF génèrent des caractères erronés à la
place des caractères Unicode. gnome-print devrait aussi régler ce problème.
En attendant, la solution est de produire des états au format
OpenOffice.org puis de les convertir en PDF avec OpenOffice.</para>
</sect1>
<!-- ============= About ================================== -->
<!-- This section contains info about the program (not docs), such as
author's name(s), web page, license, feedback address. This
section is optional: primary place for this info is "About.." box of
the program. However, if you do wish to include this info in the
manual, this is the place to put it.
Alternatively, you can put this information in the title page.-->
<sect1 id="gramps-about">
<title>A propos de gramps</title>
<para> &app; est écrit par Donald N. Allingham
(<email>dallingham@users.sourceforge.net</email>).
Si vous cherchez plus d'information sur &app;, allez à l'URL de la
<ulink url="http://gramps.sourceforge.net" type="http">Page Web du
Projet GRAMPS</ulink>. </para>
<title>Retour</title>
<para>
Si vous désirez signaler une erreur du programme, ou faire une suggestion
à propos du programme ou du manuel, utilisez le menu d'aide
de &app; ou suivez le lien
<ulink url="ghelp:gnome-feedback" type="help">suggestions</ulink>.
Pour rapporter un bug ou faire une suggestion concernant cette application ou ce manuel, employer le menu d'aide de GRAMPS, ou <ulink url="http://gramps-project.org/index.php?module=pagemaster&amp;PAGE_user_op=view_page&amp;PAGE_id=3"
type="http">ce lien</ulink>.
</para>
<para> This program is distributed 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. A copy of this license can be found at this
<ulink url="ghelp:gpl" type="help">link</ulink>, or in the file
COPYING included with the source code of this program. </para>
<!-- Translators may also add here feedback address for translations -->
</legalnotice>
</bookinfo>
</sect1> <!-- ============= End About ============================= -->
<!-- ============= Document Body ============================= -->
<!-- ============= Appendices ================================== -->
<sect1 id="appendices">
<title>Appendices</title>
&faq; <!-- FAQ -->
&keybind; <!-- Keybindings reference -->
&filtref; <!-- Filter rule reference -->
&cmdline; <!-- Command line reference -->
<!-- Preface -->
&preface;
<!-- Regular chapters -->
&getstart; <!-- Getting Started -->
&mainwin; <!-- Main window -->
&usage; <!-- Usage -->
&custom; <!-- Customization -->
<!-- Appendices -->
&faq; <!-- FAQ -->
&keybind; <!-- Keybindings reference -->
&filtref; <!-- Filter rule reference -->
&cmdline; <!-- Command line reference -->
&bugs; <!-- Bugs and problems -->
&authors; <!-- About authors -->
</sect1>
</article>
</book>

View File

@ -1,32 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<appendix id="append-keybind">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Copyright (C) 2003-2005 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
This document 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 document 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$ -->
<!-- =============== Appendices Subsection ================ -->
<sect2 id="append-keybind">
<title>Manuel de référence des commandes au clavier</title>
<para>Cette annexe décrit les commandes clavier qui ne sont pas
affichées dans les menus de &app;.
<title>Commandes Clavier</title>
<para>La plupart des commandes du menu ont un équivalent au clavier.</para>
<para>Cette annexe décrit les commandes clavier qui ne sont pas affichées dans les menus de &app;.
</para>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="keybind-people">
<title>Vue Individus</title>
<para>Les commandes suivantes sont disponibles dans la Vue Individus : </para>
<sect1 id="keybind-lists">
<title>Vue Individuelle</title>
<para>Les commandes suivantes sont disponibles dans la Vue des Individus,
des Sources, des Lieux, des Médias.</para>
<informaltable frame="topbot">
<tgroup cols="2">
@ -34,29 +39,25 @@
<colspec colname="col2"/>
<thead>
<row valign="top">
<entry colname="col1" colsep="0" valign="top"><para>Commande</para></entry>
<entry colname="col1" colsep="0" valign="top"><para>C</para></entry>
<entry colname="col2" valign="top"><para>Fonction</para></entry>
</row>
</thead>
<tbody>
<row valign="top">
<entry><para><keycap>Entrée</keycap></para></entry>
<entry><para>Ouvre le dialogue <guilabel>Modifie Personne</guilabel>
sur la personne sélectionnée.</para></entry>
<entry><para>Ouvre le dialogue <guilabel>Edition de l'individus</guilabel> sur la personne sélectionnée</para></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</sect3>
</sect1>
<!-- =============== Appendices Sub-subsection ================ -->
<sect3 id="keybind-family">
<title>Vue Famille</title>
<para>Les commandes disponibles dans la Vue Famille dépendent
de l'élément actif. La table suivante liste les commandes
pour tous les types déléments. </para>
<sect1 id="keybind-family">
<title> Vue Familiale</title>
<para>Les commandes disponibles dans la Vue Famille dépendent de l'élément actif. Le tableau suivante liste les commandes pour tous les types d'éléments.</para>
<variablelist>
@ -69,22 +70,22 @@
<colspec colname="col2"/>
<thead>
<row valign="top">
<entry colname="col1" colsep="0" valign="top"><para>Commande</para></entry>
<entry colname="col1" colsep="0" valign="top"><para>C</para></entry>
<entry colname="col2" valign="top"><para>Fonction</para></entry>
</row>
</thead>
<tbody>
<row valign="top">
<entry><para><keycap>Entrée</keycap></para></entry>
<entry><para>Ouvre le dialogue <guilabel>Modifie Personne</guilabel> sur
la personne active.</para></entry>
</row>
<entry><para><keycap>Entrée</keycap></para></entry>
<entry><para>Ouvre le dialogue <guilabel>Edition de l'individus</guilabel> sur la personne sélectionnée</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Ctrl</keycap>+<keycap>Flèche vers le bas</keycap>
ou <keycap>Ctrl</keycap>+<keycap>Flèche à droite</keycap></para></entry>
<entry><para>Echange la personne active et son époux(se) sélectionné(e).
Utilisez <keycap>Ctrl</keycap>+<keycap>Flèche vers le bas</keycap> dans la Vue Famille standard et
<keycap>Ctrl</keycap>+<keycap>Flèche à droite</keycap> dans la vue alternative Famille. </para></entry>
<entry><para><keycap>Ctrl</keycap>+<keycap>Bas</keycap>
or <keycap>Ctrl</keycap>+<keycap>Droite</keycap></para></entry>
<entry><para>Echange la personne active et son époux(se) sélectionné(e). Utilisez
<keycap>Ctrl</keycap>+<keycap>Bas</keycap> dans
la Vue Famille standard et
<keycap>Ctrl</keycap>+<keycap>Droite</keycap> à droite dans la vue alternative Famille.</para></entry>
</row>
</tbody>
</tgroup>
@ -103,39 +104,40 @@
<colspec colname="col2"/>
<thead>
<row valign="top">
<entry colname="col1" colsep="0" valign="top"><para>Commande</para></entry>
<entry colname="col1" colsep="0" valign="top"><para>C</para></entry>
<entry colname="col2" valign="top"><para>Fonction</para></entry>
</row>
</thead>
<tbody>
<row valign="top">
<entry><para><keycap>Entrée</keycap></para></entry>
<entry><para>Modifie la relation entre la personne active et l'époux(se)
sélectionné(e).</para></entry>
<entry><para>Modifie la relation entre la personne active et l'époux(se) sélectionné(e).</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Shift</keycap>+<keycap>Entrée</keycap></para></entry>
<entry><para>Modifie les informations de l'époux(se) sélectionné(e).</para></entry>
<entry><para>Modifie les informations de l'époux(se)
sélectionné(e).
</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Inser</keycap></para></entry>
<entry><para><keycap>Insert</keycap></para></entry>
<entry><para>Ajoute une personne existante à la liste des époux(ses).</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Shift</keycap>+<keycap>Inser</keycap></para></entry>
<entry><para><keycap>Shift</keycap>+<keycap>Insert</keycap></para></entry>
<entry><para>Ajoute une nouvelle personne à la liste des époux(ses).</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Delete</keycap></para></entry>
<entry><para>Enlève l'époux(se) sélectionné(e) de la liste des époux(ses).
L'époux(se) enlevée n'est pas supprimé(e) de la base de données.</para></entry>
<entry><para><keycap>Suppr</keycap></para></entry>
<entry><para>Enlève l'époux(se) sélectionné(e) de la liste des époux(ses). L'époux(se) enlevée n'est pas supprimé(e) de la base de données.</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Ctrl</keycap>+<keycap>Flèche vers le haut</keycap>
ou <keycap>Ctrl</keycap>+<keycap>Flèche vers la gauche</keycap></para></entry>
<entry><para>Echange l'époux(se) sélectionné(e) et la personne active.
Utilisez <keycap>Ctrl</keycap>+<keycap>Flèche vers le bas</keycap> dans la vue Famille
standard et <keycap>Ctrl</keycap>+<keycap>Flèche à droite</keycap> dans l'autre vue.</para></entry>
<entry><para><keycap>Ctrl</keycap>+<keycap>Haut</keycap>
ou <keycap>Ctrl</keycap>+<keycap>Gauche</keycap></para></entry>
<entry><para>Swap Echange l'époux(se) sélectionné(e) et la personne active. Utilisez
<keycap>Ctrl</keycap>+<keycap>Haut</keycap> dans la vue Famille standard et
<keycap>Ctrl</keycap>+<keycap>Gauche</keycap> dans l'autre vue.
View.</para></entry>
</row>
</tbody>
</tgroup>
@ -154,40 +156,34 @@
<colspec colname="col2"/>
<thead>
<row valign="top">
<entry colname="col1" colsep="0" valign="top"><para>Commande</para></entry>
<entry colname="col1" colsep="0" valign="top"><para>C</para></entry>
<entry colname="col2" valign="top"><para>Fonction</para></entry>
</row>
</thead>
<tbody>
<row valign="top">
<entry><para><keycap>Entrée</keycap></para></entry>
<entry><para>Ouvre la relation entre les parents et leur enfant
(personne sélectionnée ou bien époux(se) sélectionnée, selon
le parent qui est sélectionné à ce moment). </para></entry>
<entry><para>Ouvre la relation entre les parents et leur enfant</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Inser</keycap></para></entry>
<entry><para>Ajoute une famille existante dans la
liste (des parents de la mersonne active).</para></entry>
<entry><para><keycap>Insert</keycap></para></entry>
<entry><para>Ajoute une famille existante dans la liste (des parents de la mersonne active).</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Shift</keycap>+<keycap>Inser</keycap></para></entry>
<entry><para>Ajoute une nouvelle famille dans la
liste (des parents de la mersonne active).</para></entry>
<entry><para><keycap>Shift</keycap>+<keycap>Insert</keycap></para></entry>
<entry><para>Ajoute une nouvelle famille dans la liste (des parents de la mersonne active).</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Suppr</keycap></para></entry>
<entry><para>Enlève la famille sélectionnée de la liste.
Les parents ne sont pas supprimés de la base de données.</para></entry>
<entry><para>Enlève la famille sélectionnée de la liste. Les parents ne sont pas supprimés de la base de données.</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Ctrl</keycap>+<keycap>Flèche vers la droite</keycap>
ou <keycap>Ctrl</keycap>+<keycap>Flèche vers le bas</keycap></para></entry>
<entry><para>Prend comme famille active les parents sélectionnés.
Utilisez <keycap>Ctrl</keycap>+<keycap>Flèche vers la droite</keycap> dans
la vue famille standard et
<keycap>Ctrl</keycap>+<keycap>Flèche vers le bas</keycap> dans l'autre
vue.</para></entry>
<entry><para><keycap>Ctrl</keycap>+<keycap>Droite</keycap>
or <keycap>Ctrl</keycap>+<keycap>Bas</keycap></para></entry>
<entry><para>Prend comme famille active les parents
sélectionnés. Utilisez <keycap>Ctrl</keycap>+<keycap>Droite</keycap> dans la vue famille standard et
<keycap>Ctrl</keycap>+<keycap>Bas</keycap> vers le bas dans l'autre vue.
</para></entry>
</row>
</tbody>
</tgroup>
@ -206,43 +202,38 @@
<colspec colname="col2"/>
<thead>
<row valign="top">
<entry colname="col1" colsep="0" valign="top"><para>Commande</para></entry>
<entry colname="col1" colsep="0" valign="top"><para>C</para></entry>
<entry colname="col2" valign="top"><para>Fonction</para></entry>
</row>
</thead>
<tbody>
<row valign="top">
<entry><para><keycap>Entrée</keycap></para></entry>
<entry><para>Ouvre la relation entre l'enfant et son
parent (la personne active et l'époux(se) sélectionnée).</para></entry>
<entry><para>Ouvre la relation entre l'enfant et son parent (la personne active et l'époux(se) sélectionnée).</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Shift</keycap>+<keycap>Entrée</keycap></para></entry>
<entry><para>Ouvre les informations personnelles de l'enfant
sélectionné.</para></entry>
<entry><para>Ouvre les informations personnelles de l'enfant sélectionné.</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Inser</keycap></para></entry>
<entry><para>Ajoute une personne de la base de données à la liste des
enfants.</para></entry>
<entry><para><keycap>Insert</keycap></para></entry>
<entry><para>Ajoute une personne de la base de données à la liste des enfants.</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Shift</keycap>+<keycap>Inser</keycap></para></entry>
<entry><para>Ajoute une personne nouvelle à la liste des
enfants.</para></entry>
<entry><para><keycap>Shift</keycap>+<keycap>Insert</keycap></para></entry>
<entry><para>Ajoute une personne nouvelle à la liste des enfants.</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Suppr</keycap></para></entry>
<entry><para>Enlève l'enfant sélectionné de la liste.
Cet enfant n'est pas supprimé de la base de données.</para></entry>
<entry><para>Enlève l'enfant sélectionné de la liste. Cet enfant n'est pas supprimé de la base de données.</para></entry>
</row>
<row valign="top">
<entry><para><keycap>Ctrl</keycap>+<keycap>Flèche vers la gauche</keycap>
ou <keycap>Ctrl</keycap>+<keycap>Flèche vers le haut</keycap></para></entry>
<entry><para>Prend l'enfant sélectionné comme Personne Active.
Utilisez <keycap>Ctrl</keycap>+<keycap>Left</keycap> dans la vue Famille standard et
<keycap>Ctrl</keycap>+<keycap>Flèche vers le haut</keycap> dans l'autre
vue.</para></entry>
<entry><para><keycap>Ctrl</keycap>+<keycap>Gauche</keycap>
or <keycap>Ctrl</keycap>+<keycap>Haut</keycap></para></entry>
<entry><para>Prend l'enfant sélectionné comme Personne Active. Utilisez
<keycap>Ctrl</keycap>+<keycap>Gauche</keycap> dans la vue Famille standard et
<keycap>Ctrl</keycap>+<keycap>Haut</keycap> dans l'autre vue.
View.</para></entry>
</row>
</tbody>
</tgroup>
@ -253,7 +244,6 @@
</variablelist>
</sect3>
</sect2>
</sect1>
</appendix>

View File

@ -1,76 +1,13 @@
<legalnotice id="legalnotice">
<para>
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts. You can find
a copy of the GFDL at this <ulink type="help"
url="ghelp:fdl">link</ulink> or in the file COPYING-DOCS
distributed with this manual.
</para>
<para> This manual is part of a collection of GNOME manuals
distributed under the GFDL. If you want to distribute this
manual separately from the collection, you can do so by
adding a copy of the license to the manual, as described in
section 6 of the license.
</para>
Ce manuel est un logiciel libre; vous pouvez le redistribuer et/ou le modifier en vertu de la licence de grand public de GNU comme publiée par Free Software Foundation; version 2 de la licence, ou (à votre option) toute version postérieure.
</para>
<para>
Many of the names used by companies to distinguish their
products and services are claimed as trademarks. Where those
names appear in any GNOME documentation, and the members of
the GNOME Documentation Project are made aware of those
trademarks, then the names are in capital letters or initial
capital letters.
</para>
<para>
Ce manuel est distribué dans l'espoir qu'il sera utile, mais SANS GARANTIE; sans même la garantie implicite de la VALEUR MARCHANDE ou POUR UN BUT PARTICULIER. Voyez la licence grand public GNU pour plus de détails.
</para>
<para>
DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED
UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE
WITH THE FURTHER UNDERSTANDING THAT:
<orderedlist>
<listitem>
<para>DOCUMENT IS PROVIDED ON AN "AS IS" BASIS,
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
THAT THE DOCUMENT OR MODIFIED VERSION OF THE
DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR
A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE
RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE
OF THE DOCUMENT OR MODIFIED VERSION OF THE
DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR
MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT,
YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY
CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED
VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER
EXCEPT UNDER THIS DISCLAIMER; AND
</para>
</listitem>
<listitem>
<para>UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE),
CONTRACT, OR OTHERWISE, SHALL THE AUTHOR,
INITIAL WRITER, ANY CONTRIBUTOR, OR ANY
DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION
OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH
PARTIES, BE LIABLE TO ANY PERSON FOR ANY
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
CONSEQUENTIAL DAMAGES OF ANY CHARACTER
INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS
OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR
MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR
LOSSES ARISING OUT OF OR RELATING TO USE OF THE
DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT,
EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
THE POSSIBILITY OF SUCH DAMAGES.
</para>
</listitem>
</orderedlist>
<para>
Vous devriez avoir reçu une copie de la licence grand public GNU avec ce programme; sinon, écrivez à Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
</para>
</legalnotice>

View File

@ -1,75 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter id="gramps-mainwin">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003 Alexander Roitman
Copyright (C) 2003-2005 Alexander Roitman
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
License (GFDL), Version 1.1 or any later version published
by the Free Software Foundation with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the file COPYING-DOCS
distributed with this manual.
This document 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 document 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$ -->
<!-- ================ Main Window ================================ -->
<sect1 id="gramps-mainwin">
<title>Fenêtre principale</title>
<para>La fenêtre suivante est affichée quand vous ouvrez une base de données
(nouvelle ou existante).</para>
<title>Fenêtre Principale</title>
<para>La fenêtre suivante est affichée quand vous ouvrez une base de données (nouvelle ou existante).</para>
<!-- ==== Figure: Main Window ==== -->
<figure id="mainwin-fig">
<title>Fenêtre principale gramps</title>
<title>Fenêtre principale de &app;</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/mainwin.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre la fenêtre principale de &app; . Comprend le titre, les barres de menu,
d'outils, sidebar, la zone d'affichage, d'état, de progression
et de défilement. La barre de menu comprend les menus Fichier, Edition, Affichage, Aller à, Signets,
Editions, Outils, Paramètres et Aide. </phrase>
<phrase>Cette fenêtre contient une barre de titre, une barre de menu,
une barre d'outils, une barre latérale, une zone d'affichage, une barre d'état, une barre de progression
et une barre de défilement. La barre de menu contient les menus : Fichier, Edition, Affichage, Aller à, Signets,
Rapports, Outils, Fenêtre, et Aide.</phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>La fenêtre de &app; contient les éléments suivants : </para>
<para>La fenêtre de &app; contient les éléments suivants:</para>
<variablelist>
<varlistentry><term>Barre de menu</term>
<listitem><para>La barre de menu est placée tout en haut de la fenêtre
(juste à droite du titre de la fenêtre) et donne accès à toutes les fonctions de
&app; à travers ses menus.</para></listitem>
<varlistentry><term> Barre de menu</term>
<listitem><para>
La barre de menu est placée tout en haut de la fenêtre (juste à droite du titre de la fenêtre) et donne accès à toutes les fonctions de &app; à travers ses menus.
</para></listitem>
</varlistentry>
<varlistentry><term>La barre d'outils</term>
<listitem><para> La barre d'outils est placée juste sous la barre de menu.
Elle donne accès aux fonctions les plus utilisées de
&app;. Sa présentation peut être changée
dans le menu <guilabel>Préférences</guilabel></para></listitem>
<varlistentry><term>Barre d'outils</term>
<listitem><para> La barre d'outils est placée juste sous la barre de menu. Elle donne accès aux fonctions les plus utilisées de &app;. Sa présentation peut être changée dans le menu <guilabel>Préferences</guilabel>
</para></listitem>
</varlistentry>
<varlistentry><term>Barre de progression</term>
<listitem><para>La barre de progression se trouve en bas, à gauche de la fenêtre
principale de &app; . Elle montre l'avancement des opérations longues
comme le chargement ou l'écriture de grosses bases de données,
l'importation ou l'exportation de données de et vers d'autres formats
ou la génération de sites web, etc. </para></listitem>
<listitem><para>La barre de progression se trouve en bas, à gauche de la fenêtre principale de &app;. Elle montre l'avancement des opérations longues comme le chargement ou l'écriture de grosses bases de données, l'importation ou l'exportation de données de et vers d'autres formats ou la génération de sites web, etc.</para></listitem>
</varlistentry>
<varlistentry><term>La barre d'état</term>
<listitem><para>La barre d'état est placée à droite de la barre de progression,
tout en bas de la fenêtre de &app; .
Elle informe sur le travail en cours avec &app;
et explique les éléments de menu.
Son comportement peut être changé dans le dialogue
<guilabel>Préférences</guilabel> . </para></listitem>
<listitem><para>La barre d'état est placée à droite de la barre de progression, tout en bas de la fenêtre de &app; . Elle informe sur le travail en cours avec &app; et explique les éléments de menu. Son comportement peut être changé dans le dialogue
<guilabel>Préferences</guilabel></para></listitem>
</varlistentry>
<varlistentry><term>Zone d'affichage</term>
<listitem><para>Le plus grand espace dans la fenêtre de
&app; est la zone d'affichage.
Elle montre une vue des données généalogiques, selon le type
d'affichage en cours. Les six types d'affichage suivants sont disponibles
dans &app;:
<listitem><para>Le plus grand espace dans la fenêtre de &app; est la zone d'affichage. Elle montre une vue des données généalogiques, selon le type d'affichage en cours.
Les six types d'affichage suivants sont disponibles dans &app;:
<itemizedlist>
<listitem><para>Vue per Individus</para></listitem>
<listitem><para>Vue par Individus</para></listitem>
<listitem><para>Vue par Famille</para></listitem>
<listitem><para>Vue par Arborescence</para></listitem>
<listitem><para>Vue des Sources</para></listitem>
@ -82,27 +73,21 @@
</variablelist>
<!-- ================ Main Window Subsection -->
<sect2 id="gramps-views">
<sect1 id="gramps-views">
<title>Vues</title>
<para>Les vues sont les différentes façons d'afficher les données généalogiques.
Comme l'information est vaste et hétérogène, il faut mieux en réaliser
l'affichage en catégories homogènes plus restreintes.
Chaque vue représente une de ces catégories.
Le changement de vue est décrit ci-dessous, avant leur description
détaillée. </para>
<para>Les vues sont les différentes façons d'afficher les données généalogiques. Comme l'information est vaste et hétérogène, il faut mieux en réaliser l'affichage en catégories homogènes plus restreintes. Chaque vue représente une de ces catégories. Le changement de vue est décrit ci-dessous, avant leur description détaillée.</para>
<!-- ================ Main Window Sub-subsection -->
<sect3 id="view-modes">
<title>Le changement entre les vues et modes d'affichage</title>
<para>Selon l'état de l'item de menu <menuchoice>
<guimenu>Visualiser</guimenu><guimenuitem>Barre verticale</guimenuitem>
</menuchoice> , le mode d'affichage peut être changé soit dans
la barre verticale, soit dans les onglets en haut de la fenêtre.
<sect2 id="view-modes">
<title>Le changement entre les vues et les modes d'affichage</title>
<para>Selon l'état du menu <menuchoice>
<guimenu>Affichage</guimenu><guimenuitem>Barre latérale</guimenuitem>
</menuchoice>, le mode d'affichage peut être changé soit dans la barre verticale,
soit dans les onglets en haut de la fenêtre.
</para>
<variablelist>
<varlistentry><term>Pour changer de Vue dans la barre verticale,
cliquez dans l'icône de la vue que vous désirez.</term>
<varlistentry><term>Pour changer de Vue dans la barre latérale, cliquez sur l'icône de la vue que vous désirez.</term>
<listitem>
<!-- ==== Figure: Sidebar Mode ==== -->
<figure id="side-nofilt-fig">
@ -110,69 +95,90 @@
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/mainwin.png" format="PNG"/></imageobject>
<textobject>
<phrase>Mode avec barre latérale. </phrase>
<phrase>Vue avec la barre latérale</phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
</listitem></varlistentry>
<varlistentry><term>Pour changer de vue en mode "Onglet",
cliquez sur l'onglet désiré.</term>
<varlistentry><term>Pour changer de vue en mode "Onglet", cliquez sur l'onglet désiré.</term>
<listitem>
<!-- ==== Figure: Tabbed Notebook Mode ==== -->
<figure id="noside-nofilt-fig">
<title>Mode Onglets</title>
<title>Mode Onglets </title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/noside-nofilt.png" format="PNG"/></imageobject>
<textobject>
<phrase>Mode Onglets. </phrase>
<phrase>Vue en Mode Onglets</phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
</listitem></varlistentry>
</variablelist>
<para>Pour changer entre les modes avec barre latérale et Onglets
choisissez <menuchoice> <guimenu>Affichage</guimenu>
<para> Pour changer entre les modes avec barre latérale et Onglets choisissez
<menuchoice> <guimenu>Affichage</guimenu>
<guimenuitem>Barre latérale</guimenuitem>
</menuchoice> dans le menu principal de &app; .</para>
</sect3>
</sect2>
<!-- ================ Main Window Sub-subsection -->
<sect3 id="people-view">
<title>Vue des individus</title>
<para>Quand &app; ouvre une base de données,
la Vue est celle des individus (<xref linkend="side-nofilt-fig"/>
et <xref linkend="noside-nofilt-fig"/>). La Vue Individus liste
les personnes dont les données sont enregistrées dans la base de données. </para>
<para> Les personnes sont présentées en arbre, selon leur nom de famille.
Chaque nom est un noeud de l'arbre. Cliquer sur la croix à gauche du noeud
le déploie ou le replie selon son état. Quand un arbre est déployé,
le contenu du noeud est affiché. Quand il est replié, le contenu
n'est pas visible. Les données sont cependant conservées, elles sont
seulement masquées.
<sect2 id="people-view">
<title>Vue des Individus</title>
<para>Quand &app; ouvre une base de données, la Vue est celle des individus
(<xref linkend="side-nofilt-fig"/>
et <xref linkend="noside-nofilt-fig"/>).La Vue Individus liste les personnes dont les données
sont enregistrées dans la base de données.</para>
<para> Les personnes sont présentées en arbre, selon leur nom de famille.
Chaque nom est un noeud de l'arbre. Cliquer sur la croix à gauche du noeud le déploie
ou le replie selon son état. Quand un arbre est déployé, le contenu du noeud est affiché.
Quand il est replié, le contenu n'est pas visible. Les données sont cependant conservées,
elles sont seulement masquées.
</para>
<para>La Vue des Individus montre les <guilabel>Noms</guilabel>,
<guilabel>Identifiants</guilabel> &app;,
<para>La Vue des Individus montre les <guilabel>Noms</guilabel>,
<guilabel>Identifiants &app;</guilabel>,
<guilabel>Genre</guilabel>, et
leurs dates de <guilabel>Naissance</guilabel> et <guilabel>Décès</guilabel>.
La liste peut être triée par rapport à n'importe quel champ.</para>
leurs dates de <guilabel>Naissance</guilabel> et de <guilabel>Décès</guilabel>.
La liste peut être triée par rapport par n'importe quel champ.</para>
<tip id="columns-tip"><title>Liste ordonnée par la colonne choisie</title>
<para>Par exemple, pour trier selon la colonne
<guilabel>date de naissance</guilabel>, cliquer sur l'en-tête. Pour trier la liste dans l'ordre
(décroissant), cliquer une fois de plus sur l'en-tête de colonne désirée. </para></tip>
<para>Exemple : pour trier la liste par date de naissance, cliquez sur
l'en-tête de colonne <guilabel>Date de naissance</guilabel>. Pour trier par ordre
inverse (décroissant), cliquez une autre fois sur l'en-tête de colonne. </para>
<para>Les colonnes peuvent être ajoutées, enlevées, ou triées à nouveau dans une fenêtre de dialogue voir
<xref linkend="column-editor-fig"/>.Seulement les colonnes vérifiées seront montrées dans la vue.
Pour changer leur ordre, glisser n'importe quelle colonne à l' endroit désiré.
Cliquer sur <guibutton>Valider</guibutton> reflétera les changements de la vue des individus.
Pour appeler la <guilabel>Fenêtre d'édition de colonnes </guilabel>,
choisissez <menuchoice><guimenu>Edition</guimenu><guimenuitem>Editeur de Colonnes</guimenuitem></menuchoice>.
</para>
<tip id="columns-tip2"><title>D'autres Vues</title>
<para>L'<guilabel>éditeur de colonnes</guilabel> est disponible et travaille de la même
manière pour toutes les vues de liste, pas seulement vue des individus.</para> </tip>
<!-- ==== Figure: Enabled Filter ==== -->
<figure id="column-editor-fig">
<title>Fenêtre d'édition de Colonnes</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/column-editor.png" format="PNG"/></imageobject>
<textobject>
<phrase>Vue du dialogue d'édition des colonnes </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ================ Main Window Sub-sub-subsection -->
<sect4 id="filters">
<sect3 id="filters">
<title>Filtres</title>
<para>Les bases de données généalogiques peuvent décrire beaucoup d'individus.
<para>Les bases de données généalogiques peuvent décrire beaucoup d'individus.
Comme les longues énumérations sont difficiles à traiter mentalement,
&app; fournit une façon pratique pour réduire
l'ensemble des données visibles avec un filtre. Pour économiser l'espace sur l'écran,
les contrôles de filtre peuvent être cachés, selon l'état de l'item de menu
<menuchoice> <guimenu>Visualiser</guimenu>
<guimenuitem>Filtre</guimenuitem> </menuchoice> .</para>
&app; fournit une façon pratique pour réduire l'ensemble des données visibles avec un filtre.
Pour économiser l'espace sur l'écran, les contrôles de filtre peuvent être cachés, selon
l'état du menu
<menuchoice> <guimenu>Affichage</guimenu>
<guimenuitem>Filtres</guimenuitem> </menuchoice></para>
<!-- ==== Figure: Enabled Filter ==== -->
<figure id="side-filt-fig">
@ -180,247 +186,183 @@
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/side-filt.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre le contrôle du filtre. </phrase>
<phrase>Vue du dialogue de contrôle des filtres </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>Quand &app; ouvre une base de données, le filtre
est le filtre simple appelé <guilabel>Tout le monde</guilabel>,
c'est à dire qu'il n'y a aucun filtrage. Pour choisir un filtre,
utilisez le pop-up <guilabel>Filtre</guilabel> au-dessus de la
liste des individus. Quand vous avez choisi le filtre, cliquez sur le bouton
<guibutton>Appliquer</guibutton> en haut à droite de la fenêtre.
Le filtre sera alors appliqué. Pour inverser la règle de filtrage
cochez le choix <guilabel>Inverse</guilabel> à gauche du bouton
<guibutton>Appliquer</guibutton>. </para>
<para>Quand &app; ouvre une base de données, le filtre est le filtre
simple appelé <guilabel>Tout le monde</guilabel>, c'est à dire qu'il n'y a aucun filtrage.
Pour choisir un filtre, utilisez le pop-up <guilabel>Filtre</guilabel> au-dessus de la liste des individus.
Quand vous avez choisi le filtre, cliquez sur le bouton
<guibutton>Appliquer</guibutton> en haut à droite de la fenêtre.
Le filtre sera alors appliqué. Pour inverser la règle de filtrage cochez le choix Inverse à gauche du bouton
</para>
<para>Exemple : Pour voir les personnes sans enfants, choisissez le filtre
<guilabel>Individus ayant des enfants</guilabel>, cochez la case
<guilabel>Inverse</guilabel>, puis cliquez sur le bouton
<guibutton>Appliquer</guibutton>. Pour annuler le filtrage, sélectionnez
le filtre <guilabel>Tout le monde</guilabel>
puis cliquez sur le bouton <guibutton>Appliquer</guibutton>. </para>
<tip id="filt-tip"><title>Exemple d'utilisation de filtre</title>
<para>Pour montrer seulement les hommes, choisissez le filtre
<guilabel>Hommes</guilabel> puis cliquer sur le bouton
<guibutton>Appliquer</guibutton> button. Pour décommander le filtrage, placez le filtre
sur <guilabel>Toute la base de données</guilabel>
et cliquer sur <guibutton>Appliquer</guibutton>.</para>
</tip>
<note id="filt-note">
<title>Le filtrage est persistant</title>
<para> Même si le contrôle de filtre n'est pas affiché,
(<menuchoice> <guimenu>Affichage</guimenu>
<guimenuitem>Filtre</guimenuitem> </menuchoice> , le filtrage est activé.
En d'autres termes, que le contrôle du filtre soit affiché ou pas n'a pas de rapport
avec l'effet du filtre.</para>
<para>Cela peut prêter à confusion quand vous activez le
filtre puis que vous cachez son contrôle.
En cas de problème, affichez le contrôle du filtre par <menuchoice> <guimenu>Affichage</guimenu>
<guimenuitem>Filtre</guimenuitem> </menuchoice> puis vérifiez que le filtre est actif.</para>
</note>
</sect3>
<para>Note : même si le contrôle de filtre n'est pas affiché,
(<menuchoice> <guimenu>Visualiser</guimenu>
<guimenuitem>Filtre</guimenuitem> </menuchoice> n'est pas coché),
le filtrage est activé. En d'autres termes,
que le contrôle du filtre soit affiché ou pas n'a pas de rapport avec
l'effet du filtre. Cela peut prêter à confusion quand vous activez le filtre
puis que vous cachez son contrôle. En cas de problème, affichez
le contrôle du filtre par
<menuchoice> <guimenu>Visualiser</guimenu>
<guimenuitem>Filtre</guimenuitem> </menuchoice> puis vérifiez quel filtre
est actif. </para>
</sect4>
<!-- ================ Main Window Sub-sub-subsection -->
<sect4 id="alpha-tabs">
<title>Onglets Alphabetiques</title>
<para>&app; propose une autre façon de gérer de longues listes de personnes :
les onglets alphabétiques. Lors du chargement d'une base de données,
&app; examine les noms de famille et sépare la liste complète des personnes
en sous-ensembles, selon l'initiale du nom de famille.
Les onglets alphabétiques sont affichés en bas de la fenêtre de &app;.
Le dernier onglet, <guilabel>Autre</guilabel>, désigne les caractères non identifiés :
tous les éléments non rattachés aux autres onglets.
En particulier, les individus sans nom de famille y sont rattachés.</para>
</sect4>
</sect3>
</sect2>
<!-- ================ Main Window Sub-subsection -->
<sect3 id="family-view">
<sect2 id="family-view">
<title>Vue des Familles</title>
<para>L'affichage par famille montre les informations autour
de la personne sélectionnée (ou Active). En particulier, cette vue montre
les relations (c'est à dire les mariages ou concubinages, etc.) de la personne active,
ses parents (ou beaux-parents, or tuteurs, etc), ainsi que
ses enfants (que ce soit des enfants directs, de conjoint ou bien adoptés, etc.).
<para>L'affichage par famille montre les informations autour de la personne sélectionnée
(ou Active). En particulier, cette vue montre les relations
(c'est à dire les mariages ou concubinages, etc.) de la personne active, ses parents
(ou beaux-parents, or tuteurs, etc), ainsi que ses enfants
(que ce soit des enfants directs, de conjoint ou bien adoptés, etc.).
</para>
<!-- ==== Figure: Family View ==== -->
<figure id="family-fig">
<title>Vue Famille</title>
<title>Vue des Familles</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/family.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre le Vue Famille. </phrase>
<phrase>Vue des Familles </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>Les données de la personne active sont dans le haut, à gauche
de la fenêtre. Juste en dessous, une autre boîte montre ses époux,
épouses (ou toutes autres personnes en relation familiale).
La double flèche dans le bouton à droite de la personne active
fait échanger la personne active et son époux ou épouse sélectionné(e).
Vous pouvez modifier la relation entre la personne active et son
époux ou épouse sélectionnée en double-cliquant sur la personne
active. Vous pouvez modifier les données de l'époux ou épouse sélectionnée
en shift-cliquant sur lui ou elle. </para>
<para>Les données de la personne active sont dans le haut, à gauche de la fenêtre. Juste en dessous, une autre boîte montre ses époux, épouses (ou toutes autres personnes en relation familiale). La double flèche dans le bouton à droite de la personne active fait échanger la personne active et son époux ou épouse sélectionné(e). Vous pouvez modifier la relation entre la personne active et son époux ou épouse sélectionnée en double-cliquant sur la personne active. Vous pouvez modifier les données de l'époux ou épouse sélectionnée en shift-cliquant sur lui ou elle.</para>
<para>Pour ajouter une nouvelle relation depuis la personne active,
utilisez un des boutons du haut, à droite de la boîte de l'époux
ou de l'épouse. Celui du haut ajoute une nouvelle personne dans
la base de données et la relation avec la personne active. Celui du milieu
crée une relation entre la personne active et une personne déjà déclarée
dans la base de données. Le bouton du bas (<guibutton>-</guibutton>) à droite
de la boîte de l'époux ou de l'épouse retire la relation avec cette personne.
La plupart de ces fonctions sont aussi disponibles en cliquant avec le bouton
droit de la souris dans la boîte de l'époux ou de l'épouse, puis
en sélectionnant l'action voulue dans le menu contextuel ainsi
activé. </para>
<para> Pour ajouter une nouvelle relation depuis la personne active, utilisez un des boutons du haut, à droite de la boîte de l'époux ou de l'épouse. Celui du haut ajoute une nouvelle personne dans la base de données et la relation avec la personne active. Celui du milieu crée une relation entre la personne active et une personne déjà déclarée dans la base de données.
Le bouton du bas (<guibutton>-</guibutton>) à droite de la boîte de l'époux ou de l'épouse retire la relation avec cette personne. La plupart de ces fonctions sont aussi disponibles en cliquant avec le bouton droit de la souris dans la boîte de l'époux ou de l'épouse, puis en sélectionnant l'action voulue dans le menu contextuel ainsi activé.</para>
<para>Les parents de la personne active ainsi que de la personne sélectionnée en relation
sont affichés dans la partie droite de la fenêtre. Ceux de la personne active
sont en haut, ceux de la personne en relation en bas. Leurs boîtes
ont chacune un ensemble de trois boutons à droite.
Les boutons <guibutton>+</guibutton> et <guibutton>-</guibutton>
vous permettent d'ajouter ou de retirer des parents de la personne correspondante
(active ou époux). La flèche vers la droite change de famille courante,
en mettant la famille correspondante comme famille courante. Celà
met comme personne active le père sélectionné, et comme épouse la mère.
La plupart de ces fonctions sont aussi disponibles en cliquant avec le bouton
droit de la souris dans la boîte des parents de l'époux ou de l'épouse, puis
en sélectionnant l'action voulue dans le menu contextuel ainsi
activé. </para>
<para>Les parents de la personne active ainsi que de la personne sélectionnée en relation sont affichés dans la partie droite de la fenêtre. Ceux de la personne active sont en haut, ceux de la personne en relation en bas. Leurs boîtes ont chacune un ensemble de trois boutons à droite. Les boutons <guibutton>+</guibutton> et <guibutton>-</guibutton>
vous permettent d'ajouter ou de retirer des parents de la personne correspondante (active ou époux). La flèche vers la droite change de famille courante, en mettant la famille correspondante comme famille courante. Celà met comme personne active le père sélectionné, et comme épouse la mère. La plupart de ces fonctions sont aussi disponibles en cliquant avec le bouton droit de la souris dans la boîte des parents de l'époux ou de l'épouse, puis en sélectionnant l'action voulue dans le menu contextuel ainsi activé. </para>
<para>La boîte du bas liste les enfants de la personne active et de
la relation courante (sélectionnée). La liste des enfants peut être
triée par date de naissance comme d'habitude, en cliquant dans l'en-tête de colonne
<guilabel>Date de naissance</guilabel>.
En plus des colonnes <guilabel>Nom</guilabel>,
<guilabel>Identification</guilabel>, <guilabel>Genre</guilabel> et
<guilabel>Date de naissance</guilabel>, la liste comprend une colonne
<guilabel>Statut</guilabel>. Les deux mots de statut décrivent la relation
entre l'enfant et son père ou sa mère (comme Naissance, Adoption...).
Quatre boutons sont disponibles à droite de la liste des enfants.
Celui du haut (flèche vers la gauche) met l'enfant sélectionné comme
personne active. Les deux suivants ajoutent une personne dans la famille :
celui du haut crée une personne tandis que celui du bas met une personne
déjà déclarée dans la base de données comme enfant dans cette famille.
Enfin, le bouton tout en bas <guibutton>-</guibutton>
retire l'enfant sélectionné de la famille. Notez que ceci ne supprime
pas la personne de la base de données.
La plupart de ces fonctions sont aussi disponibles en cliquant avec le bouton
droit de la souris dans la boîte des enfants, puis
en sélectionnant l'action voulue dans le menu contextuel ainsi
activé. </para>
<para>La boîte du bas liste les enfants de la personne active et de la relation courante (sélectionnée). La liste des enfants peut être triée par date de naissance comme d'habitude, en cliquant dans l'en-tête de colonne
<guilabel>Date de Naissance</guilabel>. En plus des colonnes <guilabel>Nom</guilabel>,
<guilabel>Identifiant</guilabel>, <guilabel>Genre</guilabel>, et
<guilabel>Date de Naissance</guilabel> , la vue comprend une ligne
<guilabel>Statut</guilabel>. Les deux mots de statut décrivent la relation entre l'enfant et son père ou sa mère (comme Naissance, Adoption...).
L'<guilabel>éditeur de colonnes</guilabel> peut être utilisé pour modifier l'affichage des colonnes.
Quatre boutons sont disponibles à droite de la liste des enfants. Celui du haut (flèche vers la gauche) met l'enfant sélectionné comme personne active. Les deux suivants ajoutent une personne dans la famille : celui du haut crée une personne tandis que celui du bas met une personne déjà déclarée dans la base de données comme enfant dans cette famille. Enfin, le bouton tout en bas
<guibutton>-</guibutton> retire l'enfant sélectionné de la famille. Notez que ceci ne supprime pas la personne de la base de données. La plupart de ces fonctions sont aussi disponibles en cliquant avec le bouton droit de la souris dans la boîte des enfants, puis en sélectionnant l'action voulue dans le menu contextuel ainsi activé.</para>
<para>La disposition de la Vue Famille peut être changé entre la disposition
de gauche à droite décrite ci-dessus et la disposition de haut en bas
décrite ci-dessous. Ceci se fait dans la section
<guilabel>Affichage</guilabel> du dialogue
<guilabel>Préférences</guilabel>. La disposition de haut en bas
propose les mêmes fonctions que la disposition de gauche à droite. </para>
<para>La disposition de la Vue Famille peut être changé entre la disposition de gauche à droite décrite ci-dessus et la disposition de haut en bas décrite ci-dessous.
Ceci se fait dans la section
<guilabel>Affichages</guilabel> du dialogue
<guilabel>Préferences</guilabel>. La disposition de haut en bas propose les mêmes fonctions
que la disposition de gauche à droite.</para>
<!-- ==== Figure: Family View ==== -->
<figure id="family-alt-fig">
<title>Autre Vue Famille</title>
<title>Vue Alternative des Familles</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/family-alt.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre l'autre Vue Famille. </phrase>
<phrase>Vue Alternative des Familles </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
</sect3>
</sect2>
<!-- ================ Main Window Sub-subsection -->
<sect3 id="pedigree-view">
<title>Vue d'Arborescence</title>
<sect2 id="pedigree-view">
<title>Vue de l'Arborescence</title>
<!-- ==== Figure: Pedigree View ==== -->
<figure id="pedigree-fig">
<title>Vue d'Arborescence</title>
<figure id="pedigree-fig">
<title>Vue de l'Arborescence</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/pedigree.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre la Vue en Arborescence. </phrase>
<phrase>Vue de l'Arborescence</phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>La vue en Arborescence vous aide à voir la place de la personne active
dans l'arbre de ses ancêtres. Elle montre quatre générations, de la personne
active vers ses parents, ses grands-parents et ses arrière grands-parents.
Chaque personne est représentée par un rectangle portant
son nom. Deux lignes relient la personne à son père (ligne supérieure) et sa
mère (ligne inférieure). Les lignes continues figurent les liens
de filiation tandis que les lignes pointillées représentent les autres liens
(adoption, beau-père ou belle-mère, tuteurs).
Quand le pointeur de la souris passe sur une personne, son rectangle
s'agrandit pour afficher ses dates de naissance et de décès.
Quand le pointeur de la souris passe sur une ligne de famille, celle-ci
est mise en évidence. Double-cliquer sur la ligne met alors le parent correspondant comme
personne active. Tout l'affichage change alors en conséquence. </para>
<para>La vue en Arborescence vous aide à voir la place de la personne active dans l'arbre de ses ancêtres. Elle montre quatre générations,
de la personne active
<guilabel>1</guilabel>vers ses parents <guilabel>2</guilabel>,
ses grands-parents <guilabel>3</guilabel> et ses arrière grands-parents
<guilabel>4</guilabel>.
Chaque personne est représentée par un rectangle portant son nom. Deux lignes relient la personne à son père (ligne supérieure) et sa mère (ligne inférieure). Les lignes continues figurent les liens de filiation tandis que les lignes pointillées représentent les autres liens (adoption, beau-père ou belle-mère, tuteurs). Quand le pointeur de la souris passe sur une personne, son rectangle s'agrandit pour afficher ses dates de naissance et de décès. Quand le pointeur de la souris passe sur une ligne de famille, celle-ci est mise en évidence. Double-cliquer sur la ligne met alors le parent correspondant comme personne active.
Tout l'affichage change alors en conséquence.</para>
<!-- ==== Figure: Pedigree View ==== -->
<figure id="pedigree-child-cut-fig">
<title>Menu des enfants</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/pedigree-child-cut.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre le menu des enfants dans la vue en arbre. </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<!-- ==== Figure: Pedigree View ==== -->
<figure id="pedigree-child-cut-fig">
<title>Menu des Enfants</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/pedigree-child-cut.png" format="PNG"/></imageobject>
<textobject>
<phrase>La vue des Enfants dans l'arborescence </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>Une flèche vers la gauche est affichée dans la partie gauche de la fenêtre.
En cliquant dessus, un menu comprenant les enfants de la personne active
apparait. Sélectionner un des enfants le met alors comme personne active.
Le nom de chaque enfant est affiché différemment selon que la personne est
une feuille de l'arbre (sans enfants connus) ou bien a des enfants connus.
Le nom d'une personne dont on connait des enfants apparaît en caractères
gras et italiques au lieu d'être affiché en caractères normaux.
Si la personne active n'a qu'un enfant, aucun menu ne sera affiché puisqu'il
n'y a pas de choix possible. Dans ce cas, l'unique enfant devient la personne
active dès que l'on a cliqué sur le bouton. </para>
<para>Une flèche vers la gauche est affichée dans la partie gauche de la fenêtre. En cliquant dessus, un menu comprenant les enfants de la personne active apparait. Sélectionner un des enfants le met alors comme personne active. Le nom de chaque enfant est affiché différemment selon que la personne est une feuille de l'arbre (sans enfants connus) ou bien a des enfants connus. Le nom d'une personne dont on connait des enfants apparaît en caractères gras et italiques au lieu d'être affiché en caractères normaux. Si la personne active n'a qu'un enfant, aucun menu ne sera affiché puisqu'il n'y a pas de choix possible. Dans ce cas, l'unique enfant devient la personne active dès que l'on a cliqué sur le bouton.</para>
<para>Deux flèches vers la droite sont affichées dans la partie droite de la fenêtre.
Celle du haut prend comme personne active le père de la personne active.
Celle du bas met comme nouvelle personne active la mère de la personne
active.
Comme précédemment, tout l'affichage change alors en conséquence. </para>
<para>Deux flèches vers la droite sont affichées dans la partie droite de la fenêtre. Celle du haut prend comme personne active le père de la personne active. Celle du bas met comme nouvelle personne active la mère de la personne active. Comme précédemment, tout l'affichage change alors en conséquence.</para>
<!-- ==== Figure: Pedigree View ==== -->
<figure id="pedigree-anchor-fig">
<title>Vue en arborescence avec ancrage</title>
<figure id="pedigree-siblings-cut-fig">
<title>Menu Personnel Contextuel</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/pedigree-siblings-cut.png" format="PNG"/></imageobject>
<textobject>
<phrase>Vue du menu Personnel Contextuel dans l'arborescence</phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>
Un clic-droit appelle un menu contextuel.
Ce menu indique si l'individu a des <guilabel>Conjoints</guilabel>,
des <guilabel>Enfants de mêmes parents</guilabel>,
des <guilabel>Enfants</guilabel> et des <guilabel>Parents</guilabel>.
Le sous-menus peut indiquer l'absence des données dans la catégorie appropriée.
</para>
<!-- ==== Figure: Pedigree View ==== -->
<figure id="pedigree-anchor-fig">
<title>Vue de l'Arbre avec l'ancre</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/pedigree-anchor.png" format="PNG"/></imageobject>
<textobject>
<phrase>Shows Pedigree View with the anchor set. </phrase>
<phrase>Vue de l'Arbre avec l'ancre </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>Un principe avancé de numérotation des générations existe dans
la vue arborescente. Il est rendu disponible en jetant l'ancre
sur la personne active. Si l'ancre est jetée, les générations sont étiquetées
comme suit : la personne active et toutes celles de sa génération sont
<para>Un principe avancé de numérotation des générations existe dans la vue arborescente. Il est rendu disponible en jetant l'ancre sur la personne active. Si l'ancre est jetée, les générations sont étiquetées comme suit : la personne active et toutes celles de sa génération sont
étiquetées <guilabel>0</guilabel>.
Les ancêtres sont numérotés avec des nombres positifs
Les ancêtres sont numérotés avec des nombres positifs
(<guilabel>1</guilabel>, <guilabel>2</guilabel>, <guilabel>3</guilabel>,
etc.) et les descendants sont numérotés avec des nombres négatifs
(<guilabel>-1</guilabel>, <guilabel>-2</guilabel>, <guilabel>-3</guilabel>,
etc.). Dans tous les cas, l'étiquette représente le nombre de générations
entre la génération étiquetée et la personne active lors du jet de l'ancre.
Dans ce mode, vous pouvez vous déplacer dans l'arbre des générations et
les compter depuis la personne active.</para>
etc.). Dans tous les cas, l'étiquette représente le nombre de générations entre la génération étiquetée et la personne active lors du jet de l'ancre. Dans ce mode, vous pouvez vous déplacer dans l'arbre des générations et les compter depuis la personne active.</para>
<para>Pour placer l'ancre, choisissez <guilabel>Jeter l'ancre</guilabel> dans
le menu contextuel (clic droit) quand la personne voulue est la personne
active à la racine de la vue arborescente. Les étiquettes changeront alors
et le nom de la personne-ancre sera affiché en bas à gauche de la vue arborescente.
La personne-ancre le restera jusqu'à ce que l'ancre soit retirée
(choix <guilabel>Lever l'ancre</guilabel> dans le menu contextuel) ou
ou encore que la personne active ne soit plus en relation avec la personne-ancre.
Ce dernier cas arrive par l'utilisation des outils de déplacement avancé
de &app;. Voir <xref linkend="gramps-nav"/> pour plus de détails.
<para>Pour placer l'ancre, choisissez <guilabel>Jeter l'ancre</guilabel> dans le menu contextuel (clic droit) quand la personne voulue est la personne active à la racine de la vue arborescente. Les étiquettes changeront alors et le nom de la personne-ancre sera affiché en bas à gauche de la vue arborescente. The labels will change immediately,
and the name of the anchor person will appear at the lower left corner
of the display area. La personne-ancre le restera jusqu'à ce que l'ancre soit retirée (choix
<guilabel>Lever l'ancre</guilabel> dans le menu contextuel) ou ou encore que la personne active ne soit plus en relation avec la personne-ancre. Ce dernier cas arrive par l'utilisation des outils de déplacement avancé de &app;. Voir
<xref linkend="gramps-nav"/> pour plus de détails.
</para>
</sect3>
</sect2>
<!-- ================ Main Window Sub-subsection -->
<sect3 id="sources-view">
<title>Vue des Sources</title>
<sect2 id="sources-view">
<title>Sources View</title>
<!-- ==== Figure: Sources View ==== -->
<figure id="sources-fig">
@ -428,25 +370,19 @@
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/sources.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre la Vue des Sources. </phrase>
<phrase>Vue des Sources </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>La Vue Sources présente les sources d'information conservées dans la
base de données. Ceci peut couvrir des documents variés comme les actes de naissance, décès,
mariage, livres, journaux, journaux personnels. En fait tout document peut
être pris comme une source d'information. Les sources peuvent être utilisée comme référence
pour n'importe quel évènement conservé dans la base de données.
La Vue Sources présente pour chaque source le
<guilabel>Titre</guilabel>, l'<guilabel>Identifiant</guilabel>, et
l'<guilabel>Auteur</guilabel>. Le tri peut être fait par rapport
à n'importe quelle colonne. Il se fait comme d'habitude : un clic dans
l'en-tête de la colonne pour trier en ordre ascendant, un autre clic
pour trier dans l'ordre descendant. </para>
</sect3>
<para>La Vue des Sources présente les sources d'information conservées dans la base de données. Ceci peut couvrir des documents variés comme les actes de naissance, décès, mariage, livres, journaux, journaux personnels. En fait tout document peut être pris comme une source d'information. Les sources peuvent être utilisée comme référence pour n'importe quel évènement conservé dans la base de données. La Vue Sources présente pour chacune le
<guilabel>Titre</guilabel>, l'<guilabel>Identifiant</guilabel>, et l'
<guilabel>Auteur</guilabel>. Le tri peut être fait par rapport à n'importe quelle colonne. Il se fait comme d'habitude : un clic dans l'en-tête de la colonne pour trier en ordre ascendant, un autre clic pour trier dans l'ordre descendant.
L'<guilabel>Editeur de colonnes</guilabel> peut être utilisé pour l'affichage des colonnes.
</para>
</sect2>
<!-- ================ Main Window Sub-subsection -->
<sect3 id="places-view">
<sect2 id="places-view">
<title>Vue des Lieux</title>
<!-- ==== Figure: Places View ==== -->
@ -455,50 +391,40 @@
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/places.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre la Vue des Lieux. </phrase>
<phrase>Vue des Lieux </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>La Vue des Lieux présente la liste des endroits géographiques
où se sont passés les évènements enregistrés dans la base de données.
Cela peut être les lieux de naissance, mariage, décès des individus,
aussi bien que leur lieu d'habitation, de travail ou d'études comme
n'importe quelle référence géographique. La Vue des Lieux affiche
pour chaque lieu son <guilabel>Nom</guilabel>,
<guilabel>Identifiant</guilabel>, <guilabel>Paroisse</guilabel>,
<guilabel>Ville</guilabel>, <guilabel>Département</guilabel>,
<guilabel>Région</guilabel>, et <guilabel>Pays</guilabel>. Toutes ces colonnes
peuvent servir de critère de tri comme d'habitude. </para>
</sect3>
<para>La Vue des Lieux présente la liste des endroits géographiques où se sont passés les évènements enregistrés dans la base de données. Cela peut être les lieux de naissance, mariage, décès des individus, aussi bien que leur lieu d'habitation, de travail ou d'études comme n'importe quelle référence géographique. La Vue des Lieux affiche pour chaque lieu son
<guilabel>Nom</guilabel>,
son <guilabel>Identifiant</guilabel>, sa <guilabel>Paroisse</guilabel>,
sa <guilabel>Ville</guilabel>, son <guilabel>Département</guilabel>,
sa <guilabel>Région</guilabel> et son <guilabel>Pays</guilabel>.
Toutes ces colonnes peuvent servir de règle de tri.
L'<guilabel>Editeur de colonnes</guilabel> peut être utilisé pour l'affichage des colonnes.</para>
</sect2>
<!-- ================ Main Window Sub-subsection -->
<sect3 id="media-view">
<title>Vue des Medias</title>
<sect2 id="media-view">
<title>Media View</title>
<!-- ==== Figure: Media View ==== -->
<figure id="media-fig">
<title>Vue des Medias</title>
<title>Vue des Médias</title>
<screenshot><mediaobject><imageobject><imagedata
fileref="figures/media.png" format="PNG"/></imageobject>
<textobject>
<phrase>Montre la Vue des Medias. </phrase>
<phrase>Vue des Médias </phrase>
</textobject></mediaobject></screenshot></figure>
<!-- ==== End of Figure ==== -->
<para>La Vue des Medias présente la liste des objets multimedia
utilisés dans la base de données. Les objets multimedia sont
des fichiers liés aux données de la base généalogique. Techniquement,
on peut mettre n'importe quel fichier en objet multimedia.
Habituellement, on y met des images, des enregistrements audio ou video.
La liste présente pour chaque objet multimedia son
<guilabel>Titre</guilabel>,
<guilabel>Identifiant</guilabel>, <guilabel>Type</guilabel> et
<para>La Vue des Medias présente la liste des objets multimedia utilisés dans la base de données. Les objets multimedia sont des fichiers liés aux données de la base généalogique. Techniquement, on peut mettre n'importe quel fichier en objet multimedia. Habituellement, on y met des images, des enregistrements audio ou video. La liste présente pour chaque objet multimedia son
<guilabel>Nom</guilabel>,
son <guilabel>Identifiant</guilabel>, son <guilabel>Type</guilabel>, et son
<guilabel>Chemin d'accès</guilabel>.
Toutes ces colonnes peuvent servir de critère de tri comme d'habitude.
La partie supérieure de la fenêtre montre une prévisualisation
quand c'est possible ainsi que les informations sur l'objet multimedia
sélectionné. </para>
</sect3>
Toutes ces colonnes peuvent servir de règle de tri.
La partie supérieure de la fenêtre montre une prévisualisation quand c'est possible ainsi que les informations sur l'objet multimedia sélectionné. </para>
</sect2>
</sect2>
</sect1> <!-- ================ End Main Window ===================== -->
</sect1>
</chapter>

View File

@ -0,0 +1,181 @@
<preface id="gramps-preface">
<!--
User Manual for Gramps - a GTK+/GNOME based genealogy program
Copyright (C) 2003-2005 Alexander Roitman
This document 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 document 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$ -->
<title>Préface</title>
<para> &app; est une application de généalogie. &app; est l'acronyme de Genealogical Research and Analysis Management Programming System (Systeme de Programmation pour Recherche, Analyse et Gestion de données généalogiques). En bref, il vous permet de conserver, modifier et chercher des données de
généalogie à l'aide d'un ordinateur. Il est semblable à d'autres programmes de généalogie mais il offre en plus des possibilités qui lui sont uniques</para>
<sect1 id="why-gramps">
<title>Pourquoi &app;?</title>
<para> &app; a été pensé avec l'idée que la plupart des logiciels de généalogie permettent de saisir des données. Ils suivent en général le modèle de données standard Gedcom. Habituellement, on peut afficher des arbres ascendants ou descendants sur l'écran ou bien les imprimer. On peut ajouter des images aux données. On peut souvent saisir des informations sur des personnes ou des familles non obligatoirement liées avec l'objet de la recherche. D'autres extensions portent sur l'importation ou l'exportation de données ainsi que sur les impressions d'états.
<para> &app; cherche à fournir toutes les fonctions communes de ces logiciels et aussi la capacité d'intégrer des informations éparses directement, puis de traiter/réorganiser n'importe quel évènement et/ou donnée dans toute la base de
données, pour aider l'utilisateur dans ses recherches, analyses, recoupements et éventuellement mises en relation de données. En bref, cet outil traite toutes les données en un lieu unique avec l'aide de l'ordinateur, en remplaçant le crayon et les montagnes de papier. </para>
</para>
</sect1>
<sect1 id="whats-new">
<title> Ce qu'il y a de neuf depuis la version 1.X</title>
<para>Cette section énumère les changements les plus notables par rapport à la dernière branche stable de &app;, la 1.X</para>
<variablelist>
<varlistentry><term>Base de données Berkeley </term>
<listitem><para>Le format de &app; est maintenant la base de données BSDDB. Ce changement nous a permis de surmonter des issues d'exécution et les conditions de mémoire de la branche 1.0.X. Avec ce format, une base de données de 100 000 individus ne présentent pas un obstacle important.</para>
<para>
Ce nouveau format est ouvert et entièrement documenté dans la référence de l'api distribuée avec la source de &app;
</para>
<para>Une conséquence de la nouvelle base de données reste que les changements, une fois approuvés par l'utilisateur, sont appliqués immédiatement. En bref, une fois que vous cliquez OK chez la personne, la famille, source, lieux, objet médias, ou un événement, tous les changements faits sont enregistrés dans la base de données. Aucun enregistrement n'est nécessaire (ou même possible). En outre, il est possible de défaire des actions récentes.
</para>
</listitem>
</varlistentry>
<varlistentry><term>Améliorations de l'interface</term>
<listitem><para>
Il y a de nombreux changements dans l'interface. La plupart d'entre eux sont des améliorations subtiles et tous ne peuvent pas être énumérés ici. Les changements les plus apparents sont:
<itemizedlist>
<listitem><para>Disparition des étiquettes alphabétiques</para></listitem>
<listitem><para>Possibilités d'ajouter/supprimer/modifier la vue des listes</para></listitem>
<listitem><para>Disparition des fonctions d'enregistrement et ajout d'une fonction "retour à la dernière version"</para></listitem>
<listitem><para>Gestion et déplacements appropriés de la plupart des fenêtres</para></listitem>
<listitem><para>Soutien de l'astuce du jour</para></listitem>
<listitem><para>menu Personnel contextuel (clic de droit) les parents, les enfants et les conjoints peuvent être affichés dans l'arborescence</para></listitem>
<listitem><para>Magicien d'exportation</para></listitem>
<listitem><para>Fonction intégrée de recherche dans les vues de liste</para></listitem>
<listitem><para>Dialogue de sélecteur de date</para></listitem>
<listitem><para>Perfectionnements dans l'édition des noms : les patronymes et les chaînes non transférées </para></listitem>
<listitem><para>Ajout du fichier récent (gramps et menu de GNOME)</para></listitem>
</itemizedlist>
</para></listitem>
</varlistentry>
<varlistentry><term>Les autres base de données</term>
<listitem><para>
Avec BSDDB, la base de données est en mémoire, de même que pour le format GRAMPS XML et les GEDCOM. Il est maintenant possible d'ouvrir de façon "indigènes", des données dans ces deux formats (bien que préférant le format par défaut : grdb), sans installer nécessairement une base de données vide et l'importer. Cette approche exige de contenir toutes les données en mémoire, ainsi il est seulement utile pour de petites bases de données (selon la capacité de la mémoire disponible). En un tel mode, les données sont automatiquement sauvées sur la sortie, pour imiter la fonctionnalité de la vraie base de données.
<warning id="gedcom-inmem1-warn">
<title>Edition de GEDCOM</title>
<para>
Maintenez svp à l'esprit que l'information du fichier GEDCOM peut être perdue pendant l'importation dans &app;. Simplement l'ouverture et le visionnement du dossier ne le changeront pas. Cependant, si des changements étaient faits et ils n'étaient pas exportés, sortir de &app; sauvera les données, avec la perte possible de données.
</para>
</warning>
</para></listitem>
</varlistentry>
<varlistentry><term>Importation et exportation</term>
<listitem><para>
Les nouveaux filtres d'importation et d'exportation disponibles pour GeneWeb.
</para></listitem>
</varlistentry>
<varlistentry><term>Rapports</term>
<listitem><para>
Un nouveau rapport -- diagramme de statistiques -- a été ajouté à &app;.
</para>
<para>Un changement global du cadre entier de rapport a été accomplis. Tous les rapports se rappellent maintenant leurs options. Il est possible de produire des rapports en ligne de commande, sans lancer la session interactive de &app;. Le rapport api est beaucoup plus simple maintenant, le rendant facile d'écriture. Un exemple simple de code peut être employé pour un rapport autonome, un article de livre, et un rapport en ligne de commande.</para></listitem>
</varlistentry>
<varlistentry><term>Ligne de commande</term>
<listitem><para>La nouvelle fonctionnalité de ligne de commande inclut d'ouvrir l'argument de nom de fichier non donné sans aucun drapeau, aussi bien que de nouveaux drapeaux et options pour la production d'états. En outre, l'addition de nouveaux formats mène à l'addition des options de format disponible.
</para></listitem>
</varlistentry>
<varlistentry><term>Internationalisation</term>
<listitem><para>
L'approche pour écrire et montrer des dates a été complètement retouchée. En particulier, le nouveau cadre tient compte d'une localisation plus profonde des dates montrées, ce qui n'était jamais possible en utilisant les chaînes traduisibles.</para>
<para>L'internationalisation des noms ont été également améliorées. Des noms peuvent être groupés sous une chaîne non-transférée. Les Patronymes sont soutenus, et il est facile de programmer de nouvelles manières pour montrer des noms, comme celà peut être exigé par diverses cultures et langues.
</para></listitem>
</varlistentry>
<varlistentry><term>Intégration de bureau</term>
<listitem><para>Tous les formats connus de &app; sont maintenant enregistrés comme types-MIME, chacun avec son icône et &app; en tant que programme par défaut. Double-cliquer sur un dossier avec n'importe lequel de ces formats lancera &app; et ouvrira la base. &app; a également ajouté le soutien des documents récents. Présent dans le menu GNOME et dans &app;.
</para>
<para>Les préférences sont maintenant correctement en magasin en utilisant GConf, avec des schémas, la division des clefs dans de plus petits annuaires, la vérification des erreurs, et l'avis.</para>
</listitem>
</varlistentry>
</variablelist>
</sect1>
<sect1 id="typography">
<title> Conventions typographiques</title>
<para>
Dans ce manuel, nous utilisons des mots identifiés par la typographie spéciale:
<itemizedlist>
<listitem><application>Applications</application></listitem>
<listitem><command>Commandes</command> à lancer à la ligne de commande</listitem>
<listitem><filename>Nom_de_fichier</filename></listitem>
<listitem><replaceable>Texte remplaçable</replaceable></listitem>
<listitem><guilabel>Icônes/Onglets</guilabel> pour les boutons et d'autres parties de l'interface graphique</listitem>
<listitem> Le choix du menu :
<menuchoice>
<guimenu>Menu</guimenu>
<guisubmenu>Sous-menu</guisubmenu>
<guimenuitem>Article du Menu</guimenuitem>
</menuchoice>
</listitem>
<listitem><guibutton>Boutons</guibutton> que vous pouvez cliquer</listitem>
<listitem><userinput> Quelque chose que vous saisissez</userinput></listitem>
</itemizedlist>
</para>
<para>
Nous fournissons également des informations additionnelles dans les astuces et les notes, comme suit.
<tip id="example-tip">
<title>Astuce</title>
<para>
Les astuces et le peu d'information supplémentaire ressembleront à ceci.
</para>
</tip>
<note id="example-note">
<title>Note</title>
<para>
Les notes ressembleront à ceci.
</para>
</note>
</para>
<para>
En conclusion, nous avons également des avertissements :
<warning id="example-warning">
<title>Avertissement d'exemple</title>
<para>
Si vous courrez un ennui, nous vous avertirons à l'avance.
</para>
</warning>
</para>
</sect1>
</preface>

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
.TH gramps 1 "@VERSION@" "May 2005" "@VERSION@"
.TH gramps 1 "@VERSION@" "August 2005" "@VERSION@"
.SH NAME
gramps \- Genealogical Research and Analysis Management Programming System.
@ -59,8 +59,8 @@ the format of that file is guessed according to its extension.
Formats
available for opening are \fBgrdb\fR (guessed if \fIFILE\fR ends with
\fB.grdb\fR), \fBgramps\-xml\fR (guessed if \fIFILE\fR is a
directory), and \fBgedcom\fR (guessed if \fIFILE\fR ends with \fB.ged\fR).
\fB.grdb\fR), \fBgramps\-xml\fR (guessed if \fIFILE\fR ends with
\fB.gramps\fR), and \fBgedcom\fR (guessed if \fIFILE\fR ends with \fB.ged\fR).
.br
Formats
@ -80,10 +80,6 @@ Open \fIFILE\fR.
Only \fBgrdb\fR, \fBgramps\-xml\fR, and \fBgedcom\fR formats can be
opened directly. For other formats, you will need to use the import option
which will set up the empty database and then import data into it.
For \fBgramps\-xml\fR format, the \fIFILE\fR
is actually the name of directory under which the gramps database resides.
For \fBgrdb\fR and \fBgedcom\fR, the \fIFILE\fR is the name of
the corresponding file.
.br
Only a single file can be opened. If you need to combine data from several
@ -91,11 +87,7 @@ sources, you will need to use the import option.
.TP
.BI \-i,\-\^\-import= " FILE"
Import data from \fIFILE\fR. For \fBgramps\-xml\fR format, the \fIFILE\fR
is actually the name of directory under which the gramps database resides.
For \fBgrdb\fR, \fBgedcom\fR, \fBgramps\-pkg\fR, and \fBgeneweb\fR,
the \fIFILE\fR is
the name of the corresponding file.
Import data from \fIFILE\fR.
.br
When more than one input file is given, each has to be preceded by \fB\-i\fR
@ -106,9 +98,9 @@ gramps IDs in the resulting database.
.TP
.BI \-o,\-\^\-output= " FILE"
Export data into \fIFILE\fR. For \fBgramps\-xml\fR and \fBiso\fR formats, the
\fIFILE\fR is actually the name of directory the gramps database will be
written into. For \fBgrdb\fR, \fBgedcom\fR, \fBwft\fR, \fBgramps\-pkg\fR,
Export data into \fIFILE\fR. For \fBiso\fR format, the \fIFILE\fR is actually
the name of directory the gramps database will be written into.
For \fBgrdb\fR, \fBgramps\-xml\fR, \fBgedcom\fR, \fBwft\fR, \fBgramps\-pkg\fR,
and \fBgeneweb\fR, the \fIFILE\fR is the name of the resulting file.
.br
@ -205,16 +197,16 @@ of \fIstdout\fR and \fIstderr\fR to save messages and errors in files.
.SH EXAMPLES
.TP
To import four databases (whose formats can be determined from their names) and then check the resulting database for errors, one may type:
\fBgramps\fR \fB\-i\fR \fIfile1.ged\fR \fB\-i\fR \fIfile2.tgz\fR \fB\-i\fR \fI~/db3\fR \fB\-i\fR \fIfile4.wft\fR \fB\-a\fR \fIcheck\fR
\fBgramps\fR \fB\-i\fR \fIfile1.ged\fR \fB\-i\fR \fIfile2.tgz\fR \fB\-i\fR \fI~/db3.gramps\fR \fB\-i\fR \fIfile4.wft\fR \fB\-a\fR \fIcheck\fR
.TP
To explicitly specify the formats in the above example, append filenames with appropriate \fB\-f\fR options:
\fBgramps\fR \fB\-i\fR \fIfile1.ged\fR \fB\-f\fR \fIgedcom\fR \fB\-i\fR \fIfile2.tgz\fR \fB\-f\fR \fIgramps-pkg\fR \fB\-i\fR \fI~/db3\fR \fB\-f\fR \fIgramps\fR \fB\-i\fR \fIfile4.wft\fR \fB\-f\fR \fIwft\fR \fB\-a\fR \fIcheck\fR
\fBgramps\fR \fB\-i\fR \fIfile1.ged\fR \fB\-f\fR \fIgedcom\fR \fB\-i\fR \fIfile2.tgz\fR \fB\-f\fR \fIgramps-pkg\fR \fB\-i\fR \fI~/db3.gramps\fR \fB\-f\fR \fIgramps-xml\fR \fB\-i\fR \fIfile4.wft\fR \fB\-f\fR \fIwft\fR \fB\-a\fR \fIcheck\fR
.TP
To record the database resulting from all imports, supply \fB\-o\fR flag (use \fB\-f\fR if the filename does not allow gramps to guess the format):
\fBgramps\fR \fB\-i\fR \fIfile1.ged\fR \fB\-i\fR \fIfile2.tgz\fR \fB\-o\fR \fI~/new-package\fR \fB\-f\fR \fIgramps-pkg\fR
.TP
To import three databases and start interactive gramps session with the result:
\fBgramps\fR \fB\-i\fR \fIfile1.ged\fR \fB\-i\fR \fIfile2.tgz\fR \fB\-i\fR \fI~/db3\fR
\fBgramps\fR \fB\-i\fR \fIfile1.ged\fR \fB\-i\fR \fIfile2.tgz\fR \fB\-i\fR \fI~/db3.gramps\fR
.TP
Finally, to start normal interactive session type:
\fBgramps\fR

View File

@ -86,8 +86,8 @@ rm -rf $RPM_BUILD_ROOT
%{_datadir}/mime/packages/gramps.xml
%post
GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` \
gconftool-2 --makefile-install-rule \
GCONF_CONFIG_SOURCE=`@GCONFTOOL@ --get-default-source` \
@GCONFTOOL@ --makefile-install-rule \
%{_sysconfdir}/gconf/schemas/gramps.schemas > /dev/null
/usr/bin/update-desktop-database %{_datadir}/applications &> /dev/null
/usr/bin/update-mime-database %{_datadir}/mime &> /dev/null

View File

@ -406,7 +406,8 @@ class AddSpouse:
#-------------------------------------------------------------------------
class LikelyFilter(GenericFilter.Rule):
category = _('General filters')
labels = [ 'Person handle', 'Person gender' ]
category = _('General filters')
def prepare(self,db):
person = db.get_person_from_handle(self.list[0])

View File

@ -52,6 +52,7 @@ import RelLib
import Sources
import DateEdit
import DateHandler
import Spell
#-------------------------------------------------------------------------
#
@ -95,6 +96,7 @@ class AddressEditor:
self.postal = self.top.get_widget("postal")
self.phone = self.top.get_widget("phone")
self.note_field = self.top.get_widget("addr_note")
self.spell = Spell.Spell(self.note_field)
self.priv = self.top.get_widget("priv")
self.slist = self.top.get_widget("slist")
self.sources_label = self.top.get_widget("sources_tab")

View File

@ -128,7 +128,8 @@ class ArgHandler:
o,v = options[opt_ix]
if o in ( '-O', '--open'):
fname = v
ftype = GrampsMime.get_type(os.path.abspath(os.path.expanduser(fname)))
ftype = GrampsMime.get_type(
os.path.abspath(os.path.expanduser(fname)))
if opt_ix<len(options)-1 \
and options[opt_ix+1][0] in ( '-f', '--format'):
format = options[opt_ix+1][1]
@ -138,7 +139,7 @@ class ArgHandler:
continue
elif ftype == const.app_gedcom:
format = 'gedcom'
elif ftype == "x-directory/normal":
elif ftype == const.app_gramps_xml:
format = 'gramps-xml'
elif ftype == const.app_gramps:
format = 'grdb'
@ -149,11 +150,16 @@ class ArgHandler:
self.open = (fname,format)
elif o in ( '-i', '--import'):
fname = v
ftype = GrampsMime.get_type(os.path.abspath(os.path.expanduser(fname)))
ftype = GrampsMime.get_type(
os.path.abspath(os.path.expanduser(fname)))
if opt_ix<len(options)-1 \
and options[opt_ix+1][0] in ( '-f', '--format'):
format = options[opt_ix+1][1]
if format not in ('gedcom','gramps-xml','gramps-pkg','grdb','geneweb'):
if format not in ('gedcom',
'gramps-xml',
'gramps-pkg',
'grdb',
'geneweb'):
print "Invalid format: %s" % format
print "Ignoring input file: %s" % fname
continue
@ -161,7 +167,7 @@ class ArgHandler:
format = 'gedcom'
elif ftype == const.app_gramps_package:
format = 'gramps-pkg'
elif ftype == "x-directory/normal":
elif ftype == const.app_gramps_xml:
format = 'gramps-xml'
elif ftype == const.app_gramps:
format = 'grdb'
@ -177,7 +183,13 @@ class ArgHandler:
if opt_ix<len(options)-1 \
and options[opt_ix+1][0] in ( '-f', '--format'):
outformat = options[opt_ix+1][1]
if outformat not in ('gedcom','gramps-xml','gramps-pkg','grdb','iso','wft','geneweb'):
if outformat not in ('gedcom',
'gramps-xml',
'gramps-pkg',
'grdb',
'iso',
'wft',
'geneweb'):
print "Invalid format: %s" % outformat
print "Ignoring output file: %s" % outfname
continue
@ -189,14 +201,7 @@ class ArgHandler:
outformat = 'wft'
elif outfname[-2:].upper() == "GW":
outformat = 'geneweb'
elif not os.path.isfile(outfname):
if not os.path.isdir(outfname):
try:
os.makedirs(outfname,0700)
except:
print "Cannot create directory %s" % outfname
print "Ignoring output file: %s" % outfname
continue
elif outfname[-6:].upper() == "GRAMPS":
outformat = 'gramps-xml'
elif fname[-3:].upper() == "GRDB":
format = 'grdb'
@ -276,7 +281,8 @@ class ArgHandler:
if not prompter.chooser():
QuestionDialog.ErrorDialog(
_("New GRAMPS database was not set up"),
_('GRAMPS cannot open non-native data without setting up new GRAMPS database.'))
_('GRAMPS cannot open non-native data '
'without setting up new GRAMPS database.'))
print "Cannot continue without native database. Exiting..."
os._exit(1)
elif filetype == const.app_gramps_package:
@ -287,7 +293,9 @@ class ArgHandler:
print "Unknown file type: %s" % filetype
QuestionDialog.ErrorDialog(
_("Could not open file: %s") % filename,
_('File type "%s" is unknown to GRAMPS.\n\nValid types are: GRAMPS database, GRAMPS XML, GRAMPS package, and GEDCOM.') % filetype)
_('File type "%s" is unknown to GRAMPS.\n\n'
'Valid types are: GRAMPS database, GRAMPS XML, '
'GRAMPS package, and GEDCOM.') % filetype)
print "Exiting..."
os._exit(1)
if success:
@ -333,7 +341,8 @@ class ArgHandler:
# Create dir for imported database(s)
self.impdir_path = os.path.expanduser("~/.gramps/import" )
self.imp_db_path = os.path.expanduser("~/.gramps/import/import_db.grdb" )
self.imp_db_path = os.path.expanduser(
"~/.gramps/import/import_db.grdb" )
if not os.path.isdir(self.impdir_path):
try:
os.mkdir(self.impdir_path,0700)
@ -418,8 +427,7 @@ class ArgHandler:
os._exit(1)
elif format == 'gramps-xml':
try:
dbname = os.path.join(filename,const.xmlFile)
ReadXML.importData(self.parent.db,dbname,None,self.parent.cl)
ReadXML.importData(self.parent.db,filename,None,self.parent.cl)
except:
print "Error importing %s" % filename
os._exit(1)
@ -438,7 +446,8 @@ class ArgHandler:
try:
os.mkdir(tmpdir_path,0700)
except:
print "Could not create temporary directory %s" % tmpdir_path
print "Could not create temporary directory %s" \
% tmpdir_path
os._exit(1)
elif not os.access(tmpdir_path,os.W_OK):
print "Temporary directory %s is not writable" % tmpdir_path
@ -496,12 +505,11 @@ class ArgHandler:
os._exit(1)
elif format == 'gramps-xml':
filename = os.path.normpath(os.path.abspath(filename))
dbname = os.path.join(filename,const.xmlFile)
if filename:
try:
import WriteXML
g = WriteXML.XmlWriter(self.parent.db,None,1,1)
ret = g.write(dbname)
ret = g.write(filename)
except:
print "Error exporting %s" % filename
os._exit(1)
@ -532,7 +540,8 @@ class ArgHandler:
elif format == 'geneweb':
import WriteGeneWeb
try:
writer = WriteGeneWeb.GeneWebWriter(self.parent.db,None,1,filename)
writer = WriteGeneWeb.GeneWebWriter(self.parent.db,
None,1,filename)
ret = writer.export_data()
except:
print "Error exporting %s" % filename
@ -585,7 +594,8 @@ class ArgHandler:
options_class = item[3]
if category in (const.CATEGORY_BOOK,const.CATEGORY_CODE,
const.CATEGORY_WEB):
options_class(self.parent.db,name,category,options_str_dict)
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)

View File

@ -53,6 +53,8 @@ import Utils
import Sources
import AutoComp
import RelLib
import Spell
from QuestionDialog import WarningDialog
#-------------------------------------------------------------------------
@ -64,7 +66,7 @@ class AttributeEditor:
"""
Displays a dialog that allows the user to edit an attribute.
"""
def __init__(self, parent, attrib, title, list, callback,
def __init__(self, parent, attrib, title, data_list, callback,
parent_window=None):
"""
Displays the dialog box.
@ -88,12 +90,13 @@ class AttributeEditor:
self.attrib = attrib
self.callback = callback
self.child_windows = {}
self.alist = list
self.alist = data_list
self.top = gtk.glade.XML(const.dialogFile, "attr_edit","gramps")
self.slist = self.top.get_widget("slist")
self.value_field = self.top.get_widget("attr_value")
self.note_field = self.top.get_widget("attr_note")
self.spell = Spell.Spell(self.note_field)
self.attrib_menu = self.top.get_widget("attr_menu")
# self.type_field = self.attrib_menu.child
self.source_field = self.top.get_widget("attr_source")

View File

@ -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
@ -25,6 +25,13 @@
__author__ = "Donald N. Allingham"
__version__ = "$Revision$"
#-------------------------------------------------------------------------
#
# Standard python modules
#
#-------------------------------------------------------------------------
from gettext import gettext as _
#-------------------------------------------------------------------------
#
# GTK/Gnome modules
@ -38,8 +45,8 @@ import gnome
# gramps modules
#
#-------------------------------------------------------------------------
from gettext import gettext as _
import NameDisplay
import ListModel
#-------------------------------------------------------------------------
#
@ -51,7 +58,7 @@ class Bookmarks :
def __init__(self,db,bookmarks,menu,callback):
"""
Creates a the bookmark editor
Creates a the bookmark editor.
bookmarks - list of People
menu - parent menu to attach users
@ -81,6 +88,21 @@ class Bookmarks :
self.bookmarks.append(person_handle)
self.redraw()
def remove_people(self,person_handle_list):
"""
Removes people from the list of bookmarked people.
This function is for use *outside* the bookmark editor
(removal when person is deleted or merged away).
"""
modified = False
for person_handle in person_handle_list:
if person_handle in self.bookmarks:
self.bookmarks.remove(person_handle)
modified = True
if modified:
self.redraw()
def add_to_menu(self,person_handle):
"""adds a person's name to the drop down menu"""
person = self.db.get_person_from_handle(person_handle)
@ -98,12 +120,18 @@ class Bookmarks :
self.top.set_default_size(400,350)
self.top.set_has_separator(False)
self.top.vbox.set_spacing(5)
label = gtk.Label('<span size="larger" weight="bold">%s</span>' % _("Edit Bookmarks"))
label = gtk.Label('<span size="larger" weight="bold">%s</span>'
% _("Edit Bookmarks"))
label.set_use_markup(True)
self.top.vbox.pack_start(label,0,0,5)
box = gtk.HBox()
self.top.vbox.pack_start(box,1,1,5)
self.namelist = gtk.CList(1)
name_titles = [(_('Name'),-1,-1),(_('ID'),-1,-1),('',-1,0)]
self.namelist = gtk.TreeView()
self.namemodel = ListModel.ListModel(self.namelist,name_titles)
self.namemodel_cols = len(name_titles)
slist = gtk.ScrolledWindow()
slist.add_with_viewport(self.namelist)
slist.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
@ -111,20 +139,13 @@ class Bookmarks :
bbox = gtk.VButtonBox()
bbox.set_layout(gtk.BUTTONBOX_START)
bbox.set_spacing(6)
up = gtk.Button()
up.set_label(gtk.STOCK_GO_UP)
up.set_use_stock(1)
down = gtk.Button()
down.set_label(gtk.STOCK_GO_DOWN)
down.set_use_stock(1)
delete = gtk.Button()
delete.set_label(gtk.STOCK_REMOVE)
delete.set_use_stock(1)
up = gtk.Button(stock=gtk.STOCK_GO_UP)
down = gtk.Button(stock=gtk.STOCK_GO_DOWN)
delete = gtk.Button(stock=gtk.STOCK_REMOVE)
up.connect('clicked', self.up_clicked)
down.connect('clicked',self.down_clicked)
delete.connect('clicked',self.delete_clicked)
self.top.add_button(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL)
self.top.add_button(gtk.STOCK_OK,gtk.RESPONSE_OK)
self.top.add_button(gtk.STOCK_CLOSE,gtk.RESPONSE_CLOSE)
self.top.add_button(gtk.STOCK_HELP,gtk.RESPONSE_HELP)
bbox.add(up)
bbox.add(down)
@ -142,50 +163,53 @@ class Bookmarks :
list is not empty, or -1 if it is.
"""
self.draw_window()
index = 0
for person_handle in self.bookmarks:
person = self.db.get_person_from_handle(person_handle)
name = NameDisplay.displayer.display(person)
self.namelist.append([name])
self.namelist.set_row_data(index,person_handle)
index = index + 1
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.connect_model()
self.response = self.top.run()
if self.response == gtk.RESPONSE_OK:
self.ok_clicked()
elif self.response == gtk.RESPONSE_HELP:
if self.response == gtk.RESPONSE_HELP:
self.help_clicked()
self.top.destroy()
def delete_clicked(self,obj):
"""Removes the current selection from the list"""
if len(self.namelist.selection) > 0:
self.namelist.remove(self.namelist.selection[0])
store,the_iter = self.namemodel.get_selected()
if not the_iter:
return
row = self.namemodel.get_selected_row()
self.bookmarks.pop(row)
self.namemodel.remove(the_iter)
def up_clicked(self,obj):
"""Moves the current selection up one row"""
if len(self.namelist.selection) > 0:
index = self.namelist.selection[0]
self.namelist.swap_rows(index-1,index)
row = self.namemodel.get_selected_row()
if not row or row == -1:
return
store,the_iter = self.namemodel.get_selected()
data = self.namemodel.get_data(the_iter,range(self.namemodel_cols))
self.namemodel.remove(the_iter)
self.namemodel.insert(row-1,data,None,1)
handle = self.bookmarks.pop(row)
self.bookmarks.insert(row-1,handle)
def down_clicked(self,obj):
"""Moves the current selection down one row"""
if len(self.namelist.selection) > 0:
index = self.namelist.selection[0]
if index != self.namelist.rows-1:
self.namelist.swap_rows(index+1,index)
def ok_clicked(self):
"""Saves the current bookmarks from the list"""
del self.bookmarks[0:]
for index in range(0,self.namelist.rows):
person_handle = self.namelist.get_row_data(index)
if person_handle:
self.bookmarks.append(person_handle)
self.redraw()
row = self.namemodel.get_selected_row()
if row + 1 >= self.namemodel.count or row == -1:
return
store,the_iter = self.namemodel.get_selected()
data = self.namemodel.get_data(the_iter,range(self.namemodel_cols))
self.namemodel.remove(the_iter)
self.namemodel.insert(row+1,data,None,1)
handle = self.bookmarks.pop(row)
self.bookmarks.insert(row+1,handle)
def help_clicked(self):
"""Display the relevant portion of GRAMPS manual"""
gnome.help_display('gramps-manual','gramps-nav')
self.response = self.top.run()

View File

@ -120,8 +120,8 @@ class ChooseParents:
self.all_females_filter = GenericFilter.GenericFilter()
self.all_females_filter.add_rule(GenericFilter.IsFemale([]))
bh = person.birth_handle
if bh and self.db.get_event_from_handle(bh).date.sortval != 0:
bev = self.db.get_event_from_handle(person.birth_handle)
if bev and bev.date and bev.date.sortval != 0:
self.likely_females_filter = self.build_likely(False)
self.likely_males_filter = self.build_likely(True)
else:
@ -571,20 +571,21 @@ class ChooseParents:
self.type = CIVIL_UNION_REL
father_handle = self.father.get_handle()
mother_handle = self.mother.get_handle()
self.family = self.find_family(father_handle,mother_handle,trans)
else:
self.family = None
if self.family:
if self.person.get_handle() in (father_handle,mother_handle):
ErrorDialog(_("Error selecting a child"),
_("A person cannot be linked as his/her own parent"),
self.window)
return
if self.person.get_handle() in (father_handle,mother_handle):
ErrorDialog(_("Error selecting a child"),
_("A person cannot be linked as his/her own parent"),
self.window)
return
if father_handle or mother_handle:
self.family = self.find_family(father_handle,mother_handle,trans)
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.db.commit_family(self.family,trans)
else:
self.family = None
self.db.transaction_commit(trans,_("Choose Parents"))
self.close(None)
@ -822,7 +823,8 @@ class ModifyParents:
#-------------------------------------------------------------------------
class LikelyFilter(GenericFilter.Rule):
category = _('General filters')
labels = [ 'Person handle' ]
category = _('General filters')
def prepare(self,db):
person = db.get_person_from_handle(self.list[0])

View File

@ -137,9 +137,9 @@ class DateParser:
}
french_to_int = {
u'vend\xc3\xa9miaire' : 1, 'brumaire' : 2,
u'vend\xc3\xa9miaire' : 1, 'brumaire' : 2,
'frimaire' : 3, u'niv\xc3\xb4se ': 4,
u'pluvi\xc3\xb4se' : 5, u'vent\xc3\xb4se' : 6,
u'pluvi\xc3\xb4se' : 5, u'vent\xc3\xb4se' : 6,
'germinal' : 7, u'flor\xc3\xa9al' : 8,
'prairial' : 9, 'messidor' : 10,
'thermidor' : 11, 'fructidor' : 12,
@ -239,6 +239,7 @@ class DateParser:
self._mod_str = '(' + '|'.join(
[ key.replace('.','\.') for key in self.modifier_to_int.keys() ]
) + ')'
# Need to reverse-sort the keys, so that April matches before Apr does.
# Otherwise, 'april 2000' would be matched as 'apr' + garbage ('il 2000')
_month_keys = self.month_to_int.keys()
@ -263,6 +264,7 @@ class DateParser:
re.IGNORECASE)
self._modifier = re.compile('%s\s+(.*)' % self._mod_str,
re.IGNORECASE)
self._abt2 = re.compile('<(.*)>',re.IGNORECASE)
self._text = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?' % self._mon_str,
re.IGNORECASE)
self._text2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?' % self._mon_str,
@ -283,8 +285,6 @@ class DateParser:
re.IGNORECASE)
self._itext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?' % self._imon_str,
re.IGNORECASE)
self._range2 = re.compile('%s\s+(\d+)-(\d+)\s*,?\s*((\d+)(/\d+)?)?' % self._mon_str,
re.IGNORECASE)
self._numeric = re.compile("((\d+)[/\.])?((\d+)[/\.])?(\d+)")
self._iso = re.compile("(\d+)-(\d+)-(\d+)")
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"
@ -474,31 +474,6 @@ class DateParser:
return 1
return 0
def match_range2(self,text,cal,qual,date):
"""
Try matching numerical range date.
On success, set the date and return 1. On failure return 0.
"""
match = self._range2.match(text)
if match:
grps = match.groups()
m = self.month_to_int[grps[0].lower()]
d0 = self._get_int(grps[1])
d1 = self._get_int(grps[2])
if grps[3] == None:
y = 0
s = None
else:
y = int(grps[3])
s = grps[4] != None
date.set(qual,Date.MOD_RANGE,Date.CAL_GREGORIAN,
(d0,m,y,s,d1,m,y,s))
return 1
return 0
def match_bce(self,text):
"""
Try matching BCE qualifier.
@ -527,8 +502,18 @@ class DateParser:
date.set(qual,mod,cal,self.invert_year(start))
else:
date.set(qual,mod,cal,start)
return 1
return 0
return True
match = self._abt2.match(text)
if match:
grps = match.groups()
start = self._parse_subdate(grps[0])
mod = Date.MOD_ABOUT
if bc:
date.set(qual,mod,cal,self.invert_year(start))
else:
date.set(qual,mod,cal,start)
return True
return False
def set_date(self,date,text):
"""
@ -544,8 +529,6 @@ class DateParser:
return
if self.match_range(text,cal,qual,date):
return
if self.match_range2(text,cal,qual,date):
return
(text,bc) = self.match_bce(text)
if self.match_modifier(text,cal,qual,bc,date):

View File

@ -28,6 +28,7 @@
import os
import locale
import ListBox
import sets
from gettext import gettext as _
#-------------------------------------------------------------------------
@ -60,6 +61,7 @@ import DateHandler
import NameDisplay
import NameEdit
import NoteEdit
import Spell
from QuestionDialog import WarningDialog, ErrorDialog, SaveDialog, QuestionDialog2
@ -97,6 +99,7 @@ class EditPerson:
self.dp = DateHandler.parser
self.dd = DateHandler.displayer
self.nd = NameDisplay.displayer
self.orig_handle = person.get_handle()
# UGLY HACK to refresh person object from handle if that exists
# done to ensure that the person object is not stale, as it could
@ -117,7 +120,6 @@ class EditPerson:
self.lists_changed = False
self.pdmap = {}
self.add_places = []
self.name_display = NameDisplay.displayer
self.should_guess_gender = (not person.get_gramps_id() and
person.get_gender () ==
RelLib.Person.UNKNOWN)
@ -165,6 +167,7 @@ class EditPerson:
self.notes_field = self.get_widget("personNotes")
self.notes_field.set_editable(mod)
self.spell_notes = Spell.Spell(self.notes_field)
self.flowed = self.get_widget("flowed")
self.flowed.set_sensitive(mod)
self.preform = self.get_widget("preform")
@ -455,20 +458,20 @@ class EditPerson:
self.window.destroy()
def add_itself_to_winsmenu(self):
## self.parent_window.child_windows[self.orig_handle] = self
## win_menu_label = self.name_display.display(self.person)
## if not win_menu_label.strip():
## win_menu_label = _("New Person")
## self.win_menu_item = gtk.MenuItem(win_menu_label)
## self.win_menu_item.set_submenu(gtk.Menu())
## self.win_menu_item.show()
## self.uistate.winsmenu.append(self.win_menu_item)
## self.winsmenu = self.win_menu_item.get_submenu()
## self.menu_item = gtk.MenuItem(_('Edit Person'))
## self.menu_item.connect("activate",self.present)
## self.menu_item.show()
## self.winsmenu.append(self.menu_item)
return
self.parent_window.child_windows[self.orig_handle] = self
win_menu_label = self.name_display.display(self.person)
if not win_menu_label.strip():
win_menu_label = _("New Person")
self.win_menu_item = gtk.MenuItem(win_menu_label)
self.win_menu_item.set_submenu(gtk.Menu())
self.win_menu_item.show()
self.uistate.winsmenu.append(self.win_menu_item)
self.winsmenu = self.win_menu_item.get_submenu()
self.menu_item = gtk.MenuItem(_('Edit Person'))
self.menu_item.connect("activate",self.present)
self.menu_item.show()
self.winsmenu.append(self.menu_item)
def remove_itself_from_winsmenu(self):
return
@ -692,7 +695,7 @@ class EditPerson:
the close window"""
if self.did_data_change() and not GrampsKeys.get_dont_ask():
n = "<i>%s</i>" % self.person.get_primary_name().get_regular_name()
n = "<i>%s</i>" % self.nd.display(self.person)
SaveDialog(_('Save changes to %s?') % n,
_('If you close without saving, the changes you '
'have made will be lost'),
@ -708,7 +711,7 @@ class EditPerson:
"""If the data has changed, give the user a chance to cancel
the close window"""
if self.did_data_change() and not GrampsKeys.get_dont_ask():
n = "<i>%s</i>" % self.person.get_primary_name().get_regular_name()
n = "<i>%s</i>" % self.nd.display(self.person)
SaveDialog(_('Save Changes to %s?') % n,
_('If you close without saving, the changes you '
'have made will be lost'),
@ -909,7 +912,7 @@ class EditPerson:
if not person:
self.person.set_gramps_id(idval)
else:
n = self.name_display.display(person)
n = self.nd.display(person)
msg1 = _("GRAMPS ID value was not changed.")
msg2 = _("You have attempted to change the GRAMPS ID to a value "
"of %(grampsid)s. This value is already used by %(person)s.") % {
@ -946,11 +949,6 @@ class EditPerson:
self.build_pdmap()
# if not self.orig_birth.are_equal(self.birth):
# if self.orig_birth.is_empty():
# self.db.add_event(self.birth,trans)
# self.person.set_birth_handle(self.birth.get_handle())
# self.db.commit_event(self.birth,trans)
# Update each of the families child lists to reflect any
# change in ordering due to the new birth date
@ -1047,7 +1045,8 @@ class EditPerson:
if not self.person.get_gramps_id():
self.person.set_gramps_id(self.db.find_next_person_gramps_id())
self.db.commit_person(self.person, trans)
n = self.person.get_primary_name().get_regular_name()
n = self.nd.display(self.person)
for (event_ref,event) in self.event_box.get_changed_objects():
self.db.commit_event(event,trans)

View File

@ -48,6 +48,7 @@ import Utils
import Sources
import ImageSelect
import NameDisplay
import Spell
from DdTargets import DdTargets
@ -117,6 +118,7 @@ class EditPlace:
self.latitude.set_editable(mode)
self.note = self.top_window.get_widget("place_note")
self.note.set_editable(mode)
self.spell = Spell.Spell(self.note)
self.web_list = self.top_window.get_widget("web_list")
self.web_url = self.top_window.get_widget("web_url")

View File

@ -48,6 +48,7 @@ import ListModel
import RelLib
import NameDisplay
import RepositoryRefEdit
import Spell
#-------------------------------------------------------------------------
#
@ -207,6 +208,7 @@ class EditSource:
self.abbrev = self.top_window.get_widget("abbrev")
self.note = self.top_window.get_widget("source_note")
self.note.set_editable(mode)
self.spell = Spell.Spell(self.note)
self.notes_buffer = self.note.get_buffer()
self.gallery_label = self.top_window.get_widget("source_edit_gallery")
self.refs_label = self.top_window.get_widget("source_edit_refs")

View File

@ -26,6 +26,7 @@
#
#-------------------------------------------------------------------------
from gettext import gettext as _
import sets
#-------------------------------------------------------------------------
#
@ -51,6 +52,8 @@ import Date
from DateHandler import parser as _dp, displayer as _dd
import ImageSelect
import DateEdit
import Spell
from QuestionDialog import WarningDialog, ErrorDialog
#-------------------------------------------------------------------------
@ -109,6 +112,15 @@ class EventEditor:
self.plist = []
self.pmap = {}
self.dp = DateHandler.parser
self.dd = DateHandler.displayer
# build list for menu
values = sets.Set(elist)
values.union(self.get_event_names())
self.elist = list(values)
self.elist.sort()
for key in self.db.get_place_handles():
title = self.db.get_place_from_handle(key).get_title()
self.pmap[title] = key
@ -141,6 +153,7 @@ class EventEditor:
self.descr_field.set_editable(not noedit)
self.note_field = self.top.get_widget("eventNote")
self.note_field.set_editable(not noedit)
self.spell = Spell.Spell(self.note_field)
self.event_menu = self.top.get_widget("personal_events")
self.priv = self.top.get_widget("priv")
self.priv.set_sensitive(not noedit)
@ -401,6 +414,15 @@ class EventEditor:
else:
Utils.unbold_label(self.notes_label)
def commit(self,event,trans):
self.db.commit_event(event,trans)
def get_event_names(self):
data = sets.Set(self.db.get_family_event_types())
data.union(self.db.get_person_event_types())
return list(data)
#-------------------------------------------------------------------------
#
# EventRefEditor class

View File

@ -712,6 +712,9 @@ class FamilyView:
family.set_handle(fhandle)
family.set_gramps_id(self.parent.db.find_next_family_gramps_id())
if fhandle in old_person.get_family_handle_list():
return
old_person.add_family_handle(fhandle)
new_person.add_family_handle(fhandle)
@ -853,7 +856,7 @@ class FamilyView:
# commit the transaction
self.parent.db.commit_person(child,trans)
n = child.get_primary_name().get_regular_name()
n = NameDisplay.displayer.display(child)
self.parent.db.transaction_commit(trans,_("Remove Child (%s)") % n)
self.parent.db.enable_all_signals()
self.parent.db.emit('family-update',([family.get_handle()],))
@ -904,7 +907,7 @@ class FamilyView:
person_id = cur_person.get_handle()
self.person = self.parent.db.get_person_from_handle(person_id)
n = self.person.get_primary_name().get_regular_name()
n = NameDisplay.displayer.display(self.person)
self.parent.db.transaction_commit(trans,_("Remove Spouse (%s)") % n)
if len(self.person.get_family_handle_list()) <= 1:
@ -1430,7 +1433,7 @@ class FamilyView:
self.parent.db.remove_family(fam,trans)
self.parent.db.commit_person(person,trans)
n = person.get_primary_name().get_regular_name()
n = NameDisplay.displayer.display(person)
self.parent.db.transaction_commit(trans,_("Remove Parents (%s)") % n)
self.load_family()

View File

@ -102,6 +102,9 @@ class Rule:
def set_list(self,list):
assert type(list) == type([]) or list == None, "Argument is not a list"
assert len(list) == len(self.labels), \
"Number of arguments does not match number of labels.\n"\
"list: %s\nlabels: %s" % (list,self.labels)
self.list = list
def values(self):
@ -999,10 +1002,10 @@ class HasEvent(Rule):
description = _("Matches people with a personal event of a particular value")
category = _('Event filters')
def prepare(self,list):
def prepare(self,db):
self.date = None
try:
if self.list and self.list[1]:
if self.list[1]:
self.date = DateHandler.parser.parse(self.list[1])
except: pass
@ -1048,12 +1051,13 @@ class HasFamilyEvent(Rule):
description = _("Matches people with a family event of a particular value")
category = _('Event filters')
def prepare(self,list):
def prepare(self,db):
self.date = None
try:
if self.list and self.list[1]:
if self.list[1]:
self.date = DateHandler.parser.parse(self.list[1])
except: pass
except:
pass
def apply(self,db,person):
for f_id in person.get_family_handle_list():
@ -1071,12 +1075,16 @@ class HasFamilyEvent(Rule):
if self.date:
if date_cmp(self.date,event.get_date_object()):
val = 0
pl_id = event.get_place_handle()
if pl_id:
pl = db.get_place_from_handle(pl_id)
pn = pl.get_title()
if self.list[2] and pn.find(self.list[2].upper()) == -1:
if self.list[2]:
pl_id = event.get_place_handle()
if pl_id:
pl = db.get_place_from_handle(pl_id)
pn = pl.get_title().upper()
if pn.find(self.list[2].upper()) == -1:
val = 0
else:
val = 0
if val == 1:
return True
return False
@ -1105,7 +1113,7 @@ class HasRelationship(Rule):
for f_id in person.get_family_handle_list():
f = db.get_family_from_handle(f_id)
cnt = cnt + len(f.get_child_handle_list())
if self.list[1] and int(self.list[1]) == f.get_relationship():
if self.list[1] and int(self.list[1]) == f.get_relationship():
rel_type = 1
# if number of relations specified
@ -1147,7 +1155,7 @@ class HasBirth(Rule):
def __init__(self,list):
Rule.__init__(self,list)
if self.list and self.list[0]:
if self.list[0]:
self.date = DateHandler.parser.parse(self.list[0])
else:
self.date = None
@ -1158,16 +1166,20 @@ class HasBirth(Rule):
return False
event = db.get_event_from_handle(event_handle)
ed = event.get_description().upper()
if len(self.list) > 2 and ed.find(self.list[2].upper())==-1:
if self.list[2] \
and ed.find(self.list[2].upper())==-1:
return False
if self.date:
if date_cmp(self.date,event.get_date_object()) == 0:
return False
pl_id = event.get_place_handle()
if pl_id:
pl = db.get_place_from_handle(pl_id)
pn = pl.get_title()
if len(self.list) > 1 and pn.find(self.list[1].upper()) == -1:
if self.list[1]:
pl_id = event.get_place_handle()
if pl_id:
pl = db.get_place_from_handle(pl_id)
pn = pl.get_title().upper()
if pn.find(self.list[1].upper()) == -1:
return False
else:
return False
return True
@ -1186,7 +1198,7 @@ class HasDeath(Rule):
def __init__(self,list):
Rule.__init__(self,list)
if self.list and self.list[0]:
if self.list[0]:
self.date = DateHandler.parser.parse(self.list[0])
else:
self.date = None
@ -1197,16 +1209,20 @@ class HasDeath(Rule):
return False
event = db.get_event_from_handle(event_handle)
ed = event.get_description().upper()
if self.list[2] and ed.find(self.list[2].upper())==-1:
if self.list[2] \
and ed.find(self.list[2].upper())==-1:
return False
if self.date:
if date_cmp(self.date,event.get_date_object()) == 0:
return False
pl_id = event.get_place_handle()
if pl_id:
pl = db.get_place_from_handle(pl_id)
pn = pl.get_title()
if self.list[1] and pn.find(self.list[1].upper()) == -1:
if self.list[1]:
pl_id = event.get_place_handle()
if pl_id:
pl = db.get_place_from_handle(pl_id)
pn = pl.get_title().upper()
if self.list[1] and pn.find(self.list[1].upper()) == -1:
return False
else:
return False
return True
@ -1591,21 +1607,17 @@ class IsWitness(Rule):
return person.handle in self.map
def build_witness_list(self):
event_type = None
if self.list and self.list[0]:
event_type = self.list[0]
if not self.list or event_type:
for person_handle in self.db.get_person_handles():
p = self.db.get_person_from_handle(person_handle)
self.get_witness_of_events( event_type,
p.get_event_list()+[p.get_birth_handle(), p.get_death_handle()])
event_type = None
if self.list and self.list[1]:
event_type = self.list[1]
if not self.list or event_type:
for family_handle in self.db.get_family_handles():
f = self.db.get_family_from_handle(family_handle)
self.get_witness_of_events(event_type, f.get_event_list())
for person_handle in self.db.get_person_handles():
p = self.db.get_person_from_handle(person_handle)
self.get_witness_of_events(self.list[0],
p.get_event_list()+
[p.get_birth_handle(),
p.get_death_handle()]
)
for family_handle in self.db.get_family_handles():
f = self.db.get_family_from_handle(family_handle)
self.get_witness_of_events(self.list[1],f.get_event_list())
def get_witness_of_events(self, event_type, event_list):
if not event_list:
@ -1672,7 +1684,7 @@ class HasTextMatchingSubstringOf(Rule):
def apply(self,db,person):
if person.handle in self.person_map: # Cached by matching Source?
return self.person_map[handle]
return self.person_map[person.handle]
if self.match_object(person): # first match the person itself
return True
for event_handle in person.get_event_list()+[person.get_birth_handle(), person.get_death_handle()]:
@ -1854,7 +1866,7 @@ class HasNoteMatchingSubstringOf(Rule):
def apply(self,db,person):
n = person.get_note()
if n:
return n.find(self.list[0]) != -1
return n.upper().find(self.list[0].upper()) != -1
return False
#-------------------------------------------------------------------------
@ -2269,8 +2281,12 @@ class FilterParser(handler.ContentHandler):
def endElement(self,tag):
if tag == "rule" and self.r != None:
rule = self.r(self.a)
self.f.add_rule(rule)
if 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)
self.f.add_rule(rule)
def characters(self, data):
pass
@ -2287,7 +2303,15 @@ class ParamFilter(GenericFilter):
def apply(self,db,id_list=None):
for rule in self.flist:
rule.set_list(self.param_list)
#rule.set_list(self.param_list)
#
# The above breaks filters with more than one param
# Need to change existing params one by one to keep
# the correct number of arguments
new_list = rule.list[:]
for ix in range(len(self.param_list)):
new_list[ix] = self.param_list[ix]
rule.set_list(new_list)
for rule in self.flist:
rule.prepare(db)
result = GenericFilter.apply(self,db,id_list)
@ -2369,7 +2393,7 @@ class GrampsFilterComboBox(gtk.ComboBox):
active = self.get_active()
if active < 0:
return None
key = unicode(self.store[active][0])
key = self.store[active][0]
return self.map[key]

View File

@ -32,6 +32,7 @@ Provides the Berkeley DB (BSDDB) database backend for GRAMPS
import os
import time
import locale
import sets
from gettext import gettext as _
from bsddb import dbshelve, db
@ -137,6 +138,7 @@ class GrampsBSDDB(GrampsDbBase):
self.env.open(os.path.dirname(name), flags)
name = os.path.basename(name)
self.save_name = name
self.family_map = self.dbopen(name, "family")
self.place_map = self.dbopen(name, "places")
@ -206,12 +208,15 @@ class GrampsBSDDB(GrampsDbBase):
self.place_map.associate(self.pid_trans, find_idmap, openflags)
self.media_map.associate(self.oid_trans, find_idmap, openflags)
self.source_map.associate(self.sid_trans, find_idmap, openflags)
self.event_map.associate(self.eventnames, find_eventname, openflags)
self.undodb = db.DB()
self.undodb.open(self.undolog, db.DB_RECNO, db.DB_CREATE)
self.metadata = self.dbopen(name, "meta")
self.bookmarks = self.metadata.get('bookmarks')
self.family_event_names = sets.Set(self.metadata.get('fevent_names',[]))
self.individual_event_names = sets.Set(self.metadata.get('pevent_names',[]))
self.family_attributes = sets.Set(self.metadata.get('fattr_names',[]))
self.individual_attributes = sets.Set(self.metadata.get('pattr_names',[]))
gstats = self.metadata.get('gender_stats')
@ -227,6 +232,99 @@ class GrampsBSDDB(GrampsDbBase):
self.genderStats = GenderStats(gstats)
return 1
def rebuild_secondary(self,callback=None):
# Repair secondary indices related to person_map
self.id_trans.close()
self.surnames.close()
self.id_trans = db.DB(self.env)
self.id_trans.set_flags(db.DB_DUP)
self.id_trans.open(self.save_name, "idtrans", db.DB_HASH,
flags=db.DB_CREATE)
self.id_trans.truncate()
self.surnames = db.DB(self.env)
self.surnames.set_flags(db.DB_DUP)
self.surnames.open(self.save_name, "surnames", db.DB_HASH,
flags=db.DB_CREATE)
self.surnames.truncate()
self.person_map.associate(self.surnames, find_surname, db.DB_CREATE)
self.person_map.associate(self.id_trans, find_idmap, db.DB_CREATE)
for key in self.person_map.keys():
if callback:
callback()
self.person_map[key] = self.person_map[key]
self.person_map.sync()
# Repair secondary indices related to family_map
self.fid_trans.close()
self.fid_trans = db.DB(self.env)
self.fid_trans.set_flags(db.DB_DUP)
self.fid_trans.open(self.save_name, "fidtrans", db.DB_HASH,
flags=db.DB_CREATE)
self.fid_trans.truncate()
self.family_map.associate(self.fid_trans, find_idmap, db.DB_CREATE)
for key in self.family_map.keys():
if callback:
callback()
self.family_map[key] = self.family_map[key]
self.family_map.sync()
# Repair secondary indices related to place_map
self.pid_trans.close()
self.pid_trans = db.DB(self.env)
self.pid_trans.set_flags(db.DB_DUP)
self.pid_trans.open(self.save_name, "pidtrans", db.DB_HASH,
flags=db.DB_CREATE)
self.pid_trans.truncate()
self.place_map.associate(self.pid_trans, find_idmap, db.DB_CREATE)
for key in self.place_map.keys():
if callback:
callback()
self.place_map[key] = self.place_map[key]
self.place_map.sync()
# Repair secondary indices related to media_map
self.oid_trans.close()
self.oid_trans = db.DB(self.env)
self.oid_trans.set_flags(db.DB_DUP)
self.oid_trans.open(self.save_name, "oidtrans", db.DB_HASH,
flags=db.DB_CREATE)
self.oid_trans.truncate()
self.media_map.associate(self.oid_trans, find_idmap, db.DB_CREATE)
for key in self.media_map.keys():
if callback:
callback()
self.media_map[key] = self.media_map[key]
self.media_map.sync()
# Repair secondary indices related to source_map
self.sid_trans.close()
self.sid_trans = db.DB(self.env)
self.sid_trans.set_flags(db.DB_DUP)
self.sid_trans.open(self.save_name, "sidtrans", db.DB_HASH,
flags=db.DB_CREATE)
self.sid_trans.truncate()
self.source_map.associate(self.sid_trans, find_idmap, db.DB_CREATE)
for key in self.source_map.keys():
if callback:
callback()
self.source_map[key] = self.source_map[key]
self.source_map.sync()
def abort_changes(self):
while self.undo():
pass
@ -246,6 +344,10 @@ class GrampsBSDDB(GrampsDbBase):
if not self.readonly:
self.metadata['bookmarks'] = self.bookmarks
self.metadata['gender_stats'] = self.genderStats.save_stats()
self.metadata['fevent_names'] = list(self.family_event_names)
self.metadata['pevent_names'] = list(self.individual_event_names)
self.metadata['fattr_names'] = list(self.family_attributes)
self.metadata['pattr_names'] = list(self.individual_attributes)
self.metadata.close()
self.surnames.close()
self.eventnames.close()
@ -305,6 +407,7 @@ class GrampsBSDDB(GrampsDbBase):
self.name_group.delete(name)
else:
self.name_group[name] = group
self.emit('person-rebuild')
def get_surname_list(self):
names = self.surnames.keys()
@ -319,7 +422,6 @@ class GrampsBSDDB(GrampsDbBase):
names = self.eventnames.keys()
a = {}
for name in names:
a[unicode(name)] = 1
vals = a.keys()
vals.sort()
@ -496,7 +598,6 @@ class GrampsBSDDB(GrampsDbBase):
self.sid_trans.sync()
self.rid_trans.sync()
self.oid_trans.sync()
self.eventnames.sync()
self.undodb.sync()
def upgrade(self):
@ -519,10 +620,8 @@ class GrampsBSDDB(GrampsDbBase):
if version < 7:
self.upgrade_7()
if version < 8:
#self.upgrade_7()
raise Exception("Currently there is no database upgrade available")
else:
print 'Successfully finished all upgrades'
self.upgrade_9()
self.metadata['version'] = _DBVERSION
def upgrade_2(self,child_rel_notrans):
@ -866,6 +965,34 @@ class GrampsBSDDB(GrampsDbBase):
def upgrade_8(self):
print "Upgrading to DB version 8"
cursor = self.get_person_cursor()
data = cursor.first()
while data:
handle,val = data
handle_list = val[8]
if type(handle_list) == list:
# Check to prevent crash on corrupted data (event_list=None)
for handle in handle_list:
event = self.get_event_from_handle(handle)
self.individual_event_names.add(event.name)
data = cursor.next()
cursor.close()
cursor = self.get_family_cursor()
data = cursor.first()
while data:
handle,val = data
handle_list = val[6]
if type(handle_list) == list:
# Check to prevent crash on corrupted data (event_list=None)
for handle in handle_list:
event = self.get_event_from_handle(handle)
self.family_event_names.add(event.name)
data = cursor.next()
cursor.close()
def upgrade_9(self):
print "Upgrading to DB version 9"
# First, make sure the stored default person handle is str, not unicode
try:
handle = self.metadata['default']
@ -887,4 +1014,4 @@ class GrampsBSDDB(GrampsDbBase):
self.commit_source(source,trans)
data = cursor.next()
cursor.close()
self.transaction_commit(trans,"Upgrade to DB version 7")
self.transaction_commit(trans,"Upgrade to DB version 9")

View File

@ -36,6 +36,7 @@ import random
import locale
import re
from sys import maxint
import sets
from gettext import gettext as _
#-------------------------------------------------------------------------
@ -174,6 +175,11 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
self.omap_index = 0
self.rmap_index = 0
self.family_event_names = sets.Set()
self.individual_event_names = sets.Set()
self.individual_attributes = sets.Set()
self.family_attributes = sets.Set()
self.set_person_id_prefix(GrampsKeys.get_person_id_prefix())
self.set_object_id_prefix(GrampsKeys.get_object_id_prefix())
self.set_family_id_prefix(GrampsKeys.get_family_id_prefix())
@ -201,7 +207,6 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
self.repository_map = None
self.media_map = None
self.event_map = None
self.eventnames = None
self.metadata = None
self.name_group = None
self.undo_callback = None
@ -217,6 +222,9 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
self.place2title = {}
self.name_group = {}
def rebuild_secondary(self,callback=None):
pass
def version_supported(self):
""" Returns True when the file has a supported version"""
return True
@ -330,7 +338,10 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
self.genderStats.count_person(person,self)
else:
self.genderStats.count_person(person,self)
for attr in person.attribute_list:
self.individual_attributes.add(attr.type)
def commit_media_object(self,obj,transaction,change_time=None):
"""
Commits the specified MediaObject to the database, storing the changes
@ -358,6 +369,14 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
transaction.place_update, transaction.place_add,
transaction, change_time)
def commit_personal_event(self,event,transaction,change_time=None):
self.individual_event_names.add(event.name)
self.commit_event(event,transaction,change_time)
def commit_family_event(self,event,transaction,change_time=None):
self.family_event_names.add(event.name)
self.commit_event(event,transaction,change_time)
def commit_event(self,event,transaction,change_time=None):
"""
Commits the specified Event to the database, storing the changes
@ -376,6 +395,9 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
transaction.family_update, transaction.family_add,
transaction, change_time)
for attr in family.attribute_list:
self.family_attributes.add(attr.type)
def commit_repository(self,repository,transaction,change_time=None):
"""
Commits the specified Repository to the database, storing the changes
@ -740,6 +762,36 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
"""
return len(self.person_map)
def get_number_of_families(self):
"""
Returns the number of families currently in the databse.
"""
return len(self.family_map)
def get_number_of_events(self):
"""
Returns the number of events currently in the databse.
"""
return len(self.event_map)
def get_number_of_places(self):
"""
Returns the number of places currently in the databse.
"""
return len(self.place_map)
def get_number_of_sources(self):
"""
Returns the number of sources currently in the databse.
"""
return len(self.source_map)
def get_number_of_media_objects(self):
"""
Returns the number of media objects currently in the databse.
"""
return len(self.media_map)
def get_person_handles(self,sort_handles=True):
"""
Returns a list of database handles, one handle for each Person in
@ -1082,7 +1134,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
Returns the list of personal event types contained within the
database. The function must be overridden in the derived class.
"""
assert False, "Needs to be overridden in the derived class"
return list(self.individual_event_names)
def get_bookmarks(self):
"""returns the list of Person handles in the bookmarks"""
@ -1130,22 +1182,23 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
def get_person_event_types(self):
"""returns a list of all Event types assocated with Person
instances in the database"""
return []
return list(self.individual_event_names)
def get_person_attribute_types(self):
"""returns a list of all Attribute types assocated with Person
instances in the database"""
return []
return list(self.individual_attributes)
def get_family_attribute_types(self):
"""returns a list of all Attribute types assocated with Family
instances in the database"""
return []
return list(self.family_attributes)
def get_family_event_types(self):
"""returns a list of all Event types assocated with Family
instances in the database"""
return []
return list(self.family_event_names)
def get_media_attribute_types(self):
"""returns a list of all Attribute types assocated with Media

View File

@ -34,6 +34,7 @@ from bsddb import dbshelve, db
#-------------------------------------------------------------------------
from RelLib import *
from GrampsDbBase import *
import sets
class GrampsInMemCursor(GrampsCursor):
"""
@ -120,6 +121,9 @@ class GrampsInMemDB(GrampsDbBase):
def get_media_cursor(self):
return GrampsInMemCursor(self.media_map)
def get_event_cursor(self):
return GrampsInMemCursor(self.event_map)
def close(self):
if not self.readonly:
self.undodb.close()
@ -164,7 +168,18 @@ class GrampsInMemDB(GrampsDbBase):
vals.sort()
return vals
#FIXME: WHICH one to keep?
def _del_person(self,handle):
#def remove_person(self,handle,transaction):
if self.readonly or not handle or str(handle) not in self.person_map:
return
person = self.get_person_from_handle(handle)
self.genderStats.uncount_person (person)
if transaction != None:
old_data = self.person_map.get(handle)
transaction.add(PERSON_KEY,handle,old_data)
self.emit('person-delete',([handle],))
del self.id_trans[person.get_gramps_id()]
del self.person_map[handle]

View File

@ -58,6 +58,7 @@ import DateEdit
import DateHandler
import Date
import ImgManip
import Spell
from QuestionDialog import ErrorDialog
from DdTargets import DdTargets
@ -283,10 +284,18 @@ class Gallery(ImageSelect):
int(event.x),int(event.y)):
self.drag_item = widget.get_item_at(self.remember_x,
self.remember_y)
icon_index = self.get_index(widget,event.x,event.y)-1
icon_index = self.get_index(widget,event.x,event.y)
if icon_index == -1:
return
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]
handle = self.sel_obj.get_reference_handle()
media_obj = self.db.get_object_from_handle(handle)
if self.drag_item:
widget.drag_begin([DdTargets.MEDIAOBJ.target()]+_drag_targets,
gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE,
@ -328,13 +337,6 @@ class Gallery(ImageSelect):
return True
elif event.type == gtk.gdk.BUTTON_RELEASE:
self.button = 0
# elif event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1:
# item = widget.get_item_at(event.x,event.y)
# if item:
# (i,t,b,self.photo,oid) = self.p_map[item]
# LocalMediaProperties(self.photo,self.path,self,self.parent_window)
# self.in_event = 0
# return True
elif event.type == gtk.gdk.MOTION_NOTIFY:
if event.state & gtk.gdk.BUTTON1_MASK:
# Get the new position and move by the difference
@ -453,9 +455,9 @@ class Gallery(ImageSelect):
Utils.unbold_label(self.parent.gallery_label)
def get_index(self,obj,x,y):
x_offset = x/(_IMAGEX+_PAD)
y_offset = y/(_IMAGEY+_PAD)
index = (y_offset*(1+self.max))+x_offset
x_offset = int(x)/(_IMAGEX+_PAD)
y_offset = int(y)/(_IMAGEY+_PAD)
index = (y_offset*(self.max))+x_offset
return min(index,len(self.dataobj.get_media_list()))
def on_photolist_drag_data_received(self,w, context, x, y, data, info, time):
@ -712,6 +714,7 @@ class LocalMediaProperties:
mt = Utils.get_mime_description(mtype)
self.change_dialog.get_widget("type").set_text(mt)
self.notes = self.change_dialog.get_widget("notes")
self.spell = Spell.Spell(self.notes)
if self.photo.get_note():
self.notes.get_buffer().set_text(self.photo.get_note())
Utils.bold_label(self.notes_label)
@ -732,7 +735,9 @@ class LocalMediaProperties:
})
media_obj = self.db.get_object_from_handle(self.photo.get_reference_handle())
global_note = self.change_dialog.get_widget('global_notes').get_buffer()
gnote = self.change_dialog.get_widget('global_notes')
spell = Spell.Spell(gnote)
global_note = gnote.get_buffer()
global_note.insert_at_cursor(media_obj.get_note())
self.redraw_attr_list()
@ -920,15 +925,14 @@ class GlobalMediaProperties:
self.notes = self.change_dialog.get_widget("notes")
self.notes.set_editable(mode)
self.spell = Spell.Spell(self.notes)
self.date_edit = self.change_dialog.get_widget("date_edit")
self.date_edit.set_sensitive(mode)
self.date_check = DateEdit.DateEdit(
self.date_object,
self.date_entry,
self.date_edit,
self.window)
self.date_object, self.date_entry,
self.date_edit, self.window)
self.pixmap = self.change_dialog.get_widget("pixmap")
self.attr_type = self.change_dialog.get_widget("attr_type")

View File

@ -120,3 +120,9 @@ def get_thumbnail_image(path):
return gtk.gdk.pixbuf_new_from_file(filename)
except gobject.GError:
return None
def get_thumbnail_path(path):
filename = _build_thumb_path(path)
if not os.path.isfile(filename):
set_thumbnail_image(path)
return filename

View File

@ -1,10 +1,12 @@
# $Id$
# This is the src level Makefile for Gramps
SUBDIRS = docgen plugins dates data po
# For intl. support, how do we compile?
MOSTLYCLEANFILES =
CLEANFILES = const.pyc const.pyo
# What are the PYTHON scripts for this package that need to be handled?
#
# We only want optimized byte-compiled (.pyo) versions, no .pyc
@ -123,7 +125,8 @@ gdir_PYTHON = \
ReadGrdb.py\
WriteGrdb.py\
EventView.py\
SelectEvent.py
SelectEvent.py\
Spell.py
# Could use GNU make's ':=' syntax for nice wildcard use.
# If not using GNU make, then list all files individually

View File

@ -27,6 +27,7 @@
#-------------------------------------------------------------------------
import cPickle as pickle
from gettext import gettext as _
import sets
#-------------------------------------------------------------------------
#
@ -58,6 +59,7 @@ import NameDisplay
import Date
import DateEdit
import DateHandler
import Spell
from QuestionDialog import QuestionDialog, WarningDialog, SaveDialog
from DdTargets import DdTargets
@ -161,6 +163,7 @@ class Marriage:
self.type_field.set_sensitive(mode)
self.notes_field = self.get_widget("marriageNotes")
self.notes_field.set_editable(mode)
self.spell = Spell.Spell(self.notes_field)
self.gid = self.get_widget("gid")
self.gid.set_editable(mode)
self.attr_list = self.get_widget("attr_list")
@ -805,9 +808,9 @@ class Marriage:
name = NameDisplay.displayer.display(father)
else:
name = NameDisplay.displayer.display(mother)
attr_list = list(sets.Set(const.familyAttributes + self.db.get_family_attribute_types()))
AttrEdit.AttributeEditor(
self, attr, name, const.familyAttributes,
self.attr_edit_callback, self.window)
self, attr, name, attr_list, self.attr_edit_callback, self.window)
def on_delete_attr_clicked(self,obj):
if Utils.delete_selected(obj,self.alist):
@ -828,9 +831,9 @@ class Marriage:
name = NameDisplay.displayer.display(father)
else:
name = NameDisplay.displayer.display(mother)
attr_list = list(sets.Set(const.familyAttributes + self.db.get_family_attribute_types()))
AttrEdit.AttributeEditor(
self, None, name, const.familyAttributes,
self.attr_edit_callback, self.window)
self, None, name, attr_list, self.attr_edit_callback, self.window)
def move_element(self,list,src,dest):
if src == -1:

View File

@ -172,4 +172,3 @@ class MediaView(PageView.ListView):
import NoteEdit
NoteEdit.NoteEditor(obj,self.parent,self.topWindow,
self.note_callback)

View File

@ -26,6 +26,7 @@
#
#-------------------------------------------------------------------------
from gettext import gettext as _
import sets
#-------------------------------------------------------------------------
#
@ -47,6 +48,7 @@ import Utils
import NameDisplay
import const
import DateHandler
import QuestionDialog
sex = ( _("female"), _("male"), _("unknown"))
@ -80,13 +82,26 @@ class Compare:
help_display('gramps-manual','adv-merge-people')
def merge(self,obj):
if self.glade.get_widget('select1').get_active():
merge = MergePeople(self.db,self.p1,self.p2)
if check_for_spouse(self.p1,self.p2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Spouses cannot be merged. To merge these people, "
"you must first break the relationship between them."))
elif check_for_child(self.p1,self.p2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("A parent and child cannot be merged. To merge these "
"people, you must first break the relationship between "
"them."))
else:
merge = MergePeople(self.db,self.p2,self.p1)
self.top.destroy()
merge.merge()
self.update()
if self.glade.get_widget('select1').get_active():
merge = MergePeople(self.db,self.p1,self.p2)
else:
merge = MergePeople(self.db,self.p2,self.p1)
self.top.destroy()
merge.merge()
self.update()
def add(self, tobj, tag, text):
text += "\n"
@ -214,6 +229,23 @@ class Compare:
return ""
def check_for_spouse(p1, p2):
f1 = sets.Set(p1.get_family_handle_list())
f2 = sets.Set(p2.get_family_handle_list())
return len(f1.intersection(f2)) != 0
def check_for_child(p1, p2):
fs1 = sets.Set(p1.get_family_handle_list())
fp1 = sets.Set(map(lambda x: x[0], p1.get_parent_family_handle_list()))
fs2 = sets.Set(p2.get_family_handle_list())
fp2 = sets.Set(map(lambda x: x[0], p2.get_parent_family_handle_list()))
return len(fs1.intersection(fp2)) != 0 or len(fs2.intersection(fp1))
#-------------------------------------------------------------------------
#
# Merge People UI
@ -239,12 +271,25 @@ class MergePeopleUI:
ret = top.run()
if ret == gtk.RESPONSE_OK:
if p1.get_active():
merge = MergePeople(db,person1,person2)
if check_for_spouse(person1,person2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("Spouses cannot be merged. To merge these people, "
"you must first break the relationship between them."))
elif check_for_child(person1,person2):
QuestionDialog.ErrorDialog(
_("Cannot merge people"),
_("A parent and child cannot be merged. To merge these "
"people, you must first break the relationship between "
"them."))
else:
merge = MergePeople(db,person2,person1)
merge.merge()
update()
if p1.get_active():
merge = MergePeople(db,person1,person2)
else:
merge = MergePeople(db,person2,person1)
merge.merge()
update()
top.destroy()
def help(self,obj):

View File

@ -83,8 +83,12 @@ class NameDisplay:
@rtype: str
"""
name = person.get_primary_name()
if name.get_sort_as() == RelLib.Name.FNLN:
if name.sort_as == RelLib.Name.FNLN:
return self._fnln(name)
elif name.sort_as == RelLib.Name.PTFN:
return self._ptfn(name)
elif name.sort_as == RelLib.Name.FN:
return name.first_name
else:
return self._lnfn(name)
@ -99,8 +103,12 @@ class NameDisplay:
@returns: Returns the L{RelLib.Name} string representation
@rtype: str
"""
if name.get_sort_as() == RelLib.Name.FNLN:
if name.sort_as == RelLib.Name.FNLN:
return self._fnln(name)
elif name.sort_as == RelLib.Name.PTFN:
return self._ptfn(name)
elif name.sort_as == RelLib.Name.FN:
return name.first_name
else:
return self._lnfn(name)
@ -136,9 +144,37 @@ class NameDisplay:
return ""
elif name.display_as == RelLib.Name.LNFN:
return self._lnfn(name)
elif name.display_as == RelLib.Name.PTFN:
return self._ptfn(name)
else:
return self._fnln(name)
def _ptfn(self,name):
"""
Prints the Western style first name, last name style.
Typically this is::
SurnamePrefix Patronymic SurnameSuffix, FirstName
"""
first = name.first_name
if self.force_upper:
last = name.patronymic.upper()
else:
last = name.patronymic
if name.suffix == "":
if name.prefix:
return "%s %s, %s" % (name.prefix, last, first)
else:
return "%s, %s" % (last, first)
else:
if name.prefix:
return "%s %s %s, %s" % (name.prefix, last, name.suffix, first)
else:
return "%s %s, %s" % (last, name.suffix, first)
def _fnln(self,name):
"""
Prints the Western style first name, last name style.
@ -166,6 +202,21 @@ class NameDisplay:
return "%s %s %s, %s" % (first, name.prefix, last, name.suffix)
else:
return "%s %s, %s" % (first, last, name.suffix)
def name_grouping(self,db,person):
return self.name_grouping_name(db,person.primary_name)
def name_grouping_name(self,db,pn):
sv = pn.sort_as
if pn.group_as:
return pn.group_as
if sv <= RelLib.Name.LNFN:
val = pn.surname
elif sv == RelLib.Name.PTFN:
val = pn.patronymic
else:
val = pn.first_name
return db.get_name_group_mapping(val)
def _lnfn(self,name):
"""

View File

@ -49,6 +49,7 @@ import NameDisplay
import Date
import DateEdit
import DateHandler
import Spell
#-------------------------------------------------------------------------
#
@ -103,6 +104,8 @@ class NameEditor:
self.type_combo = self.top.get_widget("name_type")
self.note_field = self.top.get_widget("alt_note")
self.spell = Spell.Spell(self.note_field)
self.slist = self.top.get_widget('slist')
self.priv = self.top.get_widget("priv")
self.general_label = self.top.get_widget("general_tab")
@ -189,7 +192,8 @@ class NameEditor:
if self.name and self.name.get_group_as() != self.name.get_surname():
val = self.name.get_group_as()
else:
val = self.db.get_name_group_mapping(self.surname_field.get_text())
name = unicode(self.surname_field.get_text())
val = self.db.get_name_group_mapping(name)
self.group_as.set_text(val)
def on_group_over_toggled(self,obj):
@ -197,7 +201,9 @@ class NameEditor:
self.group_as.set_sensitive(True)
self.group_as.set_editable(True)
else:
self.group_as.set_text(self.db.get_name_group_mapping(self.surname_field.get_text()))
field_value = unicode(self.surname_field.get_text())
mapping = self.db.get_name_group_mapping(field_value)
self.group_as.set_text(mapping)
self.group_as.set_sensitive(False)
self.group_as.set_editable(False)
@ -269,8 +275,8 @@ class NameEditor:
self.name.set_source_reference_list(self.srcreflist)
grp_as = self.group_as.get_text()
srn = self.surname_field.get_text()
grp_as = unicode(self.group_as.get_text())
srn = unicode(self.surname_field.get_text())
if self.name.get_display_as() != self.display_as.get_active():
self.name.set_display_as(self.display_as.get_active())

View File

@ -36,6 +36,7 @@ import gtk.glade
from gettext import gettext as _
import const
import Utils
import Spell
#-------------------------------------------------------------------------
#
@ -80,6 +81,7 @@ class NoteEditor:
self.entry = self.glade.get_widget('note')
self.entry.get_buffer().set_text(self.data.get_note())
self.entry.set_editable(not self.readonly)
self.spellcheck = Spell.Spell(self.entry)
cancel_button = self.glade.get_widget('cancel')
ok_button = self.glade.get_widget('ok')

View File

@ -30,6 +30,7 @@ import time
import locale
import cgi
import sets
import sys
#-------------------------------------------------------------------------
#
@ -72,6 +73,25 @@ _EVENT_COL = 8
_FAMILY_COL= 9
_CHANGE_COL= 21
#-------------------------------------------------------------------------
#
# python 2.3 has a bug in the unicode sorting using locale.strcoll. Seems
# to have a buffer overrun. We can convince it to do the right thing by
# forcing the string to be nul terminated, sorting, then stripping off the
# nul.
#
#-------------------------------------------------------------------------
if sys.version_info[0:2] == (2,3):
def locale_sort(mylist):
mylist = map(lambda x: x + "\x00", mylist)
mylist.sort(locale.strcoll)
return map(lambda x: x[:-1], mylist)
else:
def locale_sort(mylist):
mylist.sort(locale.strcoll)
return mylist
#-------------------------------------------------------------------------
#
# PeopleModel
@ -122,27 +142,25 @@ class PeopleModel(gtk.GenericTreeModel):
self.sortnames = {}
cursor = self.db.get_person_cursor()
node = cursor.next()
ngn = NameDisplay.displayer.name_grouping_name
nsn = NameDisplay.displayer.sorted_name
while node:
if node[0] in flist:
primary_name = node[1][_NAME_COL]
if primary_name.group_as:
surname = primary_name.group_as
else:
surname = self.db.get_name_group_mapping(primary_name.surname)
self.sortnames[node[0]] = primary_name.sname
surname = unicode(ngn(self.db,primary_name))
self.sortnames[node[0]] = unicode(nsn(primary_name))
if self.temp_sname_sub.has_key(surname):
self.temp_sname_sub[surname].append(node[0])
else:
self.temp_sname_sub[surname] = [node[0]]
node = cursor.next()
cursor.close()
self.temp_top_path2iter = self.temp_sname_sub.keys()
self.temp_top_path2iter.sort(locale.strcoll)
self.temp_top_path2iter = locale_sort(self.temp_sname_sub.keys())
for name in self.temp_top_path2iter:
self.build_sub_entry(name)
def build_sub_entry(self,name):
slist = map(lambda x: (self.sortnames[x],x),self.temp_sname_sub[name])
slist.sort(self.byname)

View File

@ -52,6 +52,7 @@ from gtk.gdk import ACTION_COPY, BUTTON1_MASK
#-------------------------------------------------------------------------
import PeopleModel
import GenericFilter
import NameDisplay
from DdTargets import DdTargets
column_names = [
@ -165,9 +166,9 @@ class PeopleView:
index += 1
def build_tree(self):
self.person_model = PeopleModel.PeopleModel(self.parent.db,
self.DataFilter,
self.parent.filter_invert.get_active())
self.person_model = PeopleModel.PeopleModel(
self.parent.db,self.DataFilter,
self.parent.filter_invert.get_active())
self.person_tree.set_model(self.person_model)
def get_selected_objects(self):
@ -251,7 +252,7 @@ class PeopleView:
p = self.state.active
try:
path = self.person_model.on_get_path(p.get_handle())
group_name = p.get_primary_name().get_group_name()
group_name = NameDisplay.displayer.name_grouping(self.state.db,p)
top_name = self.state.db.get_name_group_mapping(group_name)
top_path = self.person_model.on_get_path(top_name)
self.person_tree.expand_row(top_path,0)
@ -330,7 +331,7 @@ class PeopleView:
def person_added(self,handle_list):
for node in handle_list:
person = self.parent.db.get_person_from_handle(node)
top = person.get_primary_name().get_group_name()
top = NameDisplay.displayer.name_grouping(self.parent.db,person)
self.person_model.rebuild_data(self.DataFilter)
if not self.person_model.is_visable(node):
continue
@ -348,7 +349,7 @@ class PeopleView:
person = self.parent.db.get_person_from_handle(node)
if not self.person_model.is_visable(node):
continue
top = person.get_primary_name().get_group_name()
top = NameDisplay.displayer.name_grouping(self.parent.db,person)
mylist = self.person_model.sname_sub.get(top,[])
if mylist:
try:
@ -373,11 +374,7 @@ class PeopleView:
# calculate the new data
if person.primary_name.group_as:
surname = person.primary_name.group_as
else:
surname = self.parent.db.get_name_group_mapping(person.primary_name.surname)
surname = NameDisplay.displayer.name_grouping(self.parent.db,person)
if oldpath[0] == surname:
self.person_model.build_sub_entry(surname)

View File

@ -335,7 +335,7 @@ class PersonView(PageView.PersonNavView):
all = GenericFilter.ParamFilter()
all.set_name(_("People with names containing..."))
all.add_rule(GenericFilter.SearchName([]))
all.add_rule(GenericFilter.SearchName(['']))
filter_list.append(all)
all = GenericFilter.GenericFilter()
@ -385,7 +385,7 @@ class PersonView(PageView.PersonNavView):
all = GenericFilter.ParamFilter()
all.set_name(_("People probably alive"))
all.add_rule(GenericFilter.ProbablyAlive([]))
all.add_rule(GenericFilter.ProbablyAlive(['']))
filter_list.append(all)
all = GenericFilter.GenericFilter()
@ -395,17 +395,17 @@ class PersonView(PageView.PersonNavView):
all = GenericFilter.GenericFilter()
all.set_name(_("Witnesses"))
all.add_rule(GenericFilter.IsWitness([]))
all.add_rule(GenericFilter.IsWitness(['','']))
filter_list.append(all)
all = GenericFilter.ParamFilter()
all.set_name(_("People with records containing..."))
all.add_rule(GenericFilter.HasTextMatchingSubstringOf([]))
all.add_rule(GenericFilter.HasTextMatchingSubstringOf(['',0,0]))
filter_list.append(all)
all = GenericFilter.ParamFilter()
all.set_name(_("People with records matching regular expression..."))
all.add_rule(GenericFilter.HasTextMatchingRegexpOf([]))
all.add_rule(GenericFilter.HasTextMatchingRegexpOf(['',0,1]))
filter_list.append(all)
all = GenericFilter.GenericFilter()
@ -415,7 +415,7 @@ class PersonView(PageView.PersonNavView):
all = GenericFilter.ParamFilter()
all.set_name(_("People with notes containing..."))
all.add_rule(GenericFilter.HasNoteMatchingSubstringOf([]))
all.add_rule(GenericFilter.HasNoteMatchingSubstringOf(['']))
filter_list.append(all)
self.filter_model = GenericFilter.FilterStore(filter_list)

View File

@ -917,7 +917,7 @@ class GedcomParser:
self.db.add_event(event,self.trans)
self.family.add_event_handle(event.get_handle())
self.parse_family_event(event,2)
self.db.commit_event(event, self.trans)
self.db.commit_family_event(event, self.trans)
del event
def parse_note_base(self,matches,obj,level,old_note,task):
@ -1004,8 +1004,10 @@ class GedcomParser:
self.person.set_gender(RelLib.Person.UNKNOWN)
elif matches[2][0] == "M":
self.person.set_gender(RelLib.Person.MALE)
else:
elif matches[2][0] == "F":
self.person.set_gender(RelLib.Person.FEMALE)
else:
self.person.set_gender(RelLib.Person.UNKNOWN)
elif matches[1] in [ "BAPL", "ENDL", "SLGC" ]:
lds_ord = RelLib.LdsOrd()
if matches[1] == "BAPL":
@ -1063,14 +1065,14 @@ class GedcomParser:
event.set_name("Birth")
self.person.set_birth_handle(event.get_handle())
self.parse_person_event(event,2)
self.db.commit_event(event, self.trans)
self.db.commit_personal_event(event, self.trans)
elif matches[1] == "ADOP":
event = RelLib.Event()
self.db.add_event(event, self.trans)
event.set_name("Adopted")
self.person.add_event_handle(event.get_handle())
self.parse_adopt_event(event,2)
self.db.commit_event(event, self.trans)
self.db.commit_personal_event(event, self.trans)
elif matches[1] == "DEAT":
event = RelLib.Event()
if matches[2]:
@ -1083,7 +1085,7 @@ class GedcomParser:
event.set_name("Death")
self.person.set_death_handle(event.get_handle())
self.parse_person_event(event,2)
self.db.commit_event(event, self.trans)
self.db.commit_personal_event(event, self.trans)
elif matches[1] == "EVEN":
event = RelLib.Event()
if matches[2]:

View File

@ -1202,7 +1202,6 @@ class GrampsParser:
'family' : Utils.family_name(self.family,self.db),
}
self.event.set_description(text)
else:
ref = RelLib.EventRef()
ref.set_reference_handle(self.event.get_handle())
@ -1240,8 +1239,10 @@ class GrampsParser:
self.name = None
def stop_ref(self,tag):
## # FIXME: Work this out when Witness is working again
## person = self.find_person_by_gramps_id(self.map_gid(tag))
## self.witness = RelLib.Witness(RelLib.Event.ID,person.get_handle())
return
self.witness = RelLib.Witness(RelLib.Event.ID,tag)
def stop_place(self,tag):
if self.placeobj == None:

View File

@ -3729,8 +3729,10 @@ class Name(PrivateSourceNote,DateBase):
that one name throughout his or her life."""
DEF = 0 # locale default
LNFN = 1 # last name, first name
FNLN = 2 # first name, last name
LNFN = 1 # last name first name [patronymic]
FNLN = 2 # first name last name
PTFN = 3 # patronymic last name
FN = 4 # first name
UNKNOWN = -1
CUSTOM = 0
@ -4003,24 +4005,6 @@ class Name(PrivateSourceNote,DateBase):
else:
return "%s %s, %s" % (first, self.surname, self.suffix)
def get_regular_upper_name(self):
"""returns a name string built from the components of the Name
instance, in the form of Firstname surname"""
if self.patronymic:
first = "%s %s" % (self.first_name, self.patronymic)
else:
first = self.first_name
if (self.suffix == ""):
if self.prefix:
return "%s %s %s" % (first, self.prefix.upper(), self.surname.upper())
else:
return "%s %s" % (first, self.surname.upper())
else:
if self.prefix:
return "%s %s %s, %s" % (first, self.prefix.upper(), self.surname.upper(), self.suffix)
else:
return "%s %s, %s" % (first, self.surname.upper(), self.suffix)
def is_equal(self,other):
"""
compares to names to see if they are equal, return 0 if they

View File

@ -252,6 +252,18 @@ class Report:
put at the top of the contents of the dialog box."""
return ("%s - GRAMPS" % _("Progress Report"), _("Working"))
def progress_bar_title(self,name,length):
markup = '<span size="larger" weight="bold">%s</span>'
self.lbl.set_text(markup % name)
self.lbl.set_use_markup(True)
self.pbar.set_fraction(0.0)
progress_steps = length
if length > 1:
progress_steps = progress_steps+1
progress_steps = progress_steps+1
self.pbar_max = length
def progress_bar_setup(self,total):
"""Create a progress dialog. This routine calls a
customization function to find out how to fill out the dialog.
@ -265,10 +277,12 @@ class Report:
self.ptop = gtk.Dialog()
self.ptop.set_has_separator(False)
self.ptop.set_title(title)
lbl = gtk.Label(header)
lbl.set_use_markup(True)
self.ptop.vbox.add(lbl)
self.ptop.set_border_width(12)
self.lbl = gtk.Label(header)
self.lbl.set_use_markup(True)
self.ptop.vbox.add(self.lbl)
self.ptop.vbox.set_spacing(10)
self.ptop.vbox.set_border_width(24)
self.pbar = gtk.ProgressBar()
self.pbar_max = total
self.pbar_index = 0.0
@ -288,6 +302,8 @@ class Report:
self.pbar.set_text("%d of %d (%.1f%%)" % (self.pbar_index,self.pbar_max,(val*100)))
self.pbar.set_fraction(val)
while gtk.events_pending():
gtk.main_iteration()
def progress_bar_done(self):
"""Done with the progress bar. It can be destroyed now."""
@ -522,7 +538,7 @@ class BareReportDialog:
"""Set up the title bar of the dialog. This function relies
on the get_title() customization function for what the title
should be."""
self.name = self.person.get_primary_name().get_regular_name()
self.name = NameDisplay.displayer.display(self.person)
self.window.set_title(self.get_title())
def setup_header(self):
@ -545,7 +561,7 @@ class BareReportDialog:
label.set_use_markup(1)
label.set_alignment(0.0,0.5)
self.tbl.set_border_width(12)
self.tbl.attach(label,0,4,self.col,self.col+1)
self.tbl.attach(label, 0, 4, self.col, self.col+1, gtk.FILL|gtk.EXPAND)
self.col += 1
def setup_center_person(self):
@ -559,7 +575,7 @@ class BareReportDialog:
self.tbl.attach(center_label,0,4,self.col,self.col+1)
self.col += 1
name = self.person.get_primary_name().get_regular_name()
name = NameDisplay.displayer.display(self.person)
self.person_label = gtk.Label( "%s" % name )
self.person_label.set_alignment(0.0,0.5)
self.tbl.attach(self.person_label,2,3,self.col,self.col+1)
@ -698,8 +714,9 @@ class BareReportDialog:
self.extra_menu.set_sensitive(len(extra_map) > 1)
self.add_tooltip(self.extra_menu,em_tip)
table.attach(self.extra_menu_label, 1, 2, row, row+1,
gtk.SHRINK|gtk.FILL)
table.attach(self.extra_menu,2,3,row,row+1)
gtk.SHRINK|gtk.FILL, gtk.SHRINK)
table.attach(self.extra_menu, 2, 3, row, row+1,
yoptions=gtk.SHRINK)
row += 1
# Now the "extra" text box
@ -716,8 +733,9 @@ class BareReportDialog:
self.extra_textbox.set_editable(1)
self.add_tooltip(self.extra_textbox,et_tip)
table.attach(self.extra_textbox_label, 1, 2, row, row+1,
gtk.SHRINK|gtk.FILL)
table.attach(swin,2,3,row,row+1)
gtk.SHRINK|gtk.FILL,gtk.SHRINK)
table.attach(swin, 2, 3, row, row+1,
yoptions=gtk.SHRINK)
row += 1
# Setup requested widgets
@ -725,10 +743,13 @@ class BareReportDialog:
if text:
text_widget = gtk.Label("%s:" % text)
text_widget.set_alignment(0.0,0.0)
table.attach(text_widget,1,2,row,row+1,gtk.SHRINK|gtk.FILL)
table.attach(widget,2,3,row,row+1)
table.attach(text_widget, 1, 2, row, row+1,
gtk.SHRINK|gtk.FILL, gtk.SHRINK)
table.attach(widget, 2, 3, row, row+1,
yoptions=gtk.SHRINK)
else:
table.attach(widget,2,3,row,row+1)
table.attach(widget, 2, 3, row, row+1,
yoptions=gtk.SHRINK)
row += 1
def setup_other_frames(self):
@ -747,10 +768,13 @@ class BareReportDialog:
if text:
text_widget = gtk.Label('%s:' % text)
text_widget.set_alignment(0.0,0.5)
table.attach(text_widget,1,2,row,row+1,gtk.SHRINK|gtk.FILL)
table.attach(widget,2,3,row,row+1)
table.attach(text_widget, 1, 2, row, row+1,
gtk.SHRINK|gtk.FILL, gtk.SHRINK)
table.attach(widget, 2, 3, row, row+1,
yoptions=gtk.SHRINK)
else:
table.attach(widget,2,3,row,row+1)
table.attach(widget, 2, 3, row, row+1,
yoptions=gtk.SHRINK)
row = row + 1
#------------------------------------------------------------------------
@ -810,9 +834,13 @@ class BareReportDialog:
self.options.handler.set_report_generations(self.max_gen,self.pg_brk)
if self.filter_combo:
self.filter = self.filter_combo.get_value()
active = self.filter_combo.get_active()
self.options.handler.set_filter_number(active)
try:
self.filter = self.filter_combo.get_value()
active = self.filter_combo.get_active()
self.options.handler.set_filter_number(active)
except:
print "Error setting filter. Proceeding with 'Everyone'"
self.filter = GenericFilter.Everyone([])
else:
self.filter = None
@ -869,7 +897,7 @@ class BareReportDialog:
new_person = sel_person.run()
if new_person:
self.new_person = new_person
new_name = new_person.get_primary_name().get_regular_name()
new_name = NameDisplay.displayer.display(new_person)
if new_name:
self.person_label.set_text( "<i>%s</i>" % new_name )
self.person_label.set_use_markup(True)
@ -1079,7 +1107,7 @@ class ReportDialog(BareReportDialog):
label.set_use_markup(1)
label.set_alignment(0.0,0.5)
self.tbl.set_border_width(12)
self.tbl.attach(label,0,4,self.col,self.col+1)
self.tbl.attach(label, 0, 4, self.col, self.col+1, gtk.FILL)
self.col += 1
hid = self.get_stylesheet_savefile()
@ -1090,13 +1118,15 @@ class ReportDialog(BareReportDialog):
if self.get_target_is_directory():
self.target_fileentry.set_directory_entry(1)
label = gtk.Label("%s:" % _("Directory"))
self.doc_label = gtk.Label("%s:" % _("Directory"))
else:
label = gtk.Label("%s:" % _("Filename"))
label.set_alignment(0.0,0.5)
self.doc_label = gtk.Label("%s:" % _("Filename"))
self.doc_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.target_fileentry,2,4,self.col,self.col+1)
self.tbl.attach(self.doc_label, 1, 2, self.col, self.col+1,
gtk.SHRINK|gtk.FILL)
self.tbl.attach(self.target_fileentry, 2, 4, self.col, self.col+1,
gtk.EXPAND|gtk.FILL)
self.col += 1
spath = self.get_default_directory()
@ -1332,7 +1362,7 @@ class ReportDialog(BareReportDialog):
_('_Change filename'),None)
if a.get_response() == gtk.RESPONSE_YES:
return
return None
self.set_default_directory(os.path.dirname(self.target_path) + os.sep)
self.options.handler.output = self.target_path
@ -1406,7 +1436,7 @@ class ReportDialog(BareReportDialog):
# Is there a filename? This should also test file permissions, etc.
if not self.parse_target_frame():
return
self.window.run()
# Preparation
self.parse_format_frame()
@ -1567,7 +1597,7 @@ class CommandLineReport:
'style' : self.option_class.handler.get_default_stylesheet_name(),
'papers' : self.option_class.handler.get_paper_name(),
'papero' : self.option_class.handler.get_orientation(),
'template' : self.option_class.handler.get_orientation(),
'template' : self.option_class.handler.get_template_name(),
'id' : ''
}

View File

@ -295,7 +295,6 @@ def sanitize_person(db,person):
name = person.get_primary_name()
if name.get_privacy() or person.get_privacy():
name = RelLib.Name()
name.set_first_name(_('Private'))
name.set_surname(_('Private'))
else:
new_person.set_nick_name(person.get_nick_name())
@ -309,7 +308,6 @@ def sanitize_person(db,person):
for item in person.get_parent_family_handle_list():
new_person.add_parent_family_handle(item[0],item[1],item[2])
if person.get_privacy():
return new_person
@ -348,6 +346,11 @@ def sanitize_person(db,person):
if not attribute.get_privacy():
new_person.add_attribute(RelLib.Attribute(attribute))
# copy source references
for ref in person.get_source_references():
if not ref.get_privacy():
new_person.add_source_reference(RelLib.SourceRef(ref))
# copy URL list
for url in person.get_url_list():
if not url.get_privacy():
@ -369,9 +372,61 @@ def sanitize_person(db,person):
ordinance = person.get_lds_sealing()
if ordinance:
new_person.set_lds_sealing(ordinance)
new_person.set_note(person.get_note())
return new_person
def dont_restrict(db,person):
return person
def restrict_with_names(db,person):
return restrict_person(db,person,False)
def restrict_no_names(db,person):
return restrict_person(db,person,True)
def restrict_person(db,person,no_names=False):
"""
Creates a new Person instance based off the passed Person
instance. The returned instance has all private records
removed from it.
@param db: GRAMPS database to which the Person object belongs
@type db: GrampsDbBase
@param person: source Person object that will be copied with
privacy records removed
@type person: Person
@returns: 'cleansed' Person object
@rtype: Person
"""
new_person = RelLib.Person()
# copy gender
new_person.set_gender(person.get_gender())
new_person.set_gramps_id(person.get_gramps_id())
new_person.set_handle(person.get_handle())
# copy names if not private
if no_names:
name = RelLib.Name()
name.set_surname(_('Private'))
else:
name = person.get_primary_name()
name.set_source_reference_list([])
new_person.set_primary_name(name)
# copy Family reference list
for handle in person.get_family_handle_list():
new_person.add_family_handle(handle)
# copy Family reference list
for item in person.get_parent_family_handle_list():
new_person.add_parent_family_handle(item[0],item[1],item[2])
return new_person
#-------------------------------------------------------------------------
#
# Roman numbers

View File

@ -248,7 +248,7 @@ class SelectChild:
self.db.commit_person(select_child,trans)
self.db.commit_family(self.family,trans)
n = select_child.get_primary_name().get_regular_name()
n = NameDisplay.displayer.display(select_child)
self.db.transaction_commit(trans,_("Add Child to Family (%s)") % n)
self.close(obj)
self.callback()
@ -317,7 +317,8 @@ class SelectChild:
#-------------------------------------------------------------------------
class LikelyFilter(GenericFilter.Rule):
category = _('General filters')
labels = [ 'Person handle' ]
category = _('General filters')
def prepare(self,db):
person = db.get_person_from_handle(self.list[0])

View File

@ -123,7 +123,10 @@ class SelectObject:
self.preview.set_from_pixbuf(image)
self.object_handle.set_text(obj.get_gramps_id())
self.object_type.set_text(the_type)
if the_type:
self.object_type.set_text(the_type)
else:
self.object_type.set_text("")
self.object_desc.set_text(obj.get_description())
if len(path) == 0:
self.object_path.set_text(_("The file no longer exists"))

View File

@ -67,14 +67,14 @@ class Sort:
name1 = first.get_primary_name()
name2 = second.get_primary_name()
fsn = name1.get_surname().upper()
ssn = name2.get_surname().upper()
fsn = name1.get_surname()
ssn = name2.get_surname()
if fsn == ssn :
ffn = name1.get_first_name().upper()
sfn = name2.get_first_name().upper()
ffn = name1.get_first_name()
sfn = name2.get_first_name()
if ffn == sfn:
return locale.strcoll(name1.get_suffix().upper(), name2.get_suffix().upper())
return locale.strcoll(name1.get_suffix(), name2.get_suffix())
else:
return locale.strcoll(ffn, sfn)
else:
@ -111,7 +111,10 @@ class Sort:
else:
date2 = Date.Date()
val = cmp(date1,date2)
dsv1 = date1.get_sort_value()
dsv2 = date2.get_sort_value()
val = cmp(dsv1,dsv2)
if val == 0:
return self.by_last_name(first_id,second_id)
return val

View File

@ -51,6 +51,7 @@ import Date
import DateEdit
import DateHandler
import GrampsDBCallback
import Spell
from DdTargets import DdTargets
@ -418,6 +419,12 @@ class SourceEditor:
self.date_obj, self.date_entry_field,
date_stat, self.sourceDisplay)
self.spage = self.get_widget("spage")
self.scom = self.get_widget("scomment")
self.spell1 = Spell.Spell(self.scom)
self.stext = self.get_widget("stext")
self.spell2 = Spell.Spell(self.stext)
self.draw(self.active_source,fresh=True)
self.set_button()
if self.parent:
@ -477,9 +484,9 @@ class SourceEditor:
def set_button(self):
if self.active_source:
self.ok.set_sensitive(1)
self.ok.set_sensitive(True)
else:
self.ok.set_sensitive(0)
self.ok.set_sensitive(False)
def get_widget(self,name):
"""returns the widget associated with the specified name"""
@ -487,14 +494,10 @@ class SourceEditor:
def draw(self,sel=None,fresh=False):
if self.source_ref and fresh:
spage = self.get_widget("spage")
spage.get_buffer().set_text(self.source_ref.get_page())
self.spage.get_buffer().set_text(self.source_ref.get_page())
text = self.get_widget("stext")
text.get_buffer().set_text(self.source_ref.get_text())
scom = self.get_widget("scomment")
scom.get_buffer().set_text(self.source_ref.get_note())
self.stext.get_buffer().set_text(self.source_ref.get_text())
self.scom.get_buffer().set_text(self.source_ref.get_note())
idval = self.source_ref.get_base_handle()
src = self.db.get_source_from_handle(idval)
self.active_source = src
@ -545,15 +548,15 @@ class SourceEditor:
conf = self.get_widget("conf").get_active()
buf = self.get_widget("scomment").get_buffer()
buf = self.scom.get_buffer()
comments = unicode(buf.get_text(buf.get_start_iter(),
buf.get_end_iter(),False))
buf = self.get_widget("stext").get_buffer()
buf = self.stext.get_buffer()
text = unicode(buf.get_text(buf.get_start_iter(),
buf.get_end_iter(),False))
buf = self.get_widget('spage').get_buffer()
buf = self.spage.get_buffer()
page = unicode(buf.get_text(buf.get_start_iter(),
buf.get_end_iter(),False))

60
src/Spell.py Normal file
View File

@ -0,0 +1,60 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 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$
"""
Provide an interface to the gtkspell interface. This requires
python-gnome-extras package. If the gtkspell package is not
present, we default to no spell checking.
"""
#### FIXME: Uncomment after 2.0.6 is released.
## success = False
## try:
## import gtk
## import gtkspell
## import locale
## text_view = gtk.TextView()
## spell = gtkspell.Spell(text_view)
## lang = locale.getlocale()[0]
## spell.set_language(lang)
## success = True
## except ImportError, msg:
## print "Spell.py:", msg
## except RuntimeError,msg:
## print "Spell.py:", msg
## except SystemError,msg:
## print "Spell.py:", msg
if False:
class Spell:
def __init__(self,obj):
self.spell = gtkspell.Spell(obj)
lang = locale.getlocale()[0]
self.spell.set_language(lang)
else:
class Spell:
def __init__(self,obj):
pass

View File

@ -481,8 +481,8 @@ def view_photo(photo):
_icon_theme = gtk.icon_theme_get_default()
def find_mime_type_pixbuf(mime_type):
icontmp = mime_type.replace('/','-')
try:
icontmp = mime_type.replace('/','-')
newicon = "gnome-mime-%s" % icontmp
try:
return _icon_theme.load_icon(newicon,48,0)
@ -715,7 +715,7 @@ def probably_alive(person,db,current_year=None):
death = db.get_event_from_handle(person.death_ref.ref)
if death.get_date_object().get_start_date() != Date.EMPTY:
death_year = death.get_date_object().get_year()
if death.get_date_object().get_year() < current_year:
if death_year < current_year:
return False
# Look for Cause Of Death, Burial or Cremation events.
@ -1051,3 +1051,67 @@ def strip_context(msgid,sep='|'):
if msgval == msgid and sep_idx != -1:
msgval = msgid[sep_idx+1:]
return msgval
class ProgressMeter:
"""
Progress meter class for GRAMPS.
"""
def __init__(self,title,header=''):
"""
Specify the title and the current pass header.
"""
self.ptop = gtk.Dialog()
self.ptop.set_has_separator(False)
self.ptop.set_title(title)
self.ptop.set_border_width(12)
self.ptop.vbox.set_spacing(10)
lbl = gtk.Label('<span size="larger" weight="bold">%s</span>' % title)
lbl.set_use_markup(True)
self.lbl = gtk.Label(header)
self.lbl.set_use_markup(True)
self.ptop.vbox.add(lbl)
self.ptop.vbox.add(self.lbl)
self.ptop.vbox.set_border_width(24)
self.pbar = gtk.ProgressBar()
self.ptop.set_size_request(350,125)
self.ptop.vbox.add(self.pbar)
self.ptop.show_all()
if header == '':
self.lbl.hide()
def set_pass(self,header,total):
"""
Reset for another pass. Provide a new header and define number
of steps to be used.
"""
if header == '':
self.lbl.hide()
else:
self.lbl.show()
self.pbar_max = total
self.pbar_index = 0.0
self.lbl.set_text(header)
self.pbar.set_fraction(0.0)
while gtk.events_pending():
gtk.main_iteration()
def step(self):
"""Click the progress bar over to the next value. Be paranoid
and insure that it doesn't go over 100%."""
self.pbar_index = self.pbar_index + 1.0
if (self.pbar_index > self.pbar_max):
self.pbar_index = self.pbar_max
val = self.pbar_index/self.pbar_max
self.pbar.set_text("%d of %d (%.1f%%)" % (self.pbar_index,self.pbar_max,(val*100)))
self.pbar.set_fraction(val)
while gtk.events_pending():
gtk.main_iteration()
def close(self):
"""
Close the progress meter
"""
self.ptop.destroy()

View File

@ -165,14 +165,15 @@ class WitnessEditor:
self.idval = self.ref.get_value()
if self.db.has_person_handle(self.idval):
person = self.db.get_person_from_handle(self.idval)
self.name.set_text(person.get_primary_name().get_regular_name())
self.in_db.set_active(1)
name = NameDisplay.displayer.display(person)
self.name.set_text(name)
self.in_db.set_active(True)
else:
self.name.set_text(_("Unknown"))
self.in_db.set_active(0)
self.in_db.set_active(False)
else:
self.name.set_text(self.ref.get_value())
self.in_db.set_active(0)
self.in_db.set_active(False)
self.comment.get_buffer().set_text(self.ref.get_comment())
self.private.set_active(self.ref.get_privacy())
@ -213,24 +214,25 @@ class WitnessEditor:
def choose(self,obj):
import SelectPerson
sel_person = SelectPerson.SelectPerson(self.db,_('Select Person'),parent_window=self.window)
sel_person = SelectPerson.SelectPerson(self.db,_('Select Person'),
parent_window=self.window)
new_person = sel_person.run()
if new_person:
self.new_person = new_person
self.idval = new_person.get_handle()
new_name = new_person.get_primary_name().get_regular_name()
new_name = NameDisplay.displayer.display(new_person)
if new_name:
self.name.set_text(new_name)
def on_toggled(self,obj):
if self.in_db.get_active():
self.name.set_editable(0)
self.name.set_sensitive(0)
self.select.set_sensitive(1)
self.name.set_editable(False)
self.name.set_sensitive(False)
self.select.set_sensitive(True)
else:
self.name.set_editable(1)
self.name.set_sensitive(1)
self.select.set_sensitive(0)
self.name.set_editable(True)
self.name.set_sensitive(True)
self.select.set_sensitive(False)
def ok_clicked(self,obj):
if not self.ref:

View File

@ -29,6 +29,7 @@
import os
import time
import re
import shutil
from gettext import gettext as _
#-------------------------------------------------------------------------
@ -53,7 +54,7 @@ import Errors
import ansel_utf8
import Utils
import NameDisplay
from QuestionDialog import ErrorDialog
from QuestionDialog import ErrorDialog, WarningDialog
def keep_utf8(s):
return s
@ -129,6 +130,11 @@ def add_familys_sources(db,family_handle,slist,private):
#
#-------------------------------------------------------------------------
def add_persons_sources(db,person,slist,private):
for source_ref in person.get_source_references():
sbase = source_ref.get_base_handle()
if sbase != None and not slist.has_key(sbase):
slist[sbase] = 1
elist = person.get_event_list()[:]
elist.append(person.get_birth_handle())
@ -916,8 +922,7 @@ class GedcomWriter:
else:
self.writeln("1 EVEN")
if value:
self.writeln("2 TYPE %s %s" % (self.cnvtxt(name), value
))
self.writeln("2 TYPE %s %s" % (self.cnvtxt(name), value))
else:
self.writeln("2 TYPE %s" % self.cnvtxt(name))
if attr.get_note():
@ -966,28 +971,33 @@ class GedcomWriter:
continue
photo_obj_id = photo.get_reference_handle()
photo_obj = self.db.get_object_from_handle(photo_obj_id)
print photo_obj, photo_obj.get_mime_type()
if photo_obj and photo_obj.get_mime_type() == "image/jpeg":
path = photo_obj.get_path ()
imgdir = os.path.join(self.dirname,self.images_path)
if not os.path.isfile(path):
continue
try:
if not os.path.isdir(imgdir):
os.makedirs(imgdir)
except:
continue
basename = os.path.basename(path)
dest = os.path.join (imgdir, basename)
try:
shutil.copyfile(path, dest)
except (IOError,OSError),msg:
msg2 = _("Could not create %s") % dest
WarningDialog(msg2,str(msg))
continue
self.writeln('1 OBJE')
self.writeln('2 FORM jpeg')
dirname = os.path.join (self.dirname, self.images_path)
basename = os.path.basename (path)
self.writeln('2 FILE %s' % os.path.join(self.images_path,
basename))
try:
if not os.path.isdir(dirname):
os.mkdir (dirname)
except:
continue
dest = os.path.join (dirname, basename)
try:
os.link (path, dest)
except OSError:
file (dest,
"wb").writelines (file (path,
"rb").xreadlines ())
for family in person.get_parent_family_handle_list():
if self.flist.has_key(family[0]):

View File

@ -6,8 +6,14 @@ pkgdatadir = $(datadir)/@PACKAGE@/data
dist_pkgdata_DATA = \
gedcom.xml \
somerights20.gif \
papersize.xml \
tips.xml
tips.xml\
main1.css\
main2.css\
main3.css\
main4.css\
main5.css
EXTRA_DIST = \
gramps.desktop \
@ -34,12 +40,12 @@ if !PACKAGER_MODE
if GCONF_SCHEMAS_INSTALL
GCONF_SCHEMAS_INSTALLATION += \
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \
gconftool-2 --makefile-install-rule $(DESTDIR)$(GCONF_SCHEMA_FILE_DIR)/gramps.schemas ;\
$(GCONFTOOL) --makefile-install-rule $(DESTDIR)$(GCONF_SCHEMA_FILE_DIR)/gramps.schemas ;\
pkill gconfd ; echo Restarting gconfd
GCONF_SCHEMAS_UNINSTALLATION += \
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \
gconftool-2 --makefile-uninstall-rule $(DESTDIR)$(GCONF_SCHEMA_FILE_DIR)/gramps.schemas
$(GCONFTOOL) --makefile-uninstall-rule $(DESTDIR)$(GCONF_SCHEMA_FILE_DIR)/gramps.schemas
endif
if SHARED_MIME_INSTALL
SHARED_MIME_INSTALLATION += \

238
src/data/main1.css Executable file
View File

@ -0,0 +1,238 @@
/* GRAMPS Cascading Style Sheet */
/* Standard Tags {{{1
*/
BODY {
font-family: "Arial", "Helvetica", sans-serif;
background-color: #ffffff;
}
P,BLOCKQUOTE {
font-size: 14px;
}
DIV {
margin: 2px;
padding: 2px;
}
TD {
vertical-align: top;
}
H1 {
font-family: "Verdana", "Bistream Vera Sans", "Arial", "Helvetica", sans-serif;
font-weight: bolder;
font-size: 160%;
margin: 2px;
}
H2 {
font-family: "Verdana", "Bistream Vera Sans", "Arial", "Helvetica", sans-serif;
font-weight: bolder;
font-style: italic;
font-size: 150%;
}
H3 {
font-weight: bold;
margin: 0;
padding-top: 10px;
padding-bottom: 10px;
}
H4 {
margin-top: 1em;
margin-bottom: 0.3em;
padding-left: 4px;
}
H5 {
margin-bottom: 0.5em;
}
H6 {
font-weight: normal;
font-style: italic;
font-size: 100%;
margin-left: 1em;
margin-top: 1.3em;
margin-bottom: 0.8em;
}
HR {
height: 1px;
width: 100%;
margin: 0;
margin-top: 1px;
margin-bottom: 0;
padding: 0;
border-top: 0; /* Hack: Mozilla work-around to eliminate "groove" */
border-color: #000;
}
A:link {
color: #000;
text-decoration: underline;
}
A:visited {
color: #333;
text-decoration: underline;
}
A:hover {
background-color: #eee;
color: #000;
text-decoration: underline;
}
A:active {
background-color: #eee;
color: #000;
text-decoration: none;
}
SUP {
line-height: 0;
}
/* Custom {{{1
*/
.navheader {
padding: 2px;
margin: 2px;
}
.navtitle {
font-size: 130%;
color: #999;
margin: 3px;
}
.navbyline {
float: right;
font-size: 14px;
margin: 2px;
padding: 2px;
padding-right: 10px;
}
.nav {
margin: 0;
margin-bottom: 4px;
padding: 1px;
font-size: 12px;
font-weight: bold;
}
.summaryarea {
min-height: 100px;
/* Hack: IE Dynamic Expression to set the width */
height: expression(document.body.clientHeight < 1 ? "100px" : "100px" );
}
.portrait {
justify: center;
margin: 5px;
margin-right: 20px;
padding: 3px;
border-color: #000;
border-width: 1px;
}
.snapshot {
float: right;
margin: 5px;
margin-right: 20px;
padding: 3px;
}
.thumbnail {
height: 100px;
border-color: #000;
border-width: 1px;
}
.leftwrap {
float: left;
margin: 2px;
margin-right: 10px;
}
.rightwrap {
float: right;
margin: 2px;
margin-left: 10px;
}
TABLE.infolist {
border: 0;
/*width: 100%;*/
font-size: 14px;
}
.img_navbar {
margin: 0;
margin-bottom: 4px;
padding: 10px;
font-size: 14px;
font-weight: bold;
text-align: center;
}
TD.category {
padding: 1px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 10%;*/
font-weight: bold;
}
TD.field {
padding: 1px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 15%;*/
}
TD.data {
padding: 1px; /* Defines spacing between rows */
padding-right: 3em;
font-weight: bold;
}
.pedigree {
margin: 0;
margin-left: 2em;
padding: 0;
background-color: #eeeeee;
border: 1px;
}
.pedigreeind {
font-size: 14px;
margin: 0;
padding: 2em;
padding-top: 0.25em;
padding-bottom: 0.5em;
}
.footer {
margin: 1em;
font-size: 12px;
float: right;
}
/* 1}}}
vim:foldmethod=marker
/*

222
src/data/main2.css Executable file
View File

@ -0,0 +1,222 @@
/* GRAMPS Cascading Style Sheet */
/* Standard Tags {{{1
*/
BODY {
font-family: "Arial", "Helvetica", sans-serif;
background-color: #fafaff;
color: #003;
}
P,BLOCKQUOTE {
font-size: 14px;
}
DIV {
margin: 2px;
padding: 2px;
}
TD {
vertical-align: top;
}
H1 {
font-family: "Verdana", "Bistream Vera Sans", "Arial", "Helvetica", sans-serif;
font-weight: bolder;
font-size: 160%;
margin: 2px;
}
H2 {
font-family: "Verdana", "Bistream Vera Sans", "Arial", "Helvetica", sans-serif;
font-weight: bolder;
font-style: italic;
font-size: 150%;
}
H3 {
font-weight: bold;
margin: 0;
padding-top: 10px;
padding-bottom: 10px;
color: #336;
}
H4 {
margin-top: 1em;
margin-bottom: 0.3em;
padding-left: 4px;
background-color: #667;
color: #fff;
}
H5 {
margin-bottom: 0.5em;
}
H6 {
font-weight: normal;
font-style: italic;
font-size: 100%;
margin-left: 1em;
margin-top: 1.3em;
margin-bottom: 0.8em;
}
HR {
height: 0;
width: 0;
margin: 0;
margin-top: 1px;
margin-bottom: 1px;
padding: 0;
border-top: 0; /* Hack: Mozilla work-around to eliminate "groove" */
border-color: #e0e0e9;
}
A:link {
color: #006;
text-decoration: underline;
}
A:visited {
color: #669;
text-decoration: underline;
}
A:hover {
background-color: #eef;
color: #000;
text-decoration: underline;
}
A:active {
background-color: #eef;
color: #000;
text-decoration: none;
}
SUP {
line-height: 0;
}
/* Custom {{{1
*/
.navheader {
padding: 4px;
background-color: #e0e0e9;
margin: 2px;
}
.navtitle {
font-size: 160%;
color: #669;
margin: 2px;
}
.navbyline {
float: right;
font-size: 14px;
margin: 2px;
padding: 4px;
}
.nav {
margin: 0;
margin-bottom: 4px;
padding: 0;
font-size: 14px;
font-weight: bold;
}
.summaryarea {
min-height: 100px;
/* Hack: IE Dynamic Expression to set the width */
height: expression(document.body.clientHeight < 1 ? "100px" : "100px" );
}
.portrait {
justify: center;
margin: 5px;
margin-right: 20px;
padding: 3px;
border-color: #336;
border-width: 1px;
}
.snapshot {
float: right;
margin: 5px;
margin-right: 20px;
padding: 3px;
}
.thumbnail {
height: 100px;
border-color: #336;
border-width: 1px;
}
.leftwrap {
float: left;
margin: 2px;
margin-right: 10px;
}
.rightwrap {
float: right;
margin: 2px;
margin-left: 10px;
}
TABLE.infolist {
border: 0;
/*width: 100%;*/
font-size: 14px;
}
.img_navbar {
margin: 0;
margin-bottom: 4px;
padding: 10px;
font-size: 14px;
font-weight: bold;
text-align: center;
}
TD.category {
padding: 3px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 10%;*/
font-weight: bold;
}
TD.field {
padding: 3px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 15%;*/
}
TD.data {
padding: 3px; /* Defines spacing between rows */
padding-right: 3em;
font-weight: bold;
}
.pedigree {
margin: 0;
margin-left: 2em;
padding: 0;
background-color: #e0e0e9;
border: 1px;
}
.pedigreeind {
font-size: 14px;
margin: 0;
padding: 2em;
padding-top: 0.25em;
padding-bottom: 0.5em;
}
.footer {
margin: 1em;
font-size: 12px;
float: right;
}
/* 1}}}
vim:foldmethod=marker
/*

221
src/data/main3.css Executable file
View File

@ -0,0 +1,221 @@
/* GRAMPS Cascading Style Sheet */
/* Standard Tags {{{1
*/
BODY {
font-family: "Bitstream Vera Serif", "Times New Roman", "Times", serif;
background-color: #fffffd;
}
P,BLOCKQUOTE {
font-size: 14px;
}
DIV {
margin: 2px;
padding: 2px;
}
TD {
vertical-align: top;
}
H1 {
font-weight: bolder;
font-size: 160%;
margin: 2px;
}
H2 {
font-weight: bolder;
font-style: italic;
font-size: 150%;
}
H3 {
font-weight: bold;
margin: 0;
padding-left: 2em;
padding-bottom: 10px;
}
H4 {
margin-top: 1em;
margin-bottom: 0.3em;
padding-left: 2em;
}
H5 {
margin-bottom: 0.5em;
}
H6 {
font-weight: normal;
font-style: italic;
font-size: 100%;
margin-left: 1em;
margin-top: 1.3em;
margin-bottom: 0.8em;
}
HR {
height: 0;
width: 0;
margin: 0;
margin-top: 1px;
margin-bottom: 1px;
padding: 0;
border-top: 1; /* Hack: Mozilla work-around to eliminate "groove" */
border-color: #ccf;
}
A:link {
color: #110;
text-decoration: underline;
}
A:visited {
color: #665;
text-decoration: underline;
}
A:hover {
background-color: #eed;
color: #110;
text-decoration: underline;
}
A:active {
background-color: #eee;
color: #110;
text-decoration: none;
}
SUP {
line-height: 0;
}
/* Custom {{{1
*/
.navheader {
padding: 4px;
margin: 2px;
}
.navtitle {
font-size: 160%;
color: #998;
margin: 2px;
text-align: center;
}
.navbyline {
float: right;
font-size: 14px;
margin: 2px;
padding: 4px;
}
.nav {
margin: 0;
margin-bottom: 4px;
padding: 0px;
font-size: 14px;
font-weight: bold;
text-align: center;
padding: 4px;
background-color: #ddddcc;
}
.summaryarea {
min-height: 100px;
/* Hack: IE Dynamic Expression to set the width */
height: expression(document.body.clientHeight < 1 ? "100px" : "100px" );
}
.portrait {
justify: center;
margin: 5px;
margin-right: 20px;
padding: 3px;
border-color: #110;
border-width: 1px;
}
.snapshot {
float: right;
margin: 5px;
margin-right: 20px;
padding: 3px;
}
.thumbnail {
height: 100px;
border-color: #110;
border-width: 1px;
}
.leftwrap {
float: left;
margin: 2px;
margin-right: 10px;
}
.rightwrap {
float: right;
margin: 2px;
margin-left: 10px;
}
TABLE.infolist {
border: 0;
/*width: 100%;*/
font-size: 14px;
}
.img_navbar {
margin: 0;
margin-bottom: 4px;
padding: 10px;
font-size: 14px;
font-weight: bold;
text-align: center;
}
TD.category {
padding: 4px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 10%;*/
font-weight: bold;
}
TD.field {
padding: 4px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 20%;*/
background-color: #f6f6f0;
}
TD.data {
padding: 4px; /* Defines spacing between rows */
padding-right: 3em;
font-weight: bold;
}
.pedigree {
margin: 0;
margin-left: 2em;
padding: 0;
background-color: #f6f6f0;
border: 1px;
}
.pedigreeind {
font-size: 14px;
margin: 0;
padding: 2em;
padding-top: 0.25em;
padding-bottom: 0.5em;
}
.footer {
margin: 1em;
margin-left: 2em;
font-size: 12px;
/*float: right;*/
}
/* 1}}}
vim:foldmethod=marker
/*

241
src/data/main4.css Executable file
View File

@ -0,0 +1,241 @@
/* GRAMPS Cascading Style Sheet */
/* Standard Tags {{{1
*/
BODY {
font-family: "Times New Roman", "Times", serif;
background-color: #fff;
color: #320;
font-size: 16px;
}
P,BLOCKQUOTE {
}
DIV {
margin: 2px;
padding: 2px;
}
TD {
vertical-align: top;
}
H1 {
font-family: "Georgia", "Bistream Vera Serif", "Times New Roman", "Times", serif;
font-weight: bolder;
font-size: 160%;
margin: 2px;
}
H2 {
font-family: "Georgia", "Bistream Vera Serif", "Times New Roman", "Times", serif;
font-weight: bolder;
font-style: italic;
font-size: 150%;
}
H3 {
font-weight: bold;
font-size: 130%;
margin: 0;
margin-top: 8px;
/*padding-left: 2em;*/
padding-bottom: 10px;
}
H4 {
margin-top: 1em;
margin-bottom: 0;
padding: 0;
/*padding-left: 2em;*/
font-size: 110%;
}
H5 {
margin-bottom: 0.5em;
}
H6 {
font-weight: normal;
font-style: italic;
font-size: 100%;
margin-left: 1em;
margin-top: 1.3em;
margin-bottom: 0.8em;
}
HR {
height: 6px;
width: 100%;
margin: 0;
color: #a97;
padding: 2px;
/*border-top: 0; |+ Hack: Mozilla work-around to eliminate "groove" +|*/
border-color: #a97;
background-color: #a97;
}
A:link {
color: #430;
text-decoration: underline;
}
A:visited {
color: #654;
text-decoration: underline;
}
A:hover {
background-color: #f6f0ee;
color: #210;
text-decoration: underline;
}
A:active {
background-color: #f6f0ee;
color: #210;
text-decoration: none;
}
SUP {
line-height: 0;
}
/* Custom {{{1
*/
.navheader {
padding: 4px;
margin: 0;
}
.navtitle {
font-size: 160%;
color: #fff;
margin: 0;
padding: 4px;
padding-left: 10px;
background-color: #542;
}
.navbyline {
float: right;
margin: 2px;
padding: 4px;
padding-right: 10px;
color: #fff;
}
.nav {
margin: 0;
margin-bottom: 4px;
padding: 1px;
font-size: 14px;
font-weight: bold;
}
.summaryarea {
min-height: 100px;
/* Hack: IE Dynamic Expression to set the width */
height: expression(document.body.clientHeight < 1 ? "100px" : "100px" );
}
.portrait {
justify: center;
margin: 5px;
margin-right: 20px;
padding: 3px;
border-color: #986;
border-width: 3px;
}
.snapshot {
float: right;
margin: 5px;
margin-right: 20px;
padding: 3px;
}
.thumbnail {
height: 100px;
border-color: #986;
border-width: 3px;
}
.leftwrap {
float: left;
margin: 2px;
margin-right: 10px;
}
.rightwrap {
float: right;
margin: 2px;
margin-left: 10px;
}
TABLE.infolist {
border: 0;
padding; 0;
margin: 0;
margin-left: 2em;
margin-top: 8px;
}
.img_navbar {
margin: 0;
margin-bottom: 4px;
padding: 10px;
font-size: 14px;
font-weight: bold;
text-align: center;
}
TD.category {
margin: 0;
padding: 4px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 10%;*/
font-weight: bold;
}
TD.field {
margin: 0;
padding: 4px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 20%;*/
}
TD.data {
margin: 0;
padding: 4px; /* Defines spacing between rows */
padding-left: 10px;
padding-right: 3em;
font-weight: bold;
background-color: #f0ece6;
}
.pedigree {
margin: 0;
margin-left: 2em;
padding: 0;
background-color: #f0ece6;
border: 1px;
}
.pedigreeind {
margin: 0;
padding: 2em;
padding-top: 0.25em;
padding-bottom: 0.5em;
}
.footer {
margin: 1em;
font-size: 12px;
float: right;
}
/* 1}}}
vim:foldmethod=marker
/*

242
src/data/main5.css Executable file
View File

@ -0,0 +1,242 @@
/* GRAMPS Cascading Style Sheet */
/* Standard Tags {{{1
*/
BODY {
font-family: "Bistream Vera Sans", "Arial", "Arial", "Helvetica", sans-serif;
text-align: justify;
background-color: #fff;
color: #010;
}
P,BLOCKQUOTE {
font-size: 14px;
margin-left: 7em;
margin-right: 7em;
}
DIV {
margin: 2px;
padding: 2px;
}
TD {
vertical-align: top;
}
H1 {
font-family: "Verdana", "Bistream Vera Sans", "Arial", "Helvetica", sans-serif;
font-weight: bolder;
font-size: 160%;
margin: 2px;
}
H2 {
font-family: "Verdana", "Bistream Vera Sans", "Arial", "Helvetica", sans-serif;
font-weight: bolder;
font-style: italic;
font-size: 150%;
}
H3 {
font-weight: bold;
margin: 0;
margin-left: 5em;
margin-right: 5em;
padding-top: 10px;
padding-bottom: 10px;
color: #232;
}
H4 {
margin-top: 2em;
margin-bottom: 0.3em;
padding: 5px;
padding-left: 2em;
background-color: #e0e6e0;
color: #232;
}
H5 {
margin-bottom: 0.5em;
}
H6 {
font-weight: normal;
font-style: italic;
font-size: 100%;
margin-left: 1em;
margin-top: 1.3em;
margin-bottom: 0.8em;
}
HR {
height: 0;
width: 0;
margin: 0;
margin-top: 1px;
margin-bottom: 1px;
padding: 0;
border-top: 0; /* Hack: Mozilla work-around to eliminate "groove" */
border-color: #e0e6e0;
}
A:link {
color: #252;
text-decoration: underline;
}
A:visited {
color: #565;
text-decoration: underline;
}
A:hover {
background-color: #eaf0ea;
color: #000;
text-decoration: underline;
}
A:active {
background-color: #eaf0ea;
color: #000;
text-decoration: none;
}
SUP {
line-height: 0;
}
/* Custom {{{1
*/
.navheader {
padding: 4px;
background-color: #e0e6e0;
margin: 2px;
}
.navtitle {
font-size: 160%;
color: #e0e6e0;
margin: 2px;
background-color: #454;
padding: 4px;
padding-left: 3.5em;
}
.navbyline {
float: right;
font-size: 14px;
margin: 2px;
padding: 0;
padding-top: 1em;
padding-right: 7em;
color: #e0e6e0;
}
.nav {
margin: 0;
margin-bottom: 4px;
padding: 0;
padding-left: 6.5em;
font-size: 14px;
font-weight: bold;
}
.summaryarea {
min-height: 100px;
/* Hack: IE Dynamic Expression to set the width */
height: expression(document.body.clientHeight < 1 ? "100px" : "100px" );
}
.portrait {
justify: center;
margin: 5px;
margin-right: 20px;
padding: 3px;
border-color: #363;
border-width: 1px;
}
.snapshot {
float: right;
margin: 5px;
padding: 3px;
padding-right: 6em;
}
.thumbnail {
height: 100px;
border-color: #363;
border-width: 1px;
}
.leftwrap {
float: left;
margin: 5px;
margin-right: 1em;
margin-left: 6em;
}
.rightwrap {
float: right;
margin: 5px;
margin-left: 1em;
margin-right: 6em;
}
TABLE.infolist {
border: 0;
/*width: 100%;*/
font-size: 14px;
margin-left: 7em;
margin-right: 7em;
}
.img_navbar {
margin: 0;
margin-bottom: 4px;
padding: 10px;
font-size: 14px;
font-weight: bold;
text-align: center;
}
TD.category {
padding: 3px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 10%;*/
font-weight: bold;
}
TD.field {
padding: 3px; /* Defines spacing between rows */
padding-right: 3em;
/*width: 15%;*/
}
TD.data {
padding: 3px; /* Defines spacing between rows */
padding-right: 3em;
font-weight: bold;
}
.pedigree {
margin: 0;
margin-left: 7em;
padding: 0;
background-color: #e0e6e0;
border: 1px;
}
.pedigreeind {
font-size: 14px;
margin: 0;
padding: 2em;
padding-top: 0.25em;
padding-bottom: 0.5em;
}
.footer {
margin: 1em;
font-size: 12px;
text-align: center;
}
/* 1}}}
vim:foldmethod=marker
/*

BIN
src/data/somerights20.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -119,7 +119,7 @@ class DateDisplayES(DateDisplay):
_mod_str = ("",u"antes de ",u"después de ",u"hacia ","","","")
_qual_str = ("","calculado ","estimado ")
_qual_str = ("","estimado ","calculado ")
formats = (
"AAAA-MM-DD (ISO)", "Numérica", "Mes Día, Año",

View File

@ -113,7 +113,7 @@ class DateDisplayFR(DateDisplay):
_mod_str = ("",u"avant ",u"après ",u"vers ","","","")
_qual_str = ("","calculated ","estimated ")
_qual_str = ("","estimated ","calculated ")
formats = (
"AAAA-MM-DD (ISO)", "Numérique", "Mois Jour, Année",

View File

@ -52,10 +52,18 @@ from ReportUtils import pt2cm
#
#-------------------------------------------------------------------------
from gettext import gettext as _
from xml.sax.saxutils import escape
_apptype = 'application/vnd.sun.xml.writer'
_esc_map = {
'\x1a' : '',
'\x0c' : '',
'\n' : '<text:line-break/>',
'&lt;super&gt;' : '<text:span text:style-name="GSuper">',
'&lt;/super&gt;' : '</text:span>',
}
#-------------------------------------------------------------------------
#
# OpenOfficeDoc
@ -152,9 +160,9 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.cntnt.write('draw:fill-color="#%02x%02x%02x" ' % style.get_fill_color())
if style.get_line_style() == BaseDoc.DASHED:
self.cntnt.write('draw:color="#cccccc" ')
self.cntnt.write('svg:stroke-color="#cccccc" ')
else:
self.cntnt.write('draw:color="#%02x%02x%02x" ' % style.get_color())
self.cntnt.write('svg:stroke-color="#%02x%02x%02x" ' % style.get_color())
if style.get_line_width():
self.cntnt.write('draw:stroke="solid" ')
@ -304,10 +312,10 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
#Begin photo style
self.cntnt.write('<style:style style:name="Left" style:family="graphics"')
self.cntnt.write(' style:parent-name="photo">')
self.cntnt.write(' style:parent-style-name="photo">')
self.cntnt.write('<style:properties style:run-through="foreground"')
self.cntnt.write(' style:wrap="parallel"')
self.cntnt.write(' style:numer-wrapped-paragraphs="no-limit"')
self.cntnt.write(' style:number-wrapped-paragraphs="no-limit"')
self.cntnt.write(' style:wrap-contour="false" style:vertical-pos="from-top"')
self.cntnt.write(' style:vertical-rel="paragraph-content"')
self.cntnt.write(' style:horizontal-pos="left"')
@ -320,10 +328,10 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.cntnt.write('</style:style>\n')
self.cntnt.write('<style:style style:name="Right" style:family="graphics"')
self.cntnt.write(' style:parent-name="photo">')
self.cntnt.write(' style:parent-style-name="photo">')
self.cntnt.write('<style:properties style:run-through="foreground"')
self.cntnt.write(' style:wrap="parallel"')
self.cntnt.write(' style:numer-wrapped-paragraphs="no-limit"')
self.cntnt.write(' style:number-wrapped-paragraphs="no-limit"')
self.cntnt.write(' style:wrap-contour="false" style:vertical-pos="from-top"')
self.cntnt.write(' style:vertical-rel="paragraph-content"')
self.cntnt.write(' style:horizontal-pos="right"')
@ -336,7 +344,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.cntnt.write('</style:style>\n')
self.cntnt.write('<style:style style:name="Single" style:family="graphics"')
self.cntnt.write(' style:parent-name="Graphics">')
self.cntnt.write(' style:parent-style-name="Graphics">')
self.cntnt.write('<style:properties style:vertical-pos="from-top"')
self.cntnt.write(' style:mirror="none" fo:clip="rect(0cm 0cm 0cm 0cm)"')
self.cntnt.write(' draw:luminance="0%" draw:contrast="0" draw:red="0%"')
@ -346,7 +354,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.cntnt.write('</style:style>\n')
self.cntnt.write('<style:style style:name="Row" style:family="graphics"')
self.cntnt.write(' style:parent-name="Graphics">')
self.cntnt.write(' style:parent-style-name="Graphics">')
self.cntnt.write('<style:properties style:vertical-pos="from-top"')
self.cntnt.write(' style:vertical-rel="paragraph"')
self.cntnt.write(' style:horizontal-pos="from-left"')
@ -512,7 +520,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.sfile.write('xmlns:math="http://www.w3.org/1998/Math/MathML" ')
self.sfile.write('xmlns:form="http://openoffice.org/2000/form" ')
self.sfile.write('xmlns:script="http://openoffice.org/2000/script" ')
self.sfile.write('office:class="text" office:version="0.9">\n')
self.sfile.write('office:version="0.9">\n')
self.sfile.write('<office:font-decls>\n')
self.sfile.write('<style:font-decl style:name="Times New Roman" ')
self.sfile.write('fo:font-family="&apos;Times New Roman&apos;" ')
@ -629,22 +637,15 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.sfile.write('</style:page-master>\n')
self.sfile.write('</office:automatic-styles>\n')
self.sfile.write('<office:master-styles>\n')
self.sfile.write('<draw:layer-set>\n')
self.sfile.write('<draw:layer draw:name="layout"/>\n')
self.sfile.write('<draw:layer draw:name="background"/>\n')
self.sfile.write('<draw:layer draw:name="backgroundobjects"/>\n')
self.sfile.write('<draw:layer draw:name="controls"/>\n')
self.sfile.write('<draw:layer draw:name="measurelines"/>\n')
self.sfile.write('</draw:layer-set>\n')
self.sfile.write('<style:master-page style:name="Standard" ')
self.sfile.write('style:page-master-name="pm1"/>\n')
self.sfile.write('<draw:layer-set>\n')
self.sfile.write('<draw:layer draw:name="layout" draw:locked="false" ')
self.sfile.write('draw:printable="true" draw:visible="true"/>\n')
self.sfile.write('<draw:layer draw:name="background" draw:locked="false" ')
self.sfile.write('draw:printable="true" draw:visible="true"/>\n')
self.sfile.write('<draw:layer draw:name="backgroundobjects" ')
self.sfile.write('draw:locked="false" draw:printable="true" draw:visible="true"/>\n')
self.sfile.write('<draw:layer draw:name="controls" draw:locked="false" ')
self.sfile.write('draw:printable="true" draw:visible="true"/>\n')
self.sfile.write('<draw:layer draw:name="measurelines" draw:locked="false" ')
self.sfile.write('draw:printable="true" draw:visible="true"/>\n')
self.sfile.write('</draw:layer-set>\n')
self.sfile.write('<style:master-page style:name="Home" ')
self.sfile.write('style:page-master-name="PM0" draw:style-name="dp1"/>\n')
self.sfile.write('</office:master-styles>\n')
self.sfile.write('</office:document-styles>\n')
@ -711,14 +712,12 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.end_paragraph()
def write_text(self,text):
text = text.replace('&','&amp;') # Must be first
text = text.replace('<','&lt;')
text = text.replace('>','&gt;')
text = text.replace('\n','<text:line-break/>')
text = text.replace('&lt;super&gt;',
'<text:span text:style-name="GSuper">')
text = text.replace('&lt;/super&gt;','</text:span>')
self.cntnt.write(text)
"""
Uses the xml.sax.saxutils.escape function to convert XML
entities. The _esc_map dictionary allows us to add our own
mappings.
"""
self.cntnt.write(escape(text,_esc_map))
def _write_manifest(self):
self.mfile = StringIO()
@ -755,7 +754,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.meta.write('xmlns:xlink="http://www.w3.org/1999/xlink" ')
self.meta.write('xmlns:dc="http://purl.org/dc/elements/1.1/" ')
self.meta.write('xmlns:meta="http://openoffice.org/2000/meta" ')
self.meta.write('office:class="text" office:version="0.9">\n');
self.meta.write('office:version="0.9">\n');
self.meta.write('<office:meta>\n')
self.meta.write('<meta:generator>')
self.meta.write(const.progName + ' ' + const.version)
@ -834,7 +833,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
y = int((miny)*1000)
self.cntnt.write('svg:x="%d" svg:y="%d" ' % (x,y))
self.cntnt.write('svg:viewBox="0 0 %d %d" ' % (int(maxx-minx)*1000,int(maxy-miny)*1000))
self.cntnt.write('svg:viewBox="0 0 %d %d" ' % (int((maxx-minx)*1000),int((maxy-miny)*1000)))
self.cntnt.write('svg:width="%.4fcm" ' % (maxx-minx))
self.cntnt.write('svg:height="%.4fcm" ' % (maxy-miny))
@ -850,7 +849,7 @@ class OpenOfficeDoc(BaseDoc.BaseDoc):
self.cntnt.write('"/>\n')
def draw_line(self,style,x1,y1,x2,y2):
self.cntnt.write('<draw:line draw:style="%s" '% style)
self.cntnt.write('<draw:line draw:style-name="%s" '% style)
self.cntnt.write('svg:x1="%.3fcm" ' % x1)
self.cntnt.write('svg:y1="%.3fcm" ' % y1)
self.cntnt.write('svg:x2="%.3fcm" ' % x2)

View File

@ -192,6 +192,12 @@ class Gramps:
if GrampsKeys.get_usetips():
TipOfDay.TipOfDay(self)
## # FIXME: THESE will have to be added (ViewManager?)
## # once bookmarks work again
## self.db.set_researcher(GrampsCfg.get_researcher())
## self.db.connect('person-delete',self.on_remove_bookmark)
## self.db.connect('person-update',self.on_update_bookmark)
def welcome(self):
if GrampsKeys.get_welcome() >= 200:
return

View File

@ -351,10 +351,10 @@ class ComprehensiveAncestorsReport (Report.Report):
spouse = []
if from_family:
from_family_father = from_family.get_father_handle ()
from_family_mother = from_family.get_mother_handle ()
from_family_father_id = from_family.get_father_handle ()
from_family_mother_id = from_family.get_mother_handle ()
else:
from_family_father = from_family_mother = None
from_family_father_id = from_family_mother = None
for family_handle in person.get_family_handle_list ():
family = self.database.get_family_from_handle(family_handle)
@ -365,8 +365,8 @@ class ComprehensiveAncestorsReport (Report.Report):
continue
if (suppress_children or
(partner != from_family_father and
partner != from_family_mother)):
(partner_id != from_family_father_id and
partner_id != from_family_mother_id)):
for media_ref in partner.get_media_list ()[:1]:
object_handle = media_ref.get_reference_handle()
mobject = self.database.get_object_from_handle(object_handle)

View File

@ -79,14 +79,20 @@ class ChangeNames:
return
self.win_key = self.__class__
self.name_list = []
self.progress = Utils.ProgressMeter(_('Checking family names'),'')
self.progress.set_pass(_('Searching family names'),
len(self.db.get_surname_list()))
for name in self.db.get_surname_list():
if name != name.capitalize():
self.name_list.append(name)
self.progress.step()
if self.name_list:
self.display()
else:
self.progress.close()
OkDialog(_('No modifications made'),
_("No capitalization changes were detected."))
@ -126,12 +132,15 @@ class ChangeNames:
self.list.set_model(self.model)
self.iter_list = []
self.progress.set_pass(_('Building display'),len(self.name_list))
for name in self.name_list:
handle = self.model.append()
self.model.set_value(handle,0,1)
self.model.set_value(handle,1,name)
self.model.set_value(handle,2,name.capitalize())
self.iter_list.append(handle)
self.progress.step()
self.progress.close()
self.add_itself_to_menu()
self.window.show()
@ -186,6 +195,7 @@ class ChangeNames:
self.db.transaction_commit(self.trans,_("Capitalization changes"))
self.db.enable_signals()
self.db.request_rebuild()
self.parent.bookmarks.redraw()
self.close(obj)
self.cb(None,1)

View File

@ -128,6 +128,8 @@ class ChangeTypes:
original = unicode(self.auto1.child.get_text())
new = unicode(self.auto2.child.get_text())
progress = Utils.ProgressMeter(_('Analyzing events'),'')
progress.set_pass('',self.db.get_number_of_people())
for person_handle in self.db.get_person_handles(sort_handles=False):
person = self.db.get_person_from_handle(person_handle)
for event_handle in person.get_event_list():
@ -138,13 +140,15 @@ class ChangeTypes:
event.set_name(new)
modified = modified + 1
self.db.commit_event(event,self.trans)
progress.step()
progress.close()
if modified == 1:
msg = _("1 event record was modified")
else:
msg = _("%d event records were modified") % modified
OkDialog(_('Change types'),msg,self.parent)
OkDialog(_('Change types'),msg,self.parent.topWindow)
self.db.transaction_commit(self.trans,_('Change types'))
self.close(None)

View File

@ -29,6 +29,7 @@
#-------------------------------------------------------------------------
import os
import cStringIO
import sets
from gettext import gettext as _
#-------------------------------------------------------------------------
@ -77,6 +78,7 @@ def runTool(database,active_person,callback,parent=None):
checker.check_for_broken_family_links()
checker.check_parent_relationships()
checker.cleanup_empty_families(0)
checker.cleanup_duplicate_spouses()
total = checker.family_errors()
@ -110,6 +112,7 @@ class CheckIntegrity:
self.removed_photo = []
self.empty_family = []
self.broken_links = []
self.duplicate_links = []
self.broken_parent_links = []
self.fam_rel = []
self.invalid_events = []
@ -117,13 +120,42 @@ class CheckIntegrity:
self.invalid_death_events = []
self.invalid_place_references = []
self.invalid_source_references = []
self.progress = Utils.ProgressMeter(_('Checking database'),'')
def family_errors(self):
return len(self.broken_parent_links) + len(self.broken_links) + len(self.empty_family)
return len(self.broken_parent_links) + len(self.broken_links) + len(self.empty_family) + len(self.duplicate_links)
def cleanup_duplicate_spouses(self):
self.progress.set_pass(_('Looking for duplicate spouses'),
self.db.get_number_of_people())
cursor = self.db.get_person_cursor()
data = cursor.first()
while data:
(handle,value) = data
p = RelLib.Person(value)
splist = p.get_family_handle_list()
if len(splist) != len(sets.Set(splist)):
new_list = []
for value in splist:
if value not in new_list:
new_list.append(value)
self.duplicate_links.append((handle,value))
p.set_family_handle_list(new_list)
self.db.commit_person(p,self.trans)
data = cursor.next()
self.progress.step()
cursor.close()
def check_for_broken_family_links(self):
# Check persons referenced by the family objects
for family_handle in self.db.get_family_handles():
fhandle_list = self.db.get_family_handles()
self.progress.set_pass(_('Looking for broken family links'),
len(fhandle_list) + self.db.get_number_of_people())
for family_handle in fhandle_list:
family = self.db.get_family_from_handle(family_handle)
father_handle = family.get_father_handle()
mother_handle = family.get_mother_handle()
@ -172,7 +204,8 @@ class CheckIntegrity:
family.remove_child_handle(child_handle)
self.db.commit_family(family,self.trans)
self.broken_links.append((child_handle,family_handle))
self.progress.step()
# Check persons membership in referenced families
for person_handle in self.db.get_person_handles():
person = self.db.get_person_from_handle(person_handle)
@ -206,8 +239,13 @@ class CheckIntegrity:
person.remove_family_handle(family_handle)
self.db.commit_person(person,self.trans)
self.broken_links.append((person_handle,family_handle))
self.progress.step()
def cleanup_missing_photos(self,cl=0):
self.progress.set_pass(_('Looking for unused objects'),
len(self.db.get_media_object_handles()))
missmedia_action = 0
#-------------------------------------------------------------------------
def remove_clicked():
@ -297,9 +335,17 @@ class CheckIntegrity:
leave_clicked()
elif missmedia_action == 3:
select_clicked()
self.progress.step()
def cleanup_empty_families(self,automatic):
for family_handle in self.db.get_family_handles():
fhandle_list = self.db.get_family_handles()
self.progress.set_pass(_('Looking for empty families'),
len(fhandle_list))
for family_handle in fhandle_list:
self.progress.step()
family = self.db.get_family_from_handle(family_handle)
father_handle = family.get_father_handle()
mother_handle = family.get_mother_handle()
@ -331,7 +377,12 @@ class CheckIntegrity:
self.db.remove_family(family_handle,self.trans)
def check_parent_relationships(self):
for family_handle in self.db.get_family_handles():
fhandle_list = self.db.get_family_handles()
self.progress.set_pass(_('Looking for broken parent relationships'),
len(fhandle_list))
for family_handle in fhandle_list:
family = self.db.get_family_from_handle(family_handle)
mother_handle = family.get_mother_handle()
father_handle = family.get_father_handle()
@ -379,13 +430,20 @@ class CheckIntegrity:
self.db.commit_family(family,self.trans)
def check_events(self):
self.progress.set_pass(_('Looking for event problems'),
self.db.get_number_of_people()
+self.db.get_number_of_families())
for key in self.db.get_person_handles(sort_handles=False):
self.progress.step()
person = self.db.get_person_from_handle(key)
birth_handle = person.get_birth_handle()
if birth_handle:
birth = self.db.get_event_from_handle(birth_handle)
if not birth:
# The birth event referenced by the birth handle does not exist in the database
# The birth event referenced by the birth handle
# does not exist in the database
person.set_birth_handle("")
self.db.commit_person(person,self.trans)
self.invalid_events.append(key)
@ -399,7 +457,8 @@ class CheckIntegrity:
if death_handle:
death = self.db.get_event_from_handle(death_handle)
if not death:
# The death event referenced by the death handle does not exist in the database
# The death event referenced by the death handle
# does not exist in the database
person.set_death_handle("")
self.db.commit_person(person,self.trans)
self.invalid_events.append(key)
@ -409,18 +468,50 @@ class CheckIntegrity:
death.set_name("Death");
self.db.commit_event(death,self.trans)
self.invalid_death_events.append(key)
if person.get_event_list():
for event_handle in person.get_event_list():
event = self.db.get_event_from_handle(event_handle)
if not event:
# The event referenced by the person does not exist in the database
# The event referenced by the person
# does not exist in the database
#TODO: There is no better way?
person.set_event_list( person.get_event_list().remove(event_handle))
person.set_event_list(
person.get_event_list().remove(event_handle))
self.db.commit_person(person,self.trans)
self.invalid_events.append(key)
elif type(person.get_event_list()) != list:
# event_list is None or other garbage
person.set_event_list([])
self.db.commit_person(person,self.trans)
self.invalid_events.append(key)
for key in self.db.get_family_handles():
self.progress.step()
family = self.db.get_family_from_handle(key)
if family.get_event_list():
for event_handle in family.get_event_list():
event = self.db.get_event_from_handle(event_handle)
if not event:
# The event referenced by the family
# does not exist in the database
family.set_event_list(
family.get_event_list().remove(event_handle))
self.db.commit_family(family,self.trans)
self.invalid_events.append(key)
elif type(family.get_event_list()) != list:
# event_list is None or other garbage
family.set_event_list([])
self.db.commit_family(family,self.trans)
self.invalid_events.append(key)
def check_place_references(self):
for key in self.db.get_event_handles():
elist = self.db.get_event_handles()
self.progress.set_pass(_('Looking for place reference problems'),
len(elist))
for key in elist:
event = self.db.get_event_from_handle(key)
place_handle = event.get_place_handle()
if place_handle:
@ -433,10 +524,19 @@ class CheckIntegrity:
def check_source_references(self):
known_handles = self.db.get_source_handles()
total = self.db.get_number_of_people() + self.db.get_number_of_families() + \
self.db.get_number_of_events() + self.db.get_number_of_places() + \
self.db.get_number_of_media_objects() + \
self.db.get_number_of_sources()
self.progress.set_pass(_('Looking for source reference problems'),
total)
cursor = self.db.get_person_cursor()
data = cursor.first()
while data:
self.progress.step()
handle,info = data
person = RelLib.Person()
person.unserialize(info)
@ -456,6 +556,7 @@ class CheckIntegrity:
cursor = self.db.get_family_cursor()
data = cursor.first()
while data:
self.progress.step()
handle,info = data
family = RelLib.Family()
family.unserialize(info)
@ -475,6 +576,7 @@ class CheckIntegrity:
cursor = self.db.get_place_cursor()
data = cursor.first()
while data:
self.progress.step()
handle,info = data
place = RelLib.Place()
place.unserialize(info)
@ -494,6 +596,7 @@ class CheckIntegrity:
cursor = self.db.get_source_cursor()
data = cursor.first()
while data:
self.progress.step()
handle,info = data
source = RelLib.Source()
source.unserialize(info)
@ -513,6 +616,7 @@ class CheckIntegrity:
cursor = self.db.get_media_cursor()
data = cursor.first()
while data:
self.progress.step()
handle,info = data
obj = RelLib.MediaObject()
obj.unserialize(info)
@ -532,6 +636,7 @@ class CheckIntegrity:
cursor = self.db.get_event_cursor()
data = cursor.first()
while data:
self.progress.step()
handle,info = data
event = RelLib.Event()
event.unserialize(info)
@ -549,6 +654,7 @@ class CheckIntegrity:
cursor.close()
def build_report(self,cl=0):
self.progress.close()
bad_photos = len(self.bad_photo)
replaced_photos = len(self.replaced_photo)
removed_photos = len(self.removed_photo)
@ -556,6 +662,7 @@ class CheckIntegrity:
efam = len(self.empty_family)
blink = len(self.broken_links)
plink = len(self.broken_parent_links)
slink = len(self.duplicate_links)
rel = len(self.fam_rel)
event_invalid = len(self.invalid_events)
birth_invalid = len(self.invalid_birth_events)
@ -615,6 +722,25 @@ class CheckIntegrity:
self.text.write('\t')
self.text.write(_("%s was restored to the family of %s\n") % (cn,pn))
if slink > 0:
if slink == 1:
self.text.write(_("1 duplicate spouse/family link was found\n"))
else:
self.text.write(_("%d duplicate spouse/family links were found\n") % slink)
for (person_handle,family_handle) in self.broken_parent_links:
person = self.db.get_person_from_handle(person_handle)
if person:
cn = person.get_primary_name().get_name()
else:
cn = _("Non existing person")
family = self.db.get_family_from_handle(family_handle)
if family:
pn = Utils.family_name(family,self.db)
else:
pn = family.gramps_id
self.text.write('\t')
self.text.write(_("%s was restored to the family of %s\n") % (cn,pn))
if efam == 1:
self.text.write(_("1 empty family was found\n"))
elif efam > 1:
@ -727,6 +853,6 @@ from PluginMgr import register_tool
register_tool(
runTool,
_("Check and repair database"),
category=_("Database Processing"),
category=_("Database Repair"),
description=_("Checks the database for integrity problems, fixing the problems that it can")
)

View File

@ -116,6 +116,8 @@ class Checkpoint:
"""
(archive_base,ext) = os.path.splitext(self.db.get_save_path())
comment = self.timestamp()
archive = archive_base + ",v"
if not os.path.exists(archive):
proc = popen2.Popen3('rcs -i -U -q -t-"GRAMPS database" %s' % archive,True)
@ -131,8 +133,6 @@ class Checkpoint:
xmlwrite = WriteXML.XmlWriter(self.db,self.callback,False,False)
xmlwrite.write(archive_base)
comment = self.timestamp()
proc = popen2.Popen3("ci %s" % archive_base,True)
proc.tochild.write(comment)
proc.tochild.close()

View File

@ -50,6 +50,7 @@ import const
import ReportUtils
from DateHandler import displayer as _dd
from NameDisplay import displayer as _nd
import cStringIO
#------------------------------------------------------------------------
#
@ -108,6 +109,9 @@ class DetAncestorReport(Report.Report):
self.dupPerson = options_class.handler.options_dict['omitda']
self.childRef = options_class.handler.options_dict['desref']
self.addImages = options_class.handler.options_dict['incphotos']
self.includeNames = options_class.handler.options_dict['incnames']
self.includeEvents = options_class.handler.options_dict['incevents']
self.includeSources= options_class.handler.options_dict['incsources']
self.gen_handles = {}
self.prev_gen_handles= {}
@ -122,6 +126,9 @@ class DetAncestorReport(Report.Report):
else:
self.EMPTY_PLACE = ""
self.sref_map = {}
self.sref_index = 0
def apply_filter(self,person_handle,index):
if (not person_handle) or (index >= 2**self.max_generations):
return
@ -174,6 +181,9 @@ class DetAncestorReport(Report.Report):
family = self.database.get_family_from_handle(family_handle)
self.write_children(family)
if self.includeSources:
self.write_endnotes()
def write_person(self, key):
"""Output birth, death, parentage, marriage and notes information """
@ -210,6 +220,8 @@ class DetAncestorReport(Report.Report):
self.doc.end_paragraph()
return 1 # Duplicate person
# Output the global source references for this person
self.endnotes(person)
# Check birth record
birth_handle = person.get_birth_handle()
if birth_handle:
@ -217,18 +229,26 @@ class DetAncestorReport(Report.Report):
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
self.doc.write_text(text)
self.endnotes(self.database.get_event_from_handle(birth_handle))
else:
self.doc.write_text('. ')
else:
self.doc.write_text('. ')
if person.get_death_handle():
death_handle = person.get_death_handle()
if death_handle:
age,units = self.calc_age(person)
text = ReportUtils.died_str(self.database,person,firstName,
self.EMPTY_DATE,self.EMPTY_PLACE,age,units)
if text:
self.doc.write_text(text)
self.endnotes(self.database.get_event_from_handle(death_handle))
text = ReportUtils.buried_str(self.database,person,firstName,
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
self.doc.write_text(text)
# Missing source reference for burial
self.write_parents(person, firstName)
self.write_marriage(person)
@ -245,6 +265,65 @@ class DetAncestorReport(Report.Report):
self.doc.end_paragraph()
self.doc.write_note(person.get_note(),person.get_note_format(),"DAR-Entry")
first = 1
if self.includeNames:
for alt_name in person.get_alternate_names():
if first:
self.doc.start_paragraph('DAR-MoreHeader')
self.doc.write_text(_('More about %(person_name)s:') % {
'person_name' : name })
self.doc.end_paragraph()
first = 0
self.doc.start_paragraph('DAR-MoreDetails')
self.doc.write_text(_('%(name_kind)s: %(name)s%(endnotes)s') % {
'name_kind' : const.NameTypesMap.find_value(alt_name.get_type()),
'name' : alt_name.get_regular_name(),
'endnotes' : self.endnotes(alt_name),
})
self.doc.end_paragraph()
if self.includeEvents:
for event_handle in person.get_event_list():
event = self.database.get_event_from_handle(event_handle)
date = event.get_date()
place_handle = event.get_place_handle()
if place_handle:
place = self.database.get_place_from_handle(place_handle).get_title()
else:
place = u''
if first:
self.doc.start_paragraph('DAR-MoreHeader')
self.doc.write_text(_('More about %(person_name)s:') % {
'person_name' : person.get_primary_name().get_regular_name() })
self.doc.end_paragraph()
first = 0
self.doc.start_paragraph('DAR-MoreDetails')
if date and place:
self.doc.write_text(_('%(event_name)s: %(date)s, %(place)s%(endnotes)s. ') % {
'event_name' : _(event.get_name()),
'date' : date,
'endnotes' : self.endnotes(event),
'place' : place })
elif date:
self.doc.write_text(_('%(event_name)s: %(date)s%(endnotes)s. ') % {
'event_name' : _(event.get_name()),
'endnotes' : self.endnotes(event),
'date' : date})
elif place:
self.doc.write_text(_('%(event_name)s: %(place)s%(endnotes)s. ') % {
'event_name' : _(event.get_name()),
'endnotes' : self.endnotes(event),
'place' : place })
else:
self.doc.write_text(_('%(event_name)s: ') % {
'event_name' : _(event.get_name())})
if event.get_description():
self.doc.write_text(event.get_description())
self.doc.end_paragraph()
return 0 # Not duplicate person
def write_parents(self, person, firstName):
@ -283,7 +362,7 @@ class DetAncestorReport(Report.Report):
text = ""
if marriage_event:
text = ReportUtils.married_str(self.database,person,spouse,
marriage_event,None,
marriage_event,self.endnotes,
self.EMPTY_DATE,self.EMPTY_PLACE,
is_first)
else:
@ -405,6 +484,74 @@ class DetAncestorReport(Report.Report):
else:
return (0,0)
def write_endnotes(self):
keys = self.sref_map.keys()
if not keys:
return
self.doc.start_paragraph('DAR-Endnotes-Header')
self.doc.write_text(_('Endnotes'))
self.doc.end_paragraph()
keys.sort()
for key in keys:
srcref = self.sref_map[key]
base = self.database.get_source_from_handle(srcref.get_base_handle())
self.doc.start_paragraph('DAR-Endnotes',"%d." % key)
self.doc.write_text(base.get_title())
for item in [ base.get_author(), base.get_publication_info(), base.get_abbreviation(),
_dd.display(srcref.get_date_object()),]:
if item:
self.doc.write_text('; %s' % item)
item = srcref.get_text()
if item:
self.doc.write_text('; ')
self.doc.write_text(_('Text:'))
self.doc.write_text(' ')
self.doc.write_text(item)
item = srcref.get_note()
if item:
self.doc.write_text('; ')
self.doc.write_text(_('Comments:'))
self.doc.write_text(' ')
self.doc.write_text(item)
self.doc.write_text('.')
self.doc.end_paragraph()
def endnotes(self,obj):
if not self.includeSources:
return ""
msg = cStringIO.StringIO()
slist = obj.get_source_references()
if slist:
msg.write('<super>')
first = 1
for ref in slist:
if not first:
msg.write(',')
first = 0
ref_base = ref.get_base_handle()
the_key = 0
for key in self.sref_map.keys():
if ref_base == self.sref_map[key].get_base_handle():
the_key = key
break
if the_key:
msg.write("%d" % the_key)
else:
self.sref_index += 1
self.sref_map[self.sref_index] = ref
msg.write("%d" % self.sref_index)
msg.write('</super>')
str = msg.getvalue()
msg.close()
return str
#------------------------------------------------------------------------
#
#
@ -432,6 +579,9 @@ class DetAncestorOptions(ReportOptions.ReportOptions):
'omitda' : 1,
'desref' : 1,
'incphotos' : 0,
'incnames' : 0,
'incevents' : 0,
'incsources' : 0,
}
self.options_help = {
'firstnameiop' : ("=0/1","Whether to use first names instead of pronouns",
@ -464,6 +614,15 @@ class DetAncestorOptions(ReportOptions.ReportOptions):
'incphotos' : ("=0/1","Whether to include images.",
["Do not include images","Include images"],
True),
'incnames' : ("=0/1","Whether to include other names.",
["Do not include other names","Include other names"],
True),
'incevents' : ("=0/1","Whether to include events.",
["Do not include events","Include events"],
True),
'incsources' : ("=0/1","Whether to include source references.",
["Do not include sources","Include sources"],
True),
}
def enable_options(self):
@ -525,6 +684,36 @@ class DetAncestorOptions(ReportOptions.ReportOptions):
para.set_description(_('The style used for the first personal entry.'))
default_style.add_style("DAR-First-Entry",para)
font = BaseDoc.FontStyle()
font.set(bold=1)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set(first_indent=0.0,lmargin=0.0,pad=0.25)
para.set_description(_('The style used for the More About header.'))
default_style.add_style("DAR-MoreHeader",para)
font = BaseDoc.FontStyle()
font.set(face=BaseDoc.FONT_SANS_SERIF,size=9)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set(first_indent=0.0,lmargin=1.0,pad=0.25)
para.set_description(_('The style used for additional detail data.'))
default_style.add_style("DAR-MoreDetails",para)
font = BaseDoc.FontStyle()
font.set(face=BaseDoc.FONT_SANS_SERIF,size=14,italic=1)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set_header_level(2)
para.set(pad=0.5)
para.set_description(_('The style used for the generation header.'))
default_style.add_style("DAR-Endnotes-Header",para)
para = BaseDoc.ParagraphStyle()
para.set(first_indent=0.5,lmargin=1.0,pad=0.25)
para.set_description(_('The basic style used for the endnotes text display.'))
default_style.add_style("DAR-Endnotes",para)
def add_user_options(self,dialog):
"""
Override the base class add_user_options task to add a menu that allows
@ -571,6 +760,18 @@ class DetAncestorOptions(ReportOptions.ReportOptions):
self.image_option = gtk.CheckButton(_("Include Photo/Images from Gallery"))
self.image_option.set_active(self.options_dict['incphotos'])
# Print alternative names
self.include_names_option = gtk.CheckButton(_("Include alternative names"))
self.include_names_option.set_active(self.options_dict['incnames'])
# Print events
self.include_events_option = gtk.CheckButton(_("Include events"))
self.include_events_option.set_active(self.options_dict['incevents'])
# Print sources
self.include_sources_option = gtk.CheckButton(_("Include sources"))
self.include_sources_option.set_active(self.options_dict['incsources'])
# Add new options. The first argument is the tab name for grouping options.
# if you want to put everyting in the generic "Options" category, use
# self.add_option(text,widget) instead of self.add_frame_option(category,text,widget)
@ -585,6 +786,9 @@ class DetAncestorOptions(ReportOptions.ReportOptions):
dialog.add_frame_option(_('Content'),'',self.dupPersons_option)
dialog.add_frame_option(_('Content'),'',self.childRef_option)
dialog.add_frame_option(_('Content'),'',self.image_option)
dialog.add_frame_option(_('Content'),'',self.include_names_option)
dialog.add_frame_option(_('Content'),'',self.include_events_option)
dialog.add_frame_option(_('Content'),'',self.include_sources_option)
def parse_user_options(self,dialog):
"""
@ -601,6 +805,9 @@ class DetAncestorOptions(ReportOptions.ReportOptions):
self.options_dict['omitda'] = int(self.dupPersons_option.get_active())
self.options_dict['desref'] = int(self.childRef_option.get_active())
self.options_dict['incphotos'] = int(self.image_option.get_active())
self.options_dict['incnames'] = int(self.include_names_option.get_active())
self.options_dict['incevents'] = int(self.include_events_option.get_active())
self.options_dict['incsources'] = int(self.include_sources_option.get_active())
#------------------------------------------------------------------------
#

View File

@ -52,6 +52,7 @@ import ReportUtils
import const
from DateHandler import displayer as _dd
from NameDisplay import displayer as _nd
import cStringIO
#------------------------------------------------------------------------
#
@ -110,6 +111,9 @@ class DetDescendantReport(Report.Report):
self.dupPerson = options_class.handler.options_dict['omitda']
self.childRef = options_class.handler.options_dict['desref']
self.addImages = options_class.handler.options_dict['incphotos']
self.includeNames = options_class.handler.options_dict['incnames']
self.includeEvents = options_class.handler.options_dict['incevents']
self.includeSources= options_class.handler.options_dict['incsources']
self.gen_handles = {}
self.prev_gen_handles= {}
@ -125,6 +129,9 @@ class DetDescendantReport(Report.Report):
else:
self.EMPTY_PLACE = ""
self.sref_map = {}
self.sref_index = 0
def apply_filter(self,person_handle,index,cur_gen=1):
if (not person_handle) or (cur_gen > self.max_generations):
return
@ -149,6 +156,7 @@ class DetDescendantReport(Report.Report):
name = _nd.display_name(self.start_person.get_primary_name())
spouseName = ""
nspouses = 0
for family_handle in self.start_person.get_family_handle_list():
family = self.database.get_family_from_handle(family_handle)
if self.start_person.get_gender() == RelLib.Person.MALE:
@ -156,11 +164,12 @@ class DetDescendantReport(Report.Report):
else:
spouse_handle = family.get_father_handle()
if spouse_handle:
nspouses += 1
spouse = self.database.get_person_from_handle(spouse_handle)
spouseName = _nd.display(spouse)
self.doc.start_paragraph("DDR-Title")
if spouseName:
if nspouses == 1:
name = _("%(spouse_name)s and %(person_name)s") % {
'spouse_name' : spouseName, 'person_name' : name }
@ -198,6 +207,9 @@ class DetDescendantReport(Report.Report):
family = self.database.get_family_from_handle(family_handle)
self.write_children(family)
if self.includeSources:
self.write_endnotes()
def write_person(self, key):
"""Output birth, death, parentage, marriage and notes information """
@ -233,6 +245,8 @@ class DetDescendantReport(Report.Report):
self.doc.end_paragraph()
return 1 # Duplicate person
# Output the global source references for this person
self.endnotes(person)
# Check birth record
birth_handle = person.get_birth_handle()
if birth_handle:
@ -240,17 +254,25 @@ class DetDescendantReport(Report.Report):
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
self.doc.write_text(text)
if person.get_death_handle():
self.endnotes(self.database.get_event_from_handle(birth_handle))
else:
self.doc.write_text(". ");
else:
self.doc.write_text(". ");
death_handle = person.get_death_handle()
if death_handle:
age,units = self.calc_age(person)
text = ReportUtils.died_str(self.database,person,firstName,
self.EMPTY_DATE,self.EMPTY_PLACE,age,units)
if text:
self.doc.write_text(text)
self.endnotes(self.database.get_event_from_handle(death_handle))
text = ReportUtils.buried_str(self.database,person,firstName,
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
self.doc.write_text(text)
# Missing source reference for burial
self.write_parents(person, firstName)
self.write_marriage(person)
@ -266,6 +288,65 @@ class DetDescendantReport(Report.Report):
self.doc.end_paragraph()
self.doc.write_note(person.get_note(),person.get_note_format(),"DDR-Entry")
first = 1
if self.includeNames:
for alt_name in person.get_alternate_names():
if first:
self.doc.start_paragraph('DDR-MoreHeader')
self.doc.write_text(_('More about %(person_name)s:') % {
'person_name' : name })
self.doc.end_paragraph()
first = 0
self.doc.start_paragraph('DDR-MoreDetails')
self.doc.write_text(_('%(name_kind)s: %(name)s%(endnotes)s') % {
'name_kind' : const.NameTypesMap.find_value(alt_name.get_type()),
'name' : alt_name.get_regular_name(),
'endnotes' : self.endnotes(alt_name),
})
self.doc.end_paragraph()
if self.includeEvents:
for event_handle in person.get_event_list():
event = self.database.get_event_from_handle(event_handle)
date = event.get_date()
place_handle = event.get_place_handle()
if place_handle:
place = self.database.get_place_from_handle(place_handle).get_title()
else:
place = u''
if first:
self.doc.start_paragraph('DDR-MoreHeader')
self.doc.write_text(_('More about %(person_name)s:') % {
'person_name' : person.get_primary_name().get_regular_name() })
self.doc.end_paragraph()
first = 0
self.doc.start_paragraph('DDR-MoreDetails')
if date and place:
self.doc.write_text(_('%(event_name)s: %(date)s, %(place)s%(endnotes)s. ') % {
'event_name' : _(event.get_name()),
'date' : date,
'endnotes' : self.endnotes(event),
'place' : place })
elif date:
self.doc.write_text(_('%(event_name)s: %(date)s%(endnotes)s. ') % {
'event_name' : _(event.get_name()),
'endnotes' : self.endnotes(event),
'date' : date})
elif place:
self.doc.write_text(_('%(event_name)s: %(place)s%(endnotes)s. ') % {
'event_name' : _(event.get_name()),
'endnotes' : self.endnotes(event),
'place' : place })
else:
self.doc.write_text(_('%(event_name)s: ') % {
'event_name' : _(event.get_name())})
if event.get_description():
self.doc.write_text(event.get_description())
self.doc.end_paragraph()
return 0 # Not duplicate person
def write_parents(self, person, firstName):
@ -305,7 +386,7 @@ class DetDescendantReport(Report.Report):
text = ""
if marriage_event:
text = ReportUtils.married_str(self.database,person,spouse,
marriage_event,None,
marriage_event,self.endnotes,
self.EMPTY_DATE,self.EMPTY_PLACE,
is_first)
else:
@ -390,6 +471,8 @@ class DetDescendantReport(Report.Report):
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
self.doc.write_text(text)
else:
self.doc.write_text(". ");
age,units = self.calc_age(ind)
text = ReportUtils.died_str(self.database,ind,heshe,
@ -406,9 +489,9 @@ class DetDescendantReport(Report.Report):
self.doc.end_paragraph()
if self.listChildren \
and mate.get_gender() == RelLib.Person.MALE:
self.write_children(family)
# if self.listChildren \
# and mate.get_gender() == RelLib.Person.MALE:
# self.write_children(family)
def calc_age(self,ind):
"""
@ -426,6 +509,74 @@ class DetDescendantReport(Report.Report):
else:
return (0,0)
def write_endnotes(self):
keys = self.sref_map.keys()
if not keys:
return
self.doc.start_paragraph('DDR-Endnotes-Header')
self.doc.write_text(_('Endnotes'))
self.doc.end_paragraph()
keys.sort()
for key in keys:
srcref = self.sref_map[key]
base = self.database.get_source_from_handle(srcref.get_base_handle())
self.doc.start_paragraph('DDR-Endnotes',"%d." % key)
self.doc.write_text(base.get_title())
for item in [ base.get_author(), base.get_publication_info(), base.get_abbreviation(),
_dd.display(srcref.get_date_object()),]:
if item:
self.doc.write_text('; %s' % item)
item = srcref.get_text()
if item:
self.doc.write_text('; ')
self.doc.write_text(_('Text:'))
self.doc.write_text(' ')
self.doc.write_text(item)
item = srcref.get_note()
if item:
self.doc.write_text('; ')
self.doc.write_text(_('Comments:'))
self.doc.write_text(' ')
self.doc.write_text(item)
self.doc.write_text('.')
self.doc.end_paragraph()
def endnotes(self,obj):
if not self.includeSources:
return ""
msg = cStringIO.StringIO()
slist = obj.get_source_references()
if slist:
msg.write('<super>')
first = 1
for ref in slist:
if not first:
msg.write(',')
first = 0
ref_base = ref.get_base_handle()
the_key = 0
for key in self.sref_map.keys():
if ref_base == self.sref_map[key].get_base_handle():
the_key = key
break
if the_key:
msg.write("%d" % the_key)
else:
self.sref_index += 1
self.sref_map[self.sref_index] = ref
msg.write("%d" % self.sref_index)
msg.write('</super>')
str = msg.getvalue()
msg.close()
return str
#------------------------------------------------------------------------
#
#
@ -453,6 +604,9 @@ class DetDescendantOptions(ReportOptions.ReportOptions):
'omitda' : 1,
'desref' : 1,
'incphotos' : 0,
'incnames' : 0,
'incevents' : 0,
'incsources' : 0,
}
self.options_help = {
'firstnameiop' : ("=0/1","Whether to use first names instead of pronouns",
@ -485,6 +639,15 @@ class DetDescendantOptions(ReportOptions.ReportOptions):
'incphotos' : ("=0/1","Whether to include images.",
["Do not include images","Include images"],
True),
'incnames' : ("=0/1","Whether to include other names.",
["Do not include other names","Include other names"],
True),
'incevents' : ("=0/1","Whether to include events.",
["Do not include events","Include events"],
True),
'incsources' : ("=0/1","Whether to include source references.",
["Do not include sources","Include sources"],
True),
}
def enable_options(self):
@ -546,6 +709,36 @@ class DetDescendantOptions(ReportOptions.ReportOptions):
para.set_description(_('The style used for the first personal entry.'))
default_style.add_style("DDR-First-Entry",para)
font = BaseDoc.FontStyle()
font.set(bold=1)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set(first_indent=0.0,lmargin=0.0,pad=0.25)
para.set_description(_('The style used for the More About header.'))
default_style.add_style("DDR-MoreHeader",para)
font = BaseDoc.FontStyle()
font.set(face=BaseDoc.FONT_SANS_SERIF,size=9)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set(first_indent=0.0,lmargin=1.0,pad=0.25)
para.set_description(_('The style used for additional detail data.'))
default_style.add_style("DDR-MoreDetails",para)
font = BaseDoc.FontStyle()
font.set(face=BaseDoc.FONT_SANS_SERIF,size=14,italic=1)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set_header_level(2)
para.set(pad=0.5)
para.set_description(_('The style used for the generation header.'))
default_style.add_style("DDR-Endnotes-Header",para)
para = BaseDoc.ParagraphStyle()
para.set(first_indent=0.5,lmargin=1.0,pad=0.25)
para.set_description(_('The basic style used for the endnotes text display.'))
default_style.add_style("DDR-Endnotes",para)
def add_user_options(self,dialog):
"""
Override the base class add_user_options task to add a menu that allows
@ -592,6 +785,18 @@ class DetDescendantOptions(ReportOptions.ReportOptions):
self.image_option = gtk.CheckButton(_("Include Photo/Images from Gallery"))
self.image_option.set_active(self.options_dict['incphotos'])
# Print alternative names
self.include_names_option = gtk.CheckButton(_("Include alternative names"))
self.include_names_option.set_active(self.options_dict['incnames'])
# Print events
self.include_events_option = gtk.CheckButton(_("Include events"))
self.include_events_option.set_active(self.options_dict['incevents'])
# Print sources
self.include_sources_option = gtk.CheckButton(_("Include sources"))
self.include_sources_option.set_active(self.options_dict['incsources'])
# Add new options. The first argument is the tab name for grouping options.
# if you want to put everyting in the generic "Options" category, use
# self.add_option(text,widget) instead of self.add_frame_option(category,text,widget)
@ -606,6 +811,9 @@ class DetDescendantOptions(ReportOptions.ReportOptions):
dialog.add_frame_option(_('Content'),'',self.dupPersons_option)
dialog.add_frame_option(_('Content'),'',self.childRef_option)
dialog.add_frame_option(_('Content'),'',self.image_option)
dialog.add_frame_option(_('Content'),'',self.include_names_option)
dialog.add_frame_option(_('Content'),'',self.include_events_option)
dialog.add_frame_option(_('Content'),'',self.include_sources_option)
def parse_user_options(self,dialog):
"""
@ -622,6 +830,9 @@ class DetDescendantOptions(ReportOptions.ReportOptions):
self.options_dict['omitda'] = int(self.dupPersons_option.get_active())
self.options_dict['desref'] = int(self.childRef_option.get_active())
self.options_dict['incphotos'] = int(self.image_option.get_active())
self.options_dict['incnames'] = int(self.include_names_option.get_active())
self.options_dict['incevents'] = int(self.include_events_option.get_active())
self.options_dict['incsources'] = int(self.include_sources_option.get_active())
#------------------------------------------------------------------------
#

View File

@ -201,7 +201,13 @@ class EventComparison:
def on_apply_clicked(self,obj):
cfilter = self.filter_menu.get_active().get_data("filter")
plist = cfilter.apply(self.db,self.db.get_person_handles(sort_handles=False))
progress_bar = Utils.ProgressMeter(_('Comparing events'),'')
progress_bar.set_pass(_('Selecting people'),1)
plist = cfilter.apply(self.db,
self.db.get_person_handles(sort_handles=False))
progress_bar.step()
progress_bar.close()
if len(plist) == 0:
WarningDialog(_("No matches were found"))
@ -312,10 +318,17 @@ class DisplayChart:
index = index + 1
self.list = ListModel.ListModel(self.eventlist,titles)
self.progress_bar.set_pass(_('Building display'),len(self.row_data))
for data in self.row_data:
self.list.add(data)
self.progress_bar.step()
self.progress_bar.close()
def build_row_data(self):
self.progress_bar = Utils.ProgressMeter(_('Comparing events'),'')
self.progress_bar.set_pass(_('Building data'),
self.db.get_number_of_people())
for individual_id in self.my_list:
individual = self.db.get_person_from_handle(individual_id)
name = individual.get_primary_name().get_name()
@ -382,6 +395,7 @@ class DisplayChart:
done = 1
else:
self.row_data.append(tlist)
self.progress_bar.step()
def make_event_titles(self):
"""Creates the list of unique event types, along with the person's

View File

@ -82,7 +82,7 @@ class CalendarWriterOptionBox:
all.set_name(_("Entire Database"))
all.add_rule(GenericFilter.Everyone([]))
if person:
if self.person:
des = GenericFilter.GenericFilter()
des.set_name(_("Descendants of %s") %
self.person.get_primary_name().get_name())

View File

@ -129,8 +129,7 @@ class GraphViz:
rankdir - Graph direction
color - Whether to use outline, colored outline or filled color in graph
dashedl - Whether to use dashed lines for non-birth relationships.
margtb - Top & bottom margins, in cm.
marglr - Left & right margins, in cm.
margin - Margins, in cm.
pagesh - Number of pages in horizontal direction.
pagesv - Number of pages in vertical direction.
"""
@ -157,8 +156,12 @@ class GraphViz:
options = options_class.handler.options_dict
self.hpages = options['pagesh']
self.vpages = options['pagesv']
self.lr_margin = options['marglr']
self.tb_margin = options['margtb']
margin_cm = options['margin']
self.margin = round(margin_cm/2.54,2)
if margin_cm > 0.1:
self.margin_small = round((margin_cm-0.1)/2.54,2)
else:
self.margin_small = 0
self.includeid = options['incid']
self.includedates = options['incdate']
self.includeurl = options['url']
@ -203,15 +206,19 @@ class GraphViz:
self.f.write("bgcolor=white;\n")
self.f.write("rankdir=%s;\n" % self.rankdir)
self.f.write("center=1;\n")
self.f.write("margin=0.5;\n")
self.f.write("margin=%3.2f;\n" % self.margin_small)
self.f.write("ratio=fill;\n")
self.f.write("size=\"%3.1f,%3.1f\";\n" % (
(self.width*self.hpages)-(self.lr_margin*2)
-((self.hpages-1)*1.0),
(self.height*self.vpages)-(self.tb_margin*2)
-((self.vpages-1)*1.0))
)
self.f.write("page=\"%3.1f,%3.1f\";\n" % (self.width,self.height))
if self.orient == PAPER_LANDSCAPE:
self.f.write("size=\"%3.2f,%3.2f\";\n" % (
(self.height-self.margin*2)*self.hpages,
(self.width-self.margin*2)*self.vpages
))
else:
self.f.write("size=\"%3.2f,%3.2f\";\n" % (
(self.width-self.margin*2)*self.hpages,
(self.height-self.margin*2)*self.vpages
))
self.f.write("page=\"%3.2f,%3.2f\";\n" % (self.width,self.height))
if self.orient == PAPER_LANDSCAPE:
self.f.write("rotate=90;\n")
@ -400,12 +407,11 @@ class GraphViz:
self.f.write(" * colorize : %s\n" % bool(self.colorize))
self.f.write(" * dotted adoptions : %s\n" % bool(self.adoptionsdashed))
self.f.write(" * show family nodes : %s\n" % bool(self.show_families))
self.f.write(" * margins top/bottom : %s\n" % self.tb_margin)
self.f.write(" * left/right : %s\n" % self.lr_margin)
self.f.write(" * margin : %3.2fin\n" % self.margin_small)
self.f.write(" * pages horizontal : %s\n" % self.hpages)
self.f.write(" * vertical : %s\n" % self.vpages)
self.f.write(" * page width : %sin\n" % self.width)
self.f.write(" * height : %sin\n" % self.height)
self.f.write(" * page width : %3.2fin\n" % self.width)
self.f.write(" * height : %3.2fin\n" % self.height)
self.f.write(" *\n")
self.f.write(" * Generated on %s by GRAMPS\n" % asctime())
self.f.write(" */\n\n")
@ -439,8 +445,7 @@ class GraphVizOptions(ReportOptions.ReportOptions):
'rankdir' : "LR",
'color' : "filled",
'dashedl' : 1,
'margtb' : 0.5,
'marglr' : 0.5,
'margin' : 1.0,
'pagesh' : 1,
'pagesv' : 1,
'gvof' : 'ps',
@ -483,10 +488,8 @@ class GraphVizOptions(ReportOptions.ReportOptions):
'dashedl' : ("=0/1","Whether to use dotted lines for non-birth relationships.",
["Do not use dotted lines","Use dotted lines"],
True),
'margtb' : ("=num","Top & bottom margins.",
"Floating point values, in cm"),
'marglr' : ("=num","Left & right margins.",
"Floating point values, in cm"),
'margin' : ("=num","Margin size.",
"Floating point value, in cm"),
'pagesh' : ("=num","Number of pages in horizontal direction.",
"Integer values"),
'pagesv' : ("=num","Number of pages in vertical direction.",
@ -678,20 +681,14 @@ class GraphVizOptions(ReportOptions.ReportOptions):
"to parents and children."))
# Page options tab
tb_margin_adj = gtk.Adjustment(value=self.options_dict['margtb'],
lower=0.25, upper=100.0, step_incr=0.25)
lr_margin_adj = gtk.Adjustment(value=self.options_dict['marglr'],
lower=0.25, upper=100.0, step_incr=0.25)
margin_adj = gtk.Adjustment(value=self.options_dict['margin'],
lower=0.0, upper=10.0, step_incr=1.0)
self.tb_margin_sb = gtk.SpinButton(adjustment=tb_margin_adj, digits=2)
self.lr_margin_sb = gtk.SpinButton(adjustment=lr_margin_adj, digits=2)
self.margin_sb = gtk.SpinButton(adjustment=margin_adj, digits=1)
dialog.add_frame_option(_("Page Options"),
_("Top & Bottom Margins"),
self.tb_margin_sb)
dialog.add_frame_option(_("Page Options"),
_("Left & Right Margins"),
self.lr_margin_sb)
_("Margin size"),
self.margin_sb)
hpages_adj = gtk.Adjustment(value=self.options_dict['pagesh'],
lower=1, upper=25, step_incr=1)
@ -724,8 +721,7 @@ class GraphVizOptions(ReportOptions.ReportOptions):
def parse_user_options(self,dialog):
self.options_dict['incdate'] = int(self.includedates_cb.get_active())
self.options_dict['url'] = int(self.includeurl_cb.get_active())
self.options_dict['margtb'] = self.tb_margin_sb.get_value()
self.options_dict['marglr'] = self.lr_margin_sb.get_value()
self.options_dict['margin'] = self.margin_sb.get_value()
self.options_dict['dashedl'] = int(self.adoptionsdashed_cb.get_active())
self.options_dict['pagesh'] = self.hpages_sb.get_value_as_int()
self.options_dict['pagesv'] = self.vpages_sb.get_value_as_int()

View File

@ -21,8 +21,8 @@ pkgdata_PYTHON = \
DetAncestralReport.py\
DetDescendantReport.py\
EventCmp.py\
ExportVCalendar.py\
ExportVCard.py\
ExportVCalendar.py\
ExportVCard.py\
FamilyGroup.py\
FanChart.py\
FtmStyleAncestors.py\
@ -31,10 +31,12 @@ pkgdata_PYTHON = \
GraphViz.py\
IndivComplete.py\
IndivSummary.py\
ImportvCard.py\
ImportvCard.py\
Merge.py\
NavWebPage.py\
PatchNames.py\
ReadPkg.py\
Rebuild.py\
RelCalc.py\
ReorderIds.py\
SoundGen.py\

View File

@ -176,25 +176,21 @@ class Merge:
else:
self.show()
def progress_update(self,val):
self.progress.set_fraction(val/100.0)
while gtk.events_pending():
gtk.main_iteration()
def find_potentials(self,thresh):
top = gtk.glade.XML(self.glade_file,"message","gramps")
self.topWin = top.get_widget("message")
self.topWin.set_icon(self.parent.topWindow.get_icon())
self.progress = top.get_widget("progressbar1")
self.progress = Utils.ProgressMeter(_('Find duplicates'),
_('Looking for duplicate people'))
Utils.set_titles(self.topWin,top.get_widget('title'),
_('Determining possible merges'))
index = 0
males = {}
females = {}
length = len(self.person_list)
self.progress.set_pass(_('Pass 1: Building preliminary lists'),
length)
for p1_id in self.person_list:
self.progress.step()
p1 = self.db.get_person_from_handle(p1_id)
key = self.gen_key(p1.get_primary_name().get_surname())
if p1.get_gender() == RelLib.Person.MALE:
@ -208,14 +204,12 @@ class Merge:
else:
females[key] = [p1_id]
length = len(self.person_list)
self.progress.set_pass(_('Pass 2: Calculating potential matches'),
length)
num = 0
for p1key in self.person_list:
self.progress.step()
p1 = self.db.get_person_from_handle(p1key)
if num % 25 == 0:
self.progress_update((float(num)/float(length))*100)
num = num + 1
key = self.gen_key(p1.get_primary_name().get_surname())
if p1.get_gender() == RelLib.Person.MALE:
@ -246,7 +240,7 @@ class Merge:
self.list = self.map.keys()
self.list.sort()
self.length = len(self.list)
self.topWin.destroy()
self.progress.close()
self.dellist = {}
def show(self):
@ -602,8 +596,6 @@ class Merge:
value = self.name_match(mname1,mname2)
if value != -1:
chance = chance + value
print p1.get_gramps_id(), p2.get_gramps_id(), chance
return chance
#-------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

View File

@ -103,6 +103,11 @@ class PatchNames:
self.prefix1_list = []
self.prefix2_list = []
self.progress = Utils.ProgressMeter(
_('Extracting information from names'),'')
self.progress.set_pass(_('Analyzing names'),
self.db.get_number_of_people())
for key in self.db.get_person_handles(sort_handles=False):
person = self.db.get_person_from_handle(key)
@ -139,10 +144,12 @@ class PatchNames:
if match:
groups = match.groups()
self.prefix2_list.append((key,groups[1],groups[0]))
self.progress.step()
if self.nick_list or self.title_list or self.prefix1_list or self.prefix2_list:
self.display()
else:
self.progress.close()
OkDialog(_('No modifications made'),
_("No titles or nicknames were found"))
@ -197,7 +204,11 @@ class PatchNames:
self.title_hash = {}
self.prefix1_hash = {}
self.prefix2_hash = {}
self.progress.set_pass(_('Bulding display'),
len(self.nick_list)+len(self.title_list)
+len(self.prefix1_list)+len(self.prefix2_list))
for (id,name,nick) in self.nick_list:
p = self.db.get_person_from_handle(id)
gid = p.get_gramps_id()
@ -208,6 +219,7 @@ class PatchNames:
self.model.set_value(handle,3,nick)
self.model.set_value(handle,4,p.get_primary_name().get_name())
self.nick_hash[id] = handle
self.progress.step()
for (id,title,nick) in self.title_list:
p = self.db.get_person_from_handle(id)
@ -219,6 +231,7 @@ class PatchNames:
self.model.set_value(handle,3,nick)
self.model.set_value(handle,4,p.get_primary_name().get_name())
self.title_hash[id] = handle
self.progress.step()
for (id,prefix,fname) in self.prefix1_list:
p = self.db.get_person_from_handle(id)
@ -230,6 +243,7 @@ class PatchNames:
self.model.set_value(handle,3,fname)
self.model.set_value(handle,4,p.get_primary_name().get_name())
self.prefix1_hash[id] = handle
self.progress.step()
for (id,prefix,fname) in self.prefix2_list:
p = self.db.get_person_from_handle(id)
@ -241,7 +255,9 @@ class PatchNames:
self.model.set_value(handle,3,fname)
self.model.set_value(handle,4,p.get_primary_name().get_name())
self.prefix2_hash[id] = handle
self.progress.step()
self.progress.close()
self.add_itself_to_menu()
self.window.show()

93
src/plugins/Rebuild.py Normal file
View File

@ -0,0 +1,93 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# 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
# 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$
"Database Processing/Check and repair database"
#-------------------------------------------------------------------------
#
# python modules
#
#-------------------------------------------------------------------------
import os
import cStringIO
from gettext import gettext as _
#-------------------------------------------------------------------------
#
# gtk modules
#
#-------------------------------------------------------------------------
import gtk
import gtk.glade
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
import RelLib
import Utils
import const
from QuestionDialog import OkDialog
#-------------------------------------------------------------------------
#
# runTool
#
#-------------------------------------------------------------------------
def runTool(database,active_person,callback,parent=None):
try:
if database.readonly:
# TODO: split plugin in a check and repair part to support
# checking of a read only database
return
total = database.get_number_of_people() + database.get_number_of_families() + \
database.get_number_of_places() + database.get_number_of_sources() + \
database.get_number_of_media_objects()
progress = Utils.ProgressMeter(_('Rebuilding Secondary Indices'))
progress.set_pass('',total)
database.disable_signals()
database.rebuild_secondary(progress.step)
database.enable_signals()
progress.close()
OkDialog(_("Secondary indices rebuilt"),
_('All secondary indices have been rebuilt.'))
except:
import DisplayTrace
DisplayTrace.DisplayTrace()
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
from PluginMgr import register_tool
register_tool(
runTool,
_("Rebuild secondary indices"),
category=_("Database Repair"),
description=_("Rebuilds secondary indices")
)

View File

@ -93,7 +93,7 @@ class RelCalc:
self.people = self.glade.get_widget("peopleList")
self.clist = ListModel.ListModel(self.people,
[(_('Name'),3,150),(_('ID'),1,50),
[(_('Name'),3,150),(_('Gender'),1,50),
(_('Birth Date'),4,150),
('',-1,0),('',-1,0)],
self.on_apply_clicked)

View File

@ -70,23 +70,32 @@ class ReorderIds:
self.db = db
self.progress = Utils.ProgressMeter(_('Reordering GRAMPS IDs'),'')
self.trans = db.transaction_begin()
self.progress.set_pass(_('Reordering People IDs'),db.get_number_of_people())
self.reorder(RelLib.Person, db.get_person_from_gramps_id, db.get_person_from_handle,
db.find_next_person_gramps_id, db.get_person_cursor, db.commit_person,
db.iprefix)
self.progress.set_pass(_('Reordering Family IDs'),db.get_number_of_families())
self.reorder(RelLib.Family,db.get_family_from_gramps_id, db.get_family_from_handle,
db.find_next_family_gramps_id, db.get_family_cursor, db.commit_family,
db.fprefix)
self.progress.set_pass(_('Reordering Media Object IDs'),db.get_number_of_media_objects())
self.reorder(RelLib.MediaObject, db.get_object_from_gramps_id, db.get_object_from_handle,
db.find_next_object_gramps_id, db.get_media_cursor, db.commit_media_object,
db.oprefix)
self.progress.set_pass(_('Reordering Source IDs'),db.get_number_of_sources())
self.reorder(RelLib.Source, db.get_source_from_gramps_id, db.get_source_from_handle,
db.find_next_source_gramps_id, db.get_source_cursor, db.commit_source,
db.sprefix)
self.progress.set_pass(_('Reordering Place IDs'),db.get_number_of_places())
self.reorder(RelLib.Place, db.get_place_from_gramps_id, db.get_place_from_handle,
db.find_next_place_gramps_id, db.get_place_cursor, db.commit_place,
db.pprefix)
db.transaction_commit(self.trans,_("Reorder gramps IDs"))
self.progress.close()
db.transaction_commit(self.trans,_("Reorder GRAMPS IDs"))
def reorder(self, class_type, find_from_id, find_from_handle, find_next_id, get_cursor, commit, prefix):
dups = []
@ -98,6 +107,7 @@ class ReorderIds:
cursor = get_cursor()
data = cursor.first()
while data:
self.progress.step()
(handle,sdata) = data
obj = class_type()
@ -134,7 +144,9 @@ class ReorderIds:
# go through the duplicates, looking for the first availble
# handle that matches the new scheme.
self.progress.set_pass(_('Finding and assigning unused IDs'),len(dups))
for handle in dups:
self.progress.step()
obj = find_from_handle(handle)
obj.set_gramps_id(find_next_id())
commit(obj,self.trans)
@ -148,8 +160,7 @@ from PluginMgr import register_tool
register_tool(
runTool,
_("Reorder gramps IDs"),
_("Reorder GRAMPS IDs"),
category=_("Database Processing"),
description=_("Reorders the gramps IDs according to gramps' default rules.")
)

Some files were not shown because too many files have changed in this diff Show More