}
-bool Paragraph::checkBiblio(bool track_changes)
+int Paragraph::checkBiblio(bool track_changes)
{
+ //FIXME From JS:
+ //This is getting more and more a mess. ...We really should clean
+ //up this bibitem issue for 1.6. See also bug 2743.
+
// Add bibitem insets if necessary
if (layout()->labeltype != LABEL_BIBLIO)
- return false;
+ return 0;
bool hasbibitem = !insetlist.empty()
// Insist on it being in pos 0
docstring oldkey;
docstring oldlabel;
- // remove bibitems in pos != 0
- // restore them later in pos 0 if necessary
+ // remove a bibitem in pos != 0
+ // restore it later in pos 0 if necessary
// (e.g. if a user inserts contents _before_ the item)
- InsetList::const_iterator it = insetlist.begin();
- InsetList::const_iterator end = insetlist.end();
+ // we're assuming there's only one of these, which there
+ // should be.
+ int erasedInsetPosition = -1;
+ InsetList::iterator it = insetlist.begin();
+ InsetList::iterator end = insetlist.end();
for (; it != end; ++it)
if (it->inset->lyxCode() == Inset::BIBITEM_CODE
&& it->pos > 0) {
InsetBibitem * olditem = static_cast<InsetBibitem *>(it->inset);
oldkey = olditem->getParam("key");
oldlabel = olditem->getParam("label");
- eraseChar(it->pos, track_changes);
+ erasedInsetPosition = it->pos;
+ eraseChar(erasedInsetPosition, track_changes);
+ break;
}
- if (hasbibitem)
- return false;
-
+ //There was an InsetBibitem at the beginning, and we didn't
+ //have to erase one.
+ if (hasbibitem && erasedInsetPosition < 0)
+ return 0;
+
+ //There was an InsetBibitem at the beginning and we did have to
+ //erase one. So we give its properties to the beginning inset.
+ if (hasbibitem) {
+ InsetBibitem * inset =
+ static_cast<InsetBibitem *>(insetlist.begin()->inset);
+ if (!oldkey.empty())
+ inset->setParam("key", oldkey);
+ inset->setParam("label", oldlabel);
+ return -erasedInsetPosition;
+ }
+
+ //There was no inset at the beginning, so we need to create one with
+ //the key and label of the one we erased.
InsetBibitem * inset(new InsetBibitem(InsetCommandParams("bibitem")));
// restore values of previously deleted item in this par.
if (!oldkey.empty())
inset->setParam("key", oldkey);
- if (!oldlabel.empty())
- inset->setParam("label", oldlabel);
+ inset->setParam("label", oldlabel);
insertInset(0, static_cast<Inset *>(inset),
Change(track_changes ? Change::INSERTED : Change::UNCHANGED));
- return true;
+ return 1;
}
} // namespace lyx
///
bool hfillExpansion(Row const & row, pos_type pos) const;
- /// Check if we are in a Biblio environment.
- /// \retval true if the cursor needs to be moved right.
- bool checkBiblio(bool track_changes);
+ /// Check if we are in a Biblio environment and insert or
+ /// delete InsetBibitems as necessary.
+ /// \retval int 1, if we had to add an inset, in which case
+ /// the cursor will need to move cursor forward; -pos, if we deleted
+ /// an inset, in which case pos is the position from which the inset
+ /// was deleted, and the cursor will need to be moved back one if it
+ /// was previously past that position. Return 0 otherwise.
+ int checkBiblio(bool track_changes);
public:
///
main_text_ = (text_ == &buffer.text());
bool changed = false;
- // FIXME: this has nothing to do here and is the reason why text_ is not
- // const.
- if (par.checkBiblio(buffer.params().trackChanges))
+ // FIXME This check ought to be done somewhere else. It is the reason
+ // why text_ is not const. But then, where else to do it?
+ // Well, how can you end up with either (a) a biblio environment that
+ // has no InsetBibitem or (b) a biblio environment with more than one
+ // InsetBibitem? I think the answer is: when paragraphs are merged;
+ // when layout is set; when material is pasted.
+ int const moveCursor = par.checkBiblio(buffer.params().trackChanges);
+ if (moveCursor > 0)
const_cast<Cursor &>(bv_->cursor()).posRight();
+ else if (moveCursor < 0) {
+ Cursor & cursor = const_cast<Cursor &>(bv_->cursor());
+ if (cursor.pos() >= -moveCursor)
+ cursor.posLeft();
+ }
// Optimisation: this is used in the next two loops
// so better to calculate that once here.