]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
Fixed rowbreaking for "character"-insets and ignore all paragraph attributes
[lyx.git] / src / paragraph.C
index 733daee2fea70132ed217f09a1b3250c9602ec1a..2e3a09feb90743f57049f9464cc9308d89bdad66 100644 (file)
 #pragma implementation
 #endif
 
-#include <algorithm>
-#include <fstream>
-#include <csignal>
-
 #include "paragraph.h"
 #include "paragraph_pimpl.h"
-#include "support/textutils.h"
 #include "lyxrc.h"
 #include "layout.h"
 #include "language.h"
 #include "tex-strings.h"
 #include "buffer.h"
 #include "bufferparams.h"
-#include "support/FileInfo.h"
-#include "support/LAssert.h"
 #include "debug.h"
 #include "LaTeXFeatures.h"
-#include "insets/insetinclude.h"
-#include "insets/insetbib.h"
-#include "insets/insettext.h"
-#include "support/filetools.h"
-#include "support/lstrings.h"
 #include "lyx_gui_misc.h"
 #include "texrow.h"
-#include "support/lyxmanip.h"
 #include "BufferView.h"
 #include "encoding.h"
 #include "ParameterStruct.h"
 #include "gettext.h"
+#include "lyxtextclasslist.h"
+
+#include "insets/insetinclude.h"
+#include "insets/insetbib.h"
+#include "insets/insettext.h"
+
+#include "support/filetools.h"
+#include "support/lstrings.h"
+#include "support/lyxmanip.h"
+#include "support/FileInfo.h"
+#include "support/LAssert.h"
+#include "support/textutils.h"
+
+#include <algorithm>
+#include <fstream>
+#include <csignal>
 
 using std::ostream;
 using std::endl;
@@ -52,6 +55,9 @@ using std::lower_bound;
 using std::upper_bound;
 using std::reverse;
 
+using lyx::pos_type;
+using lyx::layout_type;
+
 int tex_code_break_column = 72;  // needs non-zero initialization. set later.
 // this is a bad idea, but how can Paragraph find its buffer to get
 // parameters? (JMarc)
@@ -73,21 +79,22 @@ extern BufferView * current_view;
 
 
 Paragraph::Paragraph()
-               : pimpl_(new Paragraph::Pimpl(this))
+       : layout(0), pimpl_(new Paragraph::Pimpl(this))
 {
-       for (int i = 0; i < 10; ++i) setCounter(i , 0);
+       for (int i = 0; i < 10; ++i)
+               setCounter(i, 0);
        next_ = 0;
        previous_ = 0;
        enumdepth = 0;
        itemdepth = 0;
-        bibkey = 0; // ale970302
+       bibkey = 0; // ale970302
        clear();
 }
 
 
-// This konstruktor inserts the new paragraph in a list.
+// This constructor inserts the new paragraph in a list.
 Paragraph::Paragraph(Paragraph * par)
-               : pimpl_(new Paragraph::Pimpl(this))
+       : layout(0), pimpl_(new Paragraph::Pimpl(this))
 {
        for (int i = 0; i < 10; ++i)
                setCounter(i, 0);
@@ -102,27 +109,27 @@ Paragraph::Paragraph(Paragraph * par)
        previous_->next_ = this;
        // end
 
-        bibkey = 0; // ale970302        
-    
+       bibkey = 0; // ale970302        
+
        clear();
 }
 
 
 Paragraph::Paragraph(Paragraph const & lp, bool same_ids)
-       : pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this, same_ids))
+       : layout(0), pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this, same_ids))
 {
        for (int i = 0; i < 10; ++i)
-               setCounter(i , 0);
+               setCounter(i, 0);
        enumdepth = 0;
        itemdepth = 0;
-       next_ = 0;
+       next_     = 0;
        previous_ = 0;
 
        // this is because of the dummy layout of the paragraphs that
        // follow footnotes
        layout = lp.layout;
 
-        // ale970302
+       // ale970302
        if (lp.bibkey) {
                bibkey = static_cast<InsetBibKey *>
                        (lp.bibkey->clone(*current_view->buffer()));
@@ -131,12 +138,13 @@ Paragraph::Paragraph(Paragraph const & lp, bool same_ids)
        }
        
        // copy everything behind the break-position to the new paragraph
-
        insetlist = lp.insetlist;
        for (InsetList::iterator it = insetlist.begin();
             it != insetlist.end(); ++it)
        {
                it->inset = it->inset->clone(*current_view->buffer(), same_ids);
+               // tell the new inset who is the boss now
+               it->inset->parOwner(this);
        }
 }
 
@@ -154,7 +162,7 @@ Paragraph::~Paragraph()
                delete it->inset;
        }
 
-        // ale970302
+       // ale970302
        delete bibkey;
 
        delete pimpl_;
@@ -382,8 +390,7 @@ void Paragraph::validate(LaTeXFeatures & features) const
 
        // then the insets
        LyXLayout const & layout =
-                textclasslist.Style(bparams.textclass,
-                                    getLayout());
+             textclasslist.Style(bparams.textclass, getLayout());
 
        for (InsetList::const_iterator cit = insetlist.begin();
             cit != insetlist.end(); ++cit) {
@@ -436,6 +443,8 @@ void Paragraph::cutIntoMinibuffer(BufferParams const & bparams, pos_type pos)
                                            search_elem, Pimpl::matchIT());
                        if (it != insetlist.end() && it->pos == pos)
                                it->inset = 0;
+                       // the inset is not in a paragraph anymore
+                       minibuffer_inset->parOwner(0);
                } else {
                        minibuffer_inset = 0;
                        minibuffer_char = ' ';
@@ -607,10 +616,8 @@ LyXFont const Paragraph::getFontSettings(BufferParams const & bparams,
 // Gets uninstantiated font setting at position 0
 LyXFont const Paragraph::getFirstFontSettings() const
 {
-       if (size() > 0) {
-               if (!pimpl_->fontlist.empty())
-                       return pimpl_->fontlist[0].font();
-       }
+       if (size() > 0 && !pimpl_->fontlist.empty())
+               return pimpl_->fontlist[0].font();
        
        return LyXFont(LyXFont::ALL_INHERIT);
 }
@@ -712,8 +719,7 @@ Paragraph::highestFontInRange(pos_type startpos, pos_type endpos,
 
 
 Paragraph::value_type
-Paragraph::getUChar(BufferParams const & bparams,
-                      pos_type pos) const
+Paragraph::getUChar(BufferParams const & bparams, pos_type pos) const
 {
        value_type c = getChar(pos);
        if (!lyxrc.rtl_support)
@@ -753,8 +759,7 @@ Paragraph::getUChar(BufferParams const & bparams,
 }
 
 
-void Paragraph::setFont(pos_type pos,
-                          LyXFont const & font)
+void Paragraph::setFont(pos_type pos, LyXFont const & font)
 {
        lyx::Assert(pos <= size());
 
@@ -927,14 +932,16 @@ void Paragraph::makeSameLayout(Paragraph const * par)
 }
 
 
-int Paragraph::stripLeadingSpaces(LyXTextClassList::size_type tclass) 
+int Paragraph::stripLeadingSpaces(lyx::textclass_type tclass) 
 {
-       if (textclasslist.Style(tclass, getLayout()).free_spacing)
+       if (textclasslist.Style(tclass, getLayout()).free_spacing ||
+               isFreeSpacing())
+       {
                return 0;
+       }
        
        int i = 0;
-       while (size()
-              && (isNewline(0) || isLineSeparator(0))){
+       while (size() && (isNewline(0) || isLineSeparator(0))) {
                erase(0);
                ++i;
        }
@@ -978,7 +985,7 @@ void Paragraph::breakParagraphConservative(BufferParams const & bparams,
                }
        }
 }
-   
+
 
 // Be carefull, this does not make any check at all.
 // This method has wrong name, it combined this par with the next par.
@@ -987,7 +994,7 @@ void Paragraph::pasteParagraph(BufferParams const & bparams)
 {
        // copy the next paragraph to this one
        Paragraph * the_next = next();
-   
+
        // first the DTP-stuff
        params().lineBottom(the_next->params().lineBottom());
        params().spaceBottom(the_next->params().spaceBottom());
@@ -1002,7 +1009,7 @@ void Paragraph::pasteParagraph(BufferParams const & bparams)
                if (insertFromMinibuffer(pos_insert + j))
                        ++j;
        }
-   
+
        // delete the next paragraph
        Paragraph * ppar = the_next->previous_;
        Paragraph * npar = the_next->next_;
@@ -1016,7 +1023,7 @@ int Paragraph::getEndLabel(BufferParams const & bparams) const
        Paragraph const * par = this;
        depth_type par_depth = getDepth();
        while (par) {
-               Paragraph::layout_type layout = par->getLayout();
+               layout_type layout = par->getLayout();
                int const endlabeltype =
                        textclasslist.Style(bparams.textclass,
                                            layout).endlabeltype;
@@ -1136,11 +1143,11 @@ int Paragraph::beginningOfMainBody() const
 Paragraph * Paragraph::depthHook(depth_type depth)
 {
        Paragraph * newpar = this;
-  
+
        do {
                newpar = newpar->previous();
        } while (newpar && newpar->getDepth() > depth);
-   
+
        if (!newpar) {
                if (previous() || getDepth())
                        lyxerr << "ERROR (Paragraph::DepthHook): "
@@ -1155,11 +1162,11 @@ Paragraph * Paragraph::depthHook(depth_type depth)
 Paragraph const * Paragraph::depthHook(depth_type depth) const
 {
        Paragraph const * newpar = this;
-   
+
        do {
                newpar = newpar->previous();
        } while (newpar && newpar->getDepth() > depth);
-   
+
        if (!newpar) {
                if (previous() || getDepth())
                        lyxerr << "ERROR (Paragraph::DepthHook): "
@@ -1184,22 +1191,6 @@ Paragraph const * Paragraph::outerHook() const
        return depthHook(depth_type(getDepth() - 1));
 }
 
-int Paragraph::autoDeleteInsets()
-{
-       int count = 0;
-       InsetList::size_type index = 0;
-       while (index < insetlist.size()) {
-               if (insetlist[index].inset && insetlist[index].inset->autoDelete()) {
-                       erase(insetlist[index].pos); 
-                       // Erase() calls to insetlist.erase(&insetlist[index])
-                       // so index shouldn't be increased.
-                       ++count;
-               } else
-                       ++index;
-       }
-       return count;
-}
-
 
 Paragraph::inset_iterator
 Paragraph::InsetIterator(pos_type pos)
@@ -1213,7 +1204,7 @@ Paragraph::InsetIterator(pos_type pos)
 
 
 // returns -1 if inset not found
-int Paragraph::getPositionOfInset(Inset * inset) const
+int Paragraph::getPositionOfInset(Inset const * inset) const
 {
        // Find the entry.
        for (InsetList::const_iterator cit = insetlist.begin();
@@ -1230,51 +1221,59 @@ int Paragraph::getPositionOfInset(Inset * inset) const
 
 
 Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
-                                      BufferParams const & bparams,
-                                      ostream & os, TexRow & texrow,
-                                      bool moving_arg)
+                                 BufferParams const & bparams,
+                                 ostream & os, TexRow & texrow,
+                                 bool moving_arg)
 {
        lyxerr[Debug::LATEX] << "TeXOnePar...     " << this << endl;
-       LyXLayout const & style =
-               textclasslist.Style(bparams.textclass,
-                                   layout);
-
+       Inset const * in = inInset();
        bool further_blank_line = false;
+       LyXLayout style;
+       
+       // well we have to check if we are in an inset with unlimited
+       // lenght (all in one row) if that is true then we don't allow
+       // any special options in the paragraph and also we don't allow
+       // any environment other then "Standard" to be valid!
+       if ((in == 0) || !in->forceDefaultParagraphs(in)) {
+               style = textclasslist.Style(bparams.textclass, layout);
+
+               if (params().startOfAppendix()) {
+                       os << "\\appendix\n";
+                       texrow.newline();
+               }
 
-       if (params().startOfAppendix()) {
-               os << "\\appendix\n";
-               texrow.newline();
-       }
-
-       if (!params().spacing().isDefault()
-           && (!previous() || !previous()->hasSameLayout(this))) {
-               os << params().spacing().writeEnvirBegin() << "\n";
-               texrow.newline();
-       }
+               if (!params().spacing().isDefault()
+                       && (!previous() || !previous()->hasSameLayout(this))) {
+                       os << params().spacing().writeEnvirBegin() << "\n";
+                       texrow.newline();
+               }
        
-       if (tex_code_break_column && style.isCommand()){
-               os << '\n';
-               texrow.newline();
-       }
+               if (tex_code_break_column && style.isCommand()){
+                       os << '\n';
+                       texrow.newline();
+               }
 
-       if (params().pagebreakTop()) {
-               os << "\\newpage";
-               further_blank_line = true;
-       }
-       if (params().spaceTop().kind() != VSpace::NONE) {
-               os << params().spaceTop().asLatexCommand(bparams);
-               further_blank_line = true;
-       }
-      
-       if (params().lineTop()) {
-               os << "\\lyxline{\\" << getFont(bparams, 0).latexSize() << '}'
-                  << "\\vspace{-1\\parskip}";
-               further_blank_line = true;
-       }
+               if (params().pagebreakTop()) {
+                       os << "\\newpage";
+                       further_blank_line = true;
+               }
+               if (params().spaceTop().kind() != VSpace::NONE) {
+                       os << params().spaceTop().asLatexCommand(bparams);
+                       further_blank_line = true;
+               }
 
-       if (further_blank_line){
-               os << '\n';
-               texrow.newline();
+               if (params().lineTop()) {
+                       os << "\\lyxline{\\" << getFont(bparams, 0).latexSize() << '}'
+                          << "\\vspace{-1\\parskip}";
+                       further_blank_line = true;
+               }
+
+               if (further_blank_line){
+                       os << '\n';
+                       texrow.newline();
+               }
+       } else {
+               style = textclasslist.Style(bparams.textclass, 0);
        }
 
        Language const * language = getParLanguage(bparams);
@@ -1284,22 +1283,24 @@ Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
 
        if (language->babel() != previous_language->babel()
            // check if we already put language command in TeXEnvironment()
-           && !(textclasslist.Style(bparams.textclass, layout).isEnvironment()
-                && (!previous() || previous()->layout != layout ||
-                    previous()->params().depth() != params().depth()))) {
-
+           && !(style.isEnvironment()
+                && (!previous() || previous()->layout != layout ||
+                        previous()->params().depth() != params().depth())))
+       {
                if (!lyxrc.language_command_end.empty() &&
-                   previous_language->babel() != doc_language->babel()) {
+                   previous_language->babel() != doc_language->babel())
+               {
                        os << subst(lyxrc.language_command_end, "$$lang",
-                                   previous_language->babel())
+                                   previous_language->babel())
                           << endl;
                        texrow.newline();
                }
 
                if (lyxrc.language_command_end.empty() ||
-                   language->babel() != doc_language->babel()) {
+                   language->babel() != doc_language->babel())
+               {
                        os << subst(lyxrc.language_command_begin, "$$lang",
-                                   language->babel())
+                                   language->babel())
                           << endl;
                        texrow.newline();
                }
@@ -1345,11 +1346,10 @@ Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
        // or for a command.
        LyXFont const font =
                (size() == 0
-                ? getLayoutFont(bparams)
-                : getFont(bparams, size() - 1));
+                ? getLayoutFont(bparams) : getFont(bparams, size() - 1));
 
-       bool is_command = textclasslist.Style(bparams.textclass,
-                                             getLayout()).isCommand();
+       bool is_command = style.isCommand();
+       
        if (style.resfont.size() != font.size() && next_ && !is_command) {
                if (!need_par)
                        os << "{";
@@ -1362,10 +1362,10 @@ Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
        switch (style.latextype) {
        case LATEX_ITEM_ENVIRONMENT:
        case LATEX_LIST_ENVIRONMENT:
-                if (next_ && (params().depth() < next_->params().depth())) {
-                        os << '\n';
-                        texrow.newline();
-                }
+               if (next_ && (params().depth() < next_->params().depth())) {
+                       os << '\n';
+                       texrow.newline();
+               }
                break;
        case LATEX_ENVIRONMENT:
                // if its the last paragraph of the current environment
@@ -1374,6 +1374,7 @@ Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
                    && (next_->layout != layout
                        || next_->params().depth() != params().depth()))
                        break;
+               // fall through possible
        default:
                // we don't need it for the last paragraph!!!
                if (next_) {
@@ -1382,31 +1383,33 @@ Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
                }
        }
        
-       further_blank_line = false;
-       if (params().lineBottom()) {
-               os << "\\lyxline{\\" << font.latexSize() << '}';
-               further_blank_line = true;
-       }
+       if ((in == 0) || !in->forceDefaultParagraphs(in)) {
+               further_blank_line = false;
+               if (params().lineBottom()) {
+                       os << "\\lyxline{\\" << font.latexSize() << '}';
+                       further_blank_line = true;
+               }
 
-       if (params().spaceBottom().kind() != VSpace::NONE) {
-               os << params().spaceBottom().asLatexCommand(bparams);
-               further_blank_line = true;
-       }
-      
-       if (params().pagebreakBottom()) {
-               os << "\\newpage";
-               further_blank_line = true;
-       }
+               if (params().spaceBottom().kind() != VSpace::NONE) {
+                       os << params().spaceBottom().asLatexCommand(bparams);
+                       further_blank_line = true;
+               }
 
-       if (further_blank_line){
-               os << '\n';
-               texrow.newline();
-       }
+               if (params().pagebreakBottom()) {
+                       os << "\\newpage";
+                       further_blank_line = true;
+               }
 
-       if (!params().spacing().isDefault()
-           && (!next_ || !next_->hasSameLayout(this))) {
-               os << params().spacing().writeEnvirEnd() << "\n";
-               texrow.newline();
+               if (further_blank_line){
+                       os << '\n';
+                       texrow.newline();
+               }
+
+               if (!params().spacing().isDefault()
+                       && (!next_ || !next_->hasSameLayout(this))) {
+                       os << params().spacing().writeEnvirEnd() << "\n";
+                       texrow.newline();
+               }
        }
        
        // we don't need it for the last paragraph!!!
@@ -1440,17 +1443,29 @@ Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
 
 // This one spits out the text of the paragraph
 bool Paragraph::simpleTeXOnePar(Buffer const * buf,
-                                  BufferParams const & bparams,
-                                  ostream & os, TexRow & texrow,
-                                  bool moving_arg)
+                                BufferParams const & bparams,
+                                ostream & os, TexRow & texrow,
+                                bool moving_arg)
 {
        lyxerr[Debug::LATEX] << "SimpleTeXOnePar...     " << this << endl;
 
        bool return_value = false;
 
-       LyXLayout const & style =
-               textclasslist.Style(bparams.textclass,
-                                   getLayout());
+       LyXLayout style;
+       
+       // well we have to check if we are in an inset with unlimited
+       // lenght (all in one row) if that is true then we don't allow
+       // any special options in the paragraph and also we don't allow
+       // any environment other then "Standard" to be valid!
+       bool asdefault =
+               (inInset() && inInset()->forceDefaultParagraphs(inInset()));
+
+       if (asdefault) {
+               style = textclasslist.Style(bparams.textclass, 0);
+       } else {
+               style = textclasslist.Style(bparams.textclass, layout);
+       }
+       
        LyXFont basefont;
 
        // Maybe we have to create a optional argument.
@@ -1470,8 +1485,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf,
                basefont = getLayoutFont(bparams);
        }
 
-       if (main_body >= 0
-           && !pimpl_->size()) {
+       if (main_body >= 0 && !pimpl_->size()) {
                if (style.isCommand()) {
                        os << '{';
                        ++column;
@@ -1506,39 +1520,42 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf,
                                ++column;
                        }
 
-                       if (params().noindent()) {
-                               os << "\\noindent ";
-                               column += 10;
-                       }
-                       switch (params().align()) {
-                       case LYX_ALIGN_NONE:
-                       case LYX_ALIGN_BLOCK:
-                       case LYX_ALIGN_LAYOUT:
-                       case LYX_ALIGN_SPECIAL:
-                               break;
-                       case LYX_ALIGN_LEFT:
-                               if (getParLanguage(bparams)->babel() != "hebrew") {
-                                       os << "\\begin{flushleft}";
-                                       column += 17;
-                               } else {
-                                       os << "\\begin{flushright}";
-                                       column += 18;
+                       if (!asdefault) {
+                               if (params().noindent()) {
+                                       os << "\\noindent ";
+                                       column += 10;
                                }
-                               break;
-                       case LYX_ALIGN_RIGHT:
-                               if (getParLanguage(bparams)->babel() != "hebrew") {
-                                       os << "\\begin{flushright}";
-                                       column += 18;
-                               } else {
-                                       os << "\\begin{flushleft}";
-                                       column += 17;
+                       
+                               switch (params().align()) {
+                               case LYX_ALIGN_NONE:
+                               case LYX_ALIGN_BLOCK:
+                               case LYX_ALIGN_LAYOUT:
+                               case LYX_ALIGN_SPECIAL:
+                                       break;
+                               case LYX_ALIGN_LEFT:
+                                       if (getParLanguage(bparams)->babel() != "hebrew") {
+                                               os << "\\begin{flushleft}";
+                                               column += 17;
+                                       } else {
+                                               os << "\\begin{flushright}";
+                                               column += 18;
+                                       }
+                                       break;
+                               case LYX_ALIGN_RIGHT:
+                                       if (getParLanguage(bparams)->babel() != "hebrew") {
+                                               os << "\\begin{flushright}";
+                                               column += 18;
+                                       } else {
+                                               os << "\\begin{flushleft}";
+                                               column += 17;
+                                       }
+                                       break;
+                               case LYX_ALIGN_CENTER:
+                                       os << "\\begin{center}";
+                                       column += 14;
+                                       break;
                                }
-                               break;
-                       case LYX_ALIGN_CENTER:
-                               os << "\\begin{center}";
-                               column += 14;
-                               break;
-                       }        
+                       }
                }
 
                value_type c = getChar(i);
@@ -1645,35 +1662,37 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf,
                return_value = false;
        }
 
-       switch (params().align()) {
-       case LYX_ALIGN_NONE:
-       case LYX_ALIGN_BLOCK:
-       case LYX_ALIGN_LAYOUT:
-       case LYX_ALIGN_SPECIAL:
-               break;
-       case LYX_ALIGN_LEFT:
-               if (getParLanguage(bparams)->babel() != "hebrew") {
-                       os << "\\end{flushleft}";
-                       column+= 15;
-               } else {
-                       os << "\\end{flushright}";
-                       column+= 16;
-               }
-               break;
-       case LYX_ALIGN_RIGHT:
-               if (getParLanguage(bparams)->babel() != "hebrew") {
-                       os << "\\end{flushright}";
-                       column+= 16;
-               } else {
-                       os << "\\end{flushleft}";
-                       column+= 15;
+       if (!asdefault) {
+               switch (params().align()) {
+               case LYX_ALIGN_NONE:
+               case LYX_ALIGN_BLOCK:
+               case LYX_ALIGN_LAYOUT:
+               case LYX_ALIGN_SPECIAL:
+                       break;
+               case LYX_ALIGN_LEFT:
+                       if (getParLanguage(bparams)->babel() != "hebrew") {
+                               os << "\\end{flushleft}";
+                               column+= 15;
+                       } else {
+                               os << "\\end{flushright}";
+                               column+= 16;
+                       }
+                       break;
+               case LYX_ALIGN_RIGHT:
+                       if (getParLanguage(bparams)->babel() != "hebrew") {
+                               os << "\\end{flushright}";
+                               column+= 16;
+                       } else {
+                               os << "\\end{flushleft}";
+                               column+= 15;
+                       }
+                       break;
+               case LYX_ALIGN_CENTER:
+                       os << "\\end{center}";
+                       column+= 12;
+                       break;
                }
-               break;
-       case LYX_ALIGN_CENTER:
-               os << "\\end{center}";
-               column+= 12;
-               break;
-       }        
+       }
 
        lyxerr[Debug::LATEX] << "SimpleTeXOnePar...done " << this << endl;
        return return_value;
@@ -1796,8 +1815,7 @@ Paragraph * Paragraph::TeXEnvironment(Buffer const * buf,
        }
        Paragraph * par = this;
        do {
-               par = par->TeXOnePar(buf, bparams,
-                                    os, texrow, false);
+               par = par->TeXOnePar(buf, bparams, os, texrow, false);
 
                if (par && par->params().depth() > params().depth()) {
                        if (textclasslist.Style(bparams.textclass,
@@ -1827,6 +1845,7 @@ Paragraph * Paragraph::TeXEnvironment(Buffer const * buf,
  
        if (style.isEnvironment()) {
                os << "\\end{" << style.latexname() << "}\n";
+               texrow.newline();
        }
 
        lyxerr[Debug::LATEX] << "TeXEnvironment...done " << par << endl;
@@ -2048,7 +2067,7 @@ void Paragraph::setContentsFromPar(Paragraph * par)
 }
 
 
-Paragraph::pos_type Paragraph::size() const
+lyx::pos_type Paragraph::size() const
 {
        return pimpl_->size();
 }
@@ -2072,7 +2091,7 @@ void  Paragraph::id(int id_arg)
 }
 
 
-Paragraph::layout_type Paragraph::getLayout() const
+layout_type Paragraph::getLayout() const
 {
        return layout;
 }
@@ -2156,3 +2175,13 @@ Paragraph * Paragraph::getParFromID(int id) const
 {
        return pimpl_->getParFromID(id);
 }
+
+
+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.
+       if (pimpl_->inset_owner && pimpl_->inset_owner->owner())
+               return (pimpl_->inset_owner->owner()->lyxCode() == Inset::ERT_CODE);
+       return false;
+}