X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=68445688ca5d9fa7318ab462b01c2cfe33660d46;hb=2c3af1475e2a408f725b5eea93583ee13e3d09cc;hp=2a414c3134688d6c5ce35df87363b886f23a0ae5;hpb=d659612225b93787899a9e5f1c622ba93d181651;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index 2a414c3134..68445688ca 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -14,35 +14,37 @@ #pragma implementation #endif -#include -#include -#include - #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 "texrow.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 "lyx_gui_misc.h" -#include "texrow.h" #include "support/lyxmanip.h" -#include "BufferView.h" -#include "encoding.h" -#include "ParameterStruct.h" -#include "gettext.h" +#include "support/FileInfo.h" +#include "support/LAssert.h" +#include "support/textutils.h" + +#include +#include +#include using std::ostream; using std::endl; @@ -89,7 +91,7 @@ Paragraph::Paragraph() } -// This construktor inserts the new paragraph in a list. +// This constructor inserts the new paragraph in a list. Paragraph::Paragraph(Paragraph * par) : layout(0), pimpl_(new Paragraph::Pimpl(this)) { @@ -140,6 +142,8 @@ Paragraph::Paragraph(Paragraph const & lp, bool same_ids) 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); } } @@ -438,6 +442,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 = ' '; @@ -712,8 +718,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 +758,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()); @@ -889,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) { @@ -965,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; @@ -1049,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(); @@ -1174,34 +1190,18 @@ 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)); } -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) @@ -1215,7 +1215,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(); @@ -1232,51 +1232,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().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); @@ -1286,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(); } @@ -1347,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 << "{"; @@ -1385,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!!! @@ -1440,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. @@ -1473,14 +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? @@ -1490,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? @@ -1508,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; @@ -1648,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; @@ -1799,8 +1850,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, @@ -1830,6 +1880,7 @@ Paragraph * Paragraph::TeXEnvironment(Buffer const * buf, if (style.isEnvironment()) { os << "\\end{" << style.latexname() << "}\n"; + texrow.newline(); } lyxerr[Debug::LATEX] << "TeXEnvironment...done " << par << endl; @@ -1863,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()); } @@ -1887,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)) ; } @@ -1901,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;