From a906c98439dc63dd7c70df7e23f8329d24413311 Mon Sep 17 00:00:00 2001 From: Tim G L Lyons Date: Mon, 26 Sep 2011 19:53:18 +0000 Subject: [PATCH] Clean-up Sources and Citations views: * Add icon for citations view * disable old sourceview * change citationtreeview to be Sources navigation view * citationlistview is now the Citations view * merge libcitationview into citationlistview and citationtreeview, and corrected and rationalised * remove libcitationview * corrected initialisation of source_handle in Citation.py * fixes for preventing same source being edited twice - fixed blockedtext in citationembededlist - override build_window_key in editcitation.py svn: r18211 --- src/DdTargets.py | 4 +- src/gen/lib/citation.py | 2 +- .../editors/displaytabs/citationembedlist.py | 12 +- src/gui/editors/editcitation.py | 44 +- src/gui/grampsgui.py | 1 + src/images/16x16/Makefile.am | 1 + src/images/16x16/gramps-citation.png | Bin 0 -> 3554 bytes src/images/22x22/Makefile.am | 1 + src/images/22x22/gramps-citation.png | Bin 0 -> 4264 bytes src/images/48x48/Makefile.am | 1 + src/images/48x48/gramps-citation.png | Bin 0 -> 7282 bytes src/images/scalable/Makefile.am | 1 + src/images/scalable/gramps-citation.png | Bin 0 -> 83322 bytes src/plugins/lib/libcitationview.py | 427 ------------------ src/plugins/sidebar/categorysidebar.py | 4 +- src/plugins/view/citationlistview.py | 256 ++++++++++- src/plugins/view/citationtreeview.py | 327 +++++++++++++- src/plugins/view/view.gpr.py | 32 +- 18 files changed, 641 insertions(+), 472 deletions(-) create mode 100644 src/images/16x16/gramps-citation.png create mode 100644 src/images/22x22/gramps-citation.png create mode 100644 src/images/48x48/gramps-citation.png create mode 100644 src/images/scalable/gramps-citation.png delete mode 100644 src/plugins/lib/libcitationview.py diff --git a/src/DdTargets.py b/src/DdTargets.py index 3f588be27..94d0eda4b 100644 --- a/src/DdTargets.py +++ b/src/DdTargets.py @@ -134,6 +134,7 @@ class _DdTargets(object): self.SOURCE_LINK = _DdType(self, 'source-link') self.URL = _DdType(self, 'url') self.SURNAME = _DdType(self, 'surname') + self.CITATION_LINK = _DdType(self, 'citation-link') # List of all types that are used between # gramps widgets but should not be exported @@ -160,7 +161,8 @@ class _DdTargets(object): self.SOURCEREF, self.SOURCE_LINK, self.URL, - self.SURNAME + self.SURNAME, + self.CITATION_LINK ] self.CHILD = _DdType(self, 'child') diff --git a/src/gen/lib/citation.py b/src/gen/lib/citation.py index b16225ba2..8f83302aa 100644 --- a/src/gen/lib/citation.py +++ b/src/gen/lib/citation.py @@ -70,7 +70,7 @@ class Citation(MediaBase, NoteBase, PrimaryObject, DateBase): MediaBase.__init__(self) # 7 NoteBase.__init__(self) # 6 DateBase.__init__(self) # 2 - self.source_handle = None, # 5 + self.source_handle = None # 5 self.page = "" # 3 self.confidence = Citation.CONF_NORMAL # 4 self.datamap = {} # 8 diff --git a/src/gui/editors/displaytabs/citationembedlist.py b/src/gui/editors/displaytabs/citationembedlist.py index 2943b8d50..1243d18d1 100644 --- a/src/gui/editors/displaytabs/citationembedlist.py +++ b/src/gui/editors/displaytabs/citationembedlist.py @@ -180,6 +180,16 @@ class CitationEmbedList(EmbeddedList, DbGUIElement): else: raise ValueError("selection must be either source or citation") + def __blocked_text(self): + """ + Return the common text used when citation cannot be edited + """ + return _("This citation cannot be created at this time. " + "Either the associated Source object is already being " + "edited, or another citation associated with the same " + "source is being edited.\n\nTo edit this " + "citation, you need to close the object.") + def edit_button_clicked(self, obj): """ Get the selected Citation instance and call the EditCitation editor @@ -190,10 +200,8 @@ class CitationEmbedList(EmbeddedList, DbGUIElement): This prevents the dialog from coming up twice on the same object. """ handle = self.get_selected() - LOG.debug('selected handle %s' % handle) if handle: citation = self.dbstate.db.get_citation_from_handle(handle) - LOG.debug("selected citation: %s" % citation) try: from gui.editors import EditCitation EditCitation(self.dbstate, self.uistate, self.track, citation, diff --git a/src/gui/editors/editcitation.py b/src/gui/editors/editcitation.py index ba2e83ade..a59d5f575 100644 --- a/src/gui/editors/editcitation.py +++ b/src/gui/editors/editcitation.py @@ -90,6 +90,37 @@ class EditCitation(EditPrimary): # EditCitation, not only do we need to protect obj (which will be # a Citation, but we also need to protect the associated Source. + def build_window_key(self, obj): + """ + Return a key for the edit window that is opened. + This function overrides the build_window_key in EditPrimary. + + There is a problem with database object locking. The database locking is + handled by the ManagedWindow class, which will only allow one primary + object to be edited at a time. + + Normally, the window key is derived from the obj that is being edited. + However, in the case of EditCitation, there are two objects being + edited, the Citation and the Source. Both must be protected against + against the user trying to edit them twice. + + What we do here is to derive the window key from the Source object, if + one exists. A Citation always points to exactly one Source object, so if + we try to edit the same Citation twice, the associated Source objects + will be the same so this will be prevented. If we try to edit a Source + object and a Citation object that refers to the same Source, then again, + the window key will be the same and this will be prevented. + """ + if obj and obj.get_reference_handle(): + # citation already points to source + return obj.get_reference_handle() + elif self.source and self.source.get_handle(): + # Citation doesn't yet point to source, but source exists and has a + # handle + return self.source.get_handle() + else: + return id(self) + def empty_object(self): """ Return an empty Citation object for comparison for changes. @@ -181,7 +212,6 @@ class EditCitation(EditPrimary): """Connects any signals that need to be connected. Called by the init routine of the base class L{EditPrimary}. - """ self.define_ok_button(self.glade.get_object('ok'), self.save) self.define_cancel_button(self.glade.get_object('cancel')) @@ -191,7 +221,19 @@ class EditCitation(EditPrimary): """ Connect any signals that need to be connected. Called by the init routine of the base class (_EditPrimary). + + What this code does is to check that the object edited is not deleted + whilst editing it. If the object is deleted we need to close the editor + windows and clean up. If the database emits a rebuild signal for the + database object type we also abort the edit. + + The Citation editor edits two primary objects, and therefore we need to + check if either have been deleted. If the source is deleted, the + citation must have been deleted first and will emit a signal, so we + shouldn't have to connect to the source-delete signal. It should not be + necessary to connect to the source- rebuild signal for similar reasons. """ + # FIXME: Should this be modified so that the 'close' routines # are executed not only for the 'Citation', bit also for the 'Source' self._add_db_signal('citation-rebuild', self._do_close) diff --git a/src/gui/grampsgui.py b/src/gui/grampsgui.py index 067d5551d..6de4c589f 100644 --- a/src/gui/grampsgui.py +++ b/src/gui/grampsgui.py @@ -151,6 +151,7 @@ def register_stock_icons (): ('gramps-zoom-out', _('Zoom Out'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-zoom-fit-width', _('Fit Width'), gtk.gdk.CONTROL_MASK, 0, ''), ('gramps-zoom-best-fit', _('Fit Page'), gtk.gdk.CONTROL_MASK, 0, ''), + ('gramps-citation', _('Citations'), gtk.gdk.CONTROL_MASK, 0, ''), ] # the following icons are not yet in new directory structure # they should be ported in the near future diff --git a/src/images/16x16/Makefile.am b/src/images/16x16/Makefile.am index 39bbef0b2..cb0601126 100644 --- a/src/images/16x16/Makefile.am +++ b/src/images/16x16/Makefile.am @@ -19,6 +19,7 @@ dist_pkgdata_DATA = \ gramps-bookmark-edit.png \ gramps-bookmark-new.png \ gramps-bookmark.png \ + gramps-citation.png \ gramps-config.png \ gramps-date.png \ gramps-date-edit.png \ diff --git a/src/images/16x16/gramps-citation.png b/src/images/16x16/gramps-citation.png new file mode 100644 index 0000000000000000000000000000000000000000..040991f49f19a69a434313e82d923fafec4b8537 GIT binary patch literal 3554 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 literal 0 HcmV?d00001 diff --git a/src/images/22x22/Makefile.am b/src/images/22x22/Makefile.am index ed93a36c1..ed9db1b09 100644 --- a/src/images/22x22/Makefile.am +++ b/src/images/22x22/Makefile.am @@ -19,6 +19,7 @@ dist_pkgdata_DATA = \ gramps-bookmark-edit.png \ gramps-bookmark-new.png \ gramps-bookmark.png \ + gramps-citation.png \ gramps-config.png \ gramps-date-edit.png \ gramps-date.png \ diff --git a/src/images/22x22/gramps-citation.png b/src/images/22x22/gramps-citation.png new file mode 100644 index 0000000000000000000000000000000000000000..8527b728efc44503a50be35123dd67d0473a8de7 GIT binary patch literal 4264 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 KMNUMnLSTYtAM=_3 literal 0 HcmV?d00001 diff --git a/src/images/48x48/Makefile.am b/src/images/48x48/Makefile.am index dd5c5da37..04b295f28 100644 --- a/src/images/48x48/Makefile.am +++ b/src/images/48x48/Makefile.am @@ -19,6 +19,7 @@ dist_pkgdata_DATA = \ gramps-bookmark-edit.png \ gramps-bookmark-new.png \ gramps-bookmark.png \ + gramps-citation.png \ gramps-config.png \ gramps-date-edit.png \ gramps-date.png \ diff --git a/src/images/48x48/gramps-citation.png b/src/images/48x48/gramps-citation.png new file mode 100644 index 0000000000000000000000000000000000000000..509bdc20166a7843ee8f7879f62bbe4a0493ee2f GIT binary patch literal 7282 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 M07*qoM6N<$f}{5~w*UYD literal 0 HcmV?d00001 diff --git a/src/images/scalable/Makefile.am b/src/images/scalable/Makefile.am index 5b5d57e72..169864035 100644 --- a/src/images/scalable/Makefile.am +++ b/src/images/scalable/Makefile.am @@ -19,6 +19,7 @@ dist_pkgdata_DATA = \ gramps-bookmark-edit.svg \ gramps-bookmark-new.svg \ gramps-bookmark.svg \ + gramps-citation.png \ gramps-config.svg \ gramps-date-edit.svg \ gramps-date.svg \ diff --git a/src/images/scalable/gramps-citation.png b/src/images/scalable/gramps-citation.png new file mode 100644 index 0000000000000000000000000000000000000000..1a597e8237c13824ddde5c76dd23a3e03a13e67d GIT binary patch literal 83322 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 literal 0 HcmV?d00001 diff --git a/src/plugins/lib/libcitationview.py b/src/plugins/lib/libcitationview.py deleted file mode 100644 index ae07a5d2f..000000000 --- a/src/plugins/lib/libcitationview.py +++ /dev/null @@ -1,427 +0,0 @@ -# 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 -# 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$ - -""" -Citation View -""" -#------------------------------------------------------------------------- -# -# python modules -# -#------------------------------------------------------------------------- -import logging -LOG = logging.getLogger(".citation") - -#------------------------------------------------------------------------- -# -# GTK/Gnome modules -# -#------------------------------------------------------------------------- -import gtk - -#------------------------------------------------------------------------- -# -# gramps modules -# -#------------------------------------------------------------------------- -import gen.lib -from gui.views.listview import ListView -import Utils -import Bookmarks -import Errors -from DdTargets import DdTargets -from QuestionDialog import ErrorDialog -from gui.editors import EditCitation, DeleteCitationQuery, EditSource, \ - DeleteSrcQuery -from Filters.SideBar import SourceSidebarFilter - -#------------------------------------------------------------------------- -# -# internationalization -# -#------------------------------------------------------------------------- -from gen.ggettext import gettext as _ - -#------------------------------------------------------------------------- -# -# CitationView -# -#------------------------------------------------------------------------- -class BaseCitationView(ListView): - """ citation listview class - """ - # The configuration parameters have been moved to CitationTreeView and - # CitationListView, because they differ for the two different views. - - def __init__(self, pdata, dbstate, uistate, title, model, signal_map, - nav_group=0): - - ListView.__init__( - self, title, pdata, dbstate, uistate, - self.COLUMN_NAMES, len(self.COLUMN_NAMES), - model, signal_map, - dbstate.db.get_citation_bookmarks(), - Bookmarks.CitationBookmarks, nav_group, - multiple=True, - filter_class=SourceSidebarFilter) - - self.func_list.update({ - 'J' : self.jump, - 'BackSpace' : self.key_delete, - }) - - self.additional_uis.append(self.additional_ui()) - - def navigation_type(self): - return 'Citation' - - def get_bookmarks(self): - return self.dbstate.db.get_citation_bookmarks() - - def drag_info(self): - 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) - -# 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") - - self._add_action('FilterEdit', None, _('Citation Filter Editor'), - callback=self.filter_editor,) - self._add_action('QuickReport', None, _("Quick View"), None, None, None) - self._add_action('Dummy', None, ' ', None, None, self.dummy_report) - - self._add_action_group(self.edit_action) - self._add_action_group(self.all_action) - - def get_stock(self): - 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 ''' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ''' - - def dummy_report(self, obj): - """ For the xml UI definition of popup to work, the submenu - Quick Report must have an entry in the xml - As this submenu will be dynamically built, we offer a dummy action - """ - 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: 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. - """ - try: - EditCitation(self.dbstate, self.uistate, [], gen.lib.Citation(), - gen.lib.Source()) - except Errors.WindowActiveError: - pass - - 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 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): - """ - Edit either a Source or a Citation, depending on user selection - """ - 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)) - try: - EditCitation(self.dbstate, self.uistate, [], citation) - except Errors.WindowActiveError: - pass - else: - LOG.debug("source handle %s title %s " % - (source, source.title)) - EditSource(self.dbstate, self.uistate, [], source) - - def __blocked_text(self): - """ - Return the common text used when citation cannot be edited - """ - return _("This citation cannot be edited at this time. " - "Either the associated citation is already being " - "edited or another object that is associated with " - "the same citation is being edited.\n\nTo edit this " - "citation, you need to close the object.") - - def merge(self, obj): - """ - Merge the selected citations. - """ - mlist = self.selected_handles() - - 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) - else: - 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) - if obj: - return obj.get_handle() - else: - return None - - def get_default_gramplets(self): - """ - Define the default gramplets for the sidebar and bottombar. - This is overridden for the tree view to give 'Source Filter' - """ - return (("Citation Filter",), - ("Citation Gallery", - "Citation Notes", - "Citation Backlinks")) diff --git a/src/plugins/sidebar/categorysidebar.py b/src/plugins/sidebar/categorysidebar.py index 977f4d92a..96ea892f6 100644 --- a/src/plugins/sidebar/categorysidebar.py +++ b/src/plugins/sidebar/categorysidebar.py @@ -69,7 +69,9 @@ CATEGORY_ICON = { 'Sources': 'gramps-source', 'Repositories': 'gramps-repository', 'Media': 'gramps-media', - 'Notes': 'gramps-notes'} + 'Notes': 'gramps-notes', + 'Citations': 'gramps-citation', +} #------------------------------------------------------------------------- # diff --git a/src/plugins/view/citationlistview.py b/src/plugins/view/citationlistview.py index aac842892..bf4e9b95c 100644 --- a/src/plugins/view/citationlistview.py +++ b/src/plugins/view/citationlistview.py @@ -25,14 +25,37 @@ Citation List View """ +#------------------------------------------------------------------------- +# +# python modules +# +#------------------------------------------------------------------------- +import logging +LOG = logging.getLogger(".citation") + +#------------------------------------------------------------------------- +# +# GTK/Gnome modules +# +#------------------------------------------------------------------------- +import gtk + #------------------------------------------------------------------------- # # gramps modules # #------------------------------------------------------------------------- -from libcitationview import BaseCitationView from gui.views.treemodels.citationlistmodel import CitationListModel from gen.plug import CATEGORY_QR_SOURCE +import gen.lib +from gui.views.listview import ListView +import Utils +import Bookmarks +import Errors +from DdTargets import DdTargets +from QuestionDialog import ErrorDialog +from gui.editors import EditCitation, DeleteCitationQuery +from Filters.SideBar import CitationSidebarFilter #------------------------------------------------------------------------- # @@ -47,7 +70,7 @@ from gen.ggettext import gettext as _ # CitationView # #------------------------------------------------------------------------- -class CitationListView(BaseCitationView): +class CitationListView(ListView): """ A list view of citations. @@ -69,7 +92,7 @@ class CitationListView(BaseCitationView): COL_SRC_CHAN = 10 # name of the columns COLUMN_NAMES = [ - _('Title/Page'), + _('Volume/Page'), _('ID'), _('Date'), _('Confidence'), @@ -93,8 +116,6 @@ class CitationListView(BaseCitationView): 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") DEL_MSG = _("Delete the selected citation") MERGE_MSG = _("Merge the selected citations") @@ -110,8 +131,225 @@ class CitationListView(BaseCitationView): 'citation-rebuild' : self.object_build, } - BaseCitationView.__init__(self, pdata, dbstate, uistate, - _('Citation View'), CitationListModel, - signal_map, - nav_group=nav_group) + ListView.__init__( + self, _('Citation View'), pdata, dbstate, uistate, + self.COLUMN_NAMES, len(self.COLUMN_NAMES), + CitationListModel, signal_map, + dbstate.db.get_citation_bookmarks(), + Bookmarks.CitationBookmarks, nav_group, + multiple=True, + filter_class=CitationSidebarFilter) + self.func_list.update({ + 'J' : self.jump, + 'BackSpace' : self.key_delete, + }) + + self.additional_uis.append(self.additional_ui()) + + def navigation_type(self): + return 'Citation' + + def get_bookmarks(self): + return self.dbstate.db.get_citation_bookmarks() + + def drag_info(self): + return DdTargets.CITATION_LINK + + def define_actions(self): + """ + This defines the possible actions for the citation views. + Possible actions are: + 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) + edit: Edit a citation. + merge: Merge the selected citations. + remove: Delete the selected citations. + + + """ + ListView.define_actions(self) + + self.all_action = gtk.ActionGroup(self.title + "/CitationAll") + self.edit_action = gtk.ActionGroup(self.title + "/CitationEdit") + + self._add_action('FilterEdit', None, _('Citation Filter Editor'), + callback=self.filter_editor,) + self._add_action('QuickReport', None, _("Quick View"), None, None, None) + self._add_action('Dummy', None, ' ', None, None, self.dummy_report) + + self._add_action_group(self.edit_action) + self._add_action_group(self.all_action) + + def get_stock(self): + return 'gramps-citation' + + def additional_ui(self): + """ + Defines the UI string for UIManager + """ + return ''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ''' + + def dummy_report(self, obj): + """ For the xml UI definition of popup to work, the submenu + Quick Report must have an entry in the xml + As this submenu will be dynamically built, we offer a dummy action + """ + pass + + def add(self, obj): + """ + 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 + EditCitation editor with the new source and new citation. + + 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. + """ + try: + EditCitation(self.dbstate, self.uistate, [], gen.lib.Citation(), + gen.lib.Source()) + except Errors.WindowActiveError: + pass + + 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) + + def edit(self, obj): + """ + Edit a Citation + """ + for handle in self.selected_handles(): + citation = self.dbstate.db.get_citation_from_handle(handle) + try: + EditCitation(self.dbstate, self.uistate, [], citation) + except Errors.WindowActiveError: + pass + + def __blocked_text(self): + """ + Return the common text used when citation cannot be edited + """ + return _("This citation cannot be edited at this time. " + "Either the associated citation is already being " + "edited or another object that is associated with " + "the same citation is being edited.\n\nTo edit this " + "citation, you need to close the object.") + + def merge(self, obj): + """ + Merge the selected citations. + """ + mlist = self.selected_handles() + + 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) + else: + citation1 = self.dbstate.db.get_citation_from_handle(mlist[0]) + citation2 = self.dbstate.db.get_citation_from_handle(mlist[1]) + 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]) + + def get_handle_from_gramps_id(self, gid): + obj = self.dbstate.db.get_citation_from_gramps_id(gid) + if obj: + return obj.get_handle() + else: + return None + + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + This is overridden for the tree view to give 'Source Filter' + """ + return (("Citation Filter",), + ("Citation Gallery", + "Citation Notes", + "Citation Backlinks")) diff --git a/src/plugins/view/citationtreeview.py b/src/plugins/view/citationtreeview.py index 75fff2772..219593a59 100644 --- a/src/plugins/view/citationtreeview.py +++ b/src/plugins/view/citationtreeview.py @@ -21,7 +21,8 @@ # $Id$ """ -Citation Tree View +Citation Tree View (or Source tree view). +A view showing all the Sources with child Citations """ #------------------------------------------------------------------------- # @@ -31,15 +32,31 @@ Citation Tree View import logging LOG = logging.getLogger(".citation") +#------------------------------------------------------------------------- +# +# GTK/Gnome modules +# +#------------------------------------------------------------------------- +import gtk + #------------------------------------------------------------------------- # # Gramps modules # #------------------------------------------------------------------------- from gui.views.listview import LISTTREE -from libcitationview import BaseCitationView from gui.views.treemodels.citationtreemodel import CitationTreeModel from gen.plug import CATEGORY_QR_SOURCE +import gen.lib +from gui.views.listview import ListView +import Utils +import Bookmarks +import Errors +from DdTargets import DdTargets +from QuestionDialog import ErrorDialog +from gui.editors import EditCitation, DeleteCitationQuery, EditSource, \ + DeleteSrcQuery +from Filters.SideBar import SourceSidebarFilter #------------------------------------------------------------------------- # @@ -53,9 +70,9 @@ from gen.ggettext import gettext as _ # PlaceTreeView # #------------------------------------------------------------------------- -class CitationTreeView(BaseCitationView): +class CitationTreeView(ListView): """ - A hierarchical view of the top three levels of places. + A hierarchical view of sources with citations below them. """ # The data items here have to correspond, in order, to the items in # src/giu.views/treemodels/citationtreemodel.py @@ -69,7 +86,7 @@ class CitationTreeView(BaseCitationView): COL_SRC_PINFO = 7 # name of the columns COLUMN_NAMES = [ - _('Title/Page'), + _('Title or Page'), _('ID'), _('Date'), _('Confidence'), @@ -80,12 +97,12 @@ class CitationTreeView(BaseCitationView): ] # default setting with visible columns, order of the col, and their size CONFIGSETTINGS = ( - ('columns.visible', [COL_TITLE_PAGE, COL_ID, COL_DATE, - COL_CONFIDENCE]), + ('columns.visible', [COL_TITLE_PAGE, COL_ID, COL_SRC_AUTH, + COL_SRC_PINFO]), ('columns.rank', [COL_TITLE_PAGE, COL_ID, COL_DATE, COL_CONFIDENCE, COL_CHAN, COL_SRC_AUTH, COL_SRC_ABBR, COL_SRC_PINFO]), - ('columns.size', [200, 75, 100, 100, 100, 75, 100, 150]) + ('columns.size', [200, 75, 100, 75, 100, 150, 100, 150]) ) ADD_MSG = _("Add a new citation and a new source") ADD_SOURCE_MSG = _("Add a new source") @@ -109,17 +126,40 @@ class CitationTreeView(BaseCitationView): 'source-rebuild' : self.object_build, } - BaseCitationView.__init__(self, pdata, dbstate, uistate, - _('Citation Tree View'), CitationTreeModel, - signal_map, - nav_group=nav_group) + ListView.__init__( + self, _('Citation Tree View'), pdata, dbstate, uistate, + self.COLUMN_NAMES, len(self.COLUMN_NAMES), + CitationTreeModel, signal_map, + dbstate.db.get_citation_bookmarks(), + Bookmarks.CitationBookmarks, nav_group, + multiple=True, + filter_class=SourceSidebarFilter) + self.func_list.update({ + 'J' : self.jump, + 'BackSpace' : self.key_delete, + }) + + self.additional_uis.append(self.additional_ui()) + + def navigation_type(self): + return 'Citation' + + def get_bookmarks(self): + return self.dbstate.db.get_citation_bookmarks() + + def drag_info(self): + return DdTargets.SOURCE_LINK + def type_list(self): """ set the listtype, this governs eg keybinding """ return LISTTREE + def get_stock(self): + return 'gramps-citation' + def get_viewtype_stock(self): """ Override the default icon. Set for hierarchical view. @@ -128,9 +168,43 @@ class CitationTreeView(BaseCitationView): def define_actions(self): """ - Define actions for the popup menu specific to the tree view. + 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. + + """ - BaseCitationView.define_actions(self) + ListView.define_actions(self) + + 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-citation', + _("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") + + self._add_action('FilterEdit', None, _('Citation Filter Editor'), + callback=self.filter_editor,) + self._add_action('QuickReport', None, _("Quick View"), None, None, None) + self._add_action('Dummy', None, ' ', None, None, self.dummy_report) + + self._add_action_group(self.edit_action) + self._add_action_group(self.all_action) self.all_action.add_actions([ ('OpenAllNodes', None, _("Expand all Nodes"), None, None, @@ -206,3 +280,228 @@ class CitationTreeView(BaseCitationView): ''' + def dummy_report(self, obj): + """ For the xml UI definition of popup to work, the submenu + Quick Report must have an entry in the xml + As this submenu will be dynamically built, we offer a dummy action + """ + 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: 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. + """ + try: + EditCitation(self.dbstate, self.uistate, [], gen.lib.Citation(), + gen.lib.Source()) + except Errors.WindowActiveError: + pass + + 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 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): + """ + Edit either a Source or a Citation, depending on user selection + """ + 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: + try: + EditCitation(self.dbstate, self.uistate, [], citation) + except Errors.WindowActiveError: + pass + else: # FIXME need try block here + try: + EditSource(self.dbstate, self.uistate, [], source) + except Errors.WindowActiveError: + from QuestionDialog import WarningDialog + WarningDialog(_("Cannot share this reference"), + self.__blocked_text2()) + + def __blocked_text(self): + """ + Return the common text used when citation cannot be edited + """ + return _("This citation cannot be created at this time. " + "Either the associated Source object is already being " + "edited, or another citation associated with the same " + "source is being edited.\n\nTo edit this " + "citation, you need to close the object.") + + def __blocked_text2(self): + """ + Return the common text used when citation cannot be edited + """ + return _("This source cannot be edited at this time. " + "Either the associated Source object is already being " + "edited, or another citation associated with the same " + "source is being edited.\n\nTo edit this " + "source, you need to close the object.") + + def merge(self, obj): + """ + Merge the selected citations. + """ + mlist = self.selected_handles() + + 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) + else: + 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) + if obj: + return obj.get_handle() + else: + return None + + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Source Filter",), + ("Citation Gallery", + "Citation Notes", + "Citation Backlinks")) diff --git a/src/plugins/view/view.gpr.py b/src/plugins/view/view.gpr.py index ffa409613..21884309a 100644 --- a/src/plugins/view/view.gpr.py +++ b/src/plugins/view/view.gpr.py @@ -197,20 +197,21 @@ viewclass = 'RepositoryView', order = START, ) -register(VIEW, -id = 'sourceview', -name = _("Source View"), -description = _("The view showing all the sources"), -version = '1.0', -gramps_target_version = '3.4', -status = STABLE, -fname = 'sourceview.py', -authors = [u"The Gramps project"], -authors_email = ["http://gramps-project.org"], -category = ("Sources", _("Sources")), -viewclass = 'SourceView', -order = START, - ) +# FIXME: REDUNDANT As of gramps 3.4, sourceview.py is redundant. +#register(VIEW, +#id = 'sourceview', +#name = _("Source View"), +#description = _("The view showing all the sources"), +#version = '1.0', +#gramps_target_version = '3.4', +#status = STABLE, +#fname = 'sourceview.py', +#authors = [u"The Gramps project"], +#authors_email = ["http://gramps-project.org"], +#category = ("Sources", _("Sources")), +#viewclass = 'SourceView', +#order = START, +# ) register(VIEW, id = 'citationlistview', @@ -237,8 +238,7 @@ status = STABLE, fname = 'citationtreeview.py', authors = [u"Tim G L Lyons", u"Nick Hall"], authors_email = [""], -category = ("Citations", _("Citations")), +category = ("Sources", _("Sources")), viewclass = 'CitationTreeView', -stock_icon = 'gramps-tree-group', order = START, )