]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
small changes to ButtonController usage
[lyx.git] / src / text.C
index 13ff3232f1cbefd0becf8247a6f3691801b5c189..0783fe9753bee37361c04ea47de743a87df94196 100644 (file)
@@ -35,6 +35,7 @@
 #include "Painter.h"
 #include "tracer.h"
 #include "font.h"
+#include "encoding.h"
 
 using std::max;
 using std::min;
@@ -42,76 +43,7 @@ using std::endl;
 using std::pair;
 
 static const int LYX_PAPER_MARGIN = 20;
-extern int bibitemMaxWidth(Painter &, LyXFont const &);
-
-static int iso885968x[] = {
-       0xbc,   // 0xa8 = fathatan
-       0xbd,   // 0xa9 = dammatan
-       0xbe,   // 0xaa = kasratan
-       0xdb,   // 0xab = fatha
-       0xdc,   // 0xac = damma
-       0xdd,   // 0xad = kasra
-       0xde,   // 0xae = shadda
-       0xdf,   // 0xaf = sukun
-
-       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xb0-0xbf
-
-       0,      // 0xc0 
-       0xc1,   // 0xc1 = hamza
-       0xc2,   // 0xc2 = ligature madda
-       0xc3,   // 0xc3 = ligature hamza on alef
-       0xc4,   // 0xc4 = ligature hamza on waw
-       0xc5,   // 0xc5 = ligature hamza under alef
-       0xc0,   // 0xc6 = ligature hamza on ya 
-       0xc7,   // 0xc7 = alef
-       0xeb,   // 0xc8 = baa 
-       0xc9,   // 0xc9 = taa marbuta
-       0xec,   // 0xca = taa
-       0xed,   // 0xcb = thaa
-       0xee,   // 0xcc = jeem
-       0xef,   // 0xcd = haa
-       0xf0,   // 0xce = khaa
-       0xcf,   // 0xcf = dal
-
-       0xd0,   // 0xd0 = thal
-       0xd1,   // 0xd1 = ra
-       0xd2,   // 0xd2 = zain
-       0xf1,   // 0xd3 = seen
-       0xf2,   // 0xd4 = sheen
-       0xf3,   // 0xd5 = sad
-       0xf4,   // 0xd6 = dad
-       0xd7,   // 0xd7 = tah
-       0xd8,   // 0xd8 = zah
-       0xf5,   // 0xd9 = ain
-       0xf6,   // 0xda = ghain
-       0,0,0,0,0, // 0xdb- 0xdf
-
-       0,      // 0xe0
-       0xf7,   // 0xe1 = fa
-       0xf8,   // 0xe2 = qaf
-       0xf9,   // 0xe3 = kaf
-       0xfa,   // 0xe4 = lam
-       0xfb,   // 0xe5 = meem
-       0xfc,   // 0xe6 = noon
-       0xfd,   // 0xe7 = ha
-       0xe8,   // 0xe8 = waw
-       0xe9,   // 0xe9 = alef maksura
-       0xfe    // 0xea = ya
-};
-
-
-inline
-bool is_arabic(unsigned char c)
-{
-       return 0xa8 <= c && c <= 0xea && iso885968x[c-0xa8];
-}
-
-
-inline
-bool is_nikud(unsigned char c)
-{
-        return 192 <= c && c <= 210;
-}
+extern int bibitemMaxWidth(BufferView *, LyXFont const &);
 
 
 int LyXText::workWidth(BufferView * bview) const
@@ -122,36 +54,34 @@ int LyXText::workWidth(BufferView * bview) const
        return bview->workWidth();
 }
 
-unsigned char LyXText::TransformChar(unsigned char c, Letter_Form form) const
-{
-       if (is_arabic(c) && 
-           (form == FORM_INITIAL || form == FORM_MEDIAL) )
-               return iso885968x[c-0xa8];
-       else
-               return c;
-}
-
 
 unsigned char LyXText::TransformChar(unsigned char c, LyXParagraph * par,
                        LyXParagraph::size_type pos) const
 {
-       if (!is_arabic(c))
-               if (isdigit(c))
+       if (!Encoding::is_arabic(c))
+               if (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 && isdigit(c))
                        return c + (0xb0 - '0');
                else
                        return c;
 
-       bool not_first = (pos > 0 && is_arabic(par->GetChar(pos-1)));
-       if (pos < par->Last()-1 && is_arabic(par->GetChar(pos+1)))
-               if (not_first)
-                       return TransformChar(c,FORM_MEDIAL);
+       unsigned char prev_char = pos > 0 ? par->GetChar(pos-1) : ' ';
+       unsigned char next_char = ' ';
+       for (LyXParagraph::size_type i = pos+1; i < par->Last(); ++i)
+               if (!Encoding::IsComposeChar_arabic(par->GetChar(i))) {
+                       next_char = par->GetChar(i);
+                       break;
+               }
+
+       if (Encoding::is_arabic(next_char))
+               if (Encoding::is_arabic(prev_char))
+                       return Encoding::TransformChar(c, Encoding::FORM_MEDIAL);
                else
-                       return TransformChar(c,FORM_INITIAL);
+                       return Encoding::TransformChar(c, Encoding::FORM_INITIAL);
        else
-               if (not_first)
-                       return TransformChar(c,FORM_FINAL);
+               if (Encoding::is_arabic(prev_char))
+                       return Encoding::TransformChar(c, Encoding::FORM_FINAL);
                else
-                       return TransformChar(c,FORM_ISOLATED);
+                       return Encoding::TransformChar(c, Encoding::FORM_ISOLATED);
 }
 
 // This is the comments that some of the warnings below refers to.
@@ -196,10 +126,14 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
        if (IsPrintable(c)) {
                if (font.language()->RightToLeft()) {
                        if (font.language()->lang() == "arabic" &&
-                           lyxrc.font_norm == "iso8859-6.8x")
-                               c = TransformChar(c, par, pos);
+                           (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
+                            lyxrc.font_norm_type == LyXRC::ISO_10646_1))
+                               if (Encoding::IsComposeChar_arabic(c))
+                                       return 0;
+                               else
+                                       c = TransformChar(c, par, pos);
                        else if (font.language()->lang() == "hebrew" &&
-                                is_nikud(c))
+                                Encoding::IsComposeChar_hebrew(c))
                                return 0;
                }
                return lyxfont::width(c, font);
@@ -247,7 +181,7 @@ int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
                Inset * tmpinset = par->GetInset(pos);
                if (tmpinset) {
                        tmpinset->update(bview, font);
-                       return tmpinset->width(bview->painter(), font);
+                       return tmpinset->width(bview, font);
                } else
                        return 0;
 
@@ -326,8 +260,11 @@ void LyXText::ComputeBidiTables(Buffer const * buf, Row * row) const
                LyXParagraph::size_type pos =
                        (is_space && lpos + 1 <= bidi_end &&
                         !row->par()->IsLineSeparator(lpos + 1) &&
-                        (!row->par()->table
-                         || !row->par()->IsNewline(lpos + 1)) )
+                        (
+#ifndef NEW_TABULAR
+                                !row->par()->table ||
+#endif
+                                !row->par()->IsNewline(lpos + 1)) )
                        ? lpos + 1 : lpos;
                LyXFont font = row->par()->GetFontSettings(buf->params, pos);
                bool new_rtl = font.isVisibleRightToLeft();
@@ -393,7 +330,8 @@ void LyXText::ComputeBidiTables(Buffer const * buf, Row * row) const
        }
 
        LyXParagraph::size_type vpos = bidi_start - 1;
-       for (LyXParagraph::size_type lpos = bidi_start; lpos <= bidi_end; ++lpos) {
+       for (LyXParagraph::size_type lpos = bidi_start;
+            lpos <= bidi_end; ++lpos) {
                vpos += log2vis_list[lpos - bidi_start];
                vis2log_list[vpos - bidi_start] = lpos;
                log2vis_list[lpos - bidi_start] = vpos;
@@ -408,14 +346,20 @@ bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par,
        if (!lyxrc.rtl_support)
                return false;    // This is just for speedup
 
-       if (!bidi_InRange(pos - 1) ||
-           (par->table && par->IsNewline(pos-1)) )
+       if (!bidi_InRange(pos - 1)
+#ifndef NEW_TABULAR
+           || (par->table && par->IsNewline(pos-1))
+#endif
+               )
                return false;
 
        bool rtl = bidi_level(pos - 1) % 2;
        bool rtl2 = rtl;
-       if (pos == par->Last() ||
-           (par->table && par->IsNewline(pos)))
+       if (pos == par->Last()
+#ifndef NEW_TABULAR
+           || (par->table && par->IsNewline(pos))
+#endif
+               )
                rtl2 = par->isRightToLeftPar(buf->params);
        else if (bidi_InRange(pos))
                rtl2 = bidi_level(pos) % 2;
@@ -432,8 +376,11 @@ bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par,
 
        bool rtl = font.isVisibleRightToLeft();
        bool rtl2 = rtl;
-       if (pos == par->Last() ||
-           (par->table && par->IsNewline(pos)))
+       if (pos == par->Last()
+#ifndef NEW_TABULAR
+           || (par->table && par->IsNewline(pos))
+#endif
+               )
                rtl2 = par->isRightToLeftPar(buf->params);
        else if (bidi_InRange(pos))
                rtl2 =  bidi_level(pos) % 2;
@@ -565,10 +512,15 @@ void LyXText::draw(BufferView * bview, Row const * row,
        } else
 #endif
                if (c == LyXParagraph::META_INSET) {
-               Inset const * tmpinset = row->par()->GetInset(pos);
+               Inset * tmpinset = row->par()->GetInset(pos);
                if (tmpinset) {
+//                     tmpinset->update(bview, font, false);
                        tmpinset->draw(bview, font, offset+row->baseline(), x,
                                       cleared);
+                       if (status == CHANGED_IN_DRAW) {
+                               UpdateInset(bview, tmpinset);
+                               status = CHANGED_IN_DRAW;
+                       }
                }
                ++vpos;
 
@@ -602,20 +554,19 @@ void LyXText::draw(BufferView * bview, Row const * row,
        LyXParagraph::size_type last = RowLastPrintable(row);
 
        if (font.language()->lang() == "hebrew") {
-               if (is_nikud(c)) {
-                       LyXParagraph::size_type vpos2 = vpos;
+               if (Encoding::IsComposeChar_hebrew(c)) {
                        int width = lyxfont::width(c, font2);
                        int dx = 0;
-                       while (vpos2 <= last &&
-                              (pos = vis2log(vpos2)) >= 0
-                              && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
-                              && is_nikud(c))
-                               ++vpos2;
-                       if (static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
-                           && !is_nikud(c)) {
-                               int width2 = SingleWidth(bview, row->par(), pos, c);
-                               dx = (c == 'ø' || c == 'ã') 
-                                       ? width2 - width : (width2 - width) / 2;
+                       for (LyXParagraph::size_type i = pos-1; i >= 0; --i) {
+                               c = row->par()->GetChar(i);
+                               if (!Encoding::IsComposeChar_hebrew(c)) {
+                                       if (IsPrintableNonspace(c)) {
+                                               int width2 = SingleWidth(bview, row->par(), i, c);
+                                               dx = (c == 'ø' || c == 'ã') // dalet / resh
+                                                       ? width2 - width : (width2 - width) / 2;
+                                       }
+                                       break;
+                               }
                        }
                        // Draw nikud
                        pain.text(int(x) + dx, offset + row->baseline(),
@@ -623,8 +574,8 @@ void LyXText::draw(BufferView * bview, Row const * row,
                } else {
                        while (vpos <= last &&
                               (pos = vis2log(vpos)) >= 0
-                              && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
-                              && !is_nikud(c)
+                              && IsPrintableNonspace(c = row->par()->GetChar(pos))
+                              && !Encoding::IsComposeChar_hebrew(c)
                               && font2 == GetFont(bview->buffer(), row->par(), pos)) {
                                textstring += c;
                                ++vpos;
@@ -635,23 +586,46 @@ void LyXText::draw(BufferView * bview, Row const * row,
                        x += lyxfont::width(textstring, font);
                }
        } else if (font.language()->lang() == "arabic" &&
-                  lyxrc.font_norm == "iso8859-6.8x") {
-               textstring = TransformChar(c, row->par(), pos);
-               while (vpos <= last &&
-                      (pos = vis2log(vpos)) >= 0
-                      && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
-                      && font2 == GetFont(bview->buffer(), row->par(), pos)) {
+                  (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
+                   lyxrc.font_norm_type == LyXRC::ISO_10646_1)) {
+               if (Encoding::IsComposeChar_arabic(c)) {
                        c = TransformChar(c, row->par(), pos);
-                       textstring += c;
-                       ++vpos;
+                       textstring = c;
+                       int width = lyxfont::width(c, font2);
+                       int dx = 0;
+                       for (LyXParagraph::size_type i = pos-1; i >= 0; --i) {
+                               c = row->par()->GetChar(i);
+                               if (!Encoding::IsComposeChar_arabic(c)) {
+                                       if (IsPrintableNonspace(c)) {
+                                               int width2 = SingleWidth(bview, row->par(), i, c);
+                                               dx = (width2 - width) / 2;
+                                       }
+                                       break;
+                               }
+                       }
+                       // Draw nikud
+                       pain.text(int(x) + dx, offset + row->baseline(), 
+                                 textstring, font);
+               } else {
+                       textstring = TransformChar(c, row->par(), pos);
+                       while (vpos <= last &&
+                              (pos = vis2log(vpos)) >= 0
+                              && IsPrintableNonspace(c = row->par()->GetChar(pos))
+                              && !Encoding::IsComposeChar_arabic(c)
+                              && font2 == GetFont(bview->buffer(), row->par(), pos)) {
+                               c = TransformChar(c, row->par(), pos);
+                               textstring += c;
+                               ++vpos;
+                       }
+                       // Draw text and set the new x position
+                       pain.text(int(x), offset + row->baseline(),
+                                 textstring, font);
+                       x += lyxfont::width(textstring, font);
                }
-               // Draw text and set the new x position
-               pain.text(int(x), offset + row->baseline(), textstring, font);
-               x += lyxfont::width(textstring, font);
        } else {
                while (vpos <= last &&
                       (pos = vis2log(vpos)) >= 0
-                      && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
+                      && IsPrintableNonspace(c = row->par()->GetChar(pos))
                       && font2 == GetFont(bview->buffer(), row->par(), pos)) {
                        textstring += c;
                        ++vpos;
@@ -660,13 +634,8 @@ void LyXText::draw(BufferView * bview, Row const * row,
                pain.text(int(x), offset + row->baseline(), textstring, font);
                x += lyxfont::width(textstring, font);
        }
-       
-       // what about underbars?
-       if (font.underbar() == LyXFont::ON && font.latex() != LyXFont::ON) {
-               pain.line(int(tmpx), offset + row->baseline() + 2,
-                         int(x), offset + row->baseline() + 2);
-               
-       } else if (lyxrc.mark_foreign_language &&
+
+       if (lyxrc.mark_foreign_language &&
            font.language() != bview->buffer()->params.language_info) {
                int y = offset + row->height() - 1;
                pain.line(int(tmpx), y, int(x), y,
@@ -719,7 +688,11 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
        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 &&
@@ -738,7 +711,10 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
                // make a corresponding row. Needed to call LeftMargin()
                
                // check wether it is a sufficent paragraph 
-               if (newpar && newpar->footnoteflag == row->par()->footnoteflag
+               if (newpar
+#ifndef NEW_INSETS
+                   && newpar->footnoteflag == row->par()->footnoteflag
+#endif
                    && textclasslist
                        .Style(bview->buffer()->params.textclass, 
                               newpar->GetLayout()).isEnvironment()) {
@@ -751,11 +727,19 @@ int LyXText::LeftMargin(BufferView * bview, 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
                }
                
                if (newpar && !row->par()->GetLayout()) {
+#ifndef NEW_INSETS
                        if (newpar->FirstPhysicalPar()->noindent)
+#else
+                       if (newpar->noindent)
+#endif
                                parindent.erase();
                        else
                                parindent = textclasslist
@@ -871,11 +855,17 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
        }
        
        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)
+               align = layout.align;
+       else
+               align = row->par()->align;
+#endif 
        // set the correct parindent
        if (row->pos() == 0) {
                if ((layout.labeltype == LABEL_NO_LABEL 
@@ -884,7 +874,9 @@ 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()->layout ||
@@ -897,8 +889,7 @@ int LyXText::LeftMargin(BufferView * bview, Row const * row) const
                                                  .defaultfont());
                else if (layout.labeltype == LABEL_BIBLIO) {
                        // ale970405 Right width for bibitems
-                       x += bibitemMaxWidth(bview->painter(),
-                                            textclasslist
+                       x += bibitemMaxWidth(bview,textclasslist
                                             .TextClass(bview->buffer()->params
                                                        .textclass)
                                             .defaultfont());
@@ -935,17 +926,27 @@ 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 && newpar->footnoteflag == row->par()->footnoteflag
+               if (newpar
+#ifndef NEW_INSETS
+                   && newpar->footnoteflag == row->par()->footnoteflag
+#endif
                    && textclasslist.Style(buf->params.textclass,
                                           newpar->GetLayout())
                       .isEnvironment()) {
@@ -958,7 +959,11 @@ 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
                }
        }
        
@@ -1095,25 +1100,30 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const
                        par->Last();
                // this is the usual handling
                int x = LeftMargin(bview, row);
-               while (x < width && i < last) {
+               bool doitonetime = true;
+               while (doitonetime || ((x < width) && (i < last))) {
+                       doitonetime = false;
                        char c = par->GetChar(i);
                        if (IsNewlineChar(c)) {
                                last_separator = i;
                                x = width; // this means break
                        } else if (c == LyXParagraph::META_INSET &&
-                                  par->GetInset(i) && par->GetInset(i)->display()){
+                                  par->GetInset(i)) {
+                               
                                // check wether a Display() inset is
                                // valid here. if not, change it to
                                // non-display
-                               if (layout.isCommand()
-                                   || (layout.labeltype == LABEL_MANUAL
-                                       && i < BeginningOfMainBody(bview->buffer(), par))){
+                               if (par->GetInset(i)->display() &&
+                                   (layout.isCommand() ||
+                                    ((layout.labeltype == LABEL_MANUAL) &&
+                                     (i < BeginningOfMainBody(bview->buffer(), par))))) {
                                        // display istn't allowd
                                        par->GetInset(i)->display(false);
                                        x += SingleWidth(bview, par, i, c);
-                               } else {
-                                       // inset is display. So break the line here
-                                       if (i == pos){
+                               } else if (par->GetInset(i)->display() ||
+                                        par->GetInset(i)->needFullRow()) {
+                                       // So break the line here
+                                       if (i == pos) {
                                                if (pos < last-1) {
                                                        last_separator = i;
                                                        if (IsLineSeparatorChar(par->GetChar(i+1)))
@@ -1123,6 +1133,13 @@ LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const
                                        } else
                                                last_separator = i - 1;
                                        x = width;  // this means break
+                               } else {
+#if 0
+                                       last_separator = i;
+                                       x += width;
+#else
+                                       x += SingleWidth(bview, par, i, c);
+#endif
                                }
                        } else  {
                                if (IsLineSeparatorChar(c))
@@ -1398,9 +1415,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());
@@ -1437,9 +1458,9 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
                   tmpinset = row_ptr->par()->GetInset(pos);
                   if (tmpinset) {
                           tmpinset->update(bview, tmpfont);
-                          asc = tmpinset->ascent(bview->painter(), tmpfont);
-                          desc = tmpinset->descent(bview->painter(), tmpfont);
-                          maxwidth += tmpinset->width(bview->painter(), tmpfont);
+                          asc = tmpinset->ascent(bview, tmpfont);
+                          desc = tmpinset->descent(bview, tmpfont);
+                          maxwidth += tmpinset->width(bview, tmpfont);
                           maxasc = max(maxasc, asc);
                           maxdesc = max(maxdesc, desc);
                   }
@@ -1610,7 +1631,12 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
    }
    
    /* is it a bottom line? */ 
-   if (row_ptr->par()->ParFromPos(RowLast(row_ptr) + 1) == par
+   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())) {     
          
          /* the paper margins */ 
@@ -1682,11 +1708,11 @@ void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
    
    height += row_ptr->height();
    float x, dummy;
-   PrepareToPrint(bview, row_ptr, x, dummy, dummy, dummy);
-   row_ptr->width(maxwidth+x);
+   PrepareToPrint(bview, row_ptr, x, dummy, dummy, dummy, false);
+   row_ptr->width(int(maxwidth + x));
    if (inset_owner) {
           Row * r = firstrow;
-          width = 0;
+          width = max(0,workWidth(bview));
           while(r) {
                   if (r->width() > width)
                           width = r->width();
@@ -1832,14 +1858,24 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout)
    /* table stuff -- end */
 #endif
    // this is only allowed, if the current paragraph is not empty or caption
-   if ((cursor.par()->Last() <= 0 && !cursor.par()->IsDummy())
+   if ((cursor.par()->Last() <= 0
+#ifndef NEW_INSETS
+       && !cursor.par()->IsDummy()
+#endif
+          )
        && 
        layout.labeltype!= LABEL_SENSITIVE)
      return;
 
-   SetUndo(bview->buffer(), Undo::INSERT, 
+   SetUndo(bview->buffer(), Undo::INSERT,
+#ifndef NEW_INSETS
           cursor.par()->ParFromPos(cursor.pos())->previous, 
-          cursor.par()->ParFromPos(cursor.pos())->next); 
+          cursor.par()->ParFromPos(cursor.pos())->next
+#else
+          cursor.par()->previous, 
+          cursor.par()->next
+#endif
+          ); 
 
 #ifndef NEW_TABULAR
    /* table stuff -- begin */
@@ -1911,7 +1947,11 @@ void LyXText::BreakParagraph(BufferView * bview, char keep_layout)
 
    SetHeightOfRow(bview, cursor.row());
    
-   while (!cursor.par()->Next()->table && cursor.par()->Next()->Last()
+   while (
+#ifndef NEW_TABULAR
+          !cursor.par()->Next()->table &&
+#endif
+          cursor.par()->Next()->Last()
          && cursor.par()->Next()->IsNewline(0))
           cursor.par()->Next()->Erase(0);
    
@@ -2503,10 +2543,13 @@ void LyXText::InsertCharInTable(BufferView * bview, char c)
                if ((cursor.pos() > 0 && 
                     cursor.par()->IsLineSeparator(cursor.pos() - 1))
                    || (cursor.pos() > 0 && cursor.par()->IsNewline(cursor.pos() - 1))
-                   || (cursor.pos() == 0 &&
-                       !(cursor.par()->Previous()
+                   || (cursor.pos() == 0
+#ifndef NEW_INSETS
+                       && !(cursor.par()->Previous()
                          && cursor.par()->Previous()->footnoteflag
-                         == LyXParagraph::OPEN_FOOTNOTE)))
+                         == LyXParagraph::OPEN_FOOTNOTE)
+#endif
+                           ))
                        return;
        } else if (IsNewlineChar(c)) {
             if (!IsEmptyTableCell()) {
@@ -2680,9 +2723,15 @@ void LyXText::RedoParagraph(BufferView * bview) const
  * same Paragraph one to the right and make a rebreak */
 void LyXText::InsertChar(BufferView * bview, char c)
 {
-       SetUndo(bview->buffer(), Undo::INSERT, 
+       SetUndo(bview->buffer(), Undo::INSERT,
+#ifndef NEW_INSETS
                cursor.par()->ParFromPos(cursor.pos())->previous, 
-               cursor.par()->ParFromPos(cursor.pos())->next);
+               cursor.par()->ParFromPos(cursor.pos())->next
+#else
+               cursor.par()->previous, 
+               cursor.par()->next
+#endif
+               );
 
        // When the free-spacing option is set for the current layout,
        // disable the double-space checking
@@ -2731,9 +2780,12 @@ void LyXText::InsertChar(BufferView * bview, char c)
                    || (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))) {
+                            == 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
@@ -2742,7 +2794,11 @@ void LyXText::InsertChar(BufferView * bview, char c)
                        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;
@@ -2761,7 +2817,8 @@ void LyXText::InsertChar(BufferView * bview, char c)
        // the display inset stuff
        if (cursor.row()->par()->GetChar(cursor.row()->pos()) == LyXParagraph::META_INSET
            && cursor.row()->par()->GetInset(cursor.row()->pos())
-           && cursor.row()->par()->GetInset(cursor.row()->pos())->display())
+           && (cursor.row()->par()->GetInset(cursor.row()->pos())->display() ||
+               cursor.row()->par()->GetInset(cursor.row()->pos())->needFullRow()))
                cursor.row()->fill(-1); // to force a new break  
 
        // get the cursor row fist
@@ -2920,8 +2977,8 @@ void LyXText::PrepareToPrint(BufferView * bview,
        fill_separator = 0;
        fill_label_hfill = 0;
 
-#ifndef NEW_INSETS
         bool is_rtl = row->par()->isRightToLeftPar(bview->buffer()->params);
+#ifndef NEW_INSETS
 
        if (is_rtl) {
                x = RightMargin(bview->buffer(), row);
@@ -2968,15 +3025,23 @@ 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)
+         align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align;
+       else
+         align = row->par()->align;
+#endif
           
        // center displayed insets 
+       Inset * inset;
           if (row->par()->GetChar(row->pos()) == LyXParagraph::META_INSET
-              && row->par()->GetInset(row->pos())
-              && row->par()->GetInset(row->pos())->display())
+              && (inset=row->par()->GetInset(row->pos()))
+              && (inset->display())) // || (inset->scroll() < 0)))
             align = LYX_ALIGN_CENTER;
 
           switch (align) {
@@ -3126,13 +3191,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()) {
@@ -3384,12 +3453,20 @@ 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); 
 
+#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))
@@ -3445,9 +3522,15 @@ void LyXText::Delete(BufferView * bview)
        if (old_cursor.par() != cursor.par() || old_cursor.pos() != cursor.pos()) {
                LyXCursor tmpcursor = cursor;
                cursor = old_cursor; // to make sure undo gets the right cursor position
-               SetUndo(bview->buffer(), Undo::DELETE, 
+               SetUndo(bview->buffer(), Undo::DELETE,
+#ifndef NEW_INSETS
                        cursor.par()->ParFromPos(cursor.pos())->previous, 
-                       cursor.par()->ParFromPos(cursor.pos())->next); 
+                       cursor.par()->ParFromPos(cursor.pos())->next
+#else
+                       cursor.par()->previous, 
+                       cursor.par()->next
+#endif
+                       ); 
                cursor = tmpcursor;
                Backspace(bview);
        }
@@ -3484,17 +3567,26 @@ void LyXText::Backspace(BufferView * bview)
       
                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)) {
+                        && cursor.par()->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+#endif
+                       ) {
                        // 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()->GetLayout() == tmppar->GetLayout()
+#ifndef NEW_INSETS
                                    && cursor.par()->footnoteflag == tmppar->footnoteflag
+#endif
                                    && cursor.par()->GetAlign() == tmppar->GetAlign()) {
                                        // Inherit botom DTD from the paragraph below.
                                        // (the one we are deleting)
@@ -3516,12 +3608,20 @@ void LyXText::Backspace(BufferView * bview)
                                return;
                        }
                }
-               
+
+#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();
@@ -3549,7 +3649,9 @@ 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
 #ifndef NEW_TABULAR
                    /* table stuff -- begin*/
                    && !cursor.par()->table /* no pasting of tables */ 
@@ -3592,9 +3694,15 @@ void LyXText::Backspace(BufferView * bview)
        } else {
                /* this is the code for a normal backspace, not pasting
                 * any paragraphs */ 
-               SetUndo(bview->buffer(), Undo::DELETE, 
+               SetUndo(bview->buffer(), Undo::DELETE,
+#ifndef NEW_INSETS
                        cursor.par()->ParFromPos(cursor.pos())->previous, 
-                       cursor.par()->ParFromPos(cursor.pos())->next); 
+                       cursor.par()->ParFromPos(cursor.pos())->next
+#else
+                       cursor.par()->previous, 
+                       cursor.par()->next
+#endif
+                       ); 
                // 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,
@@ -3608,7 +3716,8 @@ void LyXText::Backspace(BufferView * bview)
                                return; 
                        // force complete redo when erasing display insets
                        // this is a cruel method but safe..... Matthias 
-                       if (cursor.par()->GetInset(cursor.pos())->display()){
+                       if (cursor.par()->GetInset(cursor.pos())->display() ||
+                           cursor.par()->GetInset(cursor.pos())->needFullRow()) {
                                cursor.par()->Erase(cursor.pos());
                                RedoParagraph(bview);
                                return;
@@ -3721,18 +3830,15 @@ void LyXText::Backspace(BufferView * bview)
                }
                
                // break the cursor row again
-               z = NextBreakPoint(bview, row, workWidth(bview));
-               
-               if (z != RowLast(row) || 
-                   (row->next() && row->next()->par() == row->par() &&
-                    RowLast(row) == row->par()->Last() - 1)){
+               if (row->next() && row->next()->par() == row->par() &&
+                   (RowLast(row) == row->par()->Last() - 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 (row->next() && row->next()->par() == row->par() &&
-                           RowLast(row) == row->par()->Last() - 1)
+                       if (RowLast(row) == row->par()->Last() - 1)
                                RemoveRow(row->next());
                        
                        refresh_y = y;
@@ -3743,10 +3849,7 @@ void LyXText::Backspace(BufferView * bview)
                        SetCursor(bview, cursor.par(), cursor.pos(), false, cursor.boundary());
                        // cursor MUST be in row now
                        
-                       if (row->next() && row->next()->par() == row->par())
-                               need_break_row = row->next();
-                       else
-                               need_break_row = 0;
+                       need_break_row = row->next();
                } else  {
                        // set the dimensions of the row
                        row->fill(Fill(bview, row, workWidth(bview)));
@@ -3767,9 +3870,9 @@ void LyXText::Backspace(BufferView * bview)
 
        lastpos = cursor.par()->Last();
        if (cursor.pos() == lastpos) {
-               SetCurrentFont(bview);
                if (IsBoundary(bview->buffer(), cursor.par(), cursor.pos()) != cursor.boundary())
                        SetCursor(bview, cursor.par(), cursor.pos(), false, !cursor.boundary());
+               SetCurrentFont(bview);
        }
        
        // check, wether the last characters font has changed.
@@ -3787,7 +3890,7 @@ void LyXText::Backspace(BufferView * bview)
 
 
 void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
-                           Row * row_ptr, long y)
+                           Row * row_ptr, long y, bool cleared)
 {
        /* returns a printed row */
        Painter & pain = bview->painter();
@@ -3796,9 +3899,10 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
        LyXParagraph::size_type last = RowLastPrintable(row_ptr);
 
        LyXParagraph::size_type vpos, pos;
-       float x, tmpx;
-       int y_top, y_bottom;
-       float fill_separator, fill_hfill, fill_label_hfill;
+       float x;
+       float tmpx;
+       int y_top;
+       int y_bottom;
 
        LyXFont font(LyXFont::ALL_SANE);
        int maxdesc;
@@ -3807,44 +3911,55 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                       << row_ptr->height() << endl;
                return;
        }
+
+       float fill_separator;
+       float fill_hfill;
+       float fill_label_hfill;
        PrepareToPrint(bview, row_ptr, x, fill_separator,
                       fill_hfill, fill_label_hfill);
        
+       if (inset_owner && (x < 0))
+               x = 0;
        x += x_offset;
        
        // clear the area where we want to paint/print
-       int ww;
-       ww = bview->workWidth();
+       int ww = bview->workWidth();
 
        bool clear_area = true;
        Inset * inset = 0;
 
        if ((last == row_ptr->pos()) &&
            (row_ptr->par()->GetChar(row_ptr->pos()) == LyXParagraph::META_INSET) &&
-           (inset=row_ptr->par()->GetInset(row_ptr->pos())))
-       {
+           (inset = row_ptr->par()->GetInset(row_ptr->pos()))) {
                clear_area = inset->doClearArea();
        }
-       if (clear_area) {
-               int w;
-               if (inset_owner)
-                       w = inset_owner->width(bview->painter(), font);
-               else
-                       w = ww;
+       if (cleared) { // we don't need to clear it's already done!!!
+               clear_area = true;
+       } else if (clear_area) {
+               int w = (inset_owner ? inset_owner->width(bview, font) : ww);
                pain.fillRectangle(x_offset, y_offset, w, row_ptr->height());
        } else if (inset != 0) {
-               int h = row_ptr->baseline() - inset->ascent(pain, font);
+               int h = row_ptr->baseline() - inset->ascent(bview, font);
                if (h > 0) {
-                       int w;
-                       if (inset_owner)
-                               w = inset_owner->width(bview->painter(), font);
-                       else
-                               w = ww;
+                       int w = (inset_owner ?
+                                inset_owner->width(bview, font) : ww);
                        pain.fillRectangle(x_offset, y_offset, w, h);
                }
+               h += inset->ascent(bview, font) + inset->descent(bview, font);
+               if ((row_ptr->height() - h) > 0) {
+                       int w = (inset_owner ?
+                                inset_owner->width(bview, font) : ww);
+                       pain.fillRectangle(x_offset,y_offset+h, w, row_ptr->height()-h);
+               }
+               if (!inset_owner && !inset->display() && !inset->needFullRow())
+               {
+                       int w = inset->width(bview, font) + int(x);
+                       pain.fillRectangle(w, y_offset, ww - w, row_ptr->height());
+               }
        }
        
        if (selection) {
+               int w = (inset_owner ? inset_owner->width(bview, font) : ww);
                /* selection code */
                if (bidi_same_direction) {
                        if (sel_start_cursor.row() == row_ptr &&
@@ -3870,14 +3985,14 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                else
                                        pain.fillRectangle(x_offset + sel_start_cursor.x(),
                                                           y_offset,
-                                                          ww - sel_start_cursor.x(),
+                                                          w - sel_start_cursor.x(),
                                                           row_ptr->height(),
                                                           LColor::selection);
                        } else if (sel_end_cursor.row() == row_ptr) {
                                if (is_rtl)
                                        pain.fillRectangle(x_offset + sel_end_cursor.x(),
                                                           y_offset,
-                                                          ww - sel_end_cursor.x(),
+                                                          w - sel_end_cursor.x(),
                                                           row_ptr->height(),
                                                           LColor::selection);
                                else
@@ -3887,7 +4002,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                                           LColor::selection);
                        } else if (y > long(sel_start_cursor.y())
                                   && y < long(sel_end_cursor.y())) {
-                               pain.fillRectangle(x_offset, y_offset, ww,
+                               pain.fillRectangle(x_offset, y_offset, w,
                                                   row_ptr->height(),
                                                   LColor::selection);
                        }
@@ -3895,14 +4010,14 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                            sel_end_cursor.row() != row_ptr &&
                            y > long(sel_start_cursor.y())
                            && y < long(sel_end_cursor.y())) {
-                       pain.fillRectangle(x_offset, y_offset, ww,
+                       pain.fillRectangle(x_offset, y_offset, w,
                                           row_ptr->height(),
                                           LColor::selection);
                } else if (sel_start_cursor.row() == row_ptr ||
                           sel_end_cursor.row() == row_ptr) {
                        float tmpx = x;
-                       int cell = 0;
 #ifndef NEW_TABULAR
+                       int cell = 0;
                        if (row_ptr->par()->table) {
                                cell = NumberOfCell(row_ptr->par(), row_ptr->pos());
                                tmpx += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
@@ -4113,7 +4228,11 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
        }
 #endif
        // Draw appendix lines
+#ifndef NEW_INSETS
        LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar();
+#else
+       LyXParagraph * firstpar = row_ptr->par();
+#endif
        if (firstpar->appendix){
                pain.line(1, y_offset,
                          1, y_offset + row_ptr->height(),
@@ -4137,18 +4256,25 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                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 line_x = (LYX_PAPER_MARGIN / 5) * (i + minipage) + box_x;
@@ -4299,11 +4425,13 @@ 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);
@@ -4356,7 +4484,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                        + lyxfont::width(layout.labelsep, font);
                        else
                                tmpx = x - lyxfont::width(layout.labelsep, font)
-                                       - row_ptr->par()->bibkey->width(bview->painter(), font);
+                                       - row_ptr->par()->bibkey->width(bview, font);
                        row_ptr->par()->bibkey->draw(bview, font,
                                                   y_offset + row_ptr->baseline(), 
                                                   tmpx, clear_area);
@@ -4364,9 +4492,18 @@ 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();
-       if ((row_ptr->par()->ParFromPos(last + 1) == par) &&
-           (!row_ptr->next() || (row_ptr->next()->par() != row_ptr->par())))
+#else
+       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->next() && bv_owner)
@@ -4443,6 +4580,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        int 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);
@@ -4450,6 +4588,7 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                        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) {
@@ -4788,17 +4927,32 @@ int LyXText::GetColumnNearX(BufferView * bview, Row * row, int & x,
        }
 #endif
 
-
        if (vc > last + 1)  // This shouldn't happen.
                vc = last + 1;
 
        boundary = false;
-
+#if 0 // currently unused
+       bool lastrow = (!row->next() || row->next()->par() != row->par());
+       bool rtl = (lastrow)
+               ? row->par()->isRightToLeftPar(bview->buffer()->params)
+               : false;
+#endif
+       
        if (row->pos() > last)  // Row is empty?
                c = row->pos();
-       else if (vc == row->pos() ||
-                (row->par()->table
-                 && vc <= last && row->par()->IsNewline(vc-1)) ) {
+#warning This is wrong, please have a look Dekel (Jug)
+#if 0
+       else if (lastrow &&
+                ( (rtl && vc == row->pos()&& x < tmpx - 5) ||
+                  (!rtl && vc == last + 1 && x > tmpx + 5) ))
+               c = last + 1;
+#endif
+       else if (vc == row->pos()
+#ifndef NEW_TABULAR
+                || (row->par()->table
+                 && vc <= last && row->par()->IsNewline(vc-1))
+#endif
+               ) {
                c = vis2log(vc);
                if (bidi_level(c) % 2 == 1)
                        ++c;
@@ -4811,8 +4965,12 @@ int LyXText::GetColumnNearX(BufferView * bview, Row * row, int & x,
                }
        }
 
-       if (!row->par()->table && row->pos() <= last && c > last
-           && row->par()->IsNewline(last)) {
+       if (
+#ifndef NEW_TABULAR
+               !row->par()->table &&
+#endif
+               row->pos() <= last && c > last
+               && row->par()->IsNewline(last)) {
                if (bidi_level(last) % 2 == 0)
                        tmpx -= SingleWidth(bview, row->par(), last);
                else