diff --git a/gramps2/src/ListModel.py b/gramps2/src/ListModel.py
index 3137516b4..b59f93b0d 100644
--- a/gramps2/src/ListModel.py
+++ b/gramps2/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/gramps2/src/SelectPerson.py b/gramps2/src/SelectPerson.py
new file mode 100644
index 000000000..459f5b9fe
--- /dev/null
+++ b/gramps2/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/gramps2/src/choose.glade b/gramps2/src/choose.glade
new file mode 100644
index 000000000..1e86e45e4
--- /dev/null
+++ b/gramps2/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/gramps2/src/plugins/BookReport.py b/gramps2/src/plugins/BookReport.py
new file mode 100644
index 000000000..2ac9ae65e
--- /dev/null
+++ b/gramps2/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**[%%1])} ",
+ " +#!!!!!!!!!!!!!4422******%%<1/|} ",
+ " +#!!!!!!!!!!!!!!4,*,**2***%<1/)} ",
+ " 3#!!!!@@@@@~,442,*,*,2**,,[<1/)} ",
+ " +#!!!!!!4!!444444**[%%%%%%<<1>~} ",
+ " 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/gramps2/src/plugins/book.glade b/gramps2/src/plugins/book.glade
new file mode 100644
index 000000000..92ae5104c
--- /dev/null
+++ b/gramps2/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
+
+
+
+
+
+
+