2002-10-20 19:55:16 +05:30
|
|
|
#
|
|
|
|
# Gramps - a GTK+/GNOME based genealogy program
|
|
|
|
#
|
2004-02-15 12:38:55 +05:30
|
|
|
# Copyright (C) 2000-2004 Donald N. Allingham
|
2002-10-20 19:55:16 +05:30
|
|
|
#
|
|
|
|
# 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
|
|
|
|
#
|
2003-10-14 07:52:14 +05:30
|
|
|
# $Id$
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
"""
|
|
|
|
The core of the GRAMPS plugin system. This module provides tasks to load
|
|
|
|
plugins from specfied directories, build menus for the different categories,
|
|
|
|
and provide dialog to select and execute plugins.
|
|
|
|
|
|
|
|
Plugins are divided into several categories. This are: reports, tools,
|
2004-05-07 09:28:26 +05:30
|
|
|
importers, exporters, and document generators.
|
2002-10-20 19:55:16 +05:30
|
|
|
"""
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# GTK libraries
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
2002-11-03 12:05:06 +05:30
|
|
|
import gobject
|
2002-10-20 19:55:16 +05:30
|
|
|
import gtk
|
|
|
|
import gtk.glade
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Standard Python modules
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
import traceback
|
|
|
|
import os
|
|
|
|
import sys
|
2002-11-03 12:05:06 +05:30
|
|
|
import string
|
2002-10-20 19:55:16 +05:30
|
|
|
from re import compile
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# GRAMPS modules
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
import const
|
|
|
|
import Utils
|
|
|
|
import GrampsCfg
|
2003-01-15 10:55:50 +05:30
|
|
|
import Errors
|
|
|
|
|
2003-08-17 07:44:33 +05:30
|
|
|
import gettext
|
2003-04-18 09:45:42 +05:30
|
|
|
|
2003-08-17 07:44:33 +05:30
|
|
|
_ = gettext.gettext
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Global lists
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
_reports = []
|
|
|
|
_tools = []
|
|
|
|
_imports = []
|
|
|
|
_exports = []
|
|
|
|
_success = []
|
|
|
|
_failed = []
|
|
|
|
_expect = []
|
|
|
|
_attempt = []
|
|
|
|
_loaddir = []
|
|
|
|
_textdoc = []
|
2003-06-30 08:42:22 +05:30
|
|
|
_bookdoc = []
|
2002-10-20 19:55:16 +05:30
|
|
|
_drawdoc = []
|
|
|
|
_failmsg = []
|
2003-06-08 05:08:13 +05:30
|
|
|
_bkitems = []
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2003-04-30 05:54:32 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Default relationship calculator
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
import Relationship
|
2004-02-15 12:38:55 +05:30
|
|
|
_relcalc_class = Relationship.RelationshipCalculator
|
2003-04-30 05:54:32 +05:30
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
2002-10-20 19:55:16 +05:30
|
|
|
_unavailable = _("No description was provided"),
|
2002-11-03 12:05:06 +05:30
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Constants
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
DOCSTRING = "d"
|
|
|
|
IMAGE = "i"
|
|
|
|
TASK = "f"
|
|
|
|
TITLE = "t"
|
|
|
|
STATUS = "s"
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# PluginDialog interface class
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
class PluginDialog:
|
|
|
|
"""Displays the dialog box that allows the user to select the
|
|
|
|
report that is desired."""
|
|
|
|
|
2004-02-28 09:21:59 +05:30
|
|
|
def __init__(self,parent,db,active,list,msg,label=None,button_label=None,tool_tip=None):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Display the dialog box, and build up the list of available
|
|
|
|
reports. This is used to build the selection tree on the left
|
|
|
|
hand side of the dailog box."""
|
|
|
|
|
2004-02-28 09:21:59 +05:30
|
|
|
self.parent = parent
|
|
|
|
if self.parent.child_windows.has_key(msg):
|
|
|
|
self.parent.child_windows[msg].present(None)
|
|
|
|
return
|
2002-10-20 19:55:16 +05:30
|
|
|
self.db = db
|
|
|
|
self.active = active
|
|
|
|
self.update = None
|
2002-11-03 12:05:06 +05:30
|
|
|
self.imap = {}
|
2004-02-28 09:21:59 +05:30
|
|
|
self.msg = msg
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2003-08-17 07:44:33 +05:30
|
|
|
self.dialog = gtk.glade.XML(const.pluginsFile,"report","gramps")
|
2002-10-20 19:55:16 +05:30
|
|
|
self.dialog.signal_autoconnect({
|
|
|
|
"on_report_apply_clicked" : self.on_apply_clicked,
|
2004-02-28 09:21:59 +05:30
|
|
|
"destroy_passed_object" : self.close,
|
|
|
|
"on_delete_event" : self.on_delete_event,
|
2002-10-20 19:55:16 +05:30
|
|
|
})
|
|
|
|
|
|
|
|
self.tree = self.dialog.get_widget("tree")
|
2003-03-06 11:42:51 +05:30
|
|
|
self.top = self.dialog.get_widget("report")
|
|
|
|
self.title = self.dialog.get_widget("title")
|
|
|
|
|
|
|
|
Utils.set_titles(self.top, self.title, msg )
|
|
|
|
|
2002-11-03 12:05:06 +05:30
|
|
|
self.store = gtk.TreeStore(gobject.TYPE_STRING)
|
|
|
|
self.selection = self.tree.get_selection()
|
|
|
|
self.selection.connect('changed', self.on_node_selected)
|
|
|
|
col = gtk.TreeViewColumn('',gtk.CellRendererText(),text=0)
|
|
|
|
self.tree.append_column(col)
|
|
|
|
self.tree.set_model(self.store)
|
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
self.description = self.dialog.get_widget("description")
|
2003-09-30 09:49:35 +05:30
|
|
|
if label:
|
|
|
|
self.description.set_text(label)
|
2002-10-20 19:55:16 +05:30
|
|
|
self.status = self.dialog.get_widget("report_status")
|
2003-03-05 11:31:31 +05:30
|
|
|
|
|
|
|
Utils.set_title_label(self.dialog,msg)
|
|
|
|
|
2003-02-08 22:58:41 +05:30
|
|
|
self.author_name = self.dialog.get_widget("author_name")
|
|
|
|
self.author_email = self.dialog.get_widget("author_email")
|
|
|
|
self.statbox = self.dialog.get_widget("statbox")
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2003-10-14 07:52:14 +05:30
|
|
|
self.apply_button = self.dialog.get_widget("apply")
|
|
|
|
if button_label:
|
|
|
|
self.apply_button.set_label(button_label)
|
|
|
|
else:
|
|
|
|
self.apply_button.set_label(_("_Apply"))
|
|
|
|
self.apply_button.set_use_underline(gtk.TRUE)
|
|
|
|
if tool_tip:
|
2003-12-10 09:01:38 +05:30
|
|
|
try:
|
2004-05-03 09:17:29 +05:30
|
|
|
tt = gtk.tooltips_data_get(self.apply_button)
|
2003-12-10 09:01:38 +05:30
|
|
|
if tt:
|
|
|
|
tt[0].set_tip(self.apply_button,tool_tip)
|
|
|
|
except AttributeError:
|
|
|
|
pass
|
2003-10-14 07:52:14 +05:30
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
self.run_tool = None
|
|
|
|
self.build_tree(list)
|
2004-02-28 09:21:59 +05:30
|
|
|
self.add_itself_to_menu()
|
|
|
|
self.top.show()
|
|
|
|
|
|
|
|
def on_delete_event(self,obj,b):
|
|
|
|
self.remove_itself_from_menu()
|
|
|
|
|
|
|
|
def close(self,ok=0):
|
|
|
|
self.remove_itself_from_menu()
|
|
|
|
self.top.destroy()
|
|
|
|
|
|
|
|
def add_itself_to_menu(self):
|
|
|
|
self.parent.child_windows[self.msg] = self
|
|
|
|
self.win_menu_item = gtk.MenuItem(self.msg)
|
|
|
|
self.win_menu_item.connect("activate",self.present)
|
|
|
|
self.win_menu_item.show()
|
|
|
|
self.parent.winsmenu.append(self.win_menu_item)
|
|
|
|
|
|
|
|
def remove_itself_from_menu(self):
|
|
|
|
del self.parent.child_windows[self.msg]
|
|
|
|
self.win_menu_item.destroy()
|
|
|
|
|
|
|
|
def present(self,obj):
|
|
|
|
self.top.present()
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
def on_apply_clicked(self,obj):
|
|
|
|
"""Execute the selected report"""
|
|
|
|
|
|
|
|
if self.run_tool:
|
|
|
|
if self.update:
|
2004-05-14 00:01:48 +05:30
|
|
|
self.run_tool(self.db,self.active,self.update,self.parent)
|
2002-10-20 19:55:16 +05:30
|
|
|
else:
|
2004-05-14 00:01:48 +05:30
|
|
|
self.run_tool(self.db,self.active)
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2002-11-03 12:05:06 +05:30
|
|
|
def on_node_selected(self,obj):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Updates the informational display on the right hand side of
|
|
|
|
the dialog box with the description of the selected report"""
|
|
|
|
|
2004-08-20 17:41:56 +05:30
|
|
|
store,node = self.selection.get_selected()
|
|
|
|
if node:
|
|
|
|
path = store.get_path(node)
|
|
|
|
if not node or not self.imap.has_key(path):
|
2003-02-08 22:58:41 +05:30
|
|
|
self.statbox.hide()
|
2002-11-03 12:05:06 +05:30
|
|
|
return
|
2003-02-08 22:58:41 +05:30
|
|
|
self.statbox.show()
|
2002-11-03 12:05:06 +05:30
|
|
|
data = self.imap[path]
|
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
title = data[0]
|
2002-11-03 12:05:06 +05:30
|
|
|
task = data[1]
|
2002-10-20 19:55:16 +05:30
|
|
|
doc = data[2]
|
2004-05-12 09:28:14 +05:30
|
|
|
status = data[3]
|
|
|
|
author = data[4]
|
|
|
|
email = data[5]
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
self.description.set_text(doc)
|
2003-02-08 22:58:41 +05:30
|
|
|
self.status.set_text(status)
|
2004-05-12 09:28:14 +05:30
|
|
|
self.title.set_text('<span weight="bold" size="larger">%s</span>' % title)
|
|
|
|
self.title.set_use_markup(1)
|
2003-02-08 22:58:41 +05:30
|
|
|
self.author_name.set_text(author)
|
|
|
|
self.author_email.set_text(email)
|
2002-10-20 19:55:16 +05:30
|
|
|
self.run_tool = task
|
|
|
|
|
|
|
|
def build_tree(self,list):
|
|
|
|
"""Populates a GtkTree with each menu item assocated with a entry
|
|
|
|
in the lists. The list must consist of a tuples with the following
|
|
|
|
format:
|
|
|
|
|
2003-02-08 22:58:41 +05:30
|
|
|
(task_to_call, category, report name, description, image, status, author_name, author_email)
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
Items in the same category are grouped under the same submen. The
|
|
|
|
task_to_call is bound to the 'select' callback of the menu entry."""
|
2002-11-03 12:05:06 +05:30
|
|
|
|
|
|
|
ilist = []
|
2003-04-22 21:10:24 +05:30
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
# build the tree items and group together based on the category name
|
|
|
|
item_hash = {}
|
|
|
|
for report in list:
|
2004-05-12 09:28:14 +05:30
|
|
|
t = (report[2],report[0],report[3],report[4],report[5],report[6])
|
2002-10-20 19:55:16 +05:30
|
|
|
if item_hash.has_key(report[1]):
|
|
|
|
item_hash[report[1]].append(t)
|
|
|
|
else:
|
|
|
|
item_hash[report[1]] = [t]
|
|
|
|
|
|
|
|
# add a submenu for each category, and populate it with the
|
|
|
|
# GtkTreeItems that are associated with it.
|
|
|
|
key_list = item_hash.keys()
|
|
|
|
key_list.sort()
|
2002-11-03 12:05:06 +05:30
|
|
|
key_list.reverse()
|
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
prev = None
|
|
|
|
for key in key_list:
|
|
|
|
data = item_hash[key]
|
2002-11-03 12:05:06 +05:30
|
|
|
node = self.store.insert_after(None,prev)
|
|
|
|
self.store.set(node,0,key)
|
2002-10-20 19:55:16 +05:30
|
|
|
next = None
|
|
|
|
data.sort()
|
|
|
|
for item in data:
|
2002-11-03 12:05:06 +05:30
|
|
|
next = self.store.insert_after(node,next)
|
|
|
|
ilist.append((next,item))
|
|
|
|
self.store.set(next,0,item[0])
|
|
|
|
for next,tab in ilist:
|
|
|
|
path = self.store.get_path(next)
|
|
|
|
self.imap[path] = tab
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# ReportPlugins interface class
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
class ReportPlugins(PluginDialog):
|
|
|
|
"""Displays the dialog box that allows the user to select the
|
|
|
|
report that is desired."""
|
|
|
|
|
2004-02-28 09:21:59 +05:30
|
|
|
def __init__(self,parent,db,active):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Display the dialog box, and build up the list of available
|
|
|
|
reports. This is used to build the selection tree on the left
|
|
|
|
hand side of the dailog box."""
|
2004-02-28 09:21:59 +05:30
|
|
|
PluginDialog.__init__(self,parent,db,active,_reports,_("Report Selection"),
|
2004-05-13 23:54:38 +05:30
|
|
|
_("Select a report from those available on the left."),
|
2003-10-14 07:52:14 +05:30
|
|
|
_("_Generate"), _("Generate selected report"))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# ToolPlugins interface class
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
class ToolPlugins(PluginDialog):
|
|
|
|
"""Displays the dialog box that allows the user to select the tool
|
|
|
|
that is desired."""
|
|
|
|
|
2004-02-28 09:21:59 +05:30
|
|
|
def __init__(self,parent,db,active,update):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Display the dialog box, and build up the list of available
|
|
|
|
reports. This is used to build the selection tree on the left
|
|
|
|
hand side of the dailog box."""
|
|
|
|
|
2004-02-28 09:21:59 +05:30
|
|
|
PluginDialog.__init__(self,parent,db,active,_tools,_("Tool Selection"),
|
2004-05-13 23:54:38 +05:30
|
|
|
_("Select a tool from those available on the left."),
|
2003-10-14 07:52:14 +05:30
|
|
|
_("_Run"), _("Run selected tool"))
|
2002-10-20 19:55:16 +05:30
|
|
|
self.update = update
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# PluginStatus
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
class PluginStatus:
|
|
|
|
"""Displays a dialog showing the status of loaded plugins"""
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
import cStringIO
|
|
|
|
|
2003-08-17 07:44:33 +05:30
|
|
|
self.glade = gtk.glade.XML(const.pluginsFile,"plugstat","gramps")
|
2002-10-20 19:55:16 +05:30
|
|
|
self.top = self.glade.get_widget("plugstat")
|
2003-03-06 11:42:51 +05:30
|
|
|
self.top.set_title("%s - GRAMPS" % _('Plugin status'))
|
2002-10-20 19:55:16 +05:30
|
|
|
window = self.glade.get_widget("text")
|
|
|
|
self.glade.signal_autoconnect({
|
|
|
|
'on_close_clicked' : self.close
|
|
|
|
})
|
|
|
|
|
|
|
|
info = cStringIO.StringIO()
|
2003-03-07 07:51:18 +05:30
|
|
|
|
|
|
|
if len(_expect) + len(_failmsg) == 0:
|
|
|
|
window.get_buffer().set_text(_('All modules were successfully loaded.'))
|
|
|
|
else:
|
|
|
|
info.write(_("The following modules could not be loaded:"))
|
|
|
|
info.write("\n\n")
|
|
|
|
|
2004-08-20 17:41:56 +05:30
|
|
|
for (filename,msg) in _expect:
|
|
|
|
info.write("%s: %s\n\n" % (filename,msg))
|
2003-03-07 07:51:18 +05:30
|
|
|
|
2004-08-20 17:41:56 +05:30
|
|
|
for (filename,msgs) in _failmsg:
|
2003-03-07 07:51:18 +05:30
|
|
|
error = str(msgs[0])
|
|
|
|
if error[0:11] == "exceptions.":
|
|
|
|
error = error[11:]
|
2004-08-20 17:41:56 +05:30
|
|
|
info.write("%s: %s\n" % (filename,error) )
|
2003-03-07 07:51:18 +05:30
|
|
|
traceback.print_exception(msgs[0],msgs[1],msgs[2],None,info)
|
|
|
|
info.write('\n')
|
|
|
|
info.seek(0)
|
|
|
|
window.get_buffer().set_text(info.read())
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
def close(self,obj):
|
|
|
|
self.top.destroy()
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# load_plugins
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def load_plugins(direct):
|
|
|
|
"""Searches the specified directory, and attempts to load any python
|
|
|
|
modules that it finds, adding name to the _attempts list. If the module
|
|
|
|
successfully loads, it is added to the _success list. Each plugin is
|
|
|
|
responsible for registering itself in the correct manner. No attempt
|
|
|
|
is done in this routine to register the tasks."""
|
|
|
|
|
|
|
|
global _success,_failed,_attempt,_loaddir
|
|
|
|
|
|
|
|
# if the directory does not exist, do nothing
|
|
|
|
if not os.path.isdir(direct):
|
|
|
|
return
|
|
|
|
|
|
|
|
# if the path has not already been loaded, save it in the _loaddir
|
|
|
|
# list for use on reloading
|
2003-04-22 09:12:15 +05:30
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
if direct not in _loaddir:
|
2004-05-13 23:54:38 +05:30
|
|
|
_loaddir.append(direct)
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
# add the directory to the python search path
|
|
|
|
sys.path.append(direct)
|
|
|
|
|
|
|
|
pymod = compile(r"^(.*)\.py$")
|
|
|
|
|
|
|
|
# loop through each file in the directory, looking for files that
|
|
|
|
# have a .py extention, and attempt to load the file. If it succeeds,
|
|
|
|
# add it to the _success list. If it fails, add it to the _failure
|
|
|
|
# list
|
|
|
|
|
2004-08-20 17:41:56 +05:30
|
|
|
for filename in os.listdir(direct):
|
|
|
|
name = os.path.split(filename)
|
2002-10-20 19:55:16 +05:30
|
|
|
match = pymod.match(name[1])
|
|
|
|
if not match:
|
|
|
|
continue
|
2004-08-20 17:41:56 +05:30
|
|
|
_attempt.append(filename)
|
2002-10-20 19:55:16 +05:30
|
|
|
plugin = match.groups()[0]
|
|
|
|
try:
|
|
|
|
a = __import__(plugin)
|
|
|
|
_success.append(a)
|
2003-01-15 10:55:50 +05:30
|
|
|
except Errors.PluginError, msg:
|
2004-08-20 17:41:56 +05:30
|
|
|
_expect.append((filename,str(msg)))
|
2002-10-20 19:55:16 +05:30
|
|
|
except:
|
2004-08-20 17:41:56 +05:30
|
|
|
_failmsg.append((filename,sys.exc_info()))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# reload_plugins
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def reload_plugins(obj):
|
|
|
|
"""Treated as a callback, causes all plugins to get reloaded. This is
|
|
|
|
useful when writing and debugging a plugin"""
|
|
|
|
|
|
|
|
pymod = compile(r"^(.*)\.py$")
|
|
|
|
|
|
|
|
# attempt to reload all plugins that have succeeded
|
|
|
|
# in the past
|
|
|
|
for plugin in _success:
|
|
|
|
try:
|
|
|
|
reload(plugin)
|
|
|
|
except:
|
|
|
|
_failmsg.append((plugin,sys.exc_info()))
|
|
|
|
|
|
|
|
# attempt to load the plugins that have failed in the past
|
|
|
|
|
|
|
|
for plugin in _failed:
|
|
|
|
try:
|
|
|
|
__import__(plugin)
|
2003-04-22 09:12:15 +05:30
|
|
|
del _failmsg[plugin]
|
2002-10-20 19:55:16 +05:30
|
|
|
except:
|
|
|
|
_failmsg.append((plugin,sys.exc_info()))
|
|
|
|
|
|
|
|
# attempt to load any new files found
|
2004-08-20 17:41:56 +05:30
|
|
|
for directory in _loaddir:
|
|
|
|
for filename in os.listdir(directory):
|
|
|
|
name = os.path.split(filename)
|
2004-05-13 23:54:38 +05:30
|
|
|
match = pymod.match(name[1])
|
2002-10-20 19:55:16 +05:30
|
|
|
if not match:
|
|
|
|
continue
|
2004-08-20 17:41:56 +05:30
|
|
|
if filename in _attempt:
|
2002-10-20 19:55:16 +05:30
|
|
|
return
|
2004-08-20 17:41:56 +05:30
|
|
|
_attempt.append(filename)
|
2002-10-20 19:55:16 +05:30
|
|
|
plugin = match.groups()[0]
|
|
|
|
try:
|
|
|
|
a = __import__(plugin)
|
2003-04-22 09:12:15 +05:30
|
|
|
if a not in _success:
|
|
|
|
_success.append(a)
|
2002-10-20 19:55:16 +05:30
|
|
|
except:
|
2004-08-20 17:41:56 +05:30
|
|
|
_failmsg.append((filename,sys.exc_info()))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Plugin registering
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
2004-07-09 23:49:47 +05:30
|
|
|
def register_export(exportData,_title,_description='',_config=None,_filename=''):
|
2004-06-26 11:09:43 +05:30
|
|
|
"""
|
|
|
|
Register an export filter, taking the task, file filter,
|
|
|
|
and the list of patterns for the filename matching.
|
|
|
|
"""
|
2004-07-09 23:49:47 +05:30
|
|
|
if _description and _filename:
|
|
|
|
_exports.append((exportData,_title,_description,_config,_filename))
|
2004-06-24 08:59:38 +05:30
|
|
|
|
* src/Plugins.py: Add native_format flag to import plugin registration.
* src/ReadXML.py, src/ReadGedcom.py: Register as native formats
to prevent loading twice on File->Open.
* src/data/gramps.schemas: Add keys for last import and export dirs.
* src/GrampsCfg.py (get_last_import_dir, save_last_import_dir,
get_last_export_dir, save_last_export_dir): Add functions.
* src/Exportder.py (suggest_filename): Try last export and last
import folders before falling back to Home; (save): Save export folder.
* src/Utils.py (get_new_filename): Add optional folder argument.
* src/DbPrompter.py (ExistingDbPrompter.chooser): Only add
importers for non-native formats, the rest is already taken care of;
Try last file, last import, last export, then home folders;
(ImportDbPrompter.chooser): Save import folder; Try last import,
last file, last export, then home folders.
(NewNativeDbPrompter): Try last file, last import, last export folders,
then fall back to home.
svn: r3493
2004-08-24 03:35:55 +05:30
|
|
|
def register_import(task, ffilter, mime=None, native_format=0):
|
2004-06-24 08:59:38 +05:30
|
|
|
"""Register an import filter, taking the task and file filter"""
|
|
|
|
if mime:
|
* src/Plugins.py: Add native_format flag to import plugin registration.
* src/ReadXML.py, src/ReadGedcom.py: Register as native formats
to prevent loading twice on File->Open.
* src/data/gramps.schemas: Add keys for last import and export dirs.
* src/GrampsCfg.py (get_last_import_dir, save_last_import_dir,
get_last_export_dir, save_last_export_dir): Add functions.
* src/Exportder.py (suggest_filename): Try last export and last
import folders before falling back to Home; (save): Save export folder.
* src/Utils.py (get_new_filename): Add optional folder argument.
* src/DbPrompter.py (ExistingDbPrompter.chooser): Only add
importers for non-native formats, the rest is already taken care of;
Try last file, last import, last export, then home folders;
(ImportDbPrompter.chooser): Save import folder; Try last import,
last file, last export, then home folders.
(NewNativeDbPrompter): Try last file, last import, last export folders,
then fall back to home.
svn: r3493
2004-08-24 03:35:55 +05:30
|
|
|
_imports.append((task, ffilter, mime, native_format))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
def register_report(task, name,
|
|
|
|
category=_("Uncategorized"),
|
|
|
|
description=_unavailable,
|
2003-02-08 22:58:41 +05:30
|
|
|
status=_("Unknown"),
|
|
|
|
author_name=_("Unknown"),
|
|
|
|
author_email=_("Unknown")
|
|
|
|
):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Register a report with the plugin system"""
|
|
|
|
|
2003-04-22 21:10:24 +05:30
|
|
|
del_index = -1
|
|
|
|
for i in range(0,len(_reports)):
|
|
|
|
val = _reports[i]
|
|
|
|
if val[2] == name:
|
|
|
|
del_index = i
|
|
|
|
if del_index != -1:
|
|
|
|
del _reports[del_index]
|
2004-05-12 09:28:14 +05:30
|
|
|
_reports.append((task, category, name, description, status, author_name, author_email))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
|
|
|
def register_tool(task, name,
|
|
|
|
category=_("Uncategorized"),
|
|
|
|
description=_unavailable,
|
2003-02-08 22:58:41 +05:30
|
|
|
status=_("Unknown"),
|
|
|
|
author_name=_("Unknown"),
|
|
|
|
author_email=_("Unknown")
|
|
|
|
):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Register a tool with the plugin system"""
|
2003-04-22 21:10:24 +05:30
|
|
|
del_index = -1
|
|
|
|
for i in range(0,len(_tools)):
|
|
|
|
val = _tools[i]
|
|
|
|
if val[2] == name:
|
|
|
|
del_index = i
|
|
|
|
if del_index != -1:
|
|
|
|
del _tools[del_index]
|
2004-05-12 09:28:14 +05:30
|
|
|
_tools.append((task, category, name, description, status, author_name, author_name))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2003-04-30 05:54:32 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Text document registration
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
2003-07-29 02:01:09 +05:30
|
|
|
def register_text_doc(name,classref, table, paper, style, ext,
|
|
|
|
print_report_label = None):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Register a text document generator"""
|
|
|
|
for n in _textdoc:
|
|
|
|
if n[0] == name:
|
|
|
|
return
|
2003-07-31 17:30:30 +05:30
|
|
|
_textdoc.append((name,classref,table,paper,style,ext,print_report_label))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2003-06-30 08:42:22 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Text document registration
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def register_book_doc(name,classref, table, paper, style, ext):
|
|
|
|
"""Register a text document generator"""
|
|
|
|
for n in _bookdoc:
|
|
|
|
if n[0] == name:
|
|
|
|
return
|
|
|
|
_bookdoc.append((name,classref,table,paper,style,ext))
|
|
|
|
|
2003-04-30 05:54:32 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Drawing document registration
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
2003-07-29 02:01:09 +05:30
|
|
|
def register_draw_doc(name,classref,paper,style, ext,
|
|
|
|
print_report_label = None):
|
2002-10-20 19:55:16 +05:30
|
|
|
"""Register a drawing document generator"""
|
|
|
|
for n in _drawdoc:
|
|
|
|
if n[0] == name:
|
|
|
|
return
|
2003-07-29 02:01:09 +05:30
|
|
|
_drawdoc.append((name,classref,paper,style,ext,print_report_label))
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2003-04-30 05:54:32 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
2004-02-15 12:38:55 +05:30
|
|
|
# Relationship calculator registration
|
2003-04-30 05:54:32 +05:30
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
2004-02-15 12:38:55 +05:30
|
|
|
def register_relcalc(relclass, languages):
|
2003-04-30 05:54:32 +05:30
|
|
|
"""Register a relationshp calculator"""
|
2004-02-15 12:38:55 +05:30
|
|
|
global _relcalc_class
|
2003-06-11 09:21:09 +05:30
|
|
|
|
|
|
|
try:
|
|
|
|
if os.environ["LANG"] in languages:
|
2004-02-15 12:38:55 +05:30
|
|
|
_relcalc_class = relclass
|
2003-06-11 10:28:37 +05:30
|
|
|
except:
|
|
|
|
pass
|
2003-04-30 05:54:32 +05:30
|
|
|
|
2004-02-15 12:38:55 +05:30
|
|
|
def relationship_class(db):
|
|
|
|
global _relcalc_class
|
|
|
|
return _relcalc_class(db)
|
2003-06-08 05:08:13 +05:30
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Book item registration
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
2003-06-11 10:09:53 +05:30
|
|
|
def register_book_item(name,category,options_dialog,write_book_item,options,style_name,style_file,make_default_style):
|
2003-06-08 05:08:13 +05:30
|
|
|
"""Register a book item"""
|
|
|
|
|
|
|
|
for n in _bkitems:
|
|
|
|
if n[0] == name:
|
|
|
|
return
|
2003-06-11 10:09:53 +05:30
|
|
|
_bkitems.append((name,category,options_dialog,write_book_item,options,style_name,style_file,make_default_style))
|
2003-06-08 05:08:13 +05:30
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Image attributes
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
_image_attributes = []
|
|
|
|
def register_image_attribute(name):
|
|
|
|
if name not in _image_attributes:
|
|
|
|
_image_attributes.append(name)
|
|
|
|
|
|
|
|
def get_image_attributes():
|
|
|
|
return _image_attributes
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# Building pulldown menus
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def build_menu(top_menu,list,callback):
|
|
|
|
report_menu = gtk.Menu()
|
|
|
|
report_menu.show()
|
|
|
|
|
2004-08-20 17:41:56 +05:30
|
|
|
hash_data = {}
|
2002-10-20 19:55:16 +05:30
|
|
|
for report in list:
|
2004-08-20 17:41:56 +05:30
|
|
|
if hash_data.has_key(report[1]):
|
|
|
|
hash_data[report[1]].append((report[2],report[0]))
|
2002-10-20 19:55:16 +05:30
|
|
|
else:
|
2004-08-20 17:41:56 +05:30
|
|
|
hash_data[report[1]] = [(report[2],report[0])]
|
2002-10-20 19:55:16 +05:30
|
|
|
|
2004-08-20 17:41:56 +05:30
|
|
|
catlist = hash_data.keys()
|
2002-10-20 19:55:16 +05:30
|
|
|
catlist.sort()
|
|
|
|
for key in catlist:
|
|
|
|
entry = gtk.MenuItem(key)
|
|
|
|
entry.show()
|
|
|
|
report_menu.append(entry)
|
|
|
|
submenu = gtk.Menu()
|
|
|
|
submenu.show()
|
|
|
|
entry.set_submenu(submenu)
|
2004-08-20 17:41:56 +05:30
|
|
|
lst = hash_data[key]
|
|
|
|
lst.sort()
|
|
|
|
for name in lst:
|
2003-07-16 02:59:38 +05:30
|
|
|
subentry = gtk.MenuItem("%s..." % name[0])
|
2002-10-20 19:55:16 +05:30
|
|
|
subentry.show()
|
|
|
|
subentry.connect("activate",callback,name[1])
|
|
|
|
submenu.append(subentry)
|
|
|
|
top_menu.set_submenu(report_menu)
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# build_report_menu
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def build_report_menu(top_menu,callback):
|
|
|
|
build_menu(top_menu,_reports,callback)
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# build_tools_menu
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def build_tools_menu(top_menu,callback):
|
|
|
|
build_menu(top_menu,_tools,callback)
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# get_text_doc_menu
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def get_text_doc_menu(main_menu,tables,callback,obj=None):
|
|
|
|
index = 0
|
|
|
|
myMenu = gtk.Menu()
|
|
|
|
_textdoc.sort()
|
|
|
|
for item in _textdoc:
|
|
|
|
if tables and item[2] == 0:
|
|
|
|
continue
|
|
|
|
name = item[0]
|
|
|
|
menuitem = gtk.MenuItem(name)
|
|
|
|
menuitem.set_data("name",item[1])
|
|
|
|
menuitem.set_data("styles",item[4])
|
|
|
|
menuitem.set_data("paper",item[3])
|
2003-04-18 09:45:42 +05:30
|
|
|
menuitem.set_data("ext",item[5])
|
2002-10-20 19:55:16 +05:30
|
|
|
menuitem.set_data("obj",obj)
|
2003-07-29 02:01:09 +05:30
|
|
|
menuitem.set_data("printable",item[6])
|
2002-10-20 19:55:16 +05:30
|
|
|
if callback:
|
|
|
|
menuitem.connect("activate",callback)
|
|
|
|
menuitem.show()
|
|
|
|
myMenu.append(menuitem)
|
2004-07-15 08:24:04 +05:30
|
|
|
if name == GrampsCfg.get_output_preference():
|
2002-10-20 19:55:16 +05:30
|
|
|
myMenu.set_active(index)
|
|
|
|
callback(menuitem)
|
|
|
|
index = index + 1
|
|
|
|
main_menu.set_menu(myMenu)
|
|
|
|
|
2003-06-30 08:42:22 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# get_text_doc_menu
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def get_book_menu(main_menu,tables,callback,obj=None):
|
|
|
|
|
|
|
|
index = 0
|
|
|
|
myMenu = gtk.Menu()
|
|
|
|
_bookdoc.sort()
|
|
|
|
for item in _bookdoc:
|
|
|
|
if tables and item[2] == 0:
|
|
|
|
continue
|
|
|
|
name = item[0]
|
|
|
|
menuitem = gtk.MenuItem(name)
|
|
|
|
menuitem.set_data("name",item[1])
|
|
|
|
menuitem.set_data("styles",item[4])
|
|
|
|
menuitem.set_data("paper",item[3])
|
|
|
|
menuitem.set_data("ext",item[5])
|
|
|
|
menuitem.set_data("obj",obj)
|
|
|
|
if callback:
|
|
|
|
menuitem.connect("activate",callback)
|
|
|
|
menuitem.show()
|
|
|
|
myMenu.append(menuitem)
|
2004-07-15 08:24:04 +05:30
|
|
|
if name == GrampsCfg.get_output_preference():
|
2003-06-30 08:42:22 +05:30
|
|
|
myMenu.set_active(index)
|
|
|
|
callback(menuitem)
|
|
|
|
index = index + 1
|
|
|
|
main_menu.set_menu(myMenu)
|
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# get_text_doc_list
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def get_text_doc_list():
|
|
|
|
l = []
|
|
|
|
_textdoc.sort()
|
|
|
|
for item in _textdoc:
|
|
|
|
l.append(item[0])
|
|
|
|
return l
|
|
|
|
|
2003-06-30 08:42:22 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# get_text_doc_list
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def get_book_doc_list():
|
|
|
|
l = []
|
|
|
|
_bookdoc.sort()
|
|
|
|
for item in _bookdoc:
|
|
|
|
l.append(item[0])
|
|
|
|
return l
|
|
|
|
|
2002-10-20 19:55:16 +05:30
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# get_draw_doc_list
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def get_draw_doc_list():
|
|
|
|
|
|
|
|
l = []
|
|
|
|
_drawdoc.sort()
|
|
|
|
for item in _drawdoc:
|
|
|
|
l.append(item[0])
|
|
|
|
return l
|
|
|
|
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
#
|
|
|
|
# get_draw_doc_menu
|
|
|
|
#
|
|
|
|
#-------------------------------------------------------------------------
|
|
|
|
def get_draw_doc_menu(main_menu,callback=None,obj=None):
|
|
|
|
|
|
|
|
index = 0
|
|
|
|
myMenu = gtk.Menu()
|
2003-07-29 02:01:09 +05:30
|
|
|
for (name,classref,paper,styles,ext,printable) in _drawdoc:
|
2002-10-20 19:55:16 +05:30
|
|
|
menuitem = gtk.MenuItem(name)
|
|
|
|
menuitem.set_data("name",classref)
|
2003-04-18 09:45:42 +05:30
|
|
|
menuitem.set_data("styles",styles)
|
|
|
|
menuitem.set_data("paper",paper)
|
|
|
|
menuitem.set_data("ext",ext)
|
2002-10-20 19:55:16 +05:30
|
|
|
menuitem.set_data("obj",obj)
|
2003-07-29 02:01:09 +05:30
|
|
|
menuitem.set_data("printable",printable)
|
2002-10-20 19:55:16 +05:30
|
|
|
if callback:
|
|
|
|
menuitem.connect("activate",callback)
|
|
|
|
menuitem.show()
|
|
|
|
myMenu.append(menuitem)
|
2004-07-15 08:24:04 +05:30
|
|
|
if name == GrampsCfg.get_goutput_preference():
|
2002-10-20 19:55:16 +05:30
|
|
|
myMenu.set_active(index)
|
|
|
|
if callback:
|
|
|
|
callback(menuitem)
|
|
|
|
index = index + 1
|
|
|
|
main_menu.set_menu(myMenu)
|