X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftext.C;h=075df005f7d354e404cb6afaa318ce4b13b0f69f;hb=15271fce0705ea5611647b5b3d1e993362ff5284;hp=cedf1085b07ad8935c51322597180eb5195ca1af;hpb=b95e8f250dca6264900d8aedf98e8a24411c36d4;p=lyx.git diff --git a/src/text.C b/src/text.C index cedf1085b0..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,7 +51,7 @@ 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(); } @@ -74,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; @@ -129,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)) { @@ -150,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) { @@ -206,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; } @@ -363,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; @@ -378,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; @@ -402,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); @@ -455,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); @@ -673,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 LyXParagraph * newpar = row->par() ->DepthHook(row->par()->GetDepth()); if (newpar && @@ -711,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()->params.depth(0); -#else row->par()->params.depth(0); -#endif } if (newpar && !row->par()->GetLayout()) { -#ifndef NEW_INSETS - if (newpar->FirstPhysicalPar()->params.noindent()) -#else if (newpar->params.noindent()) -#endif parindent.erase(); else parindent = textclasslist @@ -836,34 +731,14 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const } break; } - if ((workWidth(bview) > 0) && - (row->par()->params.pextraType() == LyXParagraph::PEXTRA_INDENT)) { - if (!row->par()->params.pextraWidthp().empty()) { - x += workWidth(bview) * - lyx::atoi(row->par()->params.pextraWidthp()) / 100; - } else if (!row->par()->params.pextraWidth().empty()) { - int xx = VSpace(row->par()->params.pextraWidth()).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()->params.align() == LYX_ALIGN_LAYOUT) - align = layout.align; - else - align = row->par()->FirstPhysicalPar()->params.align(); -#else + if (row->par()->params.align() == LYX_ALIGN_LAYOUT) align = layout.align; else align = row->par()->params.align(); -#endif + // set the correct parindent if (row->pos() == 0) { if ((layout.labeltype == LABEL_NO_LABEL @@ -872,9 +747,6 @@ 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()->params.noindent() && (row->par()->layout || @@ -911,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 @@ -924,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(); } 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()) { @@ -957,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()->params.depth(0); -#else row->par()->params.depth(0); -#endif } } @@ -981,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 @@ -998,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(); @@ -1016,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()){ @@ -1030,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; @@ -1113,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 @@ -1158,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; } @@ -1322,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); @@ -1364,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); @@ -1399,10 +1252,10 @@ 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() @@ -1417,31 +1270,26 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const maxasc += bview->buffer()->params.getDefSkip().inPixels(bview); } - /* the paper margins */ -#ifndef NEW_INSETS - if (!row_ptr->par()->previous_ && bv_owner) - maxasc += LYX_PAPER_MARGIN; -#else + // the paper margins if (!row_ptr->par()->previous() && bv_owner) maxasc += LYX_PAPER_MARGIN; -#endif - /* add the vertical spaces, that the user added */ + // 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 */ + // 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 */ + // 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; @@ -1459,7 +1307,7 @@ 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) @@ -1483,8 +1331,8 @@ 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->params.pagebreakTop()) { LyXParagraph * prev = row_ptr->par()->previous(); @@ -1523,7 +1371,7 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const if (firstpar->previous() && firstpar->previous()->GetDepth() == 0 && firstpar->previous()->GetLayout() != firstpar->GetLayout()) { - /* avoid parsep */ + // avoid parsep } else if (firstpar->previous()){ maxasc += int(layout.parsep * DefaultHeight()); @@ -1532,40 +1380,32 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const } } - /* is it a bottom line? */ - if ( -#ifndef NEW_INSETS - row_ptr->par()->ParFromPos(RowLast(row_ptr) + 1) == par -#else - row_ptr->par() == par -#endif + // is it a bottom line? + if (row_ptr->par() == par && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) { - /* the paper margins */ -#ifndef NEW_INSETS - if (!par->next_ && bv_owner) - maxdesc += LYX_PAPER_MARGIN; -#else + // the paper margins if (!par->next() && bv_owner) maxdesc += LYX_PAPER_MARGIN; -#endif - /* add the vertical spaces, that the user added */ + // add the vertical spaces, that the user added if (firstpar->params.spaceBottom().kind() != VSpace::NONE) maxdesc += int(firstpar->params.spaceBottom().inPixels(bview)); - /* do not forget the DTP-lines! - * there height depends on the font of the nearest character */ + // 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->Last() - 1)); + maxdesc += 2 * lyxfont::ascent('x', + GetFont(bview->buffer(), + par, par->size() - 1)); - /* and now the pagebreaks */ + // 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 */ + // 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(); @@ -1595,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) { @@ -1629,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)); @@ -1660,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; @@ -1707,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 */ @@ -1749,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()->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); @@ -1788,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, @@ -1821,8 +1650,8 @@ 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()->Last() + + while (cursor.par()->next()->size() && cursor.par()->next()->IsNewline(0)) cursor.par()->next()->Erase(0); @@ -1844,64 +1673,6 @@ 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 { @@ -1916,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()->next()); // When the free-spacing option is set for the current layout, // disable the double-space checking @@ -2000,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; @@ -2011,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; @@ -2038,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); @@ -2106,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); @@ -2168,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 { @@ -2218,13 +1978,6 @@ void LyXText::PrepareToPrint(BufferView * bview, if (is_rtl) { x = (workWidth(bview) > 0) ? RightMargin(bview->buffer(), row) : 0; -#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); - } -#endif } else x = (workWidth(bview) > 0) ? LeftMargin(bview, row) : 0; @@ -2250,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()->params.align() == LYX_ALIGN_LAYOUT) - align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align; - else - align = row->par()->FirstPhysicalPar()->params.align(); -#else if (row->par()->params.align() == LYX_ALIGN_LAYOUT) align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align; else align = row->par()->params.align(); -#endif // center displayed insets Inset * inset; @@ -2327,7 +2073,7 @@ void LyXText::CursorRightOneWord(BufferView * bview) const LyXCursor tmpcursor = cursor; // CHECK See comment on top of text.C - if (tmpcursor.pos() == tmpcursor.par()->Last() + if (tmpcursor.pos() == tmpcursor.par()->size() && tmpcursor.par()->next()) { tmpcursor.par(tmpcursor.par()->next()); tmpcursor.pos(0); @@ -2335,17 +2081,15 @@ void LyXText::CursorRightOneWord(BufferView * bview) const 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; @@ -2358,11 +2102,11 @@ 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.pos() == tmpcursor.par()->size()){ if (tmpcursor.par()->next()) { tmpcursor.par(tmpcursor.par()->next()); tmpcursor.pos(0); @@ -2384,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()); + tmpcursor.pos(tmpcursor.par()->size()); } } else { // Here, tmpcursor != 0 while (tmpcursor.pos() > 0 && @@ -2424,7 +2162,7 @@ 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); @@ -2442,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) @@ -2464,28 +2202,20 @@ 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. -#ifndef NEW_INSETS - if (cursor.pos() || cursor.par()->previous_) { - while (cursor.pos() < cursor.par()->Last() - && cursor.par()->IsLetter(cursor.pos())) - cursor.pos(cursor.pos() + 1); - } -#else if (cursor.pos() || cursor.par()->previous()) { - while (cursor.pos() < cursor.par()->Last() + while (cursor.pos() < cursor.par()->size() && cursor.par()->IsLetter(cursor.pos())) cursor.pos(cursor.pos() + 1); } -#endif // 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()->size() == cursor.pos() && cursor.par()->next())){ - if (cursor.pos() == cursor.par()->Last()) { + if (cursor.pos() == cursor.par()->size()) { cursor.par(cursor.par()->next()); cursor.pos(0); } else @@ -2505,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 @@ -2539,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 @@ -2558,7 +2288,7 @@ void LyXText::SelectSelectedWord(BufferView * 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; @@ -2579,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; @@ -2598,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 { @@ -2631,22 +2361,12 @@ 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()); - - SetUndo(bview->buffer(),Undo::FINISH, - tmppar->previous_, tmppar->next_); - - LyXParagraph::size_type tmppos = - cursor.par()->PositionInParFromPos(cursor.pos()); -#else LyXParagraph * tmppar = cursor.par(); SetUndo(bview->buffer(),Undo::FINISH, tmppar->previous(), tmppar->next()); LyXParagraph::size_type tmppos = cursor.pos(); -#endif while (tmppos < tmppar->size()) { unsigned char c = tmppar->GetChar(tmppos); @@ -2676,19 +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(); -#ifndef NEW_INSETS - int const old_cur_par_prev_id = old_cursor.par()->previous_ ? - old_cursor.par()->previous_->id() : 0; -#else int const old_cur_par_prev_id = old_cursor.par()->previous() ? old_cursor.par()->previous()->id() : 0; -#endif // just move to the right CursorRight(bview); @@ -2699,12 +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 ( -#ifndef NEW_INSETS - (cursor.par()->previous_ ? cursor.par()->previous_->id() : 0) -#else - (cursor.par()->previous() ? cursor.par()->previous()->id() : 0) -#endif + 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 @@ -2714,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()->next()); cursor = tmpcursor; Backspace(bview); } @@ -2731,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, @@ -2744,27 +2480,14 @@ 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. -#ifndef NEW_INSETS - if (cursor.par()->previous_) { - LyXParagraph * tmppar = cursor.par()->previous_->FirstPhysicalPar(); - if (cursor.par()->GetLayout() == tmppar->GetLayout() - && cursor.par()->footnoteflag == tmppar->footnoteflag -#else if (cursor.par()->previous()) { LyXParagraph * tmppar = cursor.par()->previous(); if (cursor.par()->GetLayout() == tmppar->GetLayout() -#endif && cursor.par()->GetAlign() == tmppar->GetAlign()) { // Inherit bottom DTD from the paragraph below. // (the one we are deleting) @@ -2787,19 +2510,11 @@ void LyXText::Backspace(BufferView * bview) } } -#ifndef NEW_INSETS - if (cursor.par()->ParFromPos(cursor.pos())->previous_) { - SetUndo(bview->buffer(), Undo::DELETE, - cursor.par()->ParFromPos(cursor.pos())->previous_->previous_, - cursor.par()->ParFromPos(cursor.pos())->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(); @@ -2811,7 +2526,8 @@ void LyXText::Backspace(BufferView * bview) if (cursor.par()->previous()) { // steps into the above paragraph. SetCursorIntern(bview, cursor.par()->previous(), - cursor.par()->previous()->Last(), false); + cursor.par()->previous()->size(), + false); } /* Pasting is not allowed, if the paragraphs have different @@ -2827,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); @@ -2868,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()->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, @@ -2921,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); @@ -2945,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())) { @@ -2970,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; @@ -2998,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; } @@ -3006,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; @@ -3057,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); @@ -3078,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 = @@ -3086,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; @@ -3100,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; @@ -3111,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; @@ -3160,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) { @@ -3255,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, @@ -3275,133 +2983,10 @@ 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->params.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->params.pextraType() == 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->params.appendix()) { pain.line(1, y_offset, 1, y_offset + row_ptr->height(), @@ -3411,44 +2996,19 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, LColor::appendixline); } - // Draw minipage line - bool const minipage = - (firstpar->params.pextraType() == 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); @@ -3469,28 +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? */ + // 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; - /* 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(), @@ -3512,7 +3074,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, } if (row_ptr->par()->params.spaceTop().kind() == VSpace::VFILL) { - /* draw a vfill top */ + // draw a vfill top pain.line(0, y_offset + 2 + y_top, LYX_PAPER_MARGIN, y_offset + 2 + y_top, LColor::vfillline); @@ -3530,11 +3092,11 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, y_top += 3 * DefaultHeight(); } - /* think about user added space */ + // 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 @@ -3548,7 +3110,8 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, y_top += bview->buffer()->params.getDefSkip().inPixels(bview); } - if (row_ptr->par()->params.lineTop()) { /* 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)); @@ -3565,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 @@ -3578,8 +3141,11 @@ 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()->params.spacing().isDefault()) { spacing_val = row_ptr->par()->params.spacing().getValue(); @@ -3600,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) { @@ -3667,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 */ + // 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, @@ -3712,30 +3263,34 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, } if (firstpar->params.spaceBottom().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(), + // 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 */ + // think about user added space y_bottom -= int(firstpar->params.spaceBottom().inPixels(bview)); if (firstpar->params.lineBottom()) { - /* draw a bottom line */ - y_bottom -= lyxfont::ascent('x', GetFont(bview->buffer(), - par, par->Last() - 1)); + // 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); @@ -3746,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 @@ -3762,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) { @@ -3805,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(); @@ -3989,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()->params.pextraType() == 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(bview); -} -#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;