]> git.lyx.org Git - features.git/commitdiff
Fix for bug 3650. Made changes to the Paragraph::checkBiblio() routine,
authorRichard Heck <rgheck@comcast.net>
Sat, 19 May 2007 19:29:50 +0000 (19:29 +0000)
committerRichard Heck <rgheck@comcast.net>
Sat, 19 May 2007 19:29:50 +0000 (19:29 +0000)
which now returns 1 if an InsetBibitem was inserted (and the cursor needs
to be incremented) or -POS if an InsetBibitem was deleted at position POS
(and the cursor needs to be decremented if it was past POS). Otherwise, it
returns 0. Made the corresponding changes in TextMetrics.cpp.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18424 a592a061-630c-0410-9148-cb99ea01b6c8

src/Paragraph.cpp
src/Paragraph.h
src/TextMetrics.cpp

index 0634bbafe54ace43be22866138a9ac591d133175..7afacfabce96b64b855ba92f54d04de59914c0b4 100644 (file)
@@ -2592,11 +2592,15 @@ bool Paragraph::hfillExpansion(Row const & row, pos_type pos) const
 }
 
 
-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
@@ -2606,33 +2610,52 @@ bool Paragraph::checkBiblio(bool track_changes)
        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
index 3a39620c85adae7c39cdd73479413f67256002ad..5c1261c087cb019c88532f04995d6424edd5292a 100644 (file)
@@ -359,9 +359,14 @@ public:
        ///
        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:
        ///
index 04bc3f765e8ae63f2c71ec1b6b56cdc331f2c560..9fd56f6b6f1e209ee2b4c5fcf34a8d34a98632ce 100644 (file)
@@ -190,10 +190,20 @@ bool TextMetrics::redoParagraph(pit_type const pit)
        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.