* src/ArgHandler.py: Command line support for geneweb import

and export; Fix command line exports for gedcom, XML, and package.
* src/Exporter.py (help): Point to correct manual section.
* src/const.py.in: Add a constant for geneweb mime type name.
* src/plugins/WriteFtree.py: Support wizard and fix command line mode.
* src/plugins/writeftree.glade: Support export wizard.
* src/plugins/WritePkg.py: Support wizard and fix command line mode.
* src/plugins/ImportGeneWeb.py: Comment out debugging messages.
* src/plugins/WriteGeneWeb.py: Support for command-line export.


svn: r4054
This commit is contained in:
Alex Roitman
2005-02-19 19:05:48 +00:00
parent 3ca70aac2d
commit 14052b42db
9 changed files with 297 additions and 349 deletions

View File

@@ -1,3 +1,14 @@
2005-02-19 Alex Roitman <shura@alex.neuro.umn.edu>
* src/ArgHandler.py: Command line support for geneweb import
and export; Fix command line exports for gedcom, XML, and package.
* src/Exporter.py (help): Point to correct manual section.
* src/const.py.in: Add a constant for geneweb mime type name.
* src/plugins/WriteFtree.py: Support wizard and fix command line mode.
* src/plugins/writeftree.glade: Support export wizard.
* src/plugins/WritePkg.py: Support wizard and fix command line mode.
* src/plugins/ImportGeneWeb.py: Comment out debugging messages.
* src/plugins/WriteGeneWeb.py: Support for command-line export.
2005-02-18 Don Allingham <dallingham@users.sourceforge.net> 2005-02-18 Don Allingham <dallingham@users.sourceforge.net>
* src/EditPerson.py: more readonly patches * src/EditPerson.py: more readonly patches
* src/EventEdit.py: more readonly patches * src/EventEdit.py: more readonly patches

View File

@@ -152,7 +152,7 @@ class ArgHandler:
if opt_ix<len(options)-1 \ if opt_ix<len(options)-1 \
and options[opt_ix+1][0] in ( '-f', '--format'): and options[opt_ix+1][0] in ( '-f', '--format'):
format = options[opt_ix+1][1] format = options[opt_ix+1][1]
if format not in ('gedcom','gramps-xml','gramps-pkg','grdb'): if format not in ('gedcom','gramps-xml','gramps-pkg','grdb','geneweb'):
print "Invalid format: %s" % format print "Invalid format: %s" % format
print "Ignoring input file: %s" % fname print "Ignoring input file: %s" % fname
continue continue
@@ -164,6 +164,8 @@ class ArgHandler:
format = 'gramps-xml' format = 'gramps-xml'
elif ftype == const.app_gramps: elif ftype == const.app_gramps:
format = 'grdb' format = 'grdb'
elif ftype == const.app_geneweb:
format = 'geneweb'
else: else:
print "Unrecognized format for input file %s" % fname print "Unrecognized format for input file %s" % fname
print "Ignoring input file: %s" % fname print "Ignoring input file: %s" % fname
@@ -174,7 +176,7 @@ class ArgHandler:
if opt_ix<len(options)-1 \ if opt_ix<len(options)-1 \
and options[opt_ix+1][0] in ( '-f', '--format'): and options[opt_ix+1][0] in ( '-f', '--format'):
outformat = options[opt_ix+1][1] outformat = options[opt_ix+1][1]
if outformat not in ('gedcom','gramps-xml','gramps-pkg','grdb','iso','wft'): if outformat not in ('gedcom','gramps-xml','gramps-pkg','grdb','iso','wft','geneweb'):
print "Invalid format: %s" % outformat print "Invalid format: %s" % outformat
print "Ignoring output file: %s" % outfname print "Ignoring output file: %s" % outfname
continue continue
@@ -184,6 +186,8 @@ class ArgHandler:
outformat = 'gramps-pkg' outformat = 'gramps-pkg'
elif outfname[-3:].upper() == "WFT": elif outfname[-3:].upper() == "WFT":
outformat = 'wft' outformat = 'wft'
elif outfname[-2:].upper() == "GW":
outformat = 'geneweb'
elif not os.path.isfile(outfname): elif not os.path.isfile(outfname):
if not os.path.isdir(outfname): if not os.path.isdir(outfname):
try: try:
@@ -426,6 +430,14 @@ class ArgHandler:
except: except:
print "Error importing %s" % filename print "Error importing %s" % filename
os._exit(1) os._exit(1)
elif format == 'geneweb':
import ImportGeneWeb
filename = os.path.normpath(os.path.abspath(filename))
try:
ImportGeneWeb.importData(self.parent.db,filename,None)
except:
print "Error importing %s" % filename
os._exit(1)
elif format == 'gramps-pkg': elif format == 'gramps-pkg':
# Create tempdir, if it does not exist, then check for writability # Create tempdir, if it does not exist, then check for writability
tmpdir_path = os.path.expanduser("~/.gramps/tmp" ) tmpdir_path = os.path.expanduser("~/.gramps/tmp" )
@@ -484,8 +496,8 @@ class ArgHandler:
if format == 'gedcom': if format == 'gedcom':
import WriteGedcom import WriteGedcom
try: try:
g = WriteGedcom.GedcomWriter(self.parent.db,None,1,filename) gw = WriteGedcom.GedcomWriter(self.parent.db,None,1,filename)
del g ret = gw.export_data(filename)
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) os._exit(1)
@@ -494,63 +506,41 @@ class ArgHandler:
dbname = os.path.join(filename,const.xmlFile) dbname = os.path.join(filename,const.xmlFile)
if filename: if filename:
try: try:
self.parent.save_media(filename) import WriteXML
self.parent.db.save(dbname,None) g = WriteXML.XmlWriter(self.parent.db,None,1,1)
ret = g.write(dbname)
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) os._exit(1)
elif format == 'gramps-pkg': elif format == 'gramps-pkg':
import TarFile
import WriteXML
from cStringIO import StringIO
try: try:
t = TarFile.TarFile(filename) import WritePkg
mtime = time.time() writer = WritePkg.PackageWriter(self.parent.db,filename)
ret = writer.export()
except: except:
print "Error creating %s" % filename print "Error creating %s" % filename
os._exit(1) os._exit(1)
try:
# Write media files first, since the database may be modified
# during the process (i.e. when removing object)
for m_id in self.parent.db.get_media_object_handles():
mobject = self.parent.db.get_object_from_handle(m_id)
oldfile = mobject.get_path()
base = os.path.basename(oldfile)
if os.path.isfile(oldfile):
g = open(oldfile,"rb")
t.add_file(base,mtime,g)
g.close()
else:
print "Warning: media file %s was not found," % base,\
"so it was ignored."
except:
print "Error exporting media files to %s" % filename
os._exit(1)
try:
# Write XML now
g = StringIO()
gfile = WriteXML.XmlWriter(self.parent.db,None,1)
gfile.write_handle(g)
mtime = time.time()
t.add_file("data.gramps",mtime,g)
g.close()
t.close()
except:
print "Error exporting data to %s" % filename
os._exit(1)
elif format == 'iso': elif format == 'iso':
import WriteCD print "\tISO format is temporarily disabled."
try: #import WriteCD
WriteCD.PackageWriter(self.parent.db,1,filename) #try:
except: # WriteCD.PackageWriter(self.parent.db,1,filename)
print "Error exporting %s" % filename #except:
os._exit(1) # print "Error exporting %s" % filename
# os._exit(1)
elif format == 'wft': elif format == 'wft':
import WriteFtree import WriteFtree
try: try:
WriteFtree.FtreeWriter(self.parent.db,None,1,filename) writer = WriteFtree.FtreeWriter(self.parent.db,None,1,filename)
ret = writer.export_data()
except:
print "Error exporting %s" % filename
os._exit(1)
elif format == 'geneweb':
import WriteGeneWeb
try:
writer = WriteGeneWeb.GeneWebWriter(self.parent.db,None,1,filename)
ret = writer.export_data()
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) os._exit(1)

View File

@@ -1,7 +1,7 @@
# #
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2004 Donald N. Allingham # Copyright (C) 2004-2005 Donald N. Allingham
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -20,9 +20,7 @@
# $Id$ # $Id$
# # Written by Alex Roitman
# Written by Alex Roitman, 2004
#
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -121,8 +119,7 @@ class Exporter:
""" """
Help handler. Help handler.
""" """
#FIXME: point to the correct section when it exists gnome.help_display('gramps-manual','export-data')
gnome.help_display('gramps-manual','index')
def build_info_page(self): def build_info_page(self):
""" """

View File

@@ -42,10 +42,11 @@ from TransTable import TransTable
# Mime Types # Mime Types
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
app_gramps = "application/x-gramps" app_gramps = "application/x-gramps"
app_gramps_xml = "application/x-gramps-xml" app_gramps_xml = "application/x-gramps-xml"
app_gedcom = "application/x-gedcom" app_gedcom = "application/x-gedcom"
app_gramps_package = "application/x-gramps-package" app_gramps_package = "application/x-gramps-package"
app_geneweb = "application/x-geneweb"
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@@ -1,7 +1,7 @@
# #
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2000-2004 Martin Hawlisch, Donald N. Allingham # Copyright (C) 2000-2005 Martin Hawlisch, Donald N. Allingham
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -29,9 +29,8 @@
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
import re import re
import string
import const
import time import time
from gettext import gettext as _
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -48,13 +47,11 @@ import gtk.glade
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import Errors import Errors
import RelLib import RelLib
import Date
import DateHandler
import latin_utf8 import latin_utf8
import Utils import Utils
import const
from QuestionDialog import ErrorDialog from QuestionDialog import ErrorDialog
from gettext import gettext as _ from DateHandler import parser as _dp
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -98,7 +95,6 @@ class GeneWebParser:
self.db = dbase self.db = dbase
self.f = open(file,"rU") self.f = open(file,"rU")
self.filename = file self.filename = file
self.dp = DateHandler.create_parser()
def get_next_line(self): def get_next_line(self):
line = self.f.readline() line = self.f.readline()
@@ -133,7 +129,7 @@ class GeneWebParser:
fields = line.split(" ") fields = line.split(" ")
print "LINE: %s" %line #print "LINE: %s" %line
if fields[0] == "fam": if fields[0] == "fam":
self.read_family_line(line,fields) self.read_family_line(line,fields)
elif fields[0] == "src": elif fields[0] == "src":
@@ -173,7 +169,7 @@ class GeneWebParser:
self.fkeys.append(self.current_family.get_handle()) self.fkeys.append(self.current_family.get_handle())
idx = 1; idx = 1;
print "\nHusband:" #print "\nHusband:"
(idx,husband) = self.parse_person(fields,idx,RelLib.Person.MALE,None) (idx,husband) = self.parse_person(fields,idx,RelLib.Person.MALE,None)
if husband: if husband:
self.current_husband_handle = husband.get_handle() self.current_husband_handle = husband.get_handle()
@@ -181,9 +177,9 @@ class GeneWebParser:
self.db.commit_family(self.current_family,self.trans) self.db.commit_family(self.current_family,self.trans)
husband.add_family_handle(self.current_family.get_handle()) husband.add_family_handle(self.current_family.get_handle())
self.db.commit_person(husband,self.trans) self.db.commit_person(husband,self.trans)
print "Marriage:" #print "Marriage:"
idx = self.parse_marriage(fields,idx) idx = self.parse_marriage(fields,idx)
print "Wife:" #print "Wife:"
(idx,wife) = self.parse_person(fields,idx,RelLib.Person.FEMALE,None) (idx,wife) = self.parse_person(fields,idx,RelLib.Person.FEMALE,None)
if wife: if wife:
self.current_family.set_mother_handle(wife.get_handle()) self.current_family.set_mother_handle(wife.get_handle())
@@ -194,15 +190,15 @@ class GeneWebParser:
def read_source_line(self,line,fields): def read_source_line(self,line,fields):
if not self.current_family: if not self.current_family:
print "Unknown family of child!" print "Unknown family of child!"
return None return None
source = self.get_or_create_source(self.decode(fields[1])) source = self.get_or_create_source(self.decode(fields[1]))
self.current_family.add_source_reference(source) self.current_family.add_source_reference(source)
self.db.commit_family(self.current_family,self.trans) self.db.commit_family(self.current_family,self.trans)
return None return None
def read_witness_line(self,line,fields): def read_witness_line(self,line,fields):
print "Witness:" #print "Witness:"
if fields[1] == "m:": if fields[1] == "m:":
self.parse_person(fields,2,RelLib.Person.MALE,None) self.parse_person(fields,2,RelLib.Person.MALE,None)
elif fields[1] == "f:": elif fields[1] == "f:":
@@ -219,8 +215,8 @@ class GeneWebParser:
husb = self.db.get_person_from_handle(self.current_husband_handle) husb = self.db.get_person_from_handle(self.current_husband_handle)
father_surname = husb.get_primary_name().get_surname() father_surname = husb.get_primary_name().get_surname()
if not self.current_family: if not self.current_family:
print "Unknown family of child!" print "Unknown family of child!"
return None return None
while 1: while 1:
line = self.get_next_line() line = self.get_next_line()
if line == None: if line == None:
@@ -230,7 +226,7 @@ class GeneWebParser:
fields = line.split(" ") fields = line.split(" ")
if fields[0] == "-": if fields[0] == "-":
print "Child:" #print "Child:"
child = None child = None
if fields[1] == "h": if fields[1] == "h":
(idx,child) = self.parse_person(fields,2,RelLib.Person.MALE,father_surname) (idx,child) = self.parse_person(fields,2,RelLib.Person.MALE,father_surname)
@@ -254,8 +250,8 @@ class GeneWebParser:
def read_family_comment(self,line,fields): def read_family_comment(self,line,fields):
if not self.current_family: if not self.current_family:
print "Unknown family of child!" print "Unknown family of child!"
return None return None
self.current_family.set_note(self.cnv(line)) self.current_family.set_note(self.cnv(line))
self.db.commit_family(self.current_family,self.trans) self.db.commit_family(self.current_family,self.trans)
return None return None
@@ -299,7 +295,7 @@ class GeneWebParser:
# skip to marriage date in case person contained unmatches tokens # skip to marriage date in case person contained unmatches tokens
#Alex: this failed when fields[idx] was an empty line. Fixed. #Alex: this failed when fields[idx] was an empty line. Fixed.
#while idx < len(fields) and not fields[idx][0] == "+": #while idx < len(fields) and not fields[idx][0] == "+":
while idx < len(fields) and not (fields[idx] and fields[idx][0] == "+"): while idx < len(fields) and not (fields[idx] and fields[idx][0] == "+"):
print "Unknown field: "+fields[idx] print "Unknown field: "+fields[idx]
idx = idx + 1 idx = idx + 1
@@ -307,33 +303,33 @@ class GeneWebParser:
while idx < len(fields) and mariageDataRe.match(fields[idx]): while idx < len(fields) and mariageDataRe.match(fields[idx]):
if fields[idx][0] == "+": if fields[idx][0] == "+":
mar_date = self.parse_date(self.decode(fields[idx])) mar_date = self.parse_date(self.decode(fields[idx]))
print " Married at: %s" % fields[idx] #print " Married at: %s" % fields[idx]
idx = idx + 1 idx = idx + 1
elif fields[idx][0] == "-": elif fields[idx][0] == "-":
div_date = self.parse_date(self.decode(fields[idx])) div_date = self.parse_date(self.decode(fields[idx]))
print " Div at: %s" % fields[idx] #print " Div at: %s" % fields[idx]
idx = idx + 1 idx = idx + 1
elif fields[idx] == "#mp": elif fields[idx] == "#mp":
idx = idx + 1 idx = idx + 1
mar_place = self.get_or_create_place(self.decode(fields[idx])) mar_place = self.get_or_create_place(self.decode(fields[idx]))
print " Marriage place: %s" % fields[idx] #print " Marriage place: %s" % fields[idx]
idx = idx + 1 idx = idx + 1
elif fields[idx] == "#ms": elif fields[idx] == "#ms":
idx = idx + 1 idx = idx + 1
mar_source = self.get_or_create_source(self.decode(fields[idx])) mar_source = self.get_or_create_source(self.decode(fields[idx]))
print " Marriage source: %s" % fields[idx] #print " Marriage source: %s" % fields[idx]
idx = idx + 1 idx = idx + 1
elif fields[idx] == "#sep": elif fields[idx] == "#sep":
idx = idx + 1 idx = idx + 1
sep_date = self.parse_date(self.decode(fields[idx])) sep_date = self.parse_date(self.decode(fields[idx]))
print " Seperated since: %s" % fields[idx] #print " Seperated since: %s" % fields[idx]
idx = idx + 1 idx = idx + 1
elif fields[idx] == "#np": elif fields[idx] == "#np":
print " Are not married." #print " Are not married."
married = 0 married = 0
idx = idx + 1 idx = idx + 1
elif fields[idx] == "#eng": elif fields[idx] == "#eng":
print " Are engaged." #print " Are engaged."
engaged = 1 engaged = 1
idx = idx + 1 idx = idx + 1
else: else:
@@ -385,7 +381,7 @@ class GeneWebParser:
surname = self.decode(fields[idx]) surname = self.decode(fields[idx])
idx = idx + 1 idx = idx + 1
print "Person: %s %s" % (firstname, surname) #print "Person: %s %s" % (firstname, surname)
person = self.get_or_create_person(firstname,surname) person = self.get_or_create_person(firstname,surname)
name = RelLib.Name() name = RelLib.Name()
name.set_type("Birth Name") name.set_type("Birth Name")
@@ -424,113 +420,113 @@ class GeneWebParser:
while idx < len(fields) and personDataRe.match(fields[idx]): while idx < len(fields) and personDataRe.match(fields[idx]):
if fields[idx][0] == '(': if fields[idx][0] == '(':
print "Public Name: %s" % fields[idx] #print "Public Name: %s" % fields[idx]
public_name = self.decode(fields[idx]) public_name = self.decode(fields[idx])
idx = idx + 1 idx = idx + 1
elif fields[idx][0] == '{': elif fields[idx][0] == '{':
print "Firstsname Alias: %s" % fields[idx] #print "Firstsname Alias: %s" % fields[idx]
firstname_aliases.append(self.decode(fields[idx])) firstname_aliases.append(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx][0] == '[': elif fields[idx][0] == '[':
print "Titles: %s" % fields[idx] #print "Titles: %s" % fields[idx]
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#nick': elif fields[idx] == '#nick':
idx = idx + 1 idx = idx + 1
print "Nick Name: %s" % fields[idx] #print "Nick Name: %s" % fields[idx]
nick_names.append(self.decode(fields[idx])) nick_names.append(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#occu': elif fields[idx] == '#occu':
idx = idx + 1 idx = idx + 1
print "Occupation: %s" % fields[idx] #print "Occupation: %s" % fields[idx]
occu = self.create_event("Occupation",self.decode(fields[idx])) occu = self.create_event("Occupation",self.decode(fields[idx]))
person.add_event_handle(occu.get_handle()) person.add_event_handle(occu.get_handle())
self.db.commit_person(person,self.trans) self.db.commit_person(person,self.trans)
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#alias': elif fields[idx] == '#alias':
idx = idx + 1 idx = idx + 1
print "Name Alias: %s" % fields[idx] #print "Name Alias: %s" % fields[idx]
name_aliases.append(self.decode(fields[idx])) name_aliases.append(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#salias': elif fields[idx] == '#salias':
idx = idx + 1 idx = idx + 1
print "Surname Alias: %s" % fields[idx] #print "Surname Alias: %s" % fields[idx]
surname_aliases.append(self.decode(fields[idx])) surname_aliases.append(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#image': elif fields[idx] == '#image':
idx = idx + 1 idx = idx + 1
print "Image: %s" % fields[idx] #print "Image: %s" % fields[idx]
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#src': elif fields[idx] == '#src':
idx = idx + 1 idx = idx + 1
print "Source: %s" % fields[idx] #print "Source: %s" % fields[idx]
source = self.get_or_create_source(self.decode(fields[idx])) source = self.get_or_create_source(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#bs': elif fields[idx] == '#bs':
idx = idx + 1 idx = idx + 1
print "Birth Source: %s" % fields[idx] #print "Birth Source: %s" % fields[idx]
birth_source = self.get_or_create_source(self.decode(fields[idx])) birth_source = self.get_or_create_source(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx][0] == '!': elif fields[idx][0] == '!':
print "Baptize at: %s" % fields[idx] #print "Baptize at: %s" % fields[idx]
bapt_date = self.parse_date(self.decode(fields[idx])) bapt_date = self.parse_date(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#bp': elif fields[idx] == '#bp':
idx = idx + 1 idx = idx + 1
print "Birth Place: %s" % fields[idx] #print "Birth Place: %s" % fields[idx]
birth_place = self.get_or_create_place(self.decode(fields[idx])) birth_place = self.get_or_create_place(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#pp': elif fields[idx] == '#pp':
idx = idx + 1 idx = idx + 1
print "Baptize Place: %s" % fields[idx] #print "Baptize Place: %s" % fields[idx]
bapt_place = self.get_or_create_place(self.decode(fields[idx])) bapt_place = self.get_or_create_place(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#ps': elif fields[idx] == '#ps':
idx = idx + 1 idx = idx + 1
print "Baptize Source: %s" % fields[idx] #print "Baptize Source: %s" % fields[idx]
bapt_source = self.get_or_create_source(self.decode(fields[idx])) bapt_source = self.get_or_create_source(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#dp': elif fields[idx] == '#dp':
idx = idx + 1 idx = idx + 1
print "Death Place: %s" % fields[idx] #print "Death Place: %s" % fields[idx]
death_place = self.get_or_create_place(self.decode(fields[idx])) death_place = self.get_or_create_place(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#ds': elif fields[idx] == '#ds':
idx = idx + 1 idx = idx + 1
print "Death Source: %s" % fields[idx] #print "Death Source: %s" % fields[idx]
death_source = self.get_or_create_source(self.decode(fields[idx])) death_source = self.get_or_create_source(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#buri': elif fields[idx] == '#buri':
idx = idx + 1 idx = idx + 1
print "Burial Date: %s" % fields[idx] #print "Burial Date: %s" % fields[idx]
bur_date = self.parse_date(self.decode(fields[idx])) bur_date = self.parse_date(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#crem': elif fields[idx] == '#crem':
idx = idx + 1 idx = idx + 1
print "Cremention Date: %s" % fields[idx] #print "Cremention Date: %s" % fields[idx]
crem_date = self.parse_date(self.decode(fields[idx])) crem_date = self.parse_date(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#bp': elif fields[idx] == '#bp':
idx = idx + 1 idx = idx + 1
print "Burial Place: %s" % fields[idx] #print "Burial Place: %s" % fields[idx]
bur_place = self.get_or_create_place(self.decode(fields[idx])) bur_place = self.get_or_create_place(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#rs': elif fields[idx] == '#rs':
idx = idx + 1 idx = idx + 1
print "Burial Source: %s" % fields[idx] #print "Burial Source: %s" % fields[idx]
bur_source = self.get_or_create_source(self.decode(fields[idx])) bur_source = self.get_or_create_source(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#apubl': elif fields[idx] == '#apubl':
print "This is a public record" #print "This is a public record"
idx = idx + 1 idx = idx + 1
elif fields[idx] == '#apriv': elif fields[idx] == '#apriv':
print "This is a private record" #print "This is a private record"
idx = idx + 1 idx = idx + 1
elif dateRe.match( fields[idx]): elif dateRe.match( fields[idx]):
if not birth_date: if not birth_date:
print "Birth Date: %s" % fields[idx] #print "Birth Date: %s" % fields[idx]
birth_date = self.parse_date(self.decode(fields[idx])) birth_date = self.parse_date(self.decode(fields[idx]))
else: else:
print "Death Date: %s" % fields[idx] #print "Death Date: %s" % fields[idx]
death_date = self.parse_date(self.decode(fields[idx])) death_date = self.parse_date(self.decode(fields[idx]))
idx = idx + 1 idx = idx + 1
else: else:
@@ -611,8 +607,7 @@ class GeneWebParser:
return (idx,person) return (idx,person)
def parse_date(self,field): def parse_date(self,field):
#Alex: this should do the trick date = _dp.parse(field)
date = self.dp.parse(field)
return date return date
def create_event(self,type,desc=None,date=None,place=None,source=None): def create_event(self,type,desc=None,date=None,place=None,source=None):
@@ -680,11 +675,10 @@ class GeneWebParser:
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_mime_type = 'application/x-geneweb' _mime_type = const.app_geneweb
_filter = gtk.FileFilter() _filter = gtk.FileFilter()
_filter.set_name(_('GeneWeb files')) _filter.set_name(_('GeneWeb files'))
_filter.add_mime_type(_mime_type) _filter.add_mime_type(_mime_type)
from PluginMgr import register_import from PluginMgr import register_import
register_import(importData,_filter,_mime_type,1) register_import(importData,_filter,_mime_type,1)

View File

@@ -1,7 +1,7 @@
# #
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2003-2004 Donald N. Allingham # Copyright (C) 2003-2005 Donald N. Allingham
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -29,6 +29,7 @@
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
from cStringIO import StringIO from cStringIO import StringIO
from gettext import gettext as _
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -47,25 +48,70 @@ import gnome
import Utils import Utils
import GenericFilter import GenericFilter
import Errors import Errors
from QuestionDialog import ErrorDialog from QuestionDialog import ErrorDialog
from gettext import gettext as _
_title_string = _("Export to Web Family Tree")
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# writeData # writeData
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def writeData(database,person): def writeData(database,filename,person,option_box):
ret = 0
try: try:
FtreeWriter(database,person) writer = FtreeWriter(database,person,0,filename,option_box)
ret = writer.export_data()
except: except:
import DisplayTrace import DisplayTrace
DisplayTrace.DisplayTrace() DisplayTrace.DisplayTrace()
return ret
class FtreeWriterOptionBox:
"""
Create a VBox with the option widgets and define methods to retrieve
the options.
"""
def __init__(self,person):
self.person = person
def get_option_box(self):
self.restrict = True
base = os.path.dirname(__file__)
glade_file = "%s/%s" % (base,"writeftree.glade")
self.top = gtk.glade.XML(glade_file,"top","gramps")
filter_obj = self.top.get_widget("filter")
all = GenericFilter.GenericFilter()
all.set_name(_("Entire Database"))
all.add_rule(GenericFilter.Everyone([]))
des = GenericFilter.GenericFilter()
des.set_name(_("Descendants of %s") % self.person.get_primary_name().get_name())
des.add_rule(GenericFilter.IsDescendantOf([self.person.get_handle(),1]))
ans = GenericFilter.GenericFilter()
ans.set_name(_("Ancestors of %s") % self.person.get_primary_name().get_name())
ans.add_rule(GenericFilter.IsAncestorOf([self.person.get_handle(),1]))
com = GenericFilter.GenericFilter()
com.set_name(_("People with common ancestor with %s") %
self.person.get_primary_name().get_name())
com.add_rule(GenericFilter.HasCommonAncestorWith([self.person.get_handle()]))
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
filter_obj.set_menu(self.filter_menu)
the_box = self.top.get_widget("vbox1")
the_parent = self.top.get_widget('dialog-vbox1')
the_parent.remove(the_box)
self.top.get_widget("top").destroy()
return the_box
def parse_options(self):
self.restrict = self.top.get_widget("restrict").get_active()
self.cfilter = self.filter_menu.get_active().get_data("filter")
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# FtreeWriter # FtreeWriter
@@ -73,93 +119,39 @@ def writeData(database,person):
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class FtreeWriter: class FtreeWriter:
def __init__(self,database,person,cl=0,name=""): def __init__(self,database,person,cl=0,filename="",option_box=None):
self.db = database self.db = database
self.person = person self.person = person
self.option_box = option_box
self.cl = cl
self.filename = filename
self.plist = {} self.plist = {}
if cl: if not option_box:
if name: self.cl_setup()
self.export(name,None,0)
else: else:
base = os.path.dirname(__file__) self.option_box.parse_options()
glade_file = "%s/%s" % (base,"writeftree.glade")
dic = {
"destroy_passed_object" : self.close,
"on_ok_clicked" : self.on_ok_clicked,
"on_help_clicked" : self.on_help_clicked,
}
self.top = gtk.glade.XML(glade_file,"top","gramps") self.restrict = self.option_box.restrict
if self.option_box.cfilter == None:
for p in self.db.get_person_handles(sort_handles=False):
self.plist[p] = 1
else:
try:
for p in self.option_box.cfilter.apply(self.db, self.db.get_person_handles(sort_handles=False)):
self.plist[p] = 1
except Errors.FilterError, msg:
(m1,m2) = msg.messages()
ErrorDialog(m1,m2)
return
Utils.set_titles(self.top.get_widget('top'), def cl_setup(self):
self.top.get_widget('title'), self.restrict = True
_title_string) for p in self.db.get_person_handles(sort_handles=False):
self.plist[p] = 1
self.top.signal_autoconnect(dic)
self.topwin = self.top.get_widget("top") def export_data(self):
self.restrict = self.top.get_widget("restrict")
self.filter = self.top.get_widget("filter")
all = GenericFilter.GenericFilter()
all.set_name(_("Entire Database"))
all.add_rule(GenericFilter.Everyone([]))
des = GenericFilter.GenericFilter()
des.set_name(_("Descendants of %s") % person.get_primary_name().get_name())
des.add_rule(GenericFilter.IsDescendantOf([person.get_handle(),1]))
ans = GenericFilter.GenericFilter()
ans.set_name(_("Ancestors of %s") % person.get_primary_name().get_name())
ans.add_rule(GenericFilter.IsAncestorOf([person.get_handle(),1]))
com = GenericFilter.GenericFilter()
com.set_name(_("People with common ancestor with %s") %
person.get_primary_name().get_name())
com.add_rule(GenericFilter.HasCommonAncestorWith([person.get_handle()]))
self.filter_menu = GenericFilter.build_filter_menu([all,des,ans,com])
self.filter.set_menu(self.filter_menu)
self.topwin.show()
def close(self,obj):
self.topwin.destroy()
def on_ok_clicked(self,obj):
name = self.top.get_widget("filename").get_text()
restrict = self.top.get_widget('restrict').get_active()
pfilter = self.filter_menu.get_active().get_data("filter")
Utils.destroy_passed_object(self.topwin)
try:
self.export(name, pfilter, restrict)
except (IOError,OSError),msg:
ErrorDialog(_("Could not create %s") % name, msg)
except:
import DisplayTrace
DisplayTrace.DisplayTrace()
def on_help_clicked(self,obj):
"""Display the relevant portion of GRAMPS manual"""
gnome.help_display('gramps-manual','export-data')
def export(self, filename, cfilter, restrict ):
if cfilter == None:
for p in self.db.get_person_handles(sort_handles=False):
self.plist[p] = 1
else:
try:
for p in cfilter.apply(self.db, self.db.get_person_handle_map().values()):
self.plist[p.get_handle()] = 1
except Errors.FilterError, msg:
(m1,m2) = msg.messages()
ErrorDialog(m1,m2)
return
name_map = {} name_map = {}
id_map = {} id_map = {}
id_name = {} id_name = {}
@@ -187,7 +179,7 @@ class FtreeWriter:
id_map[key] = n id_map[key] = n
id_name[key] = get_name(pn,count) id_name[key] = get_name(pn,count)
f = open(filename,"w") f = open(self.filename,"w")
for key in self.plist: for key in self.plist:
p = self.db.get_person_from_handle(key) p = self.db.get_person_from_handle(key)
@@ -197,31 +189,42 @@ class FtreeWriter:
email = "" email = ""
web = "" web = ""
family = p.get_main_parents_family_handle() family_handle = p.get_main_parents_family_handle()
if family: if family_handle:
if family.get_father_handle() and id_map.has_key(family.get_father_handle().get_handle()): family = self.db.get_family_from_handle(family_handle)
father = id_map[family.get_father_handle().get_handle()] if family.get_father_handle() and id_map.has_key(family.get_father_handle()):
if family.get_mother_handle() and id_map.has_key(family.get_mother_handle().get_handle()): father = id_map[family.get_father_handle()]
mother = id_map[family.get_mother_handle().get_handle()] if family.get_mother_handle() and id_map.has_key(family.get_mother_handle()):
mother = id_map[family.get_mother_handle()]
# #
# Calculate Date # Calculate Date
# #
birth = p.get_birth().get_date_object() birth_handle = p.get_birth_handle()
death = p.get_death().get_date_object() death_handle = p.get_death_handle()
if birth_handle:
birth_event = self.db.get_event_from_handle(birth_handle)
birth = birth_event.get_date_object()
else:
birth = None
if death_handle:
death_event = self.db.get_event_from_handle(death_handle)
death = death_event.get_date_object()
else:
death = None
if restrict: if self.restrict:
alive = Utils.probably_alive(p,self.db) alive = Utils.probably_alive(p,self.db)
else: else:
alive = 0 alive = 0
if birth.isValid() and not alive: if birth and not alive:
if death.isValid() and not alive : if death and not alive :
dates = "%s-%s" % (fdate(birth),fdate(death)) dates = "%s-%s" % (fdate(birth),fdate(death))
else: else:
dates = fdate(birth) dates = fdate(birth)
else: else:
if death.isValid() and not alive: if death and not alive:
dates = fdate(death) dates = fdate(death)
else: else:
dates = "" dates = ""
@@ -229,16 +232,17 @@ class FtreeWriter:
f.write('%s;%s;%s;%s;%s;%s\n' % (name,father,mother,email,web,dates)) f.write('%s;%s;%s;%s;%s;%s\n' % (name,father,mother,email,web,dates))
f.close() f.close()
return 1
def fdate(val): def fdate(val):
if val.getYearValid(): if val.get_year_valid():
if val.getMonthValid(): if val.get_month_valid():
if val.getDayValid(): if val.get_day_valid():
return "%d/%d/%d" % (val.getDay(),val.getMonth(),val.getYear()) return "%d/%d/%d" % (val.get_day(),val.get_month(),val.get_year())
else: else:
return "%d/%d" % (val.getMonth(),val.getYear()) return "%d/%d" % (val.get_month(),val.get_year())
else: else:
return "%d" % val.getYear() return "%d" % val.get_year()
else: else:
return "" return ""
@@ -250,22 +254,26 @@ def get_name(name,count):
else: else:
val = str(count) val = str(count)
if (name.Suffix == ""): if (name.suffix == ""):
if name.Prefix: if name.prefix:
return "%s %s %s%s" % (name.FirstName, name.Prefix, name.Surname, val) return "%s %s %s%s" % (name.first_name, name.prefix, name.surname, val)
else: else:
return "%s %s%s" % (name.FirstName, name.Surname, val) return "%s %s%s" % (name.first_name, name.surname, val)
else: else:
if name.Prefix: if name.prefix:
return "%s %s %s%s, %s" % (name.FirstName, name.Prefix, name.Surname, val, name.Suffix) return "%s %s %s%s, %s" % (name.first_name, name.prefix, name.surname, val, name.Suffix)
else: else:
return "%s %s%s, %s" % (name.FirstName, name.Surname, val, name.Suffix) return "%s %s%s, %s" % (name.first_name, name.surname, val, name.suffix)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Register the plugin # Register the plugin
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from PluginMgr import register_export _title = _('_Web Family Tree')
_description = _('Web Family Tree format.')
_config = (_('Web Family Tree export options'),FtreeWriterOptionBox)
_filename = 'wft'
register_export(writeData,_title_string) from PluginMgr import register_export
register_export(writeData,_title,_description,_config,_filename)

View File

@@ -2,6 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2004 Martin Hawlisch # Copyright (C) 2004 Martin Hawlisch
# Copyright (C) 2004-2005 Donald N. Allingham
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -27,9 +28,9 @@
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
import string
import time import time
import re import re
from gettext import gettext as _
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -51,12 +52,8 @@ import const
import Utils import Utils
import Date import Date
import Errors import Errors
from gettext import gettext as _
from QuestionDialog import ErrorDialog from QuestionDialog import ErrorDialog
_title_string = _("Export to GeneWeb")
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# #
@@ -204,17 +201,17 @@ class GeneWebWriter:
def writeln(self,text): def writeln(self,text):
self.g.write(self.iso8859('%s\n' % (text))) self.g.write(self.iso8859('%s\n' % (text)))
def export_data(self,filename): def export_data(self):
self.dirname = os.path.dirname (filename) self.dirname = os.path.dirname (self.filename)
try: try:
self.g = open(filename,"w") self.g = open(self.filename,"w")
except IOError,msg: except IOError,msg:
msg2 = _("Could not create %s") % filename msg2 = _("Could not create %s") % self.filename
ErrorDialog(msg2,str(msg)) ErrorDialog(msg2,str(msg))
return 0 return 0
except: except:
ErrorDialog(_("Could not create %s") % filename) ErrorDialog(_("Could not create %s") % self.filename)
return 0 return 0
if len(self.flist) < 1: if len(self.flist) < 1:
@@ -566,7 +563,7 @@ def exportData(database,filename,person,option_box):
ret = 0 ret = 0
try: try:
gw = GeneWebWriter(database,person,0,filename,option_box) gw = GeneWebWriter(database,person,0,filename,option_box)
ret = gw.export_data(filename) ret = gw.export_data()
except: except:
import DisplayTrace import DisplayTrace
DisplayTrace.DisplayTrace() DisplayTrace.DisplayTrace()
@@ -577,11 +574,10 @@ def exportData(database,filename,person,option_box):
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_title = _('GeneWeb') _title = _('G_eneWeb')
_description = _('GeneWeb is a web based genealogy program.') _description = _('GeneWeb is a web based genealogy program.')
_config = (_('GeneWeb export options'),GeneWebWriterOptionBox) _config = (_('GeneWeb export options'),GeneWebWriterOptionBox)
_filename = 'gw' _filename = 'gw'
from PluginMgr import register_export from PluginMgr import register_export
register_export(exportData,_title,_description,_config,_filename) register_export(exportData,_title,_description,_config,_filename)

View File

@@ -1,7 +1,7 @@
# #
# Gramps - a GTK+/GNOME based genealogy program # 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 # 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 # it under the terms of the GNU General Public License as published by
@@ -30,6 +30,7 @@
import time import time
import os import os
from cStringIO import StringIO from cStringIO import StringIO
from gettext import gettext as _
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -49,20 +50,21 @@ import TarFile
import Utils import Utils
from QuestionDialog import MissingMediaDialog from QuestionDialog import MissingMediaDialog
from gettext import gettext as _
_title_string = _("Export to GRAMPS package")
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# writeData # writeData
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def writeData(database,filename): def writeData(database,filename,person,callback=None):
ret = 0
try: try:
PackageWriter(database,filename) writer = PackageWriter(database,filename)
ret = writer.export()
except: except:
import DisplayTrace import DisplayTrace
DisplayTrace.DisplayTrace() DisplayTrace.DisplayTrace()
return ret
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -76,9 +78,10 @@ class PackageWriter:
if os.path.splitext(filename)[1] != ".gpkg": if os.path.splitext(filename)[1] != ".gpkg":
filename = filename + ".gpkg" filename = filename + ".gpkg"
self.export(filename)
self.filename = filename
def export(self, filename): def export(self):
missmedia_action = 0 missmedia_action = 0
#-------------------------------------------------------------- #--------------------------------------------------------------
def remove_clicked(): def remove_clicked():
@@ -129,7 +132,6 @@ class PackageWriter:
# File is lost => do nothing, leave as is # File is lost => do nothing, leave as is
pass pass
def select_clicked(): def select_clicked():
# File is lost => select a file to replace the lost one # File is lost => select a file to replace the lost one
def fs_close_window(obj): def fs_close_window(obj):
@@ -150,7 +152,7 @@ class PackageWriter:
fs_top.destroy() fs_top.destroy()
#--------------------------------------------------------------- #---------------------------------------------------------------
t = TarFile.TarFile(filename) t = TarFile.TarFile(self.filename)
mtime = time.time() mtime = time.time()
# Write media files first, since the database may be modified # Write media files first, since the database may be modified
@@ -190,18 +192,17 @@ class PackageWriter:
g.close() g.close()
t.close() t.close()
return 1
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Register the plugin # Register the plugin
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_mime_type = 'application/x-gramps-package' _title = _('GRAM_PS package')
_filter = gtk.FileFilter() _description = _('GRAMPS package is an archived XML database together with the media object files.')
_filter.set_name(_('GRAMPS packages')) _config = None
_filter.add_mime_type(_mime_type) _filename = 'gpkg'
_ext_list = ('.gpkg',)
from PluginMgr import register_export from PluginMgr import register_export
register_export(writeData,_title,_description,_config,_filename)
register_export(writeData,_filter,_ext_list)

View File

@@ -13,6 +13,11 @@
<property name="default_width">480</property> <property name="default_width">480</property>
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="destroy_with_parent">False</property> <property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="has_separator">False</property> <property name="has_separator">False</property>
<child internal-child="vbox"> <child internal-child="vbox">
@@ -34,6 +39,7 @@
<property name="label">gtk-cancel</property> <property name="label">gtk-cancel</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">0</property> <property name="response_id">0</property>
<signal name="clicked" handler="destroy_passed_object" object="gedcomExport"/> <signal name="clicked" handler="destroy_passed_object" object="gedcomExport"/>
</widget> </widget>
@@ -47,6 +53,7 @@
<property name="label">gtk-ok</property> <property name="label">gtk-ok</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">0</property> <property name="response_id">0</property>
<signal name="clicked" handler="on_ok_clicked" object="gedcomExport"/> <signal name="clicked" handler="on_ok_clicked" object="gedcomExport"/>
</widget> </widget>
@@ -60,6 +67,7 @@
<property name="label">gtk-help</property> <property name="label">gtk-help</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-11</property> <property name="response_id">-11</property>
<signal name="clicked" handler="on_help_clicked" last_modification_time="Tue, 02 Dec 2003 02:01:12 GMT"/> <signal name="clicked" handler="on_help_clicked" last_modification_time="Tue, 02 Dec 2003 02:01:12 GMT"/>
</widget> </widget>
@@ -104,48 +112,16 @@
<widget class="GtkTable" id="table3"> <widget class="GtkTable" id="table3">
<property name="border_width">12</property> <property name="border_width">12</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="n_rows">5</property> <property name="n_rows">3</property>
<property name="n_columns">3</property> <property name="n_columns">3</property>
<property name="homogeneous">False</property> <property name="homogeneous">False</property>
<property name="row_spacing">6</property> <property name="row_spacing">6</property>
<property name="column_spacing">12</property> <property name="column_spacing">12</property>
<child> <child>
<widget class="GnomeFileEntry" id="fileentry1"> <widget class="GtkLabel" id="label9">
<property name="visible">True</property> <property name="visible">True</property>
<property name="history_id">ftree_export</property> <property name="label" translatable="yes">&lt;b&gt;Options&lt;/b&gt;</property>
<property name="max_saved">10</property>
<property name="browse_dialog_title" translatable="yes">Export GEDCOM</property>
<property name="directory_entry">False</property>
<property name="modal">True</property>
<child internal-child="entry">
<widget class="GtkEntry" id="filename">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char" translatable="yes">*</property>
<property name="activates_default">False</property>
</widget>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">3</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Filename&lt;/b&gt;</property>
<property name="use_underline">False</property> <property name="use_underline">False</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_LEFT</property> <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -166,51 +142,6 @@
</packing> </packing>
</child> </child>
<child>
<widget class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Options&lt;/b&gt;</property>
<property name="use_underline">False</property>
<property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">3</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="restrict">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Restrict data on living people</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">3</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child> <child>
<widget class="GtkLabel" id="label1"> <widget class="GtkLabel" id="label1">
<property name="visible">True</property> <property name="visible">True</property>
@@ -225,16 +156,13 @@
<property name="xpad">0</property> <property name="xpad">0</property>
<property name="ypad">0</property> <property name="ypad">0</property>
<property name="mnemonic_widget">filter</property> <property name="mnemonic_widget">filter</property>
<accessibility>
<atkrelation target="filter" type="label-for"/>
</accessibility>
</widget> </widget>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
<property name="right_attach">2</property> <property name="right_attach">2</property>
<property name="top_attach">3</property> <property name="top_attach">1</property>
<property name="bottom_attach">4</property> <property name="bottom_attach">2</property>
<property name="x_options">fill</property> <property name="x_options">shrink|fill</property>
<property name="y_options"></property> <property name="y_options"></property>
</packing> </packing>
</child> </child>
@@ -254,8 +182,30 @@
<packing> <packing>
<property name="left_attach">2</property> <property name="left_attach">2</property>
<property name="right_attach">3</property> <property name="right_attach">3</property>
<property name="top_attach">3</property> <property name="top_attach">1</property>
<property name="bottom_attach">4</property> <property name="bottom_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="restrict">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Restrict data on living people</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">3</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">fill</property>
<property name="y_options"></property> <property name="y_options"></property>
</packing> </packing>
</child> </child>