3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Alejandro Aguilar Sierra
8 * Full author contact details are available in file CREDITS.
13 #include "insetbibitem.h"
16 #include "BufferView.h"
17 #include "dispatchresult.h"
18 #include "funcrequest.h"
21 #include "paragraph.h"
22 #include "ParagraphList.h"
24 #include "support/lstrings.h"
25 #include "support/std_ostream.h"
26 #include "support/convert.h"
29 using lyx::odocstream;
30 using lyx::support::prefixIs;
37 int InsetBibitem::key_counter = 0;
38 string const key_prefix = "key-";
40 InsetBibitem::InsetBibitem(InsetCommandParams const & p)
41 : InsetCommand(p, "bibitem"), counter(1)
43 if (getContents().empty())
44 setContents(key_prefix + convert<string>(++key_counter));
48 auto_ptr<InsetBase> InsetBibitem::doClone() const
50 auto_ptr<InsetBibitem> b(new InsetBibitem(params()));
51 b->setCounter(counter);
52 return auto_ptr<InsetBase>(b);
56 void InsetBibitem::doDispatch(LCursor & cur, FuncRequest & cmd)
60 case LFUN_INSET_MODIFY: {
61 InsetCommandParams p("bibitem");
62 InsetCommandMailer::string2params("bibitem", lyx::to_utf8(cmd.argument()), p);
63 if (p.getCmdName().empty()) {
67 if (p.getContents() != params().getContents())
68 cur.bv().buffer()->changeRefsIfUnique(params().getContents(),
69 p.getContents(), InsetBase::CITE_CODE);
74 InsetCommand::doDispatch(cur, cmd);
80 void InsetBibitem::setCounter(int c)
86 void InsetBibitem::read(Buffer const & buf, LyXLex & lex)
88 InsetCommand::read(buf, lex);
90 if (prefixIs(getContents(), key_prefix)) {
91 int const key = convert<int>(getContents().substr(key_prefix.length()));
92 key_counter = max(key_counter, key);
97 docstring const InsetBibitem::getBibLabel() const
100 return getOptions().empty() ?
101 convert<docstring>(counter) :
102 lyx::from_utf8(getOptions());
106 docstring const InsetBibitem::getScreenLabel(Buffer const &) const
109 return lyx::from_utf8(getContents()) + " [" + getBibLabel() + ']';
113 int InsetBibitem::plaintext(Buffer const &, odocstream & os,
114 OutputParams const &) const
116 os << '[' << getCounter() << "] ";
122 docstring const bibitemWidest(Buffer const & buffer)
126 InsetBibitem const * bitem = 0;
128 // FIXME: this font is used unitialized for now but should be set to
129 // a proportional font. Here is what Georg Baum has to say about it:
131 bibitemWidest() is supposed to find the bibitem with the widest label in the
132 output, because that is needed as an argument of the bibliography
133 environment to dtermine the correct indentation. To be 100% correct we
134 would need the metrics of the font that is used in the output, but usually
135 we don't have access to these.
136 In practice, any proportional font is probably good enough, since we don't
137 need to know the final with, we only need to know the which label is the
139 Unless there is an easy way to get the metrics of the output font I suggest
140 to use a hardcoded font like "Times" or so.
142 It is very important that the result of this function is the same both with
143 and without GUI. After thinking about this it is clear that no LyXFont
144 metrics should be used here, since these come from the gui. If we can't
145 easily get the LaTeX font metrics we should make our own poor mans front
146 metrics replacement, e.g. by hardcoding the metrics of the standard TeX
151 ParagraphList::const_iterator it = buffer.paragraphs().begin();
152 ParagraphList::const_iterator end = buffer.paragraphs().end();
154 for (; it != end; ++it) {
156 docstring const label = it->bibitem()->getBibLabel();
158 // FIXME: we can't be sure using the following that the GUI
159 // version and the command-line version will give the same
162 //int const wx = lyx::use_gui?
163 // theFontMetrics(font).width(label): label.size();
165 // So for now we just use the label size in order to be sure
166 // that GUI and no-GUI gives the same bibitem (even if that is
167 // potentially the wrong one.
168 int const wx = label.size();
172 bitem = it->bibitem();
177 if (bitem && !bitem->getBibLabel().empty())
178 return bitem->getBibLabel();
180 return lyx::from_ascii("99");