X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBibitem.cpp;h=f65899d89d7f390af33bdef273e2aafa0a092d10;hb=f756c0232943ed0f760b78eb6f3a53d16227ce2f;hp=2b282a3d910009a0e6ce2b96d240aca15440a9f2;hpb=39e79d8602920eefe36e898c9f415afb979521b2;p=lyx.git diff --git a/src/insets/InsetBibitem.cpp b/src/insets/InsetBibitem.cpp index 2b282a3d91..f65899d89d 100644 --- a/src/insets/InsetBibitem.cpp +++ b/src/insets/InsetBibitem.cpp @@ -12,11 +12,17 @@ #include "InsetBibitem.h" +#include "debug.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,22 +45,22 @@ 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)); } -auto_ptr InsetBibitem::doClone() const +auto_ptr InsetBibitem::doClone() const { auto_ptr b(new InsetBibitem(params())); - b->setCounter(counter); - return auto_ptr(b); + b->autolabel_ = autolabel_; + return auto_ptr(b); } -void InsetBibitem::doDispatch(LCursor & cur, FuncRequest & cmd) +void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd) { switch (cmd.action) { @@ -62,12 +68,12 @@ void InsetBibitem::doDispatch(LCursor & 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"]) cur.bv().buffer()->changeRefsIfUnique(params()["key"], - p["key"], InsetBase::CITE_CODE); + p["key"], Inset::CITE_CODE); setParams(p); } @@ -78,12 +84,6 @@ void InsetBibitem::doDispatch(LCursor & cur, FuncRequest & cmd) } -void InsetBibitem::setCounter(int c) -{ - counter = c; -} - - void InsetBibitem::read(Buffer const & buf, Lexer & lex) { InsetCommand::read(buf, lex); @@ -98,7 +98,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 +109,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 +131,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 +157,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 +184,33 @@ 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 & pit) +{ + lyxerr << "update! " << to_utf8(getParam("key")) << std::endl; + 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