#include "lyxtext.h"
#include "lyxrow.h"
-#include "layout.h"
+#include "lyxtextclasslist.h"
#include "paragraph.h"
#include "lyx_gui_misc.h"
#include "gettext.h"
// Returns the paragraph position of the last character in the specified row
pos_type LyXText::rowLast(Row const * row) const
{
- if (!row->next() || row->next()->par() != row->par())
+ if (!row->next() || row->next()->par() != row->par()) {
return row->par()->size() - 1;
- else
+ } else {
return row->next()->pos() - 1;
+ }
}
textclasslist.Style(bview->buffer()->params.textclass,
par->getLayout());
pos_type i = pos;
-
+
if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) {
/* special code for right address boxes, only newlines count */
while (i < par->size()) {
last_separator = i;
x = width; // this means break
} else if (c == Paragraph::META_INSET &&
- par->getInset(i)) {
+ par->getInset(i)) {
// check wether a Display() inset is
// valid here. if not, change it to
if (par->getInset(i)->display() &&
(layout.isCommand() ||
(layout.labeltype == LABEL_MANUAL
- && i < beginningOfMainBody(bview->buffer(), par)))) {
+ && i < beginningOfMainBody(bview->buffer(), par))))
+ {
// display istn't allowd
par->getInset(i)->display(false);
x += singleWidth(bview, par, i, c);
} else if (par->getInset(i)->display() ||
- par->getInset(i)->needFullRow()) {
+ par->getInset(i)->needFullRow())
+ {
// So break the line here
if (i == pos) {
if (pos < last-1) {
x = width; // this means break
} else {
x += singleWidth(bview, par, i, c);
+ // we have to check this separately as we could have a
+ // lineseparator and then the algorithm below would prefer
+ // that which IS wrong! We should always break on an inset
+ // if it's too long and not on the last separator.
+ // Maybe the only exeption is insets used as chars but
+ // then we would have to have a special function inside
+ // the inset to tell us this. Till then we leave it as
+ // it is now. (Jug 20020106)
+ if (pos < i && x >= width && last_separator >= 0)
+ last_separator = i - 1;
}
} else {
if (IsLineSeparatorChar(c))
x = left_margin;
}
}
+ if ((pos+1 < i) && (last_separator < 0) && (x >= width))
+ last_separator = i - 2;
+ else if ((pos < i) && (last_separator < 0) && (x >= width))
+ last_separator = i - 1;
// end of paragraph is always a suitable separator
- if (i == last && x < width)
+ else if (i == last && x < width)
last_separator = i;
}
{
pos_type const last = rowLast(row);
pos_type first = row->pos();
+
if (first) { /* hfill *DO* count at the beginning
* of paragraphs! */
- while (first <= last && row->par()->isHfill(first))
+ while (first <= last && row->par()->isHfill(first)) {
++first;
+ }
}
first = max(first, beginningOfMainBody(buf, row->par()));
int n = 0;
for (pos_type p = first; p <= last; ++p) {
// last, because the end is ignored!
+
if (row->par()->isHfill(p)) {
++n;
}
float x = 0;
if (layout.margintype != MARGIN_RIGHT_ADDRESS_BOX) {
float dummy;
+ // this IS needed
+ row_ptr->width(maxwidth);
prepareToPrint(bview, row_ptr, x, dummy, dummy, dummy, false);
}
row_ptr->width(int(maxwidth + x));
// Is there a break one row above
if ((cursor.par()->isLineSeparator(cursor.pos())
|| cursor.par()->isNewline(cursor.pos())
+ || ((cursor.pos() < cursor.par()->size()) &&
+ cursor.par()->isInset(cursor.pos()+1))
|| cursor.row()->fill() == -1)
&& row->previous() && row->previous()->par() == row->par()) {
pos_type z = nextBreakPoint(bview,
fill_separator = 0;
fill_label_hfill = 0;
- bool const is_rtl =
+ bool const is_rtl =
row->par()->isRightToLeftPar(bview->buffer()->params);
if (is_rtl) {
x = (workWidth(bview) > 0)
if (nh) {
if (w > 0)
fill_hfill = w / nh;
- } else {
+ // we don't have to look at the alignment if it is ALIGN_LEFT and
+ // if the row is already larger then the permitted width as then
+ // we force the LEFT_ALIGN'edness!
+ } else if (static_cast<int>(row->width()) < workWidth(bview)) {
// is it block, flushleft or flushright?
// set x how you need it
int align;