Fix bug #9131 for stable branch. The real problem lies

elsewhere, but it will require major surgery and, more
importantly, a file format change.
This commit is contained in:
Richard Heck 2014-05-23 10:59:12 -04:00
parent 5df89e5006
commit b128f3de14
7 changed files with 51 additions and 27 deletions

View File

@ -636,7 +636,8 @@ docstring const & BibTeXInfo::getInfo(BibTeXInfo const * const xref,
docstring const BibTeXInfo::getLabel(BibTeXInfo const * const xref, docstring const BibTeXInfo::getLabel(BibTeXInfo const * const xref,
Buffer const & buf, docstring const & format, bool richtext, 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; docstring loclabel;
@ -872,10 +873,19 @@ docstring const BiblioInfo::getInfo(docstring const & key,
} }
docstring const BiblioInfo::getLabel(vector<docstring> const & keys, docstring const BiblioInfo::getLabel(vector<docstring> keys,
Buffer const & buf, string const & style, bool richtext, Buffer const & buf, string const & style, bool for_xhtml,
docstring const & before, docstring const & after, docstring const & dialog) const 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(); CiteEngineType const engine_type = buf.params().citeEngineType();
DocumentClass const & dc = buf.params().documentClass(); DocumentClass const & dc = buf.params().documentClass();
docstring const & format = from_utf8(dc.getCiteFormat(engine_type, style, "cite")); 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); xrefptr = &(xrefit->second);
} }
} }
ret = data.getLabel(xrefptr, buf, ret, richtext, ret = data.getLabel(xrefptr, buf, ret, for_xhtml,
before, after, dialog, key+1 != ken); 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; return ret;
} }
@ -915,8 +934,8 @@ bool BiblioInfo::isBibtex(docstring const & key) const
vector<docstring> const BiblioInfo::getCiteStrings( vector<docstring> const BiblioInfo::getCiteStrings(
vector<docstring> const & keys, vector<CitationStyle> const & styles, vector<docstring> const & keys, vector<CitationStyle> const & styles,
Buffer const & buf, bool richtext, docstring const & before, Buffer const & buf, docstring const & before,
docstring const & after, docstring const & dialog) const docstring const & after, docstring const & dialog, size_t max_size) const
{ {
if (empty()) if (empty())
return vector<docstring>(); return vector<docstring>();
@ -925,7 +944,7 @@ vector<docstring> const BiblioInfo::getCiteStrings(
vector<docstring> vec(styles.size()); vector<docstring> vec(styles.size());
for (size_t i = 0; i != vec.size(); ++i) { for (size_t i = 0; i != vec.size(); ++i) {
style = styles[i].cmd; 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; return vec;

View File

@ -19,9 +19,9 @@
#include "Citation.h" #include "Citation.h"
#include <vector>
#include <map> #include <map>
#include <set> #include <set>
#include <vector>
namespace lyx { namespace lyx {
@ -67,7 +67,8 @@ public:
/// \return formatted BibTeX data for a citation label /// \return formatted BibTeX data for a citation label
docstring const getLabel(BibTeXInfo const * const xref, docstring const getLabel(BibTeXInfo const * const xref,
Buffer const & buf, docstring const & format, bool richtext, 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); } const_iterator find(docstring const & f) const { return bimap_.find(f); }
/// ///
@ -202,10 +203,9 @@ public:
bool richtext = false) const; bool richtext = false) const;
/// \return formatted BibTeX data for citation labels. /// \return formatted BibTeX data for citation labels.
/// Citation labels can have more than one key. /// Citation labels can have more than one key.
docstring const getLabel(std::vector<docstring> const & keys, docstring const getLabel(std::vector<docstring> keys,
Buffer const & buf, std::string const & style, bool richtext = false, Buffer const & buf, std::string const & style, bool for_xhtml,
docstring const & before = docstring(), size_t max_size, docstring const & before, docstring const & after,
docstring const & after = docstring(),
docstring const & dialog = docstring()) const; docstring const & dialog = docstring()) const;
/// Is this a reference from a bibtex database /// Is this a reference from a bibtex database
/// or from a bibliography environment? /// or from a bibliography environment?
@ -214,10 +214,9 @@ public:
/// list of keys, using either numerical or author-year style depending /// list of keys, using either numerical or author-year style depending
/// upon the active engine. /// upon the active engine.
std::vector<docstring> const getCiteStrings(std::vector<docstring> const & keys, std::vector<docstring> const getCiteStrings(std::vector<docstring> const & keys,
std::vector<CitationStyle> const & styles, Buffer const & buf, bool richtext = false, std::vector<CitationStyle> const & styles, Buffer const & buf,
docstring const & before = docstring(), docstring const & before, docstring const & after, docstring const & dialog,
docstring const & after = docstring(), size_t max_size) const;
docstring const & dialog = docstring()) const;
/// Collects the cited entries from buf. /// Collects the cited entries from buf.
void collectCitedEntries(Buffer const & buf); void collectCitedEntries(Buffer const & buf);
/// A list of BibTeX keys cited in the current document, sorted by /// A list of BibTeX keys cited in the current document, sorted by

View File

@ -250,7 +250,8 @@ void GuiCitation::updateStyles(BiblioInfo const & bi)
if (!selectedLV->selectionModel()->selectedIndexes().empty()) if (!selectedLV->selectionModel()->selectedIndexes().empty())
curr = selectedLV->selectionModel()->selectedIndexes()[0].row(); 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()) { if (sty.isEmpty()) {
// some error // 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 before = qstring_to_ucs4(textBeforeED->text());
docstring const after = qstring_to_ucs4(textAfterED->text()); docstring const after = qstring_to_ucs4(textAfterED->text());
@ -595,7 +596,7 @@ QStringList GuiCitation::citationStyles(BiblioInfo const & bi)
vector<CitationStyle> styles = citeStyles_; vector<CitationStyle> styles = citeStyles_;
// FIXME: pass a dictionary instead of individual before, after, dialog, etc. // FIXME: pass a dictionary instead of individual before, after, dialog, etc.
vector<docstring> ret = bi.getCiteStrings(keys, styles, documentBuffer(), 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); return to_qstring_list(ret);
} }

View File

@ -123,7 +123,7 @@ private:
); );
/// List of example cite strings /// 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. /// Set the Params variable for the Controller.
void apply(int const choice, bool const full, bool const force, void apply(int const choice, bool const full, bool const force,

View File

@ -1554,9 +1554,10 @@ void MenuDefinition::expandCiteStyles(BufferView const * bv)
vector<docstring> const keys = getVectorFromString(key); vector<docstring> const keys = getVectorFromString(key);
vector<CitationStyle> const citeStyleList = buf->params().citeStyles(); vector<CitationStyle> const citeStyleList = buf->params().citeStyles();
static const size_t max_length = 40;
vector<docstring> citeStrings = vector<docstring> citeStrings =
buf->masterBibInfo().getCiteStrings(keys, citeStyleList, bv->buffer(), 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 cit = citeStrings.begin();
vector<docstring>::const_iterator end = citeStrings.end(); vector<docstring>::const_iterator end = citeStrings.end();

View File

@ -33,6 +33,7 @@
#include "support/lstrings.h" #include "support/lstrings.h"
#include <algorithm> #include <algorithm>
#include <climits>
using namespace std; using namespace std;
using namespace lyx::support; using namespace lyx::support;
@ -273,8 +274,8 @@ docstring InsetCitation::complexLabel(bool for_xhtml) const
buffer().params().documentClass().addCiteMacro("!textafter", to_utf8(after)); buffer().params().documentClass().addCiteMacro("!textafter", to_utf8(after));
*/ */
docstring label; docstring label;
vector<docstring> const keys = getVectorFromString(key); vector<docstring> keys = getVectorFromString(key);
label = biblist.getLabel(keys, buffer(), cite_type, for_xhtml, before, after); label = biblist.getLabel(keys, buffer(), cite_type, for_xhtml, UINT_MAX, before, after);
return label; return label;
} }

View File

@ -119,7 +119,10 @@ What's new
- Make selection by mouse drag more reliable in mathed (bug 9074). - Make selection by mouse drag more reliable in mathed (bug 9074).
- Fix undo with many individual changes (e.g. with replace all) - 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. - Do not spellcheck "code" style in logical markup module.