]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
more guii moving around.
[lyx.git] / src / text.C
index 217398f890a7b39ae556b028f6b2fefa8544aeec..e376fff0af1d3c56ddc16df1c3f1a8bc17e1b8cc 100644 (file)
 #include "buffer.h"
 #include "debug.h"
 #include "lyxrc.h"
-#include "LyXView.h"
-#include "Painter.h"
+#include "frontends/LyXView.h"
+#include "frontends/Painter.h"
+#include "frontends/screen.h"
 #include "tracer.h"
 #include "font.h"
 #include "encoding.h"
-#include "lyxscreen.h"
 #include "bufferview_funcs.h"
 #include "BufferView.h"
 #include "language.h"
@@ -283,6 +283,13 @@ void LyXText::computeBidiTables(Buffer const * buf, Row * row) const
                return;
        }
 
+       Inset * inset = row->par()->inInset();
+       if (inset && inset->owner() &&
+           inset->owner()->lyxCode() == Inset::ERT_CODE) {
+               bidi_start = -1;
+               return;
+       }
+
        bidi_start = row->pos();
        bidi_end = rowLastPrintable(row);
 
@@ -306,7 +313,7 @@ void LyXText::computeBidiTables(Buffer const * buf, Row * row) const
 
        pos_type stack[2];
        bool const rtl_par =
-               row->par()->getParLanguage(buf->params)->RightToLeft();
+               row->par()->isRightToLeftPar(buf->params);
        int level = 0;
        bool rtl = false;
        bool rtl0 = false;
@@ -475,23 +482,25 @@ void LyXText::drawNewline(DrawRowParams & p, pos_type const pos)
 }
 
 
-void LyXText::drawInset(DrawRowParams & p, pos_type const pos)
+bool LyXText::drawInset(DrawRowParams & p, pos_type const pos)
 {
        Inset * inset = p.row->par()->getInset(pos);
 
        // FIXME: shouldn't happen
        if (!inset) {
-               return;
+               return true;
        }
 
        LyXFont const & font = getFont(p.bv->buffer(), p.row->par(), pos);
+       // we need this here as the row pointer may be illegal
+       // at a later time (Jug20020502)
+       Row * prev = p.row->previous();
 
        inset->update(p.bv, font, false);
        inset->draw(p.bv, font, p.yo + p.row->baseline(), p.x, p.cleared);
 
        if (!need_break_row && !inset_owner
            && p.bv->text->status() == CHANGED_IN_DRAW) {
-               Row * prev = p.row->previous();
                if (prev && prev->par() == p.row->par()) {
                        breakAgainOneRow(p.bv, prev);
                        if (prev->next() != p.row) {
@@ -501,11 +510,15 @@ void LyXText::drawInset(DrawRowParams & p, pos_type const pos)
                        } else {
                                need_break_row = p.row;
                        }
+               } else if (!prev) {
+                       need_break_row = firstrow;
                } else {
-                       need_break_row = p.row;
+                       need_break_row = prev->next();
                }
                setCursor(p.bv, cursor.par(), cursor.pos());
+               return false;
        }
+       return true;
 }
 
 
@@ -630,7 +643,7 @@ void LyXText::drawChars(DrawRowParams & p, pos_type & vpos,
 }
 
 
-void LyXText::draw(DrawRowParams & p, pos_type & vpos)
+bool LyXText::draw(DrawRowParams & p, pos_type & vpos)
 {
        pos_type const pos = vis2log(vpos);
        Paragraph * par = p.row->par();
@@ -644,12 +657,13 @@ void LyXText::draw(DrawRowParams & p, pos_type & vpos)
        if (IsNewlineChar(c)) {
                ++vpos;
                drawNewline(p, pos);
-               return;
+               return true;
        } else if (IsInsetChar(c)) {
-               drawInset(p, pos);
+               if (!drawInset(p, pos))
+                       return false;
                ++vpos;
                drawForeignMark(p, orig_x, orig_font);
-               return;
+               return true;
        }
 
        // usual characters, no insets
@@ -681,6 +695,7 @@ void LyXText::draw(DrawRowParams & p, pos_type & vpos)
                lyxerr << "No this shouldn't happen!\n";
 #endif
 #endif
+       return true;
 }
 
 
@@ -834,6 +849,15 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const
        break;
        }
 
+       if ((workWidth(bview) > 0) &&
+               !row->par()->params().leftIndent().zero())
+       {
+               LyXLength const len = row->par()->params().leftIndent();
+               int const tw = inset_owner ?
+                       inset_owner->latexTextWidth(bview) : workWidth(bview);
+               x += len.inPixels(tw, bview->text->defaultHeight());
+       }
+
        LyXAlignment align; // wrong type
 
        if (row->par()->params().align() == LYX_ALIGN_LAYOUT)
@@ -1159,7 +1183,7 @@ int LyXText::numberOfSeparators(Buffer const * buf, Row const * row) const
 {
        pos_type last = rowLastPrintable(row);
        pos_type p = max(row->pos(), beginningOfMainBody(buf, row->par()));
-               
+
        int n = 0;
        for (; p <= last; ++p) {
                if (row->par()->isSeparator(p)) {
@@ -1731,6 +1755,12 @@ void LyXText::breakParagraph(BufferView * bview, char keep_layout)
      keep_layout = 2;
    else
      keep_layout = layout.isEnvironment();
+
+   // we need to set this before we insert the paragraph. IMO the
+   // breakParagraph call should return a bool if it inserts the
+   // paragraph before or behind and we should react on that one
+   // but we can fix this in 1.3.0 (Jug 20020509)
+   bool const isempty = (layout.keepempty && !cursor.par()->size());
    cursor.par()->breakParagraph(bview->buffer()->params, cursor.pos(),
                                keep_layout);
 
@@ -1783,7 +1813,7 @@ void LyXText::breakParagraph(BufferView * bview, char keep_layout)
 
    /* This check is necessary. Otherwise the new empty paragraph will
     * be deleted automatically. And it is more friendly for the user! */
-   if (cursor.pos() || layout.keepempty)
+   if (cursor.pos() || isempty)
           setCursor(bview, cursor.par()->next(), 0);
    else
           setCursor(bview, cursor.par(), 0);
@@ -1955,10 +1985,10 @@ void LyXText::insertChar(BufferView * bview, char c)
        // Is there a break one row above
        if (row->previous() && row->previous()->par() == row->par()
            && (cursor.par()->isLineSeparator(cursor.pos())
-               || cursor.par()->isNewline(cursor.pos())
-               || ((cursor.pos() < cursor.par()->size()) &&
-                   cursor.par()->isInset(cursor.pos()+1))
-               || cursor.row()->fill() == -1))
+               || cursor.par()->isNewline(cursor.pos())
+               || ((cursor.pos() < cursor.par()->size()) &&
+                   cursor.par()->isInset(cursor.pos()+1))
+               || cursor.row()->fill() == -1))
        {
                pos_type z = nextBreakPoint(bview,
                                                           row->previous(),
@@ -3662,7 +3692,8 @@ void LyXText::paintRowText(DrawRowParams & p)
                                p.x += p.separator;
                        ++vpos;
                } else {
-                       draw(p, vpos);
+                       if (!draw(p, vpos))
+                               break;
                }
        }
 }