From 7bc3f3bf1bd2a62d551521bd997e4e41442e7749 Mon Sep 17 00:00:00 2001 From: Alex Roitman Date: Mon, 2 Jun 2003 13:34:18 +0000 Subject: [PATCH] * src/plugins/BookReport.py: Added to CVS. * src/plugins/book.glade: Likewise. * src/ListModel.py: (insert, get_data): Added new methods. * src/SelectPerson.py: Added to CVS. * src/choose.glade: Likewise. svn: r1627 --- src/ListModel.py | 17 +- src/SelectPerson.py | 149 ++++++++++++++ src/choose.glade | 269 +++++++++++++++++++++++++ src/plugins/BookReport.py | 374 +++++++++++++++++++++++++++++++++++ src/plugins/book.glade | 400 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 1208 insertions(+), 1 deletion(-) create mode 100644 src/SelectPerson.py create mode 100644 src/choose.glade create mode 100644 src/plugins/BookReport.py create mode 100644 src/plugins/book.glade diff --git a/src/ListModel.py b/src/ListModel.py index 3137516b4..b59f93b0d 100644 --- a/src/ListModel.py +++ b/src/ListModel.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000 Donald N. Allingham +# Copyright (C) 2000-2003 Donald N. Allingham # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -177,6 +177,21 @@ class ListModel: self.selection.select_iter(iter) return iter + def insert(self,position,data,info=None,select=0): + self.count = self.count + 1 + iter = self.model.insert(position) + col = 0 + for object in data: + self.model.set_value(iter,col,object) + col = col + 1 + self.model.set_value(iter,col,info) + if select: + self.selection.select_iter(iter) + return iter + + def get_data(self,iter,cols): + return [ self.model.get_value(iter,c) for c in cols ] + def add_and_select(self,data,info=None): self.count = self.count + 1 iter = self.model.append() diff --git a/src/SelectPerson.py b/src/SelectPerson.py new file mode 100644 index 000000000..459f5b9fe --- /dev/null +++ b/src/SelectPerson.py @@ -0,0 +1,149 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2003 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#------------------------------------------------------------------------- +# +# internationalization +# +#------------------------------------------------------------------------- +from intl import gettext as _ + +#------------------------------------------------------------------------- +# +# GTK/Gnome modules +# +#------------------------------------------------------------------------- + +import gtk +import gtk.glade + +#------------------------------------------------------------------------- +# +# gramps modules +# +#------------------------------------------------------------------------- +import RelLib +import const +import Utils +import ListModel +import GrampsCfg +from RelLib import Person + +#------------------------------------------------------------------------- +# +# SelectPerson +# +#------------------------------------------------------------------------- +class SelectPerson: + + def __init__(self,db,title,flabel="",filter=None): + + self.db = db + self.filter = filter + gladefile = "%s/choose.glade" % const.rootDir + self.glade = gtk.glade.XML(gladefile,"select") + self.top = self.glade.get_widget('select') + title_label = self.glade.get_widget('title') + self.filter_select = self.glade.get_widget('filter') + self.female = self.glade.get_widget('female') + self.male = self.glade.get_widget('male') + self.unknown = self.glade.get_widget('unknown') + self.notebook = self.glade.get_widget('notebook') + if filter: + self.use_filter = 1 + else: + self.use_filter = 0 + + Utils.set_titles(self.top,title_label,title) + + titles = [(_('Name'),3,150),(_('ID'),1,50), (_('Birth date'),4,100), + ('',0,0),('',0,0)] + + self.fmodel = ListModel.ListModel(self.female,titles) + self.mmodel = ListModel.ListModel(self.male,titles) + self.umodel = ListModel.ListModel(self.unknown,titles) + + if filter: + self.filter_select.set_label(flabel) + self.filter_select.connect('toggled',self.redraw_cb) + self.filter_select.show() + self.filter_select.set_active(1) + else: + self.filter_select.hide() + + self.redraw() + self.top.show() + + def redraw_cb(self,obj): + self.use_filter = self.filter_select.get_active() + self.redraw() + + def redraw(self): + + self.fmodel.clear() + self.fmodel.new_model() + + self.mmodel.clear() + self.mmodel.new_model() + + self.umodel.clear() + self.umodel.new_model() + + for key in self.db.getPersonKeys(): + person = self.db.getPerson(key) + if self.use_filter and not self.filter(person): + continue + + data = self.db.getPersonDisplay(key) + gender = person.getGender() + if gender == RelLib.Person.male: + self.mmodel.add([data[0],data[1],data[3],data[5],data[6]],key) + elif gender == RelLib.Person.female: + self.fmodel.add([data[0],data[1],data[3],data[5],data[6]],key) + else: + self.umodel.add([data[0],data[1],data[3],data[5],data[6]],key) + + self.fmodel.connect_model() + self.mmodel.connect_model() + self.umodel.connect_model() + + def run(self): + val = self.top.run() + page = self.notebook.get_current_page() + + if val == gtk.RESPONSE_OK: + if page == 0: + lmodel = self.fmodel + elif page == 1: + lmodel = self.mmodel + else: + lmodel = self.umodel + + model,iter = lmodel.get_selected() + if iter: + id = lmodel.get_object(iter) + return_value = self.db.getPerson(id) + else: + return_value = None + self.top.destroy() + return return_value + else: + self.top.destroy() + return None diff --git a/src/choose.glade b/src/choose.glade new file mode 100644 index 000000000..1e86e45e4 --- /dev/null +++ b/src/choose.glade @@ -0,0 +1,269 @@ + + + + + + + + + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + True + 500 + 450 + True + False + False + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + -6 + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + -5 + + + + + 0 + False + True + GTK_PACK_END + + + + + + 6 + True + False + 6 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + True + True + True + GTK_POS_BOTTOM + False + False + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + True + + + + + False + True + + + + + + True + female + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + True + + + + + False + True + + + + + + True + male + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + + + + + False + True + + + + + + True + unknown + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + 0 + True + True + + + + + + True + True + + True + GTK_RELIEF_NORMAL + False + False + True + + + 0 + False + False + + + + + 0 + True + True + + + + + + + diff --git a/src/plugins/BookReport.py b/src/plugins/BookReport.py new file mode 100644 index 000000000..2ac9ae65e --- /dev/null +++ b/src/plugins/BookReport.py @@ -0,0 +1,374 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# +# Copyright (C) 2003 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#------------------------------------------------------------------------- +# +# Standard Python modules +# +#------------------------------------------------------------------------- +import os +import string + +#------------------------------------------------------------------------- +# +# internationalization +# +#------------------------------------------------------------------------- +from intl import gettext as _ + +#------------------------------------------------------------------------- +# +# GTK/Gnome modules +# +#------------------------------------------------------------------------- +import gtk.glade + +#------------------------------------------------------------------------- +# +# gramps modules +# +#------------------------------------------------------------------------- +from RelLib import Person + +import const +import Utils +import ListModel +import GrampsCfg +import Plugins +import Report + +#------------------------------------------------------------------------- +# +# ReportBook +# +#------------------------------------------------------------------------- +class BookReportSelector: + + def __init__(self,db,person): + self.db = db + self.person = person + + base = os.path.dirname(__file__) + glade_file = os.path.join(base,"book.glade") + + self.xml = gtk.glade.XML(glade_file,"top") + self.top = self.xml.get_widget("top") + + if person: + self.default_name = person.getPrimaryName().getSurname().upper() + else: + self.default_name = "" + + self.xml.signal_autoconnect({ + "on_add_clicked" : self.on_add_clicked, + "on_remove_clicked" : self.on_remove_clicked, + "on_up_clicked" : self.on_up_clicked, + "on_down_clicked" : self.on_down_clicked, + "on_setup_clicked" : self.on_setup_clicked, + "on_clear_clicked" : self.on_clear_clicked, + "on_book_ok_clicked" : self.on_book_ok_clicked, + "destroy_passed_object" : self.close + }) + + self.avail_tree = self.xml.get_widget("avail_tree") + self.book_tree = self.xml.get_widget("book_tree") + self.avail_tree.connect('button-press-event',self.av_double_click) + self.book_tree.connect('button-press-event',self.bk_double_click) + + title_label = self.xml.get_widget('title') + Utils.set_titles(self.top,title_label,_('Book Report')) + + avail_label = self.xml.get_widget('avail_label') + avail_label.set_text("%s" % "Available items") + avail_label.set_use_markup(gtk.TRUE) + book_label = self.xml.get_widget('book_label') + book_label.set_text("%s" % "Current book") + book_label.set_use_markup(gtk.TRUE) + + + av_titles = [(_('Name'),2,150),(_('Type'),1,50), ('',-1,0)] + bk_titles = [(_('Item name'),-1,150),(_('Type'),-1,50), + ('',-1,0),('',-1,0)] + + self.av_ncols = len(av_titles) + self.bk_ncols = len(bk_titles) + + self.av_model = ListModel.ListModel(self.avail_tree,av_titles) + self.bk_model = ListModel.ListModel(self.book_tree,bk_titles) + self.draw_avail_list() + + def close(self,obj): + self.top.destroy() + + def draw_avail_list(self): + """Draw the list with the selections available for the book.""" + + data = [_('Title Page'),_('Cover'),self.titlepage] + iter = self.av_model.add(data) + + data = [_('Table of Contents'),_('TOC'),self.toc] + new_iter = self.av_model.add(data) + + reports = Plugins._reports + for report in reports: + if not self.ignore(report): + data = [report[2],string.split(report[1])[0],report[0]] + new_iter = self.av_model.add(data) + + self.av_model.connect_model() + + if iter: + self.av_model.selection.select_iter(iter) + path = self.av_model.model.get_path(iter) + col = self.avail_tree.get_column(0) + self.avail_tree.scroll_to_cell(path,col,1,1,0.0) + + def ignore(self,report): + """Returns true if the report is to be ignored for the book.""" + + ignore_names = [_('Book Report')] + ignore_categories = [_('View'),_('Web Page')] + return (report[2] in ignore_names) or (report[1] in ignore_categories) + + def on_add_clicked(self,obj): + store,iter = self.av_model.get_selected() + if not iter: + return + data = self.av_model.get_data(iter,range(self.av_ncols)) + data.append([]) + self.bk_model.add(data) + + def on_remove_clicked(self,obj): + store,iter = self.bk_model.get_selected() + if not iter: + return + self.bk_model.remove(iter) + + def on_clear_clicked(self,obj): + self.bk_model.clear() + + def on_up_clicked(self,obj): + row = self.bk_model.get_selected_row() + if not row or row == -1: + return + store,iter = self.bk_model.get_selected() + data = self.bk_model.get_data(iter,range(self.bk_ncols)) + self.bk_model.remove(iter) + self.bk_model.insert(row-1,data,None,1) + + def on_down_clicked(self,obj): + row = self.bk_model.get_selected_row() + if row + 1 >= self.bk_model.count or row == -1: + return + store,iter = self.bk_model.get_selected() + data = self.bk_model.get_data(iter,range(self.bk_ncols)) + self.bk_model.remove(iter) + self.bk_model.insert(row+1,data,None,1) + + def on_setup_clicked(self,obj): + store,iter = self.bk_model.get_selected() + if not iter: + return + data = self.bk_model.get_data(iter,range(self.bk_ncols)) + ReportOptionsDialog(self.db,self.person,data[0]) + + def bk_double_click(self,obj,event): + if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: + self.on_setup_clicked(obj) + + def av_double_click(self,obj,event): + if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: + self.on_add_clicked(obj) + + def on_book_ok_clicked(self,obj): pass + + def titlepage(self): pass + + def toc(self): pass + + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +class ReportOptionsDialog(Report.TextReportDialog): + + def __init__(self,database,person,rep_title): + self.rep_title = rep_title + Report.TextReportDialog.__init__(self,database,person) + + def get_title(self): + """The window title for this dialog""" + return _("%s - GRAMPS Book") % self.rep_title + + def get_header(self, name): + """The header line at the top of the dialog contents""" + return _("%s for GRAMPS Book") % self.rep_title + + def setup_paper_frame(self): pass + + def setup_html_frame(self): pass + + def setup_style_frame(self): pass + + def html_file_enable(self,obj): pass + + def setup_target_frame(self): pass + + def setup_format_frame(self): + center_label = gtk.Label("%s" % _("Center Person")) + center_label.set_use_markup(gtk.TRUE) + center_label.set_alignment(0.0,0.5) + self.tbl.set_border_width(12) + self.tbl.attach(center_label,0,4,1,2,gtk.SHRINK|gtk.FILL) + + name = self.person.getPrimaryName().getRegularName() + self.person_label = gtk.Label( "%s" % name ) + self.person_label.set_use_markup(gtk.TRUE) + self.person_label.set_alignment(0.0,0.5) + self.tbl.attach(self.person_label,2,3,2,3) + + change_button = gtk.Button("%s..." % _('_Change') ) + change_button.connect('clicked',self.on_change_clicked) + self.tbl.attach(change_button,3,4,2,3,gtk.SHRINK|gtk.SHRINK) + + def on_change_clicked(self,obj): + import SelectPerson + sel_person = SelectPerson.SelectPerson(self.db,'Select Person') + new_name = sel_person.run().getPrimaryName().getRegularName() + self.person_label.set_text( "%s" % new_name ) + self.person_label.set_use_markup(gtk.TRUE) + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +def report(database,person): + BookReportSelector(database,person) + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +def get_xpm_image(): + return [ + "48 48 33 1", + " c None", + ". c #1A1A1A", + "+ c #6A665E", + "@ c #A6A6A6", + "# c #BABAB6", + "$ c #D2D2D2", + "% c #EDE2D2", + "& c #7A7262", + "* c #F1EADF", + "= c #867A6E", + "- c #56524E", + "; c #868686", + "> c #E2CAA2", + ", c #F2EEE2", + "' c #4E4E4E", + ") c #B2966E", + "! c #FAFAFA", + "~ c #A29E96", + "{ c #BEA27A", + "] c #CECABE", + "^ c #968A76", + "/ c #DAD2C6", + "( c #423E3E", + "_ c #BA9E72", + ": c #B7AC9A", + "< c #E9DAC3", + "[ c #E6E2E2", + "} c #322E2A", + "| c #9E9286", + "1 c #E6D2B6", + "2 c #F2EEE9", + "3 c #5E5A56", + "4 c #F6F2EE", + " ", + " ", + " ^=^=====&&&+&++++333+& ", + " =##############:#:~;33& ", + " =#!!!!!!!!!!!!!!*[$#;;|- ", + " ;#!!!!!!!!!!!!!!!2[$@&]|( ", + " =#!!!!!!!!!!!!!!!!2[$-[];} ", + " =#!!!!@@@@@@@@!!!!![4'![];} ", + " =#!!!!!!4!!4!!!!!!!!4'!![];} ", + " =#!!!!!!!!!!!!!!!!!!!'*!![];( ", + " =#!!!!!!!!!!!!!!!!!!!'[*!![]|- ", + " &#!!!!@@~@@@~@@~@@@@@'][4!![#|+ ", + " &#!4!!!!!!!!!!!!!4!!!'..}('3&=+& ", + " =#!!!!@@@@@@@@@@@@@@@@##@~;=+3(+ ", + " &#!!!!!!!!!!!!!!!!!!!![$##~;;='( ", + " &#!!!!@@@@@~@@@~@@@@~@@@@@#~~;+( ", + " &#!!!!!!!!!!!!!!!!!!!!444[]#@~&} ", + " &#!!!!!!!!!!!!!!!!!!4442[[$]#@=} ", + " &#!!!!!!!!!!!!!!!!!!4444[[$]]:;} ", + " +#!!!!@~@@@@@@@@~@@@@@~~~|;]]];} ", + " +#!!!!!!!!!!!!!!!!!44444,[$/]:^} ", + " +#!!!!@@@~@@@@@@@@~@~~~~~~|1>$|} ", + " +#!!!!!!!!!!!!!!!44442[*%[[<$]|} ", + " +#!!!!@@@@~@@@@~~@~~~~~~~~|1/>~} ", + " +#!!!!!!!!!!!!!!44444**[%%~} ", + " 3#!!!!@@4*@@@~~~~~~~~~~||||<11)} ", + " +#4!!4444444,24[[*[<%<%<<<<<11|} ", + " 3#!!!44,,,@~~~~~~~~~|||||||111_} ", + " 3#!!!!!44444[4[[%%%%%<<<<11111)} ", + " 3#!!!!~@,*~~~~~~~~||||||^|^1>1_} ", + " 3#!!!444442%**[%<%%%<<<<11111>_} ", + " 3#!!!4***[~~~~~~|||||||^|^^1>>{} ", + " -#!444444**[%<%%%<<<<11111>1>>_} ", + " -#4444~~[[~~~|||||||^)^^^^^>>>_} ", + " -#4444[**[%%%%%%<<<<11111>>>>>)} ", + " '#4444****%%%%%<<<111<11>>>>>>_} ", + " ':44****%%%%%<<<1<1<1>>1>>>>>>)} ", + " -@4******%%%<%<1<<1111>>>>>>>>)} ", + " '#****%%%%<%<<<<1<11>1>>>>>>>>)} ", + " ':##:::::::{{{{{{__{___))^)))))} ", + " }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ", + " ", + " ", + " "] + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +from Plugins import register_report + +register_report( + report, + _("Book Report"), + category=_("Text Reports"), + status=(_("Experimental")), + description=_("Creates a book containg several reports."), + xpm=get_xpm_image() + ) + diff --git a/src/plugins/book.glade b/src/plugins/book.glade new file mode 100644 index 000000000..92ae5104c --- /dev/null +++ b/src/plugins/book.glade @@ -0,0 +1,400 @@ + + + + + + + 800 + 600 + True + Book + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + + + + True + False + 0 + + + + True + title + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 12 + 12 + + + 0 + False + False + + + + + + True + 2 + 3 + False + 0 + 0 + + + + True + avail_label + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 12 + 6 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + book_label + True + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 12 + 6 + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + GTK_BUTTONBOX_SPREAD + 24 + + + + True + GTK_BUTTONBOX_DEFAULT_STYLE + 6 + + + + True + Add an item to the book + True + True + gtk-add + True + GTK_RELIEF_NORMAL + + + + + + + True + Remove currently selected item from the book + True + True + gtk-remove + True + GTK_RELIEF_NORMAL + + + + + + + + + True + GTK_BUTTONBOX_DEFAULT_STYLE + 6 + + + + True + Move current selection one step up in the book + True + True + gtk-go-up + True + GTK_RELIEF_NORMAL + + + + + + + True + Move current selection one step down in the book + True + True + gtk-go-down + True + GTK_RELIEF_NORMAL + + + + + + + + + True + GTK_BUTTONBOX_END + 0 + + + + True + Configure currently selected item + True + True + GTK_RELIEF_NORMAL + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-preferences + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Setup + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + + + + True + GTK_BUTTONBOX_START + 0 + + + + True + Clear the book + True + True + gtk-clear + True + GTK_RELIEF_NORMAL + + + + + + + + 1 + 2 + 1 + 2 + + + + + + + 41 + 60 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + + + + + 0 + 1 + 1 + 2 + 24 + fill + + + + + + 41 + 60 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_ETCHED_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + + + + + 2 + 3 + 1 + 2 + 24 + fill + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 0 + + + + 6 + True + GTK_BUTTONBOX_END + 6 + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + + + + + + + + 0 + False + True + + + + + + +