gramps/src/PluginUtils/_PluginDialogs.py

316 lines
11 KiB
Python
Raw Normal View History

2002-10-20 19:55:16 +05:30
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2006 Donald N. Allingham
# Copyright (C) 2008 Brian G. Matherly
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
#
# $Id$
2002-10-20 19:55:16 +05:30
#-------------------------------------------------------------------------
#
# GTK libraries
#
#-------------------------------------------------------------------------
import gtk
#-------------------------------------------------------------------------
#
# Standard Python modules
#
#-------------------------------------------------------------------------
from gettext import gettext as _
2002-10-20 19:55:16 +05:30
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
import const
from ReportBase import report, standalone_categories
import _Tool
from gen.plug import REPORT, TOOL
from gui.pluginmanager import GuiPluginManager
2006-04-01 09:29:42 +05:30
import ManagedWindow
2005-12-06 12:08:09 +05:30
#-------------------------------------------------------------------------
#
# Constants
#
#-------------------------------------------------------------------------
_REPORTS = 0
_TOOLS = 1
_UNSUPPORTED = _("Unsupported")
2002-10-20 19:55:16 +05:30
#-------------------------------------------------------------------------
#
# PluginDialog interface class
#
#-------------------------------------------------------------------------
2006-04-01 09:29:42 +05:30
class PluginDialog(ManagedWindow.ManagedWindow):
"""
Displays the dialog box that allows the user to select the
plugin that is desired.
"""
def __init__(self, state, uistate, track, categories, msg,
label=None, button_label=None, tool_tip=None,
content=_REPORTS):
"""
Display the dialog box, and build up the list of available
2002-10-20 19:55:16 +05:30
reports. This is used to build the selection tree on the left
hand side of the dialog box.
"""
self.active = state.active
self.imap = {}
2004-02-28 09:21:59 +05:30
self.msg = msg
2005-12-06 12:08:09 +05:30
self.content = content
self._pmgr = GuiPluginManager.get_instance()
ManagedWindow.ManagedWindow.__init__(self, uistate, track,
self.__class__)
* src/AddrEdit.py: remove already_exist check in favor of exception * src/AttrEdit.py: remove already_exist check in favor of exception * src/DisplayState.py: remove already_exist variable * src/DisplayTabs.py: handle exception * src/EditEventRef.py: remove already_exist check in favor of exception * src/EditFamily.py: update to derive from EditPrimary * src/EditMedia.py: update to derive from EditPrimary * src/EditMediaRef.py: remove already_exist check in favor of exception * src/EditPerson.py: update to derive from EditPrimary * src/EditPlace.py: update to derive from EditPrimary * src/EditRepository.py:update to derive from EditPrimary * src/EditSource.py: update to derive from EditPrimary * src/EditSourceRef.py: remove already_exist check in favor of exception * src/Errors.py: new exception * src/EventEdit.py: update to derive from EditPrimary * src/EventView.py: catch exception of window already exists * src/FamilyList.py: catch exception of window already exists * src/FamilyView.py: catch exception of window already exists * src/GrampsWidgets.py: typos * src/NameEdit.py: remove already_exist check in favor of exception * src/PedView.py: catch exception of window already exists * src/PersonView.py: catch exception of window already exists * src/PlaceView.py: catch exception of window already exists * src/Plugins.py: catch exception of window already exists * src/UrlEdit.py: remove already_exist check in favor of exception * src/const.py.in: dynamically determine path * src/gramps.glade: name changes * src/gramps.py: set path svn: r6014
2006-03-01 10:38:11 +05:30
self.state = state
self.uistate = uistate
2002-10-20 19:55:16 +05:30
self.dialog = gtk.Builder()
self.dialog.add_from_file(const.PLUGINS_GLADE)
self.dialog.connect_signals({
2002-10-20 19:55:16 +05:30
"on_report_apply_clicked" : self.on_apply_clicked,
"destroy_passed_object" : self.close,
2002-10-20 19:55:16 +05:30
})
self.tree = self.dialog.get_object("tree")
window = self.dialog.get_object("report")
self.title = self.dialog.get_object("title")
2003-03-06 11:42:51 +05:30
self.set_window(window, self.title, msg )
2003-03-06 11:42:51 +05:30
self.store = gtk.TreeStore(str)
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)
self.description = self.dialog.get_object("description")
if label:
self.description.set_text(label)
self.status = self.dialog.get_object("report_status")
2003-03-05 11:31:31 +05:30
self.author_name = self.dialog.get_object("author_name")
self.author_email = self.dialog.get_object("author_email")
2005-12-06 12:08:09 +05:30
self.apply_button = self.dialog.get_object("apply")
if button_label:
self.apply_button.set_label(button_label)
else:
self.apply_button.set_label(_("_Apply"))
self.apply_button.set_use_underline(True)
if tool_tip:
self.apply_button.set_tooltip_text(tool_tip)
2005-12-06 12:08:09 +05:30
self.item = None
if content == _REPORTS:
reg_list = self._pmgr.get_reg_reports()
elif content == _TOOLS:
reg_list = self._pmgr.get_reg_tools()
else:
reg_list = []
self.build_plugin_tree(reg_list, categories)
self.show()
2004-02-28 09:21:59 +05:30
def rebuild(self):
# This method needs to be overridden in the subclass
assert False, "This method needs to be overridden in the subclass."
def build_menu_names(self, obj):
return (self.msg, None)
2002-10-20 19:55:16 +05:30
def on_apply_clicked(self, obj):
2002-10-20 19:55:16 +05:30
"""Execute the selected report"""
if not self.item:
return
self.run_plugin(self.item)
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"""
store, node = self.selection.get_selected()
if node:
path = store.get_path(node)
if not node or path not in self.imap:
return
pdata = self.imap[path]
#(report_class, options_class, title, category, name,
# doc,status,author,email,unsupported,require_active) = data
self.description.set_text(pdata.description)
if not pdata.supported:
status = _UNSUPPORTED
self.status.set_text(pdata.statustext())
self.title.set_text('<span weight="bold" size="larger">%s</span>' \
% pdata.name)
self.title.set_use_markup(1)
self.author_name.set_text(', '.join(pdata.authors))
self.author_email.set_text(', '.join(pdata.authors_email))
self.item = pdata
2002-10-20 19:55:16 +05:30
def build_plugin_tree(self, reg_list, categories):
2009-08-09 22:39:32 +05:30
"""Populates a GtkTree with each menu item associated with a entry
in the lists. The list consists of PluginData objects for reports or
tools.
2002-10-20 19:55:16 +05:30
old data was (item_class, options_class,title,category, name,
2005-12-06 12:08:09 +05:30
doc,status,author,email)
Items in the same category are grouped under the same submenu.
The categories must be dicts from integer to string.
"""
ilist = []
self.store.clear()
2002-10-20 19:55:16 +05:30
# build the tree items and group together based on the category name
item_hash = {}
for plugin in reg_list:
if not plugin.supported:
category = _UNSUPPORTED
2005-12-06 12:08:09 +05:30
else:
category = categories[plugin.category]
if category in item_hash:
2005-12-06 12:08:09 +05:30
item_hash[category].append(plugin)
2002-10-20 19:55:16 +05:30
else:
2005-12-06 12:08:09 +05:30
item_hash[category] = [plugin]
2002-10-20 19:55:16 +05:30
# add a submenu for each category, and populate it with the
# GtkTreeItems that are associated with it.
key_list = [item for item in item_hash if item != _UNSUPPORTED]
key_list.sort(reverse=True)
2002-10-20 19:55:16 +05:30
prev = None
if _UNSUPPORTED in item_hash:
key = _UNSUPPORTED
2002-10-20 19:55:16 +05:30
data = item_hash[key]
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(lambda x, y: cmp(x.name, y.name))
2002-10-20 19:55:16 +05:30
for item in data:
next = self.store.insert_after(node, next)
ilist.append((next, item))
self.store.set(next, 0, item.name)
for key in key_list:
data = item_hash[key]
node = self.store.insert_after(None, prev)
self.store.set(node, 0, key)
next = None
data.sort(key=lambda k:k.name)
for item in data:
next = self.store.insert_after(node, next)
ilist.append((next, item))
self.store.set(next, 0, item.name)
for next, tab in ilist:
path = self.store.get_path(next)
self.imap[path] = tab
def run_plugin(self, pdata):
"""
run a plugin based on it's PluginData:
1/ load plugin.
2/ the report is run
"""
mod = self._pmgr.load_plugin(pdata)
if not mod:
#import of plugin failed
return
if pdata.ptype == REPORT:
report(self.state, self.uistate, self.state.active,
eval('mod.' + pdata.reportclass),
eval('mod.' + pdata.optionclass),
pdata.name, pdata.id,
pdata.category, pdata.require_active)
else:
_Tool.gui_tool(self.state, self.uistate,
eval('mod.' + pdata.toolclass),
eval('mod.' + pdata.optionclass),
pdata.name, pdata.id, pdata.category,
self.state.db.request_rebuild)
2002-10-20 19:55:16 +05:30
#-------------------------------------------------------------------------
#
# ReportPluginDialog
2002-10-20 19:55:16 +05:30
#
#-------------------------------------------------------------------------
class ReportPluginDialog(PluginDialog):
"""
Displays the dialog box that allows the user to select the
report that is desired.
"""
2002-10-20 19:55:16 +05:30
def __init__(self, dbstate, uistate, track):
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."""
PluginDialog.__init__(
self,
dbstate,
uistate,
track,
standalone_categories,
2005-12-06 12:08:09 +05:30
_("Report Selection"),
_("Select a report from those available on the left."),
2005-12-06 12:08:09 +05:30
_("_Generate"), _("Generate selected report"),
_REPORTS)
self._pmgr.connect('plugins-reloaded', self.rebuild)
def rebuild(self):
report_list = self._pmgr.get_reg_reports()
self.build_plugin_tree(report_list, standalone_categories)
2002-10-20 19:55:16 +05:30
#-------------------------------------------------------------------------
#
# ToolPluginDialog
2002-10-20 19:55:16 +05:30
#
#-------------------------------------------------------------------------
class ToolPluginDialog(PluginDialog):
2002-10-20 19:55:16 +05:30
"""Displays the dialog box that allows the user to select the tool
that is desired."""
def __init__(self, dbstate, uistate, track):
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."""
PluginDialog.__init__(
self,
dbstate,
uistate,
track,
_Tool.tool_categories,
_("Tool Selection"),
_("Select a tool from those available on the left."),
_("_Run"),
2005-12-06 12:08:09 +05:30
_("Run selected tool"),
_TOOLS)
def rebuild(self):
tool_list = self._pmgr.get_reg_tools()
self.build_plugin_tree(tool_list, _Tool.tool_categories)