X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fparagraph.C;h=68445688ca5d9fa7318ab462b01c2cfe33660d46;hb=2c3af1475e2a408f725b5eea93583ee13e3d09cc;hp=f3d909649e8f03c35b834bf8cb517e8d661d5545;hpb=b56204339c39e97a7a7c160012b7d64d9e35d228;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index f3d909649e..68445688ca 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -24,7 +24,6 @@ #include "bufferparams.h" #include "debug.h" #include "LaTeXFeatures.h" -#include "lyx_gui_misc.h" #include "texrow.h" #include "BufferView.h" #include "encoding.h" @@ -894,7 +893,7 @@ void Paragraph::breakParagraph(BufferParams const & bparams, // copy everything behind the break-position // to the new paragraph - pos_type pos_end = pimpl_->size() - 1; + pos_type pos_end = size() - 1; pos_type i = pos; pos_type j = pos; for (; i <= pos_end; ++i) { @@ -970,7 +969,7 @@ void Paragraph::breakParagraphConservative(BufferParams const & bparams, if (size() > pos) { // copy everything behind the break-position to the new // paragraph - pos_type pos_end = pimpl_->size() - 1; + pos_type pos_end = size() - 1; //pos_type i = pos; //pos_type j = pos; @@ -1054,6 +1053,18 @@ Paragraph::depth_type Paragraph::getDepth() const } +Paragraph::depth_type Paragraph::getMaxDepthAfter(Buffer const * buffer) const +{ + const bool isenv = textclasslist.Style(buffer->params.textclass, + getLayout()).isEnvironment(); + + if (isenv) + return params().depth() + 1; + else + return params().depth(); + +} + char Paragraph::getAlign() const { return params().align(); @@ -1179,14 +1190,14 @@ Paragraph const * Paragraph::depthHook(depth_type depth) const Paragraph * Paragraph::outerHook() { - if(!getDepth()) + if (!getDepth()) return 0; return depthHook(depth_type(getDepth() - 1)); } Paragraph const * Paragraph::outerHook() const { - if(!getDepth()) + if (!getDepth()) return 0; return depthHook(depth_type(getDepth() - 1)); } @@ -1221,51 +1232,59 @@ int Paragraph::getPositionOfInset(Inset const * 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().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().lineTop()) { + os << "\\lyxline{\\" << getFont(bparams, 0).latexSize() << '}' + << "\\vspace{-1\\parskip}"; + further_blank_line = true; + } - if (further_blank_line){ - os << '\n'; - texrow.newline(); + if (further_blank_line) { + os << '\n'; + texrow.newline(); + } + } else { + style = textclasslist.Style(bparams.textclass, 0); } Language const * language = getParLanguage(bparams); @@ -1275,22 +1294,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(); } @@ -1336,11 +1357,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 << "{"; @@ -1374,31 +1394,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().spaceBottom().kind() != VSpace::NONE) { + os << params().spaceBottom().asLatexCommand(bparams); + further_blank_line = true; + } - if (params().pagebreakBottom()) { - os << "\\newpage"; - further_blank_line = true; - } + if (params().pagebreakBottom()) { + os << "\\newpage"; + further_blank_line = true; + } - if (further_blank_line){ - os << '\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(); + if (!params().spacing().isDefault() + && (!next_ || !next_->hasSameLayout(this))) { + os << params().spacing().writeEnvirEnd() << "\n"; + texrow.newline(); + } } // we don't need it for the last paragraph!!! @@ -1429,20 +1451,114 @@ Paragraph * Paragraph::TeXOnePar(Buffer const * buf, return next_; } +// This could go to ParagraphParameters if we want to +int Paragraph::startTeXParParams(BufferParams const & bparams, + ostream & os) const +{ + int column = 0; + + 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; + } + 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; + } + + return column; +} + +// This could go to ParagraphParameters if we want to +int Paragraph::endTeXParParams(BufferParams const & bparams, + ostream & os) const +{ + int column = 0; + + 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; + } + return column; +} + // 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. @@ -1462,13 +1578,6 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf, basefont = getLayoutFont(bparams); } - if (main_body >= 0 && !pimpl_->size()) { - if (style.isCommand()) { - os << '{'; - ++column; - } - } - moving_arg |= style.needprotect; // Which font is currently active? @@ -1478,6 +1587,17 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf, texrow.start(this, 0); + // if the paragraph is empty, the loop will not be entered at all + if (!size()) { + if (style.isCommand()) { + os << '{'; + ++column; + } + if (!asdefault) + column += startTeXParParams(bparams, os); + + } + for (pos_type i = 0; i < size(); ++i) { ++column; // First char in paragraph or after label? @@ -1496,54 +1616,23 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf, os << '{'; ++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; - } - 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; - } + + if (!asdefault) + column += startTeXParParams(bparams, os); } - + value_type c = getChar(i); // Fully instantiated font LyXFont font = getFont(bparams, i); - LyXFont const last_font = running_font; + LyXFont const & last_font = running_font; // Spaces at end of font change are simulated to be // outside font change, i.e. we write "\textXX{text} " // rather than "\textXX{text }". (Asger) if (open_font && c == ' ' && i <= size() - 2) { - LyXFont const next_font = getFont(bparams, i + 1); + LyXFont const & next_font = getFont(bparams, i + 1); if (next_font != running_font && next_font != font) { font = next_font; @@ -1636,35 +1725,9 @@ 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; - } - break; - case LYX_ALIGN_CENTER: - os << "\\end{center}"; - column+= 12; - break; - } + if (!asdefault) { + column += endTeXParParams(bparams, os); + } lyxerr[Debug::LATEX] << "SimpleTeXOnePar...done " << this << endl; return return_value; @@ -1851,7 +1914,9 @@ bool Paragraph::isSeparator(pos_type pos) const bool Paragraph::isLineSeparator(pos_type pos) const { - return IsLineSeparatorChar(getChar(pos)); + value_type const c = getChar(pos); + return IsLineSeparatorChar(c) + || (IsInsetChar(c) && getInset(pos)->isLineSeparator()); } @@ -1875,7 +1940,7 @@ bool Paragraph::isLetter(pos_type pos) const } -bool Paragraph::isWord(pos_type pos ) const +bool Paragraph::isWord(pos_type pos) const { return IsWordChar(getChar(pos)) ; } @@ -1889,7 +1954,9 @@ Paragraph::getParLanguage(BufferParams const & bparams) const return getFirstFontSettings().language(); #else Language const * lang = getFirstFontSettings().language(); +#ifdef WITH_WARNINGS #warning We should make this somewhat better, any ideas? (Jug) +#endif if (lang == inherit_language || lang == ignore_language) lang = bparams.language; return lang;