diff --git a/example/gramps/data.gramps b/example/gramps/data.gramps index 68bcdbdae..c8bbfffde 100644 Binary files a/example/gramps/data.gramps and b/example/gramps/data.gramps differ diff --git a/src/GrampsCfg.py b/src/GrampsCfg.py index 2b54704fe..8fdc7b51b 100644 --- a/src/GrampsCfg.py +++ b/src/GrampsCfg.py @@ -981,7 +981,7 @@ def save_view(val): set_bool("/apps/gramps/view",val) def get_view(): - return get_bool("/apps/gramps/view",1) + return get_bool("/apps/gramps/view") def save_filter(val): set_bool("/apps/gramps/filter",val) diff --git a/src/MergeData.py b/src/MergeData.py index 8fa2b43db..62389d8b1 100644 --- a/src/MergeData.py +++ b/src/MergeData.py @@ -18,16 +18,31 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +#------------------------------------------------------------------------- +# +# Standard python modules +# +#------------------------------------------------------------------------- +import string + +#------------------------------------------------------------------------- +# +# GNOME +# +#------------------------------------------------------------------------- +import gtk.glade + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- import RelLib import Utils import GrampsCfg +import ListModel import const - -from intl import gettext -_ = gettext - -import string -import gtk.glade +from intl import gettext as _ #------------------------------------------------------------------------- # @@ -129,8 +144,12 @@ class MergePeople: self.set_field(self.glade.get_widget("mother1"),mother1) self.set_field(self.glade.get_widget("mother2"),mother2) - self.build_spouse_list(person1,self.glade.get_widget('spouse1')) - self.build_spouse_list(person2,self.glade.get_widget('spouse2')) + sp1_list = [('-',0,100)] + self.sp1 = ListModel.ListModel(self.glade.get_widget('spouse1'),sp1_list) + self.sp2 = ListModel.ListModel(self.glade.get_widget('spouse2'),sp1_list) + + self.build_spouse_list(person1,self.sp1) + self.build_spouse_list(person2,self.sp2) if name1 != name2: self.altname.set_sensitive(1) @@ -154,28 +173,25 @@ class MergePeople: self.altdeath.set_active(0) def build_spouse_list(self,person,widget): - plist = person.getFamilyList() - - length = min(len(plist),3) - widget.clear() - for index in range(0,3): - if index < length and plist[index]: - if person.getGender() == RelLib.Person.male: - spouse = plist[index].getMother() - else: - spouse = plist[index].getFather() - if spouse == None: - name = "unknown" - else: - sname = GrampsCfg.nameof(spouse) - name = "%s (%s)" % (sname,spouse.getId()) - widget.append([name]) + widget.clear() + for fam in person.getFamilyList(): + if person.getGender() == RelLib.Person.male: + spouse = fam.getMother() + else: + spouse = fam.getFather() + + if spouse == None: + name = "unknown" + else: + sname = GrampsCfg.nameof(spouse) + name = "%s [%s]" % (sname,spouse.getId()) + print name, widget + widget.add([name]) def set_field(self,widget,value): """Sets the string of the entry field at positions it a space 0""" widget.set_text(value) - widget.set_position(0) def place_name(self,event): place = event.getPlace() diff --git a/src/gramps_main.py b/src/gramps_main.py index ffd0e5381..c562bff67 100755 --- a/src/gramps_main.py +++ b/src/gramps_main.py @@ -146,8 +146,14 @@ class Gramps: """ self.gtop = gtk.glade.XML(const.gladeFile, "gramps") + self.report_button = self.gtop.get_widget("reports") + self.tool_button = self.gtop.get_widget("tools") self.sidebar = self.gtop.get_widget('side_event') self.filterbar = self.gtop.get_widget('filterbar') + + self.tool_button.set_sensitive(0) + self.report_button.set_sensitive(0) + set_panel(self.sidebar) set_panel(self.gtop.get_widget('side_people')) set_panel(self.gtop.get_widget('side_family')) @@ -415,21 +421,24 @@ class Gramps: def on_filter_activate(self,obj): self.enable_filter(obj.get_active()) -# GrampsCfg.save_filter(val) + GrampsCfg.save_filter(obj.get_active()) def build_plugin_menus(self): export_menu = self.gtop.get_widget("export1") import_menu = self.gtop.get_widget("import1") - report_menu = self.gtop.get_widget("reports_menu") - tools_menu = self.gtop.get_widget("tools_menu") + self.report_menu = self.gtop.get_widget("reports_menu") + self.tools_menu = self.gtop.get_widget("tools_menu") + self.report_menu.set_sensitive(0) + self.tools_menu.set_sensitive(0) + Plugins.load_plugins(const.docgenDir) Plugins.load_plugins(os.path.expanduser("~/.gramps/docgen")) Plugins.load_plugins(const.pluginsDir) Plugins.load_plugins(os.path.expanduser("~/.gramps/plugins")) - Plugins.build_report_menu(report_menu,self.menu_report) - Plugins.build_tools_menu(tools_menu,self.menu_tools) + Plugins.build_report_menu(self.report_menu,self.menu_report) + Plugins.build_tools_menu(self.tools_menu,self.menu_tools) Plugins.build_export_menu(export_menu,self.export_callback) Plugins.build_import_menu(import_menu,self.import_callback) @@ -726,7 +735,7 @@ class Gramps: self.displayError(_("%s is not a directory") % filename) return - self.statusbar.set_status(_("Loading %s ...") % filename) + self.status_text(_("Loading %s ...") % filename) if self.load_database(filename) == 1: if filename[-1] == '/': @@ -734,7 +743,7 @@ class Gramps: name = os.path.basename(filename) self.topWindow.set_title("%s - GRAMPS" % name) else: - self.statusbar.set_status("") + self.status_text("") GrampsCfg.save_last_file("") def on_ok_button2_clicked(self,obj): @@ -752,7 +761,7 @@ class Gramps: filename = os.path.normpath(filename) autosave = "%s/autosave.gramps" % filename - self.statusbar.set_status(_("Saving %s ...") % filename) + self.status_text(_("Saving %s ...") % filename) Utils.clearModified() Utils.clear_timer() @@ -793,7 +802,7 @@ class Gramps: filename = filename[:-1] name = os.path.basename(filename) self.topWindow.set_title("%s - GRAMPS" % name) - self.statusbar.set_status("") + self.status_text("") self.statusbar.set_progress_percentage(0.0) if os.path.exists(autosave): try: @@ -812,12 +821,12 @@ class Gramps: filename = "%s/autosave.gramps" % (self.db.getSavePath()) - self.statusbar.set_status(_("autosaving...")); + self.status_text(_("autosaving...")); try: self.db.save(filename,self.quick_progress) - self.statusbar.set_status(_("autosave complete")); + self.status_text(_("autosave complete")); except (IOError,OSError),msg: - self.statusbar.set_status("%s - %s" % (_("autosave failed"),msg)) + self.status_text("%s - %s" % (_("autosave failed"),msg)) except: import traceback traceback.print_exc() @@ -825,10 +834,8 @@ class Gramps: def load_selected_people(self,obj): """Display the selected people in the EditPerson display""" - list_store, iter = self.person_selection.get_selected() - if iter: - id = list_store.get_value(iter,1) - self.load_person(self.db.getPerson(id)) + if self.active_person: + self.load_person(self.active_person) def load_active_person(self,obj): self.load_person(self.active_person) @@ -915,14 +922,24 @@ class Gramps: def change_active_person(self,person): self.active_person = person self.modify_statusbar() + if person: + self.report_menu.set_sensitive(1) + self.tools_menu.set_sensitive(1) + self.report_button.set_sensitive(1) + self.tool_button.set_sensitive(1) + else: + self.report_menu.set_sensitive(0) + self.tools_menu.set_sensitive(0) + self.report_button.set_sensitive(0) + self.tool_button.set_sensitive(0) def modify_statusbar(self): if self.active_person == None: - self.statusbar.set_status("") + self.status_text("") else: pname = GrampsCfg.nameof(self.active_person) name = "[%s] %s" % (self.active_person.getId(),pname) - self.statusbar.set_status(name) + self.status_text(name) return 0 def on_child_list_row_move(self,clist,fm,to): @@ -1230,6 +1247,11 @@ class Gramps: while gtk.events_pending(): gtk.mainiteration() + def status_text(self,text): + self.statusbar.set_status(text) + while gtk.events_pending(): + gtk.mainiteration() + def quick_progress(self,value): gtk.threads_enter() self.statusbar.set_progress_percentage(value) @@ -1307,6 +1329,7 @@ class Gramps: def load_revision(self,f,name,revision): filename = "%s/%s" % (name,self.db.get_base()) + self.status_text(_('Loading %s...' % name)) if ReadXML.loadRevision(self.db,f,filename,revision,self.load_progress) == 0: return 0 return self.post_load(name) @@ -1318,9 +1341,10 @@ class Gramps: def displayError(self,msg): ErrorDialog(msg) - self.statusbar.set_status("") + self.status_text("") def apply_filter(self): + self.status_text(_("Updating display")) datacomp = self.DataFilter.compare for key in self.db.getPersonKeys(): @@ -1348,6 +1372,7 @@ class Gramps: if self.id2col.has_key(key): (model,iter,page) = self.id2col[key] model.remove(iter) + self.modify_statusbar() def on_home_clicked(self,obj): temp = self.db.getDefaultPerson() @@ -1361,7 +1386,7 @@ class Gramps: if self.active_person: self.bookmarks.add(self.active_person) name = GrampsCfg.nameof(self.active_person) - self.statusbar.set_status(_("%s has been bookmarked") % name) + self.status_text(_("%s has been bookmarked") % name) gtk.timeout_add(5000,self.modify_statusbar) else: WarningDialog(_("Bookmark could not be set because no one was selected")) diff --git a/src/plugins/Merge.py b/src/plugins/Merge.py index 462809bfa..1690bc9d3 100644 --- a/src/plugins/Merge.py +++ b/src/plugins/Merge.py @@ -20,17 +20,32 @@ "Database Processing/Merge people" +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- import RelLib import Utils import soundex import GrampsCfg import ListModel +import MergeData from intl import gettext as _ +#------------------------------------------------------------------------- +# +# standard python models +# +#------------------------------------------------------------------------- import string import os -import MergeData +#------------------------------------------------------------------------- +# +# GNOME libraries +# +#------------------------------------------------------------------------- from gnome.ui import * import gtk import gtk.glade @@ -119,10 +134,9 @@ class Merge: self.show() def progress_update(self,val): - pass -# self.progress.set_value(val) -# while gtk.events_pending(): -# gtk.mainiteration() + self.progress.set_value(val) + while gtk.events_pending(): + gtk.mainiteration() def find_potentials(self,thresh): @@ -197,12 +211,11 @@ class Merge: "destroy_passed_object" : Utils.destroy_passed_object, "on_do_merge_clicked" : self.on_do_merge_clicked, }) - self.mlist.connect('button-press-event',self.button_press_event) - self.list = ListModel.ListModel(self.mlist, - [(_('Rating'),75,0), - (_('First Person'),200,1), - (_('Second Person'),200,2)]) + mtitles = [(_('Rating'),3,75),(_('First Person'),1,200), + (_('Second Person'),2,200),('',-1,0)] + self.list = ListModel.ListModel(self.mlist,mtitles, + event_func=self.on_do_merge_clicked) self.redraw() @@ -218,32 +231,21 @@ class Merge: if p1 == p2: continue list.append((c,p1,p2.getId())) - list.sort() - list.reverse() - index = 0 - self.match_map = {} self.list.clear() for (c,p1,p2) in list: - c = "%5.2f" % c - pn1 = self.db.getPerson(p1) - pn2 = self.db.getPerson(p2) - self.list.add([c, name_of(pn1), name_of(pn2)]) - self.match_map[index] = (p1,p2) - index = index + 1 - - def button_press_event(self,obj,event): - if event.button != 1 or event.type != gtk.gdk._2BUTTON_PRESS: - return - self.on_do_merge_clicked(obj) + c1 = "%5.2f" % c + c2 = "%5.2f" % (100-c) + pn1 = self.db.getPerson(p1).getPrimaryName().getName() + pn2 = self.db.getPerson(p2).getPrimaryName().getName() + self.list.add([c, pn1, pn2,c2],(p1,p2)) def on_do_merge_clicked(self,obj): store,iter = self.list.selection.get_selected() if not iter: return - row = self.list.model.get_path(iter) - (p1,p2) = self.match_map[row[0]] + (p1,p2) = self.list.get_object(iter) pn1 = self.db.getPerson(p1) pn2 = self.db.getPerson(p2) MergeData.MergePeople(self.db,pn1,pn2,self.on_update) diff --git a/src/plugins/RelCalc.py b/src/plugins/RelCalc.py index 891295ffc..be81fb39c 100644 --- a/src/plugins/RelCalc.py +++ b/src/plugins/RelCalc.py @@ -42,7 +42,7 @@ def filter(person,index,list,map): if person == None: return list.append(person) - map[person] = index + map[person.getId()] = index family = person.getMainParents() if family != None: @@ -340,7 +340,7 @@ class RelCalc: for person in firstList: if person in secondList: - new_rank = firstMap[person] + new_rank = firstMap[person.getId()] if new_rank < rank: rank = new_rank common = [ person ] @@ -357,15 +357,15 @@ class RelCalc: if length == 1: person = common[0] - secondRel = firstMap[person] - firstRel = secondMap[person] + secondRel = firstMap[person.getId()] + firstRel = secondMap[person.getId()] name = person.getPrimaryName().getRegularName() commontext = " " + _("Their common ancestor is %s.") % name elif length == 2: p1 = common[0] p2 = common[1] - secondRel = firstMap[p1] - firstRel = secondMap[p1] + secondRel = firstMap[p1.getId()] + firstRel = secondMap[p1.getId()] commontext = " " + _("Their common ancestors are %s and %s.") % \ (p1.getPrimaryName().getRegularName(),\ p2.getPrimaryName().getRegularName()) @@ -373,8 +373,8 @@ class RelCalc: index = 0 commontext = " " + _("Their common ancestors are : ") for person in common: - secondRel = firstMap[person] - firstRel = secondMap[person] + secondRel = firstMap[person.getId()] + firstRel = secondMap[person.getId()] if index != 0: commontext = commontext + ", " commontext = commontext + person.getPrimaryName().getRegularName() @@ -414,15 +414,11 @@ class RelCalc: else: text = get_cousin(firstName,secondName,secondRel-1,firstRel-secondRel) - text1 = self.glade.get_widget("text1") - text1.set_point(0) - length = text1.get_length() - text1.forward_delete(length) + text1 = self.glade.get_widget("text1").get_buffer() if firstRel == 0 or secondRel == 0: - text1.insert_defaults(text) + text1.set_text(text) else: - text1.insert_defaults(text + commontext) - text1.set_word_wrap(1) + text1.set_text(text + commontext) #------------------------------------------------------------------------- # diff --git a/src/plugins/merge.glade b/src/plugins/merge.glade index e9a30ef23..78ba052dd 100644 --- a/src/plugins/merge.glade +++ b/src/plugins/merge.glade @@ -1,481 +1,478 @@ - + - - Merge People - GRAMPS - GTK_WINDOW_DIALOG - yes - no - yes - GTK_WIN_POS_NONE - yes - - - no - 0 - yes + + True + Merge People - GRAMPS + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + True + True + False - - - Determining Possible Merges - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - - 10 - no - no - - + + + True + False + 0 - - - yes - - - 0 - no - yes - - + + + True + Determining Possible Merges + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + 10 + False + False + + - - - Please be patient. This may take a while. - GTK_JUSTIFY_CENTER - yes - 0.5 - 0.5 - 10 - 0 - yes - - - 20 - no - no - - + + + True + + + 0 + False + True + + - - - no - 0 - yes + + + True + Please be patient. This may take a while. + False + False + GTK_JUSTIFY_CENTER + True + False + 0.5 + 0.5 + 10 + 0 + + + 20 + False + False + + - - - + + + True + False + 0 - - - GTK_PROGRESS_CONTINUOUS - GTK_PROGRESS_LEFT_TO_RIGHT - no - no - %P %% - 0.5 - 0.5 - yes - 0 0 100 1 10 10 - - - 20 - yes - yes - - + + + - - - - - - 20 - no - no - - - - - - - Merge List - GRAMPS - GTK_WINDOW_TOPLEVEL - no - no - yes - yes - GTK_WIN_POS_NONE + + + True + GTK_PROGRESS_LEFT_TO_RIGHT + 0 + 0.1 + False + False + 0.5 + 0.5 + + + 20 + True + True + + - - - no - 8 - yes + + + + + + 20 + False + False + + + + + - - - GTK_BUTTONBOX_END - 8 - yes + + True + Merge List - GRAMPS + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True - - - yes - yes - Merge - yes + + + True + False + 8 - - - + + + True + GTK_BUTTONBOX_END - - - yes - yes - yes - gtk-close - yes - yes + + + True + True + True + Merge + True + GTK_RELIEF_NORMAL + 0 + + + - - - - - - 0 - no - yes - GTK_PACK_END - - + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + 0 + + + + + + 0 + False + True + GTK_PACK_END + + - - - no - 0 - yes + + + True + False + 0 - - - Potential Merges - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - - 0 - no - no - - + + + True + Potential Merges + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + - - - yes - - - 10 - no - yes - - + + + True + + + 10 + False + True + + - - - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - yes + + + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT - - - yes - yes - 600 - 300 - yes + + + True + True + True + True + False + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + - - - CList:title - Rating - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - + + True + Merge People - GRAMPS + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True - - - CList:title - Person 1 - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - + + + True + False + 8 - - - CList:title - Person 2 - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - - - + + + True + GTK_BUTTONBOX_END - - - GTK_UPDATE_CONTINUOUS - yes - - + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + 0 + + + - - - GTK_UPDATE_CONTINUOUS - yes - - - - - 0 - yes - yes - - - - - 0 - yes - yes - - - - - 4 - yes - yes - - - - - Merge People - GRAMPS - GTK_WINDOW_TOPLEVEL - no - no - no - yes - GTK_WIN_POS_NONE + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + 0 + + + + + + 0 + False + True + GTK_PACK_END + + - - - no - 8 - yes + + + True + False + 0 - - - GTK_BUTTONBOX_END - 8 - yes + + + True + Merge People + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + - - - yes - yes - yes - gtk-ok - yes - yes + + + True + + + 5 + True + True + + - - - + + + 8 + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN - - - yes - yes - yes - gtk-cancel - yes - yes + + + 5 + True + True + -1 - - - - - - 0 - no - yes - GTK_PACK_END - - + + + True + + + + - - - no - 0 - yes + + + True + Match Threshold + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + label_item + + + + + 0 + True + True + + - - - Merge People - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - - 0 - no - no - - + + + 8 + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN - - - yes - - - 5 - yes - yes - - + + + True + False + 0 - - - 8 - Match Threshold - 0 - GTK_SHADOW_ETCHED_IN - yes + + + True + True + Use SoundEx codes for name matches + True + GTK_RELIEF_NORMAL + True + False + True + + + 0 + False + False + + - - - 5 - yes - 0 - yes + + + True + (Recommended only for English) + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + - - - yes - - - - - - - 0 - yes - yes - - + + + True + Options + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + label_item + + + + + 0 + True + True + + + + + 0 + True + True + + + + + - - - 8 - Options - 0 - GTK_SHADOW_ETCHED_IN - yes - - - - no - 0 - yes - - - - yes - Use SoundEx codes for name matches - yes - yes - yes - - - 0 - no - no - - - - - - (Recommended only for English) - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - - 0 - no - no - - - - - - - 0 - yes - yes - - - - - 0 - yes - yes - - - - - 4 - yes - yes - - - diff --git a/src/plugins/relcalc.glade b/src/plugins/relcalc.glade index 080e5bb65..d29f64ebe 100644 --- a/src/plugins/relcalc.glade +++ b/src/plugins/relcalc.glade @@ -1,241 +1,229 @@ - + - - Relationship Calculator - GRAMPS - GTK_WINDOW_TOPLEVEL - no - no - yes - yes - GTK_WIN_POS_NONE - - - no - 8 - yes + + True + Relationship Calculator - GRAMPS + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 450 + 400 + True + False + True - - - GTK_BUTTONBOX_END - 8 - yes + + + True + False + 8 - - - yes - yes - yes - gtk-apply - yes - yes + + + True + GTK_BUTTONBOX_END - - - + + + True + True + True + gtk-apply + True + GTK_RELIEF_NORMAL + 0 + + + - - - yes - yes - yes - gtk-close - yes - yes + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + 0 + + + + + + 0 + False + True + GTK_PACK_END + + - - - - - - 0 - no - yes - GTK_PACK_END - - + + + True + False + 0 - - - no - 0 - yes + + + True + name + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + 5 + False + False + + - - - name - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - - 5 - no - no - - + + + True + + + 10 + False + True + + - - - yes - - - 10 - no - yes - - + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT - - - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - yes + + + True + True + 3 + 236,56,80 + GTK_SELECTION_SINGLE + True + GTK_SHADOW_IN - - - yes - yes - 550 - 200 - yes + + + Name + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + - + + + ID + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + - - - CList:title - Name - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - + + + Birthday + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + + + + + 0 + True + True + + - - - CList:title - ID - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - + + + True + + + 5 + False + True + + - - - CList:title - Birthdate - GTK_JUSTIFY_CENTER - no - 0.5 - 0.5 - 0 - 0 - yes - - - - + + + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT - - - GTK_UPDATE_CONTINUOUS - yes - - + + + 75 + True + True + False + GTK_JUSTIFY_LEFT + GTK_WRAP_WORD + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + - - - GTK_UPDATE_CONTINUOUS - yes - - - - - 0 - yes - yes - - - - - - yes - - - 5 - no - yes - - - - - - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - yes - - - - yes - no - - GTK_WRAP_WORD - 100 - yes - - - - - - GTK_UPDATE_CONTINUOUS - yes - - - - - - GTK_UPDATE_CONTINUOUS - yes - - - - - 0 - yes - yes - - - - - 0 - yes - yes - - - - - 4 - yes - yes - - -