2008-02-14 Raphael Ackermann <raphael.ackermann@gmail.com>
* src/ObjectSelector/* : #1744: src/ObjectSelector is not used anmyore * src/TreeViews/* : #1744: src/TreeViews is not used anmyore * src/Treetips.py : changed class comment. pep8 fix for doc: ''' --> """ * src/plugins/SoundGen.py: remove ... in menu. imports cleanup svn: r10033
This commit is contained in:
		@@ -1,3 +1,9 @@
 | 
			
		||||
2008-02-14  Raphael Ackermann <raphael.ackermann@gmail.com>
 | 
			
		||||
    * src/ObjectSelector/* : #1744: src/ObjectSelector is not used anmyore
 | 
			
		||||
    * src/TreeViews/* : #1744: src/TreeViews is not used anmyore
 | 
			
		||||
    * src/Treetips.py : changed class comment. pep8 fix for doc: ''' --> """
 | 
			
		||||
    * src/plugins/SoundGen.py: remove ... in menu. imports cleanup
 | 
			
		||||
 | 
			
		||||
2008-02-14  Peter Landgren  <peter.talken@telia.com>
 | 
			
		||||
    * src/plugins/DefaultGramplets.py: fixed two strings to be translatabel
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
# This is the src/RelLib level Makefile for Gramps
 | 
			
		||||
# We could use GNU make's ':=' syntax for nice wildcard use,
 | 
			
		||||
# but that is not necessarily portable.
 | 
			
		||||
# If not using GNU make, then list all .py files individually
 | 
			
		||||
 | 
			
		||||
pkgdatadir = $(datadir)/@PACKAGE@/ObjectSelector
 | 
			
		||||
 | 
			
		||||
pkgdata_PYTHON = \
 | 
			
		||||
	_Constants.py\
 | 
			
		||||
	_Factories.py\
 | 
			
		||||
	_FamilyFilterFrame.py\
 | 
			
		||||
	_FamilyFrame.py\
 | 
			
		||||
	_FamilyPreviewFrame.py\
 | 
			
		||||
	_FamilyTreeFrame.py\
 | 
			
		||||
	_FilterFrameBase.py\
 | 
			
		||||
	_FilterSpecBase.py\
 | 
			
		||||
	__init__.py\
 | 
			
		||||
	_ObjectFrameBase.py\
 | 
			
		||||
	_ObjectSelectorWindow.py\
 | 
			
		||||
	_PersonFilterFrame.py\
 | 
			
		||||
	_PersonFilterSpec.py\
 | 
			
		||||
	_PersonFrame.py\
 | 
			
		||||
	_PersonPreviewFrame.py\
 | 
			
		||||
	_PersonTreeFrame.py\
 | 
			
		||||
	_PreviewFrameBase.py\
 | 
			
		||||
	_TreeFrameBase.py
 | 
			
		||||
 | 
			
		||||
pkgpyexecdir = @pkgpyexecdir@/ObjectSelector
 | 
			
		||||
pkgpythondir = @pkgpythondir@/ObjectSelector
 | 
			
		||||
 | 
			
		||||
# Clean up all the byte-compiled files
 | 
			
		||||
MOSTLYCLEANFILES = *pyc *pyo
 | 
			
		||||
 | 
			
		||||
GRAMPS_PY_MODPATH = "../"
 | 
			
		||||
 | 
			
		||||
pycheck:
 | 
			
		||||
        (export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
 | 
			
		||||
        pychecker $(pkgdata_PYTHON));
 | 
			
		||||
@@ -1,33 +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$
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ObjectTypes(object):
 | 
			
		||||
    
 | 
			
		||||
    PERSON     = 0
 | 
			
		||||
    FAMILY     = 1
 | 
			
		||||
    SOURCE     = 2
 | 
			
		||||
    EVENT      = 3
 | 
			
		||||
    MEDIA      = 4
 | 
			
		||||
    PLACE      = 5
 | 
			
		||||
    REPOSITORY = 6
 | 
			
		||||
    REFERENCE  = 7
 | 
			
		||||
@@ -1,36 +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$
 | 
			
		||||
 | 
			
		||||
from _Constants import ObjectTypes
 | 
			
		||||
 | 
			
		||||
from _PersonFrame import PersonFrame
 | 
			
		||||
from _FamilyFrame import FamilyFrame
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ObjectFrameFactory(object):
 | 
			
		||||
    __frame_creators = {ObjectTypes.PERSON: PersonFrame,
 | 
			
		||||
                        ObjectTypes.FAMILY: FamilyFrame}
 | 
			
		||||
 | 
			
		||||
    def get_frame(self,object_type,dbstate,uistate,filter_spec=None):
 | 
			
		||||
        return self.__class__.__frame_creators[object_type](dbstate,uistate,filter_spec)
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
@@ -1,91 +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$
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
from GrampsWidgets import IntEdit
 | 
			
		||||
from _FilterFrameBase import FilterFrameBase
 | 
			
		||||
 | 
			
		||||
class FamilyFilterFrame(FilterFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
    def __init__(self,filter_spec=None,label="Filter"):
 | 
			
		||||
        FilterFrameBase.__init__(self,filter_spec,label)
 | 
			
		||||
 | 
			
		||||
        # Gramps ID
 | 
			
		||||
        self._id_check,self._id_label,self._id_edit = \
 | 
			
		||||
	    self.make_text_widget("Gramps ID")
 | 
			
		||||
 | 
			
		||||
        # Name
 | 
			
		||||
        self._name_check,self._name_label,self._name_edit = \
 | 
			
		||||
	    self.make_text_widget("Name")
 | 
			
		||||
 | 
			
		||||
        # Mar
 | 
			
		||||
        self._mar_check, self._m_edit, \
 | 
			
		||||
	    self._m_before, self._m_after, \
 | 
			
		||||
	    self._m_unknown  = self.make_year_widget("Marriage Year")
 | 
			
		||||
 | 
			
		||||
        # Filter
 | 
			
		||||
        default_filters = []
 | 
			
		||||
 | 
			
		||||
        # don't currently support filters that need an attribute.	
 | 
			
		||||
        filters = [ filter for filter in default_filters if \
 | 
			
		||||
		    not hasattr(filter,'labels') or len(filter.labels) == 0 ]
 | 
			
		||||
 | 
			
		||||
        self._filter_list = gtk.ListStore(gobject.TYPE_STRING, object)
 | 
			
		||||
 | 
			
		||||
        for filter in filters:
 | 
			
		||||
            self._filter_list.append([filter.name,filter])
 | 
			
		||||
 | 
			
		||||
        self._filter_check,self._filter_label,self._filter_combo = \
 | 
			
		||||
	    self.make_combo_widget("Filter",self._filter_list)
 | 
			
		||||
        
 | 
			
		||||
        self._reset_widgets()
 | 
			
		||||
 | 
			
		||||
        if filter_spec is not None:
 | 
			
		||||
            self._set_filter(filter_spec)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def _set_filter(self):
 | 
			
		||||
        pass
 | 
			
		||||
    
 | 
			
		||||
    def on_apply(self,button):
 | 
			
		||||
        pass
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(FamilyFilterFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
 | 
			
		||||
    w = gtk.Window()
 | 
			
		||||
    f = FamilyFilterFrame()
 | 
			
		||||
    w.add(f)
 | 
			
		||||
    w.show_all()
 | 
			
		||||
 | 
			
		||||
    gtk.main()
 | 
			
		||||
@@ -1,97 +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$
 | 
			
		||||
 | 
			
		||||
#for debug, remove later
 | 
			
		||||
import sys
 | 
			
		||||
sys.path.append("..")
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
from _ObjectFrameBase import ObjectFrameBase
 | 
			
		||||
from _FamilyFilterFrame import FamilyFilterFrame
 | 
			
		||||
from _FamilyPreviewFrame import FamilyPreviewFrame
 | 
			
		||||
from _FamilyTreeFrame import FamilyTreeFrame
 | 
			
		||||
 | 
			
		||||
class FamilyFrame(ObjectFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        'selection-changed'  : (gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
                                gobject.TYPE_NONE,
 | 
			
		||||
                                (gobject.TYPE_STRING,
 | 
			
		||||
                                 gobject.TYPE_STRING)),
 | 
			
		||||
        
 | 
			
		||||
        'add-object': (gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
                       gobject.TYPE_NONE,
 | 
			
		||||
                       ())
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __person_id_field = 0
 | 
			
		||||
 | 
			
		||||
    def __init__(self,
 | 
			
		||||
                 dbstate,
 | 
			
		||||
                 uistate,
 | 
			
		||||
                 filter_spec=None):
 | 
			
		||||
        
 | 
			
		||||
        ObjectFrameBase.__init__(self,
 | 
			
		||||
                                 dbstate=dbstate,
 | 
			
		||||
                                 uistate=uistate,
 | 
			
		||||
                                 filter_frame = FamilyFilterFrame(filter_spec=filter_spec),
 | 
			
		||||
                                 preview_frame = FamilyPreviewFrame(dbstate),
 | 
			
		||||
                                 tree_frame = FamilyTreeFrame(dbstate))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        self._tree_frame.get_selection().connect('changed',self._handle_selection)
 | 
			
		||||
        self._tree_frame.get_selection().connect('changed',self.set_preview,self.__class__.__person_id_field)
 | 
			
		||||
        self._tree_frame.get_tree().connect('row-activated',self._on_row_activated)
 | 
			
		||||
 | 
			
		||||
    def new_object(self,button):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def _handle_selection(self,treeselection):
 | 
			
		||||
        (model, iter) = treeselection.get_selected()
 | 
			
		||||
        if iter and model.get_value(iter,self.__class__.__person_id_field):
 | 
			
		||||
            self.emit('selection-changed', "%s / %s [%s]" % (                
 | 
			
		||||
                str(model.get_value(iter,1)),
 | 
			
		||||
                str(model.get_value(iter,2)),
 | 
			
		||||
                str(model.get_value(iter,0))),
 | 
			
		||||
                      model.get_value(iter,self.__class__.__person_id_field))
 | 
			
		||||
        else:
 | 
			
		||||
            self.emit('selection-changed',"No Selection","")
 | 
			
		||||
 | 
			
		||||
    def _on_row_activated(self,widget,path,col):
 | 
			
		||||
        (model, iter) = widget.get_selection().get_selected()
 | 
			
		||||
        if iter and model.get_value(iter,self.__class__.__person_id_field):
 | 
			
		||||
            self.emit('add-object')
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(FamilyFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    pass
 | 
			
		||||
@@ -1,126 +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$
 | 
			
		||||
 | 
			
		||||
import os.path
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
log = getLogger(".ObjectSelector")
 | 
			
		||||
 | 
			
		||||
import ImgManip
 | 
			
		||||
import const
 | 
			
		||||
 | 
			
		||||
from _PreviewFrameBase import PreviewFrameBase
 | 
			
		||||
 | 
			
		||||
class FamilyPreviewFrame(PreviewFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
    def __init__(self,dbstate,label="Preview"):
 | 
			
		||||
        PreviewFrameBase.__init__(self,label)
 | 
			
		||||
        self._dbstate = dbstate
 | 
			
		||||
        align = gtk.Alignment()
 | 
			
		||||
 | 
			
		||||
        # Image
 | 
			
		||||
        self._image_l = gtk.Image()
 | 
			
		||||
        self._image_r = gtk.Image()
 | 
			
		||||
 | 
			
		||||
        image_box = gtk.HBox()
 | 
			
		||||
        image_box.pack_start(self._image_l)
 | 
			
		||||
        image_box.pack_start(self._image_r)
 | 
			
		||||
                             
 | 
			
		||||
        # Text
 | 
			
		||||
        label = gtk.Label()
 | 
			
		||||
        label.set_use_markup(True)
 | 
			
		||||
        label.set_line_wrap(True)
 | 
			
		||||
        label.set_justify(gtk.JUSTIFY_LEFT)
 | 
			
		||||
        label.set_alignment(xalign=0.1,yalign=0.1)
 | 
			
		||||
        label.set_markup("<b>Father:</b> Joe Blogs\n"
 | 
			
		||||
                         "<b>Mother:</b> Joe Blogs\n"
 | 
			
		||||
                         "<b>m:</b> 1906\n")
 | 
			
		||||
        
 | 
			
		||||
        # box
 | 
			
		||||
        box = gtk.VBox()
 | 
			
		||||
        box.pack_start(image_box,False,False)
 | 
			
		||||
        box.pack_start(label)
 | 
			
		||||
 | 
			
		||||
        # align
 | 
			
		||||
        
 | 
			
		||||
        align.add(box)
 | 
			
		||||
        align.set_padding(self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width)
 | 
			
		||||
        align.set(0.5,0.5,
 | 
			
		||||
                  1.0,1.0)
 | 
			
		||||
 | 
			
		||||
        self.add(align)
 | 
			
		||||
 | 
			
		||||
        self.clear_object()
 | 
			
		||||
 | 
			
		||||
    def set_object_from_id(self,id):
 | 
			
		||||
        try:
 | 
			
		||||
            family = self._dbstate.db.get_family_from_gramps_id(id)
 | 
			
		||||
 | 
			
		||||
            image = [self._image_l, self._image_r]
 | 
			
		||||
            image_no = 0
 | 
			
		||||
            for person_handle in (family.get_father_handle(),family.get_mother_handle()):
 | 
			
		||||
                person = self._dbstate.db.get_person_from_handle(person_handle)
 | 
			
		||||
                if not person:
 | 
			
		||||
                    return
 | 
			
		||||
 | 
			
		||||
                image_list = person.get_media_list()
 | 
			
		||||
                if image_list:
 | 
			
		||||
                    mobj = self._dbstate.db.get_object_from_handle(image_list[0].ref)
 | 
			
		||||
                    if mobj.get_mime_type()[0:5] == "image":
 | 
			
		||||
                        pixbuf = ImgManip.get_thumbnail_image(mobj.get_path())
 | 
			
		||||
                        image[image_no].set_from_pixbuf(pixbuf)
 | 
			
		||||
                        image_no += 1
 | 
			
		||||
                else:
 | 
			
		||||
                    self._image_l.set_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
                    self._image_r.set_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
 | 
			
		||||
        except:
 | 
			
		||||
            log.warn("Failed to generate preview for family", exc_info=True)
 | 
			
		||||
            self.clear_object()
 | 
			
		||||
 | 
			
		||||
    def clear_object(self):
 | 
			
		||||
        self._image_l.set_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
        self._image_r.set_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(FamilyPreviewFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
 | 
			
		||||
    w = gtk.Window()
 | 
			
		||||
    f = PersonPreviewFrame()
 | 
			
		||||
    w.add(f)
 | 
			
		||||
    w.show_all()
 | 
			
		||||
 | 
			
		||||
    gtk.main()
 | 
			
		||||
@@ -1,105 +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$
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
from DisplayModels import FamilyModel
 | 
			
		||||
 | 
			
		||||
from _TreeFrameBase import TreeFrameBase
 | 
			
		||||
 | 
			
		||||
class FamilyTreeFrame(TreeFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def __init__(self,dbstate):
 | 
			
		||||
        TreeFrameBase.__init__(self)        
 | 
			
		||||
 | 
			
		||||
        self._selection = None
 | 
			
		||||
        self._model = None
 | 
			
		||||
        
 | 
			
		||||
        self._dbstate = dbstate
 | 
			
		||||
        
 | 
			
		||||
        self._list = gtk.TreeView()
 | 
			
		||||
        self._list.set_rules_hint(True)
 | 
			
		||||
        self._list.set_headers_visible(True)
 | 
			
		||||
        self._list.set_headers_clickable(True)
 | 
			
		||||
 | 
			
		||||
        #self._list.connect('button-press-event',self._button_press)
 | 
			
		||||
        #self._list.connect('key-press-event',self._key_press)
 | 
			
		||||
 | 
			
		||||
        # Add columns
 | 
			
		||||
        columns = [['ID',0],
 | 
			
		||||
                   ['Father',1],
 | 
			
		||||
                   ['Mother',2],
 | 
			
		||||
                   ['Type',3],
 | 
			
		||||
                   ['Change',4]]
 | 
			
		||||
        
 | 
			
		||||
        for field in columns:
 | 
			
		||||
            column = gtk.TreeViewColumn(field[0], gtk.CellRendererText(), text=field[1])
 | 
			
		||||
            column.set_resizable(True)
 | 
			
		||||
            column.set_min_width(75)
 | 
			
		||||
            column.set_clickable(True)
 | 
			
		||||
            self._list.append_column(column)
 | 
			
		||||
            
 | 
			
		||||
        scrollwindow = gtk.ScrolledWindow()
 | 
			
		||||
        scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 | 
			
		||||
        scrollwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN)
 | 
			
		||||
 | 
			
		||||
        scrollwindow.add(self._list)
 | 
			
		||||
 | 
			
		||||
        self._selection = self._list.get_selection()
 | 
			
		||||
 | 
			
		||||
        self.add(scrollwindow)
 | 
			
		||||
 | 
			
		||||
        self.set_model(self._dbstate.db)
 | 
			
		||||
 | 
			
		||||
    def set_model(self,db):
 | 
			
		||||
 | 
			
		||||
        self._model = FamilyModel(db)
 | 
			
		||||
 | 
			
		||||
        self._list.set_model(self._model)
 | 
			
		||||
 | 
			
		||||
        self._selection = self._list.get_selection()
 | 
			
		||||
 | 
			
		||||
    def get_selection(self):
 | 
			
		||||
        return self._selection
 | 
			
		||||
 | 
			
		||||
    def get_tree(self):
 | 
			
		||||
        return self._list
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(FamilyTreeFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
 | 
			
		||||
    w = ObjectSelectorWindow()
 | 
			
		||||
    w.show_all()
 | 
			
		||||
    w.connect("destroy", gtk.main_quit)
 | 
			
		||||
 | 
			
		||||
    gtk.main()
 | 
			
		||||
@@ -1,247 +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$
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
from GrampsWidgets import IntEdit
 | 
			
		||||
 | 
			
		||||
class FilterFrameBase(gtk.Frame):
 | 
			
		||||
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        'apply-filter': (gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
                         gobject.TYPE_NONE,
 | 
			
		||||
                         (gobject.TYPE_PYOBJECT,)),
 | 
			
		||||
        'clear-filter': (gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
                         gobject.TYPE_NONE,
 | 
			
		||||
                         ())
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
    def __init__(self,filter_spec=None,label="Filter"):
 | 
			
		||||
        gtk.Frame.__init__(self,label)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        self._checkboxes = []
 | 
			
		||||
        self._active_widgets = []
 | 
			
		||||
 | 
			
		||||
        self._current_row = 0
 | 
			
		||||
                
 | 
			
		||||
        self._filter_spec = filter_spec    
 | 
			
		||||
 | 
			
		||||
        box = gtk.EventBox()
 | 
			
		||||
        align = gtk.Alignment()
 | 
			
		||||
 | 
			
		||||
        # table layout
 | 
			
		||||
        
 | 
			
		||||
        self._table = gtk.Table(3,6,False)
 | 
			
		||||
        self._table.set_row_spacings(5)
 | 
			
		||||
        self._table.set_col_spacings(5)
 | 
			
		||||
 | 
			
		||||
        self._label_col = 0
 | 
			
		||||
        self._check_col = 1
 | 
			
		||||
        self._control_col = 2
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        # Apply / Clear
 | 
			
		||||
 | 
			
		||||
        apply_button = gtk.Button(stock=gtk.STOCK_APPLY)
 | 
			
		||||
        apply_button.connect('clicked',self.on_apply)
 | 
			
		||||
        clear_button = gtk.Button(stock=gtk.STOCK_CLEAR)
 | 
			
		||||
        clear_button.connect('clicked',self.on_clear)
 | 
			
		||||
 | 
			
		||||
        button_box = gtk.HButtonBox()
 | 
			
		||||
        button_box.set_layout(gtk.BUTTONBOX_SPREAD)
 | 
			
		||||
        button_box.pack_start(apply_button,False,False)
 | 
			
		||||
        button_box.pack_start(clear_button,False,False)
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        # Outer box
 | 
			
		||||
 | 
			
		||||
        outer_box = gtk.VBox()
 | 
			
		||||
        outer_box.pack_start(self._table,True,True)
 | 
			
		||||
        outer_box.pack_start(button_box,False,False)
 | 
			
		||||
        outer_box.set_border_width(self.__class__.__default_border_width/2)
 | 
			
		||||
        outer_box.set_spacing(self.__class__.__default_border_width/2)
 | 
			
		||||
        
 | 
			
		||||
        align.add(outer_box)
 | 
			
		||||
        align.set_padding(self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width)
 | 
			
		||||
                          
 | 
			
		||||
 | 
			
		||||
        box.add(align)
 | 
			
		||||
        self.add(box)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def _reset_widgets(self):
 | 
			
		||||
        for widget in self._active_widgets:
 | 
			
		||||
            widget.set_sensitive(False)
 | 
			
		||||
        for check in self._checkboxes:
 | 
			
		||||
            check.set_active(False)
 | 
			
		||||
 | 
			
		||||
    def on_clear(self,button=None):
 | 
			
		||||
        self._reset_widgets()
 | 
			
		||||
        self.emit('clear-filter')
 | 
			
		||||
 | 
			
		||||
    def make_text_widget(self,widget_label):
 | 
			
		||||
        """create a text edit widget with a label and check box."""
 | 
			
		||||
    
 | 
			
		||||
        check_col=self._check_col
 | 
			
		||||
        label_col=self._label_col
 | 
			
		||||
        control_col=self._control_col
 | 
			
		||||
    
 | 
			
		||||
        check = gtk.CheckButton()
 | 
			
		||||
        self._checkboxes.append(check)
 | 
			
		||||
    
 | 
			
		||||
        label = gtk.Label(widget_label)
 | 
			
		||||
        label.set_alignment(xalign=0,yalign=0.5)
 | 
			
		||||
    
 | 
			
		||||
        edit = gtk.Entry()
 | 
			
		||||
        self._active_widgets.append(edit)
 | 
			
		||||
    
 | 
			
		||||
        check.connect('toggled',lambda b: edit.set_sensitive(check.get_active()))
 | 
			
		||||
    
 | 
			
		||||
        self._table.attach(check,check_col,check_col+1, self._current_row,
 | 
			
		||||
                           self._current_row+1,xoptions=False,yoptions=False)
 | 
			
		||||
        self._table.attach(label,label_col,label_col+1, self._current_row, 
 | 
			
		||||
                           self._current_row+1,xoptions=gtk.FILL,
 | 
			
		||||
                           yoptions=False)
 | 
			
		||||
        self._table.attach(edit,control_col,control_col+1, self._current_row,
 | 
			
		||||
                           self._current_row+1,xoptions=gtk.EXPAND|gtk.FILL,
 | 
			
		||||
                           yoptions=False)
 | 
			
		||||
        self._current_row += 1
 | 
			
		||||
    
 | 
			
		||||
        return(check,label,edit)
 | 
			
		||||
 | 
			
		||||
    def make_combo_widget(self,widget_label,list_model):
 | 
			
		||||
        """create a combo widget with a label and check box."""
 | 
			
		||||
        check_col=self._check_col
 | 
			
		||||
        label_col=self._label_col
 | 
			
		||||
        control_col=self._control_col
 | 
			
		||||
    
 | 
			
		||||
        check = gtk.CheckButton()
 | 
			
		||||
        self._checkboxes.append(check)
 | 
			
		||||
    
 | 
			
		||||
        label = gtk.Label(widget_label)
 | 
			
		||||
        label.set_alignment(xalign=0,yalign=0.5)
 | 
			
		||||
    
 | 
			
		||||
        combo = gtk.ComboBox(list_model)
 | 
			
		||||
        self._active_widgets.append(combo)
 | 
			
		||||
    
 | 
			
		||||
        label_cell = gtk.CellRendererText()
 | 
			
		||||
    
 | 
			
		||||
        combo.pack_start(label_cell, True)
 | 
			
		||||
        combo.add_attribute(label_cell, 'text', 0)
 | 
			
		||||
        combo.set_active(2)
 | 
			
		||||
    
 | 
			
		||||
        check.connect('toggled',lambda b: combo.set_sensitive(check.get_active()))
 | 
			
		||||
    
 | 
			
		||||
        self._table.attach(check,check_col,check_col+1,
 | 
			
		||||
    	                   self._current_row,self._current_row+1,
 | 
			
		||||
                           xoptions=False,yoptions=False)
 | 
			
		||||
        self._table.attach(label,label_col,label_col+1, self._current_row,
 | 
			
		||||
                           self._current_row+1,xoptions=gtk.FILL,
 | 
			
		||||
                           yoptions=False)
 | 
			
		||||
        self._table.attach(combo,control_col,control_col+1, self._current_row,
 | 
			
		||||
                           self._current_row+1,xoptions=gtk.EXPAND|gtk.FILL,
 | 
			
		||||
                           yoptions=False)
 | 
			
		||||
        self._current_row += 1
 | 
			
		||||
    
 | 
			
		||||
        return (check,label,combo)
 | 
			
		||||
 | 
			
		||||
    def make_year_widget(self,widget_label):
 | 
			
		||||
        """Create a widget with a year edit entry, a before and after check box.
 | 
			
		||||
        Including a check box to enable and disable all the widgets."""
 | 
			
		||||
        check_col=self._check_col
 | 
			
		||||
        label_col=self._label_col
 | 
			
		||||
        control_col=self._control_col
 | 
			
		||||
    
 | 
			
		||||
        check = gtk.CheckButton()
 | 
			
		||||
        check.set_alignment(xalign=0,yalign=0)
 | 
			
		||||
        self._checkboxes.append(check)
 | 
			
		||||
    
 | 
			
		||||
        label = gtk.Label(widget_label)
 | 
			
		||||
        label.set_alignment(xalign=0,yalign=0)
 | 
			
		||||
    
 | 
			
		||||
        edit = IntEdit()
 | 
			
		||||
        self._active_widgets.append(edit)
 | 
			
		||||
    
 | 
			
		||||
        before = gtk.RadioButton(group=None,label="Before")
 | 
			
		||||
        self._active_widgets.append(before)
 | 
			
		||||
    
 | 
			
		||||
        after = gtk.RadioButton(before,"After")
 | 
			
		||||
        self._active_widgets.append(after)
 | 
			
		||||
        before.set_active(True)
 | 
			
		||||
    
 | 
			
		||||
        unknown = gtk.CheckButton("Include Unknown")
 | 
			
		||||
        self._active_widgets.append(unknown)
 | 
			
		||||
        unknown.set_active(False)
 | 
			
		||||
    
 | 
			
		||||
        check.connect('toggled',lambda b: edit.set_sensitive(check.get_active()))
 | 
			
		||||
        check.connect('toggled',lambda b: before.set_sensitive(check.get_active()))
 | 
			
		||||
        check.connect('toggled',lambda b: after.set_sensitive(check.get_active()))
 | 
			
		||||
        #check.connect('toggled',lambda b: unknown.set_sensitive(check.get_active()))
 | 
			
		||||
    
 | 
			
		||||
        inner_box = gtk.HBox()
 | 
			
		||||
        inner_box.pack_start(before)
 | 
			
		||||
        inner_box.pack_start(after)
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
        self._table.attach(check,check_col,check_col+1, self._current_row,
 | 
			
		||||
                           self._current_row+1,xoptions=False,yoptions=False)
 | 
			
		||||
        self._table.attach(label,label_col,label_col+1, self._current_row,
 | 
			
		||||
                           self._current_row+1,xoptions=gtk.FILL,
 | 
			
		||||
                           yoptions=False)
 | 
			
		||||
        self._table.attach(edit,control_col,control_col+1, self._current_row,
 | 
			
		||||
                           self._current_row+1,xoptions=gtk.EXPAND|gtk.FILL,
 | 
			
		||||
                           yoptions=False)
 | 
			
		||||
    
 | 
			
		||||
        self._current_row +=1
 | 
			
		||||
        self._table.attach(inner_box,control_col,control_col+1, 
 | 
			
		||||
                           self._current_row,self._current_row+1,
 | 
			
		||||
                           xoptions=gtk.EXPAND|gtk.FILL,yoptions=False)
 | 
			
		||||
    
 | 
			
		||||
        self._current_row +=1
 | 
			
		||||
        self._table.attach(unknown,control_col,control_col+1,
 | 
			
		||||
    			           self._current_row,self._current_row+1,
 | 
			
		||||
                           xoptions=gtk.EXPAND|gtk.FILL,yoptions=False)
 | 
			
		||||
        self._current_row +=1
 | 
			
		||||
    
 | 
			
		||||
        return (check, edit, before, after, unknown)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def on_apply(self,button):
 | 
			
		||||
        """Build a GenericFilter object from the settings in the filter 
 | 
			
		||||
        controls and emit a 'apply-filter' signal with the GenericFilter object
 | 
			
		||||
        as the parameter."""
 | 
			
		||||
 | 
			
		||||
        raise NotImplementedError("subclass of FilterFrameBase must implement on_apply")
 | 
			
		||||
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(FilterFrameBase)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,36 +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$
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FilterSpecBase(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self._gramps_id = None
 | 
			
		||||
 | 
			
		||||
    def set_gramps_id(self,gramps_id):
 | 
			
		||||
        self._gramps_id = gramps_id
 | 
			
		||||
 | 
			
		||||
    def get_gramps_id(self):
 | 
			
		||||
        return self._gramps_id
 | 
			
		||||
 | 
			
		||||
    def include_gramps_id(self):
 | 
			
		||||
        return self._gramps_id is not None
 | 
			
		||||
@@ -1,112 +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$
 | 
			
		||||
 | 
			
		||||
#for debug, remove later
 | 
			
		||||
import sys
 | 
			
		||||
sys.path.append("..")
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
class ObjectFrameBase(gtk.Frame):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {}
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
    def __init__(self,
 | 
			
		||||
                 dbstate,
 | 
			
		||||
                 uistate,
 | 
			
		||||
                 filter_frame,
 | 
			
		||||
                 preview_frame,
 | 
			
		||||
                 tree_frame):
 | 
			
		||||
        
 | 
			
		||||
        gtk.Frame.__init__(self)
 | 
			
		||||
 | 
			
		||||
        self._dbstate = dbstate
 | 
			
		||||
        self._uistate = uistate
 | 
			
		||||
        self._filter_frame = filter_frame
 | 
			
		||||
        self._preview_frame = preview_frame
 | 
			
		||||
        self._tree_frame = tree_frame
 | 
			
		||||
 | 
			
		||||
        self._preview_frame.set_sensitive(False)
 | 
			
		||||
        
 | 
			
		||||
        # Create the widgets for each of the object types
 | 
			
		||||
 | 
			
		||||
        vbox = gtk.VBox()
 | 
			
		||||
        vbox.show()
 | 
			
		||||
 | 
			
		||||
        vbox2 = gtk.VBox()
 | 
			
		||||
        vbox2.show()
 | 
			
		||||
        
 | 
			
		||||
        pane = gtk.HPaned()
 | 
			
		||||
        pane.show()
 | 
			
		||||
        
 | 
			
		||||
        vbox.pack_start(self._preview_frame,True,True)
 | 
			
		||||
        vbox.pack_start(self._filter_frame,True,True)
 | 
			
		||||
        vbox2.pack_start(self._tree_frame,True,True)
 | 
			
		||||
 | 
			
		||||
        pane.pack1(vbox2,True,False)
 | 
			
		||||
        pane.pack2(vbox,False,True)
 | 
			
		||||
 | 
			
		||||
        pane_align = gtk.Alignment()
 | 
			
		||||
        pane_align.add(pane)
 | 
			
		||||
        pane_align.set_padding(self.__class__.__default_border_width,
 | 
			
		||||
                               self.__class__.__default_border_width,
 | 
			
		||||
                               self.__class__.__default_border_width,
 | 
			
		||||
                               self.__class__.__default_border_width)
 | 
			
		||||
        pane_align.set(0.5,0.5,1,1)
 | 
			
		||||
        pane_align.show()
 | 
			
		||||
        
 | 
			
		||||
        self.add(pane_align)
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
    def set_preview(self,treeselection):
 | 
			
		||||
        (model, iter) = treeselection.get_selected()
 | 
			
		||||
        if iter:
 | 
			
		||||
            (obj,rowref) = model.get_value(iter,0)
 | 
			
		||||
            if len(rowref) > 1 or model.is_list():
 | 
			
		||||
                if obj:
 | 
			
		||||
                    self._preview_frame.set_sensitive(True)
 | 
			
		||||
                    self._preview_frame.set_object(obj)
 | 
			
		||||
                else:
 | 
			
		||||
                    self._preview_frame.set_sensitive(False)
 | 
			
		||||
                    self._preview_frame.clear_object()
 | 
			
		||||
            else:
 | 
			
		||||
                self._preview_frame.set_sensitive(False)
 | 
			
		||||
                self._preview_frame.clear_object()
 | 
			
		||||
        else:
 | 
			
		||||
            self._preview_frame.set_sensitive(False)
 | 
			
		||||
            self._preview_frame.clear_object()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def get_selection(self):
 | 
			
		||||
        return self._tree_frame.get_selection()
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(ObjectFrameBase)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    pass
 | 
			
		||||
@@ -1,351 +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$
 | 
			
		||||
 | 
			
		||||
#for debug, remove later
 | 
			
		||||
import sys
 | 
			
		||||
sys.path.append("..")
 | 
			
		||||
sys.path.append(".")
 | 
			
		||||
sys.path.append("ObjectSelector")
 | 
			
		||||
 | 
			
		||||
import os.path
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
from gettext import gettext as _
 | 
			
		||||
 | 
			
		||||
import _Factories
 | 
			
		||||
from _Constants import ObjectTypes
 | 
			
		||||
 | 
			
		||||
from ManagedWindow import ManagedWindow
 | 
			
		||||
import const
 | 
			
		||||
 | 
			
		||||
class _ObjectTypeWidgets(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self.frame = None
 | 
			
		||||
        self.sel_label = None
 | 
			
		||||
        self.selected_obj = None
 | 
			
		||||
        self.new_button = None
 | 
			
		||||
 | 
			
		||||
    def show(self):
 | 
			
		||||
        self.frame.show_all()
 | 
			
		||||
        self.sel_label.show_all()
 | 
			
		||||
        self.new_button.show()
 | 
			
		||||
 | 
			
		||||
    def hide(self):
 | 
			
		||||
        self.frame.hide_all()
 | 
			
		||||
        self.sel_label.hide_all()
 | 
			
		||||
        self.new_button.hide()
 | 
			
		||||
 | 
			
		||||
    def set_selected_obj(self,obj):
 | 
			
		||||
        self.selected_obj = obj
 | 
			
		||||
 | 
			
		||||
OBJECT_LIST = [ObjectTypes.PERSON, ObjectTypes.FAMILY,
 | 
			
		||||
               ObjectTypes.SOURCE, ObjectTypes.EVENT,
 | 
			
		||||
               ObjectTypes.MEDIA,  ObjectTypes.PLACE,
 | 
			
		||||
               ObjectTypes.REPOSITORY]
 | 
			
		||||
 | 
			
		||||
class ObjectSelectorWindow(gtk.Window,ManagedWindow):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        'add-object'  : (gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
                         gobject.TYPE_NONE,
 | 
			
		||||
                         (gobject.TYPE_PYOBJECT,)),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def __init__(self,
 | 
			
		||||
                 dbstate,
 | 
			
		||||
                 uistate,
 | 
			
		||||
                 track,
 | 
			
		||||
                 title = _("Select Object"),
 | 
			
		||||
                 filter_spec = None,
 | 
			
		||||
                 default_object_type = ObjectTypes.PERSON,
 | 
			
		||||
                 object_list = OBJECT_LIST):
 | 
			
		||||
 | 
			
		||||
        # Init the display manager
 | 
			
		||||
        ManagedWindow.__init__(self,uistate,track,self)
 | 
			
		||||
 | 
			
		||||
        # Init the Window
 | 
			
		||||
        gtk.Window.__init__(self)
 | 
			
		||||
 | 
			
		||||
        self._dbstate = dbstate
 | 
			
		||||
        self._uistate = dbstate
 | 
			
		||||
        self._track = track
 | 
			
		||||
        self._object_list = object_list
 | 
			
		||||
        self._current_object_type = None
 | 
			
		||||
 | 
			
		||||
        # Create objects to hold the information about
 | 
			
		||||
        # each object type
 | 
			
		||||
        self._object_frames = {}        
 | 
			
		||||
        for object_type in object_list:
 | 
			
		||||
            self._object_frames[object_type] = _ObjectTypeWidgets()
 | 
			
		||||
 | 
			
		||||
        self.set_title(title)
 | 
			
		||||
        
 | 
			
		||||
        # Selected object label
 | 
			
		||||
 | 
			
		||||
        new_button_box = gtk.VBox()
 | 
			
		||||
        new_button_box.show()
 | 
			
		||||
        
 | 
			
		||||
        for object_type in object_list:
 | 
			
		||||
            new_button = gtk.Button(stock=gtk.STOCK_NEW)
 | 
			
		||||
 | 
			
		||||
            self._object_frames[object_type].new_button = new_button
 | 
			
		||||
            new_button_box.pack_start(new_button)
 | 
			
		||||
 | 
			
		||||
        label = gtk.Label("<b>Selected:</b>")
 | 
			
		||||
        label.set_use_markup(True)
 | 
			
		||||
        label.set_alignment(xalign=0.9,yalign=0.5)
 | 
			
		||||
        label.set_padding(self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width)
 | 
			
		||||
 | 
			
		||||
        label.show()
 | 
			
		||||
 | 
			
		||||
        sel_frame = gtk.Frame()
 | 
			
		||||
        sel_frame.set_shadow_type(gtk.SHADOW_IN)
 | 
			
		||||
        sel_frame.set_border_width(self.__class__.__default_border_width*2)
 | 
			
		||||
 | 
			
		||||
        sel_label_box = gtk.HBox()
 | 
			
		||||
        sel_label_box.show()
 | 
			
		||||
                
 | 
			
		||||
        for object_type in object_list:
 | 
			
		||||
            sel_label = gtk.Label("No Selected Object")
 | 
			
		||||
            sel_label.set_alignment(xalign=0,yalign=0.5)
 | 
			
		||||
            sel_label_box.pack_start(sel_label)
 | 
			
		||||
 | 
			
		||||
            self._object_frames[object_type].sel_label = sel_label
 | 
			
		||||
 | 
			
		||||
        sel_frame.add(sel_label_box)
 | 
			
		||||
        sel_frame.show()
 | 
			
		||||
        
 | 
			
		||||
        label_box = gtk.HBox()
 | 
			
		||||
        label_box.pack_start(new_button_box,False,False)
 | 
			
		||||
        label_box.pack_start(label,False,False)
 | 
			
		||||
        label_box.pack_start(sel_frame,True,True)
 | 
			
		||||
        label_box.show()
 | 
			
		||||
        
 | 
			
		||||
        # Object select
 | 
			
		||||
        obj_label = gtk.Label("<b>Show</b>")
 | 
			
		||||
        obj_label.set_use_markup(True)
 | 
			
		||||
        obj_label.set_alignment(xalign=0.9,yalign=0.5)
 | 
			
		||||
        obj_label.set_padding(self.__class__.__default_border_width,
 | 
			
		||||
                              self.__class__.__default_border_width)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            person_pixbuf = gtk.gdk.pixbuf_new_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
            flist_pixbuf = gtk.gdk.pixbuf_new_from_file(os.path.join(const.IMAGE_DIR,"flist.svg"))
 | 
			
		||||
    
 | 
			
		||||
            self._tool_list = gtk.ListStore(gtk.gdk.Pixbuf, 
 | 
			
		||||
                                            gobject.TYPE_STRING, 
 | 
			
		||||
                                            gobject.TYPE_INT)
 | 
			
		||||
    
 | 
			
		||||
            d={ObjectTypes.PERSON: [person_pixbuf,'People',ObjectTypes.PERSON],
 | 
			
		||||
    	       ObjectTypes.FAMILY: [flist_pixbuf,'Families',ObjectTypes.FAMILY],
 | 
			
		||||
    	       ObjectTypes.EVENT: [person_pixbuf,'Events',ObjectTypes.EVENT]}
 | 
			
		||||
    
 | 
			
		||||
            self._object_type_column = 2
 | 
			
		||||
 | 
			
		||||
        except gobject.GError:
 | 
			
		||||
            self._tool_list = gtk.ListStore(gobject.TYPE_STRING, 
 | 
			
		||||
                                            gobject.TYPE_INT)
 | 
			
		||||
 | 
			
		||||
            d={ObjectTypes.PERSON: ['People',ObjectTypes.PERSON],
 | 
			
		||||
    	       ObjectTypes.FAMILY: ['Families',ObjectTypes.FAMILY],
 | 
			
		||||
    	       ObjectTypes.EVENT: ['Events',ObjectTypes.EVENT]}
 | 
			
		||||
    
 | 
			
		||||
            self._object_type_column = 1
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        for object_type in self._object_list:        
 | 
			
		||||
            self._tool_list.append(d[object_type])
 | 
			
		||||
        
 | 
			
		||||
        self._tool_combo = gtk.ComboBox(self._tool_list)
 | 
			
		||||
        
 | 
			
		||||
        icon_cell = gtk.CellRendererPixbuf()
 | 
			
		||||
        label_cell = gtk.CellRendererText()
 | 
			
		||||
        
 | 
			
		||||
        self._tool_combo.pack_start(icon_cell, True)
 | 
			
		||||
        self._tool_combo.pack_start(label_cell, True)
 | 
			
		||||
        
 | 
			
		||||
        self._tool_combo.add_attribute(icon_cell, 'pixbuf', 0)
 | 
			
		||||
        self._tool_combo.add_attribute(label_cell, 'text', 1)
 | 
			
		||||
 | 
			
		||||
        self._tool_combo.set_active(0)
 | 
			
		||||
 | 
			
		||||
        self._tool_combo.connect('changed', lambda c: self._set_object_type(self._tool_list.get_value(c.get_active_iter(),2)))
 | 
			
		||||
        
 | 
			
		||||
        tool_box = gtk.HBox()
 | 
			
		||||
        tool_box.pack_start(obj_label,False,False)
 | 
			
		||||
        tool_box.pack_start(self._tool_combo,False,False)
 | 
			
		||||
 | 
			
		||||
        # only show the object_list if there is more than
 | 
			
		||||
        # one object_type requested.
 | 
			
		||||
        if len(self._object_list) > 1:
 | 
			
		||||
            self._tool_combo.show()
 | 
			
		||||
            obj_label.show()
 | 
			
		||||
            tool_box.show()
 | 
			
		||||
 | 
			
		||||
        # Top box
 | 
			
		||||
 | 
			
		||||
        top_box = gtk.HBox()
 | 
			
		||||
        top_box.pack_start(tool_box,False,False)
 | 
			
		||||
        top_box.pack_start(label_box,True,True)
 | 
			
		||||
        top_box.show()
 | 
			
		||||
        
 | 
			
		||||
        # Create the widgets for each of the object types
 | 
			
		||||
 | 
			
		||||
        # Object frame box
 | 
			
		||||
 | 
			
		||||
        frame_box = gtk.HBox()
 | 
			
		||||
        frame_box.show()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        for object_type in object_list:
 | 
			
		||||
            
 | 
			
		||||
            self._object_frames[object_type].frame = \
 | 
			
		||||
                        _Factories.ObjectFrameFactory().get_frame(object_type,dbstate,uistate,filter_spec)
 | 
			
		||||
 | 
			
		||||
            # connect signals                
 | 
			
		||||
            self._object_frames[object_type].frame.connect(
 | 
			
		||||
                'selection-changed',
 | 
			
		||||
                lambda widget,text,selected_object,label: label.set_text(text),
 | 
			
		||||
                self._object_frames[object_type].sel_label)
 | 
			
		||||
 | 
			
		||||
            self._object_frames[object_type].frame.connect(
 | 
			
		||||
                'selection-changed',
 | 
			
		||||
                lambda widget,text,selected_object,current_object: current_object.set_selected_obj(selected_object),
 | 
			
		||||
                self._object_frames[object_type])
 | 
			
		||||
 | 
			
		||||
            self._object_frames[object_type].frame.connect(
 | 
			
		||||
                'selection-changed',
 | 
			
		||||
                self.on_selection_changed)
 | 
			
		||||
 | 
			
		||||
            self._object_frames[object_type].frame.connect(
 | 
			
		||||
                'add-object',
 | 
			
		||||
                self.on_add)
 | 
			
		||||
            
 | 
			
		||||
            self._object_frames[object_type].new_button.connect(
 | 
			
		||||
                'clicked',
 | 
			
		||||
                self._object_frames[object_type].frame.new_object)
 | 
			
		||||
            
 | 
			
		||||
            frame_box.pack_start(self._object_frames[object_type].frame,True,True)
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        # Bottom buttons
 | 
			
		||||
        self._add_button = gtk.Button(stock=gtk.STOCK_ADD)
 | 
			
		||||
        self._add_button.set_sensitive(False)
 | 
			
		||||
        self._add_button.show()
 | 
			
		||||
 | 
			
		||||
        self._add_button.connect("clicked", self.on_add)
 | 
			
		||||
        
 | 
			
		||||
        cancel_button = gtk.Button(stock=gtk.STOCK_CANCEL)
 | 
			
		||||
        cancel_button.show()
 | 
			
		||||
        
 | 
			
		||||
        cancel_button.connect_object("clicked", self._close_window, self)
 | 
			
		||||
        
 | 
			
		||||
        bottom_button_bar = gtk.HButtonBox()
 | 
			
		||||
        bottom_button_bar.set_layout(gtk.BUTTONBOX_SPREAD)
 | 
			
		||||
        bottom_button_bar.set_spacing(self.__class__.__default_border_width/2)
 | 
			
		||||
        bottom_button_bar.set_border_width(self.__class__.__default_border_width)
 | 
			
		||||
        bottom_button_bar.add(cancel_button)
 | 
			
		||||
        bottom_button_bar.add(self._add_button)
 | 
			
		||||
        bottom_button_bar.show()
 | 
			
		||||
        
 | 
			
		||||
        box = gtk.VBox()
 | 
			
		||||
        box.pack_start(top_box,False,False)
 | 
			
		||||
        box.pack_start(frame_box,True,True)
 | 
			
		||||
        box.pack_start(bottom_button_bar,False,False)
 | 
			
		||||
        box.show()
 | 
			
		||||
        
 | 
			
		||||
        align = gtk.Alignment()
 | 
			
		||||
        align.set_padding(self.__class__.__default_border_width,
 | 
			
		||||
                           self.__class__.__default_border_width,
 | 
			
		||||
                           self.__class__.__default_border_width,
 | 
			
		||||
                           self.__class__.__default_border_width)
 | 
			
		||||
        align.set(0.5,0.5,1,1)
 | 
			
		||||
        align.add(box)
 | 
			
		||||
        align.show()
 | 
			
		||||
        
 | 
			
		||||
        self.add(align)
 | 
			
		||||
 | 
			
		||||
        self._set_object_type(default_object_type)
 | 
			
		||||
        self.set_default_size(700,300)
 | 
			
		||||
 | 
			
		||||
        self.show()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def _close_window(self,obj):
 | 
			
		||||
        self.close()
 | 
			
		||||
 | 
			
		||||
    def _set_object_type(self,selected_object_type):
 | 
			
		||||
        # enable selected object type
 | 
			
		||||
        self._object_frames[selected_object_type].show()
 | 
			
		||||
 | 
			
		||||
        # disable all the others
 | 
			
		||||
        [ self._object_frames[object_type].hide() for object_type in self._object_list
 | 
			
		||||
          if object_type != selected_object_type]
 | 
			
		||||
 | 
			
		||||
        # Set the object selector list to the selected object type
 | 
			
		||||
        # this is required because we may be asked to set the object type
 | 
			
		||||
        # without the use selecting it explicitly from the list.
 | 
			
		||||
        store = self._tool_list
 | 
			
		||||
        it = store.get_iter_first()
 | 
			
		||||
        while it:
 | 
			
		||||
            if store.get(it, self._object_type_column)[0] == selected_object_type:
 | 
			
		||||
                break	    
 | 
			
		||||
            it = store.iter_next(it)
 | 
			
		||||
 | 
			
		||||
        if it != None:
 | 
			
		||||
            self._tool_combo.set_active_iter(it)
 | 
			
		||||
 | 
			
		||||
        self._current_object_type = selected_object_type
 | 
			
		||||
 | 
			
		||||
        # Set the add button sensitivity
 | 
			
		||||
        if self._object_frames[selected_object_type].selected_obj:
 | 
			
		||||
            self._add_button.set_sensitive(True)
 | 
			
		||||
        else:
 | 
			
		||||
            self._add_button.set_sensitive(False)
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
    def on_add(self,widget=None,object=None):
 | 
			
		||||
        if object is None:
 | 
			
		||||
            self.emit('add-object',self._object_frames[self._current_object_type].selected_obj)
 | 
			
		||||
        else:
 | 
			
		||||
            self.emit('add-object',object)
 | 
			
		||||
        
 | 
			
		||||
    def on_selection_changed(self,widget,text,handle):
 | 
			
		||||
        if handle:
 | 
			
		||||
            self._add_button.set_sensitive(True)
 | 
			
		||||
        else:
 | 
			
		||||
            self._add_button.set_sensitive(False)
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(ObjectSelectorWindow)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1,240 +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$
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
from gettext import gettext as _
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
 | 
			
		||||
log = getLogger(".ObjectSelector")
 | 
			
		||||
 | 
			
		||||
from _FilterFrameBase import FilterFrameBase
 | 
			
		||||
from Filters import GenericFilter, Rules
 | 
			
		||||
import gen.lib
 | 
			
		||||
 | 
			
		||||
class PersonFilterFrame(FilterFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    # This is used when the widgets are packed into the ObjectSelector
 | 
			
		||||
    # frames.
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
    def __init__(self,filter_spec=None,label="Filter"):
 | 
			
		||||
        FilterFrameBase.__init__(self,filter_spec,label)
 | 
			
		||||
 | 
			
		||||
        # Build the filter widgets, the make_* methods are
 | 
			
		||||
        # in the FilterFrameBase base class.
 | 
			
		||||
 | 
			
		||||
        # Gramps ID
 | 
			
		||||
        self._id_check,self._id_label,self._id_edit = \
 | 
			
		||||
	    self.make_text_widget("Gramps ID")
 | 
			
		||||
 | 
			
		||||
        # Name
 | 
			
		||||
        self._name_check,self._name_label,self._name_edit = \
 | 
			
		||||
	    self.make_text_widget("Name")
 | 
			
		||||
 | 
			
		||||
        # Gender
 | 
			
		||||
        genders=[[_("Male"),gen.lib.Person.MALE],
 | 
			
		||||
                 [_("Female"),gen.lib.Person.FEMALE],
 | 
			
		||||
                 [_("Unknown"),gen.lib.Person.UNKNOWN]]
 | 
			
		||||
 | 
			
		||||
        self._gender_list = gtk.ListStore(gobject.TYPE_STRING, 
 | 
			
		||||
                                          gobject.TYPE_INT)
 | 
			
		||||
 | 
			
		||||
        for entry in genders:
 | 
			
		||||
            self._gender_list.append(entry)
 | 
			
		||||
 | 
			
		||||
        self._gender_check,self._gender_label, self._gender_combo = \
 | 
			
		||||
	    self.make_combo_widget("Gender",self._gender_list)
 | 
			
		||||
 | 
			
		||||
        # Birth
 | 
			
		||||
        self._birth_check, self._b_edit, \
 | 
			
		||||
	    self._b_before, self._b_after, \
 | 
			
		||||
	    self._b_unknown  = self.make_year_widget("Birth Year")
 | 
			
		||||
 | 
			
		||||
        # Death
 | 
			
		||||
        self._death_check, self._d_edit, \
 | 
			
		||||
	    self._d_before, self._d_after, \
 | 
			
		||||
	    self._d_unknown  = self.make_year_widget("Death Year")
 | 
			
		||||
 | 
			
		||||
        # Filter
 | 
			
		||||
        default_filters = [
 | 
			
		||||
            Rules.Person.Everyone,
 | 
			
		||||
            Rules.Person.IsFemale,
 | 
			
		||||
            Rules.Person.IsMale,
 | 
			
		||||
            Rules.Person.HasUnknownGender,
 | 
			
		||||
            Rules.Person.Disconnected,
 | 
			
		||||
            Rules.Person.SearchName,
 | 
			
		||||
            Rules.Person.HaveAltFamilies,
 | 
			
		||||
            Rules.Person.HavePhotos,
 | 
			
		||||
            Rules.Person.IncompleteNames,
 | 
			
		||||
            Rules.Person.HaveChildren,
 | 
			
		||||
            Rules.Person.NeverMarried,
 | 
			
		||||
            Rules.Person.MultipleMarriages,
 | 
			
		||||
            Rules.Person.NoBirthdate,
 | 
			
		||||
            Rules.Person.PersonWithIncompleteEvent,
 | 
			
		||||
            Rules.Person.FamilyWithIncompleteEvent,
 | 
			
		||||
            Rules.Person.ProbablyAlive,
 | 
			
		||||
            Rules.Person.PeoplePrivate,
 | 
			
		||||
            Rules.Person.IsWitness, 
 | 
			
		||||
            Rules.Person.HasTextMatchingSubstringOf, 
 | 
			
		||||
            Rules.Person.HasTextMatchingRegexpOf, 
 | 
			
		||||
            Rules.Person.HasNote, 
 | 
			
		||||
            Rules.Person.HasNoteMatchingSubstringOf, 
 | 
			
		||||
            Rules.Person.IsFemale,
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
        # don't currently support filters that need an attribute.	
 | 
			
		||||
        filters = [ filter for filter in default_filters if \
 | 
			
		||||
		    not hasattr(filter,'labels') or len(filter.labels) == 0 ]
 | 
			
		||||
 | 
			
		||||
        self._filter_list = gtk.ListStore(gobject.TYPE_STRING, gobject)
 | 
			
		||||
 | 
			
		||||
        for filter in filters:
 | 
			
		||||
            self._filter_list.append([filter.name,filter])
 | 
			
		||||
 | 
			
		||||
        self._filter_check,self._filter_label,self._filter_combo = \
 | 
			
		||||
	    self.make_combo_widget("Filter",self._filter_list)
 | 
			
		||||
 | 
			
		||||
        self._reset_widgets()
 | 
			
		||||
        
 | 
			
		||||
        if filter_spec is not None:
 | 
			
		||||
            self._set_filter(filter_spec)
 | 
			
		||||
 | 
			
		||||
    def _set_filter(self,filter_spec):
 | 
			
		||||
        if filter_spec.include_gramps_id():
 | 
			
		||||
            self._id_check.set_active(True)
 | 
			
		||||
            self._id_edit.set_text(filter_spec.get_gramps_id())
 | 
			
		||||
        else:
 | 
			
		||||
            self._id_check.set_active(False)
 | 
			
		||||
            self._id_edit.set_text("")
 | 
			
		||||
 | 
			
		||||
        if filter_spec.include_name():
 | 
			
		||||
            self._name_check.set_active(True)
 | 
			
		||||
            self._name_edit.set_text(filter_spec.get_name())
 | 
			
		||||
        else:
 | 
			
		||||
            self._name_check.set_active(False)
 | 
			
		||||
            self._name_edit.set_text("")
 | 
			
		||||
 | 
			
		||||
        if filter_spec.include_gender():
 | 
			
		||||
            self._gender_check.set_active(True)
 | 
			
		||||
            store = self._gender_list
 | 
			
		||||
            it = store.get_iter_first()
 | 
			
		||||
            while it:
 | 
			
		||||
                if store.get(it, 1)[0] == filter_spec.get_gender():
 | 
			
		||||
                    break
 | 
			
		||||
                it = store.iter_next(it)
 | 
			
		||||
 | 
			
		||||
            if it != None:
 | 
			
		||||
                self._gender_combo.set_active_iter(it)
 | 
			
		||||
        else:
 | 
			
		||||
            self._gender_check.set_active(False)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if filter_spec.include_birth():
 | 
			
		||||
            self._birth_check.set_active(True)
 | 
			
		||||
            self._b_edit.set_text(filter_spec.get_birth_year())
 | 
			
		||||
            if filter_spec.get_birth_criteria() == filter_spec.__class__.BEFORE:
 | 
			
		||||
                self._b_before.set_active(True)
 | 
			
		||||
                self._b_after.set_active(False)
 | 
			
		||||
            else:
 | 
			
		||||
                self._b_before.set_active(False)
 | 
			
		||||
                self._b_after.set_active(True)
 | 
			
		||||
        else:
 | 
			
		||||
            self._birth_check.set_active(False)
 | 
			
		||||
            self._b_edit.set_text("")
 | 
			
		||||
 | 
			
		||||
        if filter_spec.include_death():
 | 
			
		||||
            self._death_check.set_active(True)
 | 
			
		||||
            self._d_edit.set_text(filter_spec.get_death_year())
 | 
			
		||||
            if filter_spec.get_death_criteria() == filter_spec.__class__.BEFORE:
 | 
			
		||||
                self._d_before.set_active(True)
 | 
			
		||||
                self._d_after.set_active(False)
 | 
			
		||||
            else:
 | 
			
		||||
                self._d_before.set_active(False)
 | 
			
		||||
                self._d_after.set_active(True)
 | 
			
		||||
        else:
 | 
			
		||||
            self._death_check.set_active(False)
 | 
			
		||||
            self._d_edit.set_text("")
 | 
			
		||||
 | 
			
		||||
    def on_apply(self,button=None):
 | 
			
		||||
        filter = GenericFilter()
 | 
			
		||||
        
 | 
			
		||||
        if self._id_check.get_active():
 | 
			
		||||
            filter.add_rule(Rules.Person.HasIdOf([self._id_edit.get_text()]))
 | 
			
		||||
 | 
			
		||||
        if self._name_check.get_active():
 | 
			
		||||
            filter.add_rule(Rules.Person.SearchName([self._name_edit.get_text()]))
 | 
			
		||||
 | 
			
		||||
        if self._gender_check.get_active():
 | 
			
		||||
            gender = self._gender_list.get_value(self._gender_combo.get_active_iter(),1)
 | 
			
		||||
            if gender == gen.lib.Person.MALE:
 | 
			
		||||
                filter.add_rule(Rules.Person.IsMale([]))
 | 
			
		||||
            elif gender == gen.lib.Person.FEMALE:
 | 
			
		||||
                filter.add_rule(Rules.Person.IsFemale([]))
 | 
			
		||||
            elif gender == gen.lib.Person.UNKNOWN:
 | 
			
		||||
                filter.add_rule(Rules.Person.HasUnknownGender([]))
 | 
			
		||||
            else:
 | 
			
		||||
                log.warn("Received unknown gender from filter widget")
 | 
			
		||||
 | 
			
		||||
        if self._birth_check.get_active():
 | 
			
		||||
            date = ""
 | 
			
		||||
            if self._b_before.get_active():
 | 
			
		||||
                date = "before " + self._b_edit.get_text()
 | 
			
		||||
            elif self._b_after.get_active():
 | 
			
		||||
                date = "after " + self._b_edit.get_text()
 | 
			
		||||
            else:
 | 
			
		||||
                log.warn("neither before or after is selected, this should not happen")
 | 
			
		||||
            filter.add_rule(Rules.Person.HasBirth([date,'','']))
 | 
			
		||||
                
 | 
			
		||||
        if self._death_check.get_active():
 | 
			
		||||
            date = ""
 | 
			
		||||
            if self._d_before.get_active():
 | 
			
		||||
                date = "before " + self._d_edit.get_text()
 | 
			
		||||
            elif self._d_after.get_active():
 | 
			
		||||
                date = "after " + self._d_edit.get_text()
 | 
			
		||||
            else:
 | 
			
		||||
                log.warn("neither before or after is selected, this should not happen")
 | 
			
		||||
            filter.add_rule(Rules.Person.HasDeath([date,'','']))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if self._filter_check.get_active():
 | 
			
		||||
            filter.add_rule(self._filter_list.get_value(self._filter_combo.get_active_iter(),1)([]))
 | 
			
		||||
            
 | 
			
		||||
        self.emit('apply-filter',filter)
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(PersonFilterFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
 | 
			
		||||
    w = gtk.Window()
 | 
			
		||||
    f = PersonFilterFrame()
 | 
			
		||||
    w.add(f)
 | 
			
		||||
    
 | 
			
		||||
    w.show_all()
 | 
			
		||||
 | 
			
		||||
    gtk.main()
 | 
			
		||||
@@ -1,87 +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$
 | 
			
		||||
 | 
			
		||||
from _FilterSpecBase import FilterSpecBase
 | 
			
		||||
 | 
			
		||||
class PersonFilterSpec(FilterSpecBase):
 | 
			
		||||
 | 
			
		||||
    BEFORE = 1
 | 
			
		||||
    AFTER = 2
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        FilterSpecBase.__init__(self)
 | 
			
		||||
        
 | 
			
		||||
        self._name = None
 | 
			
		||||
        self._gender = None
 | 
			
		||||
        self._birth_year = None
 | 
			
		||||
        self._birth_criteria = self.__class__.BEFORE
 | 
			
		||||
        self._death_year = None
 | 
			
		||||
        self._death_criteria = self.__class__.BEFORE
 | 
			
		||||
 | 
			
		||||
    def set_name(self,name):
 | 
			
		||||
        self._name = name
 | 
			
		||||
 | 
			
		||||
    def get_name(self):
 | 
			
		||||
        return self._name
 | 
			
		||||
 | 
			
		||||
    def include_name(self):
 | 
			
		||||
        return self._name is not None
 | 
			
		||||
 | 
			
		||||
    def set_gender(self,gender):
 | 
			
		||||
        self._gender = gender
 | 
			
		||||
 | 
			
		||||
    def get_gender(self):
 | 
			
		||||
        return self._gender
 | 
			
		||||
 | 
			
		||||
    def include_gender(self):
 | 
			
		||||
        return self._gender is not None
 | 
			
		||||
 | 
			
		||||
    def set_birth_year(self,year):
 | 
			
		||||
        self._birth_year = str(year)
 | 
			
		||||
 | 
			
		||||
    def get_birth_year(self):
 | 
			
		||||
        return self._birth_year
 | 
			
		||||
 | 
			
		||||
    def include_birth(self):
 | 
			
		||||
        return self._birth_year is not None
 | 
			
		||||
 | 
			
		||||
    def set_birth_criteria(self,birth_criteria):
 | 
			
		||||
        self._birth_criteria = birth_criteria
 | 
			
		||||
 | 
			
		||||
    def get_birth_criteria(self):
 | 
			
		||||
        return self._birth_criteria
 | 
			
		||||
 | 
			
		||||
    def set_death_year(self,year):
 | 
			
		||||
        self._death_year = str(year)
 | 
			
		||||
 | 
			
		||||
    def get_death_year(self):
 | 
			
		||||
        return self._death_year
 | 
			
		||||
 | 
			
		||||
    def include_death(self):
 | 
			
		||||
        return self._death_year is not None
 | 
			
		||||
 | 
			
		||||
    def set_death_criteria(self,death_criteria):
 | 
			
		||||
        self._death_criteria = death_criteria
 | 
			
		||||
 | 
			
		||||
    def get_death_criteria(self):
 | 
			
		||||
        return self._death_criteria
 | 
			
		||||
 | 
			
		||||
@@ -1,116 +0,0 @@
 | 
			
		||||
#
 | 
			
		||||
# Gramps - a GTK+/GNOME based genealogy program
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2000-2007  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$
 | 
			
		||||
 | 
			
		||||
#for debug, remove later
 | 
			
		||||
import sys
 | 
			
		||||
sys.path.append("..")
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
from gen.lib import Person
 | 
			
		||||
from BasicUtils import name_displayer
 | 
			
		||||
display_name = name_displayer.display
 | 
			
		||||
 | 
			
		||||
from _ObjectFrameBase import ObjectFrameBase
 | 
			
		||||
from _PersonFilterFrame import PersonFilterFrame
 | 
			
		||||
from _PersonPreviewFrame import PersonPreviewFrame
 | 
			
		||||
from _PersonTreeFrame import PersonTreeFrame
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PersonFrame(ObjectFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        'selection-changed'  : (gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
                                gobject.TYPE_NONE,
 | 
			
		||||
                                (gobject.TYPE_STRING,
 | 
			
		||||
                                 gobject.TYPE_PYOBJECT)),
 | 
			
		||||
        
 | 
			
		||||
        'add-object': (gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
                       gobject.TYPE_NONE,
 | 
			
		||||
                       (gobject.TYPE_PYOBJECT,))
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __person_id_field = 1
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self,
 | 
			
		||||
                 dbstate,
 | 
			
		||||
                 uistate,
 | 
			
		||||
                 filter_spec = None):
 | 
			
		||||
        
 | 
			
		||||
        ObjectFrameBase.__init__(self,
 | 
			
		||||
                                 dbstate=dbstate,
 | 
			
		||||
                                 uistate=uistate,                                 
 | 
			
		||||
                                 filter_frame = PersonFilterFrame(filter_spec=filter_spec),
 | 
			
		||||
                                 preview_frame = PersonPreviewFrame(dbstate),
 | 
			
		||||
                                 tree_frame = PersonTreeFrame(dbstate))
 | 
			
		||||
 | 
			
		||||
        def handle_selection(treeselection):
 | 
			
		||||
            (model, iter) = treeselection.get_selected()
 | 
			
		||||
            if iter:                
 | 
			
		||||
                (person,rowref) = model.get_value(iter,0)
 | 
			
		||||
                if len(rowref) > 1 or model.is_list():
 | 
			
		||||
                    if person:
 | 
			
		||||
                        self.emit('selection-changed', "%s [%s]" % (display_name(person),
 | 
			
		||||
                                                                    person.get_gramps_id()),
 | 
			
		||||
                                  person)
 | 
			
		||||
                    else:
 | 
			
		||||
                        self.emit('selection-changed',"No Selection",None)
 | 
			
		||||
                else:
 | 
			
		||||
                    self.emit('selection-changed',"No Selection",None)                    
 | 
			
		||||
            else:
 | 
			
		||||
                self.emit('selection-changed',"No Selection",None)
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
        self._tree_frame.get_selection().connect('changed',handle_selection)                
 | 
			
		||||
        self._tree_frame.get_selection().connect('changed',self.set_preview)
 | 
			
		||||
        self._tree_frame.get_tree().connect('row-activated',self._on_row_activated)
 | 
			
		||||
 | 
			
		||||
        self._filter_frame.connect('apply-filter',lambda w,m: self._tree_frame.set_model(m))
 | 
			
		||||
        self._filter_frame.connect('clear-filter',lambda w: self._tree_frame.set_model(None))
 | 
			
		||||
 | 
			
		||||
        # Now that the filter is connected we need to tell it to apply any
 | 
			
		||||
        # filter_spec that may have been passed to it. We can't apply the filter
 | 
			
		||||
        # until the connections have been made.
 | 
			
		||||
        gobject.idle_add(self._filter_frame.on_apply)
 | 
			
		||||
 | 
			
		||||
    def _on_row_activated(self,widget,path,col):
 | 
			
		||||
        (model, iter) = widget.get_selection().get_selected()
 | 
			
		||||
        if iter:
 | 
			
		||||
            (o,rowref) = model.get_value(iter,0)
 | 
			
		||||
            if o:
 | 
			
		||||
                self.emit('add-object',o)
 | 
			
		||||
 | 
			
		||||
    def new_object(self,button):
 | 
			
		||||
        from Editors import EditPerson
 | 
			
		||||
        
 | 
			
		||||
        person = Person()
 | 
			
		||||
        EditPerson(self._dbstate,self._uistate,[],person)
 | 
			
		||||
        
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(PersonFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    pass
 | 
			
		||||
@@ -1,169 +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$
 | 
			
		||||
 | 
			
		||||
import os.path
 | 
			
		||||
 | 
			
		||||
from xml.sax.saxutils import escape
 | 
			
		||||
from gettext import gettext as _
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
log = getLogger(".ObjectSelector")
 | 
			
		||||
 | 
			
		||||
import ImgManip
 | 
			
		||||
import const
 | 
			
		||||
from ToolTips import PersonTip
 | 
			
		||||
import DateHandler
 | 
			
		||||
 | 
			
		||||
from _PreviewFrameBase import PreviewFrameBase
 | 
			
		||||
 | 
			
		||||
def short(val,size=60):
 | 
			
		||||
    if len(val) > size:
 | 
			
		||||
        return "%s..." % val[0:size]
 | 
			
		||||
    else:
 | 
			
		||||
        return val
 | 
			
		||||
 | 
			
		||||
class PersonPreviewFrame(PreviewFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
    def __init__(self,dbstate,label="Preview"):
 | 
			
		||||
        PreviewFrameBase.__init__(self,label)
 | 
			
		||||
        self._dbstate = dbstate
 | 
			
		||||
        align = gtk.Alignment()
 | 
			
		||||
 | 
			
		||||
        # Image
 | 
			
		||||
        self._image = gtk.Image()
 | 
			
		||||
 | 
			
		||||
        # test image
 | 
			
		||||
        self._image.set_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
        
 | 
			
		||||
        # Text
 | 
			
		||||
        label = gtk.Label()
 | 
			
		||||
        label.set_use_markup(True)
 | 
			
		||||
        label.set_line_wrap(True)
 | 
			
		||||
        label.set_justify(gtk.JUSTIFY_LEFT)
 | 
			
		||||
        label.set_alignment(xalign=0.5,yalign=0.1)
 | 
			
		||||
        
 | 
			
		||||
        # box
 | 
			
		||||
        box = gtk.VBox()
 | 
			
		||||
        box.pack_start(self._image,False,False)
 | 
			
		||||
        box.pack_start(label)
 | 
			
		||||
        
 | 
			
		||||
        # align
 | 
			
		||||
        align.add(box)
 | 
			
		||||
        align.set_padding(self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width,
 | 
			
		||||
                          self.__class__.__default_border_width)
 | 
			
		||||
        align.set(0.5,0.5,
 | 
			
		||||
                  1.0,1.0)
 | 
			
		||||
                          
 | 
			
		||||
        self.add(align)
 | 
			
		||||
        self._label = label
 | 
			
		||||
 | 
			
		||||
    def _get_text_preview(self,person):
 | 
			
		||||
        global escape
 | 
			
		||||
 | 
			
		||||
        birth_str = ""
 | 
			
		||||
        birth_ref = person.get_birth_ref()
 | 
			
		||||
        if birth_ref:
 | 
			
		||||
            birth = self._dbstate.db.get_event_from_handle(birth_ref.ref)
 | 
			
		||||
            date_str = DateHandler.get_date(birth)
 | 
			
		||||
            if date_str != "":
 | 
			
		||||
                birth_str = escape(date_str)
 | 
			
		||||
 | 
			
		||||
        death_str = ""
 | 
			
		||||
        death_ref = person.get_death_ref()
 | 
			
		||||
        if death_ref:
 | 
			
		||||
            death = self._dbstate.db.get_event_from_handle(death_ref.ref)
 | 
			
		||||
            date_str = DateHandler.get_date(death)
 | 
			
		||||
            if date_str != "":
 | 
			
		||||
                death_str = escape(date_str)
 | 
			
		||||
 | 
			
		||||
        s = "<span weight=\"bold\">%s</span>\n"\
 | 
			
		||||
            "   <span weight=\"normal\">%s:</span> %s\n"\
 | 
			
		||||
            "   <span weight=\"normal\">%s:</span> %s\n"\
 | 
			
		||||
            "   <span weight=\"normal\">%s:</span> %s\n"% (
 | 
			
		||||
            _("Person"),
 | 
			
		||||
            _("Name"),escape(person.get_primary_name().get_name()),
 | 
			
		||||
            _("Birth"),birth_str,
 | 
			
		||||
            _("Death"),death_str)
 | 
			
		||||
 | 
			
		||||
        if len(person.get_source_references()) > 0:
 | 
			
		||||
            psrc_ref = person.get_source_references()[0]
 | 
			
		||||
            psrc_id = psrc_ref.get_reference_handle()
 | 
			
		||||
            psrc = self._dbstate.db.get_source_from_handle(psrc_id)
 | 
			
		||||
 | 
			
		||||
            s += "\n<span weight=\"bold\">%s</span>\n"\
 | 
			
		||||
                 "   <span weight=\"normal\">%s:</span> %s\n" % (
 | 
			
		||||
                _("Primary source"),
 | 
			
		||||
                _("Name"),
 | 
			
		||||
                escape(short(psrc.get_title())))
 | 
			
		||||
 | 
			
		||||
        return s
 | 
			
		||||
 | 
			
		||||
    def set_object(self,person):
 | 
			
		||||
        try:
 | 
			
		||||
            image_list = person.get_media_list()
 | 
			
		||||
            if image_list:
 | 
			
		||||
                mobj = self._dbstate.db.get_object_from_handle(image_list[0].ref)
 | 
			
		||||
                if mobj.get_mime_type()[0:5] == "image":
 | 
			
		||||
                    pixbuf = ImgManip.get_thumbnail_image(mobj.get_path())
 | 
			
		||||
                    self._image.set_from_pixbuf(pixbuf)
 | 
			
		||||
            else:
 | 
			
		||||
                self._image.set_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
 | 
			
		||||
            self._label.set_markup(self._get_text_preview(person))
 | 
			
		||||
 | 
			
		||||
        except:
 | 
			
		||||
            log.warn("Failed to generate preview for person", exc_info=True)
 | 
			
		||||
            self.clear_object()
 | 
			
		||||
 | 
			
		||||
    def set_object_from_id(self,id):
 | 
			
		||||
        person = self._dbstate.db.get_person_from_gramps_id(id)
 | 
			
		||||
        if person:
 | 
			
		||||
            self.set_object(person)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def clear_object(self):
 | 
			
		||||
        self._image.set_from_file(os.path.join(const.IMAGE_DIR,"person.svg"))
 | 
			
		||||
        self._label.set_markup("")
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(PersonPreviewFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
 | 
			
		||||
    w = gtk.Window()
 | 
			
		||||
    f = PersonPreviewFrame()
 | 
			
		||||
    w.add(f)
 | 
			
		||||
    w.show_all()
 | 
			
		||||
 | 
			
		||||
    gtk.main()
 | 
			
		||||
@@ -1,119 +0,0 @@
 | 
			
		||||
#
 | 
			
		||||
# Gramps - a GTK+/GNOME based genealogy program
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2000-2007  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$
 | 
			
		||||
 | 
			
		||||
from gettext import gettext as _
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
from TreeViews import PersonTreeView
 | 
			
		||||
 | 
			
		||||
from _TreeFrameBase import TreeFrameBase
 | 
			
		||||
 | 
			
		||||
column_names = [
 | 
			
		||||
    _('Name'),
 | 
			
		||||
    _('ID') ,
 | 
			
		||||
    _('Gender'),
 | 
			
		||||
    _('Birth Date'),
 | 
			
		||||
    _('Birth Place'),
 | 
			
		||||
    _('Death Date'),
 | 
			
		||||
    _('Death Place'),
 | 
			
		||||
    _('Spouse'),
 | 
			
		||||
    _('Last Change'),
 | 
			
		||||
    _('Cause of Death'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PersonTreeFrame(TreeFrameBase):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __default_border_width = 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def __init__(self,dbstate):
 | 
			
		||||
        TreeFrameBase.__init__(self)
 | 
			
		||||
 | 
			
		||||
        self._dbstate = dbstate
 | 
			
		||||
        self._selection = None
 | 
			
		||||
        self._model = None
 | 
			
		||||
        self._data_filter = None
 | 
			
		||||
 | 
			
		||||
        self._tree = PersonTreeView(dbstate.db)
 | 
			
		||||
        self._tree.set_rules_hint(True)
 | 
			
		||||
        self._tree.set_headers_visible(True)
 | 
			
		||||
 | 
			
		||||
        self._tree.connect('row-activated',self._on_row_activated)
 | 
			
		||||
 | 
			
		||||
        scrollwindow = gtk.ScrolledWindow()
 | 
			
		||||
        scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 | 
			
		||||
        scrollwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN)
 | 
			
		||||
 | 
			
		||||
        scrollwindow.add(self._tree)
 | 
			
		||||
 | 
			
		||||
        self.add(scrollwindow)
 | 
			
		||||
 | 
			
		||||
        self.change_db(self._dbstate.db)
 | 
			
		||||
 | 
			
		||||
    def _on_row_activated(self,widget,path,col):
 | 
			
		||||
        """Expand / colapse row"""
 | 
			
		||||
 | 
			
		||||
        if self._tree.row_expanded(path):
 | 
			
		||||
            self._tree.collapse_row(path)
 | 
			
		||||
        else:
 | 
			
		||||
            self._tree.expand_row(path,False)
 | 
			
		||||
 | 
			
		||||
    def change_db(self,db):
 | 
			
		||||
        self.set_model()
 | 
			
		||||
 | 
			
		||||
    def set_model(self,data_filter=None):
 | 
			
		||||
 | 
			
		||||
        if data_filter is None:
 | 
			
		||||
            self._tree.get_selection().unselect_all()
 | 
			
		||||
            self._tree.clear_filter()
 | 
			
		||||
        else:
 | 
			
		||||
            self._tree.set_filter(data_filter)
 | 
			
		||||
            
 | 
			
		||||
        self._selection = self._tree.get_selection()
 | 
			
		||||
 | 
			
		||||
        # expand the first row so that the tree is a sensible size.
 | 
			
		||||
        self._tree.expand_row((0,),False)
 | 
			
		||||
 | 
			
		||||
    def get_selection(self):
 | 
			
		||||
        return self._selection
 | 
			
		||||
    
 | 
			
		||||
    def get_tree(self):
 | 
			
		||||
        return self._tree
 | 
			
		||||
 | 
			
		||||
if gtk.pygtk_version < (2,8,0):
 | 
			
		||||
    gobject.type_register(PersonTreeFrame)
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
 | 
			
		||||
    w = ObjectSelectorWindow()
 | 
			
		||||
    w.show_all()
 | 
			
		||||
    w.connect("destroy", gtk.main_quit)
 | 
			
		||||
 | 
			
		||||
    gtk.main()
 | 
			
		||||
@@ -1,36 +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$
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
 | 
			
		||||
class PreviewFrameBase(gtk.Frame):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def __init__(self,label):
 | 
			
		||||
        gtk.Frame.__init__(self,label)
 | 
			
		||||
 | 
			
		||||
    def set_object(self,person):
 | 
			
		||||
        raise NotImplementedError("Subclasses of PreviewFrameBase must implement set_object")
 | 
			
		||||
@@ -1,43 +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$
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
 | 
			
		||||
class TreeFrameBase(gtk.Frame):
 | 
			
		||||
    
 | 
			
		||||
    __gproperties__ = {}
 | 
			
		||||
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        gtk.Frame.__init__(self)
 | 
			
		||||
 | 
			
		||||
    def set_model(self,data_filter=None):
 | 
			
		||||
        raise NotImplementedError("Subclasses of TreeFrameBase must implement set_model")
 | 
			
		||||
 | 
			
		||||
    def get_selection(self):
 | 
			
		||||
        raise NotImplementedError("Subclasses of TreeFrameBase must implement get_selection")
 | 
			
		||||
    
 | 
			
		||||
    def get_tree(self):
 | 
			
		||||
        raise NotImplementedError("Subclasses of TreeFrameBase must implement get_tree")
 | 
			
		||||
 | 
			
		||||
@@ -1,110 +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$
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
ObjectSelector provides a collection of widgets that can be used to select
 | 
			
		||||
any of the Primary objects in the database.
 | 
			
		||||
 | 
			
		||||
The class hierachy is currently this:
 | 
			
		||||
 | 
			
		||||
    gtk.Window
 | 
			
		||||
       ObjectSelectorWindow
 | 
			
		||||
           PersonSelector
 | 
			
		||||
 | 
			
		||||
    gtk.Frame
 | 
			
		||||
        FilterFrameBase
 | 
			
		||||
            PersonFilterFrame
 | 
			
		||||
            FamilyFilterFrame
 | 
			
		||||
        ObjectFrameBase
 | 
			
		||||
            FamilyFrame
 | 
			
		||||
            PersonFrame
 | 
			
		||||
        PreviewFrameBase
 | 
			
		||||
            FamilyPreviewFrame
 | 
			
		||||
            PersonPreviewFrame
 | 
			
		||||
        TreeFrameBase
 | 
			
		||||
            FamilyTreeFrame
 | 
			
		||||
            PersonTreeFrame
 | 
			
		||||
 | 
			
		||||
    FilterSpecBase 
 | 
			
		||||
        PersonFilterSpec
 | 
			
		||||
 | 
			
		||||
    ObjectFrameFactory
 | 
			
		||||
 | 
			
		||||
To implement a selector for a new Primary gen.lib type you need to implement a new
 | 
			
		||||
subclass of each of:
 | 
			
		||||
 | 
			
		||||
       FilterFrameBase
 | 
			
		||||
       ObjectFrameBase
 | 
			
		||||
       PreviewFrameBase
 | 
			
		||||
       TreeFrameBase
 | 
			
		||||
 | 
			
		||||
You must then extend ObjectFrameFactory so that it know how to create the new selector
 | 
			
		||||
type. The new type should also be added to the OBJECT_LIST in _ObjectSelectorWindow.py
 | 
			
		||||
so that it shows up in the selector. A subclass of ObjectSelectorWindow can be added to
 | 
			
		||||
this file as a convienience for starting a selector for just the new type.
 | 
			
		||||
 | 
			
		||||
At runtime Object selector is constructed from these widgets in the following structure:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-------------------------------------------------------------------------------
 | 
			
		||||
| ObjectSelectorWindow                                                        |
 | 
			
		||||
|
 | 
			
		||||
| --------------------------------------------------------------------------- |
 | 
			
		||||
| | Subclass of ObjectFrameBase                                             | |
 | 
			
		||||
| |                                                                         | |
 | 
			
		||||
| | -----------------------------  ---------------------------------------- | |
 | 
			
		||||
| | | Subclass of TreeFrameBase |  | Subclass of PreviewFrameBase         | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  ---------------------------------------- | |
 | 
			
		||||
| | |                           |  ---------------------------------------- | |
 | 
			
		||||
| | |                           |  | Subclass of FilterFrameBase          | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | |                           |  |                                      | | |
 | 
			
		||||
| | -----------------------------  ---------------------------------------- | |
 | 
			
		||||
| --------------------------------------------------------------------------- |
 | 
			
		||||
-------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
from gettext import gettext as _
 | 
			
		||||
 | 
			
		||||
from _ObjectSelectorWindow import ObjectSelectorWindow
 | 
			
		||||
from _Constants import ObjectTypes
 | 
			
		||||
from _PersonFilterSpec import PersonFilterSpec
 | 
			
		||||
 | 
			
		||||
class PersonSelector(ObjectSelectorWindow):
 | 
			
		||||
    """Provides an ObjectSelectorWindow configured for selecting a person object."""
 | 
			
		||||
 | 
			
		||||
    def __init__(self,dbstate,uistate,track,filter_spec=None,title=_("Select Person")):
 | 
			
		||||
        ObjectSelectorWindow.__init__(self,dbstate,uistate,track,
 | 
			
		||||
                                      title=title,
 | 
			
		||||
                                      filter_spec=filter_spec,
 | 
			
		||||
                                      default_object_type = ObjectTypes.PERSON,
 | 
			
		||||
                                      object_list = [ObjectTypes.PERSON])
 | 
			
		||||
@@ -5,8 +5,7 @@
 | 
			
		||||
# License: GPL
 | 
			
		||||
# Id: $Id$
 | 
			
		||||
 | 
			
		||||
"""A tooltip class for TreeViews
 | 
			
		||||
"""
 | 
			
		||||
"""A tooltip class."""
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Support for text markup added: March 05 - rjt-gramps <at> thegrindstone.me.uk
 | 
			
		||||
@@ -17,12 +16,12 @@ import gtk
 | 
			
		||||
import gobject
 | 
			
		||||
 | 
			
		||||
class TreeTips(gtk.Widget):
 | 
			
		||||
    ''' A tooltips widget specialized to work with gtk.TreeView's.
 | 
			
		||||
    """ A tooltips widget specialized to work with gtk.TreeView's.
 | 
			
		||||
 | 
			
		||||
    TreeTips associates a column in a TreeStore with tooltips that will be
 | 
			
		||||
    displayed when the mouse is over the row the column is for.  Each row can
 | 
			
		||||
    have one treetip.
 | 
			
		||||
    ''' 
 | 
			
		||||
    """ 
 | 
			
		||||
    __gproperties__ = {
 | 
			
		||||
        'tip_window' : (gobject.TYPE_PYOBJECT,
 | 
			
		||||
                'The window that the tooltip is displayed in.',
 | 
			
		||||
@@ -64,7 +63,7 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, treeview=None, column=None, markup_enabled=False):
 | 
			
		||||
        '''Create a new TreeTips Group.
 | 
			
		||||
        """Create a new TreeTips Group.
 | 
			
		||||
 | 
			
		||||
        :Parameters:
 | 
			
		||||
            treeview : gtk.TreeView === Treeview for which the tips display,
 | 
			
		||||
@@ -73,7 +72,7 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
                    text, default is None.
 | 
			
		||||
            markup_enabled : bool === If True the tooltips are in Pango Markup,
 | 
			
		||||
                    if False the tooltips are in plain text.
 | 
			
		||||
        '''
 | 
			
		||||
        """
 | 
			
		||||
        if treeview:
 | 
			
		||||
            try:
 | 
			
		||||
                treeview.connect('leave-notify-event', self.__tree_leave_notify)
 | 
			
		||||
@@ -106,15 +105,15 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
        self.screenHeight = gtk.gdk.screen_height()
 | 
			
		||||
 | 
			
		||||
    def enable(self):
 | 
			
		||||
        '''Enable showing of tooltips'''
 | 
			
		||||
        """Enable showing of tooltips"""
 | 
			
		||||
        self.enabled = True
 | 
			
		||||
 | 
			
		||||
    def disable(self):
 | 
			
		||||
        '''Disable showing tooltips'''
 | 
			
		||||
        """Disable showing tooltips"""
 | 
			
		||||
        self.enabled = False
 | 
			
		||||
       
 | 
			
		||||
    def do_get_property(self, prop):
 | 
			
		||||
        '''Return the gproperty's value.'''
 | 
			
		||||
        """Return the gproperty's value."""
 | 
			
		||||
        if prop.name == 'delay':
 | 
			
		||||
            return self.delay
 | 
			
		||||
        elif prop.name == 'enabled':
 | 
			
		||||
@@ -135,9 +134,9 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
            raise AttributeError, 'unknown property %s' % prop.name
 | 
			
		||||
 | 
			
		||||
    def do_set_property(self, prop, value):
 | 
			
		||||
        '''Set the property of writable properties.
 | 
			
		||||
        """Set the property of writable properties.
 | 
			
		||||
 | 
			
		||||
        '''
 | 
			
		||||
        """
 | 
			
		||||
        if prop.name == 'delay':
 | 
			
		||||
            self.delay = value
 | 
			
		||||
        elif prop.name == 'view':
 | 
			
		||||
@@ -162,14 +161,14 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
                'tooltip', 0, 0, -1, -1)
 | 
			
		||||
        
 | 
			
		||||
    def __tree_leave_notify(self, tree, event):
 | 
			
		||||
        '''Hide tooltips when we leave the tree.'''
 | 
			
		||||
        """Hide tooltips when we leave the tree."""
 | 
			
		||||
 | 
			
		||||
        self.timeoutID = 0
 | 
			
		||||
        self.path = None
 | 
			
		||||
        self.tip_window.hide()
 | 
			
		||||
 | 
			
		||||
    def __tree_motion_notify(self, tree, event):
 | 
			
		||||
        '''Decide which tooltip to display when we move within the tree.'''
 | 
			
		||||
        """Decide which tooltip to display when we move within the tree."""
 | 
			
		||||
 | 
			
		||||
        if not self.enabled:
 | 
			
		||||
            return
 | 
			
		||||
@@ -181,7 +180,7 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
                int(event.x), int(event.y), self.timeoutID)
 | 
			
		||||
 | 
			
		||||
    def __treetip_show(self, tree, xEvent, yEvent, ID):
 | 
			
		||||
        '''Show the treetip window.'''
 | 
			
		||||
        """Show the treetip window."""
 | 
			
		||||
        if self.timeoutID != ID:
 | 
			
		||||
            return False
 | 
			
		||||
        pathReturn = tree.get_path_at_pos(xEvent, yEvent)
 | 
			
		||||
@@ -223,7 +222,7 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    def __compute_tooltip_position(self, cellInfo, popupWidth, popupHeight):
 | 
			
		||||
        '''Figures out where the tooltip should be placed on the page::
 | 
			
		||||
        """Figures out where the tooltip should be placed on the page::
 | 
			
		||||
 | 
			
		||||
          [p] = pointer
 | 
			
		||||
          x =      [p]
 | 
			
		||||
@@ -237,7 +236,7 @@ class TreeTips(gtk.Widget):
 | 
			
		||||
              +------------+
 | 
			
		||||
              |____________|
 | 
			
		||||
                   [p]
 | 
			
		||||
        '''
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        xOrigin, yOrigin = self.view.get_bin_window().get_origin()
 | 
			
		||||
        x = xOrigin + cellInfo.x + cellInfo.width/2 - popupWidth/2
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
# This is the src/TreeViews level Makefile for Gramps
 | 
			
		||||
# We could use GNU make's ':=' syntax for nice wildcard use,
 | 
			
		||||
# but that is not necessarily portable.
 | 
			
		||||
# If not using GNU make, then list all .py files individually
 | 
			
		||||
 | 
			
		||||
pkgdatadir = $(datadir)/@PACKAGE@/TreeViews
 | 
			
		||||
 | 
			
		||||
pkgdata_PYTHON = \
 | 
			
		||||
	__init__.py\
 | 
			
		||||
	_PersonTreeView.py
 | 
			
		||||
 | 
			
		||||
pkgpyexecdir = @pkgpyexecdir@/TreeViews
 | 
			
		||||
pkgpythondir = @pkgpythondir@/TreeViews
 | 
			
		||||
 | 
			
		||||
# Clean up all the byte-compiled files
 | 
			
		||||
MOSTLYCLEANFILES = *pyc *pyo
 | 
			
		||||
 | 
			
		||||
GRAMPS_PY_MODPATH = "../"
 | 
			
		||||
 | 
			
		||||
pycheck: 
 | 
			
		||||
	(export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
 | 
			
		||||
	pychecker $(pkgdata_PYTHON));
 | 
			
		||||
@@ -1,156 +0,0 @@
 | 
			
		||||
 | 
			
		||||
from gettext import gettext as _
 | 
			
		||||
import cgi
 | 
			
		||||
 | 
			
		||||
import gtk
 | 
			
		||||
 | 
			
		||||
from Models import \
 | 
			
		||||
     PersonTreeModel, PersonListModel, PersonFilterModel
 | 
			
		||||
 | 
			
		||||
from BasicUtils import name_displayer
 | 
			
		||||
from gen.lib import Event
 | 
			
		||||
import DateHandler
 | 
			
		||||
import Utils
 | 
			
		||||
 | 
			
		||||
display_given = name_displayer.display_given
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PersonTreeView(gtk.TreeView):
 | 
			
		||||
 | 
			
		||||
    def __init__(self,db,apply_filter=None):
 | 
			
		||||
        gtk.TreeView.__init__(self)
 | 
			
		||||
 | 
			
		||||
        self._db = db
 | 
			
		||||
 | 
			
		||||
        # Add the Name column
 | 
			
		||||
        cols = (\
 | 
			
		||||
            (_("Name"),300,self._family_name),\
 | 
			
		||||
            (_("ID"),100,self._object_id),\
 | 
			
		||||
            (_("Gender"),100,self._gender),\
 | 
			
		||||
            (_("Birth Date"),200,self._birth_date),\
 | 
			
		||||
            (_("Birth Place"),200,self._birth_place),\
 | 
			
		||||
            (_("Death Date"),200,self._death_date),\
 | 
			
		||||
            (_("Death Place"),200,self._death_place),\
 | 
			
		||||
            (_("Spouse"),200,self._spouce),\
 | 
			
		||||
            (_("Last Change"),200,self._last_change),\
 | 
			
		||||
            (_("Cause of Death"),300,self._death_cause))
 | 
			
		||||
 | 
			
		||||
        for col in cols:
 | 
			
		||||
            self.append_column(
 | 
			
		||||
                self._new_column(
 | 
			
		||||
                    col[0],col[1],col[2]))
 | 
			
		||||
            
 | 
			
		||||
        self.set_enable_search(False)
 | 
			
		||||
        self.set_fixed_height_mode(True)
 | 
			
		||||
 | 
			
		||||
        if apply_filter is not None:
 | 
			
		||||
            self.set_filter(apply_filter)
 | 
			
		||||
        else:
 | 
			
		||||
            self.clear_filter()
 | 
			
		||||
 | 
			
		||||
    def _new_column(self,name,size,func):
 | 
			
		||||
        col = gtk.TreeViewColumn(name)
 | 
			
		||||
        col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
 | 
			
		||||
        col.set_fixed_width(size)
 | 
			
		||||
        cell = gtk.CellRendererText()
 | 
			
		||||
        col.pack_start(cell,True)
 | 
			
		||||
        col.set_cell_data_func(cell,func)
 | 
			
		||||
        return col
 | 
			
		||||
 | 
			
		||||
    def set_filter(self,apply_filter=None):
 | 
			
		||||
        self.set_model(PersonFilterModel(self._db,apply_filter))
 | 
			
		||||
 | 
			
		||||
    def clear_filter(self):
 | 
			
		||||
        self.set_model(PersonTreeModel(self._db))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    # Accessor methods for the columns
 | 
			
		||||
 | 
			
		||||
    def _object_id(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if ( len(rowref) > 1 or model.is_list() )and o is not None:
 | 
			
		||||
            cell.set_property('text', o.get_gramps_id())
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
    def _family_name(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', "%s, %s"% (o.get_primary_name().surname,
 | 
			
		||||
                                                 display_given(o)))
 | 
			
		||||
        elif o is not None:
 | 
			
		||||
            cell.set_property('text',o.get_primary_name().surname)
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text','')
 | 
			
		||||
        
 | 
			
		||||
    def _gender(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', Utils.gender[o.gender])
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
    def _birth_date(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        cell_value = ''
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            b = o.get_birth_ref()
 | 
			
		||||
            if b:
 | 
			
		||||
                birth = self._db.get_event_from_handle(b.ref)
 | 
			
		||||
                date_str = DateHandler.get_date(birth)
 | 
			
		||||
                if date_str != "":
 | 
			
		||||
                    cell_value = cgi.escape(date_str)
 | 
			
		||||
            else:
 | 
			
		||||
                for er in o.get_event_ref_list():
 | 
			
		||||
                    event = self._db.get_event_from_handle(er.ref)
 | 
			
		||||
                    etype = event.get_type()[0]
 | 
			
		||||
                    date_str = DateHandler.get_date(event)
 | 
			
		||||
                    if (etype in [Event.BAPTISM, Event.CHRISTEN]
 | 
			
		||||
                        and date_str != ""):
 | 
			
		||||
                        return 
 | 
			
		||||
                    cell_value = "<i>" + cgi.escape(date_str) + "</i>"
 | 
			
		||||
        cell.set_property('markup', cell_value)
 | 
			
		||||
 | 
			
		||||
    def _birth_place(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
    def _death_date(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
    def _death_place(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
    def _last_change(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
    def _death_cause(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
    def _spouce(self, column, cell, model, iter, user_data=None):
 | 
			
		||||
        (o,rowref) = model.get_value(iter, 0)
 | 
			
		||||
        if (len(rowref) > 1 or model.is_list()) and o is not None:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
        else:
 | 
			
		||||
            cell.set_property('text', "")
 | 
			
		||||
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
from _PersonTreeView import PersonTreeView
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
# $Id$
 | 
			
		||||
 | 
			
		||||
"""Tools/Utilities/Generate SoundEx Codes..."""
 | 
			
		||||
"""Tools/Utilities/Generate SoundEx Codes"""
 | 
			
		||||
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
@@ -36,7 +36,7 @@ from gettext import gettext as _
 | 
			
		||||
#
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
import gtk
 | 
			
		||||
import gtk.glade
 | 
			
		||||
from gtk import glade
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# GRAMPS modules
 | 
			
		||||
@@ -63,7 +63,7 @@ class SoundGen(Tool.Tool, ManagedWindow.ManagedWindow):
 | 
			
		||||
        base = os.path.dirname(__file__)
 | 
			
		||||
        glade_file = base + os.sep + "soundex.glade"
 | 
			
		||||
 | 
			
		||||
        self.glade = gtk.glade.XML(glade_file,"soundEx","gramps")
 | 
			
		||||
        self.glade = glade.XML(glade_file,"soundEx","gramps")
 | 
			
		||||
        self.glade.signal_autoconnect({
 | 
			
		||||
            "destroy_passed_object" : self.close,
 | 
			
		||||
            "on_help_clicked"       : self.on_help_clicked,
 | 
			
		||||
@@ -141,7 +141,7 @@ register_tool(
 | 
			
		||||
    tool_class = SoundGen,
 | 
			
		||||
    options_class = SoundGenOptions,
 | 
			
		||||
    modes = Tool.MODE_GUI,
 | 
			
		||||
    translated_name = _("Generate SoundEx Codes..."),
 | 
			
		||||
    translated_name = _("Generate SoundEx Codes"),
 | 
			
		||||
    status=(_("Stable")),
 | 
			
		||||
    author_name = "Donald N. Allingham",
 | 
			
		||||
    author_email = "don@gramps-project.org",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user