]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
more 'informational' messages removed?
[lyx.git] / src / text.C
index dfbef44e5dbef279a9c449e6548aa41e2eef9be3..543971669a02ca1da4f87921a22fa0071b9fae8a 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "lyxtext.h"
 #include "lyxrow.h"
-#include "layout.h"
+#include "lyxtextclasslist.h"
 #include "paragraph.h"
 #include "lyx_gui_misc.h"
 #include "gettext.h"
@@ -137,7 +137,7 @@ unsigned char LyXText::transformChar(unsigned char c, Paragraph * par,
                        pos_type pos) const
 {
        if (!Encodings::is_arabic(c))
-               if (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 && isdigit(c))
+               if (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 && IsDigit(c))
                        return c + (0xb0 - '0');
                else
                        return c;
@@ -245,10 +245,11 @@ int LyXText::singleWidth(BufferView * bview, Paragraph * par,
 // 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;
+       }
 }
 
 
@@ -930,7 +931,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                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()) {
@@ -958,7 +959,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                                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
@@ -966,12 +967,14 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                                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) {
@@ -985,6 +988,16 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                                        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))
@@ -1002,8 +1015,12 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                                        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;
        }
        
@@ -1134,16 +1151,19 @@ int LyXText::numberOfHfills(Buffer const * buf, Row const * row) const
 {
        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;
                }
@@ -1528,6 +1548,8 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
        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));
@@ -1785,7 +1807,7 @@ void LyXText::insertChar(BufferView * bview, char c)
                static string const number_seperators = ".,:";
 
                if (current_font.number() == LyXFont::ON) {
-                       if (!isdigit(c) && !contains(number_operators, c) &&
+                       if (!IsDigit(c) && !contains(number_operators, c) &&
                            !(contains(number_seperators, c) &&
                              cursor.pos() >= 1 &&
                              cursor.pos() < cursor.par()->size() &&
@@ -1797,7 +1819,7 @@ void LyXText::insertChar(BufferView * bview, char c)
                                      cursor.pos() - 1).number() == LyXFont::ON)
                            )
                                number(bview); // Set current_font.number to OFF
-               } else if (isdigit(c) &&
+               } else if (IsDigit(c) &&
                           real_current_font.isVisibleRightToLeft()) {
                        number(bview); // Set current_font.number to ON
 
@@ -1916,6 +1938,8 @@ void LyXText::insertChar(BufferView * bview, char c)
        // 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,
@@ -2057,7 +2081,7 @@ void LyXText::prepareToPrint(BufferView * 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)
@@ -2084,7 +2108,10 @@ void LyXText::prepareToPrint(BufferView * bview,
        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;
@@ -3501,7 +3528,6 @@ void LyXText::paintLastRow(DrawRowParams & p)
                y_bottom -= asc;
        }
 
-       pos_type const last = rowLastPrintable(p.row);
        bool const is_rtl = p.row->par()->isRightToLeftPar(p.bv->buffer()->params);
        int const endlabel = par->getEndLabel(buffer->params);