# # 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 #------------------------------------------------------------------------- # # SAX interface # #------------------------------------------------------------------------- try: from xml.sax import make_parser,handler,SAXParseException except: from _xmlplus.sax import make_parser,handler,SAXParseException #------------------------------------------------------------------------- # # 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 #------------------------------------------------------------------------- # # Book creation dialog class # #------------------------------------------------------------------------- class BookReportSelector: def __init__(self,db,person): self.db = db self.person = person self.file = os.path.expanduser("~/.gramps/books.xml") 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") 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_save_clicked" : self.on_save_clicked, "on_open_clicked" : self.on_open_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) self.item_storage = {} self.max_key = 0 av_titles = [(_('Name'),0,150),(_('Type'),1,50)] bk_titles = [(_('Item name'),-1,150),(_('Type'),-1,50), (_('Center person'),-1,50),('',-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() self.bookmap = {} self.parse() def close(self,obj): self.top.destroy() def draw_avail_list(self): """Draw the list with the selections available for the book.""" if not Plugins._bkitems: return for book_item in Plugins._bkitems: data = [ book_item[0], book_item[1] ] new_iter = self.av_model.add(data) self.av_model.connect_model() if new_iter: self.av_model.selection.select_iter(new_iter) path = self.av_model.model.get_path(new_iter) col = self.avail_tree.get_column(0) self.avail_tree.scroll_to_cell(path,col,1,1,0.0) 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.person.getPrimaryName().getRegularName()) self.max_key = self.max_key + 1 newkey = str(self.max_key) data.append(newkey) self.bk_model.add(data) for book_item in Plugins._bkitems: if book_item[0] == data[0]: self.item_storage[newkey] = list(book_item) def on_remove_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)) key = data[self.bk_ncols-1] del self.item_storage[key] self.bk_model.remove(iter) def on_clear_clicked(self,obj): self.bk_model.clear() self.item_storage.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)) key = data[self.bk_ncols-1] book_item = self.item_storage[key] options_dialog = book_item[2] options = book_item[4] style = book_item[5] opt_dlg = options_dialog(self.db,self.person,options,style) opt_dlg.window.destroy() if opt_dlg.person: self.bk_model.model.set_value(iter,2, opt_dlg.person.getPrimaryName().getRegularName()) book_item[4] = opt_dlg.options book_item[5] = opt_dlg.style self.item_storage[key] = book_item 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): item_list = self.build_item_list() if item_list: BookReportDialog(self.db,self.person,item_list) self.top.destroy() def build_item_list(self): item_list = [] if self.bk_model.count: for row in range(self.bk_model.count): self.bk_model.select_row(row) store,iter = self.bk_model.get_selected() data = self.bk_model.get_data(iter,range(self.bk_ncols)) key = data[self.bk_ncols-1] book_item = self.item_storage[key] item_list.append(book_item) return item_list def save(self): """ Saves the current BookReportSelector selections to the associated file. """ f = open(self.file,"w") f.write("\n") f.write('\n') # Write old entries first for name in self.bookmap.keys(): f.write('\n' % (name,self.db.getSavePath())) item_list = self.bookmap[name] for book_item in item_list: f.write(' \n' % book_item[0]) options = book_item[4] for opt_index in range(len(options)): f.write('