]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
Oops...
[lyx.git] / src / text2.C
index 16c056c7b6d603483af90cf51ad2ec0044176fed..bb72fc1778c531b10e72178234b03e5f423a1278 100644 (file)
 
 #include <config.h>
 
-#ifdef __GNUG__
-#pragma implementation "lyxtext.h"
-#endif
-
 #include "lyxtext.h"
 #include "LString.h"
 #include "paragraph.h"
@@ -35,7 +31,7 @@
 #include "counters.h"
 
 #include "insets/inseterror.h"
-#include "insets/insetbib.h"
+#include "insets/insetbibitem.h"
 #include "insets/insetspecialchar.h"
 #include "insets/insettext.h"
 #include "insets/insetfloat.h"
@@ -57,17 +53,17 @@ using lyx::pos_type;
 
 LyXText::LyXText(BufferView * bv)
        : height(0), width(0), first_y(0),
-         bv_owner(bv), inset_owner(0), the_locking_inset(0),
-         need_break_row(0), refresh_y(0), refresh_row(0),
+         inset_owner(0), the_locking_inset(0), need_break_row(0),
+         refresh_y(0), refresh_row(0), bv_owner(bv),
          status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
 {}
 
 
 LyXText::LyXText(InsetText * inset)
-       :  height(0), width(0), first_y(0),
-          bv_owner(0), inset_owner(inset), the_locking_inset(0),
-          need_break_row(0), refresh_y(0), refresh_row(0),
-          status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
+       : height(0), width(0), first_y(0),
+         inset_owner(inset), the_locking_inset(0), need_break_row(0),
+         refresh_y(0), refresh_row(0), bv_owner(0),
+         status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
 {}
 
 
@@ -162,7 +158,7 @@ LyXFont const LyXText::getFont(Buffer const * buf, Paragraph * par,
        // We specialize the 95% common case:
        if (!par->getDepth()) {
                if (layout->labeltype == LABEL_MANUAL
-                   && pos < beginningOfMainBody(buf, par)) {
+                   && pos < par->beginningOfMainBody()) {
                        // 1% goes here
                        LyXFont f = par->getFontSettings(buf->params, pos);
                        if (par->inInset())
@@ -180,7 +176,7 @@ LyXFont const LyXText::getFont(Buffer const * buf, Paragraph * par,
 
        LyXFont layoutfont;
 
-       if (pos < beginningOfMainBody(buf, par)) {
+       if (pos < par->beginningOfMainBody()) {
                // 1% goes here
                layoutfont = layout->labelfont;
        } else {
@@ -255,7 +251,7 @@ void LyXText::setCharFont(Buffer const * buf, Paragraph * par,
        // Get concrete layout font to reduce against
        LyXFont layoutfont;
 
-       if (pos < beginningOfMainBody(buf, par))
+       if (pos < par->beginningOfMainBody())
                layoutfont = layout->labelfont;
        else
                layoutfont = layout->font;
@@ -372,14 +368,11 @@ void LyXText::insertParagraph(BufferView * bview, Paragraph * par,
 
 Inset * LyXText::getInset() const
 {
-       Inset * inset = 0;
-       if (cursor.pos() == 0 && cursor.par()->bibkey) {
-               inset = cursor.par()->bibkey;
-       } else if (cursor.pos() < cursor.par()->size()
+       if (cursor.pos() < cursor.par()->size()
                   && cursor.par()->isInset(cursor.pos())) {
-               inset = cursor.par()->getInset(cursor.pos());
+               return cursor.par()->getInset(cursor.pos());
        }
-       return inset;
+       return 0;
 }
 
 
@@ -416,21 +409,21 @@ void LyXText::toggleInset(BufferView * bview)
 
 /* used in setlayout */
 // Asger is not sure we want to do this...
-void LyXText::makeFontEntriesLayoutSpecific(Buffer const * buf,
-                                           Paragraph * par)
+void LyXText::makeFontEntriesLayoutSpecific(Buffer const & buf,
+                                           Paragraph & par)
 {
-       LyXLayout_ptr const & layout = par->layout();
+       LyXLayout_ptr const & layout = par.layout();
 
        LyXFont layoutfont;
-       for (pos_type pos = 0; pos < par->size(); ++pos) {
-               if (pos < beginningOfMainBody(buf, par))
+       for (pos_type pos = 0; pos < par.size(); ++pos) {
+               if (pos < par.beginningOfMainBody())
                        layoutfont = layout->labelfont;
                else
                        layoutfont = layout->font;
 
-               LyXFont tmpfont = par->getFontSettings(buf->params, pos);
+               LyXFont tmpfont = par.getFontSettings(buf.params, pos);
                tmpfont.reduce(layoutfont);
-               par->setFont(pos, tmpfont);
+               par.setFont(pos, tmpfont);
        }
 }
 
@@ -465,7 +458,7 @@ Paragraph * LyXText::setLayout(BufferView * bview,
 
        do {
                par->applyLayout(lyxlayout);
-               makeFontEntriesLayoutSpecific(bview->buffer(), par);
+               makeFontEntriesLayoutSpecific(*bview->buffer(), *par);
                Paragraph * fppar = par;
                fppar->params().spaceTop(lyxlayout->fill_top ?
                                         VSpace(VSpace::VFILL)
@@ -475,11 +468,6 @@ Paragraph * LyXText::setLayout(BufferView * bview,
                                            : VSpace(VSpace::NONE));
                if (lyxlayout->margintype == MARGIN_MANUAL)
                        par->setLabelWidthString(lyxlayout->labelstring());
-               if (lyxlayout->labeltype != LABEL_BIBLIO
-                   && fppar->bibkey) {
-                       delete fppar->bibkey;
-                       fppar->bibkey = 0;
-               }
                cur.par(par);
                par = par->next();
        } while (par != epar);
@@ -644,8 +632,7 @@ void LyXText::setFont(BufferView * bview, LyXFont const & font, bool toggleall)
        if (!selection.set()) {
                // Determine basis font
                LyXFont layoutfont;
-               if (cursor.pos() < beginningOfMainBody(bview->buffer(),
-                                                      cursor.par())) {
+               if (cursor.pos() < cursor.par()->beginningOfMainBody()) {
                        layoutfont = getLabelFont(bview->buffer(),
                                                  cursor.par());
                } else {
@@ -973,15 +960,15 @@ void LyXText::cursorEnd(BufferView * bview) const
 {
        if (!cursor.row()->next()
            || cursor.row()->next()->par() != cursor.row()->par()) {
-               setCursor(bview, cursor.par(), rowLast(cursor.row()) + 1);
+               setCursor(bview, cursor.par(), cursor.row()->lastPos() + 1);
        } else {
                if (!cursor.par()->empty() &&
-                   (cursor.par()->getChar(rowLast(cursor.row())) == ' '
-                    || cursor.par()->isNewline(rowLast(cursor.row())))) {
-                       setCursor(bview, cursor.par(), rowLast(cursor.row()));
+                   (cursor.par()->getChar(cursor.row()->lastPos()) == ' '
+                    || cursor.par()->isNewline(cursor.row()->lastPos()))) {
+                       setCursor(bview, cursor.par(), cursor.row()->lastPos());
                } else {
                        setCursor(bview,cursor.par(),
-                                 rowLast(cursor.row()) + 1);
+                                 cursor.row()->lastPos() + 1);
                }
        }
 }
@@ -1066,16 +1053,6 @@ string LyXText::getStringToIndex(BufferView * bview)
 }
 
 
-pos_type LyXText::beginningOfMainBody(Buffer const * /*buf*/,
-                            Paragraph const * par) const
-{
-       if (par->layout()->labeltype != LABEL_MANUAL)
-               return 0;
-       else
-               return par->beginningOfMainBody();
-}
-
-
 // the DTP switches for paragraphs. LyX will store them in the first
 // physicla paragraph. When a paragraph is broken, the top settings rest,
 // the bottom settings are given to the new one. So I can make shure,
@@ -1286,13 +1263,10 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const
        } else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
                textclass.counters().step("bibitem");
                int number = textclass.counters().value("bibitem");
-               if (!par->bibkey) {
-                       InsetCommandParams p("bibitem");
-                       par->bibkey = new InsetBibKey(p);
+               if (par->bibitem()) {
+                       par->bibitem()->setCounter(number);
+                       par->params().labelString(layout->labelstring());
                }
-               par->bibkey->setCounter(number);
-               par->params().labelString(layout->labelstring());
-
                // In biblio should't be following counters but...
        } else {
                string s = layout->labelstring();
@@ -1660,7 +1634,7 @@ void LyXText::checkParagraph(BufferView * bview, Paragraph * par,
 
        // is there a break one row above
        if (row->previous() && row->previous()->par() == row->par()) {
-               z = nextBreakPoint(bview, row->previous(), workWidth(bview));
+               z = nextBreakPoint(bview, row->previous(), workWidth(*bview));
                if (z >= row->pos()) {
                        // set the dimensions of the row above
                        y -= row->previous()->height();
@@ -1680,12 +1654,12 @@ void LyXText::checkParagraph(BufferView * bview, Paragraph * par,
        }
 
        int const tmpheight = row->height();
-       pos_type const tmplast = rowLast(row);
+       pos_type const tmplast = row->lastPos();
        refresh_y = y;
        refresh_row = row;
 
        breakAgain(bview, row);
-       if (row->height() == tmpheight && rowLast(row) == tmplast)
+       if (row->height() == tmpheight && row->lastPos() == tmplast)
                status(bview, LyXText::NEED_VERY_LITTLE_REFRESH);
        else
                status(bview, LyXText::NEED_MORE_REFRESH);
@@ -1799,7 +1773,7 @@ void LyXText::setCursor(BufferView * bview, LyXCursor & cur, Paragraph * par,
        // y is now the cursor baseline
        cur.y(y);
 
-       pos_type last = rowLastPrintable(old_row);
+       pos_type last = old_row->lastPrintablePos();
 
        // None of these should happen, but we're scaredy-cats
        if (pos > par->size()) {
@@ -1853,8 +1827,7 @@ float LyXText::getCursorX(BufferView * bview, Row * row,
                cursor_vpos = (bidi_level(pos) % 2 == 0)
                        ? log2vis(pos) : log2vis(pos) + 1;
 
-       pos_type main_body =
-               beginningOfMainBody(bview->buffer(), row->par());
+       pos_type main_body = row->par()->beginningOfMainBody();
        if ((main_body > 0) &&
            ((main_body-1 > last) ||
             !row->par()->isLineSeparator(main_body-1)))
@@ -1872,7 +1845,7 @@ float LyXText::getCursorX(BufferView * bview, Row * row,
                                x -= singleWidth(bview,
                                                 row->par(), main_body - 1);
                }
-               if (hfillExpansion(bview->buffer(), row, pos)) {
+               if (row->hfillExpansion(pos)) {
                        x += singleWidth(bview, row->par(), pos);
                        if (pos >= main_body)
                                x += fill_hfill;
@@ -2010,7 +1983,7 @@ void LyXText::setCursorFromCoordinates(BufferView * bview, LyXCursor & cur,
        cur.row(row);
 
        if (beforeFullRowInset(*row, cur)) {
-               pos_type last = rowLastPrintable(row);
+               pos_type last = row->lastPrintablePos();
                float x = getCursorX(bview, row->next(), cur.pos(), last, bound);
                cur.ix(int(x));
                cur.iy(y + row->height() + row->next()->baseline());
@@ -2391,3 +2364,24 @@ void LyXText::status(BufferView * bview, LyXText::text_status st) const
                }
        }
 }
+
+
+bool LyXText::isTopLevel() const
+{
+       /// only the top-level lyxtext has a non-null bv owner
+       return bv_owner;
+}
+
+
+bool LyXText::isInInset() const
+{
+       return inset_owner;
+}
+
+
+int defaultRowHeight()
+{
+       LyXFont const font(LyXFont::ALL_SANE);
+       return int(font_metrics::maxAscent(font)
+                + font_metrics::maxDescent(font) * 1.5);
+}