diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 77de12d4a..e457920c4 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,9 @@ +2006-01-22 Don Allingham + * src/Makefile.am: remove PeopleView.py + * src/PeopleView.py: removed, replaced by PersonView + * src/PersonView.py: set ellipsize property + * src/GrampsDb/_ReadGedcom.py: fix event handling + 2006-01-21 Don Allingham * src/PeopleModel.py: fix sorting of subnames * src/Utils.py: fix GEDCOM mappings diff --git a/gramps2/example/gedcom/sample.ged b/gramps2/example/gedcom/sample.ged index 76d6a2095..3dff82cf8 100755 --- a/gramps2/example/gedcom/sample.ged +++ b/gramps2/example/gedcom/sample.ged @@ -680,7 +680,8 @@ 2 CALN 3 MEDI Book 0 @S1601@ SOUR -1 TITL Birth Records +1 TITL Birth Record +2 CONC s 1 REPO 2 CALN 3 MEDI Book diff --git a/gramps2/src/GrampsDb/_ReadGedcom.py b/gramps2/src/GrampsDb/_ReadGedcom.py index 2c4be0174..b7f4977ad 100644 --- a/gramps2/src/GrampsDb/_ReadGedcom.py +++ b/gramps2/src/GrampsDb/_ReadGedcom.py @@ -129,6 +129,8 @@ for _val in Utils.familyConstantEvents.keys(): if _key != "": ged2fam[_key] = _val +ged2fam_custom = {} + #------------------------------------------------------------------------- # # regular expressions @@ -274,7 +276,7 @@ class NoteParser: f = open(filename,"rU") innote = False - for line in f.xreadlines(): + for line in f: self.count += 1 if innote: @@ -449,7 +451,7 @@ class GedcomParser: mypaths = [] f = open("/proc/mounts","r") - for line in f.xreadlines(): + for line in f: paths = line.split() ftype = paths[2].upper() if ftype in file_systems.keys(): @@ -492,7 +494,60 @@ class GedcomParser: else: return (0,tries) + def track_lines(self): + self.current += 1 + newval = int((100*self.current)/self.maxlines) + if self.callback and newval != self.oldval: + self.callback(newval) + self.oldval = newval + def get_next(self): + if self.backoff == 0: + next_line = self.f.readline() + self.track_lines() + + # EOF ? + if next_line == "": + self.index += 1 + self.text = ""; + self.backoff = 0 + msg = _("Warning: Premature end of file at line %d.\n") % self.index + self.errmsg(msg) + self.error_count = self.error_count + 1 + self.groups = (-1, "END OF FILE", "","") + return self.groups + + try: + self.text = string.translate(next_line.strip(),self.transtable,self.delc) + except: + self.text = next_line.strip() + + try: + self.text = self.cnv(self.text) + except: + self.text = string.translate(self.text,self.transtable2) + + self.index += 1 + l = whitespaceRegexp.split(self.text, 2) + ln = len(l) + try: + if ln == 2: + self.groups = (int(l[0]),tokens.get(l[1],TOKEN_UNKNOWN),u"",unicode(l[1])) + else: + self.groups = (int(l[0]),tokens.get(l[1],TOKEN_UNKNOWN),unicode(l[2]),unicode(l[1])) + except: + if self.text == "": + msg = _("Warning: line %d was blank, so it was ignored.\n") % self.index + else: + msg = _("Warning: line %d was not understood, so it was ignored.") % self.index + msg = "%s\n\t%s\n" % (msg,self.text) + self.errmsg(msg) + self.error_count = self.error_count + 1 + self.groups = (999, TOKEN_UNKNOWN, "XXX", "") + self.backoff = 0 + return self.groups + + def get_next_original(self): if self.backoff == 0: next_line = self.f.readline() self.current += 1 @@ -962,13 +1017,15 @@ class GedcomParser: else: event = RelLib.Event() try: - print matches[1] - print ged2fam[matches[1]] - event.set_name(ged2fam[matches[1]]) + event.set_type((ged2fam[matches[3]],'')) except: - event.set_name(matches[1]) + val = ged2fam_custom.has_key(matches[3]) + if val: + event.set_type((RelLib.Event.CUSTOM,val)) + else: + event.set_type((RelLib.Event.CUSTOM,matches[1])) if event.get_type()[0] == RelLib.Event.MARRIAGE: - self.family.set_relationship(RelLib.Family.MARRIED) + self.family.set_relationship((RelLib.Family.MARRIED,'')) self.parse_family_event(event,2) self.db.add_event(event,self.trans) @@ -1011,7 +1068,7 @@ class GedcomParser: if int(matches[0]) < 1: self.backup() if state.get_text(): - self.person.set_note(state.get_text()) + state.person.set_note(state.get_text()) return else: func = self.person_func.get(matches[1],self.func_person_event) @@ -1035,8 +1092,8 @@ class GedcomParser: self.barf(level+1) return None - def parse_famc_type(self,level): - ftype = RelLib.Person.CHILD_BIRTH + def parse_famc_type(self,level,person): + ftype = (RelLib.Person.CHILD_BIRTH,'') note = "" while 1: matches = self.get_next() @@ -1048,7 +1105,7 @@ class GedcomParser: ftype = pedi_type.get(matches[2],RelLib.Person.UNKNOWN) elif matches[1] == TOKEN_SOUR: source_ref = self.handle_source(matches,level+1) - self.person.get_primary_name().add_source_reference(source_ref) + person.get_primary_name().add_source_reference(source_ref) elif matches[1] == TOKEN__PRIMARY: pass #type = matches[1] elif matches[1] == TOKEN_NOTE: @@ -1061,7 +1118,7 @@ class GedcomParser: self.barf(level+1) return None - def parse_person_object(self,level): + def parse_person_object(self,level,state): form = "" filename = "" title = "no title" @@ -1088,7 +1145,7 @@ class GedcomParser: url = RelLib.Url() url.set_path(filename) url.set_description(title) - self.person.add_url(url) + state.person.add_url(url) else: (ok,path) = self.find_file(filename,self.dir_path) if not ok: @@ -1110,8 +1167,7 @@ class GedcomParser: oref = RelLib.MediaRef() oref.set_reference_handle(photo.get_handle()) oref.set_note(note) - self.person.add_media_reference(oref) - #self.db.commit_person(self.person, self.trans) + state.person.add_media_reference(oref) def parse_family_object(self,level): form = "" @@ -1156,7 +1212,6 @@ class GedcomParser: oref.set_reference_handle(photo.get_handle()) oref.set_note(note) self.family.add_media_reference(oref) - #self.db.commit_family(self.family, self.trans) def parse_residence(self,address,level): note = "" @@ -1459,11 +1514,12 @@ class GedcomParser: self.backup() break elif matches[1] == TOKEN_TYPE: - if event.get_name() == "" or event.get_name() == 'EVEN': + etype = event.get_type() + if etype[0] == RelLib.Event.CUSTOM: try: - event.set_name(ged2fam[matches[2]]) + event.set_name((ged2fam[matches[2]],'')) except: - event.set_name(matches[2]) + event.set_name((RelLib.Event.CUSTOM,matches[2])) else: note = 'Status = %s\n' % matches[2] elif matches[1] == TOKEN_DATE: @@ -1679,7 +1735,7 @@ class GedcomParser: return else: label = self.parse_label(level+1) - ged2fam[matches[1]] = label + ged2fam[matches[3]] = label return None def ignore_sub_junk(self,level): @@ -1900,9 +1956,9 @@ class GedcomParser: if names[4]: name.set_suffix(names[4].strip()) if state.name_cnt == 0: - self.person.set_primary_name(name) + state.person.set_primary_name(name) else: - self.person.add_alternate_name(name) + state.person.add_alternate_name(name) state.name_cnt += 1 self.parse_name(name,2,state) @@ -1918,49 +1974,49 @@ class GedcomParser: aka.set_surname(names[2]) if names[4]: aka.set_suffix(names[4]) - self.person.add_alternate_name(aka) + state.person.add_alternate_name(aka) def func_person_object(self,matches,state): if matches[2] and matches[2][0] == '@': self.barf(2) else: - self.parse_person_object(2) + self.parse_person_object(2,state) def func_person_note(self,matches,state): self.note = self.parse_note(matches,self.person,1,state)#self.note) def func_person_sex(self,matches,state): if matches[2] == '': - self.person.set_gender(RelLib.Person.UNKNOWN) + state.person.set_gender(RelLib.Person.UNKNOWN) elif matches[2][0] == "M": - self.person.set_gender(RelLib.Person.MALE) + state.person.set_gender(RelLib.Person.MALE) elif matches[2][0] == "F": - self.person.set_gender(RelLib.Person.FEMALE) + state.person.set_gender(RelLib.Person.FEMALE) else: - self.person.set_gender(RelLib.Person.UNKNOWN) + state.person.set_gender(RelLib.Person.UNKNOWN) def func_person_bapl(self,matches,state): lds_ord = RelLib.LdsOrd() - self.person.set_lds_baptism(lds_ord) + state.person.set_lds_baptism(lds_ord) self.parse_ord(lds_ord,2) def func_person_endl(self,matches,state): lds_ord = RelLib.LdsOrd() - self.person.set_lds_endowment(lds_ord) + state.person.set_lds_endowment(lds_ord) self.parse_ord(lds_ord,2) def func_person_slgc(self,matches,state): lds_ord = RelLib.LdsOrd() - self.person.set_lds_sealing(lds_ord) + state.person.set_lds_sealing(lds_ord) self.parse_ord(lds_ord,2) def func_person_fams(self,matches,state): handle = self.find_family_handle(matches[2][1:-1]) - self.person.add_family_handle(handle) + state.person.add_family_handle(handle) state.add_to_note(self.parse_optional_note(2)) def func_person_famc(self,matches,state): - ftype,note = self.parse_famc_type(2) + ftype,note = self.parse_famc_type(2,state.person) handle = self.find_family_handle(matches[2][1:-1]) for f in self.person.get_parent_family_handle_list(): @@ -1968,29 +2024,30 @@ class GedcomParser: break else: if ftype in rel_types: - self.person.add_parent_family_handle( - handle, RelLib.Person.CHILD_BIRTH, RelLib.Person.CHILD_BIRTH) + state.person.add_parent_family_handle( + handle, (RelLib.Person.CHILD_BIRTH,''), + (RelLib.Person.CHILD_BIRTH,'')) else: - if self.person.get_main_parents_family_handle() == handle: - self.person.set_main_parent_family_handle(None) - self.person.add_parent_family_handle(handle,ftype,ftype) + if state.person.get_main_parents_family_handle() == handle: + state.person.set_main_parent_family_handle(None) + state.person.add_parent_family_handle((handle,ftype,ftype)) def func_person_resi(self,matches,state): addr = RelLib.Address() - self.person.add_address(addr) + state.person.add_address(addr) self.parse_residence(addr,2) def func_person_addr(self,matches,state): addr = RelLib.Address() addr.set_street(matches[2] + self.parse_continue_data(1)) self.parse_address(addr,2) - self.person.add_address(addr) + state.person.add_address(addr) def func_person_phon(self,matches,state): addr = RelLib.Address() addr.set_street("Unknown") addr.set_phone(matches[2]) - self.person.add_address(addr) + state.person.add_address(addr) def func_person_birt(self,matches,state): event = RelLib.Event() @@ -2005,10 +2062,10 @@ class GedcomParser: event_ref.set_reference_handle(event.handle) event_ref.set_role((RelLib.EventRef.PRIMARY,'')) - if self.person.get_birth_ref(): - self.person.add_event_ref(event_ref) + if state.person.get_birth_ref(): + state.person.add_event_ref(event_ref) else: - self.person.set_birth_ref(event_ref) + state.person.set_birth_ref(event_ref) def func_person_adop(self,matches,state): event = RelLib.Event() @@ -2019,7 +2076,7 @@ class GedcomParser: event_ref = RelLib.EventRef() event_ref.set_reference_handle(event.handle) event_ref.set_rol((RelLib.EventRef.PRIMARY,'')) - self.person.add_event_ref(event_ref) + state.person.add_event_ref(event_ref) def func_person_deat(self,matches,state): event = RelLib.Event() @@ -2034,32 +2091,32 @@ class GedcomParser: event_ref.set_reference_handle(event.handle) event_ref.set_role((RelLib.EventRef.PRIMARY,'')) - if self.person.get_death_ref(): - self.person.add_event_ref(event_ref) + if state.person.get_death_ref(): + state.person.add_event_ref(event_ref) else: - self.person.set_death_ref(event_ref) + state.person.set_death_ref(event_ref) def func_person_even(self,matches,state): event = RelLib.Event() if matches[2]: event.set_description(matches[2]) self.parse_person_event(event,2) - n = event.get_name().strip() - if n in self.attrs: + (t,n) = event.get_type() + if t == RelLib.Event.CUSTOM and n in self.attrs: attr = RelLib.Attribute() attr.set_type((self.gedattr[n],'')) attr.set_value(event.get_description()) - self.person.add_attribute(attr) + state.person.add_attribute(attr) else: self.db.add_event(event, self.trans) event_ref = RelLib.EventRef() event_ref.set_reference_handle(event.handle) event_ref.set_role((RelLib.EventRef.PRIMARY,'')) - self.person.add_event_ref(event_ref) + state.person.add_event_ref(event_ref) def func_person_sour(self,matches,state): source_ref = self.handle_source(matches,2) - self.person.add_source_reference(source_ref) + state.person.add_source_reference(source_ref) def func_person_refn(self,matches,state): if intRE.match(matches[2]): @@ -2072,7 +2129,7 @@ class GedcomParser: attr = RelLib.Attribute() attr.set_type(matches[1]) attr.set_value(matches[2]) - self.person.add_attribute(attr) + state.person.add_attribute(attr) def func_person_event(self,matches,state): n = matches[3].strip() @@ -2080,7 +2137,7 @@ class GedcomParser: attr = RelLib.Attribute() attr.set_type((self.gedattr[n],'')) attr.set_value(matches[2]) - self.person.add_attribute(attr) + state.person.add_attribute(attr) self.parse_person_attr(attr,2) return elif ged2gramps.has_key(n): @@ -2089,7 +2146,6 @@ class GedcomParser: else: event = RelLib.Event() val = self.gedsource.tag2gramps(n) - print n, val if val: event.set_type((RelLib.Event.CUSTOM,val)) else: @@ -2103,7 +2159,7 @@ class GedcomParser: event_ref = RelLib.EventRef() event_ref.set_reference_handle(event.get_handle()) event_ref.set_role((RelLib.EventRef.PRIMARY,'')) - self.person.add_event_ref(event_ref) + state.person.add_event_ref(event_ref) #------------------------------------------------------------------------- # diff --git a/gramps2/src/Makefile.am b/gramps2/src/Makefile.am index edb7d0288..c304e57a7 100644 --- a/gramps2/src/Makefile.am +++ b/gramps2/src/Makefile.am @@ -74,7 +74,7 @@ gdir_PYTHON = \ NoteEdit.py\ PaperMenu.py\ PedView.py\ - PeopleView.py\ + PersonView.py\ PeopleModel.py\ PlaceView.py\ Plugins.py\ diff --git a/gramps2/src/PeopleView.py b/gramps2/src/PeopleView.py deleted file mode 100644 index 391df02e4..000000000 --- a/gramps2/src/PeopleView.py +++ /dev/null @@ -1,419 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Gramps - a GTK+/GNOME based genealogy program -# -# Copyright (C) 2000-2003 Donald N. Allingham -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -# $Id$ - - -#------------------------------------------------------------------------ -# -# standard python modules -# -#------------------------------------------------------------------------ -import cPickle as pickle -#------------------------------------------------------------------------- -# -# internationalization -# -#------------------------------------------------------------------------- -from gettext import gettext as _ - -#------------------------------------------------------------------------- -# -# gtk -# -#------------------------------------------------------------------------- -import gtk -import gtk.glade - -from gtk.gdk import ACTION_COPY, BUTTON1_MASK - -#------------------------------------------------------------------------- -# -# gtk -# -#------------------------------------------------------------------------- -import PeopleModel -import GenericFilter -import NameDisplay -from DdTargets import DdTargets - -column_names = [ - _('Name'), - _('ID') , - _('Gender'), - _('Birth Date'), - _('Birth Place'), - _('Death Date'), - _('Death Place'), - _('Spouse'), - _('Last Change'), - _('Cause of death'), - ] - -#------------------------------------------------------------------------- -# -# PeopleView -# -#------------------------------------------------------------------------- -class PeopleView: - - def __init__(self,parent): - self.parent = parent - - self.parent.connect('database-changed',self.change_db) - self.parent.connect('active-changed',self.change_db) - - all = GenericFilter.GenericFilter() - all.set_name(_("Entire Database")) - all.add_rule(GenericFilter.Everyone([])) - - self.DataFilter = None - self.pscroll = self.parent.gtop.get_widget("pscroll") - self.person_tree = self.parent.gtop.get_widget("person_tree") - self.person_tree.set_rules_hint(True) - self.renderer = gtk.CellRendererText() - self.inactive = False - - self.columns = [] - self.build_columns() - self.person_selection = self.person_tree.get_selection() - self.person_selection.set_mode(gtk.SELECTION_MULTIPLE) - self.person_selection.connect('changed',self.row_changed) - self.person_tree.connect('row_activated', self.alpha_event) - self.person_tree.connect('button-press-event', - self.on_plist_button_press) - - # - # DnD support - # - self.person_tree.connect('drag_data_get', self.person_drag_data_get) - - def person_drag_data_get(self, widget, context, sel_data, info, time): - selected_ids = self.get_selected_objects() - - if len(selected_ids) == 1: - sel_data.set(sel_data.target, 8, selected_ids[0]) - elif len(selected_ids) > 1: - sel_data.set(DdTargets.PERSON_LINK_LIST.drag_type,8, - pickle.dumps(selected_ids)) - - def set_dnd_target(self,obj): - selected_ids = self.get_selected_objects() - - if len(selected_ids) == 1: - self.person_tree.drag_source_set( - BUTTON1_MASK, [DdTargets.PERSON_LINK.target()], ACTION_COPY) - elif len(selected_ids) > 1: - self.person_tree.drag_source_set( - BUTTON1_MASK, [DdTargets.PERSON_LINK_LIST.target()], ACTION_COPY) - - def sort_clicked(self,obj): - for col in self.columns: - if obj == col: - if col.get_sort_indicator(): - if col.get_sort_order() == gtk.SORT_ASCENDING: - col.set_sort_order(gtk.SORT_DESCENDING) - else: - col.set_sort_order(gtk.SORT_ASCENDING) - else: - col.set_sort_order(gtk.SORT_ASCENDING) - col.set_sort_indicator(True) - else: - col.set_sort_indicator(False) - - def build_columns(self): - for column in self.columns: - self.person_tree.remove_column(column) - - column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0) - column.set_resizable(True) - column.set_min_width(225) - column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - self.person_tree.append_column(column) - self.columns = [column] - - index = 1 - for pair in self.parent.db.get_person_column_order(): - if not pair[0]: - continue - name = column_names[pair[1]] - column = gtk.TreeViewColumn(name, self.renderer, markup=pair[1]) - column.set_resizable(True) - column.set_min_width(60) - column.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY) - self.columns.append(column) - self.person_tree.append_column(column) - index += 1 - - def build_tree(self): - self.person_model = PeopleModel.PeopleModel( - self.parent.db,self.DataFilter, - self.parent.filter_invert.get_active()) - self.person_tree.set_model(self.person_model) - - def get_selected_objects(self): - (mode,paths) = self.person_selection.get_selected_rows() - mlist = [] - for path in paths: - node = self.person_model.on_get_iter(path) - mlist.append(self.person_model.on_get_value(node, PeopleModel.COLUMN_INT_ID)) - return mlist - - def row_changed(self,obj): - """Called with a row is changed. Check the selected objects from - the person_tree to get the IDs of the selected objects. Set the - active person to the first person in the list. If no one is - selected, set the active person to None""" - - selected_ids = self.get_selected_objects() - try: - person = self.parent.db.get_person_from_handle(selected_ids[0]) - self.parent.change_active_person(person) - except: - self.parent.change_active_person(None) - - if len(selected_ids) == 1: - self.person_tree.drag_source_set(BUTTON1_MASK, - [DdTargets.PERSON_LINK.target()], - ACTION_COPY) - elif len(selected_ids) > 1: - self.person_tree.drag_source_set(BUTTON1_MASK, - [DdTargets.PERSON_LINK_LIST.target()], - ACTION_COPY) - - def change_db(self,db): - self.build_columns() - db.connect('person-add', self.person_added) - db.connect('person-update', self.person_updated) - db.connect('person-delete', self.person_removed) - db.connect('person-rebuild', self.redisplay_person_list) - self.apply_filter() - - def remove_from_person_list(self,person): - """Remove the selected person from the list. A person object is - expected, not an ID""" - path = self.person_model.on_get_path(person.get_handle()) - #self.person_model.row_deleted(path) - (col,row) = path - if row > 0: - self.person_selection.select_path((col,row-1)) - elif row == 0 and self.person_model.on_get_iter(path): - self.person_selection.select_path(path) - - def remove_from_history(self,person_handle,old_id=None): - """Removes a person from the history list""" - if old_id: - del_id = old_id - else: - del_id = person_handle - - hc = self.parent.history.count(del_id) - for c in range(hc): - self.parent.history.remove(del_id) - self.parent.hindex -= 1 - - mhc = self.parent.mhistory.count(del_id) - for c in range(mhc): - self.parent.mhistory.remove(del_id) - - def apply_filter_clicked(self): - index = self.parent.filter_list.get_active() - self.DataFilter = self.parent.filter_model.get_filter(index) - if self.DataFilter.need_param: - qual = unicode(self.parent.filter_text.get_text()) - self.DataFilter.set_parameter(qual) - self.apply_filter() - self.goto_active_person() - - def goto_active_person(self,obj=None): - if not self.state.active or self.inactive: - return - self.inactive = True - p = self.state.active - try: - path = self.person_model.on_get_path(p.get_handle()) - group_name = NameDisplay.displayer.name_grouping(self.state.db,p) - top_name = self.state.db.get_name_group_mapping(group_name) - top_path = self.person_model.on_get_path(top_name) - self.person_tree.expand_row(top_path,0) - - current = self.person_model.on_get_iter(path) - selected = self.person_selection.path_is_selected(path) - if current != p.get_handle() or not selected: - self.person_selection.unselect_all() - self.person_selection.select_path(path) - self.person_tree.scroll_to_cell(path,None,1,0.5,0) - except KeyError: - self.person_selection.unselect_all() - print "Person not currently available due to filter" - self.state.active = p - self.inactive = False - - def alpha_event(self,*obj): - self.parent.load_person(self.parent.active_person) - - def apply_filter(self,current_model=None): - self.parent.status_text(_('Updating display...')) - self.build_tree() - self.parent.modify_statusbar() - - def on_plist_button_press(self,obj,event): - if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: - self.build_people_context_menu(event) - - def build_people_context_menu(self,event): - """Builds the menu with navigation and - editing operations on the people's list""" - - back_sensitivity = self.parent.hindex > 0 - fwd_sensitivity = self.parent.hindex + 1 < len(self.parent.history) - mlist = self.get_selected_objects() - if mlist: - sel_sensitivity = True - else: - sel_sensitivity = False - merge_sensitivity = len(mlist) == 2 - entries = [ - (gtk.STOCK_GO_BACK,self.parent.back_clicked,back_sensitivity), - (gtk.STOCK_GO_FORWARD,self.parent.fwd_clicked,fwd_sensitivity), - (_("Home"),self.parent.on_home_clicked,1), - (_("Add Bookmark"),self.parent.on_add_bookmark_activate,sel_sensitivity), - (None,None,0), - (gtk.STOCK_ADD, self.parent.add_button_clicked,1), - (gtk.STOCK_REMOVE, self.parent.remove_button_clicked,sel_sensitivity), - (_("Edit"), self.parent.edit_button_clicked,sel_sensitivity), - #(None,None,0), - #(_("Compare and Merge"), self.parent.on_merge_activate, - # merge_sensitivity), - #(_("Fast Merge"), self.parent.on_fast_merge_activate, - # merge_sensitivity), - ] - - menu = gtk.Menu() - menu.set_title(_('People Menu')) - for stock_id,callback,sensitivity in entries: - item = gtk.ImageMenuItem(stock_id) - #FIXME: remove when German gtk translation is fixed - if stock_id == _("Home"): - im = gtk.image_new_from_stock(gtk.STOCK_HOME,gtk.ICON_SIZE_MENU) - im.show() - item.set_image(im) - if callback: - item.connect("activate",callback) - item.set_sensitive(sensitivity) - item.show() - menu.append(item) - menu.popup(None,None,None,event.button,event.time) - - def redisplay_person_list(self): - self.build_tree() - - def person_added(self,handle_list): - for node in handle_list: - person = self.parent.db.get_person_from_handle(node) - top = NameDisplay.displayer.name_grouping(self.parent.db,person) - self.person_model.rebuild_data(self.DataFilter) - if not self.person_model.is_visable(node): - continue - if (not self.person_model.sname_sub.has_key(top) or - len(self.person_model.sname_sub[top]) == 1): - path = self.person_model.on_get_path(top) - pnode = self.person_model.get_iter(path) - self.person_model.row_inserted(path,pnode) - path = self.person_model.on_get_path(node) - pnode = self.person_model.get_iter(path) - self.person_model.row_inserted(path,pnode) - - def person_removed(self,handle_list): - for node in handle_list: - person = self.parent.db.get_person_from_handle(node) - if not self.person_model.is_visable(node): - continue - top = NameDisplay.displayer.name_grouping(self.parent.db,person) - mylist = self.person_model.sname_sub.get(top,[]) - if mylist: - try: - path = self.person_model.on_get_path(node) - self.person_model.row_deleted(path) - if len(mylist) == 1: - path = self.person_model.on_get_path(top) - self.person_model.row_deleted(path) - except KeyError: - pass - self.person_model.rebuild_data(self.DataFilter,skip=node) - - def person_updated(self,handle_list): - for node in handle_list: - person = self.parent.db.get_person_from_handle(node) - try: - oldpath = self.person_model.iter2path[node] - except: - return - pathval = self.person_model.on_get_path(node) - pnode = self.person_model.get_iter(pathval) - - # calculate the new data - - surname = NameDisplay.displayer.name_grouping(self.parent.db,person) - - if oldpath[0] == surname: - self.person_model.build_sub_entry(surname) - else: - self.person_model.calculate_data(self.DataFilter) - - # find the path of the person in the new data build - newpath = self.person_model.temp_iter2path[node] - - # if paths same, just issue row changed signal - - if oldpath == newpath: - self.person_model.row_changed(pathval,pnode) - else: - # paths different, get the new surname list - - mylist = self.person_model.temp_sname_sub.get(oldpath[0],[]) - path = self.person_model.on_get_path(node) - - # delete original - self.person_model.row_deleted(pathval) - - # delete top node of original if necessar - if len(mylist)==0: - self.person_model.row_deleted(pathval[0]) - - # determine if we need to insert a new top node', - insert = not self.person_model.sname_sub.has_key(newpath[0]) - - # assign new data - self.person_model.assign_data() - - # insert new row if needed - if insert: - path = self.person_model.on_get_path(newpath[0]) - pnode = self.person_model.get_iter(path) - self.person_model.row_inserted(path,pnode) - - # insert new person - path = self.person_model.on_get_path(node) - pnode = self.person_model.get_iter(path) - self.person_model.row_inserted(path,pnode) - - self.goto_active_person() diff --git a/gramps2/src/PersonView.py b/gramps2/src/PersonView.py index 6c4c1540b..9607a0367 100644 --- a/gramps2/src/PersonView.py +++ b/gramps2/src/PersonView.py @@ -35,6 +35,7 @@ from gettext import gettext as _ # #------------------------------------------------------------------------- import gtk +import pango from gtk.gdk import ACTION_COPY, BUTTON1_MASK #------------------------------------------------------------------------- @@ -145,6 +146,7 @@ class PersonView(PageView.PersonNavView): self.vbox.pack_start(scrollwindow,True) self.renderer = gtk.CellRendererText() + self.renderer.set_property('ellipsize',pango.ELLIPSIZE_END) self.inactive = False self.columns = []