#include "lyxtext.h"
#include "support/textutils.h"
#include "insets/insetbib.h"
+#include "insets/insettext.h"
#include "lyx_gui_misc.h"
#include "gettext.h"
#include "bufferparams.h"
#include "Painter.h"
#include "tracer.h"
#include "font.h"
+#include "encoding.h"
using std::max;
using std::min;
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
{
if (inset_owner) {
-#if 1
- return inset_owner->getMaxWidth(bview->painter(), inset_owner);
-#else
- LyXFont font(LyXFont::ALL_SANE);
- return inset_owner->width(bview->painter(), font);
-#endif
+ return inset_owner->textWidth(bview->painter());
}
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.
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);
} 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 ||
font.decSize();
font.decSize();
return lyxfont::width(fs, font);
+#endif
} else if (c == LyXParagraph::META_INSET) {
- Inset * tmpinset= par->GetInset(pos);
- if (tmpinset)
- return par->GetInset(pos)->width(bview->painter(),
- font);
- else
+ Inset * tmpinset = par->GetInset(pos);
+ if (tmpinset) {
+ tmpinset->update(bview, font);
+ return tmpinset->width(bview, font);
+ } else
return 0;
} else if (IsSeparatorChar(c))
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();
}
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;
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;
return rtl != rtl2;
}
+
bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par,
LyXParagraph::size_type pos,
LyXFont const & font) const
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;
void LyXText::draw(BufferView * bview, Row const * row,
LyXParagraph::size_type & vpos,
- int offset, float & x)
+ int offset, float & x, bool cleared)
{
Painter & pain = bview->painter();
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
++vpos;
return;
- } else if (c == LyXParagraph::META_INSET) {
- Inset const * tmpinset = row->par()->GetInset(pos);
+ } else
+#endif
+ if (c == LyXParagraph::META_INSET) {
+ Inset * tmpinset = row->par()->GetInset(pos);
if (tmpinset) {
- tmpinset->draw(bview->painter(), font,
- offset + row->baseline(), x);
+// 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;
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(),
} 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;
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;
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,
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 &&
// 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()) {
// 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
}
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
|| (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 ||
.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());
textclasslist
.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
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()) {
// 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
}
}
}
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
int LyXText::NumberOfCell(LyXParagraph * par,
LyXParagraph::size_type pos) const
}
-#ifndef NEW_TABULAR
bool LyXText::HitInTable(BufferView * bview, Row * row, int x) const
{
float tmpx;
fill_hfill, fill_label_hfill, false);
return (x > tmpx && x < tmpx + row->par()->table->WidthOfTable());
}
-#endif
bool LyXText::MouseHitInTable(BufferView * bview, int x, long y) const
/* table stuff -- end*/
+#endif
// get the next breakpoint in a given paragraph
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)))
} 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))
/* 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());
int maxdesc = int(lyxfont::maxDescent(font) *
layout.spacing.getValue() *
spacing_val);
-
int pos_end = RowLast(row_ptr);
-
int labeladdon = 0;
+ int maxwidth = 0;
// Check if any insets are larger
for (pos = row_ptr->pos(); pos <= pos_end; ++pos) {
- if (row_ptr->par()->GetChar(pos) == LyXParagraph::META_INSET) {
- tmpfont = GetFont(bview->buffer(), row_ptr->par(), pos);
- tmpinset = row_ptr->par()->GetInset(pos);
- if (tmpinset) {
- asc = tmpinset->ascent(bview->painter(), tmpfont);
- desc = tmpinset->descent(bview->painter(), tmpfont);
- if (asc > maxasc)
- maxasc = asc;
- if (desc > maxdesc)
- maxdesc = desc;
- }
- }
+ if (row_ptr->par()->GetChar(pos) == LyXParagraph::META_INSET) {
+ tmpfont = GetFont(bview->buffer(), row_ptr->par(), pos);
+ tmpinset = row_ptr->par()->GetInset(pos);
+ if (tmpinset) {
+ tmpinset->update(bview, tmpfont);
+ asc = tmpinset->ascent(bview, tmpfont);
+ desc = tmpinset->descent(bview, tmpfont);
+ maxwidth += tmpinset->width(bview, tmpfont);
+ maxasc = max(maxasc, asc);
+ maxdesc = max(maxdesc, desc);
+ }
+ } else {
+ maxwidth += SingleWidth(bview, row_ptr->par(), pos);
+ }
}
// Check if any custom fonts are larger (Asger)
}
/* 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 */
row_ptr->baseline(maxasc + labeladdon);
height += row_ptr->height();
+ float x, dummy;
+ PrepareToPrint(bview, row_ptr, x, dummy, dummy, dummy, false);
+ row_ptr->width(int(maxwidth + x));
+ if (inset_owner) {
+ Row * r = firstrow;
+ width = max(0,workWidth(bview));
+ while(r) {
+ if (r->width() > width)
+ width = r->width();
+ r = r->next();
+ }
+ }
}
/* 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 */
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);
}
+#ifndef NEW_INSETS
void LyXText::OpenFootnote(BufferView * bview)
{
LyXParagraph * endpar,* tmppar;
SetCursor(bview, par->next, 0);
sel_cursor = cursor;
}
-
+#endif
+
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
void LyXText::TableFeatures(BufferView * bview, int feature, string const & val) const
Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
LyXFont font(LyXFont::ALL_INHERIT,lang);
for (int i = 0; i < number; ++i) {
- cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE);
- cursor.par()->SetFont(pos, font);
+ cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
}
/* append the row into the table */
Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
LyXFont font(LyXFont::ALL_INHERIT,lang);
for (int i = 0; i < number; ++i) {
- cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE);
- cursor.par()->SetFont(pos, font);
+ cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
}
/* append the row into the table */
do{
if (pos && (cursor.par()->IsNewline(pos-1))){
if (cursor.par()->table->AppendCellAfterCell(cell_org, cell)) {
- cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE);
- cursor.par()->SetFont(pos, font);
+ cursor.par()->InsertChar(pos,
+ LyXParagraph::META_NEWLINE,
+ font);
if (pos <= cursor.pos())
cursor.pos(cursor.pos() + 1);
++pos;
This saves one byte memory per table ;-) */
if (cursor.par()->table->AppendCellAfterCell(cell_org, cell)) {
LyXParagraph::size_type last = cursor.par()->Last();
- cursor.par()->InsertChar(last, LyXParagraph::META_NEWLINE);
- cursor.par()->SetFont(last, font);
+ cursor.par()->InsertChar(last,
+ LyXParagraph::META_NEWLINE, font);
}
/* append the column into the table */
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()) {
}
/* table stuff -- end*/
+#endif
// Just a macro to make some thing easier.
* 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
|| (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
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;
// 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
}
}
+
void LyXText::PrepareToPrint(BufferView * bview,
Row * row, float & x,
float & fill_separator,
fill_label_hfill = 0;
bool is_rtl = row->par()->isRightToLeftPar(bview->buffer()->params);
+#ifndef NEW_INSETS
if (is_rtl) {
x = RightMargin(bview->buffer(), row);
font.setSize(LyXFont::SIZE_SMALL);
x += lyxfont::width("Mwide-figM", font);
}
- } else if (workWidth(bview) > 0)
+ } else
+#endif
+ if (workWidth(bview) > 0)
x = LeftMargin(bview, row);
else
x = 0;
// 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) {
&& (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()) {
SetCursor(bview, cursor.par(), cursor.pos() );
// finally set the selection
- SetSelection(bview);
+ SetSelection();
}
#ifdef HAVE_SSTREAM
&& latex.str() == "\\-"
#else
- && string(latex.str(), 3) == "\\-" // this is not nice at all
+ && latex.str() // protect against null pointers
+ && string(latex.str(), 3) == "\\-" // this is not nice at all
#endif
))
cursor.pos(cursor.pos() + 1);
SetCursor(bview, cursor.par(), cursor.pos());
// finally set the selection
- SetSelection(bview);
+ SetSelection();
}
SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
sel_cursor = cursor;
cursor = tmpcursor;
- SetSelection(bview);
+ SetSelection();
/* -----> Great, CutSelection() gets rid of multiple spaces. */
CutSelection(bview);
SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
sel_cursor = cursor;
cursor = tmpcursor;
- SetSelection(bview);
+ SetSelection();
CutSelection(bview);
}
}
SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
sel_cursor = cursor;
cursor = tmpcursor;
- SetSelection(bview);
+ SetSelection();
// What is this test for ??? (JMarc)
if (!selection) {
DeleteWordForward(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))
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);
}
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)
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();
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 */
} 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,
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;
}
// 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;
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)));
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.
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();
int y_top, y_bottom;
float fill_separator, fill_hfill, fill_label_hfill;
- LyXFont font;
+ LyXFont font(LyXFont::ALL_SANE);
int maxdesc;
if (row_ptr->height() <= 0) {
lyxerr << "LYX_ERROR: row.height: "
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 = workWidth(bview);
- if (ww < 0)
- ww = bview->workWidth();
- if (bv_owner)
- pain.fillRectangle(x_offset, y_offset, ww, row_ptr->height());
+ int ww;
+ 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())))
+ {
+ clear_area = inset->doClearArea();
+ }
+ if (cleared) { // we don't need to clear it's already done!!!
+ clear_area = true;
+ } else if (clear_area) {
+ int w;
+ if (inset_owner)
+ w = inset_owner->width(bview, font);
+ else
+ w = ww;
+ pain.fillRectangle(x_offset, y_offset, w, row_ptr->height());
+ } else if (inset != 0) {
+ int h = row_ptr->baseline() - inset->ascent(bview, font);
+ if (h > 0) {
+ int w;
+ if (inset_owner)
+ w = inset_owner->width(bview, font);
+ else
+ w = 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;
+ if (inset_owner)
+ w = inset_owner->width(bview, font);
+ else
+ w = 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;
+ if (inset_owner)
+ w = inset_owner->width(bview, font);
+ else
+ w = ww;
/* selection code */
if (bidi_same_direction) {
if (sel_start_cursor.row() == row_ptr &&
sel_end_cursor.row() == row_ptr) {
if (sel_start_cursor.x() < sel_end_cursor.x())
- pain.fillRectangle(sel_start_cursor.x(), y_offset,
+ pain.fillRectangle(x_offset + sel_start_cursor.x(),
+ y_offset,
sel_end_cursor.x() - sel_start_cursor.x(),
row_ptr->height(),
LColor::selection);
else
- pain.fillRectangle(sel_end_cursor.x(), y_offset,
+ pain.fillRectangle(x_offset + sel_end_cursor.x(),
+ y_offset,
sel_start_cursor.x() - sel_end_cursor.x(),
row_ptr->height(),
LColor::selection);
} else if (sel_start_cursor.row() == row_ptr) {
if (is_rtl)
- pain.fillRectangle(0, y_offset,
+ pain.fillRectangle(x_offset, y_offset,
sel_start_cursor.x(),
row_ptr->height(),
LColor::selection);
else
- pain.fillRectangle(sel_start_cursor.x(), y_offset,
- ww - sel_start_cursor.x(),
+ pain.fillRectangle(x_offset + sel_start_cursor.x(),
+ y_offset,
+ w - sel_start_cursor.x(),
row_ptr->height(),
LColor::selection);
} else if (sel_end_cursor.row() == row_ptr) {
if (is_rtl)
- pain.fillRectangle(sel_end_cursor.x(), y_offset,
- ww - sel_end_cursor.x(),
+ pain.fillRectangle(x_offset + sel_end_cursor.x(),
+ y_offset,
+ w - sel_end_cursor.x(),
row_ptr->height(),
LColor::selection);
else
- pain.fillRectangle(0, y_offset,
+ pain.fillRectangle(x_offset, y_offset,
sel_end_cursor.x(),
row_ptr->height(),
LColor::selection);
} else if (y > long(sel_start_cursor.y())
&& y < long(sel_end_cursor.y())) {
- pain.fillRectangle(0, y_offset,
- ww, row_ptr->height(),
+ 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 &&
y > long(sel_start_cursor.y())
&& y < long(sel_end_cursor.y())) {
- pain.fillRectangle(0, y_offset, ww, row_ptr->height(),
+ 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);
#endif
if ( (sel_start_cursor.row() != row_ptr && !is_rtl) ||
(sel_end_cursor.row() != row_ptr && is_rtl))
- pain.fillRectangle(0, y_offset,
+ pain.fillRectangle(x_offset, y_offset,
int(tmpx),
row_ptr->height(),
LColor::selection);
sel_start_cursor.pos() <= pos) &&
(sel_end_cursor.row() != row_ptr ||
pos < sel_end_cursor.pos()) )
- pain.fillRectangle(int(old_tmpx), y_offset,
+ pain.fillRectangle(x_offset + int(old_tmpx),
+ y_offset,
int(tmpx - old_tmpx + 1),
row_ptr->height(),
LColor::selection);
sel_start_cursor.pos() <= pos) &&
(sel_end_cursor.row() != row_ptr ||
pos < sel_end_cursor.pos()) )
- pain.fillRectangle(int(old_tmpx), y_offset,
+ pain.fillRectangle(x_offset + int(old_tmpx),
+ y_offset,
int(tmpx - old_tmpx + 1),
row_ptr->height(),
- LColor::selection);
+ LColor::selection);
}
#ifndef NEW_TABULAR
}
#endif
if ( (sel_start_cursor.row() != row_ptr && is_rtl) ||
(sel_end_cursor.row() != row_ptr && !is_rtl) )
- pain.fillRectangle(int(tmpx), y_offset,
+ pain.fillRectangle(x_offset + int(tmpx),
+ y_offset,
int(ww - tmpx),
row_ptr->height(),
LColor::selection);
}
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);
workWidth(bview) - LYX_PAPER_MARGIN,
y_offset, LColor::footnote);
}
-
+#endif
// Draw appendix lines
+#ifndef NEW_INSETS
LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar();
+#else
+ LyXParagraph * firstpar = row_ptr->par();
+#endif
if (firstpar->appendix){
pain.line(1, y_offset,
1, y_offset + row_ptr->height(),
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;
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);
+ 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->draw(pain,
- font,
+ - row_ptr->par()->bibkey->width(bview, font);
+ row_ptr->par()->bibkey->draw(bview, font,
y_offset + row_ptr->baseline(),
- tmpx);
+ tmpx, clear_area);
}
}
/* 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)
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);
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) {
row_ptr->par(), pos);
++vpos;
} else
- draw(bview, row_ptr, vpos, y_offset, x);
+ draw(bview, row_ptr, vpos, y_offset, x, clear_area);
}
/* do not forget the very last cell. This has no NEWLINE so
x += fill_separator;
++vpos;
} else
- draw(bview, row_ptr, vpos, y_offset, x);
+ draw(bview, row_ptr, vpos, y_offset, x, clear_area);
}
#ifndef NEW_TABULAR
}
#endif
- // Jürgen!!! FIX This! (NOW!!!) (please)
- width = max(x - x_offset, float(width));
}
}
#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;
}
}
- 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
return c;
}
-
+
+#ifndef NEW_INSETS
/* turn the selection into a new environment. If there is no selection,
* create an empty environment */
void LyXText::InsertFootnoteEnvironment(BufferView * bview,
ClearSelection();
}
-
+#endif
+
// returns pointer to a specified row
Row * LyXText::GetRow(LyXParagraph * par,