Fixed autocompletion, WriteXML is now a class
svn: r695
This commit is contained in:
		@@ -49,6 +49,7 @@ import Date
 | 
			
		||||
from RelLib import *
 | 
			
		||||
import ImageSelect
 | 
			
		||||
import sort
 | 
			
		||||
import AutoComp
 | 
			
		||||
 | 
			
		||||
from intl import gettext
 | 
			
		||||
_ = gettext
 | 
			
		||||
@@ -231,7 +232,8 @@ class EditPerson:
 | 
			
		||||
        self.window.editable_enters(self.ddate);
 | 
			
		||||
        self.window.editable_enters(self.dplace);
 | 
			
		||||
        
 | 
			
		||||
        utils.attach_surnames(self.get_widget("lastNameList"))
 | 
			
		||||
        if Config.autocomp:
 | 
			
		||||
            AutoComp.AutoComp(self.surname_field,const.surnames)
 | 
			
		||||
 | 
			
		||||
        self.gid.set_text(person.getId())
 | 
			
		||||
        self.gid.set_editable(Config.id_edit)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								src/Find.py
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								src/Find.py
									
									
									
									
									
								
							@@ -29,6 +29,7 @@ import const
 | 
			
		||||
import utils
 | 
			
		||||
import string
 | 
			
		||||
import gtk
 | 
			
		||||
import AutoComp
 | 
			
		||||
 | 
			
		||||
class Find:
 | 
			
		||||
    """Opens find person dialog for gramps"""
 | 
			
		||||
@@ -51,14 +52,13 @@ class Find:
 | 
			
		||||
 | 
			
		||||
        self.top = self.xml.get_widget("find")
 | 
			
		||||
        self.entry = self.xml.get_widget("entry")
 | 
			
		||||
 | 
			
		||||
        self.nlist = []
 | 
			
		||||
        for n in plist:
 | 
			
		||||
            self.nlist.append(n.getPrimaryName().getName())
 | 
			
		||||
            
 | 
			
		||||
        if Config.autocomp:
 | 
			
		||||
            self.nlist = [("","")]
 | 
			
		||||
            for n in plist:
 | 
			
		||||
                n1 = n.getPrimaryName().getName()
 | 
			
		||||
                n2 = string.lower(n1)
 | 
			
		||||
                self.nlist.append((n2,n1))
 | 
			
		||||
            self.nlist.sort()
 | 
			
		||||
            self.entry.connect("insert-text",self.insert_text)
 | 
			
		||||
            AutoComp.AutoComp(self.entry,self.nlist)
 | 
			
		||||
 | 
			
		||||
        self.next = self.xml.get_widget("next")
 | 
			
		||||
        self.top.editable_enters(self.entry)
 | 
			
		||||
@@ -139,83 +139,3 @@ class Find:
 | 
			
		||||
        """Callback for dialog box that causes the previous person to be found"""
 | 
			
		||||
        self.find_prev()
 | 
			
		||||
 | 
			
		||||
    #-------------------------------------------------------------------------
 | 
			
		||||
    #
 | 
			
		||||
    # Sets up a delayed (0.005 sec) handler for text completion.  Text
 | 
			
		||||
    # completion cannot be handled directly in this routine because, for
 | 
			
		||||
    # some reason, the select_region() function doesn't work when called
 | 
			
		||||
    # from signal handlers.  Go figure.
 | 
			
		||||
    #
 | 
			
		||||
    # Thanks to iain@nodata.demon.co.uk (in mail from 1999) for the idea
 | 
			
		||||
    # to use a timer to get away from the problems with signal handlers
 | 
			
		||||
    # and the select_region function.
 | 
			
		||||
    #
 | 
			
		||||
    #-------------------------------------------------------------------------
 | 
			
		||||
    def insert_text(self,entry,new_text,new_text_len,i_dont_care):
 | 
			
		||||
        # One time setup to clear selected region when user moves on
 | 
			
		||||
        if (not entry.get_data("signal_set")):
 | 
			
		||||
            entry.set_data("signal_set",1)
 | 
			
		||||
            entry.signal_connect("focus_out_event", self.lost_focus, entry)
 | 
			
		||||
 | 
			
		||||
        # Nuke the current timer if the user types fast enough
 | 
			
		||||
        timer = entry.get_data("timer");
 | 
			
		||||
        if (timer):
 | 
			
		||||
            gtk.timeout_remove(timer)
 | 
			
		||||
 | 
			
		||||
        # Setup a callback timer so we can operate outside of a signal handler
 | 
			
		||||
        timer = gtk.timeout_add(5, self.timer_callback, entry)
 | 
			
		||||
        entry.set_data("timer", timer);
 | 
			
		||||
 | 
			
		||||
    #-------------------------------------------------------------------------
 | 
			
		||||
    #
 | 
			
		||||
    # The entry box entry field lost focus.  Go clear any selection.  Why
 | 
			
		||||
    # this form of a select_region() call works in a signal handler and
 | 
			
		||||
    # the other form doesn't is a mystery.
 | 
			
		||||
    #
 | 
			
		||||
    #-------------------------------------------------------------------------
 | 
			
		||||
    def lost_focus(self,entry,a,b):
 | 
			
		||||
        entry.select_region(0, 0)
 | 
			
		||||
 | 
			
		||||
    #-------------------------------------------------------------------------
 | 
			
		||||
    #
 | 
			
		||||
    # The workhorse routine of file completion.  This routine grabs the
 | 
			
		||||
    # current text of the entry box, and grubs through the list item
 | 
			
		||||
    # looking for any case insensitive matches.  This routine relies on
 | 
			
		||||
    # public knowledge of the GtkEntry data structure, not on any private
 | 
			
		||||
    # data.
 | 
			
		||||
    #
 | 
			
		||||
    # These three completion routines have only one gramps specific hook,
 | 
			
		||||
    # and can be easily ported to any program.
 | 
			
		||||
    #
 | 
			
		||||
    #-------------------------------------------------------------------------
 | 
			
		||||
    def timer_callback(self,entry):
 | 
			
		||||
        # Clear any timer
 | 
			
		||||
        timer = entry.get_data("timer");
 | 
			
		||||
        if (timer):
 | 
			
		||||
            gtk.timeout_remove(timer)
 | 
			
		||||
 | 
			
		||||
        # Get the user's text
 | 
			
		||||
        typed = entry.get_text()
 | 
			
		||||
        if (not typed):
 | 
			
		||||
            return
 | 
			
		||||
        typed_lc = string.lower(typed)
 | 
			
		||||
 | 
			
		||||
        # Walk the GtkList in the entry box
 | 
			
		||||
        for nl,n in self.nlist:
 | 
			
		||||
            if (not nl):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            # If equal, no need to add any text
 | 
			
		||||
            if (typed_lc == nl):
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
            # If typed text is a substring of the label text, then fill in
 | 
			
		||||
            # the entry field with the full text (and correcting
 | 
			
		||||
            # capitalization), and then select all the characters that
 | 
			
		||||
            # don't match.  With the user's enxt keystroke these will be
 | 
			
		||||
            # replaced if they are incorrect.
 | 
			
		||||
            if (string.find(nl,typed_lc) == 0):
 | 
			
		||||
                entry.set_text(n)
 | 
			
		||||
                entry.set_position(len(typed))
 | 
			
		||||
                entry.select_region(len(typed), -1)
 | 
			
		||||
                return
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1235
									
								
								src/WriteXML.py
									
									
									
									
									
								
							
							
						
						
									
										1235
									
								
								src/WriteXML.py
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										124
									
								
								src/gramps.glade
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								src/gramps.glade
									
									
									
									
									
								
							@@ -2185,29 +2185,117 @@
 | 
			
		||||
	      </widget>
 | 
			
		||||
 | 
			
		||||
	      <widget>
 | 
			
		||||
		<class>GtkLabel</class>
 | 
			
		||||
		<class>GtkHBox</class>
 | 
			
		||||
		<child_name>CList:title</child_name>
 | 
			
		||||
		<name>glabel13</name>
 | 
			
		||||
		<label>ID</label>
 | 
			
		||||
		<justify>GTK_JUSTIFY_CENTER</justify>
 | 
			
		||||
		<wrap>False</wrap>
 | 
			
		||||
		<xalign>0.5</xalign>
 | 
			
		||||
		<yalign>0.5</yalign>
 | 
			
		||||
		<xpad>0</xpad>
 | 
			
		||||
		<ypad>0</ypad>
 | 
			
		||||
		<name>hbox70</name>
 | 
			
		||||
		<homogeneous>True</homogeneous>
 | 
			
		||||
		<spacing>0</spacing>
 | 
			
		||||
 | 
			
		||||
		<widget>
 | 
			
		||||
		  <class>GtkHBox</class>
 | 
			
		||||
		  <name>hbox71</name>
 | 
			
		||||
		  <homogeneous>False</homogeneous>
 | 
			
		||||
		  <spacing>0</spacing>
 | 
			
		||||
		  <child>
 | 
			
		||||
		    <padding>0</padding>
 | 
			
		||||
		    <expand>False</expand>
 | 
			
		||||
		    <fill>False</fill>
 | 
			
		||||
		  </child>
 | 
			
		||||
 | 
			
		||||
		  <widget>
 | 
			
		||||
		    <class>GtkLabel</class>
 | 
			
		||||
		    <child_name>CList:title</child_name>
 | 
			
		||||
		    <name>label294</name>
 | 
			
		||||
		    <label>ID</label>
 | 
			
		||||
		    <justify>GTK_JUSTIFY_CENTER</justify>
 | 
			
		||||
		    <wrap>False</wrap>
 | 
			
		||||
		    <xalign>0.5</xalign>
 | 
			
		||||
		    <yalign>0.5</yalign>
 | 
			
		||||
		    <xpad>0</xpad>
 | 
			
		||||
		    <ypad>0</ypad>
 | 
			
		||||
		    <child>
 | 
			
		||||
		      <padding>0</padding>
 | 
			
		||||
		      <expand>False</expand>
 | 
			
		||||
		      <fill>False</fill>
 | 
			
		||||
		    </child>
 | 
			
		||||
		  </widget>
 | 
			
		||||
 | 
			
		||||
		  <widget>
 | 
			
		||||
		    <class>GtkArrow</class>
 | 
			
		||||
		    <name>cIDSort</name>
 | 
			
		||||
		    <width>10</width>
 | 
			
		||||
		    <height>10</height>
 | 
			
		||||
		    <visible>False</visible>
 | 
			
		||||
		    <arrow_type>GTK_ARROW_DOWN</arrow_type>
 | 
			
		||||
		    <shadow_type>GTK_SHADOW_OUT</shadow_type>
 | 
			
		||||
		    <xalign>0.5</xalign>
 | 
			
		||||
		    <yalign>0.5</yalign>
 | 
			
		||||
		    <xpad>0</xpad>
 | 
			
		||||
		    <ypad>0</ypad>
 | 
			
		||||
		    <child>
 | 
			
		||||
		      <padding>5</padding>
 | 
			
		||||
		      <expand>False</expand>
 | 
			
		||||
		      <fill>True</fill>
 | 
			
		||||
		    </child>
 | 
			
		||||
		  </widget>
 | 
			
		||||
		</widget>
 | 
			
		||||
	      </widget>
 | 
			
		||||
 | 
			
		||||
	      <widget>
 | 
			
		||||
		<class>GtkLabel</class>
 | 
			
		||||
		<class>GtkHBox</class>
 | 
			
		||||
		<child_name>CList:title</child_name>
 | 
			
		||||
		<name>label14</name>
 | 
			
		||||
		<label>Gender</label>
 | 
			
		||||
		<justify>GTK_JUSTIFY_CENTER</justify>
 | 
			
		||||
		<wrap>False</wrap>
 | 
			
		||||
		<xalign>0.5</xalign>
 | 
			
		||||
		<yalign>0.5</yalign>
 | 
			
		||||
		<xpad>0</xpad>
 | 
			
		||||
		<ypad>0</ypad>
 | 
			
		||||
		<name>hbox72</name>
 | 
			
		||||
		<homogeneous>True</homogeneous>
 | 
			
		||||
		<spacing>0</spacing>
 | 
			
		||||
 | 
			
		||||
		<widget>
 | 
			
		||||
		  <class>GtkHBox</class>
 | 
			
		||||
		  <name>hbox73</name>
 | 
			
		||||
		  <homogeneous>False</homogeneous>
 | 
			
		||||
		  <spacing>0</spacing>
 | 
			
		||||
		  <child>
 | 
			
		||||
		    <padding>0</padding>
 | 
			
		||||
		    <expand>False</expand>
 | 
			
		||||
		    <fill>False</fill>
 | 
			
		||||
		  </child>
 | 
			
		||||
 | 
			
		||||
		  <widget>
 | 
			
		||||
		    <class>GtkLabel</class>
 | 
			
		||||
		    <child_name>CList:title</child_name>
 | 
			
		||||
		    <name>label295</name>
 | 
			
		||||
		    <label>Gender</label>
 | 
			
		||||
		    <justify>GTK_JUSTIFY_CENTER</justify>
 | 
			
		||||
		    <wrap>False</wrap>
 | 
			
		||||
		    <xalign>0.5</xalign>
 | 
			
		||||
		    <yalign>0.5</yalign>
 | 
			
		||||
		    <xpad>0</xpad>
 | 
			
		||||
		    <ypad>0</ypad>
 | 
			
		||||
		    <child>
 | 
			
		||||
		      <padding>0</padding>
 | 
			
		||||
		      <expand>False</expand>
 | 
			
		||||
		      <fill>False</fill>
 | 
			
		||||
		    </child>
 | 
			
		||||
		  </widget>
 | 
			
		||||
 | 
			
		||||
		  <widget>
 | 
			
		||||
		    <class>GtkArrow</class>
 | 
			
		||||
		    <name>cGenderSort</name>
 | 
			
		||||
		    <width>10</width>
 | 
			
		||||
		    <height>10</height>
 | 
			
		||||
		    <visible>False</visible>
 | 
			
		||||
		    <arrow_type>GTK_ARROW_DOWN</arrow_type>
 | 
			
		||||
		    <shadow_type>GTK_SHADOW_OUT</shadow_type>
 | 
			
		||||
		    <xalign>0.5</xalign>
 | 
			
		||||
		    <yalign>0.5</yalign>
 | 
			
		||||
		    <xpad>0</xpad>
 | 
			
		||||
		    <ypad>0</ypad>
 | 
			
		||||
		    <child>
 | 
			
		||||
		      <padding>5</padding>
 | 
			
		||||
		      <expand>False</expand>
 | 
			
		||||
		      <fill>True</fill>
 | 
			
		||||
		    </child>
 | 
			
		||||
		  </widget>
 | 
			
		||||
		</widget>
 | 
			
		||||
	      </widget>
 | 
			
		||||
 | 
			
		||||
	      <widget>
 | 
			
		||||
 
 | 
			
		||||
@@ -118,11 +118,14 @@ DataFilter    = Filter.Filter("")
 | 
			
		||||
c_birth_order = 0
 | 
			
		||||
c_name        = 1
 | 
			
		||||
c_id          = 2
 | 
			
		||||
c_gender      = 3
 | 
			
		||||
c_birth_date  = 4
 | 
			
		||||
c_details     = 6
 | 
			
		||||
c_sort_column = c_birth_order
 | 
			
		||||
c_sort_direct = GTK.SORT_ASCENDING
 | 
			
		||||
cNameArrow    = None
 | 
			
		||||
cGenderArrow  = None
 | 
			
		||||
cIDArrow      = None
 | 
			
		||||
cDateArrow    = None
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
@@ -843,7 +846,7 @@ def set_sort_arrow(column,direct):
 | 
			
		||||
    else:
 | 
			
		||||
        arrow.set(GTK.ARROW_UP,2)
 | 
			
		||||
    
 | 
			
		||||
def change_sort(column):
 | 
			
		||||
def change_sort(column,change=1):
 | 
			
		||||
    global sort_direct
 | 
			
		||||
    global sort_column
 | 
			
		||||
 | 
			
		||||
@@ -855,22 +858,24 @@ def change_sort(column):
 | 
			
		||||
            a.hide()
 | 
			
		||||
    arrow.show()
 | 
			
		||||
 | 
			
		||||
    if sort_column == column:
 | 
			
		||||
        if sort_direct == GTK.SORT_DESCENDING:
 | 
			
		||||
            sort_direct = GTK.SORT_ASCENDING
 | 
			
		||||
            arrow.set(GTK.ARROW_DOWN,2)
 | 
			
		||||
        else:
 | 
			
		||||
            sort_direct = GTK.SORT_DESCENDING
 | 
			
		||||
            arrow.set(GTK.ARROW_UP,2)
 | 
			
		||||
    else:
 | 
			
		||||
        sort_direct = GTK.SORT_ASCENDING
 | 
			
		||||
        arrow.set(GTK.ARROW_DOWN,2)
 | 
			
		||||
    sort_column = column
 | 
			
		||||
 | 
			
		||||
    person_list.set_sort_column(col_map[column])
 | 
			
		||||
    person_list.set_sort_type(sort_direct)
 | 
			
		||||
 | 
			
		||||
    sort_person_list()
 | 
			
		||||
 | 
			
		||||
    if change:
 | 
			
		||||
        if sort_column == column:
 | 
			
		||||
            if sort_direct == GTK.SORT_DESCENDING:
 | 
			
		||||
                sort_direct = GTK.SORT_ASCENDING
 | 
			
		||||
                arrow.set(GTK.ARROW_DOWN,2)
 | 
			
		||||
            else:
 | 
			
		||||
                sort_direct = GTK.SORT_DESCENDING
 | 
			
		||||
                arrow.set(GTK.ARROW_UP,2)
 | 
			
		||||
        else:
 | 
			
		||||
            sort_direct = GTK.SORT_ASCENDING
 | 
			
		||||
            arrow.set(GTK.ARROW_DOWN,2)
 | 
			
		||||
    sort_column = column
 | 
			
		||||
 | 
			
		||||
    if id2col.has_key(active_person):
 | 
			
		||||
        row = person_list.find_row_from_data(id2col[active_person])
 | 
			
		||||
        person_list.moveto(row)
 | 
			
		||||
@@ -997,9 +1002,13 @@ def on_child_list_select_row(obj,row,b,c):
 | 
			
		||||
#-------------------------------------------------------------------------
 | 
			
		||||
def on_child_list_click_column(clist,column):
 | 
			
		||||
    if column == c_name:
 | 
			
		||||
        child_change_sort(clist,c_name,gtop.get_widget("cNameSort"))
 | 
			
		||||
        child_change_sort(clist,c_name,cNameArrow)
 | 
			
		||||
    elif column == c_gender:
 | 
			
		||||
        child_change_sort(clist,c_gender,cGenderArrow)
 | 
			
		||||
    elif column == c_id:
 | 
			
		||||
        child_change_sort(clist,c_id,cIDArrow)
 | 
			
		||||
    elif (column == c_birth_order) or (column == c_birth_date):
 | 
			
		||||
        child_change_sort(clist,c_birth_order,gtop.get_widget("cDateSort"))
 | 
			
		||||
        child_change_sort(clist,c_birth_order,cDateArrow)
 | 
			
		||||
    else:
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
@@ -1019,6 +1028,8 @@ def child_change_sort(clist,column,arrow):
 | 
			
		||||
 | 
			
		||||
    cNameArrow.hide()
 | 
			
		||||
    cDateArrow.hide()
 | 
			
		||||
    cIDArrow.hide()
 | 
			
		||||
    cGenderArrow.hide()
 | 
			
		||||
    arrow.show()
 | 
			
		||||
    
 | 
			
		||||
    if c_sort_column == column:
 | 
			
		||||
@@ -1034,7 +1045,6 @@ def child_change_sort(clist,column,arrow):
 | 
			
		||||
    clist.set_sort_type(c_sort_direct)
 | 
			
		||||
    clist.set_sort_column(c_sort_column)
 | 
			
		||||
    clist.set_reorderable(c_sort_column == c_birth_order)
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
def sort_child_list(clist):
 | 
			
		||||
    clist.freeze()
 | 
			
		||||
@@ -1982,7 +1992,7 @@ def main(arg):
 | 
			
		||||
    global person_list
 | 
			
		||||
    global topWindow, preview, merge_button
 | 
			
		||||
    global nameArrow, dateArrow, deathArrow, idArrow, genderArrow
 | 
			
		||||
    global cNameArrow, cDateArrow, toolbar
 | 
			
		||||
    global cNameArrow, cDateArrow, cIDArrow, cGenderArrow, toolbar
 | 
			
		||||
    global sort_column, sort_direct
 | 
			
		||||
    
 | 
			
		||||
    gtk.rc_parse(const.gtkrcFile)
 | 
			
		||||
@@ -2027,6 +2037,8 @@ def main(arg):
 | 
			
		||||
    media_view  = MediaView(database,gtop,update_display)
 | 
			
		||||
 | 
			
		||||
    cNameArrow  = gtop.get_widget("cNameSort")
 | 
			
		||||
    cGenderArrow= gtop.get_widget("cGenderSort")
 | 
			
		||||
    cIDArrow    = gtop.get_widget("cIDSort")
 | 
			
		||||
    cDateArrow  = gtop.get_widget("cDateSort")
 | 
			
		||||
    person_list.set_column_visibility(5,0)
 | 
			
		||||
    person_list.set_column_visibility(6,0)
 | 
			
		||||
@@ -2040,8 +2052,9 @@ def main(arg):
 | 
			
		||||
    topWindow.set_icon(gtk.GtkPixmap(topWindow,const.icon))
 | 
			
		||||
    
 | 
			
		||||
    person_list.column_titles_active()
 | 
			
		||||
 | 
			
		||||
    change_sort(sort_column,sort_direct==GTK.SORT_DESCENDING)
 | 
			
		||||
    set_sort_arrow(sort_column,sort_direct)
 | 
			
		||||
    change_sort(sort_column)
 | 
			
		||||
 | 
			
		||||
    gtop.signal_autoconnect({
 | 
			
		||||
        "delete_event"                      : delete_event,
 | 
			
		||||
 
 | 
			
		||||
@@ -94,7 +94,7 @@ class DetAncestorReport(Report):
 | 
			
		||||
                self.doc.start_paragraph("ChildList")
 | 
			
		||||
                t= child.getPrimaryName().getRegularName()
 | 
			
		||||
                #print "getBirth()", child.getBirth().__dict__
 | 
			
		||||
                if child.getBirth().getDate() != "" and \
 | 
			
		||||
                if child.getBirth().getDate() != "" or \
 | 
			
		||||
                        child.getBirth().getPlaceName() != "":
 | 
			
		||||
                    #print child.getBirth().getPlace().__dict__
 | 
			
		||||
                    t= t+ _(" Born: ")+child.getBirth().getDate() + \
 | 
			
		||||
@@ -339,7 +339,7 @@ class DetAncestorReport(Report):
 | 
			
		||||
                        elif fulldate == "" and place != "":
 | 
			
		||||
                            t= _("  %s married %s in %s." % (heshe, spouse, place))
 | 
			
		||||
                        elif fulldate != "" and place == "":
 | 
			
		||||
                            t= _("  %s married %s on %s" % (heshe, spouse, fulldate))
 | 
			
		||||
                            t= _("  %s married %s on %s." % (heshe, spouse, fulldate))
 | 
			
		||||
                        else: t= _("  %s married %s on %s in %s." % \
 | 
			
		||||
                                (heshe, spouse, fulldate, place))
 | 
			
		||||
                    else:
 | 
			
		||||
@@ -348,7 +348,7 @@ class DetAncestorReport(Report):
 | 
			
		||||
                        elif fulldate == "" and place != "":
 | 
			
		||||
                            t= _("  %s married in %s." % (heshe, place))
 | 
			
		||||
                        elif fulldate != "" and place == "":
 | 
			
		||||
                            t= _("  %s married on %s" % (heshe, fulldate))
 | 
			
		||||
                            t= _("  %s married on %s." % (heshe, fulldate))
 | 
			
		||||
                        else: t= _("  %s married on %s in %s." % \
 | 
			
		||||
                                (heshe, fulldate, place))
 | 
			
		||||
 | 
			
		||||
@@ -700,11 +700,11 @@ class reportOptions:
 | 
			
		||||
                if birth.getDayValid() and death.getDayValid():
 | 
			
		||||
                    if birth.getMonth() == death.getMonth() and birth.getDay() > death.getDay():
 | 
			
		||||
                        self.age= self.age -1
 | 
			
		||||
                        self.units= "month"
 | 
			
		||||
                    if self.age == 0:
 | 
			
		||||
                        self.age= death.getMonth() - birth.getMonth()   # calc age in months
 | 
			
		||||
                        if birth.getDay() > death.getDay():
 | 
			
		||||
                            self.age= self.age - 1
 | 
			
		||||
			    self.units= "month"
 | 
			
		||||
                        if self.age == 0:
 | 
			
		||||
                            self.age= death.getDay() + 31 - birth.getDay() # calc age in days
 | 
			
		||||
                            self.units= "day"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user