diff --git a/gramps/src/EditPerson.glade b/gramps/src/EditPerson.glade
index fa5304a3a..f93cd1a8d 100644
--- a/gramps/src/EditPerson.glade
+++ b/gramps/src/EditPerson.glade
@@ -740,6 +740,21 @@
False
+
+
+ GtkRadioButton
+ genderUnknown
+ True
+
+ False
+ True
+ gender
+
+ 0
+ False
+ False
+
+
@@ -4116,7 +4131,7 @@
GtkTable
table23
- 6
+ 5
2
False
0
@@ -4179,32 +4194,6 @@
-
- GtkLabel
- label182
-
- GTK_JUSTIFY_CENTER
- False
- 1
- 0.5
- 5
- 8
-
- 0
- 1
- 3
- 4
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
-
GtkScrolledWindow
scrolledwindow23
@@ -4217,8 +4206,8 @@
1
2
- 5
- 6
+ 4
+ 5
3
3
False
@@ -4251,8 +4240,8 @@
0
1
- 5
- 6
+ 4
+ 5
0
0
False
@@ -4285,13 +4274,12 @@
- GtkEntry
- alt_source
+ GtkCheckButton
+ priv
True
- False
- True
- 0
-
+
+ False
+ True
3
True
@@ -4431,29 +4419,6 @@
False
-
-
- GtkCheckButton
- priv
- True
-
- False
- True
-
- 1
- 2
- 4
- 5
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
@@ -4572,7 +4537,7 @@
GtkTable
table26
- 9
+ 8
2
False
0
@@ -4635,32 +4600,6 @@
-
- GtkLabel
- label211
-
- GTK_JUSTIFY_CENTER
- False
- 1
- 0.5
- 5
- 8
-
- 0
- 1
- 6
- 7
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
-
GtkEntry
street
@@ -4697,8 +4636,8 @@
1
2
- 8
- 9
+ 7
+ 8
3
3
False
@@ -4731,8 +4670,8 @@
0
1
- 8
- 9
+ 7
+ 8
0
0
False
@@ -4765,13 +4704,12 @@
- GtkEntry
- addr_source
+ GtkCheckButton
+ priv
True
- False
- True
- 0
-
+
+ False
+ True
3
True
@@ -5025,29 +4963,6 @@
False
-
-
- GtkCheckButton
- priv
- True
-
- False
- True
-
- 1
- 2
- 7
- 8
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
diff --git a/gramps/src/EditPerson.py b/gramps/src/EditPerson.py
index d7a2fc1eb..44a632fce 100644
--- a/gramps/src/EditPerson.py
+++ b/gramps/src/EditPerson.py
@@ -143,6 +143,8 @@ class EditPerson:
self.dplace = self.get_widget("deathPlace")
self.is_male = self.get_widget("genderMale")
self.is_female = self.get_widget("genderFemale")
+ self.is_unknown = self.get_widget("genderUnknown")
+ self.addr_note = self.get_widget("addr_note")
self.addr_note = self.get_widget("addr_note")
self.addr_source = self.get_widget("addr_source")
self.attr_note = self.get_widget("attr_note")
@@ -246,8 +248,10 @@ class EditPerson:
if person.getGender() == Person.male:
self.is_male.set_active(1)
- else:
+ elif person.getGender() == Person.male:
self.is_female.set_active(1)
+ else:
+ self.is_unknown.set_active(1)
self.nick.set_text(person.getNickName())
self.title.set_text(self.pname.getTitle())
@@ -399,7 +403,6 @@ class EditPerson:
self.person.setAddressList(self.plist)
utils.modified()
-
#-------------------------------------------------------------------------
#
# PersonImageSelect class
@@ -491,7 +494,9 @@ def did_data_change(obj):
bplace = string.strip(epo.bplace.get_text())
ddate = epo.ddate.get_text()
dplace = epo.dplace.get_text()
- gender = epo.is_male.get_active()
+ male = epo.is_male.get_active()
+ female = epo.is_female.get_active()
+ unknown = epo.is_unknown.get_active()
text = epo.notes_field.get_chars(0,-1)
idval = epo.gid.get_text()
@@ -508,8 +513,6 @@ def did_data_change(obj):
changed = 1
if epo.pname.getNote() != name.getNote():
changed = 1
- if not epo.pname.getSourceRef().are_equal(name.getSourceRef()):
- changed = 1
if not epo.birth.are_equal(epo.person.getBirth()):
changed = 1
@@ -517,9 +520,11 @@ def did_data_change(obj):
if not epo.death.are_equal(epo.person.getDeath()):
changed = 1
- if gender and person.getGender() == Person.female:
+ if male and person.getGender() != Person.male:
changed = 1
- if not gender and person.getGender() == Person.male:
+ elif female and person.getGender() != Person.female:
+ changed = 1
+ elif unknown and person.getGender() != Person.unknown:
changed = 1
if text != person.getNote() or epo.lists_changed:
changed = 1
@@ -1162,9 +1167,11 @@ def save_person(obj):
if not person.getDeath().are_equal(epo.death):
person.setDeath(epo.death)
- gender = epo.is_male.get_active()
+ male = epo.is_male.get_active()
+ female = epo.is_female.get_active()
+ unknown = epo.is_unknown.get_active()
error = 0
- if gender and person.getGender() == Person.female:
+ if male and person.getGender() != Person.male:
person.setGender(Person.male)
for temp_family in person.getFamilyList():
if person == temp_family.getMother():
@@ -1174,7 +1181,7 @@ def save_person(obj):
temp_family.setMother(None)
temp_family.setFather(person)
utils.modified()
- elif not gender and person.getGender() == Person.male:
+ elif female and person.getGender() != Person.female:
person.setGender(Person.female)
for temp_family in person.getFamilyList():
if person == temp_family.getFather():
@@ -1184,6 +1191,23 @@ def save_person(obj):
temp_family.setFather(None)
temp_family.setMother(person)
utils.modified()
+ elif unknown and person.getGender() != Person.unknown:
+ person.setGender(Person.unknown)
+ for temp_family in person.getFamilyList():
+ if person == temp_family.getFather():
+ if temp_family.getMother() != None:
+ error = 1
+ else:
+ temp_family.setFather(None)
+ temp_family.setMother(person)
+ if person == temp_family.getMother():
+ if temp_family.getFather() != None:
+ error = 1
+ else:
+ temp_family.setMother(None)
+ temp_family.setFather(person)
+ utils.modified()
+
if error == 1:
msg = _("Changing the gender caused problems with marriage information.")
@@ -1270,7 +1294,7 @@ def on_death_note_clicked(obj):
#-------------------------------------------------------------------------
def on_death_source_clicked(obj):
epo = obj.get_data(EDITPERSON)
- Sources.SourceEditor(epo.death.getSourceRef(),epo.db)
+ Sources.SourceSelector(epo.death.getSourceRefList(),epo,src_changed)
#-------------------------------------------------------------------------
#
@@ -1279,7 +1303,7 @@ def on_death_source_clicked(obj):
#-------------------------------------------------------------------------
def on_primary_name_source_clicked(obj):
epo = obj.get_data(EDITPERSON)
- Sources.SourceEditor(epo.pname.getSourceRef(),epo.db)
+ Sources.SourceSelector(epo.pname.getSourceRefList(),epo,src_changed)
#-------------------------------------------------------------------------
#
@@ -1288,7 +1312,7 @@ def on_primary_name_source_clicked(obj):
#-------------------------------------------------------------------------
def on_birth_source_clicked(obj):
epo = obj.get_data(EDITPERSON)
- Sources.SourceEditor(epo.birth.getSourceRef(),epo.db)
+ Sources.SourceSelector(epo.birth.getSourceRefList(),epo,src_changed)
#-------------------------------------------------------------------------
#
@@ -1409,10 +1433,10 @@ class EventEditor:
def __init__(self,parent,event):
self.parent = parent
self.event = event
- if self.event:
- self.srcref = SourceRef(self.event.getSourceRef())
+ if event:
+ self.srcreflist = self.event.getSourceRefList()
else:
- self.srcref = SourceRef()
+ self.srcreflist = []
self.top = libglade.GladeXML(const.dialogFile, "event_edit")
self.window = self.top.get_widget("event_edit")
self.name_field = self.top.get_widget("eventName")
@@ -1423,7 +1447,6 @@ class EventEditor:
self.descr_field = self.top.get_widget("eventDescription")
self.note_field = self.top.get_widget("eventNote")
self.event_menu = self.top.get_widget("personalEvents")
- self.source_field = self.top.get_widget("event_source")
self.priv = self.top.get_widget("priv")
name = parent.person.getPrimaryName().getName()
@@ -1449,12 +1472,6 @@ class EventEditor:
self.descr_field.set_text(event.getDescription())
self.priv.set_active(event.getPrivacy())
- srcref_base = self.event.getSourceRef().getBase()
- if srcref_base:
- self.source_field.set_text(srcref_base.getTitle())
- else:
- self.source_field.set_text("")
-
self.note_field.set_point(0)
self.note_field.insert_defaults(event.getNote())
self.note_field.set_word_wrap(1)
@@ -1475,7 +1492,7 @@ class EventEditor:
#-------------------------------------------------------------------------
def on_edit_source_clicked(obj):
ee = obj.get_data(OBJECT)
- Sources.SourceEditor(ee.srcref,ee.parent.db,ee.source_field)
+ Sources.SourceSelector(ee.srcreflist,ee.parent,src_changed)
#-------------------------------------------------------------------------
#
@@ -1497,6 +1514,7 @@ def on_event_edit_ok_clicked(obj):
if event == None:
event = Event()
+ event.setSourceRefList(ee.srcreflist)
ee.parent.elist.append(event)
if eplace_obj == None and eplace != "":
@@ -1507,10 +1525,6 @@ def on_event_edit_ok_clicked(obj):
if update_event(event,ename,edate,eplace_obj,edesc,enote,epriv,ecause):
ee.parent.lists_changed = 1
- if not event.getSourceRef().are_equal(ee.srcref):
- event.setSourceRef(ee.srcref)
- ee.parent.lists_changed = 1
-
ee.parent.redraw_event_list()
ee.parent.update_birth_death()
utils.destroy_passed_object(obj)
@@ -1531,12 +1545,11 @@ class AttributeEditor:
self.value_field = self.top.get_widget("attr_value")
self.note_field = self.top.get_widget("attr_note")
self.attrib_menu = self.top.get_widget("attr_menu")
- self.source_field = self.top.get_widget("attr_source")
self.priv = self.top.get_widget("priv")
if self.attrib:
- self.srcref = SourceRef(self.attrib.getSourceRef())
+ self.srcreflist = self.attrib.getSourceRefList()
else:
- self.srcref = SourceRef()
+ self.srcreflist = []
# Typing CR selects OK button
self.window.editable_enters(self.type_field);
@@ -1550,11 +1563,6 @@ class AttributeEditor:
if attrib != None:
self.type_field.set_text(attrib.getType())
self.value_field.set_text(attrib.getValue())
- srcref_base = self.attrib.getSourceRef().getBase()
- if srcref_base:
- self.source_field.set_text(srcref_base.getTitle())
- else:
- self.source_field.set_text("")
self.priv.set_active(attrib.getPrivacy())
self.note_field.set_point(0)
@@ -1575,7 +1583,7 @@ class AttributeEditor:
#-------------------------------------------------------------------------
def on_attrib_source_clicked(obj):
ee = obj.get_data(OBJECT)
- Sources.SourceEditor(ee.srcref,ee.parent.db,ee.source_field)
+ Sources.SourceSelector(ee.srcreflist,ee.parent,src_changed)
#-------------------------------------------------------------------------
#
@@ -1593,15 +1601,12 @@ def on_attrib_edit_ok_clicked(obj):
if attrib == None:
attrib = Attribute()
+ attrib.setSourceRefList(ee.srcreflist)
ee.parent.alist.append(attrib)
if update_attrib(attrib,type,value,note,priv):
ee.parent.lists_changed = 1
- if not attrib.getSourceRef().are_equal(ee.srcref):
- attrib.setSourceRef(ee.srcref)
- ee.parent.lists_changed = 1
-
ee.parent.redraw_attr_list()
utils.destroy_passed_object(obj)
@@ -1621,13 +1626,13 @@ class NameEditor:
self.surname_field = self.top.get_widget("alt_last")
self.suffix_field = self.top.get_widget("alt_suffix")
self.note_field = self.top.get_widget("alt_note")
- self.source_field = self.top.get_widget("alt_source")
self.top.get_widget("alt_surname_list").set_popdown_strings(const.surnames)
self.priv = self.top.get_widget("priv")
+
if self.name:
- self.srcref = SourceRef(self.name.getSourceRef())
+ self.srcreflist = self.name.getSourceRefList()
else:
- self.srcref = SourceRef()
+ self.srcreflist = []
full_name = parent.person.getPrimaryName().getName()
@@ -1643,11 +1648,6 @@ class NameEditor:
self.given_field.set_text(name.getFirstName())
self.surname_field.set_text(name.getSurname())
self.suffix_field.set_text(name.getSuffix())
- srcref_base = self.name.getSourceRef().getBase()
- if srcref_base:
- self.source_field.set_text(srcref_base.getTitle())
- else:
- self.source_field.set_text("")
self.priv.set_active(name.getPrivacy())
self.note_field.set_point(0)
self.note_field.insert_defaults(name.getNote())
@@ -1667,7 +1667,7 @@ class NameEditor:
#-------------------------------------------------------------------------
def on_name_source_clicked(obj):
ee = obj.get_data(OBJECT)
- Sources.SourceEditor(ee.srcref,ee.parent.db,ee.source_field)
+ Sources.SourceSelector(ee.srcreflist,ee.parent,src_changed)
#-------------------------------------------------------------------------
#
@@ -1686,15 +1686,12 @@ def on_name_edit_ok_clicked(obj):
if name == None:
name = Name()
+ name.setSourceRefList(ee.srcreflist)
ee.parent.nlist.append(name)
if update_name(name,first,last,suffix,note,priv):
ee.parent.lists_changed = 1
- if not name.getSourceRef().are_equal(ee.srcref):
- name.setSourceRef(ee.srcref)
- ee.parent.lists_changed = 1
-
ee.parent.redraw_name_list()
utils.destroy_passed_object(obj)
@@ -1717,12 +1714,12 @@ class AddressEditor:
self.country = self.top.get_widget("country")
self.postal = self.top.get_widget("postal")
self.note_field = self.top.get_widget("addr_note")
- self.source_field = self.top.get_widget("addr_source")
self.priv = self.top.get_widget("priv")
+
if self.addr:
- self.srcref = SourceRef(self.addr.getSourceRef())
+ self.srcreflist = self.addr.getSourceRefList()
else:
- self.srcref = SourceRef()
+ self.srcreflist = []
name = parent.person.getPrimaryName().getName()
text = _("Address Editor for %s") % name
@@ -1735,7 +1732,6 @@ class AddressEditor:
self.window.editable_enters(self.state);
self.window.editable_enters(self.country);
self.window.editable_enters(self.postal);
- self.window.editable_enters(self.source_field);
self.window.editable_enters(self.note_field);
if addr != None:
@@ -1744,11 +1740,6 @@ class AddressEditor:
self.state.set_text(addr.getState())
self.country.set_text(addr.getCountry())
self.postal.set_text(addr.getPostal())
- srcref_base = self.addr.getSourceRef().getBase()
- if srcref_base:
- self.source_field.set_text(srcref_base.getTitle())
- else:
- self.source_field.set_text("")
self.priv.set_active(addr.getPrivacy())
self.note_field.set_point(0)
@@ -1769,8 +1760,11 @@ class AddressEditor:
#-------------------------------------------------------------------------
def on_addr_source_clicked(obj):
ee = obj.get_data(OBJECT)
- Sources.SourceEditor(ee.srcref,ee.parent.db,ee.source_field)
-
+ Sources.SourceSelector(ee.srcreflist,ee.parent,src_changed)
+
+def src_changed(parent):
+ parent.list_changed = 1
+
#-------------------------------------------------------------------------
#
#
@@ -1791,15 +1785,12 @@ def on_addr_edit_ok_clicked(obj):
if addr == None:
addr = Address()
+ addr.setSourceRefList(ee.srcreflist)
ee.parent.plist.append(addr)
if update_address(addr,date,street,city,state,country,postal,note,priv):
ee.parent.lists_changed = 1
- if not addr.getSourceRef().are_equal(ee.srcref):
- addr.setSourceRef(ee.srcref)
- ee.parent.lists_changed = 1
-
ee.parent.redraw_addr_list()
utils.destroy_passed_object(obj)
diff --git a/gramps/src/EditPlace.py b/gramps/src/EditPlace.py
index 3dfa43ef9..954c6cc70 100644
--- a/gramps/src/EditPlace.py
+++ b/gramps/src/EditPlace.py
@@ -69,8 +69,12 @@ class EditPlace:
self.callback = func
self.path = db.getSavePath()
self.not_loaded = 1
- self.sref = SourceRef(place.getSourceRef())
-
+ self.list_changed = 0
+ if place:
+ self.srcreflist = place.getSourceRefList()
+ else:
+ self.srcreflist = []
+
self.selectedIcon = -1
self.currentImages = []
self.top_window = libglade.GladeXML(const.placesFile,"placeEditor")
@@ -87,7 +91,6 @@ class EditPlace:
self.web_url = self.top_window.get_widget("web_url")
self.web_go = self.top_window.get_widget("web_go")
self.web_description = self.top_window.get_widget("url_des")
- self.source_field = self.top_window.get_widget("source_field")
self.loc_list = self.top_window.get_widget("loc_list")
self.loc_city = self.top_window.get_widget("loc_city")
@@ -107,10 +110,6 @@ class EditPlace:
self.country.set_text(mloc.get_country())
self.longitude.set_text(place.get_longitude())
self.latitude.set_text(place.get_latitude())
- if self.sref.getBase():
- self.source_field.set_text(self.sref.getBase().getTitle())
- else:
- self.source_field.set_text("")
self.note.set_point(0)
self.note.insert_defaults(place.getNote())
@@ -281,8 +280,8 @@ def on_place_apply_clicked(obj):
mloc.set_city(city)
utils.modified()
- if not edit.place.getSourceRef().are_equal(edit.sref):
- edit.place.setSourceRef(edit.sref)
+ if edit.list_changed:
+ edit.place.setSourceRefList(edit.srcreflist)
utils.modified()
if state != mloc.get_state():
@@ -535,7 +534,10 @@ def on_add_loc_clicked(obj):
#-------------------------------------------------------------------------
def on_source_clicked(obj):
epo = obj.get_data(_PLACE)
- Sources.SourceEditor(epo.sref,epo.db,epo.source_field)
+ Sources.SourceSelector(epo.srcreflist,epo,src_changed)
+
+def src_changed(parent):
+ parent.list_changed = 1
#-------------------------------------------------------------------------
#
diff --git a/gramps/src/GrampsParser.py b/gramps/src/GrampsParser.py
index 34887f44a..dfc404383 100644
--- a/gramps/src/GrampsParser.py
+++ b/gramps/src/GrampsParser.py
@@ -414,15 +414,15 @@ class GrampsParser(handler.ContentHandler):
self.source_ref.confidence = self.conf
self.source_ref.setBase(source)
if self.event:
- self.event.setSourceRef(self.source_ref)
+ self.event.addSourceRef(self.source_ref)
elif self.address:
- self.address.setSourceRef(self.source_ref)
+ self.address.addSourceRef(self.source_ref)
elif self.name:
- self.name.setSourceRef(self.source_ref)
+ self.name.addSourceRef(self.source_ref)
elif self.attribute:
- self.attribute.setSourceRef(self.source_ref)
+ self.attribute.addSourceRef(self.source_ref)
elif self.placeobj:
- self.placeobj.setSourceRef(self.source_ref)
+ self.placeobj.addSourceRef(self.source_ref)
else:
print "Sorry, I'm lost"
@@ -638,7 +638,13 @@ class GrampsParser(handler.ContentHandler):
#
#---------------------------------------------------------------------
def stop_gender(self,tag):
- self.person.gender = (u2l(tag) == "M")
+ t = u2l(tag)
+ if t == "M":
+ self.person.gender = Person.male
+ elif t == "F":
+ self.person.gender = Person.female
+ else:
+ self.person.gender = Person.unknown
#---------------------------------------------------------------------
#
@@ -1107,15 +1113,15 @@ class GrampsImportParser(GrampsParser):
self.source = self.db.findSource(u2l(attrs["ref"]),self.smap)
self.source_ref.setBase(self.source)
if self.address:
- self.address.setSourceRef(self.source_ref)
+ self.address.addSourceRef(self.source_ref)
elif self.name:
- self.name.setSourceRef(self.source_ref)
+ self.name.addSourceRef(self.source_ref)
elif self.event:
- self.event.setSourceRef(self.source_ref)
+ self.event.addSourceRef(self.source_ref)
elif self.attribute:
- self.attribute.setSourceRef(self.source_ref)
+ self.attribute.addSourceRef(self.source_ref)
elif self.placeobj:
- self.placeobj.setSourceRef(self.source_ref)
+ self.placeobj.addSourceRef(self.source_ref)
else:
print "Sorry, I'm lost"
diff --git a/gramps/src/Marriage.py b/gramps/src/Marriage.py
index e9e2e1c9f..e42f53df7 100644
--- a/gramps/src/Marriage.py
+++ b/gramps/src/Marriage.py
@@ -682,10 +682,7 @@ class EventEditor:
def __init__(self,parent,event):
self.parent = parent
self.event = event
- if self.event:
- self.srcref = SourceRef(self.event.getSourceRef())
- else:
- self.srcref = SourceRef()
+ self.srcreflist = self.event.getSourceRefList()
self.top = libglade.GladeXML(const.dialogFile, "event_edit")
self.window = self.top.get_widget("event_edit")
self.name_field = self.top.get_widget("eventName")
@@ -697,7 +694,6 @@ class EventEditor:
self.descr_field = self.top.get_widget("eventDescription")
self.note_field = self.top.get_widget("eventNote")
self.event_menu = self.top.get_widget("personalEvents")
- self.source_field = self.top.get_widget("event_source")
self.priv = self.top.get_widget("priv")
father = parent.family.getFather()
@@ -731,12 +727,6 @@ class EventEditor:
self.descr_field.set_text(event.getDescription())
self.priv.set_active(event.getPrivacy())
- srcref_base = self.event.getSourceRef().getBase()
- if srcref_base:
- self.source_field.set_text(srcref_base.getTitle())
- else:
- self.source_field.set_text("")
-
self.note_field.set_point(0)
self.note_field.insert_defaults(event.getNote())
self.note_field.set_word_wrap(1)
@@ -757,7 +747,10 @@ class EventEditor:
#-------------------------------------------------------------------------
def on_edit_source_clicked(obj):
ee = obj.get_data("o")
- Sources.SourceEditor(ee.srcref,ee.parent.db,ee.source_field)
+ Sources.SourceSelector(ee.srcreflist,ee.parent,src_changed)
+
+def src_changed(parent):
+ parent.list_changed = 1
#-------------------------------------------------------------------------
#
@@ -779,6 +772,7 @@ def on_event_edit_ok_clicked(obj):
if event == None:
event = Event()
+ event.setSourceRefList(ee.srcreflist)
ee.parent.elist.append(event)
if eplace_obj == None and eplace != "":
@@ -789,10 +783,6 @@ def on_event_edit_ok_clicked(obj):
if update_event(event,ename,edate,eplace_obj,edesc,enote,epriv,ecause):
ee.parent.lists_changed = 1
- if not source_refs_equal(event.getSourceRef(),ee.srcref):
- event.setSourceRef(ee.srcref)
- ee.parent.lists_changed = 1
-
ee.parent.redraw_events()
utils.destroy_passed_object(obj)
@@ -814,11 +804,12 @@ class AttributeEditor:
self.attrib_menu = self.top.get_widget("attr_menu")
self.source_field = self.top.get_widget("attr_source")
self.priv = self.top.get_widget("priv")
- if self.attrib:
- self.srcref = SourceRef(self.attrib.getSourceRef())
- else:
- self.srcref = SourceRef()
+ if attrib:
+ self.srcreflist = self.attrib.getSourceRefList()
+ else:
+ self.srcreflist = []
+
# Typing CR selects OK button
self.window.editable_enters(self.type_field);
self.window.editable_enters(self.value_field);
@@ -841,12 +832,6 @@ class AttributeEditor:
if attrib != None:
self.type_field.set_text(attrib.getType())
self.value_field.set_text(attrib.getValue())
- srcref_base = self.attrib.getSourceRef().getBase()
- if srcref_base:
- self.source_field.set_text(srcref_base.getTitle())
- else:
- self.source_field.set_text("")
-
self.priv.set_active(attrib.getPrivacy())
self.note_field.set_point(0)
@@ -867,7 +852,7 @@ class AttributeEditor:
#-------------------------------------------------------------------------
def on_attrib_source_clicked(obj):
ee = obj.get_data("o")
- Sources.SourceEditor(ee.srcref,ee.parent.db,ee.source_field)
+ Sources.SourceSelector(ee.srcreflist,ee.parent,src_changed)
#-------------------------------------------------------------------------
#
@@ -885,38 +870,15 @@ def on_attrib_edit_ok_clicked(obj):
if attrib == None:
attrib = Attribute()
+ attrib.setSourceRefList(ee.srcreflist)
ee.parent.alist.append(attrib)
if update_attrib(attrib,type,value,note,priv):
ee.parent.lists_changed = 1
- if not source_refs_equal(attrib.getSourceRef(),ee.srcref):
- attrib.setSourceRef(ee.srcref)
- ee.parent.lists_changed = 1
-
ee.parent.redraw_attr_list()
utils.destroy_passed_object(obj)
-#-------------------------------------------------------------------------
-#
-#
-#
-#-------------------------------------------------------------------------
-def source_refs_equal(one,two):
- if not one or not two:
- return 0
- if one.ref != two.ref:
- return 0
- if one.page != two.page:
- return 0
- if one.date != two.date:
- return 0
- if one.comments != two.comments:
- return 0
- if one.text != two.text:
- return 0
- return 1
-
#-------------------------------------------------------------------------
#
#
diff --git a/gramps/src/RelLib.py b/gramps/src/RelLib.py
index 67c70a0d7..fdc985953 100644
--- a/gramps/src/RelLib.py
+++ b/gramps/src/RelLib.py
@@ -37,28 +37,30 @@ class SourceNote:
def __init__(self,source=None):
"""Create a new SourceNote, copying from source if not None"""
+ self.source_list = []
+
if source:
- if source.source_ref:
- self.source_ref = SourceRef(source.source_ref)
- else:
- self.source_ref = None
+ if len(source.source_list) > 0:
+ for sref in source.source_list:
+ self.source_list.append(SourceRef(sref))
if source.note:
self.note = Note(source.note.get())
else:
self.note = None
else:
- self.source_ref = None
self.note = None
- def setSourceRef(self,id) :
+ def addSourceRef(self,id) :
"""Set the source reference"""
- self.source_ref = id
+ self.source_list.append(id)
- def getSourceRef(self) :
+ def getSourceRefList(self) :
"""Return the source reference"""
- if not self.source_ref:
- self.source_ref = SourceRef()
- return self.source_ref
+ return self.source_list
+
+ def setSourceRefList(self,list) :
+ """Replaces the source reference"""
+ self.source_list = list
def setNote(self,text):
"""Set the note to the given text"""
@@ -583,8 +585,15 @@ class Name(DataObj):
return 0
if self.getNote() != other.getNote():
return 0
- if not self.getSourceRef().are_equal(other.getSourceRef()):
+ if len(self.getSourceRefList()) != len(other.getSourceRefList()):
return 0
+ index = 0
+ olist = other.getSourceRefList()
+ for a in self.getSourceRefList():
+ if not a.are_equal(olist[index]):
+ return 0
+ index = index + 1
+
return 1
class Url:
@@ -629,6 +638,7 @@ class Url:
class Person:
"""Represents an individual person in the gramps database"""
+ unknown = 2
male = 1
female = 0
@@ -644,7 +654,7 @@ class Person:
self.photoList = []
self.nickname = ""
self.alternateNames = []
- self.gender = 0
+ self.gender = 2
self.death = None
self.birth = None
self.addressList = []
@@ -930,8 +940,16 @@ class Event(DataObj):
return 0
if self.private != other.private:
return 0
- if not self.getSourceRef().are_equal(other.getSourceRef()):
+
+ if len(self.getSourceRefList()) != len(other.getSourceRefList()):
return 0
+ index = 0
+ olist = other.getSourceRefList()
+ for a in self.getSourceRefList():
+ if not a.are_equal(olist[index]):
+ return 0
+ index = index + 1
+
return 1
def setName(self,name):
diff --git a/gramps/src/Sources.py b/gramps/src/Sources.py
index 0324d68c6..c050fbe33 100644
--- a/gramps/src/Sources.py
+++ b/gramps/src/Sources.py
@@ -48,6 +48,78 @@ ACTIVESRC = "a"
INDEX = "i"
MENUVAL = "a"
+class SourceSelector:
+
+ def __init__(self,srclist,parent,update=None):
+ self.db = parent.db
+ self.parent = parent
+ self.orig = srclist
+ self.list = []
+ for s in self.orig:
+ self.list.append(SourceRef(s))
+ self.update=update
+ self.top = libglade.GladeXML(const.gladeFile,"sourcesel")
+ self.top.signal_autoconnect({
+ "destroy_passed_object" : utils.destroy_passed_object,
+ "on_add_src_clicked" : on_add_src_clicked,
+ "on_del_src_clicked" : on_del_src_clicked,
+ "on_edit_src_clicked" : on_edit_src_clicked,
+ "on_src_ok_clicked" : on_src_ok_clicked,
+ })
+ self.sourcesel = self.top.get_widget("sourcesel")
+ self.slist = self.top.get_widget("slist")
+ self.slist.set_data("o",self)
+ self.redraw()
+ self.sourcesel.show()
+
+ def redraw(self):
+ index = 0
+ self.slist.freeze()
+ self.slist.clear()
+ for s in self.list:
+ base = s.getBase()
+ self.slist.append([base.getId(),base.getTitle()])
+ self.slist.set_row_data(index,s)
+ index = index + 1
+ self.slist.thaw()
+
+def on_src_ok_clicked(obj):
+ top = obj.get_data("o")
+ del top.orig[:]
+ for s in top.list:
+ top.orig.append(s)
+ top.update(top.parent)
+ utils.destroy_passed_object(top.sourcesel)
+
+def on_edit_src_clicked(obj):
+ sel = obj.selection
+ if len(sel) > 0:
+ row = sel[0]
+ src = obj.get_row_data(row)
+ inst = obj.get_data("o")
+ SourceEditor(src,inst.db,update_clist,inst)
+
+def update_clist(inst,ref):
+ inst.redraw()
+
+def on_add_src_clicked(obj):
+ inst = obj.get_data("o")
+ src = SourceRef()
+ SourceEditor(src,inst.db,add_ref,inst)
+
+def add_ref(inst,ref):
+ inst.list.append(ref)
+ inst.redraw()
+
+def on_del_src_clicked(obj):
+ inst = obj.get_data("o")
+
+ sel = obj.selection
+ if len(sel) > 0:
+ row = sel[0]
+ del inst.list[row]
+ inst.redraw()
+
#-------------------------------------------------------------------------
#
# SourceEditor
@@ -60,9 +132,10 @@ class SourceEditor:
# __init__ - Creates a source editor window associated with an event
#
#---------------------------------------------------------------------
- def __init__(self,srcref,database,update=None):
+ def __init__(self,srcref,database,update=None,parent=None):
self.db = database
+ self.parent = parent
self.update = update
self.source_ref = srcref
self.showSource = libglade.GladeXML(const.gladeFile, "sourceDisplay")
@@ -134,23 +207,11 @@ class SourceEditor:
self.author_field.set_text("")
self.pub_field.set_text("")
- if self.active_source:
- active = 1
- else:
- active = 0
-
values = self.db.getSourceMap().values()
values.sort(by_title)
- l = GtkLabel("-- No Source --")
- l.show()
- l.set_alignment(0,0.5)
- c = GtkListItem()
- c.add(l)
- c.set_data("s",None)
- c.show()
- sel_child = c
- list = [c]
+ sel_child = None
+ list = []
for src in values:
l = GtkLabel("%s [%s]" % (src.getTitle(),src.getId()))
l.show()
@@ -160,15 +221,13 @@ class SourceEditor:
c.set_data("s",src)
c.show()
list.append(c)
- if src == self.active_source:
+ if self.active_source == None:
+ self.active_source = src
sel_child = c
self.title_menu.list.append_items(list)
- self.title_menu.list.select_child(sel_child)
- self.get_widget("spage").set_sensitive(active)
- self.get_widget("sdate").set_sensitive(active)
- self.get_widget("stext").set_sensitive(active)
- self.get_widget("scomment").set_sensitive(active)
+ if sel_child != None:
+ self.title_menu.list.select_child(sel_child)
#-------------------------------------------------------------------------
#
@@ -203,11 +262,7 @@ def on_sourceok_clicked(obj):
src_edit.source_ref.setConfidence(conf)
if src_edit.update:
- if src_edit.source_ref.getBase():
- val = src_edit.source_ref.getBase().getTitle()
- else:
- val = ""
- src_edit.update.set_text(val)
+ src_edit.update(src_edit.parent,src_edit.source_ref)
utils.modified()
utils.destroy_passed_object(obj)
@@ -223,16 +278,5 @@ def on_source_changed(obj):
src_entry.active_source = obj.list.get_selection()[0].get_data("s")
if src_entry.active_source == None:
- active = 0
- src_entry.author_field.set_text("")
- src_entry.pub_field.set_text("")
- else:
- active = 1
src_entry.author_field.set_text(src_entry.active_source.getAuthor())
src_entry.pub_field.set_text(src_entry.active_source.getPubInfo())
-
- src_entry.get_widget("spage").set_sensitive(active)
- src_entry.get_widget("sdate").set_sensitive(active)
- src_entry.get_widget("stext").set_sensitive(active)
- src_entry.get_widget("scomment").set_sensitive(active)
- src_entry.get_widget("conf").set_sensitive(active)
diff --git a/gramps/src/TarFile.py b/gramps/src/TarFile.py
index c72b75f8f..3f3c530e8 100644
--- a/gramps/src/TarFile.py
+++ b/gramps/src/TarFile.py
@@ -22,11 +22,6 @@ import gzip
_BLKSIZE=512
nul = '\0'
-#------------------------------------------------------------------------
-#
-#
-#
-#------------------------------------------------------------------------
class TarFile:
def __init__(self,name):
self.name = name
@@ -78,3 +73,46 @@ class TarFile:
self.f.write('\0' * rem)
self.f.close()
+
+class ReadTarFile:
+ def __init__(self,name,wd):
+ self.name = name
+ self.wd = wd
+ self.f = gzip.open(name,"rb")
+ self.pos = 0
+
+ def extract(self):
+ while 1:
+ buf = self.f.read(100)
+ if buf == '':
+ return
+ index = 0
+ for b in buf:
+ if b != '\0':
+ index = index + 1
+ else:
+ if index == 0:
+ return
+ continue
+ filename = buf[0:index]
+ self.f.read(24) # modes
+ l = self.f.read(12)
+ length = int(l,8)
+ self.f.read(12)
+ self.f.read(6)
+ self.f.read(111)
+
+ self.f.read(64)
+ self.f.read(183)
+ foo = open(filename,"wb")
+ foo.write(self.f.read(length))
+ foo.close()
+ self.f.read(_BLKSIZE-(length%_BLKSIZE))
+
+ def close(self):
+ self.f.close()
+
+if __name__ == "__main__":
+ a = ReadTarFile("out.gpkg",".")
+ a.extract()
+ a.close()
\ No newline at end of file
diff --git a/gramps/src/WriteXML.py b/gramps/src/WriteXML.py
index 21a5aa92d..3055a3713 100644
--- a/gramps/src/WriteXML.py
+++ b/gramps/src/WriteXML.py
@@ -120,7 +120,8 @@ def dump_my_event(g,name,event,index=1):
if event.getNote() != "":
writeNote(g,"note",event.getNote(),index+1)
- dump_source_ref(g,event.getSourceRef(),index+1)
+ for s in event.getSourceRefList():
+ dump_source_ref(g,s,index+1)
g.write("%s\n" % sp)
#-------------------------------------------------------------------------
@@ -129,27 +130,26 @@ def dump_my_event(g,name,event,index=1):
#
#-------------------------------------------------------------------------
def dump_source_ref(g,source_ref,index=1):
- if source_ref:
- source = source_ref.getBase()
- if source:
- p = source_ref.getPage()
- c = source_ref.getComments()
- t = source_ref.getText()
- d = source_ref.getDate().getSaveDate()
- q = source_ref.getConfidence()
- g.write(" " * index)
- if p == "" and c == "" and t == "" and d == "" and q == 2:
- g.write('\n' % source.getId())
+ source = source_ref.getBase()
+ if source:
+ p = source_ref.getPage()
+ c = source_ref.getComments()
+ t = source_ref.getText()
+ d = source_ref.getDate().getSaveDate()
+ q = source_ref.getConfidence()
+ g.write(" " * index)
+ if p == "" and c == "" and t == "" and d == "" and q == 2:
+ g.write('\n' % source.getId())
+ else:
+ if q == 2:
+ g.write('\n' % source.getId())
else:
- if q == 2:
- g.write('\n' % source.getId())
- else:
- g.write('\n' % (source.getId(),q))
- write_line(g,"spage",p,index+1)
- writeNote(g,"scomments",c,index+1)
- writeNote(g,"stext",t,index+1)
- write_line(g,"sdate",d,index+1)
- g.write("%s\n" % (" " * index))
+ g.write('\n' % (source.getId(),q))
+ write_line(g,"spage",p,index+1)
+ writeNote(g,"scomments",c,index+1)
+ writeNote(g,"stext",t,index+1)
+ write_line(g,"sdate",d,index+1)
+ g.write("%s\n" % (" " * index))
#-------------------------------------------------------------------------
#
@@ -215,7 +215,8 @@ def dump_name(g,label,name,index=1):
write_line(g,"title",name.getTitle(),index+1)
if name.getNote() != "":
writeNote(g,"note",name.getNote(),index+1)
- dump_source_ref(g,name.getSourceRef(),index+1)
+ for s in name.getSourceRefList():
+ dump_source_ref(g,s,index+1)
g.write('%s%s>\n' % (sp,label))
@@ -269,11 +270,12 @@ def dump_location(g,loc):
def write_attribute_list(g, list):
for attr in list:
- if attr.getSourceRef() or attr.getNote():
+ if len(attr.getSourceRef()) > 0 or attr.getNote():
g.write(' \n' % conf_priv(attr))
write_line(g,"attr_type",attr.getType(),4)
write_line(g,"attr_value",attr.getValue(),4)
- dump_source_ref(g,attr.getSourceRef(),4)
+ for s in attr.getSourceRefList():
+ dump_source_ref(g,s,index+1)
writeNote(g,"note",attr.getNote(),4)
g.write(' \n')
else:
@@ -328,7 +330,8 @@ def write_place_obj(g,place):
write_url_list(g, place.getUrlList())
if place.getNote() != "":
writeNote(g,"note",place.getNote(),3)
- dump_source_ref(g,place.getSourceRef(),3)
+ for s in place.getSourceRefList():
+ dump_source_ref(g,s,index+1)
g.write(" \n")
#-------------------------------------------------------------------------
@@ -412,8 +415,10 @@ def write_xml_data(database, g, callback, sp):
write_id(g,"person",person,2)
if person.getGender() == Person.male:
write_line(g,"gender","M",3)
- else:
+ elif person.getGender() == Person.female:
write_line(g,"gender","F",3)
+ else:
+ write_line(g,"gender","U",3)
dump_name(g,"name",person.getPrimaryName(),3)
for name in person.getAlternateNames():
dump_name(g,"aka",name,3)
@@ -441,7 +446,8 @@ def write_xml_data(database, g, callback, sp):
write_line(g,"postal",address.getPostal(),4)
if address.getNote() != "":
writeNote(g,"note",address.getNote(),4)
- dump_source_ref(g,address.getSourceRef(),4)
+ for s in address.getSourceRefList():
+ dump_source_ref(g,s,index+1)
g.write(' \n')
write_attribute_list(g,person.getAttributeList())
diff --git a/gramps/src/const.py b/gramps/src/const.py
index f4ccf2879..ac56f49e0 100644
--- a/gramps/src/const.py
+++ b/gramps/src/const.py
@@ -97,6 +97,7 @@ thumbScale = 100.0
indexFile = "data.gramps"
male = _("male")
female = _("female")
+unknown = _("unknown")
#-------------------------------------------------------------------------
#
@@ -343,9 +344,11 @@ def save_pattr(st):
#
#-------------------------------------------------------------------------
familyConstantAttributes = {
+ "Number of Children" : "NCHI",
}
_fa_e2l = {
+ "Number of Children" : _("Number of Children"),
}
_fa_l2e = {}
diff --git a/gramps/src/dialog.glade b/gramps/src/dialog.glade
index ea6adbea0..77c4a2291 100644
--- a/gramps/src/dialog.glade
+++ b/gramps/src/dialog.glade
@@ -125,7 +125,7 @@
GtkTable
table21
- 8
+ 7
2
False
0
@@ -308,32 +308,6 @@
-
- GtkLabel
- label158
-
- GTK_JUSTIFY_CENTER
- False
- 1
- 0.5
- 5
- 8
-
- 0
- 1
- 5
- 6
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
-
GtkCombo
personalEvents
@@ -407,8 +381,8 @@
1
2
- 7
- 8
+ 6
+ 7
3
3
False
@@ -441,8 +415,8 @@
0
1
- 7
- 8
+ 6
+ 7
0
0
False
@@ -475,13 +449,12 @@
- GtkEntry
- event_source
+ GtkCheckButton
+ priv
True
- False
- True
- 0
-
+
+ False
+ True
3
True
@@ -511,29 +484,6 @@
-
- GtkCheckButton
- priv
- True
-
- False
- True
-
- 1
- 2
- 6
- 7
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
-
GtkLabel
causelabel
@@ -701,7 +651,7 @@
GtkTable
table22
- 5
+ 4
2
False
0
@@ -764,32 +714,6 @@
-
- GtkLabel
- label175
-
- GTK_JUSTIFY_CENTER
- False
- 1
- 0.5
- 5
- 8
-
- 0
- 1
- 2
- 3
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
-
GtkCombo
attr_menu
@@ -863,8 +787,8 @@
1
2
- 4
- 5
+ 3
+ 4
3
3
False
@@ -897,8 +821,8 @@
0
1
- 4
- 5
+ 3
+ 4
0
0
False
@@ -931,13 +855,12 @@
- GtkEntry
- attr_source
+ GtkCheckButton
+ priv
True
- False
- True
- 0
-
+
+ False
+ True
3
True
@@ -966,29 +889,6 @@
-
-
- GtkCheckButton
- priv
- True
-
- False
- True
-
- 1
- 2
- 3
- 4
- 0
- 0
- False
- False
- False
- False
- True
- False
-
-
diff --git a/gramps/src/gramps.glade b/gramps/src/gramps.glade
index db59ff184..f1d620045 100644
--- a/gramps/src/gramps.glade
+++ b/gramps/src/gramps.glade
@@ -5297,7 +5297,7 @@ Very High
GtkRadioButton
- childGender
+ childMale
True
False
@@ -5312,7 +5312,7 @@ Very High
GtkRadioButton
- radiobutton2
+ childFemale
True
True
@@ -5324,6 +5324,21 @@ Very High
True
+
+
+ GtkRadioButton
+ childUnknown
+ True
+
+ True
+ True
+ childGender
+
+ 0
+ False
+ False
+
+
@@ -6577,4 +6592,230 @@ Unknown
+
+ GnomeDialog
+ sourcesel
+ Gramps - Source Reference Selection
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_NONE
+ False
+ False
+ True
+ False
+ False
+ False
+
+
+ GtkVBox
+ GnomeDialog:vbox
+ dialog-vbox18
+ False
+ 8
+
+ 4
+ True
+ True
+
+
+
+ GtkHButtonBox
+ GnomeDialog:action_area
+ dialog-action_area18
+ GTK_BUTTONBOX_END
+ 8
+ 85
+ 27
+ 7
+ 0
+
+ 0
+ False
+ True
+ GTK_PACK_END
+
+
+
+ GtkButton
+ button136
+ True
+ True
+
+ clicked
+ on_src_ok_clicked
+
+ Sat, 06 Oct 2001 15:41:23 GMT
+
+ GNOME_STOCK_BUTTON_OK
+
+
+
+ GtkButton
+ button138
+ True
+ True
+
+ clicked
+ destroy_passed_object
+
+ Fri, 05 Oct 2001 02:26:38 GMT
+
+ GNOME_STOCK_BUTTON_CANCEL
+
+
+
+
+ GtkVBox
+ vbox47
+ False
+ 0
+
+ 0
+ True
+ True
+
+
+
+ GtkLabel
+ label253
+
+ GTK_JUSTIFY_CENTER
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+ 0
+ False
+ False
+
+
+
+
+ GtkHSeparator
+ hseparator27
+
+ 5
+ True
+ True
+
+
+
+
+ GtkScrolledWindow
+ scrolledwindow30
+ 400
+ 150
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_UPDATE_CONTINUOUS
+ GTK_UPDATE_CONTINUOUS
+
+ 0
+ True
+ True
+
+
+
+ GtkCList
+ slist
+ True
+ 2
+ 80,80
+ GTK_SELECTION_SINGLE
+ True
+ GTK_SHADOW_IN
+
+
+ GtkLabel
+ CList:title
+ label254
+
+ GTK_JUSTIFY_CENTER
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+ GtkLabel
+ CList:title
+ label255
+
+ GTK_JUSTIFY_CENTER
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+
+ GtkHButtonBox
+ hbuttonbox26
+ GTK_BUTTONBOX_SPREAD
+ 30
+ 85
+ 27
+ 7
+ 0
+
+ 0
+ True
+ True
+
+
+
+ GtkButton
+ button139
+ True
+ True
+
+ clicked
+ on_add_src_clicked
+
+ Sat, 06 Oct 2001 15:47:16 GMT
+
+
+ GTK_RELIEF_NORMAL
+
+
+
+ GtkButton
+ button140
+ True
+ True
+
+ clicked
+ on_edit_src_clicked
+
+ Fri, 05 Oct 2001 02:49:15 GMT
+
+
+ GTK_RELIEF_NORMAL
+
+
+
+ GtkButton
+ button141
+ True
+ True
+
+ clicked
+ on_del_src_clicked
+
+ Sat, 06 Oct 2001 15:39:54 GMT
+
+
+ GTK_RELIEF_NORMAL
+
+
+
+
+
+
diff --git a/gramps/src/gramps_main.py b/gramps/src/gramps_main.py
index 34b4b3ff0..cabc1f165 100755
--- a/gramps/src/gramps_main.py
+++ b/gramps/src/gramps_main.py
@@ -560,10 +560,12 @@ def on_addchild_ok_clicked(obj):
name.setFirstName(given)
person.setPrimaryName(name)
- if new_child_win.get_widget("childGender").get_active():
+ if new_child_win.get_widget("childMale").get_active():
person.setGender(Person.male)
- else:
+ elif new_child_win.get_widget("childFemale").get_active():
person.setGender(Person.female)
+ else:
+ person.setGender(Person.unknown)
if not active_family:
active_family = database.newFamily()
@@ -729,7 +731,7 @@ def on_prel_changed(obj):
father_index = 1
mother_index = 1
for person in people:
- if person == active_person:
+ if person == active_person or person.getGender() == Person.unknown:
continue
elif type == "Partners":
father_list.append([utils.phonebook_name(person),birthday(person)])
@@ -2255,10 +2257,12 @@ def redisplay_person_list(person):
alt2col[person] = []
gname = utils.phonebook_from_name
if DataFilter.compare(person):
- if person.getGender():
+ if person.getGender() == Person.male:
gender = const.male
- else:
+ elif person.getGender() == Person.female:
gender = const.female
+ else:
+ gender = const.unknown
bday = person.getBirth().getDateObj()
dday = person.getDeath().getDateObj()
name = person.getPrimaryName()
@@ -2992,10 +2996,12 @@ def apply_filter():
id2col[person] = pos
new_alt2col[person] = []
- if person.getGender():
+ if person.getGender() == Person.male:
gender = const.male
- else:
+ elif person.getGender() == Person.female:
gender = const.female
+ else:
+ gender = const.unknown
bday = person.getBirth().getDateObj()
dday = person.getDeath().getDateObj()
diff --git a/gramps/src/latin_ansel.py b/gramps/src/latin_ansel.py
index 4f2748948..414f449bd 100644
--- a/gramps/src/latin_ansel.py
+++ b/gramps/src/latin_ansel.py
@@ -78,11 +78,22 @@ _t0 = {
def ansel_to_latin(s):
buff = cStringIO.StringIO()
while s:
- try:
- head,s = ansel_to_code(s)
- except Exception:
+ c0 = ord(s[0])
+ if c0 > 127:
+ try:
+ if c0 >= 0xE0:
+ c1 = ord(s[1])
+ head = chr(_s1[c0][c1])
+ s = s[2:]
+ else:
+ head = chr(_s0[c0])
+ s = s[1:]
+ except Exception:
+ head = s[0]
+ s = s[1:]
+ else:
head = s[0]
- s = s[1:0]
+ s = s[1:]
buff.write(head)
ans = buff.getvalue()
buff.close()
@@ -115,23 +126,3 @@ def latin_to_ansel(s):
buff.close()
return ans
-#-------------------------------------------------------------------------
-#
-#
-#
-#-------------------------------------------------------------------------
-def ansel_to_code(s):
- if s == "":
- return ""
- if ord(s[0]) < 128:
- return s[0],s[1:]
- c0 = ord(s[0])
- c1 = ord(s[1])
- if c0 >= 0xE0:
- return chr(_s1[c0][c1]),s[2:]
- else:
- try:
- return chr(_s0[c0]), s[1:]
- except:
- return s[0], s[1:]
-
diff --git a/gramps/src/plugins/ReadGedcom.py b/gramps/src/plugins/ReadGedcom.py
index 9047dd42c..90e8986b8 100644
--- a/gramps/src/plugins/ReadGedcom.py
+++ b/gramps/src/plugins/ReadGedcom.py
@@ -48,6 +48,11 @@ glade_file = None
clear_data = 0
is_ftw = 0
+def nocnv(s):
+ return s
+
+_cnv = nocnv
+
photo_types = [ "jpeg", "bmp", "pict", "pntg", "tpic", "png", "gif",
"tiff", "pcx" ]
@@ -69,6 +74,8 @@ lineRE = re.compile(r"\s*(\d+)\s+(\S+)\s*(.*)$")
headRE = re.compile(r"\s*(\d+)\s+HEAD")
nameRegexp = re.compile(r"([\S\s]*\S)?\s*/([^/]+)?/\s*,?\s*([\S]+)?")
+placemap = {}
+
#-------------------------------------------------------------------------
#
#
@@ -96,7 +103,9 @@ def find_file(fullname,altpath):
#
#
#-------------------------------------------------------------------------
+
def importData(database, filename):
+
global callback
global topDialog
global glade_file
@@ -125,12 +134,17 @@ def importData(database, filename):
GnomeErrorDialog(_("%s could not be opened\n") % filename)
return
+ import time
+ t1 = time.time()
g.parse_gedcom_file()
+ t2 = time.time()
+ print t2-t1
statusTop.get_widget("close").set_sensitive(1)
utils.modified()
- callback(1)
+ if callback:
+ callback(1)
#-------------------------------------------------------------------------
#
@@ -183,9 +197,9 @@ class GedcomParser:
self.dir_path = os.path.dirname(file)
self.localref = 0
- f = open(file,"r")
- self.lines = f.readlines()
- f.close()
+ self.f = open(file,"r")
+ self.index = 0
+ self.backoff = 0
self.file_obj = window.get_widget("file")
self.encoding_obj = window.get_widget("encoding")
@@ -200,8 +214,6 @@ class GedcomParser:
self.error_text_obj.set_word_wrap(0)
self.update(self.file_obj,file)
-
- self.index = 0
self.code = 0
#---------------------------------------------------------------------
@@ -220,24 +232,27 @@ class GedcomParser:
#
#---------------------------------------------------------------------
def get_next(self):
- line = string.replace(self.lines[self.index],'\r','')
- if self.code == ANSEL:
- line = latin_ansel.ansel_to_latin(line)
- elif self.code == UNICODE:
- line = latin_utf8.utf8_to_latin(line)
- match = lineRE.match(line)
- if not match:
- msg = _("Warning: line %d was not understood, so it was ignored.") % self.index
- self.error_text_obj.insert_defaults(msg)
- msg = "\n\t%s\n" % self.lines[self.index-1]
- self.error_text_obj.insert_defaults(msg)
- self.error_count = self.error_count + 1
- self.update(self.errors_obj,str(self.error_count))
- match = lineRE.match("999 XXX XXX")
-
- self.index = self.index + 1
- return match.groups()
-
+ if self.backoff == 0:
+ self.text = _cnv(string.strip(self.f.readline()))
+ self.index = self.index + 1
+ l = string.split(self.text, None, 2)
+ ln = len(l)
+ try:
+ if ln == 2:
+ self.groups = (int(l[0]),l[1],"")
+ else:
+ self.groups = (int(l[0]),l[1],l[2])
+ except:
+ msg = _("Warning: line %d was not understood, so it was ignored.") % self.index
+ self.error_text_obj.insert_defaults(msg)
+ msg = "\n\t%s\n" % self.text
+ self.error_text_obj.insert_defaults(msg)
+ self.error_count = self.error_count + 1
+ self.update(self.errors_obj,str(self.error_count))
+ self.groups = (999, "XXX", "XXX")
+ self.backoff = 0
+ return self.groups
+
#---------------------------------------------------------------------
#
#
@@ -246,7 +261,7 @@ class GedcomParser:
def barf(self,level):
msg = _("Warning: line %d was not understood, so it was ignored.") % self.index
self.error_text_obj.insert_defaults(msg)
- msg = "\n\t%s\n" % self.lines[self.index-1]
+ msg = "\n\t%s\n" % self.text
self.error_text_obj.insert_defaults(msg)
self.error_count = self.error_count + 1
self.update(self.errors_obj,str(self.error_count))
@@ -268,7 +283,7 @@ class GedcomParser:
#
#---------------------------------------------------------------------
def backup(self):
- self.index = self.index - 1
+ self.backoff = 1
#---------------------------------------------------------------------
#
@@ -296,7 +311,8 @@ class GedcomParser:
if matches[1] != "TRLR":
self.barf(0)
-
+ self.f.close()
+
#---------------------------------------------------------------------
#
#
@@ -325,7 +341,7 @@ class GedcomParser:
def parse_submitter(self):
matches = self.get_next()
- if matches[2] != "SUBN":
+ if matches[2] != "SUBM":
self.backup()
return
else:
@@ -414,7 +430,6 @@ class GedcomParser:
noteobj.set(text + self.parse_continue_data(1))
self.parse_note_data(1)
elif matches[2] == "OBJE":
- print "OBJE",matches[1]
self.ignore_sub_junk(1)
elif matches[1] == "TRLR":
self.backup()
@@ -505,6 +520,11 @@ class GedcomParser:
child.setMainFamily(None)
child.addAltFamily(self.family,mrel,frel)
elif matches[1] == "NCHI" or matches[1] == "RIN" or matches[1] == "SUBM":
+ a = Attribute()
+ a.setType("Number of Children")
+ a.setValue(matches[2])
+ self.family.addAttribute(a)
+ elif matches[1] == "RIN" or matches[1] == "SUBM":
pass
elif matches[1] == "REFN" or matches[1] == "CHAN":
self.ignore_sub_junk(2)
@@ -601,7 +621,9 @@ class GedcomParser:
self.nmap[matches[2]] = noteobj
self.person.setNoteObj(noteobj)
elif matches[1] == "SEX":
- if matches[2][0] == "M":
+ if matches[2] == '':
+ self.person.setGender(Person.unknown)
+ elif matches[2][0] == "M":
self.person.setGender(Person.male)
else:
self.person.setGender(Person.female)
@@ -838,7 +860,7 @@ class GedcomParser:
elif matches[1] == "SOUR":
source_ref = SourceRef()
source_ref.setBase(self.db.findSource(matches[2],self.smap))
- address.setSourceRef(source_ref)
+ address.addSourceRef(source_ref)
self.parse_source_reference(source_ref,level+1)
elif matches[1] == "PLAC":
address.setStreet(matches[2])
@@ -937,7 +959,7 @@ class GedcomParser:
else:
source_ref.setBase(self.db.findSource(matches[2],self.smap))
self.parse_source_reference(source_ref,level+1)
- event.setSourceRef(source_ref)
+ event.addSourceRef(source_ref)
elif matches[1] == "FAMC":
family = self.db.findFamily(matches[2],self.fmap)
if event.getName() == "Birth":
@@ -953,11 +975,8 @@ class GedcomParser:
event.setDescription(val)
self.ignore_sub_junk(level+1)
else:
- place = None
- for p in self.db.getPlaceMap().values():
- if val == p.get_title():
- place = p
- break
+ if placemap.has_key(val):
+ place = placemap[val]
else:
place = Place()
place.set_title(matches[2])
@@ -1028,14 +1047,11 @@ class GedcomParser:
else:
source_ref.setBase(self.db.findSource(matches[2],self.smap))
self.parse_source_reference(source_ref,level+1)
- event.setSourceRef(source_ref)
+ event.addSourceRef(source_ref)
elif matches[1] == "PLAC":
val = matches[2]
- place = None
- for p in self.db.getPlaceMap().values():
- if val == p.get_title():
- place = p
- break
+ if placemap.has_key(val):
+ place = placemap[val]
else:
place = Place()
place.set_title(matches[2])
@@ -1145,7 +1161,7 @@ class GedcomParser:
elif matches[1] == "SOUR":
source_ref = SourceRef()
source_ref.setBase(self.db.findSource(matches[2],self.smap))
- name.setSourceRef(source_ref)
+ name.addSourceRef(source_ref)
self.parse_source_reference(source_ref,level+1)
elif matches[1][0:4] == "NOTE":
if matches[2] and matches[2][0] != "@":
@@ -1164,10 +1180,10 @@ class GedcomParser:
def parse_header_head(self):
"""validiates that this is a valid GEDCOM file"""
- line = string.replace(self.lines[self.index],'\r','')
+ line = string.replace(self.f.readline(),'\r','')
match = headRE.search(line)
if not match:
- raise GedcomParser.BadFile, self.lines[self.index]
+ raise GedcomParser.BadFile, line
self.index = self.index + 1
#---------------------------------------------------------------------
@@ -1177,6 +1193,7 @@ class GedcomParser:
#---------------------------------------------------------------------
def parse_header_source(self):
global is_ftw
+ global _cnv
while 1:
matches = self.get_next()
@@ -1211,8 +1228,10 @@ class GedcomParser:
if matches[2] == "UNICODE" or matches[2] == "UTF-8" or \
matches[2] == "UTF8":
self.code = UNICODE
+ _cnv = latin_utf8.utf8_to_latin
elif matches[2] == "ANSEL":
self.code = ANSEL
+ _cnv = latin_ansel.ansel_to_latin
self.ignore_sub_junk(2)
self.update(self.encoding_obj,matches[2])
elif matches[1] == "GEDC":
@@ -1598,3 +1617,13 @@ def readData(database,active_person,cb):
from Plugins import register_import
register_import(readData,_("Import from GEDCOM"))
+
+if __name__ == "__main__":
+ import profile
+ import sys
+ global db
+
+ glade_file = "plugins/gedcomimport.glade"
+
+ db = RelDataBase()
+ profile.run('importData(db,sys.argv[1])')
diff --git a/gramps/src/plugins/WebPage.py b/gramps/src/plugins/WebPage.py
index 955232af3..9a3bbd410 100644
--- a/gramps/src/plugins/WebPage.py
+++ b/gramps/src/plugins/WebPage.py
@@ -131,7 +131,7 @@ class IndividualPage:
self.doc.start_cell("NormalCell")
self.doc.start_paragraph("Data")
self.doc.write_text(data)
- if sref != None and sref.getBase() != None :
+ for sref in srefllist:
self.doc.start_link("#s%d" % self.scnt)
self.doc.write_text("%d" % self.scnt)
self.doc.end_link()
@@ -244,7 +244,7 @@ class IndividualPage:
self.doc.end_paragraph()
self.doc.start_table("one","IndTable")
- self.write_normal_row("%s:" % _("Name"), name, name_obj.getSourceRef())
+ self.write_normal_row("%s:" % _("Name"), name, name_obj.getSourceRefList())
if self.person.getGender() == Person.male:
self.write_normal_row("%s:" % _("Gender"), \
_("Male"),None)
@@ -306,7 +306,7 @@ class IndividualPage:
date = event.getDate()
descr = event.getDescription()
place = event.getPlaceName()
- srcref = event.getSourceRef()
+ srcref = event.getSourceRefList()
if date == "" and descr == "" and place == "" and srcref.getBase() == None:
continue
diff --git a/gramps/src/plugins/WriteGedcom.py b/gramps/src/plugins/WriteGedcom.py
index c3437f4bb..a0179044c 100644
--- a/gramps/src/plugins/WriteGedcom.py
+++ b/gramps/src/plugins/WriteGedcom.py
@@ -200,8 +200,28 @@ def add_persons_sources(person):
for event in elist:
if private and event.getPrivacy():
continue
- source_ref = event.getSourceRef()
- if source_ref != None:
+ for source_ref in event.getSourceRefList():
+ sbase = source_ref.getBase()
+ if sbase != None and sbase not in source_list:
+ source_list.append(sbase)
+ for event in person.getAddressList():
+ if private and event.getPrivacy():
+ continue
+ for source_ref in event.getSourceRefList():
+ sbase = source_ref.getBase()
+ if sbase != None and sbase not in source_list:
+ source_list.append(sbase)
+ for event in person.getAttibuteList:
+ if private and event.getPrivacy():
+ continue
+ for source_ref in event.getSourceRefList():
+ sbase = source_ref.getBase()
+ if sbase != None and sbase not in source_list:
+ source_list.append(sbase)
+ for name in person.getNameList + [ person.getPrimaryName() ]:
+ if private and event.getPrivacy():
+ continue
+ for source_ref in event.getSourceRefList():
sbase = source_ref.getBase()
if sbase != None and sbase not in source_list:
source_list.append(sbase)
@@ -215,8 +235,14 @@ def add_familys_sources(family):
for event in family.getEventList():
if private and event.getPrivacy():
continue
- source_ref = event.getSourceRef()
- if source_ref != None:
+ for source_ref in event.getSourceRefList():
+ sbase = source_ref.getBase()
+ if sbase != None and sbase not in source_list:
+ source_list.append(sbase)
+ for attr in family.getAttributeList():
+ if private and event.getPrivacy():
+ continue
+ for source_ref in event.getSourceRefList():
sbase = source_ref.getBase()
if sbase != None and sbase not in source_list:
source_list.append(sbase)
@@ -273,8 +299,8 @@ def dump_event_stats(g,event):
g.write("2 PLAC %s\n" % cnvtxt(event.getPlaceName()))
if event.getNote() != "":
write_long_text(g,"NOTE",2,event.getNote())
- if event.getSourceRef() != None:
- write_source_ref(g,2,event.getSourceRef())
+ for srcref in event.getSourceRefList():
+ write_source_ref(g,2,srcref)
def fmtline(text,limit,level):
new_text = []
@@ -340,8 +366,8 @@ def write_person_name(g,name,nick):
g.write('2 NICK %s\n' % nick)
if name.getNote() != "":
write_long_text(g,"NOTE",2,name.getNote())
- if name.getSourceRef() != None:
- write_source_ref(g,2,name.getSourceRef())
+ for srcref in name.getSourceRefList():
+ write_source_ref(g,2,srcref)
#-------------------------------------------------------------------------
#
@@ -431,8 +457,8 @@ def write_person(g,person):
g.write("2 PLAC %s\n" % cnvtxt(attr.getValue()))
if attr.getNote() != "":
write_long_text(g,"NOTE",2,attr.getNote())
- if attr.getSourceRef() != None:
- write_source_ref(g,2,attr.getSourceRef())
+ for srcref in attr.getSourceRefList():
+ write_source_ref(g,2,srclist)
for addr in person.getAddressList():
if private and addr.getPrivacy():
@@ -448,8 +474,8 @@ def write_person(g,person):
g.write("2 CTRY %s\n" % addr.getCountry())
if addr.getNote() != "":
write_long_text(g,"NOTE",2,addr.getNote())
- if addr.getSourceRef() != None:
- write_source_ref(g,2,addr.getSourceRef())
+ for srcref in addr.getSourceRefList():
+ write_source_ref(g,2,srcref)
family = person.getMainFamily()
if family != None and family in family_list:
diff --git a/gramps/src/utils.py b/gramps/src/utils.py
index 08eaedaba..c0762458b 100644
--- a/gramps/src/utils.py
+++ b/gramps/src/utils.py
@@ -150,7 +150,7 @@ def get_detail_flags(obj):
if Config.show_detail:
if obj.getNote() != "":
detail = "N"
- if obj.getSourceRef().getBase():
+ if len(obj.getSourceRefList()) > 0:
detail = detail + "S"
if obj.getPrivacy():
detail = detail + "P"
@@ -166,7 +166,7 @@ def get_detail_text(obj):
details = "%s" % _("Note")
else:
details = ""
- if obj.getSourceRef().getBase() != None:
+ if len(obj.getSourceRefList()) > 0:
if details == "":
details = _("Source")
else: