From b7577dc19a0db6bb537d6c46ae828a79f839be08 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Sun, 5 Feb 2006 05:19:51 +0000 Subject: [PATCH] * src/ChooseParents.py: removed * src/ListBox.py: removed svn: r5885 --- ChangeLog | 2 + src/ChooseParents.py | 876 ---------------- src/DisplayTabs.py | 6 +- src/EditPerson.py | 39 +- src/EditPlace.py | 16 +- src/EventEdit.py | 58 +- src/ImageSelect.py | 12 +- src/ListBox.py | 628 ------------ src/Sources.py | 277 ----- src/gramps.glade | 2333 +++++------------------------------------- 10 files changed, 331 insertions(+), 3916 deletions(-) delete mode 100644 src/ChooseParents.py delete mode 100644 src/ListBox.py diff --git a/ChangeLog b/ChangeLog index 3f1aac618..160ff8237 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ 2006-02-04 Don Allingham + * src/ChooseParents.py: removed + * src/ListBox.py: removed * src/TransTable.py: removed * src/AddSpouse.py: removed * src/Marriage.py: removed diff --git a/src/ChooseParents.py b/src/ChooseParents.py deleted file mode 100644 index 5b6887b6e..000000000 --- a/src/ChooseParents.py +++ /dev/null @@ -1,876 +0,0 @@ -# -# Gramps - a GTK+/GNOME based genealogy program -# -# Copyright (C) 2000-2006 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$ - -""" -ChooseParents interface allows users to select the paretns of an -individual. -""" - -__author__ = "Donald N. Allingham" -__version__ = "$Revision$" - -#------------------------------------------------------------------------- -# -# internationalization -# -#------------------------------------------------------------------------- -from gettext import gettext as _ -import gc - -#------------------------------------------------------------------------- -# -# Python modules -# -#------------------------------------------------------------------------- -import logging -log = logging.getLogger(".") - -#------------------------------------------------------------------------- -# -# GTK/Gnome modules -# -#------------------------------------------------------------------------- -import gtk.glade -import gtk.gdk -import gobject - -#------------------------------------------------------------------------- -# -# gramps modules -# -#------------------------------------------------------------------------- -import GrampsDisplay -import RelLib -import const -import Utils -import PeopleModel -import NameDisplay -import DateHandler -import GenericFilter -import AutoComp -from QuestionDialog import ErrorDialog, WarningDialog -from WindowUtils import GladeIf - -#------------------------------------------------------------------------- -# -# Constants -# -#------------------------------------------------------------------------- -UNKNOWN_REL = (RelLib.Person.CHILD_UNKNOWN, - Utils.child_relations[RelLib.Person.CHILD_UNKNOWN]) -BIRTH_REL = (RelLib.Person.CHILD_BIRTH, - Utils.child_relations[RelLib.Person.CHILD_BIRTH]) -MARRIED_REL = (RelLib.Family.MARRIED, - Utils.family_relations[RelLib.Family.MARRIED]) -FAM_UNKNOWN_REL = (RelLib.Family.UNKNOWN, - Utils.family_relations[RelLib.Family.UNKNOWN]) -CIVIL_UNION_REL = (RelLib.Family.CIVIL_UNION, - Utils.family_relations[RelLib.Family.CIVIL_UNION]) - -#------------------------------------------------------------------------- -# -# ChooseParents -# -#------------------------------------------------------------------------- -class ChooseParents: - """ - Displays the Choose Parents dialog box, allowing the parents - to be edited. - """ - def __init__(self,parent,db,person,family): - """ - Creates a ChoosePerson dialog box. - - db - database associated the person - person - person whose parents we are selecting - family - current family - """ - self.parent = parent - self.db = db - self.child_windows = {} - self.person = self.db.get_person_from_handle(person.get_handle()) - if family: - self.family = self.db.get_family_from_handle(family.get_handle()) - else: - self.family = None - self.old_type = MARRIED_REL - self.type = MARRIED_REL - self.parent_selected = 0 - self.renderer = gtk.CellRendererText() - - self.sig_keys = [ - db.connect('person-add', self.person_added), - db.connect('person-update', self.redraw), - db.connect('person-delete', self.redraw), - db.connect('person-rebuild', self.redraw_all)] - - # set default filters - self.all_males_filter = GenericFilter.GenericFilter() - self.all_males_filter.add_rule(GenericFilter.IsMale([])) - - self.all_females_filter = GenericFilter.GenericFilter() - self.all_females_filter.add_rule(GenericFilter.IsFemale([])) - - bev = self.db.get_event_from_handle(person.birth_handle) - if bev and bev.date and bev.date.sortval != 0: - self.likely_females_filter = self.build_likely(False) - self.likely_males_filter = self.build_likely(True) - else: - self.likely_males_filter = self.all_males_filter - self.likely_females_filter = self.all_females_filter - - self.father_filter = self.likely_males_filter - self.mother_filter = self.likely_females_filter - - if self.family: - self.father = self.family.get_father_handle() - self.mother = self.family.get_mother_handle() - else: - self.mother = None - self.father = None - - self.glade = gtk.glade.XML(const.gladeFile,"familyDialog","gramps") - self.gladeif = GladeIf(self.glade) - self.window = self.glade.get_widget("familyDialog") - self.flabel = self.glade.get_widget("flabel") - self.mlabel = self.glade.get_widget("mlabel") - self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) - self.mlabel.set_label("%s" % _("Loading...")) - self.flabel.set_label("%s" % _("Loading...")) - - name = NameDisplay.displayer.display(self.person) - self.title_text = _("Choose the Parents of %s") % name - Utils.set_titles(self.window,self.glade.get_widget('title'), - self.title_text,_('Choose Parents')) - - self.mcombo = self.glade.get_widget("mcombo") - self.fcombo = self.glade.get_widget("fcombo") - self.prel = self.glade.get_widget("prel_combo") - self.title = self.glade.get_widget("chooseTitle") - self.father_list = self.glade.get_widget("father_list") - self.mother_list = self.glade.get_widget("mother_list") - self.showallf = self.glade.get_widget('showallf') - self.showallm = self.glade.get_widget('showallm') - self.add_itself_to_menu() - - gobject.idle_add(self.draw_list) - - if gtk.gdk.screen_height() > 700: - self.father_list.set_size_request(-1,150) - self.mother_list.set_size_request(-1,150) - - for (f,mr,fr) in self.person.get_parent_family_handle_list(): - if f == self.family: - mrel = mr - frel = fr - break - else: - mrel = BIRTH_REL - frel = BIRTH_REL - - if self.family: - self.type = self.family.get_relationship() - else: - self.type = MARRIED_REL - - self.prel_selector = AutoComp.StandardCustomSelector( - Utils.family_relations,self.prel, - RelLib.Family.CUSTOM,RelLib.Family.MARRIED) - self.prel_selector.set_values(self.type) - self.redrawm() - - self.gladeif.connect('familyDialog','delete_event', self.on_delete_event) - self.gladeif.connect('button44','clicked', self.close) - self.gladeif.connect('button42','clicked', self.save_parents_clicked) - self.gladeif.connect('button167','clicked', self.on_help_clicked) - self.gladeif.connect('button123','clicked', self.add_parent_clicked) - self.gladeif.connect('showallf','toggled', self.showallf_toggled) - self.gladeif.connect('prel_combo','changed', self.parent_relation_changed) - - self.frel_selector = AutoComp.StandardCustomSelector( - Utils.child_relations,self.fcombo, - RelLib.Person.CHILD_CUSTOM,RelLib.Person.CHILD_BIRTH) - self.mrel_selector = AutoComp.StandardCustomSelector( - Utils.child_relations,self.mcombo, - RelLib.Person.CHILD_CUSTOM,RelLib.Person.CHILD_BIRTH) - - self.frel_selector.set_values(frel) - self.mrel_selector.set_values(mrel) - -# self.keys = const.child_rel_list -# self.build_list(self.mcombo,mrel) -# self.build_list(self.fcombo,frel) - - self.window.show() - - def draw_list(self): - self.build_father_list() - self.build_mother_list() - self.window.window.set_cursor(None) - - def build_likely(self,is_male): - filt = GenericFilter.GenericFilter() - if is_male: - filt.add_rule(LikelyFather([self.person.handle])) - else: - filt.add_rule(LikelyMother([self.person.handle])) - return filt - - def build_likely2(self,is_male): - birth_ref = self.person.get_birth_ref() - - filt = GenericFilter.GenericFilter() - if is_male: - filt.add_rule(GenericFilter.IsMale([])) - else: - filt.add_rule(GenericFilter.IsFemale([])) - - if birth_ref: - birth = self.db.get_event_from_handle(birth_ref.ref) - date_obj = RelLib.Date(birth.get_date_object()) - year = date_obj.get_year() - if year: - date_obj.set_year(year-10) - date_obj.set_modifier(RelLib.Date.MOD_BEFORE) - rule = GenericFilter.HasBirth( - [DateHandler.displayer.display(date_obj),"",""]) - filt.add_rule(rule) - - date_obj = RelLib.Date(birth.get_date_object()) - date_obj.set_year(year-60) - date_obj.set_modifier(RelLib.Date.MOD_AFTER) - rule = GenericFilter.HasBirth( - [DateHandler.displayer.display(date_obj),"",""]) - filt.add_rule(rule) - return filt - - def build_father_list(self): - self.father_selection = self.father_list.get_selection() - self.father_selection.connect('changed',self.father_list_select_row) - self.add_columns(self.father_list) - self.redrawf() - - def build_mother_list(self): - self.mother_selection = self.mother_list.get_selection() - self.mother_selection.connect('changed',self.mother_list_select_row) - self.add_columns(self.mother_list) - self.redrawm() - - def add_columns(self,tree): - - column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0) - column.set_resizable(True) - column.set_clickable(True) - column.set_sort_column_id(0) - - column.set_fixed_width(255) - column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - - tree.append_column(column) - column = gtk.TreeViewColumn(_('ID'), self.renderer,text=1) - column.set_resizable(True) - column.set_clickable(True) - column.set_sort_column_id(1) - - column.set_fixed_width(75) - column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - #column.set_min_width(75) - - tree.append_column(column) - column = gtk.TreeViewColumn(_('Birth date'), self.renderer,text=3) - #column.set_resizable(True) - column.set_clickable(True) - column.set_fixed_width(150) - column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) - - tree.append_column(column) - - def on_delete_event(self,obj,b): - self.gladeif.close() - self.remove_itself_from_menu() - self.close_child_windows() - gc.collect() - - def close(self,obj): - self.gladeif.close() - self.remove_itself_from_menu() - self.close_child_windows() - self.window.destroy() - gc.collect() - - def close_child_windows(self): - for child_window in self.child_windows.values(): - child_window.close() - self.child_windows = {} - - def add_itself_to_menu(self): - self.parent.child_windows[self] = self - self.win_menu_item = gtk.MenuItem(self.title_text) - self.win_menu_item.set_submenu(gtk.Menu()) - self.win_menu_item.show() - self.parent.winsmenu.append(self.win_menu_item) - self.winsmenu = self.win_menu_item.get_submenu() - self.menu_item = gtk.MenuItem(_('Choose Parents')) - self.menu_item.connect("activate",self.present) - self.menu_item.show() - self.winsmenu.append(self.menu_item) - - def remove_itself_from_menu(self): - del self.parent.child_windows[self] - self.menu_item.destroy() - self.winsmenu.destroy() - self.win_menu_item.destroy() - - def present(self,obj): - self.window.present() - - def on_help_clicked(self,obj): - """Display the relevant portion of GRAMPS manual""" - GrampsDisplay.help('gramps-edit-quick') - - def person_added(self,handle_list): - update_father = False - update_mother = False - - for handle in handle_list: - person = self.db.get_person_from_handle(handle) - if person.get_gender() == RelLib.Person.MALE: - update_father = True - elif person.get_gender() == RelLib.Person.FEMALE: - update_mother = True - - if update_father: - self.person_added_base(handle_list,self.father_model, - self.father_filter) - if update_mother: - self.person_added_base(handle_list,self.mother_model, - self.mother_filter) - - def person_added_base(self,handle_list,model,data_filter): - for node in handle_list: - person = self.db.get_person_from_handle(node) - top = person.get_primary_name().get_group_name() - model.rebuild_data(data_filter) - if not model.is_visable(node): - continue - if (not model.sname_sub.has_key(top) or - len(model.sname_sub[top]) == 1): - path = model.on_get_path(top) - pnode = model.get_iter(path) - model.row_inserted(path,pnode) - path = model.on_get_path(node) - pnode = model.get_iter(path) - model.row_inserted(path,pnode) - - def redraw(self,handle_list): - self.redrawf() - self.redrawm() - - def redraw_all(self): - self.redrawf() - self.redrawm() - - def redrawf(self): - """Redraws the potential father list""" - self.father_model = PeopleModel.PeopleModel(self.db,self.father_filter) - self.father_list.set_model(self.father_model) - - if self.type[0] == RelLib.Family.CIVIL_UNION: - self.flabel.set_label("%s" % _("Par_ent")) - else: - self.flabel.set_label("%s" % _("Fath_er")) - - def redrawm(self): - """Redraws the potential mother list""" - self.mother_model = PeopleModel.PeopleModel(self.db,self.mother_filter) - - self.mother_list.set_model(self.mother_model) - if self.type[0] == RelLib.Family.CIVIL_UNION: - self.mlabel.set_label("%s" % _("Pa_rent")) - else: - self.mlabel.set_label("%s" % _("Mothe_r")) - - def parent_relation_changed(self,obj): - """Called everytime the parent relationship information is changed""" - self.old_type = self.type - self.type = self.prel_selector.get_values() - if (self.old_type[0] == RelLib.Family.CIVIL_UNION or - self.type[0] == RelLib.Family.CIVIL_UNION): - self.redrawf() - self.redrawm() - - def showallf_toggled(self,obj): - if self.father_filter == self.likely_males_filter: - self.father_filter = self.all_males_filter - else: - self.father_filter = self.likely_males_filter - self.redrawf() - - def showallm_toggled(self,obj): - if self.mother_filter == self.likely_females_filter: - self.mother_filter = self.all_females_filter - else: - self.mother_filter = self.likely_females_filter - self.redrawm() - - def find_family(self,father_handle,mother_handle): - """ - Finds the family associated with the father and mother. - If one does not exist, it is created. - """ - if not father_handle and not mother_handle: - return None - - for family_handle in self.db.get_family_handles(): - family = self.db.get_family_from_handle(family_handle) - if (family.get_father_handle() == father_handle and - family.get_mother_handle() == mother_handle): - family.add_child_handle(self.person.get_handle()) - return family - elif (family.get_father_handle() == mother_handle and - family.get_mother_handle() == father_handle): - family.add_child_handle(self.person.get_handle()) - return family - - family = RelLib.Family() - family.set_father_handle(father_handle) - family.set_mother_handle(mother_handle) - family.add_child_handle(self.person.get_handle()) - family.set_handle(self.db.create_id()) - family.set_gramps_id(self.db.find_next_family_gramps_id()) - - if father_handle: - self.father = self.db.get_person_from_handle(father_handle) - self.father.add_family_handle(family.get_handle()) - if mother_handle: - self.mother = self.db.get_person_from_handle(mother_handle) - self.mother.add_family_handle(family.get_handle()) - return family - - def father_select_function(self,store,path,iter,id_list): - if len(path) != 1: - val = self.father_model.get_value(iter,PeopleModel.COLUMN_INT_ID) - id_list.append(val) - - def mother_select_function(self,store,path,iter,id_list): - if len(path) != 1: - val = self.mother_model.get_value(iter,PeopleModel.COLUMN_INT_ID) - id_list.append(val) - - def get_selected_father_handles(self): - mlist = [] - self.father_selection.selected_foreach(self.father_select_function, - mlist) - return mlist - - def get_selected_mother_handles(self): - mlist = [] - self.mother_selection.selected_foreach(self.mother_select_function, - mlist) - return mlist - - def father_list_select_row(self,obj): - """Called when a row is selected in the father list. Sets the - active father based off the id associated with the row.""" - - idlist = self.get_selected_father_handles() - if idlist and idlist[0]: - self.father = self.db.get_person_from_handle(idlist[0]) - else: - self.father = None - - if not self.parent_selected and self.father: - self.parent_selected = 1 - family_handle_list = self.father.get_family_handle_list() - if len(family_handle_list) >= 1: - family = self.db.get_family_from_handle(family_handle_list[0]) - handle = family.get_mother_handle() - mother = self.db.get_person_from_handle(handle) - sname = mother.get_primary_name().get_surname() - tpath = self.mother_model.on_get_path(sname) - self.mother_list.expand_row(tpath,0) - path = self.mother_model.on_get_path(handle) - self.mother_selection.select_path(path) - self.mother_list.scroll_to_cell(path,None,1,0.5,0) - - def mother_list_select_row(self,obj): - """Called when a row is selected in the father list. Sets the - active father based off the id associated with the row.""" - - idlist = self.get_selected_mother_handles() - if idlist and idlist[0]: - self.mother = self.db.get_person_from_handle(idlist[0]) - else: - self.mother = None - - if not self.parent_selected and self.mother: - self.parent_selected = 1 - family_handle_list = self.mother.get_family_handle_list() - if len(family_handle_list) >= 1: - family = self.db.get_family_from_handle(family_handle_list[0]) - handle = family.get_father_handle() - father = self.db.get_person_from_handle(handle) - sname = father.get_primary_name().get_surname() - tpath = self.father_model.on_get_path(sname) - self.father_list.expand_row(tpath,0) - path = self.father_model.on_get_path(handle) - self.father_selection.select_path(path) - self.father_list.scroll_to_cell(path,None,1,0.5,0) - - def save_parents_clicked(self,obj): - """ - Called with the OK button is pressed. Saves the selected people - as parents of the main person. - """ - - for key in self.sig_keys: - self.db.disconnect(key) - - try: - mother_rel = self.mrel_selector.get_values() - except KeyError: - mother_rel = BIRTH_REL - - try: - father_rel = self.frel_selector.get_values() - except KeyError: - father_rel = BIRTH_REL - - trans = self.db.transaction_begin() - father_handle = None - mother_handle = None - if self.father or self.mother: - if self.mother and not self.father: - if self.mother.get_gender() == RelLib.Person.MALE: - self.father = self.mother - father_handle = self.father.get_handle() - self.mother = None - else: - mother_handle = self.mother.get_handle() - elif self.father and not self.mother: - if self.father.get_gender() == RelLib.Person.FEMALE: - self.mother = self.father - self.father = None - mother_handle = self.mother.get_handle() - else: - father_handle = self.father.get_handle() - elif self.mother.get_gender() != self.father.get_gender(): - if self.type[0] == RelLib.Family.CIVIL_UNION: - self.type = FAM_UNKNOWN_REL - if self.father.get_gender() == RelLib.Person.FEMALE: - self.father, self.mother = self.mother, self.father - father_handle = self.father.get_handle() - mother_handle = self.mother.get_handle() - else: - self.type = CIVIL_UNION_REL - father_handle = self.father.get_handle() - mother_handle = self.mother.get_handle() - - if self.person.get_handle() in (father_handle,mother_handle): - ErrorDialog(_("Error selecting a child"), - _("A person cannot be linked as his/her own parent"), - self.window) - return - - if father_handle or mother_handle: - self.family = self.find_family(father_handle,mother_handle) - self.family.add_child_handle(self.person.get_handle()) - self.family.set_relationship(self.type) - self.change_family_type(self.family,mother_rel,father_rel,trans) - self.db.commit_person(self.person,trans) - if self.father: - self.db.commit_person(self.father,trans) - if self.mother: - self.db.commit_person(self.mother,trans) - self.db.commit_family(self.family,trans) - else: - self.family = None - self.db.transaction_commit(trans,_("Choose Parents")) - self.close(None) - - def add_new_parent(self,epo,val): - """Adds a new person to either the father list or the mother list, - depending on the gender of the person.""" - - person = epo.person - handle = person.get_handle() - name = person.get_primary_name().get_surname() - self.type = self.prel_selector.get_values() - - if self.type[0] == RelLib.Family.CIVIL_UNION: - self.parent_relation_changed(self.prel) - elif person.get_gender() == RelLib.Person.MALE: - try: - path = self.father_model.on_get_path(handle) - top_path = self.father_model.on_get_path(name) - self.father_list.expand_row(top_path,0) - self.father_selection.select_path(path) - self.father_list.scroll_to_cell(path,None,1,0.5,0) - except KeyError: - self.father_filter = self.all_males_filter - self.redrawf() - path = self.father_model.on_get_path(handle) - top_path = self.father_model.on_get_path(name) - self.father_list.expand_row(top_path,0) - self.father_selection.select_path(path) - self.father_list.scroll_to_cell(path,None,1,0.5,0) - else: - try: - path = self.mother_model.on_get_path(handle) - top_path = self.mother_model.on_get_path(name) - self.mother_list.expand_row(top_path,0) - self.mother_selection.select_path(path) - self.mother_list.scroll_to_cell(path,None,1,0.5,0) - except: - self.mother_filter = self.all_females_filter - self.redrawm() - path = self.mother_model.on_get_path(handle) - top_path = self.mother_model.on_get_path(name) - self.mother_list.expand_row(top_path,0) - self.mother_selection.select_path(path) - self.mother_list.scroll_to_cell(path,None,1,0.5,0) - - def add_parent_clicked(self,obj): - """Called with the Add New Person button is pressed. Calls the QuickAdd - class to create a new person.""" - - person = RelLib.Person() - person.set_gender(RelLib.Person.UNKNOWN) - - try: - import EditPerson - EditPerson.EditPerson(self, person,self.db,self.add_new_parent) - except: - log.error("Failed to add parent",exc_info=True) - - def change_family_type(self,family,mother_rel,father_rel,trans): - """ - Changes the family type of the specified family. If the family - is None, the the relationship type shoud be deleted. - """ - family_handle = family.get_handle() - if self.person.get_handle() not in family.get_child_handle_list(): - family.add_child_handle(self.person.get_handle()) - for fam in self.person.get_parent_family_handle_list(): - if family_handle == fam[0]: - if mother_rel == fam[1] and father_rel == fam[2]: - return - if mother_rel != fam[1] or father_rel != fam[2]: - self.person.remove_parent_family_handle(family_handle) - self.person.add_parent_family_handle(family_handle, - mother_rel,father_rel) - break - else: - self.person.add_parent_family_handle(family_handle, - mother_rel,father_rel) - -#------------------------------------------------------------------------- -# -# ModifyParents -# -#------------------------------------------------------------------------- -class ModifyParents: - def __init__(self, db, person, family_handle, parent_window=None): - """ - Creates a ChoosePerson dialog box. - - db - database associated the person - person - person whose parents we are selecting - family - current family - """ - self.db = db - self.person = person - self.family = self.db.get_family_from_handle(family_handle) - - fid = self.family.get_father_handle() - mid = self.family.get_mother_handle() - self.father = self.db.get_person_from_handle(fid) - self.mother = self.db.get_person_from_handle(mid) - - self.glade = gtk.glade.XML(const.gladeFile,"modparents","gramps") - self.gladeif = GladeIf(self.glade) - self.window = self.glade.get_widget("modparents") - self.title = self.glade.get_widget("title") - - name = NameDisplay.displayer.display(self.person) - title = _("Modify the Parents of %s") % name - Utils.set_titles(self.window, self.title, title, _("Modify Parents")) - - self.mother_rel = self.glade.get_widget("mrel") - self.father_rel = self.glade.get_widget("frel") - self.flabel = self.glade.get_widget("flabel") - self.mlabel = self.glade.get_widget("mlabel") - self.fcombo = self.glade.get_widget('fcombo') - self.mcombo = self.glade.get_widget('mcombo') - - self.orig_mrel = BIRTH_REL - self.orig_frel = BIRTH_REL - for (f,mr,fr) in self.person.get_parent_family_handle_list(): - if f == self.family.get_handle(): - self.orig_mrel = mr - self.orig_frel = fr - - self.gladeif.connect('button165','clicked', self.on_help_clicked) - - self.title.set_use_markup(True) - - if self.family.get_relationship() == RelLib.Family.CIVIL_UNION: - self.mlabel.set_label("%s" % _("Pa_rent")) - self.flabel.set_label("%s" % _("Par_ent")) - else: - self.mlabel.set_label('%s' % _("Mother")) - self.flabel.set_label('%s' % _("Father")) - - if self.father: - fname = NameDisplay.displayer.display(self.father) - self.glade.get_widget("fname").set_text(fname) - else: - self.fcombo.set_sensitive(False) - - if self.mother: - mname = NameDisplay.displayer.display(self.mother) - self.glade.get_widget("mname").set_text(mname) - else: - self.mcombo.set_sensitive(False) - - self.pref = self.glade.get_widget('preferred') - if len(self.person.get_parent_family_handle_list()) > 1: - self.glade.get_widget('pref_label').show() - self.pref.show() - if self.family == self.person.get_parent_family_handle_list()[0]: - self.pref.set_active(True) - else: - self.pref.set_active(False) - - if parent_window: - self.window.set_transient_for(parent_window) - - if self.db.readonly: - self.fcombo.set_sensitive(False) - self.mcombo.set_sensitive(False) - self.glade.get_widget('ok').set_sensitive(False) - - self.frel_selector = AutoComp.StandardCustomSelector( - Utils.child_relations,self.fcombo, - RelLib.Person.CHILD_CUSTOM,RelLib.Person.CHILD_BIRTH) - self.frel_selector.set_values(self.orig_frel) - - self.mrel_selector = AutoComp.StandardCustomSelector( - Utils.child_relations,self.mcombo, - RelLib.Person.CHILD_CUSTOM,RelLib.Person.CHILD_BIRTH) - self.mrel_selector.set_values(self.orig_mrel) - - self.val = self.window.run() - if self.val == gtk.RESPONSE_OK: - self.save_parents_clicked() - self.gladeif.close() - self.window.destroy() - gc.collect() - - def on_help_clicked(self,obj): - """Display the relevant portion of GRAMPS manual""" - GrampsDisplay.help('gramps-spec-par') - self.val = self.window.run() - - def save_parents_clicked(self): - """ - Called with the OK button nis pressed. Saves the selected people - as parents of the main person. - """ - - mother_rel = self.mrel_selector.get_values() - father_rel = self.frel_selector.get_values() - mod = False - - fhandle = self.family.get_handle() - if mother_rel != self.orig_mrel or father_rel != self.orig_frel: - self.person.remove_parent_family_handle(fhandle) - self.person.add_parent_family_handle(fhandle,mother_rel,father_rel) - mod = True - - if len(self.person.get_parent_family_handle_list()): - make_pref = self.pref.get_active() - - plist = self.person.get_parent_family_handle_list() - if make_pref: - if self.family != plist[0]: - self.person.set_main_parent_family_handle(fhandle) - mod = True - else: - if self.family == plist[0]: - self.person.set_main_parent_family_handle(plist[0]) - mod = True - - if mod: - trans = self.db.transaction_begin() - self.db.commit_person(self.person,trans) - self.db.transaction_commit(trans,_("Modify Parents")) - -#------------------------------------------------------------------------- -# -# Likely Filters -# -#------------------------------------------------------------------------- -class LikelyFilter(GenericFilter.Rule): - - labels = [ 'Person handle' ] - category = _('General filters') - - def __init__(self,data_list,gender): - GenericFilter.Rule.__init__(self,data_list) - self.gender = gender - - def prepare(self,db): - person = db.get_person_from_handle(self.list[0]) - birth = db.get_event_from_handle(person.birth_handle) - dateobj = Date.Date(birth.date) - year = dateobj.get_year() - dateobj.set_year(year-10) - self.lower = dateobj.sortval - dateobj.set_year(year-70) - self.upper = dateobj.sortval - - def apply(self,db,person): - if person.gender != self.gender: - return False - if not person.birth_handle: - return True - event = db.get_event_from_handle(person.birth_handle) - return (event.date == None or event.date.sortval == 0 or - self.lower > event.date.sortval > self.upper) - -class LikelyFather(LikelyFilter): - - name = _('Likely Father') - description = _('Matches likely fathersn') - - def __init__(self,data_list): - LikelyFilter.__init__(self,data_list,RelLib.Person.MALE) - -class LikelyMother(LikelyFilter): - - name = _('Likely Mother') - description = _('Matches likely mothers') - - def __init__(self,data_list): - LikelyFilter.__init__(self,data_list,RelLib.Person.FEMALE) - diff --git a/src/DisplayTabs.py b/src/DisplayTabs.py index 1d6a4c44f..2dda1c578 100644 --- a/src/DisplayTabs.py +++ b/src/DisplayTabs.py @@ -54,6 +54,7 @@ import Utils import GrampsMime import const import ImgManip +import Spell from DdTargets import DdTargets from GrampsWidgets import SimpleButton @@ -937,6 +938,7 @@ class NoteTab(GrampsTab): else: self.flowed.set_active(True) self.text.set_wrap_mode(gtk.WRAP_WORD) + self.spellcheck = Spell.Spell(self.text) self.flowed.connect('toggled',self.flow_changed) @@ -968,7 +970,9 @@ class NoteTab(GrampsTab): def update(self,obj): if self.note_obj: - text = self.buf.get_text(self.buf.get_start_iter(),self.buf.get_end_iter()) + start = self.buf.get_start_iter() + stop = self.buf.get_end_iter() + text = self.buf.get_text(start,stop) self.note_obj.set(text) else: print "NOTE OBJ DOES NOT EXIST" diff --git a/src/EditPerson.py b/src/EditPerson.py index b99f3c80c..7e450c287 100644 --- a/src/EditPerson.py +++ b/src/EditPerson.py @@ -751,46 +751,11 @@ class EditPerson(DisplayState.ManagedWindow): self.pname.set_first_name(unicode(self.given.get_text())) self.pname.set_title(unicode(self.title.get_text())) - NameEdit.NameEditor(self.dbstate, self.uistate, self.track, self.pname, self) + NameEdit.NameEditor(self.dbstate, self.uistate, self.track, + self.pname, self) def update_name(self,name): self.write_primary_name() - -# def on_ldsbap_source_clicked(self,obj): -# Sources.SourceSelector(self.dbstate, self.uistate, self.track, -# self.lds_baptism.get_source_references(), -# self,self.update_ldsbap_list) - -# def update_ldsbap_list(self,list): -# self.lds_baptism.set_source_reference_list(list) - -# def on_ldsbap_note_clicked(self,obj): -# NoteEdit.NoteEditor(self.lds_baptism,self,self.window, -# readonly=self.db.readonly) - -# def on_ldsendow_source_clicked(self,obj): -# Sources.SourceSelector(self.dbstate, self.uistate, self.track, -# self.lds_endowment.get_source_references(), -# self,self.set_ldsendow_list) - -# def set_ldsendow_list(self,list): -# self.lds_endowment.set_source_reference_list(list) - -# def on_ldsendow_note_clicked(self,obj): -# NoteEdit.NoteEditor(self.lds_endowment,self,self.window, -# readonly=self.db.readonly) - -# def on_ldsseal_source_clicked(self,obj): -# Sources.SourceSelector(self.dbstate, self.uistate, self.track, -# self.lds_sealing.get_source_references(), -# self,self.lds_seal_list) - -# def lds_seal_list(self,list): -# self.lds_sealing.set_source_reference_list(list) - -# def on_ldsseal_note_clicked(self,obj): -# NoteEdit.NoteEditor(self.lds_sealing,self,self.window, -# readonly=self.db.readonly) def load_person_image(self): media_list = self.person.get_media_list() diff --git a/src/EditPlace.py b/src/EditPlace.py index 74ecf46a7..598bf498e 100644 --- a/src/EditPlace.py +++ b/src/EditPlace.py @@ -221,14 +221,14 @@ class EditPlace(DisplayState.ManagedWindow): DisplayState.ManagedWindow.__init__(self, uistate, track, place) - self.sourcetab = Sources.SourceTab( - self.dbstate, self.uistate, self.track, - self.srcreflist,self, - self.top,self.window,self.slist, - self.top.get_widget('add_src'), - self.top.get_widget('edit_src'), - self.top.get_widget('del_src'), - self.dbstate.db.readonly) +# self.sourcetab = Sources.SourceTab( +# self.dbstate, self.uistate, self.track, +# self.srcreflist,self, +# self.top,self.window,self.slist, +# self.top.get_widget('add_src'), +# self.top.get_widget('edit_src'), +# self.top.get_widget('del_src'), +# self.dbstate.db.readonly) if self.place.get_handle() == None or self.dbstate.db.readonly: self.top.get_widget("add_photo").set_sensitive(0) diff --git a/src/EventEdit.py b/src/EventEdit.py index 4b84a5dd6..3d633ad60 100644 --- a/src/EventEdit.py +++ b/src/EventEdit.py @@ -206,7 +206,6 @@ class EventEditor(DisplayState.ManagedWindow): """ Creates the notebook tabs and inserts them into the main window. - """ vbox = self.top.get_widget('vbox') self.notebook = gtk.Notebook() @@ -357,7 +356,6 @@ class EventEditor(DisplayState.ManagedWindow): data.union(self.db.get_person_event_types()) return list(data) - #------------------------------------------------------------------------- # # EventRefEditor class @@ -394,31 +392,17 @@ class EventRefEditor(DisplayState.ManagedWindow): self.place_field = self.top.get_widget("eer_place") self.cause_field = self.top.get_widget("eer_cause") - self.slist = self.top.get_widget("eer_slist") - self.wlist = self.top.get_widget("eer_wlist") self.date_field = self.top.get_widget("eer_date") self.descr_field = self.top.get_widget("eer_description") self.ev_note_field = self.top.get_widget("eer_ev_note") self.type_combo = self.top.get_widget("eer_type_combo") self.ev_privacy = self.top.get_widget("eer_ev_priv") - self.sources_label = self.top.get_widget("eer_sources_tab") - self.notes_label = self.top.get_widget("eer_note_tab") self.general_label = self.top.get_widget("eer_general_tab") - self.gallery_label = self.top.get_widget("eer_gallery_tab") - self.witnesses_label = self.top.get_widget("eer_witness_tab") - self.flowed = self.top.get_widget("eer_ev_flowed") - self.preform = self.top.get_widget("eer_ev_preform") self.ok = self.top.get_widget('ok') self.expander = self.top.get_widget("eer_expander") self.warning = self.top.get_widget("eer_warning") + self.notebook = self.top.get_widget('notebook') - add_src = self.top.get_widget('eer_add_src') - del_src = self.top.get_widget('eer_del_src') - - add_witness = self.top.get_widget('eer_add_wit') - edit_witness = self.top.get_widget('eer_edit_wit') - del_witness = self.top.get_widget('eer_del_wit') - Utils.set_titles(self.window, self.top.get_widget('eer_title'), self.title) @@ -476,13 +460,6 @@ class EventRefEditor(DisplayState.ManagedWindow): self.event_ref.set_role((default_role,role_dict[default_role])) self.event_ref.set_reference_handle(self.event.get_handle()) - self.srcreflist = self.event.get_source_references() - self.sourcetab = Sources.SourceTab( - self.state, self.uistate, self.track, - self.srcreflist, self, self.top, self.window, self.slist, - add_src, self.top.get_widget('eer_edit_src'), del_src, - self.db.readonly) - self.date_check = DateEdit.DateEdit(self.date, self.date_field, self.top.get_widget("eer_date_stat"), @@ -505,18 +482,33 @@ class EventRefEditor(DisplayState.ManagedWindow): self.cause_field.set_text(self.event.get_cause()) self.descr_field.set_text(self.event.get_description()) self.ev_privacy.set_active(self.event.get_privacy()) - if self.event.get_note(): - self.ev_note_field.get_buffer().set_text(event.get_note()) - Utils.bold_label(self.notes_label) - if event.get_note_format() == 1: - self.preform.set_active(1) - else: - self.flowed.set_active(1) - if self.event.get_media_list(): - Utils.bold_label(self.gallery_label) + + self._create_tabbed_pages() self.show() + def _add_page(self,page): + self.notebook.insert_page(page) + self.notebook.set_tab_label(page,page.get_tab_widget()) + return page + + def _create_tabbed_pages(self): + """ + Creates the notebook tabs and inserts them into the main + window. + + """ + + self.srcref_list = self._add_page(SourceEmbedList( + self.state,self.uistate, self.track, + self.event.source_list)) + self.note_tab = self._add_page(NoteTab( + self.state, self.uistate, self.track, + self.event.get_note_object())) + self.gallery_tab = self._add_page(GalleryTab( + self.state, self.uistate, self.track, + self.event.get_media_list())) + def build_menu_names(self,eventref): if self.event: if self.event.get_type()[0] == RelLib.Event.CUSTOM: diff --git a/src/ImageSelect.py b/src/ImageSelect.py index f3654295a..d6b89b5c2 100644 --- a/src/ImageSelect.py +++ b/src/ImageSelect.py @@ -138,12 +138,12 @@ class LocalMediaProperties: else: self.srcreflist = [] - self.sourcetab = Sources.SourceTab(self.srcreflist,self, - self.change_dialog, - self.window, self.slist, - self.change_dialog.get_widget('add_src'), - self.change_dialog.get_widget('edit_src'), - self.change_dialog.get_widget('del_src')) +# self.sourcetab = Sources.SourceTab(self.srcreflist,self, +# self.change_dialog, +# self.window, self.slist, +# self.change_dialog.get_widget('add_src'), +# self.change_dialog.get_widget('edit_src'), +# self.change_dialog.get_widget('del_src')) descr_window.set_text(self.obj.get_description()) mtype = self.obj.get_mime_type() diff --git a/src/ListBox.py b/src/ListBox.py deleted file mode 100644 index adbd1d32f..000000000 --- a/src/ListBox.py +++ /dev/null @@ -1,628 +0,0 @@ -# -# Gramps - a GTK+/GNOME based genealogy program -# -# Copyright (C) 2000-2005 Donald N. Allingham -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -# $Id$ - -#------------------------------------------------------------------------- -# -# Standard python modules -# -#------------------------------------------------------------------------- -from gettext import gettext as _ -import cPickle as pickle -from sets import Set -import locale - -#------------------------------------------------------------------------- -# -# GTK/Gnome modules -# -#------------------------------------------------------------------------- -import gtk -import gtk.gdk - -#------------------------------------------------------------------------- -# -# gramps modules -# -#------------------------------------------------------------------------- -from ListModel import ListModel, NOSORT, COMBO, TEXT, TOGGLE -from DdTargets import DdTargets - -import const -import RelLib -import UrlEdit -import NameEdit -import NoteEdit -import AttrEdit -import EventEdit -import AddrEdit -import NameDisplay -import Utils -import DateHandler - -class ListBox: - """ - The ListBox manages the lists contained by the EditPerson or Marriage - dialogs. It manages the add, update, and delete buttons, along with the - handling of inline editing. - - The primary argument is either Person or Family object. - """ - def __init__(self, state, uistate, track, - primary, obj, label, button_list, titles): - self.primary = primary - if self.primary.__class__.__name__ == 'Person': - self.name = NameDisplay.displayer.display(primary) - elif self.primary.__class__.__name__ == 'Family': - self.name = Utils.family_name(primary,state.db) - else: - self.name = "" - self.label = label - self.db = state.db - self.state = state - self.uistate = uistate - self.track = track - self.list_model = ListModel( - obj, titles, self.select_row, self.update) - self.blist = button_list - self.node_map = {} - self.tree = obj - self.changed = False - self.blist[0].connect('clicked',self.add) - self.blist[1].connect('clicked',self.update) - self.blist[2].connect('clicked',self.delete) - if len(self.blist) > 3: - self.blist[3].connect('clicked',self.select) - self.tree.connect('key_press_event', self.keypress) - self.change_list = Set() - - def build_maps(self,custom,string_map): - name_map = {} - val_map = string_map - for key in val_map.keys(): - val = val_map[key] - name_map[val] = key - return (name_map,val_map) - - def keypress(self,obj,event): - if event.keyval == 65379: - print "insert" - - def get_changed_objects(self): - return list(self.change_list) - - def add_object(self,item): - self.data.append(item) - self.change_list.add(item) - - def select_row(self,obj): - store, node = obj.get_selected() - enable = node != None - for button in self.blist[1:3]: - button.set_sensitive(enable) - - def delete(self,obj): - """Delete the selected event""" - if Utils.delete_selected(obj,self.data): - self.changed = True - self.redraw() - - def update(self,obj): - raise NotImplementedError - - def redraw(self): - self.list_model.clear() - self.node_map = {} - for item in self.data: - node = self.list_model.add(self.display_data(item),item) - self.node_map[item] = node - if self.data: - self.list_model.select_row(0) - self.set_label() - - def display_data(self,item): - raise NotImplementedError - - def delete(self,obj): - """Deletes the selected name from the name list""" - store,node = self.list_model.get_selected() - if node: - self.data.remove(self.list_model.get_object(node)) - self.list_model.remove(node) - self.changed = True - self.redraw() - - def edit_callback(self,data): - self.changed = True - self.change_list.add(data) - if data not in self.data: - self.data.append(data) - self.redraw() - try: - self.list_model.select_iter(self.node_map[data]) - except: - print "Edit callback failed" - - def set_label(self): - if self.data: - self.list_model.select_row(0) - Utils.bold_label(self.label) - self.blist[1].set_sensitive(True) - self.blist[2].set_sensitive(True) - else: - Utils.unbold_label(self.label) - self.blist[1].set_sensitive(False) - self.blist[2].set_sensitive(False) - -class ReorderListBox(ListBox): - - def __init__(self,state,uistate,track, - primary,obj,label,button_list,evalues, dnd_type): - - ListBox.__init__(self,state,uistate,track, - primary,obj,label,button_list,evalues) - - self.dnd_type = dnd_type - - obj.drag_dest_set(gtk.DEST_DEFAULT_ALL, [dnd_type.target()], - gtk.gdk.ACTION_COPY) - obj.drag_source_set(gtk.gdk.BUTTON1_MASK, [dnd_type.target()], - gtk.gdk.ACTION_COPY) - obj.connect('drag_data_get', self.drag_data_get) - obj.connect('drag_data_received',self.drag_data_received) - - def drag_data_get(self,widget, context, sel_data, info, time): - node = self.list_model.get_selected_objects() - - bits_per = 8; # we're going to pass a string - pickled = pickle.dumps(node[0]); - data = str((self.dnd_type.drag_type, self.primary.get_handle(), pickled)); - sel_data.set(sel_data.target, bits_per, data) - - def unpickle(self, data): - self.data.insert(pickle.loads(data)) - - def drag_data_received(self,widget,context,x,y,sel_data,info,time): - row = self.list_model.get_row_at(x,y) - - if sel_data and sel_data.data: - exec 'data = %s' % sel_data.data - exec 'mytype = "%s"' % data[0] - exec 'primary = "%s"' % data[1] - if mytype != self.dnd_type.drag_type: - return - elif primary == self.primary.get_handle(): - self.move_element(self.list_model.get_selected_row(),row) - else: - self.unpickle(data[2]) - self.changed = True - self.redraw() - - def move_element(self,src,dest): - if src != -1: - obj = self.data[src] - self.data.remove(obj) - self.data.insert(dest,obj) - -class AttrListBox(ReorderListBox): - - def __init__(self, state, uistate, track, - primary, obj, label, button_list): - - if primary.__class__.__name__ == 'Person': - self.attr_dict = Utils.personal_attributes - elif primary.__class__.__name__ == 'Family': - self.attr_dict = Utils.family_attributes - - custom_str = self.attr_dict[RelLib.Attribute.CUSTOM] - attrlist = filter(lambda x: x != custom_str, - self.attr_dict.values()) - attrlist.sort(locale.strcoll) - - titles = [ - # Title Sort Col, Size, Type - (_('Attribute'), NOSORT, 200, COMBO, attrlist, self.set_type), - (_('Value'), NOSORT, 350, TEXT, None, self.set_value), - (_('Source'), NOSORT, 50, TOGGLE, None, None), - (_('Note'), NOSORT, 50, TOGGLE, None, None), - ] - - self.data = primary.get_attribute_list()[:] - ListBox.__init__(self, state, uistate, track, - primary, obj, label, - button_list, titles) - - self.attr_name_map,self.attr_val_map = self.build_maps( - RelLib.Attribute.CUSTOM,self.attr_dict) - - def set_type(self,index,value): - val = self.attr_name_map.get(value,RelLib.Attribute.CUSTOM) - if val == RelLib.Attribute.CUSTOM: - self.data[index].set_type((val,value)) - else: - self.data[index].set_type((val,self.attr_val_map[val])) - self.change_list.add(self.data[index]) - - def set_value(self,index,value): - self.data[index].set_value(value) - - def add(self,obj): - """Brings up the AttributeEditor for a new attribute""" - AttrEdit.AttributeEditor(self.state, self.uistate, self.track, - None, self.name, self.attr_dict, - self.edit_callback) - - def update(self,obj): - store,node = self.list_model.get_selected() - if node: - attr = self.list_model.get_object(node) - AttrEdit.AttributeEditor(self.state, self.uistate, self.track, - attr, self.name, self.attr_dict, - self.edit_callback) - - def display_data(self,attr): - has_note = attr.get_note() - has_source = len(attr.get_source_references())> 0 - - etype = attr.get_type() - if etype[0] == RelLib.Attribute.CUSTOM \ - or not self.attr_dict.has_key(etype[0]): - name = etype[1] - else: - name = self.attr_dict[etype[0]] - - return [name, attr.get_value(), has_source, has_note] - -class EventListBox(ReorderListBox): - - titles = ['Event', 'Description','Date','Place','Source','Note'] - - def __init__(self,state,uistate,track,primary,obj,label,button_list): - - self.data = [] - self.primary = primary - self.state = state - self.uistate = uistate - if self.primary.__class__.__name__ == 'Person': - birth_ref = primary.get_birth_ref() - death_ref = primary.get_death_ref() - if birth_ref: - self.data.append( - (birth_ref,state.db.get_event_from_handle(birth_ref.ref))) - if death_ref: - self.data.append( - (death_ref, - state.db.get_event_from_handle(death_ref.ref)) - ) - self.ev_dict = Utils.personal_events - self.role_dict = Utils.event_roles - elif self.primary.__class__.__name__ == 'Family': - self.ev_dict = Utils.family_events - self.role_dict = Utils.family_event_roles - - for event_ref in primary.get_event_ref_list(): - self.data.append((event_ref, - state.db.get_event_from_handle(event_ref.ref))) - - ev_custom_str = self.ev_dict[RelLib.Event.CUSTOM] - eventnames = filter(lambda x: x != ev_custom_str, - self.ev_dict.values()) - eventnames.sort(locale.strcoll) - - role_custom_str = self.role_dict[RelLib.EventRef.CUSTOM] - rolenames = filter(lambda x: x != role_custom_str, - self.role_dict.values()) - - self.place_dict = {} - for handle in self.state.db.get_place_handles(): - title = self.state.db.get_place_from_handle(handle).get_title() - self.place_dict[title] = handle - placenames = self.place_dict.keys() - placenames.sort(locale.strcoll) - - evalues = [ - # Title Sort Col Size, Type Argument - (_('Event'), NOSORT, 100, COMBO, eventnames,self.set_type), - (_('Description'), NOSORT, 140, TEXT, None,self.set_description), - (_('Date'), NOSORT, 100, TEXT, None, self.set_date), - (_('Place'), NOSORT, 100, TEXT, None, self.set_place), - (_('Role'), NOSORT, 100, COMBO, rolenames, self.set_role), - (_('Source'), NOSORT, 50, TOGGLE, None, None), - (_('Note'), NOSORT, 50, TOGGLE, None, None), - ] - - ReorderListBox.__init__(self, state, uistate, track, - primary, obj, label, - button_list, evalues, DdTargets.EVENT) - - self.ev_name_map,self.ev_val_map = self.build_maps( - RelLib.Event.CUSTOM,self.ev_dict) - self.ref_name_map,self.ref_val_map = self.build_maps( - RelLib.EventRef.CUSTOM,self.role_dict) - - def set_type(self,index,value): - val = self.ev_name_map.get(value,RelLib.Event.CUSTOM) - if val == RelLib.Event.CUSTOM: - self.data[index][1].set_type((val,value)) - else: - self.data[index][1].set_type((val,self.ev_val_map[val])) - self.change_list.add(self.data[index]) - - def set_role(self,index,value): - val = self.ref_name_map.get(value,RelLib.EventRef.CUSTOM) - if val == RelLib.EventRef.CUSTOM: - self.data[index][0].set_role((val,value)) - else: - self.data[index][0].set_role((val,self.ref_val_map[val])) - self.change_list.add(self.data[index]) - - def set_description(self,index,value): - self.data[index][1].set_description(value) - self.change_list.add(self.data[index]) - - def set_place(self,index,value): - if not value.strip(): - return - handle = self.place_dict.get(value,None) - if handle: - place = self.state.db.get_place_from_handle(handle) - else: - place = RelLib.Place() - place.set_title(value) - trans = self.state.db.transaction_begin() - self.state.db.add_place(place,trans) - self.state.db.transaction_commit(trans,_("Add Place")) - handle = place.get_handle() - - self.data[index][1].set_place_handle(handle) - self.change_list.add(self.data[index]) - - def set_date(self,index,value): - DateHandler.set_date(self.data[index][1],value) - self.change_list.add(self.data[index]) - - def add(self,obj): - """Brings up the EventEditor for a new event""" - EventEdit.EventRefEditor(self.state,self.uistate,self.track, - None,None,self.primary,self.edit_callback) - - def select(self,obj): - """ - Creates eventref for an existing event. - """ - # select existing event - import SelectEvent - sel_event = SelectEvent.SelectEvent(self.state.db,_('Select Event')) - event = sel_event.run() - if event: - EventEdit.EventRefEditor(self.state,self.uistate,self.track, - event,None,self.primary, - self.edit_callback) - - def update(self,obj): - store,node = self.list_model.get_selected() - if not node: - return - event_ref,event = self.list_model.get_object(node) - EventEdit.EventRefEditor(self.state,self.uistate,self.track, - event,event_ref,self.primary, - self.edit_callback) - - def display_data(self,event_tuple): - (event_ref, event) = event_tuple - pid = event.get_place_handle() - if pid: - pname = self.db.get_place_from_handle(pid).get_title() - else: - pname = u'' - has_note = event.get_note() - has_source = len(event.get_source_references())> 0 - etype = event.get_type() - if etype[0] == RelLib.Event.CUSTOM \ - or not self.ev_dict.has_key(etype[0]): - name = etype[1] - else: - name = self.ev_dict[etype[0]] - ref_role = event_ref.get_role() - if ref_role[0] == RelLib.EventRef.CUSTOM \ - or not self.role_dict.has_key(ref_role[0]): - role = ref_role[1] - else: - role = self.role_dict[ref_role[0]] - return [name, event.get_description(), DateHandler.get_date(event), - pname, role, has_source, has_note] - -class NameListBox(ReorderListBox): - - def __init__(self, state, uistate, track, person, obj, label, button_list): - - surnames = state.db.get_surname_list() - - custom_str = Utils.name_types[RelLib.Name.CUSTOM] - types = filter(lambda x: x != custom_str, Utils.name_types.values()) - types.sort(locale.strcoll) - - titles = [ - # Title Sort Col Size, Type - (_('Family Name'), NOSORT, 180, COMBO, surnames, self.set_name), - (_('Prefix'), NOSORT, 50, TEXT, None, self.set_prefix), - (_('Given Name'), NOSORT, 200, TEXT, None, self.set_given), - (_('Suffix'), NOSORT, 50, TEXT, None, self.set_suffix), - (_('Type'), NOSORT, 150, COMBO, types, self.set_type), - (_('Source'), NOSORT, 50, TOGGLE, None, None), - (_('Note'), NOSORT, 50, TOGGLE, None, None), - ] - - self.data = person.get_alternate_names()[:] - ReorderListBox.__init__(self, state, uistate, track, - person, obj, label, - button_list, titles, DdTargets.NAME) - - self.name_name_map,self.name_val_map = self.build_maps( - RelLib.Name.CUSTOM,Utils.name_types) - - def set_type(self,index,value): - val = self.name_name_map.get(value,RelLib.Name.CUSTOM) - if val == RelLib.Name.CUSTOM: - self.data[index].set_type((val,value)) - else: - self.data[index].set_type((val,self.name_val_map[val])) - self.change_list.add(self.data[index]) - - def set_name(self,index,value): - self.data[index].set_surname(value) - - def set_prefix(self,index,value): - self.data[index].set_surname_prefix(value) - - def set_given(self,index,value): - self.data[index].set_first_name(value) - - def set_suffix(self,index,value): - self.data[index].set_suffix(value) - - def add(self,obj): - NameEdit.NameEditor(self.state, self.uistate, self.track, - None, self.edit_callback) - - def update(self,obj): - store,node = self.list_model.get_selected() - if node: - NameEdit.NameEditor(self.state, self.uistate, self.track, - self.list_model.get_object(node), - self.edit_callback) - - def display_data(self,name): - has_note = name.get_note() - has_source = len(name.get_source_references())> 0 - the_type = name.get_type() - if the_type[0] == RelLib.Name.CUSTOM or \ - not Utils.name_types.has_key(the_type[0]): - type_name = the_type[1] - else: - type_name = Utils.name_types[the_type[0]] - return [name.get_surname(),name.get_surname_prefix(), - name.get_first_name(), name.get_suffix(), - type_name,has_source,has_note] - - def unpickle(self, data): - foo = pickle.loads(data); - for src in foo.get_source_references(): - base_handle = src.get_base_handle() - newbase = self.db.get_source_from_handle(base_handle) - src.set_base_handle(newbase.get_handle()) - self.data.insert(row,foo) - -class AddressListBox(ReorderListBox): - - def __init__(self,state,uistate,track,person,obj,label,button_list): - - titles = [ - # Title Sort Col Size, Type - (_('Date'), NOSORT, 175, TEXT, None, self.set_date), - (_('Address'), NOSORT, 150, TEXT, None, self.set_addr), - (_('City'), NOSORT, 100, TEXT, None, self.set_city), - (_('State/Province'),NOSORT, 75, TEXT, None, self.set_state), - (_('Country'), NOSORT, 100, TEXT, None, self.set_country), - (_('Source'), NOSORT, 50, TOGGLE, None, None), - (_('Note'), NOSORT, 50, TOGGLE, None, None), - ] - - self.data = person.get_address_list()[:] - ReorderListBox.__init__(self, state, uistate, track, - person, obj, label, - button_list, titles, DdTargets.ADDRESS) - - def set_date(self,index,value): - DateHandler.set_date(self.data[index],value) - - def set_addr(self,index,value): - self.data[index].set_street(value) - - def set_city(self,index,value): - self.data[index].set_city(value) - - def set_state(self,index,value): - self.data[index].set_state(value) - - def set_country(self,index,value): - self.data[index].set_country(value) - - def add(self,obj): - AddrEdit.AddressEditor(self.state, self.uistate, self.track, None, - self.edit_callback) - - def update(self,obj): - store,node = self.list_model.get_selected() - if node: - item = self.list_model.get_object(node) - AddrEdit.AddressEditor(self.state, self.uistate, self.track, item, - self.edit_callback) - - def display_data(self,item): - has_note = item.get_note() - has_source = len(item.get_source_references())> 0 - return [DateHandler.get_date(item),item.get_street(), - item.get_city(), item.get_state(), - item.get_country(), has_source,has_note] - - def unpickle(self,data): - foo = pickle.loads(data); - for src in foo.get_source_references(): - base_handle = src.get_base_handle() - newbase = self.db.get_source_from_handle(base_handle) - src.set_base_handle(newbase.get_handle()) - self.data.insert(row,foo) - -class UrlListBox(ReorderListBox): - - def __init__(self,state,uistate,track,person,obj,label,button_list): - - titles = [ - # Title Sort Col Size, Type - (_('Path'), NOSORT, 250, TEXT, None, self.set_path), - (_('Description'), NOSORT, 100, TEXT, None, self.set_description), - ] - self.data = person.get_url_list()[:] - ReorderListBox.__init__(self, state, uistate, track, - person, obj, label, - button_list, titles, DdTargets.URL) - - def set_path(self,index,value): - self.data[index].set_path(value) - - def set_description(self,index,value): - self.data[index].set_description(value) - - def add(self,obj): - UrlEdit.UrlEditor(self.state, self.uistate, self.track, - self.name, None, self.edit_callback) - - def update(self,obj): - store,node = self.list_model.get_selected() - if node: - UrlEdit.UrlEditor(self.state, self.uistate, self.track, - self.name, - self.list_model.get_object(node), - self.edit_callback) - - def display_data(self,url): - return [url.get_path(), url.get_description()] diff --git a/src/Sources.py b/src/Sources.py index ed11f4c65..76a3ed668 100644 --- a/src/Sources.py +++ b/src/Sources.py @@ -55,283 +55,6 @@ import DisplayState from DdTargets import DdTargets from WindowUtils import GladeIf -#------------------------------------------------------------------------- -# -# SourceSelector -# -#------------------------------------------------------------------------- - -class SourceSelector(DisplayState.ManagedWindow): - def __init__(self,state,uistate,track,srclist,parent,update=None): - self.db = state.db - self.state = state - self.uistate = uistate - self.track = track - - if srclist: - win_key = id(srclist) - else: - win_key = self - - - submenu_label = _('Source') - - DisplayState.ManagedWindow.__init__( - self, uistate, self.track, win_key, submenu_label, - _('Source Selector')) - - self.orig = srclist - self.list = [] - for s in self.orig: - self.list.append(RelLib.SourceRef(s)) - self.update=update - self.top = gtk.glade.XML(const.gladeFile,"sourcesel","gramps") - self.gladeif = GladeIf(self.top) - - self.window = self.top.get_widget("sourcesel") - - Utils.set_titles(self.window, self.top.get_widget('title'), - _('Source Reference Selection')) - - self.gladeif.connect('sourcesel', 'delete_event', self.on_delete_event) - self.gladeif.connect('button138','clicked', self.close) - self.gladeif.connect('ok', 'clicked', self.src_ok_clicked) - self.gladeif.connect('button145', 'clicked', self.on_help_clicked) - self.gladeif.connect('add', 'clicked', self.add_src_clicked) - self.gladeif.connect('edit', 'clicked', self.edit_src_clicked) - self.gladeif.connect('delete', 'clicked', self.del_src_clicked) - - self.slist = self.top.get_widget("slist") - self.edit = self.top.get_widget('edit') - self.delete = self.top.get_widget('delete') - self.delete.set_sensitive(not self.db.readonly) - self.selection = self.slist.get_selection() - self.model = gtk.ListStore(str,str) - self.slist.set_model(self.model) - self.top.get_widget('add').set_sensitive(not self.db.readonly) - self.top.get_widget('ok').set_sensitive(not self.db.readonly) - - colno = 0 - for title in [ (_('ID'),0,100), (_('Title'),1,150)]: - renderer = gtk.CellRendererText () - renderer.set_fixed_height_from_font(1) - column = gtk.TreeViewColumn (title[0], renderer, text=colno) - colno += 1 - column.set_clickable (True) - column.set_resizable(True) - column.set_sort_column_id(title[1]) - column.set_min_width(title[2]) - self.slist.append_column (column) - - self.selection.connect('changed',self.selection_changed) - - self.delete.set_sensitive(False) - self.edit.set_sensitive(False) - self.redraw() - if self.parent: - self.window.set_transient_for(self.parent.window) - self.add_itself_to_menu() - self.window.show() - - def on_delete_event(self,obj,b): - self.gladeif.close() - gc.collect() - - def close(self,obj): - self.gladeif.close() - self.window.destroy() - gc.collect() - - def on_help_clicked(self,obj): - """Display the relevant portion of GRAMPS manual""" - GrampsDisplay.help('gramps-edit-complete') - - def selection_changed(self,obj): - (store,node) = self.selection.get_selected() - if node: - self.delete.set_sensitive(True) - self.edit.set_sensitive(True) - else: - self.delete.set_sensitive(False) - self.edit.set_sensitive(False) - - def redraw(self): - self.model.clear() - for s in self.list: - base_handle = s.get_base_handle() - base = self.db.get_source_from_handle(base_handle) - node = self.model.append() - self.model.set(node,0,base.get_gramps_id(),1,base.get_title()) - - def src_ok_clicked(self,obj): - del self.orig[:] - for s in self.list: - self.orig.append(s) - if self.update: - self.update(self.orig) - self.close(obj) - - def edit_src_clicked(self,obj): - store,node = self.selection.get_selected() - if node: - col = store.get_path(node) - src = self.list[col[0]] - SourceEditor(src,self.db,self.update_clist,self) - - def update_clist(self,inst,ref): - inst.redraw() - - def add_src_clicked(self,obj): - src = RelLib.SourceRef() - SourceEditor(src,self.db,self.add_ref,self) - - def del_src_clicked(self,obj): - (store,node) = self.selection.get_selected() - if node: - path = store.get_path(node) - del self.list[path[0]] - self.redraw() - - def add_ref(self,inst,ref): - self.parent.lists_changed = 1 - inst.list.append(ref) - inst.redraw() - -#------------------------------------------------------------------------- -# -# SourceTab -# -#------------------------------------------------------------------------- -class SourceTab: - def __init__(self, state, uistate, track, srclist, parent, top, window, - clist, add_btn, edit_btn, del_btn, readonly=False): - - self.db = state.db - self.state = state - self.uistate = uistate - self.track = track - self.parent = parent - self.list = srclist - self.top = top - self.window = window - self.slist = clist - self.selection = clist.get_selection() - self.model = gtk.ListStore(str,str,object) - self.readonly = readonly - - add_btn.set_sensitive(not readonly) - del_btn.set_sensitive(not readonly) - - colno = 0 - for title in [ (_('ID'),0,100), (_('Title'),1,150)]: - renderer = gtk.CellRendererText () - column = gtk.TreeViewColumn (title[0], renderer, text=colno) - colno = colno + 1 - column.set_clickable (True) - column.set_resizable(True) - column.set_sort_column_id(title[1]) - column.set_min_width(title[2]) - self.slist.append_column (column) - - self.slist.set_model(self.model) - - add_btn.connect('clicked', self.add_src_clicked) - edit_btn.connect('clicked', self.edit_src_clicked) - del_btn.connect('clicked', self.del_src_clicked) - self.slist.connect('button-press-event',self.double_click) - self.setup_drag_n_drop() - self.redraw() - - def setup_drag_n_drop(self): - self.slist.drag_dest_set(gtk.DEST_DEFAULT_ALL, - [DdTargets.SOURCEREF.target()], - ACTION_COPY) - self.slist.drag_source_set(BUTTON1_MASK, - [DdTargets.SOURCEREF.target()], - ACTION_COPY) - self.slist.connect('drag_data_get', self.drag_data_get) - self.slist.connect('drag_begin', self.drag_begin) - if not self.readonly: - self.slist.connect('drag_data_received',self.drag_data_received) - - def drag_data_received(self,widget,context,x,y,sel_data,info,time): - if self.db.readonly or self.readonly: # no DnD on readonly database - return - - if sel_data and sel_data.data: - exec 'data = %s' % sel_data.data - exec 'mytype = "%s"' % data[0] - exec 'person = "%s"' % data[1] - if mytype != DdTargets.SOURCEREF.drag_type: - return - else: - foo = pickle.loads(data[2]); - self.list.append(foo) - - self.lists_changed = True - self.redraw() - - def drag_data_get(self,widget, context, sel_data, info, time): - - store,node = self.selection.get_selected() - if not node: - return - ev = store.get_value(node,2) - - bits_per = 8; # we're going to pass a string - pickled = pickle.dumps(ev); - data = str((DdTargets.SOURCEREF.drag_type,None,pickled)); - sel_data.set(sel_data.target, bits_per, data) - - def drag_begin(self, context, a): - return - - def double_click(self,obj,event): - if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: - self.edit_src_clicked(obj) - - def redraw(self): - self.model.clear() - for s in self.list: - base_handle = s.get_base_handle() - node = self.model.append() - base = self.db.get_source_from_handle(base_handle) - self.model.set(node,0,base.get_gramps_id(),1,base.get_title(), - 2,s) - if self.list: - Utils.bold_label(self.parent.sources_label) - else: - Utils.unbold_label(self.parent.sources_label) - - def update_clist(self,inst,ref): - inst.redraw() - self.parent.lists_changed = 1 - - def add_ref(self,inst,ref): - self.parent.lists_changed = 1 - inst.list.append(ref) - inst.redraw() - - def edit_src_clicked(self,obj): - store,node = self.selection.get_selected() - if node: - col = store.get_path(node) - src = self.list[col[0]] - SourceEditor(self.state, self.uistate, self.track, - src, self.update_clist) - - def add_src_clicked(self,obj): - src = RelLib.SourceRef() - SourceEditor(self.state, self.uistate, self.track, src, self.add_ref) - - def del_src_clicked(self,obj): - (store,node) = self.selection.get_selected() - if node: - path = store.get_path(node) - del self.list[path[0]] - self.parent.lists_changed = 1 - self.redraw() - #------------------------------------------------------------------------- # # SourceEditor diff --git a/src/gramps.glade b/src/gramps.glade index cebce2d55..5f190f91c 100644 --- a/src/gramps.glade +++ b/src/gramps.glade @@ -348,172 +348,6 @@ - - True - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - True - 300 - 150 - True - False - gramps.png - True - False - False - GDK_WINDOW_TYPE_HINT_DIALOG - GDK_GRAVITY_NORTH_WEST - True - False - False - - - - - True - False - 8 - - - - True - GTK_BUTTONBOX_END - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - -6 - - - - - - - True - True - True - True - gtk-ok - True - GTK_RELIEF_NORMAL - True - -5 - - - - - - - True - True - True - gtk-help - True - GTK_RELIEF_NORMAL - True - -11 - - - - - - 0 - False - True - GTK_PACK_END - - - - - - 6 - True - False - 0 - - - - True - - False - True - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 10 - 10 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - 5 - True - True - Open an _existing database - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - - - - 5 - True - True - Create a _new database - True - GTK_RELIEF_NORMAL - True - False - False - True - existing - - - 0 - False - False - - - - - 0 - True - True - - - - - - True @@ -1649,6 +1483,230 @@ + + + 12 + True + 4 + 2 + False + 6 + 6 + + + + True + _Title: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + place_title + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 0 + 1 + + + + + + + True + _Longitude: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + longitude + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 1 + 2 + + + + + + + True + L_atitude: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + latitude + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 2 + 3 + + + + + + + True + Last Changed: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 3 + 4 + fill + + + + + + 0 + True + True + + + True @@ -1662,46 +1720,14 @@ - 6 + 12 True - 12 - 4 + 7 + 3 False 6 12 - - - True - _Title: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - place_title - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - 1 - 2 - 1 - 2 - fill - - - - True @@ -1722,10 +1748,10 @@ 0 - 1 - 2 - 2 - 3 + 0 + 1 + 0 + 1 fill @@ -1751,10 +1777,10 @@ 0 - 1 - 2 - 5 - 6 + 0 + 1 + 3 + 4 fill @@ -1783,10 +1809,10 @@ - 1 - 2 - 4 - 5 + 0 + 1 + 2 + 3 fill @@ -1812,74 +1838,10 @@ 0 - 1 - 2 - 7 - 8 - fill - - - - - - - True - _Longitude: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - longitude - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - 1 - 2 - 9 - 10 - fill - - - - - - - True - L_atitude: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - latitude - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - 1 - 2 - 10 - 11 + 0 + 1 + 5 + 6 fill @@ -1909,33 +1871,11 @@ - 1 - 2 - 3 - 4 - fill - - - - - - - True - True - True - True - True - 0 - - True - * - False - - - 2 - 4 + 0 + 1 1 2 + fill @@ -1953,10 +1893,10 @@ False - 2 - 4 - 2 - 3 + 1 + 3 + 0 + 1 @@ -1974,10 +1914,10 @@ False - 2 - 4 - 3 - 4 + 1 + 3 + 1 + 2 @@ -1995,10 +1935,10 @@ False - 2 - 4 - 4 - 5 + 1 + 3 + 2 + 3 @@ -2016,10 +1956,10 @@ False - 2 - 4 - 5 - 6 + 1 + 3 + 3 + 4 @@ -2037,80 +1977,10 @@ False - 2 - 4 - 7 - 8 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 2 - 4 - 9 - 10 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 2 - 4 - 10 - 11 - - - - - - - True - <b>General</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 4 - 0 - 1 - fill + 1 + 3 + 5 + 6 @@ -2135,10 +2005,10 @@ 0 - 1 - 2 - 6 - 7 + 0 + 1 + 4 + 5 fill @@ -2157,10 +2027,10 @@ False - 2 - 4 - 6 - 7 + 1 + 3 + 4 + 5 @@ -2185,10 +2055,10 @@ 0 - 1 - 2 - 8 - 9 + 0 + 1 + 6 + 7 fill @@ -2206,67 +2076,11 @@ * False - - 2 - 4 - 8 - 9 - - - - - - - True - Last Changed: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - 1 - 2 - 11 - 12 - fill - - - - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 4 - 11 - 12 - fill + 3 + 6 + 7 @@ -6749,283 +6563,6 @@ Very High - - True - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 350 - 300 - True - False - gramps.png - True - False - False - GDK_WINDOW_TYPE_HINT_DIALOG - GDK_GRAVITY_NORTH_WEST - True - False - False - - - - - True - False - 8 - - - - True - GTK_BUTTONBOX_END - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - -6 - - - - - - - True - True - True - gtk-ok - True - GTK_RELIEF_NORMAL - True - -5 - - - - - - - True - True - True - gtk-help - True - GTK_RELIEF_NORMAL - True - -11 - - - - - - 0 - False - True - GTK_PACK_END - - - - - - True - False - 0 - - - - True - - False - True - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 5 - False - False - - - - - - 6 - True - False - 6 - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - Double click will edit the selected source - True - True - False - False - True - False - False - False - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-add - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - edit_sm.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-remove - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_SPREAD - 30 - - - 5 - False - True - - - - - 0 - True - True - - - - - - GTK_WINDOW_TOPLEVEL @@ -19453,453 +18990,13 @@ Given name, Family name - - True - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - gramps.png - True - False - False - GDK_WINDOW_TYPE_HINT_DIALOG - GDK_GRAVITY_NORTH_WEST - True - False - True - - - - - True - False - 0 - - - - True - GTK_BUTTONBOX_END - - - - True - True - True - gtk-help - True - GTK_RELIEF_NORMAL - True - -11 - - - - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - -6 - - - - - - - True - True - True - gtk-ok - True - GTK_RELIEF_NORMAL - True - -5 - - - - - - 0 - False - True - GTK_PACK_END - - - - - - True - False - 0 - - - - True - - False - True - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 10 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - 12 - True - 5 - 3 - False - 6 - 12 - - - - True - Event I_D: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - _Role: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 3 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Event _Type: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - _Note: - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - True - _Private record - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 1 - 2 - 4 - 5 - fill - - - - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - 1 - 3 - 3 - 4 - - - - - - True - - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - er_add_button - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 0 - 1 - - - - - - - True - - True - False - GTK_JUSTIFY_CENTER - False - False - 0 - 0.5 - 0 - 0 - er_sel_button - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 1 - 2 - - - - - - - True - Select an existing event for this reference - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-index - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - Create new event for this reference - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-add - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - False - True - True - - - 1 - 3 - 2 - 3 - fill - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER_ON_PARENT False - 400 + 600 True False gramps.png @@ -20181,7 +19278,7 @@ Given name, Family name 6 - + True True True @@ -20611,870 +19708,6 @@ Given name, Family name tab - - - - True - False - 0 - - - - 6 - True - False - 6 - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-add - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - edit_sm.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-remove - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_SPREAD - 30 - - - 0 - False - True - - - - - False - True - - - - - - True - False - 0 - - - - gtk-file - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - True - Sources - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - tab - - - - - - True - False - 0 - - - - 6 - 400 - 200 - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - 0 - True - False - - - - - - 12 - True - 2 - 3 - False - 12 - 24 - - - - True - <b>Format</b> - True - True - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 3 - 0 - 1 - fill - - - - - - - True - Multiple spaces, tabs, and single line breaks are replaced with single spaces. Two consecutive line breaks mark a new paragraph. - True - _Flowed - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 1 - 2 - 1 - 2 - - - - - - - - True - Formatting is preserved, except for the leading whitespace. Multiple spaces, tabs, and all line breaks are respected. - True - _Preformatted - True - GTK_RELIEF_NORMAL - True - False - False - True - eer_ev_flowed - - - 2 - 3 - 1 - 2 - - - - - - - 0 - True - True - - - - - False - True - - - - - - True - False - 0 - - - - gtk-file - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - True - Note - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - tab - - - - - - True - False - 0 - - - - 6 - True - False - 6 - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-add - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - edit_sm.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - gtk-remove - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_SPREAD - 0 - - - 0 - False - True - - - - - False - True - - - - - - True - False - 0 - - - - gtk-file - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - True - Witnesses - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - tab - - - - - - True - False - 0 - - - - 6 - True - False - 6 - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - GTK_SELECTION_SINGLE - GTK_ORIENTATION_VERTICAL - False - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - Add a new media object to the database and place it in this gallery - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-add - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - Select an existing media object from the database and place it in this gallery - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-index - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - Edit the properties of the selected object - True - GTK_RELIEF_NORMAL - True - - - - - True - edit_sm.png - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - - True - Remove selected object from this gallery only - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-remove - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_SPREAD - 30 - - - 0 - False - True - - - - - False - True - - - - - - True - False - 0 - - - - gtk-file - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - True - Gallery - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - tab - -