X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBibitem.cpp;h=829e15a52a22d642cc05dac70249dfa209adb3e4;hb=7fe51efeb8add4bed09207674fd538e4f0288ac2;hp=a3a970c280fcade3b3d48663c7474ba4e179a444;hpb=32871c1284f15265f652ff01c438e539a7c8181f;p=lyx.git diff --git a/src/insets/InsetBibitem.cpp b/src/insets/InsetBibitem.cpp index a3a970c280..829e15a52a 100644 --- a/src/insets/InsetBibitem.cpp +++ b/src/insets/InsetBibitem.cpp @@ -12,11 +12,15 @@ #include "InsetBibitem.h" +#include "Biblio.h" #include "Buffer.h" +#include "BufferParams.h" #include "BufferView.h" +#include "Counters.h" #include "DispatchResult.h" #include "FuncRequest.h" -#include "LyXFont.h" +#include "Font.h" +#include "InsetIterator.h" #include "Lexer.h" #include "Paragraph.h" #include "ParagraphList.h" @@ -39,7 +43,7 @@ int InsetBibitem::key_counter = 0; docstring const key_prefix = from_ascii("key-"); InsetBibitem::InsetBibitem(InsetCommandParams const & p) - : InsetCommand(p, "bibitem"), counter(1) + : InsetCommand(p, "bibitem") { if (getParam("key").empty()) setParam("key", key_prefix + convert(++key_counter)); @@ -49,7 +53,7 @@ InsetBibitem::InsetBibitem(InsetCommandParams const & p) auto_ptr InsetBibitem::doClone() const { auto_ptr b(new InsetBibitem(params())); - b->setCounter(counter); + b->autolabel_ = autolabel_; return auto_ptr(b); } @@ -62,7 +66,7 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd) InsetCommandParams p("bibitem"); InsetCommandMailer::string2params("bibitem", to_utf8(cmd.argument()), p); if (p.getCmdName().empty()) { - cur.noUpdate(); + cur.noUpdate(); break; } if (p["key"] != params()["key"]) @@ -78,12 +82,6 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd) } -void InsetBibitem::setCounter(int c) -{ - counter = c; -} - - void InsetBibitem::read(Buffer const & buf, Lexer & lex) { InsetCommand::read(buf, lex); @@ -98,7 +96,7 @@ void InsetBibitem::read(Buffer const & buf, Lexer & lex) docstring const InsetBibitem::getBibLabel() const { docstring const & label = getParam("label"); - return label.empty() ? convert(counter) : label; + return label.empty() ? autolabel_ : label; } @@ -109,10 +107,10 @@ docstring const InsetBibitem::getScreenLabel(Buffer const &) const int InsetBibitem::plaintext(Buffer const &, odocstream & os, - OutputParams const &) const + OutputParams const &) const { odocstringstream oss; - oss << '[' << getCounter() << "] "; + oss << '[' << getBibLabel() << "] "; docstring const str = oss.str(); os << str; @@ -131,25 +129,25 @@ docstring const bibitemWidest(Buffer const & buffer) // FIXME: this font is used unitialized for now but should be set to // a proportional font. Here is what Georg Baum has to say about it: /* - bibitemWidest() is supposed to find the bibitem with the widest label in the - output, because that is needed as an argument of the bibliography - environment to dtermine the correct indentation. To be 100% correct we - would need the metrics of the font that is used in the output, but usually + bibitemWidest() is supposed to find the bibitem with the widest label in the + output, because that is needed as an argument of the bibliography + environment to dtermine the correct indentation. To be 100% correct we + would need the metrics of the font that is used in the output, but usually we don't have access to these. - In practice, any proportional font is probably good enough, since we don't - need to know the final with, we only need to know the which label is the + In practice, any proportional font is probably good enough, since we don't + need to know the final with, we only need to know the which label is the widest. - Unless there is an easy way to get the metrics of the output font I suggest + Unless there is an easy way to get the metrics of the output font I suggest to use a hardcoded font like "Times" or so. - It is very important that the result of this function is the same both with - and without GUI. After thinking about this it is clear that no LyXFont - metrics should be used here, since these come from the gui. If we can't - easily get the LaTeX font metrics we should make our own poor mans front - metrics replacement, e.g. by hardcoding the metrics of the standard TeX + It is very important that the result of this function is the same both with + and without GUI. After thinking about this it is clear that no Font + metrics should be used here, since these come from the gui. If we can't + easily get the LaTeX font metrics we should make our own poor mans front + metrics replacement, e.g. by hardcoding the metrics of the standard TeX font. */ - LyXFont font; + Font font; ParagraphList::const_iterator it = buffer.paragraphs().begin(); ParagraphList::const_iterator end = buffer.paragraphs().end(); @@ -157,16 +155,16 @@ docstring const bibitemWidest(Buffer const & buffer) for (; it != end; ++it) { if (it->bibitem()) { docstring const label = it->bibitem()->getBibLabel(); - + // FIXME: we can't be sure using the following that the GUI - // version and the command-line version will give the same + // version and the command-line version will give the same // result. // //int const wx = use_gui? // theFontMetrics(font).width(label): label.size(); // // So for now we just use the label size in order to be sure - // that GUI and no-GUI gives the same bibitem (even if that is + // that GUI and no-GUI gives the same bibitem (even if that is // potentially the wrong one. int const wx = label.size(); @@ -184,4 +182,32 @@ docstring const bibitemWidest(Buffer const & buffer) } +void InsetBibitem::fillWithBibKeys(Buffer const & buf, + biblio::BibKeyList & keys, InsetIterator const & it) const +{ + string const key = to_utf8(getParam("key")); + biblio::BibTeXInfo keyvalmap; + keyvalmap[from_ascii("label")] = getParam("label"); + DocIterator doc_it(it); + doc_it.forwardPos(); + keyvalmap [from_ascii("ref")] = doc_it.paragraph().asString(buf, false); + keyvalmap.isBibTeX = false; + keys[key] = keyvalmap; +} + + +/// Update the counters of this inset and of its contents +void InsetBibitem::updateLabels(Buffer const &buf, ParIterator const &) +{ + Counters & counters = buf.params().getTextClass().counters(); + docstring const bibitem = from_ascii("bibitem"); + if (counters.hasCounter(bibitem) && getParam("label").empty()) { + counters.step(bibitem); + autolabel_ = counters.theCounter(bibitem); + } else + autolabel_ = from_ascii("??"); + refresh(); +} + + } // namespace lyx