X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=075df005f7d354e404cb6afaa318ce4b13b0f69f;hb=15271fce0705ea5611647b5b3d1e993362ff5284;hp=b493a5498a61ad29ed4ed24181a09c1e2b35d076;hpb=d89e29cf7c0e67ed59d5f920930862007553b5b1;p=lyx.git diff --git a/src/text.C b/src/text.C index b493a5498a..075df005f7 100644 --- a/src/text.C +++ b/src/text.C @@ -13,9 +13,9 @@ #include #include +#include "lyxtext.h" #include "layout.h" #include "lyxparagraph.h" -#include "lyxtext.h" #include "support/textutils.h" #include "insets/insetbib.h" #include "insets/insettext.h" @@ -23,24 +23,27 @@ #include "gettext.h" #include "bufferparams.h" #include "buffer.h" -#include "minibuffer.h" #include "debug.h" #include "lyxrc.h" #include "LyXView.h" -#include "lyxrow.h" #include "Painter.h" #include "tracer.h" #include "font.h" #include "encoding.h" #include "lyxscreen.h" #include "bufferview_funcs.h" +#include "language.h" using std::max; using std::min; using std::endl; using std::pair; -static const int LYX_PAPER_MARGIN = 20; +namespace { + +int const LYX_PAPER_MARGIN = 20; + +} // namespace anon extern int bibitemMaxWidth(BufferView *, LyXFont const &); @@ -48,12 +51,21 @@ extern int bibitemMaxWidth(BufferView *, LyXFont const &); int LyXText::workWidth(BufferView * bview) const { if (inset_owner) { - return inset_owner->textWidth(bview->painter()); + return inset_owner->textWidth(bview); } return bview->workWidth(); } +int LyXText::GetRealCursorX(BufferView * bview) const +{ + int x = cursor.x(); + if (the_locking_inset && (the_locking_inset->getLyXText(bview)!=this)) + x = the_locking_inset->getLyXText(bview)->GetRealCursorX(bview); + return x; +} + + unsigned char LyXText::TransformChar(unsigned char c, LyXParagraph * par, LyXParagraph::size_type pos) const { @@ -65,7 +77,8 @@ unsigned char LyXText::TransformChar(unsigned char c, LyXParagraph * par, unsigned char const prev_char = pos > 0 ? par->GetChar(pos-1) : ' '; unsigned char next_char = ' '; - for (LyXParagraph::size_type i = pos+1; i < par->Last(); ++i) + + for (LyXParagraph::size_type i = pos+1; i < par->size(); ++i) if (!Encodings::IsComposeChar_arabic(par->GetChar(i))) { next_char = par->GetChar(i); break; @@ -120,7 +133,7 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par, int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par, LyXParagraph::size_type pos, char c) const { - LyXFont font = GetFont(bview->buffer(), par, pos); + LyXFont const font = GetFont(bview->buffer(), par, pos); // The most common case is handled first (Asger) if (IsPrintable(c)) { @@ -141,42 +154,6 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par, } else if (IsHfillChar(c)) { return 3; /* Because of the representation * as vertical lines */ -#ifndef NEW_INSETS - } else if (c == LyXParagraph::META_FOOTNOTE || - c == LyXParagraph::META_MARGIN || - c == LyXParagraph::META_FIG || - c == LyXParagraph::META_TAB || - c == LyXParagraph::META_WIDE_FIG || - c == LyXParagraph::META_WIDE_TAB || - c == LyXParagraph::META_ALGORITHM) { - string fs; - switch (c) { - case LyXParagraph::META_MARGIN: - fs = "margin"; - break; - case LyXParagraph::META_FIG: - fs = "fig"; - break; - case LyXParagraph::META_TAB: - fs = "tab"; - break; - case LyXParagraph::META_ALGORITHM: - fs = "alg"; - break; - case LyXParagraph::META_WIDE_FIG: - fs = "wide-fig"; - break; - case LyXParagraph::META_WIDE_TAB: - fs = "wide-tab"; - break; - case LyXParagraph::META_FOOTNOTE: - fs = "foot"; - break; - } - font.decSize(); - font.decSize(); - return lyxfont::width(fs, font); -#endif } else if (c == LyXParagraph::META_INSET) { Inset * tmpinset = par->GetInset(pos); if (tmpinset) { @@ -197,9 +174,9 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par, LyXParagraph::size_type LyXText::RowLast(Row const * row) const { if (row->next() == 0) - return row->par()->Last() - 1; + return row->par()->size() - 1; else if (row->next()->par() != row->par()) - return row->par()->Last() - 1; + return row->par()->size() - 1; else return row->next()->pos() - 1; } @@ -354,7 +331,7 @@ bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par, } bool const rtl = bidi_level(pos - 1) % 2; - bool rtl2 = bidi_InRange(pos) + bool const rtl2 = bidi_InRange(pos) ? bidi_level(pos) % 2 : par->isRightToLeftPar(buf->params); return rtl != rtl2; @@ -369,7 +346,7 @@ bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par, return false; // This is just for speedup bool const rtl = font.isVisibleRightToLeft(); - bool rtl2 = bidi_InRange(pos) + bool const rtl2 = bidi_InRange(pos) ? bidi_level(pos) % 2 : par->isRightToLeftPar(buf->params); return rtl != rtl2; @@ -393,7 +370,8 @@ void LyXText::draw(BufferView * bview, Row const * row, int const wid = lyxfont::width('n', font); int const asc = lyxfont::maxAscent(font); int const y = offset + row->baseline(); - int xp[3], yp[3]; + int xp[3]; + int yp[3]; if (bidi_level(pos) % 2 == 0) { xp[0] = int(x + wid * 0.375); @@ -446,60 +424,8 @@ void LyXText::draw(BufferView * bview, Row const * row, LyXFont font = GetFont(bview->buffer(), row->par(), pos); LyXFont font2 = font; -#ifndef NEW_INSETS - if (c == LyXParagraph::META_FOOTNOTE - || c == LyXParagraph::META_MARGIN - || c == LyXParagraph::META_FIG - || c == LyXParagraph::META_TAB - || c == LyXParagraph::META_WIDE_FIG - || c == LyXParagraph::META_WIDE_TAB - || c == LyXParagraph::META_ALGORITHM) { - string fs; - switch (c) { - case LyXParagraph::META_MARGIN: - fs = "margin"; - break; - case LyXParagraph::META_FIG: - fs = "fig"; - break; - case LyXParagraph::META_TAB: - fs = "tab"; - break; - case LyXParagraph::META_ALGORITHM: - fs = "alg"; - break; - case LyXParagraph::META_WIDE_FIG: - fs = "wide-fig"; - break; - case LyXParagraph::META_WIDE_TAB: - fs = "wide-tab"; - break; - case LyXParagraph::META_FOOTNOTE: - fs = "foot"; - break; - } - font.decSize(); - font.decSize(); - - // calculate the position of the footnotemark - int const y = (row->baseline() - lyxfont::maxAscent(font2) - + lyxfont::maxAscent(font)); - - font.setColor(LColor::footnote); - - // draw it and set new x position - - pain.text(int(x), offset + y, fs, font); - x += lyxfont::width(fs, font); - pain.line(int(tmpx), offset + row->baseline(), - int(x), offset + row->baseline(), - LColor::footnote); - ++vpos; - return; - } else -#endif - if (c == LyXParagraph::META_INSET) { + if (c == LyXParagraph::META_INSET) { Inset * tmpinset = row->par()->GetInset(pos); if (tmpinset) { // tmpinset->update(bview, font, false); @@ -664,25 +590,14 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const textclasslist .TextClass(bview->buffer()->params.textclass) .defaultfont()); -#ifndef NEW_INSETS - if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) { - LyXFont font(LyXFont::ALL_SANE); - font.setSize(LyXFont::SIZE_SMALL); - x += lyxfont::width("Mwide-figM", font) - + LYX_PAPER_MARGIN/2; - } -#endif + // this is the way, LyX handles the LaTeX-Environments. // I have had this idea very late, so it seems to be a // later added hack and this is true if (!row->par()->GetDepth()) { if (!row->par()->GetLayout()) { // find the previous same level paragraph -#ifndef NEW_INSETS - if (row->par()->FirstPhysicalPar()->Previous()) { -#else - if (row->par()->Previous()) { -#endif + if (row->par()->previous()) { LyXParagraph * newpar = row->par() ->DepthHook(row->par()->GetDepth()); if (newpar && @@ -702,34 +617,23 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const // check wether it is a sufficent paragraph if (newpar -#ifndef NEW_INSETS - && newpar->footnoteflag == row->par()->footnoteflag -#endif && textclasslist .Style(bview->buffer()->params.textclass, newpar->GetLayout()).isEnvironment()) { Row dummyrow; dummyrow.par(newpar); - dummyrow.pos(newpar->Last()); + dummyrow.pos(newpar->size()); x = LeftMargin(bview, &dummyrow); } else { // this is no longer an error, because this function // is used to clear impossible depths after changing // a layout. Since there is always a redo, // LeftMargin() is always called -#ifndef NEW_INSETS - row->par()->FirstPhysicalPar()->depth = 0; -#else - row->par()->depth = 0; -#endif + row->par()->params.depth(0); } if (newpar && !row->par()->GetLayout()) { -#ifndef NEW_INSETS - if (newpar->FirstPhysicalPar()->noindent) -#else - if (newpar->noindent) -#endif + if (newpar->params.noindent()) parindent.erase(); else parindent = textclasslist @@ -827,34 +731,14 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const } break; } - if ((workWidth(bview) > 0) && - (row->par()->pextra_type == LyXParagraph::PEXTRA_INDENT)) { - if (!row->par()->pextra_widthp.empty()) { - x += workWidth(bview) * - lyx::atoi(row->par()->pextra_widthp) / 100; - } else if (!row->par()->pextra_width.empty()) { - int xx = VSpace(row->par()->pextra_width).inPixels(bview); - if (xx > workWidth(bview)) - xx = workWidth(bview) * 80 / 100; - x += xx; - } else { // should not happen - LyXFont font(LyXFont::ALL_SANE); - x += lyxfont::width("XXXXXX", font); - } - } int align; // wrong type -#ifndef NEW_INSETS - if (row->par()->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT) - align = layout.align; - else - align = row->par()->FirstPhysicalPar()->align; -#else - if (row->par()->align == LYX_ALIGN_LAYOUT) + + if (row->par()->params.align() == LYX_ALIGN_LAYOUT) align = layout.align; else - align = row->par()->align; -#endif + align = row->par()->params.align(); + // set the correct parindent if (row->pos() == 0) { if ((layout.labeltype == LABEL_NO_LABEL @@ -863,11 +747,8 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const || (layout.labeltype == LABEL_STATIC && layout.latextype == LATEX_ENVIRONMENT && ! row->par()->IsFirstInSequence())) -#ifndef NEW_INSETS - && row->par() == row->par()->FirstPhysicalPar() -#endif && align == LYX_ALIGN_BLOCK - && !row->par()->noindent + && !row->par()->params.noindent() && (row->par()->layout || bview->buffer()->params.paragraph_separation == BufferParams::PARSEP_INDENT)) @@ -902,11 +783,6 @@ int LyXText::RightMargin(Buffer const * buf, Row const * row) const .TextClass(buf->params.textclass) .defaultfont()); -#ifndef NEW_INSETS - if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) { - x += LYX_PAPER_MARGIN / 2; - } -#endif // this is the way, LyX handles the LaTeX-Environments. // I have had this idea very late, so it seems to be a // later added hack and this is true @@ -915,27 +791,15 @@ int LyXText::RightMargin(Buffer const * buf, Row const * row) const LyXParagraph * newpar = row->par(); -#ifndef NEW_INSETS do { - newpar = newpar->FirstPhysicalPar()->Previous(); - if (newpar) - newpar = newpar->FirstPhysicalPar(); - } while (newpar && newpar->GetDepth() >= row->par()->GetDepth() - && newpar->footnoteflag == row->par()->footnoteflag); -#else - do { - newpar = newpar->Previous(); + newpar = newpar->previous(); } while (newpar && newpar->GetDepth() >= row->par()->GetDepth()); -#endif // make a corresponding row. Needed to call LeftMargin() // check wether it is a sufficent paragraph if (newpar -#ifndef NEW_INSETS - && newpar->footnoteflag == row->par()->footnoteflag -#endif && textclasslist.Style(buf->params.textclass, newpar->GetLayout()) .isEnvironment()) { @@ -948,11 +812,7 @@ int LyXText::RightMargin(Buffer const * buf, Row const * row) const // is used to clear impossible depths after changing // a layout. Since there is always a redo, // LeftMargin() is always called -#ifndef NEW_INSETS - row->par()->FirstPhysicalPar()->depth = 0; -#else - row->par()->depth = 0; -#endif + row->par()->params.depth(0); } } @@ -972,7 +832,7 @@ int LyXText::LabelEnd(BufferView * bview, Row const * row) const == MARGIN_MANUAL) { Row tmprow; tmprow = *row; - tmprow.pos(row->par()->Last()); + tmprow.pos(row->par()->size()); return LeftMargin(bview, &tmprow); /* just the beginning of the main body */ } else @@ -989,7 +849,7 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const LyXParagraph * par = row->par(); if (width < 0) - return par->Last(); + return par->size(); LyXParagraph::size_type const pos = row->pos(); @@ -1007,10 +867,10 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) { /* special code for right address boxes, only newlines count */ - while (i < par->Last()) { + while (i < par->size()) { if (par->IsNewline(i)) { last_separator = i; - i = par->Last() - 1; // this means break + i = par->size() - 1; // this means break //x = width; } else if (par->GetChar(i) == LyXParagraph::META_INSET && par->GetInset(i) && par->GetInset(i)->display()){ @@ -1021,7 +881,7 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const } else { // Last position is an invariant LyXParagraph::size_type const last = - par->Last(); + par->size(); // this is the usual handling int x = LeftMargin(bview, row); bool doitonetime = true; @@ -1104,7 +964,7 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const int LyXText::Fill(BufferView * bview, Row * row, int paper_width) const { if (paper_width < 0) - return 0; + return 20; int w; // get the pure distance @@ -1149,6 +1009,13 @@ int LyXText::Fill(BufferView * bview, Row * row, int paper_width) const } int const fill = paper_width - w - RightMargin(bview->buffer(), row); +#ifdef WITH_WARNINGS +#warning Please fix me (Jug!) +#endif +#if 0 + if (fill < 0) + return 0; +#endif return fill; } @@ -1179,8 +1046,8 @@ int LyXText::LabelFill(BufferView * bview, Row const * row) const } int fill = 0; - if (!row->par()->labelwidthstring.empty()) { - fill = max(lyxfont::width(row->par()->labelwidthstring, + if (!row->par()->params.labelWidthString().empty()) { + fill = max(lyxfont::width(row->par()->params.labelWidthString(), GetFont(bview->buffer(), row->par(), -2)) - w, 0); } @@ -1313,18 +1180,13 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const /* Correction: only the fontsize count. The other properties are taken from the layoutfont. Nicer on the screen :) */ -#ifndef NEW_INSETS - LyXParagraph * par = row_ptr->par()->LastPhysicalPar(); - LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar(); -#else LyXParagraph * par = row_ptr->par(); LyXParagraph * firstpar = row_ptr->par(); -#endif LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass, firstpar->GetLayout()); - - LyXFont font = GetFont(bview->buffer(), par, par->Last() - 1); + + LyXFont font = GetFont(bview->buffer(), par, par->size() - 1); LyXFont::FONT_SIZE const size = font.size(); font = GetFont(bview->buffer(), par, -1); font.setSize(size); @@ -1332,8 +1194,8 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const LyXFont labelfont = GetFont(bview->buffer(), par, -2); float spacing_val = 1.0; - if (!row_ptr->par()->spacing.isDefault()) { - spacing_val = row_ptr->par()->spacing.getValue(); + if (!row_ptr->par()->params.spacing().isDefault()) { + spacing_val = row_ptr->par()->params.spacing().getValue(); } else { spacing_val = bview->buffer()->params.spacing.getValue(); } @@ -1355,7 +1217,7 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const tmpfont = GetFont(bview->buffer(), row_ptr->par(), pos); tmpinset = row_ptr->par()->GetInset(pos); if (tmpinset) { - tmpinset->update(bview, tmpfont); +// tmpinset->update(bview, tmpfont); asc = tmpinset->ascent(bview, tmpfont); desc = tmpinset->descent(bview, tmpfont); maxwidth += tmpinset->width(bview, tmpfont); @@ -1390,49 +1252,49 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const row_ptr->ascent_of_text(maxasc); - /* is it a top line? */ + // is it a top line? if (!row_ptr->pos() && (row_ptr->par() == firstpar)) { - /* some parksips VERY EASY IMPLEMENTATION */ + // some parksips VERY EASY IMPLEMENTATION if (bview->buffer()->params.paragraph_separation == BufferParams::PARSEP_SKIP) { if (layout.isParagraph() && firstpar->GetDepth() == 0 - && firstpar->Previous()) + && firstpar->previous()) maxasc += bview->buffer()->params.getDefSkip().inPixels(bview); - else if (firstpar->Previous() + else if (firstpar->previous() && textclasslist.Style(bview->buffer()->params.textclass, - firstpar->Previous()->GetLayout()).isParagraph() - && firstpar->Previous()->GetDepth() == 0) + firstpar->previous()->GetLayout()).isParagraph() + && firstpar->previous()->GetDepth() == 0) // is it right to use defskip here too? (AS) maxasc += bview->buffer()->params.getDefSkip().inPixels(bview); } - /* the paper margins */ - if (!row_ptr->par()->previous && bv_owner) + // the paper margins + if (!row_ptr->par()->previous() && bv_owner) maxasc += LYX_PAPER_MARGIN; - /* add the vertical spaces, that the user added */ - if (firstpar->added_space_top.kind() != VSpace::NONE) - maxasc += int(firstpar->added_space_top.inPixels(bview)); + // add the vertical spaces, that the user added + if (firstpar->params.spaceTop().kind() != VSpace::NONE) + maxasc += int(firstpar->params.spaceTop().inPixels(bview)); - /* do not forget the DTP-lines! - * there height depends on the font of the nearest character */ - if (firstpar->line_top) + // do not forget the DTP-lines! + // there height depends on the font of the nearest character + if (firstpar->params.lineTop()) maxasc += 2 * lyxfont::ascent('x', GetFont(bview->buffer(), firstpar, 0)); - /* and now the pagebreaks */ - if (firstpar->pagebreak_top) + // and now the pagebreaks + if (firstpar->params.pagebreakTop()) maxasc += 3 * DefaultHeight(); - /* this is special code for the chapter, since the label of this - * layout is printed in an extra row */ + // This is special code for the chapter, since the label of this + // layout is printed in an extra row if (layout.labeltype == LABEL_COUNTER_CHAPTER && bview->buffer()->params.secnumdepth >= 0) { float spacing_val = 1.0; - if (!row_ptr->par()->spacing.isDefault()) { - spacing_val = row_ptr->par()->spacing.getValue(); + if (!row_ptr->par()->params.spacing().isDefault()) { + spacing_val = row_ptr->par()->params.spacing().getValue(); } else { spacing_val = bview->buffer()->params.spacing.getValue(); } @@ -1445,15 +1307,15 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const spacing_val); } - /* special code for the top label */ + // special code for the top label if ((layout.labeltype == LABEL_TOP_ENVIRONMENT || layout.labeltype == LABEL_BIBLIO || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) && row_ptr->par()->IsFirstInSequence() && !row_ptr->par()->GetLabelstring().empty()) { float spacing_val = 1.0; - if (!row_ptr->par()->spacing.isDefault()) { - spacing_val = row_ptr->par()->spacing.getValue(); + if (!row_ptr->par()->params.spacing().isDefault()) { + spacing_val = row_ptr->par()->params.spacing().getValue(); } else { spacing_val = bview->buffer()->params.spacing.getValue(); } @@ -1469,11 +1331,11 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const + layout.labelbottomsep * DefaultHeight()); } - /* and now the layout spaces, for example before and after a section, - * or between the items of a itemize or enumerate environment */ + // and now the layout spaces, for example before and after a section, + // or between the items of a itemize or enumerate environment - if (!firstpar->pagebreak_top) { - LyXParagraph * prev = row_ptr->par()->Previous(); + if (!firstpar->params.pagebreakTop()) { + LyXParagraph * prev = row_ptr->par()->previous(); if (prev) prev = row_ptr->par()->DepthHook(row_ptr->par()->GetDepth()); if (prev && prev->GetLayout() == firstpar->GetLayout() @@ -1493,7 +1355,7 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const if (tmptop > 0) layoutasc = (tmptop * DefaultHeight()); } - else if (row_ptr->par()->line_top){ + else if (row_ptr->par()->params.lineTop()) { tmptop = layout.topsep; if (tmptop > 0) @@ -1506,49 +1368,46 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const prev->GetLayout()).parsep * DefaultHeight()); } else { - if (firstpar->Previous() - && firstpar->Previous()->GetDepth() == 0 - && firstpar->Previous()->GetLayout() != firstpar->GetLayout()) { - /* avoid parsep */ + if (firstpar->previous() + && firstpar->previous()->GetDepth() == 0 + && firstpar->previous()->GetLayout() != firstpar->GetLayout()) { + // avoid parsep } - else if (firstpar->Previous()){ + else if (firstpar->previous()){ maxasc += int(layout.parsep * DefaultHeight()); } } } } - /* is it a bottom line? */ - if ( -#ifndef NEW_INSETS - row_ptr->par()->ParFromPos(RowLast(row_ptr) + 1) == par -#else - row_ptr->par() == par -#endif - && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) { + // is it a bottom line? + if (row_ptr->par() == par + && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) { - /* the paper margins */ - if (!par->next && bv_owner) + // the paper margins + if (!par->next() && bv_owner) maxdesc += LYX_PAPER_MARGIN; - - /* add the vertical spaces, that the user added */ - if (firstpar->added_space_bottom.kind() != VSpace::NONE) - maxdesc += int(firstpar->added_space_bottom.inPixels(bview)); - /* do not forget the DTP-lines! - * there height depends on the font of the nearest character */ - if (firstpar->line_bottom) - maxdesc += 2 * lyxfont::ascent('x', GetFont(bview->buffer(), - par, par->Last() - 1)); + // add the vertical spaces, that the user added + if (firstpar->params.spaceBottom().kind() != VSpace::NONE) + maxdesc += int(firstpar->params.spaceBottom().inPixels(bview)); - /* and now the pagebreaks */ - if (firstpar->pagebreak_bottom) + // do not forget the DTP-lines! + // there height depends on the font of the nearest character + if (firstpar->params.lineBottom()) + maxdesc += 2 * lyxfont::ascent('x', + GetFont(bview->buffer(), + par, par->size() - 1)); + + // and now the pagebreaks + if (firstpar->params.pagebreakBottom()) maxdesc += 3 * DefaultHeight(); - /* and now the layout spaces, for example before and after a section, - * or between the items of a itemize or enumerate environment */ - if (!firstpar->pagebreak_bottom && row_ptr->par()->Next()) { - LyXParagraph * nextpar = row_ptr->par()->Next(); + // and now the layout spaces, for example before and after + // a section, or between the items of a itemize or enumerate + // environment + if (!firstpar->params.pagebreakBottom() && row_ptr->par()->next()) { + LyXParagraph * nextpar = row_ptr->par()->next(); LyXParagraph * comparepar = row_ptr->par(); float usual = 0; float unusual = 0; @@ -1576,18 +1435,19 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const } } - /* incalculate the layout spaces */ + // incalculate the layout spaces maxasc += int(layoutasc * 2 / (2 + firstpar->GetDepth())); maxdesc += int(layoutdesc * 2 / (2 + firstpar->GetDepth())); - /* calculate the new height of the text */ + // calculate the new height of the text height -= row_ptr->height(); row_ptr->height(maxasc + maxdesc + labeladdon); row_ptr->baseline(maxasc + labeladdon); height += row_ptr->height(); - float x, dummy; + float x; + float dummy; PrepareToPrint(bview, row_ptr, x, dummy, dummy, dummy, false); row_ptr->width(int(maxwidth + x)); if (inset_owner) { @@ -1610,8 +1470,7 @@ void LyXText::AppendParagraph(BufferView * bview, Row * row) const // The last character position of a paragraph is an invariant so we can // safely get it here. (Asger) - int const lastposition = row->par()->Last(); - + int const lastposition = row->par()->size(); do { // Get the next breakpoint int z = NextBreakPoint(bview, row, workWidth(bview)); @@ -1641,11 +1500,11 @@ void LyXText::BreakAgain(BufferView * bview, Row * row) const bool not_ready = true; do { - /* get the next breakpoint */ + // get the next breakpoint LyXParagraph::size_type z = NextBreakPoint(bview, row, workWidth(bview)); Row * tmprow = row; - - if (z < row->par()->Last()) { + + if (z < row->par()->size()) { if (!row->next() || (row->next() && row->next()->par() != row->par())) { // insert a new row ++z; @@ -1688,8 +1547,8 @@ void LyXText::BreakAgainOneRow(BufferView * bview, Row * row) // get the next breakpoint LyXParagraph::size_type z = NextBreakPoint(bview, row, workWidth(bview)); Row * tmprow = row; - - if (z < row->par()->Last()) { + + if (z < row->par()->size()) { if (!row->next() || (row->next() && row->next()->par() != row->par())) { /* insert a new row */ @@ -1730,29 +1589,18 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout) cursor.par()->GetLayout()); // this is only allowed, if the current paragraph is not empty or caption - if ((cursor.par()->Last() <= 0 -#ifndef NEW_INSETS - && !cursor.par()->IsDummy() -#endif - ) - && - layout.labeltype!= LABEL_SENSITIVE) - return; - + if ((cursor.par()->size() <= 0) + && layout.labeltype!= LABEL_SENSITIVE) + return; + SetUndo(bview->buffer(), Undo::INSERT, -#ifndef NEW_INSETS - cursor.par()->ParFromPos(cursor.pos())->previous, - cursor.par()->ParFromPos(cursor.pos())->next -#else - cursor.par()->previous, - cursor.par()->next -#endif - ); + cursor.par()->previous(), + cursor.par()->next()); // Always break behind a space // // It is better to erase the space (Dekel) - if (cursor.pos() < cursor.par()->Last() + if (cursor.pos() < cursor.par()->size() && cursor.par()->IsLineSeparator(cursor.pos())) cursor.par()->Erase(cursor.pos()); // cursor.pos(cursor.pos() + 1); @@ -1769,10 +1617,10 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout) if (layout.labeltype == LABEL_SENSITIVE) { if (!cursor.pos()) // set to standard-layout - cursor.par()->SetLayout(bview->buffer()->params, 0); + cursor.par()->SetLayout(0); else // set to standard-layout - cursor.par()->Next()->SetLayout(bview->buffer()->params, 0); + cursor.par()->next()->SetLayout(0); } /* if the cursor is at the beginning of a row without prior newline, @@ -1802,19 +1650,19 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout) cursor.row()->fill(Fill(bview, cursor.row(), workWidth(bview))); SetHeightOfRow(bview, cursor.row()); + + while (cursor.par()->next()->size() + && cursor.par()->next()->IsNewline(0)) + cursor.par()->next()->Erase(0); - while (cursor.par()->Next()->Last() - && cursor.par()->Next()->IsNewline(0)) - cursor.par()->Next()->Erase(0); - - InsertParagraph(bview, cursor.par()->Next(), cursor.row()); + InsertParagraph(bview, cursor.par()->next(), cursor.row()); UpdateCounters(bview, cursor.row()->previous()); /* This check is necessary. Otherwise the new empty paragraph will * be deleted automatically. And it is more friendly for the user! */ if (cursor.pos()) - SetCursor(bview, cursor.par()->Next(), 0); + SetCursor(bview, cursor.par()->next(), 0); else SetCursor(bview, cursor.par(), 0); @@ -1825,69 +1673,11 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout) } -#ifndef NEW_INSETS -void LyXText::OpenFootnote(BufferView * bview) -{ - LyXParagraph * endpar,* tmppar; - Row * row; - - LyXParagraph * par = cursor.par()->ParFromPos(cursor.pos()); - - /* if there is no footnote in this paragraph, just return. */ - if (!par->next - || par->next->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE) - return; - - /* ok, move the cursor right before the footnote */ - - /* just a little faster than using CursorRight() */ - for (cursor.pos(0); - cursor.par()->ParFromPos(cursor.pos()) != par;) { - cursor.pos(cursor.pos() + 1); - } - - /* now the cursor is at the beginning of the physical par */ - SetCursor(bview, cursor.par(), - cursor.pos() + cursor.par()->ParFromPos(cursor.pos())->size()); - - /* the cursor must be exactly before the footnote */ - par = cursor.par()->ParFromPos(cursor.pos()); - - status = LyXText::NEED_MORE_REFRESH; - refresh_row = cursor.row(); - refresh_y = cursor.y() - cursor.row()->baseline(); - - tmppar = cursor.par(); - endpar = cursor.par()->Next(); - row = cursor.row(); - - tmppar->OpenFootnote(cursor.pos()); - RemoveParagraph(row); - /* set the dimensions of the cursor row */ - row->fill(Fill(bview, row, workWidth(bview))); - SetHeightOfRow(bview, row); - // CHECK See comment on top of text.C - tmppar = tmppar->Next(); - - while (tmppar != endpar) { - if (tmppar) { - InsertParagraph(bview, tmppar, row); - while (row->next() && row->next()->par() == tmppar) - row = row->next(); - tmppar = tmppar->Next(); - } - } - SetCursor(bview, par->next, 0); - sel_cursor = cursor; -} -#endif - - // Just a macro to make some thing easier. void LyXText::RedoParagraph(BufferView * bview) const { - ClearSelection(); - RedoParagraphs(bview, cursor, cursor.par()->Next()); + ClearSelection(bview); + RedoParagraphs(bview, cursor, cursor.par()->next()); SetCursorIntern(bview, cursor.par(), cursor.pos()); } @@ -1897,14 +1687,8 @@ void LyXText::RedoParagraph(BufferView * bview) const void LyXText::InsertChar(BufferView * bview, char c) { SetUndo(bview->buffer(), Undo::INSERT, -#ifndef NEW_INSETS - cursor.par()->ParFromPos(cursor.pos())->previous, - cursor.par()->ParFromPos(cursor.pos())->next -#else - cursor.par()->previous, - cursor.par()->next -#endif - ); + cursor.par()->previous(), + cursor.par()->next()); // When the free-spacing option is set for the current layout, // disable the double-space checking @@ -1981,9 +1765,10 @@ void LyXText::InsertChar(BufferView * bview, char c) * current font */ // Get the font that is used to calculate the baselineskip - LyXParagraph::size_type const lastpos = cursor.par()->Last(); - LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params, - lastpos - 1); + LyXParagraph::size_type const lastpos = cursor.par()->size(); + LyXFont rawparfont = + cursor.par()->GetFontSettings(bview->buffer()->params, + lastpos - 1); bool jumped_over_space = false; @@ -1992,26 +1777,20 @@ void LyXText::InsertChar(BufferView * bview, char c) && cursor.par()->IsLineSeparator(cursor.pos() - 1)) || (cursor.pos() > 0 && cursor.par()->IsNewline(cursor.pos() - 1)) - || (cursor.pos() == 0 -#ifndef NEW_INSETS - && !(cursor.par()->Previous() - && cursor.par()->Previous()->footnoteflag - == LyXParagraph::OPEN_FOOTNOTE) -#endif - )) { - if (cursor.pos() == 0 ) - bview->owner()->getMiniBuffer()->Set(_("You cannot insert a space at the beginning of a paragraph. Please read the Tutorial.")); - else - bview->owner()->getMiniBuffer()->Set(_("You cannot type two spaces this way. Please read the Tutorial.")); + || (cursor.pos() == 0)) { + static bool sent_space_message = false; + if (!sent_space_message) { + if (cursor.pos() == 0) + bview->owner()->message(_("You cannot insert a space at the beginning of a paragraph. Please read the Tutorial.")); + else + bview->owner()->message(_("You cannot type two spaces this way. Please read the Tutorial.")); + sent_space_message = true; + } charInserted(); return; } } else if (IsNewlineChar(c)) { -#ifndef NEW_INSETS - if (cursor.par()->FirstPhysicalPar() == cursor.par() -#else if (cursor.par() == cursor.par() -#endif && cursor.pos() <= BeginningOfMainBody(bview->buffer(), cursor.par())) { charInserted(); return; @@ -2019,8 +1798,8 @@ void LyXText::InsertChar(BufferView * bview, char c) /* No newline at first position * of a paragraph or behind labels. * TeX does not allow that. */ - - if (cursor.pos() < cursor.par()->Last() && + + if (cursor.pos() < cursor.par()->size() && cursor.par()->IsLineSeparator(cursor.pos())) // newline always after a blank! CursorRight(bview); @@ -2087,8 +1866,8 @@ void LyXText::InsertChar(BufferView * bview, char c) else need_break_row = 0; - // check, wether the last characters font has changed. - if (cursor.pos() && cursor.pos() == cursor.par()->Last() + // check, wether the last characters font has changed. + if (cursor.pos() && cursor.pos() == cursor.par()->size() && rawparfont != rawtmpfont) RedoHeightOfParagraph(bview, cursor); @@ -2149,7 +1928,7 @@ void LyXText::InsertChar(BufferView * bview, char c) } // check, wether the last characters font has changed. - if (cursor.pos() && cursor.pos() == cursor.par()->Last() + if (cursor.pos() && cursor.pos() == cursor.par()->size() && rawparfont != rawtmpfont) { RedoHeightOfParagraph(bview, cursor); } else { @@ -2196,21 +1975,11 @@ void LyXText::PrepareToPrint(BufferView * bview, bool const is_rtl = row->par()->isRightToLeftPar(bview->buffer()->params); -#ifndef NEW_INSETS - if (is_rtl) { - x = RightMargin(bview->buffer(), row); - if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) { - LyXFont font(LyXFont::ALL_SANE); - font.setSize(LyXFont::SIZE_SMALL); - x += lyxfont::width("Mwide-figM", font); - } + x = (workWidth(bview) > 0) + ? RightMargin(bview->buffer(), row) : 0; } else -#endif - if (workWidth(bview) > 0) - x = LeftMargin(bview, row); - else - x = 0; + x = (workWidth(bview) > 0) ? LeftMargin(bview, row) : 0; // is there a manual margin with a manual label if (textclasslist.Style(bview->buffer()->params.textclass, @@ -2234,17 +2003,10 @@ void LyXText::PrepareToPrint(BufferView * bview, // is it block, flushleft or flushright? // set x how you need it int align; -#ifndef NEW_INSETS - if (row->par()->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT) - align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align; - else - align = row->par()->FirstPhysicalPar()->align; -#else - if (row->par()->align == LYX_ALIGN_LAYOUT) + if (row->par()->params.align() == LYX_ALIGN_LAYOUT) align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align; else - align = row->par()->align; -#endif + align = row->par()->params.align(); // center displayed insets Inset * inset; @@ -2311,25 +2073,23 @@ void LyXText::CursorRightOneWord(BufferView * bview) const LyXCursor tmpcursor = cursor; // CHECK See comment on top of text.C - if (tmpcursor.pos() == tmpcursor.par()->Last() - && tmpcursor.par()->Next()) { - tmpcursor.par(tmpcursor.par()->Next()); + if (tmpcursor.pos() == tmpcursor.par()->size() + && tmpcursor.par()->next()) { + tmpcursor.par(tmpcursor.par()->next()); tmpcursor.pos(0); } else { int steps = 0; // Skip through initial nonword stuff. - while (tmpcursor.pos() < tmpcursor.par()->Last() && - ! tmpcursor.par()->IsWord( tmpcursor.pos() ) ) - { + while (tmpcursor.pos() < tmpcursor.par()->size() && + ! tmpcursor.par()->IsWord( tmpcursor.pos())) { // printf("Current pos1 %d", tmpcursor.pos()) ; tmpcursor.pos(tmpcursor.pos() + 1); ++steps; } // Advance through word. - while (tmpcursor.pos() < tmpcursor.par()->Last() && - tmpcursor.par()->IsWord( tmpcursor.pos() ) ) - { + while (tmpcursor.pos() < tmpcursor.par()->size() && + tmpcursor.par()->IsWord( tmpcursor.pos())) { // printf("Current pos2 %d", tmpcursor.pos()) ; tmpcursor.pos(tmpcursor.pos() + 1); ++steps; @@ -2342,13 +2102,13 @@ void LyXText::CursorRightOneWord(BufferView * bview) const void LyXText::CursorTab(BufferView * bview) const { LyXCursor tmpcursor = cursor; - while (tmpcursor.pos() < tmpcursor.par()->Last() + while (tmpcursor.pos() < tmpcursor.par()->size() && !tmpcursor.par()->IsNewline(tmpcursor.pos())) tmpcursor.pos(tmpcursor.pos() + 1); - - if (tmpcursor.pos() == tmpcursor.par()->Last()){ - if (tmpcursor.par()->Next()) { - tmpcursor.par(tmpcursor.par()->Next()); + + if (tmpcursor.pos() == tmpcursor.par()->size()){ + if (tmpcursor.par()->next()) { + tmpcursor.par(tmpcursor.par()->next()); tmpcursor.pos(0); } } else @@ -2368,23 +2128,17 @@ void LyXText::CursorLeftOneWord(BufferView * bview) const && (tmpcursor.par()->IsSeparator(tmpcursor.pos() - 1) || tmpcursor.par()->IsKomma(tmpcursor.pos() - 1)) && !(tmpcursor.par()->IsHfill(tmpcursor.pos() - 1) -#ifndef NEW_INSETS - || tmpcursor.par()->IsFloat(tmpcursor.pos() - 1) -#endif || tmpcursor.par()->IsInset(tmpcursor.pos() - 1))) tmpcursor.pos(tmpcursor.pos() - 1); if (tmpcursor.pos() && (tmpcursor.par()->IsInset(tmpcursor.pos() - 1) -#ifndef NEW_INSETS - || tmpcursor.par()->IsFloat(tmpcursor.pos() - 1) -#endif || tmpcursor.par()->IsHfill(tmpcursor.pos() - 1))) { tmpcursor.pos(tmpcursor.pos() - 1); } else if (!tmpcursor.pos()) { - if (tmpcursor.par()->Previous()){ - tmpcursor.par(tmpcursor.par()->Previous()); - tmpcursor.pos(tmpcursor.par()->Last()); + if (tmpcursor.par()->previous()){ + tmpcursor.par(tmpcursor.par()->previous()); + tmpcursor.pos(tmpcursor.par()->size()); } } else { // Here, tmpcursor != 0 while (tmpcursor.pos() > 0 && @@ -2408,14 +2162,14 @@ void LyXText::SelectWord(BufferView * bview) // set the sel cursor sel_cursor = cursor; - while (cursor.pos() < cursor.par()->Last() + while (cursor.pos() < cursor.par()->size() && !cursor.par()->IsSeparator(cursor.pos()) && !cursor.par()->IsKomma(cursor.pos()) ) cursor.pos(cursor.pos() + 1); SetCursor(bview, cursor.par(), cursor.pos() ); // finally set the selection - SetSelection(); + SetSelection(bview); } @@ -2426,7 +2180,7 @@ void LyXText::SelectWord(BufferView * bview) bool LyXText::SelectWordWhenUnderCursor(BufferView * bview) { if (!selection && - cursor.pos() > 0 && cursor.pos() < cursor.par()->Last() + cursor.pos() > 0 && cursor.pos() < cursor.par()->size() && !cursor.par()->IsSeparator(cursor.pos()) && !cursor.par()->IsKomma(cursor.pos()) && !cursor.par()->IsSeparator(cursor.pos() -1) @@ -2448,20 +2202,21 @@ string const LyXText::SelectNextWord(BufferView * bview, // If this is not the very first word, skip rest of // current word because we are probably in the middle // of a word if there is text here. - if (cursor.pos() || cursor.par()->previous) { - while (cursor.pos() < cursor.par()->Last() + if (cursor.pos() || cursor.par()->previous()) { + while (cursor.pos() < cursor.par()->size() && cursor.par()->IsLetter(cursor.pos())) cursor.pos(cursor.pos() + 1); } + // Now, skip until we have real text (will jump paragraphs) - while ((cursor.par()->Last() > cursor.pos() + while ((cursor.par()->size() > cursor.pos() && (!cursor.par()->IsLetter(cursor.pos()) || cursor.par()->getFont(bview->buffer()->params, cursor.pos()) .latex() == LyXFont::ON)) - || (cursor.par()->Last() == cursor.pos() - && cursor.par()->Next())){ - if (cursor.pos() == cursor.par()->Last()) { - cursor.par(cursor.par()->Next()); + || (cursor.par()->size() == cursor.pos() + && cursor.par()->next())){ + if (cursor.pos() == cursor.par()->size()) { + cursor.par(cursor.par()->next()); cursor.pos(0); } else cursor.pos(cursor.pos() + 1); @@ -2480,7 +2235,7 @@ string const LyXText::SelectNextWord(BufferView * bview, // and find the end of the word // (optional hyphens are part of a word) - while (cursor.pos() < cursor.par()->Last() + while (cursor.pos() < cursor.par()->size() && (cursor.par()->IsLetter(cursor.pos())) || (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET && cursor.par()->GetInset(cursor.pos()) != 0 @@ -2514,7 +2269,7 @@ void LyXText::SelectSelectedWord(BufferView * bview) std::ostringstream latex; // now find the end of the word - while (cursor.pos() < cursor.par()->Last() + while (cursor.pos() < cursor.par()->size() && (cursor.par()->IsLetter(cursor.pos()) || (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET && cursor.par()->GetInset(cursor.pos()) != 0 @@ -2526,14 +2281,14 @@ void LyXText::SelectSelectedWord(BufferView * bview) SetCursor(bview, cursor.par(), cursor.pos()); // finally set the selection - SetSelection(); + SetSelection(bview); } /* -------> Delete from cursor up to the end of the current or next word. */ void LyXText::DeleteWordForward(BufferView * bview) { - if (!cursor.par()->Last()) + if (!cursor.par()->size()) CursorRight(bview); else { LyXCursor tmpcursor = cursor; @@ -2543,7 +2298,7 @@ void LyXText::DeleteWordForward(BufferView * bview) SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos()); sel_cursor = cursor; cursor = tmpcursor; - SetSelection(); + SetSelection(bview); /* -----> Great, CutSelection() gets rid of multiple spaces. */ CutSelection(bview); @@ -2554,7 +2309,7 @@ void LyXText::DeleteWordForward(BufferView * bview) /* -------> Delete from cursor to start of current or prior word. */ void LyXText::DeleteWordBackward(BufferView * bview) { - if (!cursor.par()->Last()) + if (!cursor.par()->size()) CursorLeft(bview); else { LyXCursor tmpcursor = cursor; @@ -2564,7 +2319,7 @@ void LyXText::DeleteWordBackward(BufferView * bview) SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos()); sel_cursor = cursor; cursor = tmpcursor; - SetSelection(); + SetSelection(bview); CutSelection(bview); } } @@ -2573,7 +2328,7 @@ void LyXText::DeleteWordBackward(BufferView * bview) /* -------> Kill to end of line. */ void LyXText::DeleteLineForward(BufferView * bview) { - if (!cursor.par()->Last()) + if (!cursor.par()->size()) // Paragraph is empty, so we just go to the right CursorRight(bview); else { @@ -2586,7 +2341,7 @@ void LyXText::DeleteLineForward(BufferView * bview) SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos()); sel_cursor = cursor; cursor = tmpcursor; - SetSelection(); + SetSelection(bview); // What is this test for ??? (JMarc) if (!selection) { DeleteWordForward(bview); @@ -2606,20 +2361,13 @@ void LyXText::DeleteLineForward(BufferView * bview) // version did. (JMarc) void LyXText::ChangeWordCase(BufferView * bview, LyXText::TextCase action) { -#ifndef NEW_INSETS - LyXParagraph * tmppar = cursor.par()->ParFromPos(cursor.pos()); -#else LyXParagraph * tmppar = cursor.par(); -#endif - SetUndo(bview->buffer(),Undo::FINISH, tmppar->previous, tmppar->next); + SetUndo(bview->buffer(),Undo::FINISH, + tmppar->previous(), tmppar->next()); -#ifndef NEW_INSETS - LyXParagraph::size_type tmppos = - cursor.par()->PositionInParFromPos(cursor.pos()); -#else LyXParagraph::size_type tmppos = cursor.pos(); -#endif + while (tmppos < tmppar->size()) { unsigned char c = tmppar->GetChar(tmppos); if (IsKommaChar(c) || IsLineSeparatorChar(c)) @@ -2648,14 +2396,45 @@ void LyXText::ChangeWordCase(BufferView * bview, LyXText::TextCase action) } +void LyXText::TransposeChars(BufferView const & bview) +{ + LyXParagraph * tmppar = cursor.par(); + + SetUndo(bview.buffer(), Undo::FINISH, + tmppar->previous(), tmppar->next()); + + LyXParagraph::size_type tmppos = cursor.pos(); + + // First decide if it is possible to transpose at all + + // We are at the beginning of a paragraph. + if (tmppos == 0) return; + + // We are at the end of a paragraph. + if (tmppos == tmppar->size() - 1) return; + + unsigned char c1 = tmppar->GetChar(tmppos); + unsigned char c2 = tmppar->GetChar(tmppos - 1); + + if (c1 != LyXParagraph::META_INSET + && c2 != LyXParagraph::META_INSET) { + tmppar->SetChar(tmppos, c2); + tmppar->SetChar(tmppos - 1, c1); + } + // We should have an implementation that handles insets + // as well, but that will have to come later. (Lgb) + CheckParagraph(const_cast(&bview), tmppar, tmppos); +} + + void LyXText::Delete(BufferView * bview) { // this is a very easy implementation LyXCursor old_cursor = cursor; int const old_cur_par_id = old_cursor.par()->id(); - int const old_cur_par_prev_id = old_cursor.par()->previous ? - old_cursor.par()->previous->id() : 0; + int const old_cur_par_prev_id = old_cursor.par()->previous() ? + old_cursor.par()->previous()->id() : 0; // just move to the right CursorRight(bview); @@ -2666,7 +2445,7 @@ void LyXText::Delete(BufferView * bview) // and that can very well delete the par or par->previous in // old_cursor. Will a solution where we compare paragraph id's //work better? - if ((cursor.par()->previous ? cursor.par()->previous->id() : 0) + if ((cursor.par()->previous() ? cursor.par()->previous()->id() : 0) == old_cur_par_prev_id && cursor.par()->id() != old_cur_par_id) return; // delete-empty-paragraph-mechanism has done it @@ -2676,14 +2455,8 @@ void LyXText::Delete(BufferView * bview) LyXCursor tmpcursor = cursor; cursor = old_cursor; // to make sure undo gets the right cursor position SetUndo(bview->buffer(), Undo::DELETE, -#ifndef NEW_INSETS - cursor.par()->ParFromPos(cursor.pos())->previous, - cursor.par()->ParFromPos(cursor.pos())->next -#else - cursor.par()->previous, - cursor.par()->next -#endif - ); + cursor.par()->previous(), + cursor.par()->next()); cursor = tmpcursor; Backspace(bview); } @@ -2693,9 +2466,10 @@ void LyXText::Delete(BufferView * bview) void LyXText::Backspace(BufferView * bview) { // Get the font that is used to calculate the baselineskip - LyXParagraph::size_type lastpos = cursor.par()->Last(); - LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params, - lastpos - 1); + LyXParagraph::size_type lastpos = cursor.par()->size(); + LyXFont rawparfont = + cursor.par()->GetFontSettings(bview->buffer()->params, + lastpos - 1); if (cursor.pos() == 0) { // The cursor is at the beginning of a paragraph, @@ -2706,33 +2480,20 @@ void LyXText::Backspace(BufferView * bview) // is it an empty paragraph? if ((lastpos == 0 - || (lastpos == 1 && cursor.par()->IsSeparator(0))) -#ifndef NEW_INSETS - && !(cursor.par()->Next() - && cursor.par()->footnoteflag == LyXParagraph::NO_FOOTNOTE - && cursor.par()->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) -#endif - ) { + || (lastpos == 1 && cursor.par()->IsSeparator(0)))) { // This is an empty paragraph and we delete it just by moving the cursor one step // left and let the DeleteEmptyParagraphMechanism handle the actual deletion // of the paragraph. - if (cursor.par()->previous) { -#ifndef NEW_INSETS - LyXParagraph * tmppar = cursor.par()->previous->FirstPhysicalPar(); -#else - LyXParagraph * tmppar = cursor.par()->previous; -#endif + if (cursor.par()->previous()) { + LyXParagraph * tmppar = cursor.par()->previous(); if (cursor.par()->GetLayout() == tmppar->GetLayout() -#ifndef NEW_INSETS - && cursor.par()->footnoteflag == tmppar->footnoteflag -#endif && cursor.par()->GetAlign() == tmppar->GetAlign()) { - // Inherit botom DTD from the paragraph below. + // Inherit bottom DTD from the paragraph below. // (the one we are deleting) - tmppar->line_bottom = cursor.par()->line_bottom; - tmppar->added_space_bottom = cursor.par()->added_space_bottom; - tmppar->pagebreak_bottom = cursor.par()->pagebreak_bottom; + tmppar->params.lineBottom(cursor.par()->params.lineBottom()); + tmppar->params.spaceBottom(cursor.par()->params.spaceBottom()); + tmppar->params.pagebreakBottom(cursor.par()->params.pagebreakBottom()); } CursorLeft(bview); @@ -2749,19 +2510,11 @@ void LyXText::Backspace(BufferView * bview) } } -#ifndef NEW_INSETS - if (cursor.par()->ParFromPos(cursor.pos())->previous){ + if (cursor.par()->previous()) { SetUndo(bview->buffer(), Undo::DELETE, - cursor.par()->ParFromPos(cursor.pos())->previous->previous, - cursor.par()->ParFromPos(cursor.pos())->next); + cursor.par()->previous()->previous(), + cursor.par()->next()); } -#else - if (cursor.par()->previous) { - SetUndo(bview->buffer(), Undo::DELETE, - cursor.par()->previous->previous, - cursor.par()->next); - } -#endif LyXParagraph * tmppar = cursor.par(); Row * tmprow = cursor.row(); @@ -2770,10 +2523,11 @@ void LyXText::Backspace(BufferView * bview) // not a good idea since it triggers the auto-delete // mechanism. So we do a CursorLeftIntern()-lite, // without the dreaded mechanism. (JMarc) - if (cursor.par()->Previous()) { + if (cursor.par()->previous()) { // steps into the above paragraph. - SetCursorIntern(bview, cursor.par()->Previous(), - cursor.par()->Previous()->Last(), false); + SetCursorIntern(bview, cursor.par()->previous(), + cursor.par()->previous()->size(), + false); } /* Pasting is not allowed, if the paragraphs have different @@ -2789,9 +2543,6 @@ void LyXText::Backspace(BufferView * bview) if (cursor.par() != tmppar && (cursor.par()->GetLayout() == tmppar->GetLayout() || tmppar->GetLayout() == 0 /*standard*/) -#ifndef NEW_INSETS - && cursor.par()->footnoteflag == tmppar->footnoteflag -#endif && cursor.par()->GetAlign() == tmppar->GetAlign()) { RemoveParagraph(tmprow); @@ -2830,14 +2581,8 @@ void LyXText::Backspace(BufferView * bview) /* this is the code for a normal backspace, not pasting * any paragraphs */ SetUndo(bview->buffer(), Undo::DELETE, -#ifndef NEW_INSETS - cursor.par()->ParFromPos(cursor.pos())->previous, - cursor.par()->ParFromPos(cursor.pos())->next -#else - cursor.par()->previous, - cursor.par()->next -#endif - ); + cursor.par()->previous(), + cursor.par()->next()); // We used to do CursorLeftIntern() here, but it is // not a good idea since it triggers the auto-delete // mechanism. So we do a CursorLeftIntern()-lite, @@ -2883,8 +2628,9 @@ void LyXText::Backspace(BufferView * bview) } if (cursor.par()->IsLineSeparator(cursor.pos() - 1)) cursor.pos(cursor.pos() - 1); - - if (cursor.pos() < cursor.par()->Last() && !cursor.par()->IsSeparator(cursor.pos())) { + + if (cursor.pos() < cursor.par()->size() + && !cursor.par()->IsSeparator(cursor.pos())) { cursor.par()->InsertChar(cursor.pos(), ' '); SetCharFont(bview->buffer(), cursor.par(), cursor.pos(), current_font); @@ -2907,7 +2653,7 @@ void LyXText::Backspace(BufferView * bview) } // delete newlines at the beginning of paragraphs - while (cursor.par()->Last() && + while (cursor.par()->size() && cursor.par()->IsNewline(cursor.pos()) && cursor.pos() == BeginningOfMainBody(bview->buffer(), cursor.par())) { @@ -2932,7 +2678,7 @@ void LyXText::Backspace(BufferView * bview) Row * tmprow = row->previous(); // maybe the current row is now empty - if (row->pos() >= row->par()->Last()) { + if (row->pos() >= row->par()->size()) { // remove it RemoveRow(row); need_break_row = 0; @@ -2960,7 +2706,7 @@ void LyXText::Backspace(BufferView * bview) // check, whether the last character's font has changed. if (rawparfont != cursor.par()->GetFontSettings(bview->buffer()->params, - cursor.par()->Last() - 1)) + cursor.par()->size() - 1)) RedoHeightOfParagraph(bview, cursor); return; } @@ -2968,14 +2714,14 @@ void LyXText::Backspace(BufferView * bview) // break the cursor row again if (row->next() && row->next()->par() == row->par() && - (RowLast(row) == row->par()->Last() - 1 || + (RowLast(row) == row->par()->size() - 1 || NextBreakPoint(bview, row, workWidth(bview)) != RowLast(row))) { /* it can happen that a paragraph loses one row * without a real breakup. This is when a word * is to long to be broken. Well, I don t care this - * hack ;-) */ - if (RowLast(row) == row->par()->Last() - 1) + * hack ;-) */ + if (RowLast(row) == row->par()->size() - 1) RemoveRow(row->next()); refresh_y = y; @@ -3019,7 +2765,7 @@ void LyXText::Backspace(BufferView * bview) SetCursor(bview, cursor.par(), cursor.pos(), false, !cursor.boundary()); - lastpos = cursor.par()->Last(); + lastpos = cursor.par()->size(); if (cursor.pos() == lastpos) SetCurrentFont(bview); @@ -3040,7 +2786,7 @@ void LyXText::Backspace(BufferView * bview) void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, Row * row_ptr, int y, bool cleared) { - /* returns a printed row */ + // returns a printed row Painter & pain = bview->painter(); bool const is_rtl = @@ -3048,11 +2794,10 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, LyXParagraph::size_type const last = RowLastPrintable(row_ptr); - LyXParagraph::size_type vpos, pos; - float x; + LyXParagraph::size_type vpos; + LyXParagraph::size_type pos; + float tmpx; - int y_top; - int y_bottom; LyXFont font(LyXFont::ALL_SANE); int maxdesc; @@ -3062,6 +2807,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, return; } + float x; float fill_separator; float fill_hfill; float fill_label_hfill; @@ -3073,7 +2819,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, x += x_offset; // clear the area where we want to paint/print - int ww = bview->workWidth(); + int const ww = bview->workWidth(); bool clear_area = true; Inset * inset = 0; @@ -3091,15 +2837,12 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, #warning Should be fixed with a lyxinset::clear_width(bv, font) function! (Jug) #warning Should we not fix this in the Painter, please have a look Lars! (Jug) #endif - int w = (inset_owner ? inset_owner->width(bview, font)-2 : ww); - int h = row_ptr->height(); - int x = x_offset; - int y = y_offset; - if (y < 0) { - h += y; - y = 0; - } - + int const y = y_offset < 0 ? 0 : y_offset; + int const h = y_offset < 0 ? + row_ptr->height() + y_offset : row_ptr->height(); + int const w = inset_owner ? + inset_owner->width(bview, font) - 2 : ww; + int const x = x_offset; pain.fillRectangle(x, y, w, h); } else if (inset != 0) { int h = row_ptr->baseline() - inset->ascent(bview, font); @@ -3125,7 +2868,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, if (selection) { int const w = (inset_owner ? inset_owner->width(bview, font) : ww); - /* selection code */ + // selection code if (bidi_same_direction) { if (sel_start_cursor.row() == row_ptr && sel_end_cursor.row() == row_ptr) { @@ -3220,7 +2963,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, sel_start_cursor.pos() <= pos) && (sel_end_cursor.row() != row_ptr || pos < sel_end_cursor.pos()) ) - /// Here we do not use x_offset as x_offset was + // Here we do not use x_offset as x_offset was // added to x. pain.fillRectangle(int(old_tmpx), y_offset, @@ -3240,134 +2983,11 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, } int box_x = 0; -#ifndef NEW_INSETS - if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) { - LyXFont font(LyXFont::ALL_SANE); - font.setSize(LyXFont::SIZE_FOOTNOTE); - font.setColor(LColor::footnote); - - box_x = LYX_PAPER_MARGIN + lyxfont::width(" wide-tab ", font); - if (row_ptr->previous() && - row_ptr->previous()->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE){ - string fs; - switch (row_ptr->par()->footnotekind) { - case LyXParagraph::MARGIN: - fs = " margin"; - break; - case LyXParagraph::FIG: - fs = " fig"; - break; - case LyXParagraph::TAB: - fs = " tab"; - break; - case LyXParagraph::WIDE_FIG: - fs = " wide-fig"; - break; - case LyXParagraph::WIDE_TAB: - fs = " wide-tab"; - break; - case LyXParagraph::ALGORITHM: - fs = " alg"; - break; - case LyXParagraph::FOOTNOTE: - fs = " foot"; - break; - } - - pain.fillRectangle(LYX_PAPER_MARGIN, - y_offset + 1, - box_x - LYX_PAPER_MARGIN, - int(lyxfont::maxAscent(font) - + lyxfont::maxDescent(font)), - LColor::footnotebg); - - pain.line(LYX_PAPER_MARGIN, y_offset, - workWidth(bview) - LYX_PAPER_MARGIN, y_offset, - LColor::footnoteframe); - - pain.text(LYX_PAPER_MARGIN, - y_offset + int(lyxfont::maxAscent(font)) + 1, - fs, font); - - pain.line(LYX_PAPER_MARGIN, y_offset, - LYX_PAPER_MARGIN, - y_offset + int(lyxfont::maxAscent(font) - + lyxfont::maxDescent(font)), - LColor::footnoteframe); - - pain.line(LYX_PAPER_MARGIN, - y_offset + int(lyxfont::maxAscent(font) - + lyxfont::maxDescent(font)) + 1, - box_x, - y_offset + int(lyxfont::maxAscent(font) - + lyxfont::maxDescent(font)) + 1, - LColor::footnoteframe); - - } - - /* draw the open floats in a red box */ - pain.line(box_x, y_offset, - box_x, y_offset + row_ptr->height(), - LColor::footnoteframe); - - pain.line(workWidth(bview) - LYX_PAPER_MARGIN, - y_offset, - workWidth(bview) - LYX_PAPER_MARGIN, - y_offset + row_ptr->height(), - LColor::footnoteframe); - - // Draw appendix lines - LyXParagraph * p = row_ptr->par()->PreviousBeforeFootnote()->FirstPhysicalPar(); - if (p->appendix){ - pain.line(1, y_offset, - 1, y_offset + row_ptr->height(), - LColor::appendixline); - pain.line(workWidth(bview) - 2, y_offset, - workWidth(bview) - 2, - y_offset + row_ptr->height(), - LColor::appendixline); - } - - // Draw minipage line - bool const minipage = - (p->pextra_type == LyXParagraph::PEXTRA_MINIPAGE); - if (minipage) - pain.line(LYX_PAPER_MARGIN/5, y_offset, - LYX_PAPER_MARGIN/5, - y_offset + row_ptr->height() - 1, - LColor::minipageline); - - // Draw depth lines - int const depth = p->GetDepth(); - for (int i = 1; i <= depth; ++i) { - int const line_x = (LYX_PAPER_MARGIN / 5) * - (i + minipage); - pain.line(line_x, y_offset, line_x, - y_offset + row_ptr->height() - 1, - LColor::depthbar); - } - } else if (row_ptr->previous() && - row_ptr->previous()->par()->footnoteflag - == LyXParagraph::OPEN_FOOTNOTE) { - LyXFont font(LyXFont::ALL_SANE); - font.setSize(LyXFont::SIZE_FOOTNOTE); - - int const box_x = LYX_PAPER_MARGIN - + lyxfont::width(" wide-tab ", font); - - pain.line(box_x, y_offset, - workWidth(bview) - LYX_PAPER_MARGIN, - y_offset, LColor::footnote); - } -#endif // Draw appendix lines -#ifndef NEW_INSETS - LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar(); -#else LyXParagraph * firstpar = row_ptr->par(); -#endif - if (firstpar->appendix){ + + if (firstpar->params.appendix()) { pain.line(1, y_offset, 1, y_offset + row_ptr->height(), LColor::appendixline); @@ -3376,44 +2996,19 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, LColor::appendixline); } - // Draw minipage line - bool const minipage = - (firstpar->pextra_type == LyXParagraph::PEXTRA_MINIPAGE); - if (minipage) - pain.line(LYX_PAPER_MARGIN/5 + box_x, y_offset, - LYX_PAPER_MARGIN/5 + box_x, - y_offset + row_ptr->height() - 1, - LColor::minipageline); - // Draw depth lines int const depth = firstpar->GetDepth(); if (depth > 0) { int next_depth = 0; int prev_depth = 0; if (row_ptr->next()) -#ifndef NEW_INSETS - if (row_ptr->par()->footnoteflag == - row_ptr->next()->par()->footnoteflag) next_depth = row_ptr->next()->par()->GetDepth(); - else if (row_ptr->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) - next_depth = depth; -#else - next_depth = row_ptr->next()->par()->GetDepth(); -#endif if (row_ptr->previous()) -#ifndef NEW_INSETS - if (row_ptr->par()->footnoteflag == - row_ptr->previous()->par()->footnoteflag) - prev_depth = row_ptr->previous()->par()->GetDepth(); - else if (row_ptr->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) - prev_depth = depth; -#else prev_depth = row_ptr->previous()->par()->GetDepth(); -#endif for (int i = 1; i <= depth; ++i) { int const line_x = (LYX_PAPER_MARGIN / 5) * - (i + minipage) + box_x + x_offset; + i + box_x + x_offset; pain.line(line_x, y_offset, line_x, y_offset + row_ptr->height() - 1 - (i - next_depth - 1) * 3, LColor::depthbar); @@ -3434,27 +3029,30 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, textclasslist.Style(bview->buffer()->params.textclass, row_ptr->par()->GetLayout()); - y_top = 0; - y_bottom = row_ptr->height(); + int y_top = 0; + int y_bottom = row_ptr->height(); - /* is it a first row? */ + // is it a first row? if (!row_ptr->pos() && (row_ptr->par() == firstpar)) { - /* start of appendix? */ - if (row_ptr->par()->start_of_appendix){ + // start of appendix? + if (row_ptr->par()->params.startOfAppendix()) { pain.line(1, y_offset, ww - 2, y_offset, LColor::appendixline); } - /* think about the margins */ + // think about the margins if (!row_ptr->previous() && bv_owner) y_top += LYX_PAPER_MARGIN; - if (row_ptr->par()->pagebreak_top){ /* draw a top pagebreak */ + // draw a top pagebreak + if (row_ptr->par()->params.pagebreakTop()) { LyXFont pb_font; pb_font.setColor(LColor::pagebreak).decSize(); - int w = 0, a = 0, d = 0; + int w = 0; + int a = 0; + int d = 0; pain.line(0, y_offset + y_top + 2*DefaultHeight(), ww, y_offset + y_top + 2 * DefaultHeight(), @@ -3475,8 +3073,8 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, y_top += 3 * DefaultHeight(); } - if (row_ptr->par()->added_space_top.kind() == VSpace::VFILL) { - /* draw a vfill top */ + if (row_ptr->par()->params.spaceTop().kind() == VSpace::VFILL) { + // draw a vfill top pain.line(0, y_offset + 2 + y_top, LYX_PAPER_MARGIN, y_offset + 2 + y_top, LColor::vfillline); @@ -3494,25 +3092,26 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, y_top += 3 * DefaultHeight(); } - /* think about user added space */ - y_top += int(row_ptr->par()->added_space_top.inPixels(bview)); + // think about user added space + y_top += int(row_ptr->par()->params.spaceTop().inPixels(bview)); - /* think about the parskip */ - /* some parskips VERY EASY IMPLEMENTATION */ + // think about the parskip + // some parskips VERY EASY IMPLEMENTATION if (bview->buffer()->params.paragraph_separation == BufferParams::PARSEP_SKIP) { if (layout.latextype == LATEX_PARAGRAPH && firstpar->GetDepth() == 0 - && firstpar->Previous()) + && firstpar->previous()) y_top += bview->buffer()->params.getDefSkip().inPixels(bview); - else if (firstpar->Previous() + else if (firstpar->previous() && textclasslist.Style(bview->buffer()->params.textclass, - firstpar->Previous()->GetLayout()).latextype == LATEX_PARAGRAPH - && firstpar->Previous()->GetDepth() == 0) + firstpar->previous()->GetLayout()).latextype == LATEX_PARAGRAPH + && firstpar->previous()->GetDepth() == 0) // is it right to use defskip here, too? (AS) y_top += bview->buffer()->params.getDefSkip().inPixels(bview); } - if (row_ptr->par()->line_top) { /* draw a top line */ + if (row_ptr->par()->params.lineTop()) { + // draw a top line y_top += lyxfont::ascent('x', GetFont(bview->buffer(), row_ptr->par(), 0)); @@ -3529,7 +3128,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, row_ptr->par(), 0)); } - /* should we print a label? */ + // should we print a label? if (layout.labeltype >= LABEL_STATIC && (layout.labeltype != LABEL_STATIC || layout.latextype != LATEX_ENVIRONMENT @@ -3542,11 +3141,14 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, if (layout.labeltype == LABEL_COUNTER_CHAPTER) { if (bview->buffer()->params.secnumdepth >= 0) { - /* this is special code for the chapter layout. This is printed in - * an extra row and has a pagebreak at the top. */ + // this is special code for + // the chapter layout. This is + // printed in an extra row + // and has a pagebreak at + // the top. float spacing_val = 1.0; - if (!row_ptr->par()->spacing.isDefault()) { - spacing_val = row_ptr->par()->spacing.getValue(); + if (!row_ptr->par()->params.spacing().isDefault()) { + spacing_val = row_ptr->par()->params.spacing().getValue(); } else { spacing_val = bview->buffer()->params.spacing.getValue(); } @@ -3564,24 +3166,18 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, if (is_rtl) { tmpx = ww - LeftMargin(bview, row_ptr) + lyxfont::width(layout.labelsep, font); -#ifndef NEW_INSETS - if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) { - LyXFont font(LyXFont::ALL_SANE); - font.setSize(LyXFont::SIZE_SMALL); - tmpx += lyxfont::width("Mwide-fixM", font); - } -#endif } else tmpx = x - lyxfont::width(layout.labelsep, font) - lyxfont::width(tmpstring, font); - /* draw it! */ + // draw it! pain.text(int(tmpx), y_offset + row_ptr->baseline(), tmpstring, font); } } - /* the labels at the top of an environment. More or less for bibliography */ + // the labels at the top of an environment. + // More or less for bibliography } else if (layout.labeltype == LABEL_TOP_ENVIRONMENT || layout.labeltype == LABEL_BIBLIO || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) { @@ -3592,8 +3188,8 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, string const tmpstring = row_ptr->par()->GetLabelstring(); float spacing_val = 1.0; - if (!row_ptr->par()->spacing.isDefault()) { - spacing_val = row_ptr->par()->spacing.getValue(); + if (!row_ptr->par()->params.spacing().isDefault()) { + spacing_val = row_ptr->par()->params.spacing().getValue(); } else { spacing_val = bview->buffer()->params.spacing.getValue(); } @@ -3631,43 +3227,34 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, } } - /* is it a last row? */ -#ifndef NEW_INSETS - LyXParagraph * par = row_ptr->par()->LastPhysicalPar(); -#else + // is it a last row? LyXParagraph * par = row_ptr->par(); -#endif - if ( -#ifndef NEW_INSETS - row_ptr->par()->ParFromPos(last + 1) == par -#else - row_ptr->par() == par -#endif - && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) - { - /* think about the margins */ + if (row_ptr->par() == par + && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) { + // think about the margins if (!row_ptr->next() && bv_owner) y_bottom -= LYX_PAPER_MARGIN; - /* draw a bottom pagebreak */ - if (firstpar->pagebreak_bottom) { + // draw a bottom pagebreak + if (firstpar->params.pagebreakBottom()) { LyXFont pb_font; pb_font.setColor(LColor::pagebreak).decSize(); - int w = 0, a = 0, d = 0; - pain.line(0, - y_offset + y_bottom - 2 * DefaultHeight(), - ww, - y_offset + y_bottom - 2 * DefaultHeight(), - LColor::pagebreak, - Painter::line_onoffdash) - .rectText(0, - 0, + int const y_place = y_offset + y_bottom + - 2 * DefaultHeight(); + + int w = 0; + int a = 0; + int d = 0; + pain + .line(0, y_place, ww, y_place, + LColor::pagebreak, + Painter::line_onoffdash) + .rectText(0, 0, _("Page Break (bottom)"), pb_font, LColor::background, LColor::background, false, w, a, d); - pain.rectText((ww - w) / 2, - y_offset + y_top + 2 * DefaultHeight() + d, + pain.rectText((ww - w) / 2, y_place + d, _("Page Break (bottom)"), pb_font, LColor::background, @@ -3675,31 +3262,35 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, y_bottom -= 3 * DefaultHeight(); } - if (firstpar->added_space_bottom.kind() == VSpace::VFILL) { - /* draw a vfill bottom */ - pain.line(0, y_offset + y_bottom - 3 * DefaultHeight(), - LYX_PAPER_MARGIN, - y_offset + y_bottom - 3 * DefaultHeight(), + if (firstpar->params.spaceBottom().kind() == VSpace::VFILL) { + // draw a vfill bottom + int const y_place = y_offset + y_bottom + - 3 * DefaultHeight(); + + pain.line(0, y_place, + LYX_PAPER_MARGIN, y_place, LColor::vfillline); pain.line(0, y_offset + y_bottom - 2, LYX_PAPER_MARGIN, y_offset + y_bottom - 2, LColor::vfillline); pain.line(LYX_PAPER_MARGIN / 2, - y_offset + y_bottom - 3 * DefaultHeight(), + y_place, LYX_PAPER_MARGIN / 2, y_offset + y_bottom - 2, LColor::vfillline); y_bottom -= 3 * DefaultHeight(); } - /* think about user added space */ - y_bottom -= int(firstpar->added_space_bottom.inPixels(bview)); + // think about user added space + y_bottom -= int(firstpar->params.spaceBottom().inPixels(bview)); - if (firstpar->line_bottom) { - /* draw a bottom line */ - y_bottom -= lyxfont::ascent('x', GetFont(bview->buffer(), - par, par->Last() - 1)); + if (firstpar->params.lineBottom()) { + // draw a bottom line + y_bottom -= lyxfont::ascent('x', + GetFont(bview->buffer(), + par, + par->size() - 1)); int const w = (inset_owner ? inset_owner->width(bview, font) : ww); int const xp = static_cast(inset_owner ? x : 0); @@ -3710,7 +3301,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, y_bottom -= lyxfont::ascent('x', GetFont(bview->buffer(), par, - par->Last() - 1)); + par->size() - 1)); } // draw an endlabel @@ -3726,15 +3317,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, int const y = (y_offset + row_ptr->baseline()) - size; int x = is_rtl ? LYX_PAPER_MARGIN : ww - LYX_PAPER_MARGIN - size; -#ifndef NEW_INSETS - if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) - if (is_rtl) { - LyXFont font(LyXFont::ALL_SANE); - font.setSize(LyXFont::SIZE_SMALL); - x += lyxfont::width("Mwide-figM", font); - } else - x -= LYX_PAPER_MARGIN/2; -#endif + if (row_ptr->fill() <= size) x += (size - row_ptr->fill() + 1) * (is_rtl ? -1 : 1); if (endlabel == END_LABEL_BOX) { @@ -3769,7 +3352,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, } } - /* draw the text in the pixmap */ + // draw the text in the pixmap vpos = row_ptr->pos(); @@ -3953,153 +3536,13 @@ int LyXText::GetColumnNearX(BufferView * bview, Row * row, int & x, } -#ifndef NEW_INSETS -/* turn the selection into a new environment. If there is no selection, -* create an empty environment */ -void LyXText::InsertFootnoteEnvironment(BufferView * bview, - LyXParagraph::footnote_kind kind) -{ - /* no footnoteenvironment in a footnoteenvironment */ - if (cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) { - WriteAlert(_("Impossible operation"), - _("You can't insert a float in a float!"), - _("Sorry.")); - return; - } - /* no marginpars in minipages */ - if (kind == LyXParagraph::MARGIN - && cursor.par()->pextra_type == LyXParagraph::PEXTRA_MINIPAGE) { - WriteAlert(_("Impossible operation"), - _("You can't insert a marginpar in a minipage!"), - _("Sorry.")); - return; - } - - /* this doesnt make sense, if there is no selection */ - bool dummy_selection = false; - if (!selection) { - sel_start_cursor = cursor; /* dummy selection */ - sel_end_cursor = cursor; - dummy_selection = true; - } - - LyXParagraph * tmppar; - - /* a test to make sure there is not already a footnote - * in the selection. */ - - tmppar = sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos()); - - while (tmppar != sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos()) && - tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE) - tmppar = tmppar->next; - - if (tmppar != sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos()) - || tmppar->footnoteflag != LyXParagraph::NO_FOOTNOTE) { - WriteAlert(_("Impossible operation"), - _("Float would include float!"), - _("Sorry.")); - return; - } - - /* ok we have a selection. This is always between sel_start_cursor - * and sel_end cursor */ - - SetUndo(bview->buffer(), Undo::FINISH, - sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos())->previous, - sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())->next); - - if (sel_end_cursor.pos() > 0 - && sel_end_cursor.par()->IsLineSeparator(sel_end_cursor.pos() - 1)) - sel_end_cursor.pos(sel_end_cursor.pos() - 1); - /* please break before a space at the end */ - if (sel_start_cursor.par() == sel_end_cursor.par() - && sel_start_cursor.pos() > sel_end_cursor.pos()) - sel_start_cursor.pos(sel_start_cursor.pos() - 1); - - sel_end_cursor.par()->BreakParagraphConservative(bview->buffer()->params, sel_end_cursor.pos()); - - sel_end_cursor.par(sel_end_cursor.par()->Next()); - sel_end_cursor.pos(0); - - // don't forget to insert a dummy layout paragraph if necessary - if (sel_start_cursor.par()->GetLayout() != sel_end_cursor.par()->layout){ - sel_end_cursor.par()->BreakParagraphConservative(bview->buffer()->params, 0); - sel_end_cursor.par()->layout = LYX_DUMMY_LAYOUT; - sel_end_cursor.par(sel_end_cursor.par()->next); - } - else - sel_end_cursor.par()->layout = LYX_DUMMY_LAYOUT; - - cursor = sel_end_cursor; - - /* please break behind a space, if there is one. The space should - * be erased too */ - if (sel_start_cursor.pos() > 0 - && sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos() - 1)) - sel_start_cursor.pos(sel_start_cursor.pos() - 1); - if (sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos())) { - sel_start_cursor.par()->Erase(sel_start_cursor.pos()); - } - - sel_start_cursor.par()->BreakParagraphConservative(bview->buffer()->params, - sel_start_cursor.pos()); - tmppar = sel_start_cursor.par()->Next(); - - if (dummy_selection) { - tmppar->Clear(); - if (kind == LyXParagraph::TAB - || kind == LyXParagraph::FIG - || kind == LyXParagraph::WIDE_TAB - || kind == LyXParagraph::WIDE_FIG - || kind == LyXParagraph::ALGORITHM) { - pair lres = - textclasslist.NumberOfLayout(bview->buffer()->params.textclass, - "Caption"); - LyXTextClass::size_type lay; - if (lres.first) { - // layout fount - lay = lres.second; - } else { - // layout not found - lay = 0; // use default layout "Standard" (0) - } - tmppar->SetLayout(bview->buffer()->params, lay); - } - } else { - if (sel_start_cursor.pos() > 0) { - /* the footnote-environment should begin with a standard layout. - * Imagine you insert a footnote within an enumeration, you - * certainly do not want an enumerated footnote! */ - tmppar->Clear(); - } else { - /* this is a exception the user would sometimes expect, I hope */ - sel_start_cursor.par()->Clear(); - } - } - - while (tmppar != sel_end_cursor.par()) { - tmppar->footnoteflag = LyXParagraph::OPEN_FOOTNOTE; - tmppar->footnotekind = kind; - tmppar = tmppar->Next(); - } - - RedoParagraphs(bview, sel_start_cursor, sel_end_cursor.par()->Next()); - - SetCursor(bview, sel_start_cursor.par()->Next(), 0); - - ClearSelection(); -} -#endif - - // returns pointer to a specified row Row * LyXText::GetRow(LyXParagraph * par, LyXParagraph::size_type pos, int & y) const { if (!firstrow) return 0; - + Row * tmprow = firstrow; y = 0;