* 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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -7,7 +7,6 @@ pkgdatadir = $(datadir)/@PACKAGE@/plugins/view
|
||||
|
||||
pkgdata_PYTHON = \
|
||||
citationlistview.py \
|
||||
citationtreeview.grp.py \
|
||||
citationtreeview.py \
|
||||
eventview.py \
|
||||
familyview.py \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
)
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user