gramps/src/Marriage.py

527 lines
19 KiB
Python
Raw Normal View History

2001-05-13 07:26:57 +05:30
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000 Donald N. Allingham
#
# This program is free software; you can redistribute it and/or modiy
2001-05-13 07:26:57 +05:30
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
import pickle
2001-05-13 07:26:57 +05:30
#-------------------------------------------------------------------------
#
# GTK/Gnome modules
#
#-------------------------------------------------------------------------
import gtk
import GDK
2001-05-13 07:26:57 +05:30
from gnome.ui import *
import libglade
#-------------------------------------------------------------------------
#
# gramps modules
#
#-------------------------------------------------------------------------
import const
import Config
import utils
from RelLib import *
import ImageSelect
from intl import gettext
_ = gettext
2001-05-13 07:26:57 +05:30
_temple_names = const.lds_temple_codes.keys()
_temple_names.sort()
_temple_names = [""] + _temple_names
pycode_tgts = [('fevent', 0, 0),
('fattr', 0, 1)]
2001-05-13 07:26:57 +05:30
#-------------------------------------------------------------------------
#
# Marriage class
#
#-------------------------------------------------------------------------
class Marriage:
def __init__(self,family,db):
"""Initializes the Marriage class, and displays the window"""
2001-05-13 07:26:57 +05:30
self.family = family
self.db = db
self.path = db.getSavePath()
self.top = libglade.GladeXML(const.marriageFile,"marriageEditor")
top_window = self.get_widget("marriageEditor")
plwidget = self.top.get_widget("photolist")
self.gallery = ImageSelect.Gallery(family, self.path, plwidget, db)
2001-05-13 07:26:57 +05:30
self.top.signal_autoconnect({
2001-10-14 10:49:43 +05:30
"destroy_passed_object" : self.on_cancel_edit,
2001-12-19 07:32:59 +05:30
"on_up_clicked" : self.on_up_clicked,
"on_down_clicked" : self.on_down_clicked,
2001-10-14 10:49:43 +05:30
"on_add_attr_clicked" : self.on_add_attr_clicked,
"on_addphoto_clicked" : self.gallery.on_add_photo_clicked,
2001-10-14 10:49:43 +05:30
"on_attr_list_select_row" : self.on_attr_list_select_row,
"on_combo_insert_text" : utils.combo_insert_text,
2001-10-14 10:49:43 +05:30
"on_close_marriage_editor" : self.on_close_marriage_editor,
"on_delete_attr_clicked" : self.on_delete_attr_clicked,
"on_delete_event" : self.on_delete_event,
2001-12-19 07:32:59 +05:30
"on_lds_src_clicked" : self.lds_src_clicked,
"on_lds_note_clicked" : self.lds_note_clicked,
"on_deletephoto_clicked" : self.gallery.on_delete_photo_clicked,
"on_edit_properties_clicked": self.gallery.popup_change_description,
2001-10-14 10:49:43 +05:30
"on_marriageAddBtn_clicked" : self.on_add_clicked,
"on_marriageDeleteBtn_clicked" : self.on_delete_clicked,
"on_marriageEventList_select_row" : self.on_select_row,
"on_marriageUpdateBtn_clicked" : self.on_update_clicked,
2001-12-19 07:32:59 +05:30
"on_photolist_button_press_event" : self.gallery.on_button_press_event,
"on_photolist_select_icon" : self.gallery.on_photo_select_icon,
2001-10-14 10:49:43 +05:30
"on_update_attr_clicked" : self.on_update_attr_clicked,
2001-05-13 07:26:57 +05:30
})
text_win = self.get_widget("marriageTitle")
title = _("%s and %s") % (Config.nameof(family.getFather()),
Config.nameof(family.getMother()))
text_win.set_text(title)
2001-05-13 07:26:57 +05:30
self.event_list = self.get_widget("marriageEventList")
# widgets
self.date_field = self.get_widget("marriageDate")
self.place_field = self.get_widget("marriagePlace")
2001-10-04 09:52:41 +05:30
self.cause_field = self.get_widget("marriageCause")
2001-05-13 07:26:57 +05:30
self.name_field = self.get_widget("marriageEventName")
self.descr_field = self.get_widget("marriageDescription")
self.type_field = self.get_widget("marriage_type")
self.notes_field = self.get_widget("marriageNotes")
self.gid = self.get_widget("gid")
2001-06-03 04:26:04 +05:30
self.attr_list = self.get_widget("attr_list")
self.attr_type = self.get_widget("attr_type")
self.attr_value = self.get_widget("attr_value")
self.event_details = self.get_widget("event_details")
self.attr_details_field = self.get_widget("attr_details")
self.lds_date = self.get_widget("lds_date")
self.lds_temple = self.get_widget("lds_temple")
2001-12-19 07:32:59 +05:30
self.lds_status = self.get_widget("lds_status")
self.lds_place = self.get_widget("lds_place")
2001-06-10 06:56:09 +05:30
self.event_list.set_column_visibility(3,Config.show_detail)
self.attr_list.set_column_visibility(2,Config.show_detail)
self.elist = family.getEventList()[:]
self.alist = family.getAttributeList()[:]
self.lists_changed = 0
2001-05-13 07:26:57 +05:30
# set initial data
self.gallery.load_images()
2001-12-19 07:32:59 +05:30
self.type_field.set_popdown_strings(const.familyRelations)
frel = const.display_frel(family.getRelationship())
self.type_field.entry.set_text(frel)
self.gid.set_text(family.getId())
self.gid.set_editable(Config.id_edit)
self.lds_temple.set_popdown_strings(_temple_names)
2001-12-19 07:32:59 +05:30
plist = self.db.getPlaceMap().values()
ord = self.family.getLdsSeal()
if ord:
2001-12-19 07:32:59 +05:30
utils.attach_places(plist,self.lds_place,ord.getPlace())
self.lds_date.set_text(ord.getDate())
if ord.getTemple() != "":
name = const.lds_temple_to_abrev[ord.getTemple()]
else:
name = ""
self.lds_temple.entry.set_text(name)
2001-12-19 07:32:59 +05:30
self.seal_stat = ord.getStatus()
else:
2001-12-19 07:32:59 +05:30
utils.attach_places(plist,self.lds_place,None)
self.lds_temple.entry.set_text("")
2001-12-19 07:32:59 +05:30
self.seal_stat = 0
self.build_seal_menu()
2001-05-13 07:26:57 +05:30
self.event_list.drag_dest_set(gtk.DEST_DEFAULT_ALL,pycode_tgts,GDK.ACTION_COPY)
self.event_list.drag_source_set(GDK.BUTTON1_MASK, pycode_tgts, GDK.ACTION_COPY)
self.event_list.connect('drag_data_get', self.ev_source_drag_data_get)
self.event_list.connect('drag_data_received', self.ev_dest_drag_data_received)
self.attr_list.drag_dest_set(gtk.DEST_DEFAULT_ALL,pycode_tgts,GDK.ACTION_COPY)
self.attr_list.drag_source_set(GDK.BUTTON1_MASK, pycode_tgts, GDK.ACTION_COPY)
self.attr_list.connect('drag_data_get', self.at_source_drag_data_get)
self.attr_list.connect('drag_data_received', self.at_dest_drag_data_received)
# set notes data
self.notes_field.set_point(0)
self.notes_field.insert_defaults(family.getNote())
self.notes_field.set_word_wrap(1)
# Typing CR selects OK button
top_window.editable_enters(self.notes_field);
top_window.editable_enters(self.get_widget("combo-entry1"));
self.redraw_event_list()
2001-06-03 04:26:04 +05:30
self.redraw_attr_list()
2001-05-13 07:26:57 +05:30
top_window.show()
2001-12-19 07:32:59 +05:30
def build_seal_menu(self):
menu = gtk.GtkMenu()
index = 0
for val in const.lds_ssealing:
menuitem = gtk.GtkMenuItem(val)
menuitem.set_data("val",index)
menuitem.connect('activate',self.set_lds_seal)
menuitem.show()
menu.append(menuitem)
index = index + 1
self.lds_status.set_menu(menu)
self.lds_status.set_history(self.seal_stat)
def set_lds_seal(self,obj):
self.seal_stat = obj.get_data("val")
def lds_src_clicked(self,obj):
import Sources
ord = self.family.getLdsSeal()
if ord == None:
ord = LdsOrd()
self.person.setLdsSeal(ord)
Sources.SourceSelector(ord.getSourceRefList(),self,src_changed)
def lds_note_clicked(self,obj):
import NoteEdit
ord = self.family.getLdsSeal()
if ord == None:
ord = LdsOrd()
self.person.setLdsSeal(ord)
NoteEdit.NoteEditor(ord)
def on_up_clicked(self,obj):
if len(obj.selection) == 0:
return
row = obj.selection[0]
if row != 0:
obj.select_row(row-1,0)
def on_down_clicked(self,obj):
if len(obj.selection) == 0:
return
row = obj.selection[0]
if row != obj.rows-1:
obj.select_row(row+1,0)
def ev_dest_drag_data_received(self,widget,context,x,y,selection_data,info,time):
if selection_data and selection_data.data:
exec 'data = %s' % selection_data.data
exec 'mytype = "%s"' % data[0]
exec 'family = "%s"' % data[1]
if family == self.family.getId() or mytype != 'fevent':
return
foo = pickle.loads(data[2]);
for src in foo.getSourceRefList():
base = src.getBase()
newbase = self.db.findSourceNoMap(base.getId())
src.setBase(newbase)
place = foo.getPlace()
if place:
foo.setPlace(self.db.findPlaceNoMap(place.getId()))
self.elist.append(foo)
self.lists_changed = 1
self.redraw_event_list()
def ev_source_drag_data_get(self,widget, context, selection_data, info, time):
2001-12-09 10:54:29 +05:30
ev = widget.get_row_data(widget.focus_row)
bits_per = 8; # we're going to pass a string
pickled = pickle.dumps(ev);
data = str(('fevent',self.family.getId(),pickled));
selection_data.set(selection_data.target, bits_per, data)
def at_dest_drag_data_received(self,widget,context,x,y,selection_data,info,time):
if selection_data and selection_data.data:
exec 'data = %s' % selection_data.data
exec 'mytype = "%s"' % data[0]
exec 'family = "%s"' % data[1]
if family == self.family.getId() or mytype != 'fattr':
return
foo = pickle.loads(data[2]);
for src in foo.getSourceRefList():
base = src.getBase()
newbase = self.db.findSourceNoMap(base.getId())
src.setBase(newbase)
self.alist.append(foo)
self.lists_changed = 1
self.redraw_attr_list()
def at_source_drag_data_get(self,widget, context, selection_data, info, time):
2001-12-09 10:54:29 +05:30
ev = widget.get_row_data(widget.focus_row)
bits_per = 8; # we're going to pass a string
pickled = pickle.dumps(ev);
data = str(('fattr',self.family.getId(),pickled));
selection_data.set(selection_data.target, bits_per, data)
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
def update_lists(self):
self.family.setEventList(self.elist)
self.family.setAttributeList(self.alist)
2001-06-03 04:26:04 +05:30
def redraw_attr_list(self):
utils.redraw_list(self.alist,self.attr_list,disp_attr)
2001-05-13 07:26:57 +05:30
def redraw_event_list(self):
utils.redraw_list(self.elist,self.event_list,disp_event)
2001-05-13 07:26:57 +05:30
def get_widget(self,name):
return self.top.get_widget(name)
2001-10-14 10:49:43 +05:30
def did_data_change(self):
changed = 0
relation = self.type_field.entry.get_text()
if const.save_frel(relation) != self.family.getRelationship():
changed = 1
2001-10-14 10:49:43 +05:30
text = self.notes_field.get_chars(0,-1)
if text != self.family.getNote():
changed = 1
2001-10-14 10:49:43 +05:30
if self.lists_changed:
changed = 1
2001-10-14 10:49:43 +05:30
idval = self.gid.get_text()
if self.family.getId() != idval:
changed = 1
date = self.lds_date.get_text()
temple = self.lds_temple.entry.get_text()
if const.lds_temple_codes.has_key(temple):
temple = const.lds_temple_codes[temple]
else:
temple = ""
2001-12-19 07:32:59 +05:30
place = utils.get_place_from_list(self.lds_place)
ord = self.family.getLdsSeal()
if not ord:
2001-12-19 07:32:59 +05:30
if date or temple or place or self.seal_stat:
changed = 1
else:
d = Date()
d.set(date)
2001-12-19 07:32:59 +05:30
if compare_dates(d,ord.getDateObj()) != 0 or \
ord.getTemple() != temple or \
ord.getPlace() != place or \
ord.getStatus() != self.seal_stat:
changed = 1
2001-10-14 10:49:43 +05:30
return changed
2001-10-14 10:49:43 +05:30
def on_cancel_edit(self,obj):
2001-10-14 10:49:43 +05:30
if self.did_data_change():
global quit
q = _("Data was modified. Are you sure you want to abandon your changes?")
quit = obj
GnomeQuestionDialog(q,cancel_callback)
else:
utils.destroy_passed_object(obj)
def on_delete_event(self,obj,b):
self.on_cancel_edit(obj)
def on_close_marriage_editor(self,obj):
idval = self.gid.get_text()
family = self.family
if idval != family.getId():
m = self.db.getFamilyMap()
if not m.has_key(idval):
if m.has_key(family.getId()):
del m[family.getId()]
m[idval] = family
family.setId(idval)
utils.modified()
else:
msg1 = _("GRAMPS ID value was not changed.")
GnomeWarningDialog("%s" % msg1)
relation = self.type_field.entry.get_text()
if const.save_frel(relation) != self.family.getRelationship():
father = self.family.getFather()
mother = self.family.getMother()
if father.getGender() == mother.getGender():
self.family.setRelationship("Partners")
else:
val = const.save_frel(relation)
if val == "Partners":
val = "Unknown"
if father.getGender() == Person.female or \
mother.getGender() == Person.male:
self.family.setFather(mother)
self.family.setMother(father)
self.family.setRelationship(val)
utils.modified()
2001-10-14 10:49:43 +05:30
text = self.notes_field.get_chars(0,-1)
if text != self.family.getNote():
self.family.setNote(text)
utils.modified()
date = self.lds_date.get_text()
temple = self.lds_temple.entry.get_text()
if const.lds_temple_codes.has_key(temple):
temple = const.lds_temple_codes[temple]
else:
temple = ""
2001-12-19 07:32:59 +05:30
place = utils.get_place_from_list(self.lds_place)
ord = self.family.getLdsSeal()
if not ord:
2001-12-19 07:32:59 +05:30
if date or temple or place or self.seal_stat:
ord = LdsOrd()
ord.setDate(date)
ord.setTemple(temple)
2001-12-19 07:32:59 +05:30
ord.setStatus(self.seal_stat)
ord.setPlace(place)
self.family.setLdsSeal(ord)
utils.modified()
else:
d = Date()
d.set(date)
if compare_dates(d,ord.getDateObj()) != 0:
ord.setDateObj(d)
utils.modified()
if ord.getTemple() != temple:
ord.setTemple(temple)
utils.modified()
2001-12-19 07:32:59 +05:30
if ord.getStatus() != self.seal_stat:
ord.setStatus(self.seal_stat)
utils.modified()
if ord.getPlace() != place:
ord.setPlace(place)
utils.modified()
2001-10-14 10:49:43 +05:30
utils.destroy_passed_object(self.get_widget("marriageEditor"))
2001-10-14 10:49:43 +05:30
self.update_lists()
if self.lists_changed:
utils.modified()
2001-10-14 10:49:43 +05:30
def on_add_clicked(self,obj):
import EventEdit
name = utils.family_name(self.family)
EventEdit.EventEditor(self,name,const.marriageEvents,const.save_pevent,None,None,0)
2001-10-14 10:49:43 +05:30
def on_update_clicked(self,obj):
import EventEdit
if len(obj.selection) <= 0:
return
2001-05-13 07:26:57 +05:30
2001-10-14 10:49:43 +05:30
event = obj.get_row_data(obj.selection[0])
name = utils.family_name(self.family)
EventEdit.EventEditor(self,name,const.marriageEvents,const.save_pevent,event,None,0)
2001-05-13 07:26:57 +05:30
2001-10-14 10:49:43 +05:30
def on_delete_clicked(self,obj):
if utils.delete_selected(obj,self.elist):
self.lists_changed = 1
self.redraw_event_list()
2001-05-13 07:26:57 +05:30
2001-10-14 10:49:43 +05:30
def on_select_row(self,obj,row,b,c):
event = obj.get_row_data(row)
2001-05-13 07:26:57 +05:30
2001-10-14 10:49:43 +05:30
self.date_field.set_text(event.getDate())
self.place_field.set_text(event.getPlaceName())
self.cause_field.set_text(event.getCause())
self.name_field.set_label(const.display_fevent(event.getName()))
self.event_details.set_text(utils.get_detail_text(event))
self.descr_field.set_text(event.getDescription())
def on_attr_list_select_row(self,obj,row,b,c):
attr = obj.get_row_data(row)
2001-10-14 10:49:43 +05:30
self.attr_type.set_label(const.display_fattr(attr.getType()))
self.attr_value.set_text(attr.getValue())
self.attr_details_field.set_text(utils.get_detail_text(attr))
def on_update_attr_clicked(self,obj):
import AttrEdit
if len(obj.selection) > 0:
row = obj.selection[0]
attr = obj.get_row_data(row)
father = self.family.getFather()
mother = self.family.getMother()
if father and mother:
name = _("%s and %s") % (father.getPrimaryName().getName(),
mother.getPrimaryName().getName())
elif father:
name = father.getPrimaryName().getName()
else:
name = mother.getPrimaryName().getName()
AttrEdit.AttributeEditor(self,attr,name,const.familyAttributes)
def on_delete_attr_clicked(self,obj):
if utils.delete_selected(obj,self.alist):
self.lists_changed = 1
self.redraw_attr_list()
def on_add_attr_clicked(self,obj):
import AttrEdit
father = self.family.getFather()
mother = self.family.getMother()
if father and mother:
name = _("%s and %s") % (father.getPrimaryName().getName(),
mother.getPrimaryName().getName())
elif father:
name = father.getPrimaryName().getName()
else:
name = mother.getPrimaryName().getName()
2001-10-14 10:49:43 +05:30
AttrEdit.AttributeEditor(self,None,name,const.familyAttributes)
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
def disp_attr(attr):
detail = utils.get_detail_flags(attr)
return [const.display_fattr(attr.getType()),attr.getValue(),detail]
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
def disp_event(event):
return [const.display_fevent(event.getName()), event.getQuoteDate(),
event.getPlaceName(), utils.get_detail_flags(event)]
2001-10-14 10:49:43 +05:30
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
def cancel_callback(a):
if a==0:
utils.destroy_passed_object(quit)
2001-12-19 07:32:59 +05:30
def src_changed(parent):
parent.lists_changed = 1