* various updates to CitationView, CitationEmbedView and CitationEditor to take account of Rev 17973 for two different object types in selectors

* updates to citationviews to support all the functionality (add source etc.) provided by sourceview (including different tooltips for tree view and list view)
* moved registration of citationtreeview into view.grp.py
* removed citationtreeview.grp.py module
* fixed update to citation when note is deleted
* fixed update to citation when media object is deleted
* re-enabled edit button in sourcebackreflist
* improved date display in mergecitation
* changed default note type for citation notes
* changed backref in citation editor to CitationBackRefList
* fixed removal of citation handles from the list in primary objects when a citation is deleted
* fixes for pylint

svn: r18095
This commit is contained in:
Tim G L Lyons
2011-09-01 18:13:42 +00:00
parent b438b7c248
commit 29cc4ee6e9
20 changed files with 370 additions and 221 deletions

View File

@@ -1,6 +1,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2011 Nick Hall
# 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

View File

@@ -1,5 +1,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2001-2006 Donald N. Allingham
# Copyright (C) 2008 Gary Burton
# Copyright (C) 2011 Tim G L Lyons, Nick Hall
#
# This program is free software; you can redistribute it and/or modify
@@ -43,16 +45,14 @@ import gtk
#
#-------------------------------------------------------------------------
import gen.lib
import config
from gui.views.listview import ListView
from gui.views.treemodels import CitationListModel
import Utils
import Bookmarks
import Errors
from DdTargets import DdTargets
from gui.selectors import SelectorFactory
from QuestionDialog import ErrorDialog
from gui.editors import EditCitation, DeleteCitationQuery, EditSource
from gui.editors import EditCitation, DeleteCitationQuery, EditSource, \
DeleteSrcQuery
from Filters.SideBar import SourceSidebarFilter
from gen.plug import CATEGORY_QR_SOURCE
@@ -63,7 +63,6 @@ from gen.plug import CATEGORY_QR_SOURCE
#-------------------------------------------------------------------------
from gen.ggettext import gettext as _
#-------------------------------------------------------------------------
#
# CitationView
@@ -108,9 +107,12 @@ class BaseCitationView(ListView):
COL_SRC_ABBR, COL_SRC_PINFO, COL_SRC_CHAN]),
('columns.size', [200, 75, 100, 100, 100, 200, 75, 75, 100, 150, 100])
)
ADD_MSG = _("Add a new citation to an existing source")
ADD_MSG = _("Add a new citation and a new source")
ADD_SOURCE_MSG = _("Add a new source")
ADD_CITATION_MSG = _("Add a new citation to an existing source")
# Edit delete and merge messages are overridden for the tree view as
# they can apply to sources or citations
EDIT_MSG = _("Edit the selected citation")
SHARE_MSG = _("Share the selected source")
DEL_MSG = _("Delete the selected citation")
MERGE_MSG = _("Merge the selected citations")
FILTER_TYPE = "Citation"
@@ -123,6 +125,10 @@ class BaseCitationView(ListView):
'citation-update' : self.row_update,
'citation-delete' : self.row_delete,
'citation-rebuild' : self.object_build,
'source-add' : self.row_add,
'source-update' : self.row_update,
'source-delete' : self.row_delete,
'source-rebuild' : self.object_build,
}
ListView.__init__(
@@ -151,13 +157,34 @@ class BaseCitationView(ListView):
return DdTargets.SOURCE_LINK
def define_actions(self):
"""
This defines the possible actions for the citation views.
Possible actions are:
add_source: Add a new source (this is also available from the
source view)
add: Add a new citation and a new source (this can also be done
by source view add a source, then citation view add a new
citation to an existing source)
share: Add a new citation to an existing source (when a source is
selected)
edit: Edit a source or a citation.
merge: Merge the selected sources or citations.
remove: Delete the selected sources or citations.
"""
ListView.define_actions(self)
# self._add_action('Share', gtk.STOCK_EDIT, _("Share..."),
# accel=None,
# tip=self.SHARE_MSG,
# callback=self.share)
#
# gtk stock icons are at http://www.pygtk.org/docs/pygtk/gtk-stock-items.html
self._add_action('Add source', 'gramps-source', _("Add source..."),
accel=None,
tip=self.ADD_SOURCE_MSG,
callback=self.add_source)
self._add_action('Add citation', 'gramps-source', _("Add citation..."),
accel=None,
tip=self.ADD_CITATION_MSG,
callback=self.share)
self.all_action = gtk.ActionGroup(self.title + "/CitationAll")
self.edit_action = gtk.ActionGroup(self.title + "/CitationEdit")
@@ -173,6 +200,12 @@ class BaseCitationView(ListView):
return 'gramps-citation'
def additional_ui(self):
"""
Defines the UI string for UIManager
This is overridden in citationtreeview because that has additional
popup items for open and close all nodes
"""
return '''<ui>
<menubar name="MenuBar">
<menu action="FileMenu">
@@ -196,6 +229,7 @@ class BaseCitationView(ListView):
<menu action="EditMenu">
<placeholder name="CommonEdit">
<menuitem action="Add"/>
<menuitem action="Add source"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
@@ -210,6 +244,7 @@ class BaseCitationView(ListView):
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="Add"/>
<toolitem action="Add source"/>
<toolitem action="Edit"/>
<toolitem action="Remove"/>
<toolitem action="Merge"/>
@@ -237,45 +272,117 @@ class BaseCitationView(ListView):
"""
pass
def add_source(self, obj):
"""
add_source: Add a new source (this is also available from the
source view)
Create a new Source instance and call the EditSource editor with the
new source.
Called when the Add_source button is clicked.
If the window already exists (Errors.WindowActiveError), we ignore it.
This prevents the dialog from coming up twice on the same object.
However, since the window is identified by the Source object, and
we have just created a new one, it seems to be impossible for the
window to already exist, so this is just an extra safety measure.
"""
try:
EditSource(self.dbstate, self.uistate, [], gen.lib.Source())
except Errors.WindowActiveError:
pass
def add(self, obj):
"""
Add a new Citation to a user selected source
add: Add a new citation and a new source (this can also be done
by source view add a source, then citation view add a new
citation to an existing source)
Create a new Source instance and Citation instance and call the
EditSource editor with the new source.
Called when the Add button is clicked.
If the window already exists (Errors.WindowActiveError), we ignore it.
This prevents the dialog from coming up twice on the same object.
However, since the window is identified by the Source object, and
we have just created a new one, it seems to be impossible for the
window to already exist, so this is just an extra safety measure.
"""
SelectSource = SelectorFactory('Source')
sel = SelectSource(self.dbstate, self.uistate)
source = sel.run()
if source:
try:
EditCitation(self.dbstate, self.uistate, [], gen.lib.Citation(),
source)
except Errors.WindowActiveError:
from QuestionDialog import WarningDialog
WarningDialog(_("Cannot share this reference"),
self.__blocked_text())
try:
EditCitation(self.dbstate, self.uistate, [], gen.lib.Citation(),
gen.lib.Source())
except Errors.WindowActiveError:
pass
# def share(self, obj):
# SelectSource = SelectorFactory('Source')
# sel = SelectSource(self.dbstate,self.uistate)
# source = sel.run()
# if source:
# try:
# EditCitation(self.dbstate, self.uistate, [], gen.lib.Citation(),
# source)
# except Errors.WindowActiveError:
# from QuestionDialog import WarningDialog
# WarningDialog(_("Cannot share this reference"),
# self.__blocked_text())
def share(self, obj):
"""
share: Add a new citation to an existing source (when a source is
selected)
"""
for handle in self.selected_handles():
# The handle will either be a Source handle or a Citation handle
source = self.dbstate.db.get_source_from_handle(handle)
citation = self.dbstate.db.get_citation_from_handle(handle)
if (not source and not citation) or (source and citation):
raise ValueError("selection must be either source or citation")
if source:
try:
EditCitation(self.dbstate, self.uistate, [],
gen.lib.Citation(), source)
except Errors.WindowActiveError:
from QuestionDialog import WarningDialog
WarningDialog(_("Cannot share this reference"),
self.__blocked_text())
else:
msg = _("Cannot add citation.")
msg2 = _("In order to add a citation to an existing source, "
" you must select a source.")
ErrorDialog(msg, msg2)
#
def remove(self, obj):
self.remove_selected_objects()
def remove_object_from_handle(self, handle):
the_lists = Utils.get_citation_referents(handle, self.dbstate.db)
object = self.dbstate.db.get_citation_from_handle(handle)
query = DeleteCitationQuery(self.dbstate, self.uistate, object,
the_lists)
is_used = any(the_lists)
return (query, is_used, object)
# The handle will either be a Source handle or a Citation handle
source = self.dbstate.db.get_source_from_handle(handle)
citation = self.dbstate.db.get_citation_from_handle(handle)
if (not source and not citation) or (source and citation):
raise ValueError("selection must be either source or citation")
if citation:
the_lists = Utils.get_citation_referents(handle, self.dbstate.db)
object = self.dbstate.db.get_citation_from_handle(handle)
query = DeleteCitationQuery(self.dbstate, self.uistate, object,
the_lists)
is_used = any(the_lists)
return (query, is_used, object)
else:
# FIXME: this is copied from SourceView, because import with
# from plugins.view.sourceview import SourceView doesn't
# seem to work!
the_lists = Utils.get_source_referents(handle, self.dbstate.db)
LOG.debug('source referents %s' % [the_lists])
citation_referents_list = []
for citation in the_lists[7]:
LOG.debug('citation %s' % citation)
refs = Utils.get_citation_referents(citation, self.dbstate.db)
citation_referents_list += [(citation, refs)]
LOG.debug('citation_referents_list %s' % [citation_referents_list])
(person_list, family_list, event_list, place_list, source_list,
media_list, repo_list, citation_list) = the_lists
the_lists = (person_list, family_list, event_list, place_list,
source_list, media_list, repo_list, citation_list,
citation_referents_list)
LOG.debug('the_lists %s' % [the_lists])
object = self.dbstate.db.get_source_from_handle(handle)
query = DeleteSrcQuery(self.dbstate, self.uistate, object,
the_lists)
is_used = any(the_lists)
return (query, is_used, object)
def edit(self, obj):
"""
@@ -283,17 +390,18 @@ class BaseCitationView(ListView):
"""
for handle in self.selected_handles():
# The handle will either be a Source handle or a Citation handle
source = self.dbstate.db.get_source_from_handle(handle)
citation = self.dbstate.db.get_citation_from_handle(handle)
if (not source and not citation) or (source and citation):
raise ValueError("selection must be either source or citation")
if citation:
LOG.debug("citation handle %s page %s" %
(handle, citation.page))
source = self.dbstate.db.get_source_from_handle(citation.ref)
try:
EditCitation(self.dbstate, self.uistate, [], citation, source)
EditCitation(self.dbstate, self.uistate, [], citation)
except Errors.WindowActiveError:
pass
else:
source = self.dbstate.db.get_source_from_handle(handle)
LOG.debug("source handle %s title %s " %
(source, source.title))
EditSource(self.dbstate, self.uistate, [], source)
@@ -314,26 +422,47 @@ class BaseCitationView(ListView):
"""
mlist = self.selected_handles()
# FIXME: needs to be enhanced to take account of the fact that
# the selected handles can be either sources or citations.
if len(mlist) != 2:
msg = _("Cannot merge citations.")
msg2 = _("Exactly two citations must be selected to perform a merge. "
"A second citation can be selected by holding down the "
"control key while clicking on the desired citation.")
ErrorDialog(msg, msg2)
elif not self.dbstate.db.get_citation_from_handle(
mlist[0]).get_reference_handle() == \
self.dbstate.db.get_citation_from_handle(
mlist[1]).get_reference_handle():
msg = _("Cannot merge citations.")
msg2 = _("The two selected citations must have the same source "
"to perform a merge. If you want to merge these two "
"citations, then you must merge the sources first.")
msg2 = _("Exactly two citations must be selected to perform a "
"merge. A second citation can be selected by holding "
"down the control key while clicking on the desired "
"citation.")
ErrorDialog(msg, msg2)
else:
import Merge
Merge.MergeCitations(self.dbstate, self.uistate, mlist[0], mlist[1])
source1 = self.dbstate.db.get_source_from_handle(mlist[0])
citation1 = self.dbstate.db.get_citation_from_handle(mlist[0])
if (not source1 and not citation1) or (source1 and citation1):
raise ValueError("selection must be either source or citation")
source2 = self.dbstate.db.get_source_from_handle(mlist[1])
citation2 = self.dbstate.db.get_citation_from_handle(mlist[1])
if (not source2 and not citation2) or (source2 and citation2):
raise ValueError("selection must be either source or citation")
if citation1 and citation2:
if not citation1.get_reference_handle() == \
citation2.get_reference_handle():
msg = _("Cannot merge citations.")
msg2 = _("The two selected citations must have the same "
"source to perform a merge. If you want to merge "
"these two citations, then you must merge the "
"sources first.")
ErrorDialog(msg, msg2)
else:
import Merge
Merge.MergeCitations(self.dbstate, self.uistate,
mlist[0], mlist[1])
elif source1 and source2:
import Merge
Merge.MergeSources(self.dbstate, self.uistate,
mlist[0], mlist[1])
else:
msg = _("Cannot perform merge.")
msg2 = _("Both objects must be of the same type, either "
"both must be sources, or both must be "
"citations.")
ErrorDialog(msg, msg2)
def get_handle_from_gramps_id(self, gid):
obj = self.dbstate.db.get_citation_from_gramps_id(gid)

View File

@@ -7,7 +7,6 @@ pkgdatadir = $(datadir)/@PACKAGE@/plugins/view
pkgdata_PYTHON = \
citationlistview.py \
citationtreeview.grp.py \
citationtreeview.py \
eventview.py \
familyview.py \

View File

@@ -1,5 +1,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2001-2006 Donald N. Allingham
# Copyright (C) 2008 Gary Burton
# Copyright (C) 2011 Tim G L Lyons
#
# This program is free software; you can redistribute it and/or modify

View File

@@ -1,14 +0,0 @@
register(VIEW,
id = 'citationtreeview',
name = _("Citation Tree View"),
description = _("A view displaying citations in a tree format."),
version = '1.0',
gramps_target_version = '3.4',
status = STABLE,
fname = 'citationtreeview.py',
authors = [u"Tim G L Lyons", u"Nick Hall"],
authors_email = [""],
category = ("Citations", _("Citations")),
viewclass = 'CitationTreeView',
stock_icon = 'gramps-tree-group',
)

View File

@@ -1,5 +1,6 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2009-2010 Nick Hall
# Copyright (C) 2011 Tim G L Lyons
#
# This program is free software; you can redistribute it and/or modify
@@ -38,10 +39,6 @@ LOG = logging.getLogger(".citation")
from gui.views.listview import LISTTREE
from libcitationview import BaseCitationView
from gui.views.treemodels.citationmodel import CitationTreeModel
import gen.lib
import Errors
from gui.editors import EditCitation
from Utils import preset_name
#-------------------------------------------------------------------------
#
@@ -81,6 +78,9 @@ class CitationTreeView(BaseCitationView):
"""
Define actions for the popup menu specific to the tree view.
"""
self.EDIT_MSG = _("Edit the selected citation or source")
self.DEL_MSG = _("Delete the selected citation or source")
self.MERGE_MSG = _("Merge the selected citations or selected sources")
BaseCitationView.define_actions(self)
self.all_action.add_actions([
@@ -116,6 +116,8 @@ class CitationTreeView(BaseCitationView):
<menu action="EditMenu">
<placeholder name="CommonEdit">
<menuitem action="Add"/>
<menuitem action="Add source"/>
<menuitem action="Add citation"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
@@ -130,6 +132,8 @@ class CitationTreeView(BaseCitationView):
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="Add"/>
<toolitem action="Add source"/>
<toolitem action="Add citation"/>
<toolitem action="Edit"/>
<toolitem action="Remove"/>
<toolitem action="Merge"/>

View File

@@ -226,3 +226,19 @@ category = ("Citations", _("Citations")),
viewclass = 'CitationListView',
order = START,
)
register(VIEW,
id = 'citationtreeview',
name = _("Citation Tree View"),
description = _("A view displaying citations and sources in a tree format."),
version = '1.0',
gramps_target_version = '3.4',
status = STABLE,
fname = 'citationtreeview.py',
authors = [u"Tim G L Lyons", u"Nick Hall"],
authors_email = [""],
category = ("Citations", _("Citations")),
viewclass = 'CitationTreeView',
stock_icon = 'gramps-tree-group',
order = START,
)