diff --git a/configure.in b/configure.in
index 2f28175e9..1f2db4257 100644
--- a/configure.in
+++ b/configure.in
@@ -119,6 +119,7 @@ src/gen/plug/docgen/Makefile
src/gen/plug/menu/Makefile
src/gen/plug/report/Makefile
src/gen/proxy/Makefile
+src/gen/simple/Makefile
src/gen/utils/Makefile
src/gui/Makefile
src/gui/editors/Makefile
@@ -129,13 +130,13 @@ src/gui/glade/Makefile
src/gui/logger/Makefile
src/gui/merge/Makefile
src/gui/plug/Makefile
+src/gui/plug/quick/Makefile
src/gui/plug/report/Makefile
src/gui/selectors/Makefile
src/gui/views/Makefile
src/gui/views/treemodels/Makefile
src/gui/widgets/Makefile
src/docgen/Makefile
-src/Simple/Makefile
src/plugins/Makefile
src/plugins/docgen/Makefile
src/plugins/drawreport/Makefile
diff --git a/po/POTFILES.in b/po/POTFILES.in
index d79973c41..425a3f937 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -328,6 +328,10 @@ src/gen/plug/report/utils.py
# gen proxy API
src/gen/proxy/private.py
+# gen.simple
+src/gen/simple/_simpleaccess.py
+src/gen/simple/_simpletable.py
+
# gui - GUI code
src/gui/aboutdialog.py
src/gui/columnorder.py
@@ -426,6 +430,9 @@ src/gui/merge/mergesource.py
src/gui/plug/_dialogs.py
src/gui/plug/_guioptions.py
src/gui/plug/_windows.py
+src/gui/plug/quick/_quickreports.py
+src/gui/plug/quick/_quicktable.py
+src/gui/plug/quick/_textbufdoc.py
src/gui/plug/report/_docreportdialog.py
src/gui/plug/report/_graphvizreportdialog.py
src/gui/plug/report/_papermenu.py
@@ -471,9 +478,6 @@ src/gui/widgets/tageditor.py
src/gui/widgets/undoableentry.py
src/gui/widgets/validatedmaskedentry.py
-# Simple API
-src/Simple/_SimpleTable.py
-
# Config package
src/config.py
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index ee313d6af..ac6855d2f 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -220,6 +220,10 @@ src/gen/proxy/filter.py
src/gen/proxy/living.py
src/gen/proxy/proxybase.py
+# gen.simple
+src/gen/simple/__init__.py
+src/gen/simple/_simpledoc.py
+
# gen utils API
src/gen/utils/__init__.py
src/gen/utils/callback.py
@@ -362,9 +366,6 @@ src/plugins/rel/rel_ru.py
src/plugins/rel/rel_sk.py
src/plugins/rel/rel_sv.py
-# Simple API
-src/Simple/_SimpleDoc.py
-
#
# web
#
diff --git a/src/ExportOptions.py b/src/ExportOptions.py
index 25e3e8055..391c119c3 100644
--- a/src/ExportOptions.py
+++ b/src/ExportOptions.py
@@ -217,7 +217,7 @@ class WriterOptionBox(object):
def show_preview_data(self, widget):
from DbState import DbState
- from QuickReports import run_quick_report_by_name
+ from gui.plug.quick import run_quick_report_by_name
if widget.proxy_name == "unfiltered":
dbstate = self.dbstate
else:
diff --git a/src/Makefile.am b/src/Makefile.am
index d447875aa..5158d8a60 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,8 +8,7 @@ SUBDIRS = \
gen \
gui \
images \
- plugins \
- Simple
+ plugins
gdirdir=$(prefix)/share/gramps
@@ -38,7 +37,6 @@ gdir_PYTHON = \
MacTransUtils.py\
ManagedWindow.py\
QuestionDialog.py\
- QuickReports.py\
RecentFiles.py\
Relationship.py\
Reorder.py\
diff --git a/src/ScratchPad.py b/src/ScratchPad.py
index f711034d5..55a4fff88 100644
--- a/src/ScratchPad.py
+++ b/src/ScratchPad.py
@@ -722,7 +722,7 @@ class ScratchFamilyLink(ScratchHandleWrapper):
self.refresh()
def refresh(self):
- from Simple import SimpleAccess
+ from gen.simple import SimpleAccess
if self._handle:
family = self._db.get_family_from_handle(self._handle)
if family:
diff --git a/src/Simple/Makefile.am b/src/Simple/Makefile.am
deleted file mode 100644
index db3ec0d11..000000000
--- a/src/Simple/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-# This is the src/Report level Makefile for Gramps
-# $Id$
-
-pkgpythondir = $(datadir)/@PACKAGE@/Simple
-
-pkgpython_PYTHON = \
- _SimpleDoc.py\
- _SimpleAccess.py\
- _SimpleTable.py\
- __init__.py
-
-pkgpyexecdir = @pkgpyexecdir@/Simple
-
-# Clean up all the byte-compiled files
-MOSTLYCLEANFILES = *pyc *pyo
-
-GRAMPS_PY_MODPATH = "../"
-
-pycheck:
- (export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
- pychecker $(pkgpython_PYTHON));
diff --git a/src/Simple/_SimpleTable.py b/src/Simple/_SimpleTable.py
deleted file mode 100644
index 07598c1b5..000000000
--- a/src/Simple/_SimpleTable.py
+++ /dev/null
@@ -1,636 +0,0 @@
-#
-# Gramps - a GTK+/GNOME based genealogy program
-#
-# Copyright (C) 2008 Donald N. Allingham
-# Copyright (C) 2009 Douglas S. Blank
-# Copyright (C) 2011 Tim G L Lyons
-#
-# 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
-#
-# Simple/_SimpleTable.py
-# $Id$
-#
-
-"""
-Provide a simplified table creation interface
-"""
-
-import cgi
-import copy
-from gen.ggettext import sgettext as _
-from TransUtils import trans_objclass
-import cPickle as pickle
-
-import gen.lib
-import Errors
-import config
-import gen.datehandler
-
-class SimpleTable(object):
- """
- Provide a simplified table creation interface.
- """
-
- def __init__(self, access, title=None):
- """
- Initialize the class with a simpledb
- """
- self.access = access
- self.title = title
- self.__columns = []
- self.__cell_markup = {} # [col][row] = "data"
- self.__cell_type = {} # [col] = "text"
- self.__rows = []
- self.__raw_data = []
- self.__link = []
- self.__sort_col = None
- self.__sort_reverse = False
- self.__link_col = None
- self._callback_leftclick = None
- self._callback_leftdouble = None
- self.model_index_of_column = {}
-
- def get_row_count(self):
- return len(self.__rows)
-
- def get_row(self, index):
- return self.__rows[index]
-
- def get_raw_data(self, index):
- return self.__raw_data[index]
-
- def columns(self, *cols):
- """
- Set the columns
- """
- self.__columns = [unicode(col) for col in cols]
- self.__sort_vals = [[] for i in range(len(self.__columns))]
-
- def set_callback(self, which, callback):
- """
- Override (or add) a function for click/double-click
- """
- if which == "leftclick":
- self._callback_leftclick = callback
- elif which == "leftdouble":
- self._callback_leftdouble = callback
-
- def button_press_event(self, treeview, event):
- import gtk
- index = None
- button_code = None
- event_time = None
- func = None
- if type(event) == bool: # enter
- button_code = 3
- event_time = 0
- selection = treeview.get_selection()
- store, paths = selection.get_selected_rows()
- tpath = paths[0] if len(paths) > 0 else None
- node = store.get_iter(tpath) if tpath else None
- if node:
- treeview.grab_focus()
- index = store.get_value(node, 0)
- # FIXME: make popup come where cursor is
- #rectangle = treeview.get_visible_rect()
- #column = treeview.get_column(0)
- #rectangle = treeview.get_cell_area("0:0",
- #x, y = rectangle.x, rectangle.y
- #func = lambda menu: (x, y, True)
- elif event.button == 3:
- button_code = 3
- event_time = event.time
- x = int(event.x)
- y = int(event.y)
- path_info = treeview.get_path_at_pos(x, y)
- func = None
- if path_info is not None:
- path, col, cellx, celly = path_info
- selection = treeview.get_selection()
- store, paths = selection.get_selected_rows()
- tpath = paths[0] if len(paths) > 0 else None
- node = store.get_iter(tpath) if tpath else None
- if path:
- treeview.grab_focus()
- treeview.set_cursor(path, col, 0)
- if store and node:
- index = store.get_value(node, 0) # index Below,
- # you need index, treeview, path, button_code,
- # func, and event_time
- if index is not None:
- popup = gtk.Menu()
- if (index is not None and self.__link[index]):
- # See details (edit, etc):
- objclass, handle = self.__link[index]
- menu_item = gtk.MenuItem(_("the object|See %s details") % trans_objclass(objclass))
- menu_item.connect("activate",
- lambda widget: self.on_table_doubleclick(treeview))
- popup.append(menu_item)
- menu_item.show()
- # Add other items to menu:
- if (self._callback_leftclick or
- (index is not None and self.__link[index])):
- objclass, handle = self.__link[index]
- if objclass == 'Person':
- menu_item = gtk.MenuItem(_("the object|Make %s active") % trans_objclass('Person'))
- menu_item.connect("activate",
- lambda widget: self.on_table_click(treeview))
- popup.append(menu_item)
- menu_item.show()
- if (self.simpledoc.doc.dbstate.db !=
- self.simpledoc.doc.dbstate.db.basedb and
- (index is not None and self.__link[index])):
- objclass, handle = self.__link[index]
- if (objclass == 'Filter' and
- handle[0] in ['Person', 'Family', 'Place', 'Event',
- 'Repository', 'Note', 'MediaObject',
- 'Citation', 'Source']):
- menu_item = gtk.MenuItem(_("See data not in Filter"))
- menu_item.connect("activate",
- lambda widget: self.show_not_in_filter(handle[0]))
- popup.append(menu_item)
- menu_item.show()
- # Show the popup menu:
- popup.popup(None, None, func, button_code, event_time)
- return True
- return False
-
- def show_not_in_filter(self, obj_class):
- from QuickReports import run_quick_report_by_name
- run_quick_report_by_name(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate,
- 'filterbyname',
- 'Inverse %s' % obj_class)
-
- def on_table_doubleclick(self, obj):
- """
- Handle events on tables. obj is a treeview
- """
- from gui.editors import (EditPerson, EditEvent, EditFamily, EditCitation, EditSource,
- EditPlace, EditRepository, EditNote, EditMedia)
- selection = obj.get_selection()
- store, paths = selection.get_selected_rows()
- tpath = paths[0] if len(paths) > 0 else None
- node = store.get_iter(tpath) if tpath else None
- if not node:
- return
- index = store.get_value(node, 0) # index
- if self._callback_leftdouble:
- self._callback_leftdouble(store.get_value(node, 1))
- return True
- elif self.__link[index]:
- objclass, handle = self.__link[index]
- if isinstance(handle, list):
- handle = handle[0]
- if objclass == 'Person':
- person = self.access.dbase.get_person_from_handle(handle)
- if person:
- try:
- EditPerson(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], person)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'Event':
- event = self.access.dbase.get_event_from_handle(handle)
- if event:
- try:
- EditEvent(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], event)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'Family':
- ref = self.access.dbase.get_family_from_handle(handle)
- if ref:
- try:
- EditFamily(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], ref)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'Citation':
- ref = self.access.dbase.get_citation_from_handle(handle)
- if ref:
- try:
- EditCitation(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], ref)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'Source':
- ref = self.access.dbase.get_source_from_handle(handle)
- if ref:
- try:
- EditSource(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], ref)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'Place':
- ref = self.access.dbase.get_place_from_handle(handle)
- if ref:
- try:
- EditPlace(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], ref)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'Repository':
- ref = self.access.dbase.get_repository_from_handle(handle)
- if ref:
- try:
- EditRepository(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], ref)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'Note':
- ref = self.access.dbase.get_note_from_handle(handle)
- if ref:
- try:
- EditNote(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], ref)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass in ['Media', 'MediaObject']:
- ref = self.access.dbase.get_object_from_handle(handle)
- if ref:
- try:
- EditMedia(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate, [], ref)
- return True # handled event
- except Errors.WindowActiveError:
- pass
- elif objclass == 'PersonList':
- from QuickReports import run_quick_report_by_name
- run_quick_report_by_name(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate,
- 'filterbyname',
- 'list of people',
- handles=handle)
- elif objclass == 'Filter':
- from QuickReports import run_quick_report_by_name
- if isinstance(handle, list):
- handle = handle[0]
- run_quick_report_by_name(self.simpledoc.doc.dbstate,
- self.simpledoc.doc.uistate,
- 'filterbyname',
- handle)
- return False # didn't handle event
-
- def on_table_click(self, obj):
- """
- Handle events on tables. obj is a treeview
- """
- selection = obj.get_selection()
- store, paths = selection.get_selected_rows()
- tpath = paths[0] if len(paths) > 0 else None
- node = store.get_iter(tpath)
- if not node:
- return
- index = store.get_value(node, 0) # index
- if self._callback_leftclick:
- self._callback_leftclick(store.get_value(node, 1))
- return True
- elif self.__link[index]:
- objclass, handle = self.__link[index]
- if isinstance(handle, list):
- handle = handle[0]
- if objclass == 'Person':
- import gobject
- # If you emmit the signal here and it causes this table to be deleted,
- # then you'll crash Python:
- #self.simpledoc.doc.uistate.set_active(handle, 'Person')
- # So, let's return from this, then change the active person:
- return gobject.timeout_add(100, self.simpledoc.doc.uistate.set_active, handle, 'Person')
- return True
- return False # didn't handle event
-
- def row_sort_val(self, col, val):
- """
- Add a row of data to sort by.
- """
- self.__sort_vals[col].append(val)
-
- def set_link_col(self, col):
- """
- Manually sets the column that defines link.
- col is either a number (column) or a (object_type_name, handle).
- """
- self.__link_col = col
-
- def row(self, *data):
- """
- Add a row of data.
- """
- retval = []
- link = None
- row = len(self.__rows)
- self.__raw_data.append([])
- for col in range(len(data)):
- item = data[col]
- self.__raw_data[-1].append(item)
- # FIXME: add better text representations of these objects
- if item is None:
- retval.append("")
- elif isinstance(item, basestring):
- if item == "checkbox":
- retval.append("")
- self.set_cell_type(col, "checkbox")
- else:
- retval.append(item)
- elif isinstance(item, (int, float, long)):
- retval.append(item)
- self.row_sort_val(col, item)
- elif isinstance(item, gen.lib.Person):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Person', item.handle)
- elif isinstance(item, gen.lib.Family):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Family', item.handle)
- elif isinstance(item, gen.lib.Citation):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Citation', item.handle)
- elif isinstance(item, gen.lib.Source):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Source', item.handle)
- elif isinstance(item, gen.lib.Event):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Event', item.handle)
- elif isinstance(item, gen.lib.MediaObject):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Media', item.handle)
- elif isinstance(item, gen.lib.Place):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Place', item.handle)
- elif isinstance(item, gen.lib.Repository):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Repository', item.handle)
- elif isinstance(item, gen.lib.Note):
- retval.append(self.access.describe(item))
- if (self.__link_col == col or link is None):
- link = ('Note', item.handle)
- elif isinstance(item, gen.lib.Date):
- text = gen.datehandler.displayer.display(item)
- retval.append(text)
- if item.get_valid():
- if item.format:
- self.set_cell_markup(col, row,
- item.format % cgi.escape(text))
- self.row_sort_val(col, item.sortval)
- else:
- # sort before others:
- self.row_sort_val(col, -1)
- # give formatted version:
- invalid_date_format = config.get('preferences.invalid-date-format')
- self.set_cell_markup(col, row,
- invalid_date_format % cgi.escape(text))
- if (self.__link_col == col or link is None):
- link = ('Date', item)
- elif isinstance(item, gen.lib.Span):
- text = str(item)
- retval.append(text)
- self.row_sort_val(col, item)
- elif isinstance(item, list): # [text, "PersonList", handle, ...]
- retval.append(item[0])
- link = (item[1], item[2:])
- else:
- retval.append(str(item))
- if (self.__link_col == col or link is None):
- if hasattr(item, "get_url"):
- link = ("url", item.get_url())
- self.__link.append(link)
- self.__rows.append(retval)
-
- def sort(self, column_name, reverse=False):
- self.__sort_col = column_name
- self.__sort_reverse = reverse
-
- def __sort(self):
- idx = self.__columns.index(self.__sort_col)
- # FIXME: move raw_data with this
- if self.__sort_reverse:
- self.__rows.sort(lambda a, b: -cmp(a[idx],b[idx]))
- else:
- self.__rows.sort(lambda a, b: cmp(a[idx],b[idx]))
-
- def toggle(self, obj, path, col):
- """
- obj - column widget
- path - row
- col - column
- """
- self.treeview.get_model()[path][col] = not \
- self.treeview.get_model()[path][col]
-
- def write(self, document):
- self.simpledoc = document # simpledoc; simpledoc.doc = docgen object
- if self.simpledoc.doc.type == "standard":
- doc = self.simpledoc.doc
- columns = len(self.__columns)
- doc.start_table('simple', 'Table')
- doc._tbl.set_column_widths([100/columns] * columns)
- doc._tbl.set_columns(columns)
- if self.title:
- doc.start_row()
- doc.start_cell('TableHead', span=columns)
- doc.start_paragraph('TableTitle')
- doc.write_text(_(self.title))
- doc.end_paragraph()
- doc.end_cell()
- doc.end_row()
- if self.__sort_col:
- self.__sort()
- doc.start_row()
- for col in self.__columns:
- doc.start_cell('TableHeaderCell', span=1)
- doc.write_text(col, 'TableTitle')
- doc.end_cell()
- doc.end_row()
- index = 0
- for row in self.__rows:
- doc.start_row()
- for col in row:
- doc.start_cell('TableDataCell', span=1)
- obj_type, handle = None, None
- if isinstance(self.__link_col, tuple):
- obj_type, handle = self.__link_col
- elif isinstance(self.__link_col, list):
- obj_type, handle = self.__link_col[index]
- elif self.__link[index]:
- obj_type, handle = self.__link[index]
- ######
- if obj_type:
- if obj_type.lower() == "url":
- doc.start_link(handle)
- else:
- doc.start_link("/%s/%s" %
- (obj_type.lower(), handle))
- doc.write_text(col, 'Normal')
- if obj_type:
- doc.stop_link()
- doc.end_cell()
- doc.end_row()
- index += 1
- doc.end_table()
- doc.start_paragraph("Normal")
- doc.end_paragraph()
- elif self.simpledoc.doc.type == "gtk":
- import gtk
- from gui.widgets.multitreeview import MultiTreeView
- from ScratchPad import ScratchPadListView, ACTION_COPY
- from DdTargets import DdTargets
- buffer = self.simpledoc.doc.buffer
- text_view = self.simpledoc.doc.text_view
- model_index = 1 # start after index
- if self.__sort_col:
- sort_index = self.__columns.index(self.__sort_col)
- else:
- sort_index = 0
- treeview = MultiTreeView()
- treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
- [(DdTargets.HANDLE_LIST.drag_type, gtk.TARGET_SAME_WIDGET, 0)],
- gtk.gdk.ACTION_COPY)
- #treeview.enable_model_drag_dest(DdTargets.all_targets(),
- # gtk.gdk.ACTION_DEFAULT)
- treeview.connect('drag_data_get', self.object_drag_data_get)
- treeview.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_BOTH)
- #treeview.connect('row-activated', on_table_doubleclick, self)
- #treeview.connect('cursor-changed', on_table_click, self)
- treeview.connect('button-press-event', self.button_press_event)
- treeview.connect('select-cursor-row', self.button_press_event)
- renderer = gtk.CellRendererText()
- types = [int] # index
- cnt = 0
- sort_data = []
- sort_data_types = []
- for col in self.__columns:
- if self.get_cell_type(cnt) == "text":
- types.append(str)
- if self.get_cell_markup(cnt):
- column = gtk.TreeViewColumn(col,renderer,markup=model_index)
- else:
- column = gtk.TreeViewColumn(col,renderer,text=model_index)
- elif self.get_cell_type(cnt) == "checkbox":
- types.append(bool)
- toggle_renderer = gtk.CellRendererToggle()
- toggle_renderer.set_property('activatable', True)
- toggle_renderer.connect("toggled", self.toggle, model_index)
- column = gtk.TreeViewColumn(col, toggle_renderer)
- column.add_attribute(toggle_renderer, "active", model_index)
- column.set_resizable(True)
- if self.__sort_vals[cnt] != []:
- sort_data.append(self.__sort_vals[cnt])
- column.set_sort_column_id(len(self.__columns) +
- len(sort_data))
- sort_data_types.append(int)
- else:
- column.set_sort_column_id(model_index)
- treeview.append_column(column)
- self.model_index_of_column[col] = model_index
- #if model_index == sort_index:
- # FIXME: what to set here?
- model_index += 1
- cnt += 1
- if self.title:
- self.simpledoc.paragraph(self.title)
- # Make a GUI to put the tree view in
- types += sort_data_types
- model = gtk.ListStore(*types)
- treeview.set_model(model)
- treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
- iter = buffer.get_end_iter()
- anchor = buffer.create_child_anchor(iter)
- text_view.add_child_at_anchor(treeview, anchor)
- self.treeview= treeview
- count = 0
- for data in self.__rows:
- col = 0
- rowdata = []
- for cell in data:
- rowdata.append(self.get_cell_markup(col, count, cell))
- col += 1
- try:
- model.append(row=([count] + list(rowdata) + [col[count] for col in sort_data]))
- except:
- print "error in row %d: data: %s, sort data: %d" % (count, rowdata, len(sort_data[0]))
- count += 1
- text_view.show_all()
- self.simpledoc.paragraph("")
- self.simpledoc.paragraph("")
-
- def object_drag_data_get(self, widget, context, sel_data, info, time):
- tree_selection = widget.get_selection()
- model, paths = tree_selection.get_selected_rows()
- retval = []
- for path in paths:
- node = model.get_iter(path)
- index = model.get_value(node,0)
- if (index is not None and self.__link[index]):
- retval.append(self.__link[index])
- sel_data.set(sel_data.target, 8, pickle.dumps(retval))
- return True
-
- def get_cell_markup(self, x, y=None, data=None):
- """
- See if a column has formatting (if x and y are supplied) or
- see if a cell has formatting. If it does, return the formatted
- string, otherwise return data that is escaped (if that column
- has formatting), or just the plain data.
- """
- if x in self.__cell_markup:
- if y is None:
- return True # markup for this column
- elif y in self.__cell_markup[x]:
- return self.__cell_markup[x][y]
- else:
- return cgi.escape(data)
- else:
- if y is None:
- return False # no markup for this column
- else:
- return data
-
- def get_cell_type(self, col):
- """
- See if a column has a type, else return "text" as default.
- """
- if col in self.__cell_type:
- return self.__cell_type[col]
- return "text"
-
- def set_cell_markup(self, x, y, data):
- """
- Set the cell at position [x][y] to a formatted string.
- """
- col_dict = self.__cell_markup.get(x, {})
- col_dict[y] = data
- self.__cell_markup[x] = col_dict
-
- def set_cell_type(self, col, value):
- """
- Set the cell type at position [x].
- """
- self.__cell_type[col] = value
diff --git a/src/docgen/Makefile.am b/src/docgen/Makefile.am
index d106caf0f..37ed7754f 100644
--- a/src/docgen/Makefile.am
+++ b/src/docgen/Makefile.am
@@ -9,8 +9,7 @@ docgen_PYTHON = \
__init__.py \
CSVTab.py \
ODSTab.py \
- TabbedDoc.py \
- TextBufDoc.py
+ TabbedDoc.py
# Clean up all the byte-compiled files
MOSTLYCLEANFILES = *pyc *pyo
diff --git a/src/docgen/__init__.py b/src/docgen/__init__.py
index 1be93e9ef..8e86794a5 100644
--- a/src/docgen/__init__.py
+++ b/src/docgen/__init__.py
@@ -22,5 +22,4 @@
from TabbedDoc import TabbedDoc
from ODSTab import ODSTab
-from TextBufDoc import TextBufDoc
-from CSVTab import CSVTab
\ No newline at end of file
+from CSVTab import CSVTab
diff --git a/src/gen/Makefile.am b/src/gen/Makefile.am
index 9b3f80985..6506e7d02 100644
--- a/src/gen/Makefile.am
+++ b/src/gen/Makefile.am
@@ -15,6 +15,7 @@ SUBDIRS = \
mime \
plug \
proxy \
+ simple \
utils
pkgpythondir = $(datadir)/@PACKAGE@/gen
diff --git a/src/gen/__init__.py b/src/gen/__init__.py
index 8733b0ad7..67551226d 100644
--- a/src/gen/__init__.py
+++ b/src/gen/__init__.py
@@ -27,4 +27,4 @@ interfaces (gui, cli and web).
"""
__all__ = [ "datehandler", "db", "display", "filters", "lib", "locale", "merge",
- "mime", "plug", "proxy", "utils" ]
+ "mime", "plug", "proxy", "simple", "utils" ]
diff --git a/src/gen/simple/Makefile.am b/src/gen/simple/Makefile.am
new file mode 100644
index 000000000..57f8327b2
--- /dev/null
+++ b/src/gen/simple/Makefile.am
@@ -0,0 +1,21 @@
+# This is the src/gen/simple level Makefile for Gramps
+# $Id$
+
+pkgpythondir = $(datadir)/@PACKAGE@/gen/simple
+
+pkgpython_PYTHON = \
+ _simpledoc.py\
+ _simpleaccess.py\
+ _simpletable.py\
+ __init__.py
+
+pkgpyexecdir = @pkgpyexecdir@/gen/simple
+
+# Clean up all the byte-compiled files
+MOSTLYCLEANFILES = *pyc *pyo
+
+GRAMPS_PY_MODPATH = "../../"
+
+pycheck:
+ (export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
+ pychecker $(pkgpython_PYTHON));
diff --git a/src/Simple/__init__.py b/src/gen/simple/__init__.py
similarity index 91%
rename from src/Simple/__init__.py
rename to src/gen/simple/__init__.py
index 4a4addffb..f045842cc 100644
--- a/src/Simple/__init__.py
+++ b/src/gen/simple/__init__.py
@@ -23,7 +23,7 @@
"Simple access routines"
-from _SimpleAccess import *
-from _SimpleDoc import *
-from _SimpleTable import *
+from _simpleaccess import *
+from _simpledoc import *
+from _simpletable import *
diff --git a/src/Simple/_SimpleAccess.py b/src/gen/simple/_simpleaccess.py
similarity index 99%
rename from src/Simple/_SimpleAccess.py
rename to src/gen/simple/_simpleaccess.py
index d705b9816..48e571bde 100644
--- a/src/Simple/_SimpleAccess.py
+++ b/src/gen/simple/_simpleaccess.py
@@ -19,7 +19,6 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
-# Simple/_SimpleAccess.py
# $Id$
#
diff --git a/src/Simple/_SimpleDoc.py b/src/gen/simple/_simpledoc.py
similarity index 99%
rename from src/Simple/_SimpleDoc.py
rename to src/gen/simple/_simpledoc.py
index c42e17fe9..3e072990e 100644
--- a/src/Simple/_SimpleDoc.py
+++ b/src/gen/simple/_simpledoc.py
@@ -17,7 +17,6 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
-# Simple/_SimpleDoc.py
# $Id$
#
diff --git a/src/gen/simple/_simpletable.py b/src/gen/simple/_simpletable.py
new file mode 100644
index 000000000..19d68bcc1
--- /dev/null
+++ b/src/gen/simple/_simpletable.py
@@ -0,0 +1,282 @@
+#
+# Gramps - a GTK+/GNOME based genealogy program
+#
+# Copyright (C) 2008 Donald N. Allingham
+# Copyright (C) 2009 Douglas S. Blank
+# Copyright (C) 2011 Tim G L Lyons
+#
+# 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$
+#
+
+"""
+Provide a simplified table creation interface
+"""
+
+import cgi
+from gen.ggettext import sgettext as _
+import gen.lib
+import config
+import gen.datehandler
+
+class SimpleTable(object):
+ """
+ Provide a simplified table creation interface.
+ """
+
+ def __init__(self, access, title=None):
+ """
+ Initialize the class with a simpledb
+ """
+ self.access = access
+ self.title = title
+ self._columns = []
+ self._cell_markup = {} # [col][row] = "data"
+ self._cell_type = {} # [col] = "text"
+ self._rows = []
+ self._raw_data = []
+ self._link = []
+ self._sort_col = None
+ self._sort_reverse = False
+ self._link_col = None
+ self._callback_leftclick = None
+ self._callback_leftdouble = None
+ self.model_index_of_column = {}
+
+ def get_row_count(self):
+ return len(self._rows)
+
+ def get_row(self, index):
+ return self._rows[index]
+
+ def get_raw_data(self, index):
+ return self._raw_data[index]
+
+ def columns(self, *cols):
+ """
+ Set the columns
+ """
+ self._columns = [unicode(col) for col in cols]
+ self._sort_vals = [[] for i in range(len(self._columns))]
+
+ def row_sort_val(self, col, val):
+ """
+ Add a row of data to sort by.
+ """
+ self._sort_vals[col].append(val)
+
+ def set_link_col(self, col):
+ """
+ Manually sets the column that defines link.
+ col is either a number (column) or a (object_type_name, handle).
+ """
+ self._link_col = col
+
+ def row(self, *data):
+ """
+ Add a row of data.
+ """
+ retval = []
+ link = None
+ row = len(self._rows)
+ self._raw_data.append([])
+ for col in range(len(data)):
+ item = data[col]
+ self._raw_data[-1].append(item)
+ # FIXME: add better text representations of these objects
+ if item is None:
+ retval.append("")
+ elif isinstance(item, basestring):
+ if item == "checkbox":
+ retval.append("")
+ self.set_cell_type(col, "checkbox")
+ else:
+ retval.append(item)
+ elif isinstance(item, (int, float, long)):
+ retval.append(item)
+ self.row_sort_val(col, item)
+ elif isinstance(item, gen.lib.Person):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Person', item.handle)
+ elif isinstance(item, gen.lib.Family):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Family', item.handle)
+ elif isinstance(item, gen.lib.Citation):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Citation', item.handle)
+ elif isinstance(item, gen.lib.Source):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Source', item.handle)
+ elif isinstance(item, gen.lib.Event):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Event', item.handle)
+ elif isinstance(item, gen.lib.MediaObject):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Media', item.handle)
+ elif isinstance(item, gen.lib.Place):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Place', item.handle)
+ elif isinstance(item, gen.lib.Repository):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Repository', item.handle)
+ elif isinstance(item, gen.lib.Note):
+ retval.append(self.access.describe(item))
+ if (self._link_col == col or link is None):
+ link = ('Note', item.handle)
+ elif isinstance(item, gen.lib.Date):
+ text = gen.datehandler.displayer.display(item)
+ retval.append(text)
+ if item.get_valid():
+ if item.format:
+ self.set_cell_markup(col, row,
+ item.format % cgi.escape(text))
+ self.row_sort_val(col, item.sortval)
+ else:
+ # sort before others:
+ self.row_sort_val(col, -1)
+ # give formatted version:
+ invalid_date_format = config.get('preferences.invalid-date-format')
+ self.set_cell_markup(col, row,
+ invalid_date_format % cgi.escape(text))
+ if (self._link_col == col or link is None):
+ link = ('Date', item)
+ elif isinstance(item, gen.lib.Span):
+ text = str(item)
+ retval.append(text)
+ self.row_sort_val(col, item)
+ elif isinstance(item, list): # [text, "PersonList", handle, ...]
+ retval.append(item[0])
+ link = (item[1], item[2:])
+ else:
+ retval.append(str(item))
+ if (self._link_col == col or link is None):
+ if hasattr(item, "get_url"):
+ link = ("url", item.get_url())
+ self._link.append(link)
+ self._rows.append(retval)
+
+ def sort(self, column_name, reverse=False):
+ self._sort_col = column_name
+ self._sort_reverse = reverse
+
+ def _sort(self):
+ idx = self._columns.index(self._sort_col)
+ # FIXME: move raw_data with this
+ if self._sort_reverse:
+ self._rows.sort(lambda a, b: -cmp(a[idx],b[idx]))
+ else:
+ self._rows.sort(lambda a, b: cmp(a[idx],b[idx]))
+
+ def write(self, document):
+ doc = document.doc
+ columns = len(self._columns)
+ doc.start_table('simple', 'Table')
+ doc._tbl.set_column_widths([100/columns] * columns)
+ doc._tbl.set_columns(columns)
+ if self.title:
+ doc.start_row()
+ doc.start_cell('TableHead', span=columns)
+ doc.start_paragraph('TableTitle')
+ doc.write_text(_(self.title))
+ doc.end_paragraph()
+ doc.end_cell()
+ doc.end_row()
+ if self._sort_col:
+ self._sort()
+ doc.start_row()
+ for col in self._columns:
+ doc.start_cell('TableHeaderCell', span=1)
+ doc.write_text(col, 'TableTitle')
+ doc.end_cell()
+ doc.end_row()
+ index = 0
+ for row in self._rows:
+ doc.start_row()
+ for col in row:
+ doc.start_cell('TableDataCell', span=1)
+ obj_type, handle = None, None
+ if isinstance(self._link_col, tuple):
+ obj_type, handle = self._link_col
+ elif isinstance(self._link_col, list):
+ obj_type, handle = self._link_col[index]
+ elif self._link[index]:
+ obj_type, handle = self._link[index]
+ ######
+ if obj_type:
+ if obj_type.lower() == "url":
+ doc.start_link(handle)
+ else:
+ doc.start_link("/%s/%s" %
+ (obj_type.lower(), handle))
+ doc.write_text(col, 'Normal')
+ if obj_type:
+ doc.stop_link()
+ doc.end_cell()
+ doc.end_row()
+ index += 1
+ doc.end_table()
+ doc.start_paragraph("Normal")
+ doc.end_paragraph()
+
+ def get_cell_markup(self, x, y=None, data=None):
+ """
+ See if a column has formatting (if x and y are supplied) or
+ see if a cell has formatting. If it does, return the formatted
+ string, otherwise return data that is escaped (if that column
+ has formatting), or just the plain data.
+ """
+ if x in self._cell_markup:
+ if y is None:
+ return True # markup for this column
+ elif y in self._cell_markup[x]:
+ return self._cell_markup[x][y]
+ else:
+ return cgi.escape(data)
+ else:
+ if y is None:
+ return False # no markup for this column
+ else:
+ return data
+
+ def get_cell_type(self, col):
+ """
+ See if a column has a type, else return "text" as default.
+ """
+ if col in self._cell_type:
+ return self._cell_type[col]
+ return "text"
+
+ def set_cell_markup(self, x, y, data):
+ """
+ Set the cell at position [x][y] to a formatted string.
+ """
+ col_dict = self._cell_markup.get(x, {})
+ col_dict[y] = data
+ self._cell_markup[x] = col_dict
+
+ def set_cell_type(self, col, value):
+ """
+ Set the cell type at position [x].
+ """
+ self._cell_type[col] = value
diff --git a/src/gui/editors/editlink.py b/src/gui/editors/editlink.py
index 64ecf843b..ae0735361 100644
--- a/src/gui/editors/editlink.py
+++ b/src/gui/editors/editlink.py
@@ -37,7 +37,7 @@ from gen.ggettext import gettext as _
import ManagedWindow
import GrampsDisplay
from glade import Glade
-from Simple import SimpleAccess
+from gen.simple import SimpleAccess
WEB, EVENT, FAMILY, MEDIA, NOTE, PERSON, PLACE, REPOSITORY, SOURCE = range(9)
OBJECT_MAP = {
diff --git a/src/gui/editors/editprimary.py b/src/gui/editors/editprimary.py
index f09c49130..362f7e762 100644
--- a/src/gui/editors/editprimary.py
+++ b/src/gui/editors/editprimary.py
@@ -302,7 +302,7 @@ class EditPrimary(ManagedWindow.ManagedWindow, DbGUIElement):
"""
Create actions and ui of context menu
"""
- from QuickReports import create_quickreport_menu
+ from gui.plug.quick import create_quickreport_menu
self.popupmanager = gtk.UIManager()
#add custom actions
diff --git a/src/gui/plug/Makefile.am b/src/gui/plug/Makefile.am
index 85802d438..6fd9364e1 100644
--- a/src/gui/plug/Makefile.am
+++ b/src/gui/plug/Makefile.am
@@ -4,7 +4,9 @@
# but that is not necessarily portable.
# If not using GNU make, then list all .py files individually
-SUBDIRS = report
+SUBDIRS = \
+ quick \
+ report
pkgpythondir = $(datadir)/@PACKAGE@/gui/plug
diff --git a/src/gui/plug/__init__.py b/src/gui/plug/__init__.py
index c4c177358..664b9e2d2 100644
--- a/src/gui/plug/__init__.py
+++ b/src/gui/plug/__init__.py
@@ -27,7 +27,7 @@
__author__="jfriant"
__date__ ="$Apr 20, 2010 3:13:24 PM$"
-from gui.plug import tool
+import tool
from _guioptions import make_gui_option, add_gui_options
from gen.plug import MenuOptions
diff --git a/src/gui/plug/_windows.py b/src/gui/plug/_windows.py
index c8d9b5d9a..d2d0c22f7 100644
--- a/src/gui/plug/_windows.py
+++ b/src/gui/plug/_windows.py
@@ -52,7 +52,8 @@ from gen.plug import PluginRegister, PTYPE_STR, load_addon_file
from gen.ggettext import gettext as _
from gui.utils import open_file_with_default_application
from gui.pluginmanager import GuiPluginManager
-from gui.plug import tool, add_gui_options
+import tool
+from _guioptions import add_gui_options
from QuestionDialog import InfoDialog
from gui.editors import EditPerson
import Utils
diff --git a/src/gui/plug/quick/Makefile.am b/src/gui/plug/quick/Makefile.am
new file mode 100644
index 000000000..8af43e455
--- /dev/null
+++ b/src/gui/plug/quick/Makefile.am
@@ -0,0 +1,21 @@
+# This is the src/gui/plug/quick level Makefile for Gramps
+# $Id: Makefile.am 18851 2012-02-10 20:25:15Z josipsf $
+
+pkgpythondir = $(datadir)/@PACKAGE@/gui/plug/quick
+
+pkgpython_PYTHON = \
+ __init__.py\
+ _quickreports.py\
+ _quicktable.py\
+ _textbufdoc.py
+
+pkgpyexecdir = @pkgpyexecdir@/gui/plug/quick
+
+# Clean up all the byte-compiled files
+MOSTLYCLEANFILES = *pyc *pyo
+
+GRAMPS_PY_MODPATH = "../../../"
+
+pycheck:
+ (export PYTHONPATH=$(GRAMPS_PY_MODPATH); \
+ pychecker $(pkgpython_PYTHON));
diff --git a/src/gui/plug/quick/__init__.py b/src/gui/plug/quick/__init__.py
new file mode 100644
index 000000000..e19114a3f
--- /dev/null
+++ b/src/gui/plug/quick/__init__.py
@@ -0,0 +1,35 @@
+#
+# Gramps - a GTK+/GNOME based genealogy program
+#
+# Copyright (C) 2001 David R. Hampton
+# Copyright (C) 2001-2006 Donald N. Allingham
+# Copyright (C) 2007 Brian G. Matherly
+# Copyright (C) 2010 Jakim Friant
+#
+# 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$
+
+"Quick Report Framework"
+
+from _quickreports import (create_web_connect_menu,
+ create_quickreport_menu,
+ get_quick_report_list,
+ run_quick_report_by_name,
+ run_quick_report_by_name_direct,
+ run_report)
+from _quicktable import QuickTable
+from _textbufdoc import TextBufDoc
diff --git a/src/QuickReports.py b/src/gui/plug/quick/_quickreports.py
similarity index 98%
rename from src/QuickReports.py
rename to src/gui/plug/quick/_quickreports.py
index 4fe37d61a..5cc4aaaa3 100644
--- a/src/QuickReports.py
+++ b/src/gui/plug/quick/_quickreports.py
@@ -40,7 +40,7 @@ from cStringIO import StringIO
#
#------------------------------------------------------------------------
import logging
-log = logging.getLogger(".QuickReports")
+log = logging.getLogger(".quickreports")
#-------------------------------------------------------------------------
#
@@ -60,6 +60,8 @@ from gen.plug import (CATEGORY_QR_PERSON, CATEGORY_QR_FAMILY, CATEGORY_QR_MEDIA,
CATEGORY_QR_PLACE, CATEGORY_QR_REPOSITORY,
CATEGORY_QR_NOTE, CATEGORY_QR_CITATION,
CATEGORY_QR_SOURCE_OR_CITATION)
+from _textbufdoc import TextBufDoc
+from gen.simple import make_basic_stylesheet
def flatten(L):
"""
@@ -202,8 +204,6 @@ def run_quick_report_by_name_direct(report_name, database, document, handle):
"""
Useful for running one quick report from another
"""
- from docgen import TextBufDoc
- from Simple import make_basic_stylesheet
report = None
pmgr = GuiPluginManager.get_instance()
for pdata in pmgr.get_reg_quick_reports():
@@ -237,8 +237,6 @@ def run_report(dbstate, uistate, category, handle, pdata, container=None,
**kwargs are only used for special quick views that allow additional
arguments, and that are run by run_quick_report_by_name().
"""
- from docgen import TextBufDoc
- from Simple import make_basic_stylesheet
pmgr = GuiPluginManager.get_instance()
mod = pmgr.load_plugin(pdata)
if not mod:
diff --git a/src/gui/plug/quick/_quicktable.py b/src/gui/plug/quick/_quicktable.py
new file mode 100644
index 000000000..1f65dd494
--- /dev/null
+++ b/src/gui/plug/quick/_quicktable.py
@@ -0,0 +1,405 @@
+#
+# Gramps - a GTK+/GNOME based genealogy program
+#
+# Copyright (C) 2008 Donald N. Allingham
+# Copyright (C) 2009 Douglas S. Blank
+# Copyright (C) 2011 Tim G L Lyons
+#
+# 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$
+#
+
+"""
+Provide a simplified table creation interface
+"""
+
+#-------------------------------------------------------------------------
+#
+# Standard python modules
+#
+#-------------------------------------------------------------------------
+import cPickle as pickle
+
+#-------------------------------------------------------------------------
+#
+# GNOME modules
+#
+#-------------------------------------------------------------------------
+import gtk
+
+#-------------------------------------------------------------------------
+#
+# Gramps modules
+#
+#-------------------------------------------------------------------------
+from gen.ggettext import sgettext as _
+from gen.simple import SimpleTable
+from TransUtils import trans_objclass
+import Errors
+from gui.widgets.multitreeview import MultiTreeView
+from ScratchPad import ScratchPadListView, ACTION_COPY
+from DdTargets import DdTargets
+from gui.plug.quick import run_quick_report_by_name
+from gui.editors import (EditPerson, EditEvent, EditFamily, EditCitation,
+ EditSource, EditPlace, EditRepository, EditNote,
+ EditMedia)
+
+#-------------------------------------------------------------------------
+#
+# QuickTable class
+#
+#-------------------------------------------------------------------------
+class QuickTable(SimpleTable):
+ """
+ Provide a simplified table creation interface.
+ """
+ def set_callback(self, which, callback):
+ """
+ Override (or add) a function for click/double-click
+ """
+ if which == "leftclick":
+ self._callback_leftclick = callback
+ elif which == "leftdouble":
+ self._callback_leftdouble = callback
+
+ def button_press_event(self, treeview, event):
+ index = None
+ button_code = None
+ event_time = None
+ func = None
+ if type(event) == bool: # enter
+ button_code = 3
+ event_time = 0
+ selection = treeview.get_selection()
+ store, paths = selection.get_selected_rows()
+ tpath = paths[0] if len(paths) > 0 else None
+ node = store.get_iter(tpath) if tpath else None
+ if node:
+ treeview.grab_focus()
+ index = store.get_value(node, 0)
+ # FIXME: make popup come where cursor is
+ #rectangle = treeview.get_visible_rect()
+ #column = treeview.get_column(0)
+ #rectangle = treeview.get_cell_area("0:0",
+ #x, y = rectangle.x, rectangle.y
+ #func = lambda menu: (x, y, True)
+ elif event.button == 3:
+ button_code = 3
+ event_time = event.time
+ x = int(event.x)
+ y = int(event.y)
+ path_info = treeview.get_path_at_pos(x, y)
+ func = None
+ if path_info is not None:
+ path, col, cellx, celly = path_info
+ selection = treeview.get_selection()
+ store, paths = selection.get_selected_rows()
+ tpath = paths[0] if len(paths) > 0 else None
+ node = store.get_iter(tpath) if tpath else None
+ if path:
+ treeview.grab_focus()
+ treeview.set_cursor(path, col, 0)
+ if store and node:
+ index = store.get_value(node, 0) # index Below,
+ # you need index, treeview, path, button_code,
+ # func, and event_time
+ if index is not None:
+ popup = gtk.Menu()
+ if (index is not None and self._link[index]):
+ # See details (edit, etc):
+ objclass, handle = self._link[index]
+ menu_item = gtk.MenuItem(_("the object|See %s details") % trans_objclass(objclass))
+ menu_item.connect("activate",
+ lambda widget: self.on_table_doubleclick(treeview))
+ popup.append(menu_item)
+ menu_item.show()
+ # Add other items to menu:
+ if (self._callback_leftclick or
+ (index is not None and self._link[index])):
+ objclass, handle = self._link[index]
+ if objclass == 'Person':
+ menu_item = gtk.MenuItem(_("the object|Make %s active") % trans_objclass('Person'))
+ menu_item.connect("activate",
+ lambda widget: self.on_table_click(treeview))
+ popup.append(menu_item)
+ menu_item.show()
+ if (self.simpledoc.doc.dbstate.db !=
+ self.simpledoc.doc.dbstate.db.basedb and
+ (index is not None and self._link[index])):
+ objclass, handle = self._link[index]
+ if (objclass == 'Filter' and
+ handle[0] in ['Person', 'Family', 'Place', 'Event',
+ 'Repository', 'Note', 'MediaObject',
+ 'Citation', 'Source']):
+ menu_item = gtk.MenuItem(_("See data not in Filter"))
+ menu_item.connect("activate",
+ lambda widget: self.show_not_in_filter(handle[0]))
+ popup.append(menu_item)
+ menu_item.show()
+ # Show the popup menu:
+ popup.popup(None, None, func, button_code, event_time)
+ return True
+ return False
+
+ def show_not_in_filter(self, obj_class):
+ run_quick_report_by_name(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate,
+ 'filterbyname',
+ 'Inverse %s' % obj_class)
+
+ def on_table_doubleclick(self, obj):
+ """
+ Handle events on tables. obj is a treeview
+ """
+ selection = obj.get_selection()
+ store, paths = selection.get_selected_rows()
+ tpath = paths[0] if len(paths) > 0 else None
+ node = store.get_iter(tpath) if tpath else None
+ if not node:
+ return
+ index = store.get_value(node, 0) # index
+ if self._callback_leftdouble:
+ self._callback_leftdouble(store.get_value(node, 1))
+ return True
+ elif self._link[index]:
+ objclass, handle = self._link[index]
+ if isinstance(handle, list):
+ handle = handle[0]
+ if objclass == 'Person':
+ person = self.access.dbase.get_person_from_handle(handle)
+ if person:
+ try:
+ EditPerson(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], person)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'Event':
+ event = self.access.dbase.get_event_from_handle(handle)
+ if event:
+ try:
+ EditEvent(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], event)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'Family':
+ ref = self.access.dbase.get_family_from_handle(handle)
+ if ref:
+ try:
+ EditFamily(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], ref)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'Citation':
+ ref = self.access.dbase.get_citation_from_handle(handle)
+ if ref:
+ try:
+ EditCitation(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], ref)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'Source':
+ ref = self.access.dbase.get_source_from_handle(handle)
+ if ref:
+ try:
+ EditSource(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], ref)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'Place':
+ ref = self.access.dbase.get_place_from_handle(handle)
+ if ref:
+ try:
+ EditPlace(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], ref)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'Repository':
+ ref = self.access.dbase.get_repository_from_handle(handle)
+ if ref:
+ try:
+ EditRepository(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], ref)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'Note':
+ ref = self.access.dbase.get_note_from_handle(handle)
+ if ref:
+ try:
+ EditNote(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], ref)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass in ['Media', 'MediaObject']:
+ ref = self.access.dbase.get_object_from_handle(handle)
+ if ref:
+ try:
+ EditMedia(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate, [], ref)
+ return True # handled event
+ except Errors.WindowActiveError:
+ pass
+ elif objclass == 'PersonList':
+ run_quick_report_by_name(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate,
+ 'filterbyname',
+ 'list of people',
+ handles=handle)
+ elif objclass == 'Filter':
+ if isinstance(handle, list):
+ handle = handle[0]
+ run_quick_report_by_name(self.simpledoc.doc.dbstate,
+ self.simpledoc.doc.uistate,
+ 'filterbyname',
+ handle)
+ return False # didn't handle event
+
+ def on_table_click(self, obj):
+ """
+ Handle events on tables. obj is a treeview
+ """
+ selection = obj.get_selection()
+ store, paths = selection.get_selected_rows()
+ tpath = paths[0] if len(paths) > 0 else None
+ node = store.get_iter(tpath)
+ if not node:
+ return
+ index = store.get_value(node, 0) # index
+ if self._callback_leftclick:
+ self._callback_leftclick(store.get_value(node, 1))
+ return True
+ elif self._link[index]:
+ objclass, handle = self._link[index]
+ if isinstance(handle, list):
+ handle = handle[0]
+ if objclass == 'Person':
+ import gobject
+ # If you emmit the signal here and it causes this table to be deleted,
+ # then you'll crash Python:
+ #self.simpledoc.doc.uistate.set_active(handle, 'Person')
+ # So, let's return from this, then change the active person:
+ return gobject.timeout_add(100, self.simpledoc.doc.uistate.set_active, handle, 'Person')
+ return True
+ return False # didn't handle event
+
+ def object_drag_data_get(self, widget, context, sel_data, info, time):
+ tree_selection = widget.get_selection()
+ model, paths = tree_selection.get_selected_rows()
+ retval = []
+ for path in paths:
+ node = model.get_iter(path)
+ index = model.get_value(node,0)
+ if (index is not None and self._link[index]):
+ retval.append(self._link[index])
+ sel_data.set(sel_data.target, 8, pickle.dumps(retval))
+ return True
+
+ def toggle(self, obj, path, col):
+ """
+ obj - column widget
+ path - row
+ col - column
+ """
+ self.treeview.get_model()[path][col] = not \
+ self.treeview.get_model()[path][col]
+
+ def write(self, document):
+ self.simpledoc = document
+ buffer = self.simpledoc.doc.buffer
+ text_view = self.simpledoc.doc.text_view
+ model_index = 1 # start after index
+ if self._sort_col:
+ sort_index = self._columns.index(self._sort_col)
+ else:
+ sort_index = 0
+ treeview = MultiTreeView()
+ treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
+ [(DdTargets.HANDLE_LIST.drag_type, gtk.TARGET_SAME_WIDGET, 0)],
+ gtk.gdk.ACTION_COPY)
+ #treeview.enable_model_drag_dest(DdTargets.all_targets(),
+ # gtk.gdk.ACTION_DEFAULT)
+ treeview.connect('drag_data_get', self.object_drag_data_get)
+ treeview.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_BOTH)
+ #treeview.connect('row-activated', on_table_doubleclick, self)
+ #treeview.connect('cursor-changed', on_table_click, self)
+ treeview.connect('button-press-event', self.button_press_event)
+ treeview.connect('select-cursor-row', self.button_press_event)
+ renderer = gtk.CellRendererText()
+ types = [int] # index
+ cnt = 0
+ sort_data = []
+ sort_data_types = []
+ for col in self._columns:
+ if self.get_cell_type(cnt) == "text":
+ types.append(str)
+ if self.get_cell_markup(cnt):
+ column = gtk.TreeViewColumn(col,renderer,markup=model_index)
+ else:
+ column = gtk.TreeViewColumn(col,renderer,text=model_index)
+ elif self.get_cell_type(cnt) == "checkbox":
+ types.append(bool)
+ toggle_renderer = gtk.CellRendererToggle()
+ toggle_renderer.set_property('activatable', True)
+ toggle_renderer.connect("toggled", self.toggle, model_index)
+ column = gtk.TreeViewColumn(col, toggle_renderer)
+ column.add_attribute(toggle_renderer, "active", model_index)
+ column.set_resizable(True)
+ if self._sort_vals[cnt] != []:
+ sort_data.append(self._sort_vals[cnt])
+ column.set_sort_column_id(len(self._columns) +
+ len(sort_data))
+ sort_data_types.append(int)
+ else:
+ column.set_sort_column_id(model_index)
+ treeview.append_column(column)
+ self.model_index_of_column[col] = model_index
+ #if model_index == sort_index:
+ # FIXME: what to set here?
+ model_index += 1
+ cnt += 1
+ if self.title:
+ self.simpledoc.paragraph(self.title)
+ # Make a GUI to put the tree view in
+ types += sort_data_types
+ model = gtk.ListStore(*types)
+ treeview.set_model(model)
+ treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
+ iter = buffer.get_end_iter()
+ anchor = buffer.create_child_anchor(iter)
+ text_view.add_child_at_anchor(treeview, anchor)
+ self.treeview= treeview
+ count = 0
+ for data in self._rows:
+ col = 0
+ rowdata = []
+ for cell in data:
+ rowdata.append(self.get_cell_markup(col, count, cell))
+ col += 1
+ try:
+ model.append(row=([count] + list(rowdata) + [col[count] for col in sort_data]))
+ except:
+ print "error in row %d: data: %s, sort data: %d" % (count, rowdata, len(sort_data[0]))
+ count += 1
+ text_view.show_all()
+ self.simpledoc.paragraph("")
+ self.simpledoc.paragraph("")
diff --git a/src/docgen/TextBufDoc.py b/src/gui/plug/quick/_textbufdoc.py
similarity index 100%
rename from src/docgen/TextBufDoc.py
rename to src/gui/plug/quick/_textbufdoc.py
diff --git a/src/gui/views/listview.py b/src/gui/views/listview.py
index 25efe912e..a0d875119 100644
--- a/src/gui/views/listview.py
+++ b/src/gui/views/listview.py
@@ -64,6 +64,7 @@ from QuestionDialog import QuestionDialog, QuestionDialog2
from gui.filtereditor import FilterEditor
from gen.ggettext import sgettext as _
from DdTargets import DdTargets
+from gui.plug.quick import create_quickreport_menu, create_web_connect_menu
#----------------------------------------------------------------
#
@@ -740,8 +741,6 @@ class ListView(NavigationView):
"""
if not self.dbstate.open:
return False
- from QuickReports import (create_quickreport_menu,
- create_web_connect_menu)
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1:
if self.type_list() == LISTFLAT:
self.edit(obj)
diff --git a/src/gui/widgets/grampletpane.py b/src/gui/widgets/grampletpane.py
index d4049f7fb..06fa7e7cc 100644
--- a/src/gui/widgets/grampletpane.py
+++ b/src/gui/widgets/grampletpane.py
@@ -47,7 +47,7 @@ from gui.editors import EditPerson, EditFamily
import ManagedWindow
import ConfigParser
from gui.utils import add_menuitem
-from QuickReports import run_quick_report_by_name
+from gui.plug.quick import run_quick_report_by_name
import GrampsDisplay
from glade import Glade
from gui.pluginmanager import GuiPluginManager
diff --git a/src/gui/widgets/styledtexteditor.py b/src/gui/widgets/styledtexteditor.py
index da9b6aab7..12d2c9847 100644
--- a/src/gui/widgets/styledtexteditor.py
+++ b/src/gui/widgets/styledtexteditor.py
@@ -310,7 +310,7 @@ class StyledTextEditor(gtk.TextView):
"""
Return a string useful for a tooltip given a LinkTag object.
"""
- from Simple import SimpleAccess
+ from gen.simple import SimpleAccess
win_obj = find_parent_with_attr(self, attr="dbstate")
display = link_tag.data
if win_obj:
diff --git a/src/plugins/gramplet/AgeOnDateGramplet.py b/src/plugins/gramplet/AgeOnDateGramplet.py
index 8284b9a79..c86b74853 100644
--- a/src/plugins/gramplet/AgeOnDateGramplet.py
+++ b/src/plugins/gramplet/AgeOnDateGramplet.py
@@ -37,7 +37,7 @@ on a particular date.
from gen.plug import Gramplet
from gen.ggettext import sgettext as _
import gen.datehandler
-from QuickReports import run_quick_report_by_name
+from gui.plug.quick import run_quick_report_by_name
#------------------------------------------------------------------------
#
diff --git a/src/plugins/gramplet/Attributes.py b/src/plugins/gramplet/Attributes.py
index 4b748d2d1..7d734c607 100644
--- a/src/plugins/gramplet/Attributes.py
+++ b/src/plugins/gramplet/Attributes.py
@@ -20,7 +20,7 @@
#
from ListModel import ListModel, NOSORT
-from QuickReports import run_quick_report_by_name
+from gui.plug.quick import run_quick_report_by_name
from gen.plug import Gramplet
from gen.ggettext import gettext as _
import gtk
diff --git a/src/plugins/gramplet/CalendarGramplet.py b/src/plugins/gramplet/CalendarGramplet.py
index c1de2352e..877c2e08f 100644
--- a/src/plugins/gramplet/CalendarGramplet.py
+++ b/src/plugins/gramplet/CalendarGramplet.py
@@ -25,7 +25,7 @@
#------------------------------------------------------------------------
from gen.plug import Gramplet
from gen.ggettext import sgettext as _
-from QuickReports import run_quick_report_by_name
+from gui.plug.quick import run_quick_report_by_name
import gen.lib
#------------------------------------------------------------------------
diff --git a/src/plugins/gramplet/QuickViewGramplet.py b/src/plugins/gramplet/QuickViewGramplet.py
index ea1d39022..02e570d07 100644
--- a/src/plugins/gramplet/QuickViewGramplet.py
+++ b/src/plugins/gramplet/QuickViewGramplet.py
@@ -33,7 +33,7 @@
#------------------------------------------------------------------------
from gen.plug import Gramplet
from gen.ggettext import sgettext as _
-from QuickReports import run_quick_report_by_name, get_quick_report_list
+from gui.plug.quick import run_quick_report_by_name, get_quick_report_list
from gen.plug import (CATEGORY_QR_PERSON, CATEGORY_QR_FAMILY,
CATEGORY_QR_EVENT, CATEGORY_QR_SOURCE, CATEGORY_QR_NOTE,
CATEGORY_QR_MISC, CATEGORY_QR_PLACE, CATEGORY_QR_MEDIA,
diff --git a/src/plugins/quickview/AgeOnDate.py b/src/plugins/quickview/AgeOnDate.py
index d6f0f77dc..53382f97d 100644
--- a/src/plugins/quickview/AgeOnDate.py
+++ b/src/plugins/quickview/AgeOnDate.py
@@ -27,7 +27,8 @@
Display references for any object
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from Utils import probably_alive
from gen.ggettext import gettext as _
import gen.datehandler
@@ -41,7 +42,7 @@ def run(database, document, date):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
if not date.get_valid():
sdoc.paragraph("Date is not a valid date.")
return
diff --git a/src/plugins/quickview/AttributeMatch.py b/src/plugins/quickview/AttributeMatch.py
index 355155a72..8e8b3952c 100644
--- a/src/plugins/quickview/AttributeMatch.py
+++ b/src/plugins/quickview/AttributeMatch.py
@@ -22,13 +22,14 @@
#
#
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from gen.ggettext import gettext as _
def run(database, document, attribute, value=None):
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
sdoc.title(_("People who have the '%s' Attribute") % attribute)
sdoc.paragraph("")
stab.columns(_("Person"), str(attribute))
diff --git a/src/plugins/quickview/FilterByName.py b/src/plugins/quickview/FilterByName.py
index 663c1d8de..f19a08b0e 100644
--- a/src/plugins/quickview/FilterByName.py
+++ b/src/plugins/quickview/FilterByName.py
@@ -27,9 +27,10 @@
Display filtered data
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from Utils import media_path_full
-from QuickReports import run_quick_report_by_name_direct
+from gui.plug.quick import run_quick_report_by_name_direct
from gen.lib import Person
import gen.datehandler
@@ -81,7 +82,7 @@ def run(database, document, filter_name, *args, **kwargs):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
if (filter_name == 'all'):
sdoc.title(_("Summary counts of current selection"))
sdoc.paragraph("")
diff --git a/src/plugins/quickview/LinkReferences.py b/src/plugins/quickview/LinkReferences.py
index 2526fedc0..1ae96bf77 100644
--- a/src/plugins/quickview/LinkReferences.py
+++ b/src/plugins/quickview/LinkReferences.py
@@ -25,7 +25,8 @@
Display link references for a note
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from gen.lib import StyledTextTagType
from gen.ggettext import gettext as _
@@ -37,7 +38,7 @@ def run(database, document, obj):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
# display the title
sdoc.title(_("Link References for this note"))
diff --git a/src/plugins/quickview/OnThisDay.py b/src/plugins/quickview/OnThisDay.py
index f4bc13894..0e2fb2e13 100644
--- a/src/plugins/quickview/OnThisDay.py
+++ b/src/plugins/quickview/OnThisDay.py
@@ -26,7 +26,8 @@
Display all events on a particular day.
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc, SimpleTable
+from gui.plug.quick import QuickTable
from gen.ggettext import gettext as _
import gen.lib
@@ -66,11 +67,11 @@ def run(database, document, main_event):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
stab.set_link_col(3)
- yeartab = SimpleTable(sdb)
+ yeartab = QuickTable(sdb)
yeartab.set_link_col(3)
- histab = SimpleTable(sdb)
+ histab = QuickTable(sdb)
histab.set_link_col(3)
# display the title
diff --git a/src/plugins/quickview/References.py b/src/plugins/quickview/References.py
index 05708c88b..6e81736b3 100644
--- a/src/plugins/quickview/References.py
+++ b/src/plugins/quickview/References.py
@@ -27,7 +27,8 @@
Display references for any object
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from gen.ggettext import gettext as _
def get_ref(db, objclass, handle):
@@ -62,7 +63,7 @@ def run(database, document, object, item, trans):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
# display the title
sdoc.title(_("References for this %s") % trans)
diff --git a/src/plugins/quickview/Reporef.py b/src/plugins/quickview/Reporef.py
index 25a242d74..db6935a3d 100755
--- a/src/plugins/quickview/Reporef.py
+++ b/src/plugins/quickview/Reporef.py
@@ -34,7 +34,8 @@
Display RepoRef for sources related to active repository
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from gen.ggettext import gettext as _
def run(database, document, repo):
@@ -46,7 +47,7 @@ def run(database, document, repo):
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
# First we find repository and add its text
diff --git a/src/plugins/quickview/SameSurnames.py b/src/plugins/quickview/SameSurnames.py
index 394403a7f..d570b7387 100644
--- a/src/plugins/quickview/SameSurnames.py
+++ b/src/plugins/quickview/SameSurnames.py
@@ -27,7 +27,8 @@
Display a people who have a person's same surname or given name.
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from gen.ggettext import gettext as _
from gen.ggettext import ngettext
import gen.lib
@@ -95,7 +96,7 @@ def run(database, document, person):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
if isinstance(person, gen.lib.Person):
surname = sdb.surname(person)
rsurname = person.get_primary_name().get_group_name()
@@ -137,7 +138,7 @@ def run_given(database, document, person):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
if isinstance(person, gen.lib.Person):
rgivenname = person.get_primary_name().get_first_name()
else:
diff --git a/src/plugins/quickview/all_events.py b/src/plugins/quickview/all_events.py
index 87782381d..6e2086071 100644
--- a/src/plugins/quickview/all_events.py
+++ b/src/plugins/quickview/all_events.py
@@ -26,7 +26,8 @@
Display a person's events, both personal and family
"""
-from Simple import SimpleAccess, by_date, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, by_date, SimpleDoc
+from gui.plug.quick import QuickTable
from gen.ggettext import gettext as _
def run(database, document, person):
@@ -38,7 +39,7 @@ def run(database, document, person):
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
# get the personal events
event_list = sdb.events(person)
@@ -74,7 +75,7 @@ def run_fam(database, document, family):
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
# get the family events
event_list = [(_('Family'), x) for x in sdb.events(family)]
@@ -112,7 +113,7 @@ def run_fam(database, document, family):
document.has_data = True
stab.write(sdoc)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
sdoc.header1(_("Personal events of the children"))
stab.columns(_("Family Member"), _("Event Type"),
_("Event Date"), _("Event Place"))
diff --git a/src/plugins/quickview/all_relations.py b/src/plugins/quickview/all_relations.py
index 0d68349db..3448162ea 100644
--- a/src/plugins/quickview/all_relations.py
+++ b/src/plugins/quickview/all_relations.py
@@ -31,7 +31,7 @@ Display a person's relations to the home person
#
#-------------------------------------------------------------------------
-from Simple import SimpleAccess, SimpleDoc
+from gen.simple import SimpleAccess, SimpleDoc
from gen.ggettext import gettext as _
import Relationship
diff --git a/src/plugins/quickview/lineage.py b/src/plugins/quickview/lineage.py
index f4f24dfcc..954ef235a 100644
--- a/src/plugins/quickview/lineage.py
+++ b/src/plugins/quickview/lineage.py
@@ -33,7 +33,8 @@ Display a person's father or mother lineage
#-------------------------------------------------------------------------
import gen.lib
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
from gen.ggettext import gettext as _
__FMT = "%-30s\t%-12s\t%-12s"
@@ -57,7 +58,7 @@ def run_father(database, document, person):
" People in this lineage all share the same Y-chromosome."
))
sd.paragraph("")
- stab = SimpleTable(sa)
+ stab = QuickTable(sa)
stab.columns(_("Name Father"), _("Birth Date"), _("Death Date"), _("Remark"))
make_details(gen.lib.Person.MALE, person, sa, sd, database, stab)
stab.write(sd)
@@ -89,7 +90,7 @@ def run_mother(database, document, person):
))
sd.paragraph("")
- stab = SimpleTable(sa)
+ stab = QuickTable(sa)
stab.columns(_("Name Mother"), _("Birth"), _("Death Date"), _("Remark"))
make_details(gen.lib.Person.FEMALE, person, sa, sd, database, stab)
stab.write(sd)
diff --git a/src/plugins/quickview/siblings.py b/src/plugins/quickview/siblings.py
index 882d0a910..baa5086aa 100644
--- a/src/plugins/quickview/siblings.py
+++ b/src/plugins/quickview/siblings.py
@@ -26,7 +26,8 @@
Display a person's siblings in a report window
"""
-from Simple import SimpleAccess, SimpleDoc, SimpleTable
+from gen.simple import SimpleAccess, SimpleDoc
+from gui.plug.quick import QuickTable
import Relationship
from gen.ggettext import gettext as _
@@ -38,7 +39,7 @@ def run(database, document, person):
# setup the simple access functions
sdb = SimpleAccess(database)
sdoc = SimpleDoc(document)
- stab = SimpleTable(sdb)
+ stab = QuickTable(sdb)
rel_class = Relationship.get_relationship_calculator()
# display the title
diff --git a/src/webapp/utils.py b/src/webapp/utils.py
index a3760dffb..693f7c517 100644
--- a/src/webapp/utils.py
+++ b/src/webapp/utils.py
@@ -56,7 +56,7 @@ from webapp.dbdjango import DbDjango
# Gramps Modules
#
#------------------------------------------------------------------------
-from Simple import SimpleTable, SimpleAccess, make_basic_stylesheet
+from gen.simple import SimpleTable, SimpleAccess, make_basic_stylesheet
import Utils
import DbState
from gen.datehandler import displayer, parser