]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
remove obsolete references to saveSelection
[lyx.git] / src / Paragraph.cpp
index 8f4f196ab352d7e6843b2e84471e2ae91cc87aa8..7a0c8bace260829a4311c1983ccf182f73a7f54c 100644 (file)
@@ -176,25 +176,25 @@ public:
        /// Output the surrogate pair formed by \p c and \p next to \p os.
        /// \return the number of characters written.
        int latexSurrogatePair(odocstream & os, value_type c, value_type next,
-                              Encoding const &);
+                              Encoding const &);
        /// Output a space in appropriate formatting (or a surrogate pair
        /// if the next character is a combining character).
        /// \return whether a surrogate pair was output.
        bool simpleTeXBlanks(Encoding const &,
-                            odocstream &, TexRow & texrow,
+                            odocstream &, TexRow & texrow,
                             pos_type & i,
                             unsigned int & column,
                             Font const & font,
                             Layout const & style);
        ///
        void simpleTeXSpecialChars(Buffer const &, BufferParams const &,
-                                  odocstream &,
-                                  TexRow & texrow, OutputParams const &,
-                                  Font & running_font,
+                                  odocstream &,
+                                  TexRow & texrow, OutputParams const &,
+                                  Font & running_font,
                                   Font & basefont,
                                   Font const & outerfont,
                                   bool & open_font,
-                                  Change::Type & running_change,
+                                  Change & running_change,
                                   Layout const & style,
                                   pos_type & i,
                                   unsigned int & column, value_type const c);
@@ -210,7 +210,7 @@ public:
        ///
        ParagraphParameters params;
 
-private:
+//private:
        ///
        pos_type size() const { return owner_->size(); }
        /// match a string against a particular point in the paragraph
@@ -445,7 +445,7 @@ void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, Change const & cha
 
        // Update the font table.
        FontTable search_font(pos, Font());
-       for (FontList::iterator it 
+       for (FontList::iterator it
              = lower_bound(fontlist.begin(), fontlist.end(), search_font, matchFT());
             it != fontlist.end(); ++it)
        {
@@ -458,7 +458,7 @@ void Paragraph::Pimpl::insertChar(pos_type pos, value_type c, Change const & cha
 
 
 void Paragraph::Pimpl::insertInset(pos_type pos, Inset * inset,
-                                   Change const & change)
+                                  Change const & change)
 {
        BOOST_ASSERT(inset);
        BOOST_ASSERT(pos >= 0 && pos <= size());
@@ -480,7 +480,7 @@ bool Paragraph::Pimpl::eraseChar(pos_type pos, bool trackChanges)
        if (trackChanges) {
                Change change = changes_.lookup(pos);
 
-               // set the character to DELETED if 
+               // set the character to DELETED if
                //  a) it was previously unchanged or
                //  b) it was inserted by a co-author
 
@@ -580,8 +580,8 @@ int Paragraph::Pimpl::latexSurrogatePair(odocstream & os, value_type c,
 
 
 bool Paragraph::Pimpl::simpleTeXBlanks(Encoding const & encoding,
-                                       odocstream & os, TexRow & texrow,
-                                       pos_type & i,
+                                      odocstream & os, TexRow & texrow,
+                                      pos_type & i,
                                       unsigned int & column,
                                       Font const & font,
                                       Layout const & style)
@@ -665,7 +665,7 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf,
                                             Font & basefont,
                                             Font const & outerfont,
                                             bool & open_font,
-                                            Change::Type & running_change,
+                                            Change & running_change,
                                             Layout const & style,
                                             pos_type & i,
                                             unsigned int & column,
@@ -724,18 +724,10 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf,
                        break;
                }
 
-               // output change tracking marks only if desired,
-               // if dvipost is installed,
-               // and with dvi/ps (other formats don't work)
-               LaTeXFeatures features(buf, bparams, runparams);
-               bool const output = bparams.outputChanges
-                       && runparams.flavor == OutputParams::LATEX
-                       && features.isAvailable("dvipost");
-
                if (inset->canTrackChanges()) {
-                       column += Changes::latexMarkChange(os, running_change,
-                               Change::UNCHANGED, output);
-                       running_change = Change::UNCHANGED;
+                       column += Changes::latexMarkChange(os, bparams, running_change,
+                               Change(Change::UNCHANGED));
+                       running_change = Change(Change::UNCHANGED);
                }
 
                bool close = false;
@@ -745,7 +737,10 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf,
                     || inset->lyxCode() == Inset::MATH_CODE
                     || inset->lyxCode() == Inset::URL_CODE)
                    && running_font.isRightToLeft()) {
-                       os << "\\L{";
+                       if (running_font.language()->lang() == "farsi")
+                               os << "\\beginL{}";
+                       else
+                               os << "\\L{";
                        close = true;
                }
 
@@ -767,8 +762,12 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const & buf,
 
                int tmp = inset->latex(buf, os, runparams);
 
-               if (close)
-                       os << '}';
+               if (close) {
+                       if (running_font.language()->lang() == "farsi")
+                               os << "\\endL{}";
+                       else
+                               os << '}';
+               }
 
                if (tmp) {
                        for (int j = 0; j < tmp; ++j) {
@@ -1212,7 +1211,7 @@ int Paragraph::eraseChars(pos_type start, pos_type end, bool trackChanges)
 
 
 void Paragraph::insert(pos_type start, docstring const & str,
-                       Font const & font, Change const & change)
+                      Font const & font, Change const & change)
 {
        for (size_t i = 0, n = str.size(); i != n ; ++i)
                insertChar(start + i, str[i], font, change);
@@ -1220,24 +1219,24 @@ void Paragraph::insert(pos_type start, docstring const & str,
 
 
 void Paragraph::insertChar(pos_type pos, Paragraph::value_type c,
-                           bool trackChanges)
+                          bool trackChanges)
 {
        pimpl_->insertChar(pos, c, Change(trackChanges ?
-                          Change::INSERTED : Change::UNCHANGED));
+                          Change::INSERTED : Change::UNCHANGED));
 }
 
 
 void Paragraph::insertChar(pos_type pos, Paragraph::value_type c,
-                           Font const & font, bool trackChanges)
+                          Font const & font, bool trackChanges)
 {
        pimpl_->insertChar(pos, c, Change(trackChanges ?
-                          Change::INSERTED : Change::UNCHANGED));
+                          Change::INSERTED : Change::UNCHANGED));
        setFont(pos, font);
 }
 
 
 void Paragraph::insertChar(pos_type pos, Paragraph::value_type c,
-                           Font const & font, Change const & change)
+                          Font const & font, Change const & change)
 {
        pimpl_->insertChar(pos, c, change);
        setFont(pos, font);
@@ -1245,17 +1244,29 @@ void Paragraph::insertChar(pos_type pos, Paragraph::value_type c,
 
 
 void Paragraph::insertInset(pos_type pos, Inset * inset,
-                            Change const & change)
+                           Change const & change)
 {
        pimpl_->insertInset(pos, inset, change);
 }
 
 
 void Paragraph::insertInset(pos_type pos, Inset * inset,
-                            Font const & font, Change const & change)
+                           Font const & font, Change const & change)
 {
        pimpl_->insertInset(pos, inset, change);
+       // Set the font/language of the inset...
        setFont(pos, font);
+       // ... as well as the font/language of the text inside the inset
+       // FIXME: This is far from perfect. It basically overrides work being done
+       // in the InsetText constructor. Also, it doesn't work for Tables 
+       // (precisely because each cell's font/language is set in the Table's 
+       // constructor, so by now it's too late). The long-term solution should
+       // be moving current_font into Cursor, and getting rid of all this...
+       // (see http://thread.gmane.org/gmane.editors.lyx.devel/88869/focus=88944)
+       if (inset->asTextInset()) {
+               inset->asTextInset()->text_.current_font = font;
+               inset->asTextInset()->text_.real_current_font = font;
+       }
 }
 
 
@@ -1773,7 +1784,7 @@ void adjust_row_column(string const & str, TexRow & texrow, int & column)
 
 // This could go to ParagraphParameters if we want to
 int Paragraph::startTeXParParams(BufferParams const & bparams,
-                                 odocstream & os, TexRow & texrow, 
+                                odocstream & os, TexRow & texrow,
                                 bool moving_arg) const
 {
        int column = 0;
@@ -1782,8 +1793,13 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
                os << "\\noindent ";
                column += 10;
        }
+       
+       LyXAlignment const curAlign = params().align();
 
-       switch (params().align()) {
+       if (curAlign == layout()->align)
+               return column;
+
+       switch (curAlign) {
        case LYX_ALIGN_NONE:
        case LYX_ALIGN_BLOCK:
        case LYX_ALIGN_LAYOUT:
@@ -1799,7 +1815,7 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
                break;
        }
 
-       switch (params().align()) {
+       switch (curAlign) {
        case LYX_ALIGN_NONE:
        case LYX_ALIGN_BLOCK:
        case LYX_ALIGN_LAYOUT:
@@ -1837,8 +1853,8 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
 
 
 // This could go to ParagraphParameters if we want to
-int Paragraph::endTeXParParams(BufferParams const & bparams,  
-                               odocstream & os, TexRow & texrow,
+int Paragraph::endTeXParParams(BufferParams const & bparams,
+                              odocstream & os, TexRow & texrow,
                               bool moving_arg) const
 {
        int column = 0;
@@ -1930,13 +1946,6 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
        // of the body.
        Font basefont;
 
-       // output change tracking marks only if desired,
-       // if dvipost is installed,
-       // and with dvi/ps (other formats don't work)
-       bool const output = bparams.outputChanges
-               && runparams.flavor == OutputParams::LATEX
-               && LaTeXFeatures::isAvailable("dvipost");
-
        // Maybe we have to create a optional argument.
        pos_type body_pos = beginOfBody();
        unsigned int column = 0;
@@ -1956,7 +1965,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
        // Do we have an open font change?
        bool open_font = false;
 
-       Change::Type runningChangeType = Change::UNCHANGED;
+       Change runningChange = Change(Change::UNCHANGED);
 
        texrow.start(id(), 0);
 
@@ -1984,9 +1993,9 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                                basefont = getLayoutFont(bparams, outerfont);
                                running_font = basefont;
 
-                               column += Changes::latexMarkChange(os,
-                                               runningChangeType, Change::UNCHANGED, output);
-                               runningChangeType = Change::UNCHANGED;
+                               column += Changes::latexMarkChange(os, bparams,
+                                               runningChange, Change(Change::UNCHANGED));
+                               runningChange = Change(Change::UNCHANGED);
 
                                os << "}] ";
                                column +=3;
@@ -1997,25 +2006,33 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                        }
 
                        if (!asdefault)
-                               column += startTeXParParams(bparams, os, 
+                               column += startTeXParParams(bparams, os,
                                                            texrow,
                                                            runparams.moving_arg);
                }
 
-               Change::Type changeType = pimpl_->lookupChange(i).type;
+               Change const & change = pimpl_->lookupChange(i);
+
+               if (bparams.outputChanges && runningChange != change) {
+                       if (open_font) {
+                               column += running_font.latexWriteEndChanges(
+                                               os, bparams, runparams, basefont, basefont);
+                               open_font = false;
+                       }
+                       basefont = getLayoutFont(bparams, outerfont);
+                       running_font = basefont;
+
+                       column += Changes::latexMarkChange(os, bparams, runningChange, change);
+                       runningChange = change;
+               }
 
                // do not output text which is marked deleted
                // if change tracking output is disabled
-               if (!output && changeType == Change::DELETED) {
-                       runningChangeType = changeType;
+               if (!bparams.outputChanges && change.type == Change::DELETED) {
                        continue;
                }
 
                ++column;
-               
-               column += Changes::latexMarkChange(os, runningChangeType,
-                       changeType, output);
-               runningChangeType = changeType;
 
                value_type const c = getChar(i);
 
@@ -2039,11 +2056,11 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                // Switch file encoding if necessary
                if (runparams.encoding->package() == Encoding::inputenc &&
                    font.language()->encoding()->package() == Encoding::inputenc) {
-                       int const count = switchEncoding(os, bparams,
+                       std::pair<bool, int> const enc_switch = switchEncoding(os, bparams,
                                        runparams.moving_arg, *(runparams.encoding),
                                        *(font.language()->encoding()));
-                       if (count > 0) {
-                               column += count;
+                       if (enc_switch.first) {
+                               column += enc_switch.second;
                                runparams.encoding = font.language()->encoding();
                        }
                }
@@ -2054,8 +2071,8 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                        i != body_pos - 1)
                {
                        column += font.latexWriteStartChanges(os, bparams,
-                                                             runparams, basefont,
-                                                             last_font);
+                                                             runparams, basefont,
+                                                             last_font);
                        running_font = font;
                        open_font = true;
                }
@@ -2086,7 +2103,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                pimpl_->simpleTeXSpecialChars(buf, bparams, os,
                                        texrow, rp, running_font,
                                        basefont, outerfont, open_font,
-                                       runningChangeType, *style, i, column, c);
+                                       runningChange, *style, i, column, c);
        }
 
        // If we have an open font definition, we have to close it
@@ -2112,8 +2129,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
 #endif
        }
 
-       column += Changes::latexMarkChange(os,
-                       runningChangeType, Change::UNCHANGED, output);
+       column += Changes::latexMarkChange(os, bparams, runningChange, Change(Change::UNCHANGED));
 
        // Needed if there is an optional argument but no contents.
        if (body_pos > 0 && body_pos == size()) {
@@ -2122,7 +2138,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
        }
 
        if (!asdefault) {
-               column += endTeXParParams(bparams, os, texrow, 
+               column += endTeXParParams(bparams, os, texrow,
                                          runparams.moving_arg);
        }
 
@@ -2184,6 +2200,7 @@ bool Paragraph::emptyTag() const
                            lyx_code != Inset::INCLUDE_CODE &&
                            lyx_code != Inset::GRAPHICS_CODE &&
                            lyx_code != Inset::ERT_CODE &&
+                           lyx_code != Inset::LISTINGS_CODE &&
                            lyx_code != Inset::FLOAT_CODE &&
                            lyx_code != Inset::TABULAR_CODE) {
                                return false;
@@ -2227,7 +2244,7 @@ pos_type Paragraph::getFirstWord(Buffer const & buf, odocstream & os, OutputPara
                        if (c == ' ')
                                break;
                        os << sgml::escapeChar(c);
-               }
+               }
        }
        return i;
 }
@@ -2287,9 +2304,9 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                        value_type c = getChar(i);
 
                        if (style->pass_thru)
-                                os.put(c);
+                               os.put(c);
                        else
-                                os << sgml::escapeChar(c);
+                               os << sgml::escapeChar(c);
                }
                font_old = font;
        }
@@ -2349,7 +2366,8 @@ bool Paragraph::isRightToLeftPar(BufferParams const & bparams) const
 {
        return lyxrc.rtl_support
                && getParLanguage(bparams)->rightToLeft()
-               && ownerCode() != Inset::ERT_CODE;
+               && ownerCode() != Inset::ERT_CODE
+               && ownerCode() != Inset::LISTINGS_CODE;
 }
 
 
@@ -2400,7 +2418,7 @@ docstring const Paragraph::asString(Buffer const & buffer,
                os << params().labelString() << ' ';
 
        for (pos_type i = beg; i < end; ++i) {
-               value_type const c = getUChar(buffer.params(), i);
+               value_type const c = getChar(i);
                if (isPrintable(c))
                        os.put(c);
                else if (c == META_INSET)
@@ -2510,7 +2528,7 @@ bool Paragraph::isFreeSpacing() const
 
        // for now we just need this, later should we need this in some
        // other way we can always add a function to Inset too.
-       return ownerCode() == Inset::ERT_CODE;
+       return ownerCode() == Inset::ERT_CODE || ownerCode() == Inset::LISTINGS_CODE;
 }
 
 
@@ -2518,7 +2536,7 @@ bool Paragraph::allowEmpty() const
 {
        if (layout()->keepempty)
                return true;
-       return ownerCode() == Inset::ERT_CODE;
+       return ownerCode() == Inset::ERT_CODE || ownerCode() == Inset::LISTINGS_CODE;
 }
 
 
@@ -2598,25 +2616,76 @@ 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
                && getChar(0) == Paragraph::META_INSET
                && insetlist.begin()->inset->lyxCode() == Inset::BIBITEM_CODE;
 
-       if (hasbibitem)
-               return false;
+       docstring oldkey;
+       docstring oldlabel;
+
+       // remove a bibitem in pos != 0
+       // restore it later in pos 0 if necessary
+       // (e.g. if a user inserts contents _before_ the item)
+       // 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");
+                       erasedInsetPosition = it->pos;
+                       eraseChar(erasedInsetPosition, track_changes);
+                       break;
+       }
 
+       //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);
+       inset->setParam("label", oldlabel);
        insertInset(0, static_cast<Inset *>(inset),
-               Change(track_changes ? Change::INSERTED : Change::UNCHANGED));
+                   Change(track_changes ? Change::INSERTED : Change::UNCHANGED));
 
-       return true;
+       return 1;
+}
+
+
+void Paragraph::checkAuthors(AuthorList const & authorList)
+{
+       pimpl_->changes_.checkAuthors(authorList);
 }
 
 } // namespace lyx