]> git.lyx.org Git - features.git/blobdiff - src/buffer.C
small stuff
[features.git] / src / buffer.C
index 53893e39d3924b5aff3e3f9972401d983a921a77..3701b7768301e033e35fd04db72f5353d9aee5df 100644 (file)
@@ -55,7 +55,7 @@
 #include "insets/insetlabel.h"
 #include "insets/insetref.h"
 #include "insets/inseturl.h"
-#include "insets/insetinfo.h"
+#include "insets/insetnote.h"
 #include "insets/insetquotes.h"
 #include "insets/insetlatexaccent.h"
 #include "insets/insetbib.h" 
 #include "insets/insetmarginal.h"
 #include "insets/insetminipage.h"
 #include "insets/insetfloat.h"
-#include "insets/insetlist.h"
 #include "insets/insettabular.h"
+#if 0
 #include "insets/insettheorem.h"
+#include "insets/insetlist.h"
+#endif
 #include "insets/insetcaption.h"
 #include "insets/insetfloatlist.h"
+#include "support/textutils.h"
 #include "support/filetools.h"
 #include "support/path.h"
 #include "support/os.h"
@@ -388,7 +391,7 @@ void Buffer::insertErtContents(Paragraph * par, int & pos,
        if (!ert_comp.contents.empty()) {
                lyxerr[Debug::INSETS] << "ERT contents:\n"
                       << ert_comp.contents << endl;
-               Inset * inset = new InsetERT(ert_comp.contents);
+               Inset * inset = new InsetERT(ert_comp.contents, true);
                par->insertInset(pos++, inset, font);
                ert_comp.contents.erase();
        }
@@ -428,7 +431,6 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                        par->insertChar(pos, (*cit), font);
                        ++pos;
                }
-               checkminipage = true;
 #ifdef NO_LATEX
                }
 #endif
@@ -587,7 +589,9 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                }
 
                if (!inset) {
+#ifndef NO_PEXTRA_REALLY
                        --call_depth;
+#endif
                        return false; // no end read yet
                }
                
@@ -762,6 +766,12 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
        } else if (token == "\\use_amsmath") {
                lex.nextToken();
                params.use_amsmath = lex.GetInteger();
+       } else if (token == "\\use_natbib") {
+               lex.nextToken();
+               params.use_natbib = lex.GetInteger();
+       } else if (token == "\\use_numerical_citations") {
+               lex.nextToken();
+               params.use_numerical_citations = lex.GetInteger();
        } else if (token == "\\paperorientation") {
                int tmpret = lex.FindToken(string_orientation);
                if (tmpret == -1) ++tmpret;
@@ -1096,9 +1106,6 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                inset->read(this, lex);
                par->insertInset(pos, inset, font);
                ++pos;
-               // because of OLD_TABULAR_READ where tabulars have been
-               // one paragraph.
-               checkminipage = true;
        } else if (token == "\\hfill") {
                par->insertChar(pos, Paragraph::META_HFILL, font);
                ++pos;
@@ -1141,7 +1148,9 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                insertErtContents(par, pos, font);
 #endif
                the_end_read = true;
+#ifndef NO_PEXTRA_REALLY
                minipar = parBeforeMinipage = 0;
+#endif
        } else {
 #ifdef NO_LATEX
                if (ert_comp.active) {
@@ -1161,7 +1170,17 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
                }
 #endif
        }
+
 #ifndef NO_PEXTRA_REALLY
+       // I wonder if we could use this blanket fix for all the
+       // checkminipage cases...
+       if (par && par->size()) {
+               // It is possible that this will check to often,
+               // but that should not be an correctness issue.
+               // Only a speed issue.
+               checkminipage = true;
+       }
+       
        // now check if we have a minipage paragraph as at this
        // point we already read all the necessary data!
        // this cannot be done in layout because there we did
@@ -1303,11 +1322,64 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, Paragraph *& par,
        }
        }
        // End of pextra_minipage compability
-#endif
        --call_depth;
+#endif
        return the_end_read;
 }
 
+// needed to insert the selection
+void Buffer::insertStringAsLines(Paragraph *& par, Paragraph::size_type & pos,
+                                LyXFont const & font, 
+                                string const & str) const
+{
+       LyXLayout const & layout = textclasslist.Style(params.textclass, 
+                                                    par->getLayout());
+       // insert the string, don't insert doublespace
+       bool space_inserted = true;
+       for(string::const_iterator cit = str.begin(); 
+           cit != str.end(); ++cit) {
+               if (*cit == '\n') {
+                       if (par->size() || layout.keepempty) { 
+                               par->breakParagraph(params, pos, 
+                                                   layout.isEnvironment());
+                               par = par->next();
+                               pos = 0;
+                               space_inserted = true;
+                       } else {
+                               continue;
+                       }
+                       // do not insert consecutive spaces if !free_spacing
+               } else if ((*cit == ' ' || *cit == '\t')
+                          && space_inserted && !layout.free_spacing) {
+                       continue;
+               } else if (*cit == '\t') {
+                       if (!layout.free_spacing) {
+                               // tabs are like spaces here
+                               par->insertChar(pos, ' ', font);
+                               ++pos;
+                               space_inserted = true;
+                       } else {
+                               const Paragraph::value_type nb = 8 - pos % 8;
+                               for (Paragraph::size_type a = 0; 
+                                    a < nb ; ++a) {
+                                       par->insertChar(pos, ' ', font);
+                                       ++pos;
+                               }
+                               space_inserted = true;
+                       }
+               } else if (!IsPrintable(*cit)) {
+                       // Ignore unprintables
+                       continue;
+               } else {
+                       // just insert the character
+                       par->insertChar(pos, *cit, font);
+                       ++pos;
+                       space_inserted = (*cit == ' ');
+               }
+
+       }       
+}
+
 
 void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                       int & pos, LyXFont & font)
@@ -1331,7 +1403,9 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
 
                string const cmdName = inscmd.getCmdName();
                
-               if (cmdName == "cite") {
+               // This strange command allows LyX to recognize "natbib" style
+               // citations: citet, citep, Citet etc.
+               if (compare_no_case(cmdName, "cite", 4) == 0) {
                        inset = new InsetCitation(inscmd);
                } else if (cmdName == "bibitem") {
                        lex.printError("Wrong place for bibitem");
@@ -1370,6 +1444,7 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        inset = new InsetParent(inscmd, *this);
                }
        } else {
+               bool alreadyread = false;
                if (tmptok == "Quotes") {
                        inset = new InsetQuotes;
                } else if (tmptok == "External") {
@@ -1380,8 +1455,13 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        inset = new InsetFormula;
                } else if (tmptok == "Figure") {
                        inset = new InsetFig(100, 100, *this);
-               } else if (tmptok == "Info") {
-                       inset = new InsetInfo;
+               } else if (tmptok == "Info") {// backwards compatibility
+                       inset = new InsetNote(this,
+                                             lex.getLongString("\\end_inset"),
+                                             true);
+                       alreadyread = true;
+               } else if (tmptok == "Note") {
+                       inset = new InsetNote;
                } else if (tmptok == "Include") {
                        InsetCommandParams p( "Include" );
                        inset = new InsetInclude(p, *this);
@@ -1401,10 +1481,12 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        lex.next();
                        string tmptok = lex.GetString();
                        inset = new InsetFloat(tmptok);
+#if 0
                } else if (tmptok == "List") {
                        inset = new InsetList;
                } else if (tmptok == "Theorem") {
                        inset = new InsetList;
+#endif
                } else if (tmptok == "Caption") {
                        inset = new InsetCaption;
                } else if (tmptok == "GRAPHICS") {
@@ -1413,7 +1495,7 @@ void Buffer::readInset(LyXLex & lex, Paragraph *& par,
                        inset = new InsetFloatList;
                }
                
-               if (inset) inset->read(this, lex);
+               if (inset && !alreadyread) inset->read(this, lex);
        }
        
        if (inset) {
@@ -3386,7 +3468,6 @@ void Buffer::validate(LaTeXFeatures & features) const
                textclasslist.TextClass(params.textclass);
     
         // AMS Style is at document level
-    
         features.amsstyle = (params.use_amsmath ||
                             tclass.provides(LyXTextClass::amsmath));