commit b128f3de145fdf439ae3c8a9bad182fee0078a03
Author: Richard Heck <rgh...@lyx.org>
Date:   Fri May 23 10:59:12 2014 -0400

    Fix bug #9131 for stable branch. The real problem lies
    elsewhere, but it will require major surgery and, more
    importantly, a file format change.

diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp
index a50a865..ddd2486 100644
--- a/src/BiblioInfo.cpp
+++ b/src/BiblioInfo.cpp
@@ -636,7 +636,8 @@ docstring const & BibTeXInfo::getInfo(BibTeXInfo const * 
const xref,
 
 docstring const BibTeXInfo::getLabel(BibTeXInfo const * const xref,
        Buffer const & buf, docstring const & format, bool richtext,
-       docstring before, docstring after, docstring dialog, bool next) const
+       docstring const & before, docstring const & after,
+       docstring const & dialog, bool next) const
 {
        docstring loclabel;
 
@@ -872,10 +873,19 @@ docstring const BiblioInfo::getInfo(docstring const & key,
 }
 
 
-docstring const BiblioInfo::getLabel(vector<docstring> const & keys,
-       Buffer const & buf, string const & style, bool richtext,
-       docstring const & before, docstring const & after, docstring const & 
dialog) const
+docstring const BiblioInfo::getLabel(vector<docstring> keys,
+       Buffer const & buf, string const & style, bool for_xhtml,
+       size_t max_size, docstring const & before, docstring const & after,
+       docstring const & dialog) const
 {
+       // shorter makes no sense
+       LASSERT(max_size >= 16, max_size = 16);
+
+       // we can't display more than 10 of these, anyway
+       bool const too_many_keys = keys.size() > 10;
+       if (too_many_keys)
+               keys.resize(10);
+
        CiteEngineType const engine_type = buf.params().citeEngineType();
        DocumentClass const & dc = buf.params().documentClass();
        docstring const & format = from_utf8(dc.getCiteFormat(engine_type, 
style, "cite"));
@@ -897,8 +907,17 @@ docstring const BiblioInfo::getLabel(vector<docstring> 
const & keys,
                                        xrefptr = &(xrefit->second);
                        }
                }
-               ret = data.getLabel(xrefptr, buf, ret, richtext,
-                       before, after, dialog, key+1 != ken);
+               ret = data.getLabel(xrefptr, buf, ret, for_xhtml,
+                       before, after, dialog, key + 1 != ken);
+       }
+
+       if (ret.size() > max_size) {
+               ret.resize(max_size - 3);
+               ret += "...";
+       } else if (too_many_keys) {
+               if (ret.size() > max_size - 3)
+                       ret.resize(max_size - 3);
+               ret += "...";
        }
        return ret;
 }
@@ -915,8 +934,8 @@ bool BiblioInfo::isBibtex(docstring const & key) const
 
 vector<docstring> const BiblioInfo::getCiteStrings(
        vector<docstring> const & keys, vector<CitationStyle> const & styles,
-       Buffer const & buf, bool richtext, docstring const & before,
-       docstring const & after, docstring const & dialog) const
+       Buffer const & buf, docstring const & before,
+       docstring const & after, docstring const & dialog, size_t max_size) 
const
 {
        if (empty())
                return vector<docstring>();
@@ -925,7 +944,7 @@ vector<docstring> const BiblioInfo::getCiteStrings(
        vector<docstring> vec(styles.size());
        for (size_t i = 0; i != vec.size(); ++i) {
                style = styles[i].cmd;
-               vec[i] = getLabel(keys, buf, style, richtext, before, after, 
dialog);
+               vec[i] = getLabel(keys, buf, style, false, max_size, before, 
after, dialog);
        }
 
        return vec;
diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h
index 1bd428c..31c2b54 100644
--- a/src/BiblioInfo.h
+++ b/src/BiblioInfo.h
@@ -19,9 +19,9 @@
 
 #include "Citation.h"
 
-#include <vector>
 #include <map>
 #include <set>
+#include <vector>
 
 
 namespace lyx {
@@ -67,7 +67,8 @@ public:
        /// \return formatted BibTeX data for a citation label
        docstring const getLabel(BibTeXInfo const * const xref,
                Buffer const & buf, docstring const & format, bool richtext,
-               docstring before, docstring after, docstring dialog, bool next 
= false) const;
+               const docstring & before, const docstring & after,
+               const docstring & dialog, bool next = false) const;
        ///
        const_iterator find(docstring const & f) const { return bimap_.find(f); 
}
        ///
@@ -202,10 +203,9 @@ public:
                        bool richtext = false) const;
        /// \return formatted BibTeX data for citation labels.
        /// Citation labels can have more than one key.
-       docstring const getLabel(std::vector<docstring> const & keys,
-               Buffer const & buf, std::string const & style, bool richtext = 
false,
-               docstring const & before = docstring(),
-               docstring const & after = docstring(),
+       docstring const getLabel(std::vector<docstring> keys,
+               Buffer const & buf, std::string const & style, bool for_xhtml,
+               size_t max_size, docstring const & before, docstring const & 
after,
                docstring const & dialog = docstring()) const;
        /// Is this a reference from a bibtex database
        /// or from a bibliography environment?
@@ -214,10 +214,9 @@ public:
        /// list of keys, using either numerical or author-year style depending
        /// upon the active engine.
        std::vector<docstring> const getCiteStrings(std::vector<docstring> 
const & keys,
-               std::vector<CitationStyle> const & styles, Buffer const & buf, 
bool richtext = false,
-               docstring const & before = docstring(),
-               docstring const & after = docstring(),
-               docstring const & dialog = docstring()) const;
+               std::vector<CitationStyle> const & styles, Buffer const & buf,
+               docstring const & before, docstring const & after, docstring 
const & dialog,
+         size_t max_size) const;
        /// Collects the cited entries from buf.
        void collectCitedEntries(Buffer const & buf);
        /// A list of BibTeX keys cited in the current document, sorted by
diff --git a/src/frontends/qt4/GuiCitation.cpp 
b/src/frontends/qt4/GuiCitation.cpp
index 84c9c82..1afc9b7 100644
--- a/src/frontends/qt4/GuiCitation.cpp
+++ b/src/frontends/qt4/GuiCitation.cpp
@@ -250,7 +250,8 @@ void GuiCitation::updateStyles(BiblioInfo const & bi)
        if (!selectedLV->selectionModel()->selectedIndexes().empty())
                curr = selectedLV->selectionModel()->selectedIndexes()[0].row();
 
-       QStringList sty = citationStyles(bi);
+       static const size_t max_length = 80;
+       QStringList sty = citationStyles(bi, max_length);
 
        if (sty.isEmpty()) {
                // some error
@@ -587,7 +588,7 @@ void GuiCitation::findKey(BiblioInfo const & bi,
 }
 
 
-QStringList GuiCitation::citationStyles(BiblioInfo const & bi)
+QStringList GuiCitation::citationStyles(BiblioInfo const & bi, size_t max_size)
 {
        docstring const before = qstring_to_ucs4(textBeforeED->text());
        docstring const after = qstring_to_ucs4(textAfterED->text());
@@ -595,7 +596,7 @@ QStringList GuiCitation::citationStyles(BiblioInfo const & 
bi)
        vector<CitationStyle> styles = citeStyles_;
        // FIXME: pass a dictionary instead of individual before, after, 
dialog, etc.
        vector<docstring> ret = bi.getCiteStrings(keys, styles, 
documentBuffer(),
-               false, before, after, from_utf8("dialog"));
+               before, after, from_utf8("dialog"), max_size);
        return to_qstring_list(ret);
 }
 
diff --git a/src/frontends/qt4/GuiCitation.h b/src/frontends/qt4/GuiCitation.h
index 36675d0..153c631 100644
--- a/src/frontends/qt4/GuiCitation.h
+++ b/src/frontends/qt4/GuiCitation.h
@@ -123,7 +123,7 @@ private:
                );
 
        /// List of example cite strings
-       QStringList citationStyles(BiblioInfo const & bi);
+       QStringList citationStyles(BiblioInfo const & bi, size_t max_size);
 
        /// Set the Params variable for the Controller.
        void apply(int const choice, bool const full, bool const force,
diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp
index 110121c..707251d 100644
--- a/src/frontends/qt4/Menus.cpp
+++ b/src/frontends/qt4/Menus.cpp
@@ -1554,9 +1554,10 @@ void MenuDefinition::expandCiteStyles(BufferView const * 
bv)
        vector<docstring> const keys = getVectorFromString(key);
 
        vector<CitationStyle> const citeStyleList = buf->params().citeStyles();
+       static const size_t max_length = 40;
        vector<docstring> citeStrings =
                buf->masterBibInfo().getCiteStrings(keys, citeStyleList, 
bv->buffer(),
-               false, before, after, from_utf8("dialog"));
+               before, after, from_utf8("dialog"), max_length);
 
        vector<docstring>::const_iterator cit = citeStrings.begin();
        vector<docstring>::const_iterator end = citeStrings.end();
diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp
index 96620c1..801fe4e 100644
--- a/src/insets/InsetCitation.cpp
+++ b/src/insets/InsetCitation.cpp
@@ -33,6 +33,7 @@
 #include "support/lstrings.h"
 
 #include <algorithm>
+#include <climits>
 
 using namespace std;
 using namespace lyx::support;
@@ -273,8 +274,8 @@ docstring InsetCitation::complexLabel(bool for_xhtml) const
        buffer().params().documentClass().addCiteMacro("!textafter", 
to_utf8(after));
        */
        docstring label;
-       vector<docstring> const keys = getVectorFromString(key);
-       label = biblist.getLabel(keys, buffer(), cite_type, for_xhtml, before, 
after);
+       vector<docstring> keys = getVectorFromString(key);
+       label = biblist.getLabel(keys, buffer(), cite_type, for_xhtml, 
UINT_MAX, before, after);
        return label;
 }
 
diff --git a/status.21x b/status.21x
index 01e9cf2..fd73622 100644
--- a/status.21x
+++ b/status.21x
@@ -119,7 +119,10 @@ What's new
 - Make selection by mouse drag more reliable in mathed (bug 9074).
 
 - Fix undo with many individual changes (e.g. with replace all)
-  (bug #7079).
+  (bug 7079).
+
+- Fix problem with display of citation information when a whole lot of
+  entries are cited at once (bug 9131).
 
 - Do not spellcheck "code" style in logical markup module.
 

Reply via email to