]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
clean up a bit
[lyx.git] / src / text2.C
index fcd43d880e64b3667c3c87da0c9d487f0a4a3d71..16c056c7b6d603483af90cf51ad2ec0044176fed 100644 (file)
 #include "insets/insetspecialchar.h"
 #include "insets/insettext.h"
 #include "insets/insetfloat.h"
+#include "insets/insetwrap.h"
 
 #include "support/LAssert.h"
 #include "support/textutils.h"
 #include "support/lstrings.h"
 
+#include "BoostFormat.h"
+
 using std::vector;
 using std::copy;
 using std::endl;
@@ -129,21 +132,12 @@ LyXFont const realizeFont(LyXFont const & font,
        while (par && par_depth && !tmpfont.resolved()) {
                par = par->outerHook();
                if (par) {
-#ifndef INHERIT_LANGUAGE
                        tmpfont.realize(par->layout()->font);
-#else
-                       tmpfont.realize(tclass[par->layout()]->font,
-                                       buf->params.language);
-#endif
                        par_depth = par->getDepth();
                }
        }
 
-#ifndef INHERIT_LANGUAGE
        tmpfont.realize(tclass.defaultfont());
-#else
-       tmpfont.realize(tclass.defaultfont(), buf->params.language);
-#endif
 
        return tmpfont;
 }
@@ -173,20 +167,12 @@ LyXFont const LyXText::getFont(Buffer const * buf, Paragraph * par,
                        LyXFont f = par->getFontSettings(buf->params, pos);
                        if (par->inInset())
                                par->inInset()->getDrawFont(f);
-#ifndef INHERIT_LANGUAGE
                        return f.realize(layout->reslabelfont);
-#else
-                       return f.realize(layout.reslabelfont, buf->params.language);
-#endif
                } else {
                        LyXFont f = par->getFontSettings(buf->params, pos);
                        if (par->inInset())
                                par->inInset()->getDrawFont(f);
-#ifndef INHERIT_LANGUAGE
                        return f.realize(layout->resfont);
-#else
-                       return f.realize(layout.resfont, buf->params.language);
-#endif
                }
        }
 
@@ -203,11 +189,8 @@ LyXFont const LyXText::getFont(Buffer const * buf, Paragraph * par,
        }
 
        LyXFont tmpfont = par->getFontSettings(buf->params, pos);
-#ifndef INHERIT_LANGUAGE
        tmpfont.realize(layoutfont);
-#else
-       tmpfont.realize(layoutfont, buf->params.language);
-#endif
+
        if (par->inInset())
                par->inInset()->getDrawFont(tmpfont);
 
@@ -283,20 +266,11 @@ void LyXText::setCharFont(Buffer const * buf, Paragraph * par,
                while (!layoutfont.resolved() && tp && tp->getDepth()) {
                        tp = tp->outerHook();
                        if (tp)
-#ifndef INHERIT_LANGUAGE
                                layoutfont.realize(tp->layout()->font);
-#else
-                               layoutfont.realize(tclass[tp->layout()].font,
-                                                  buf->params.language);
-#endif
                }
        }
 
-#ifndef INHERIT_LANGUAGE
        layoutfont.realize(tclass.defaultfont());
-#else
-       layoutfont.realize(tclass.defaultfont(), buf->params.language);
-#endif
 
        // Now, reduce font against full layout font
        font.reduce(layoutfont);
@@ -575,8 +549,6 @@ void  LyXText::incDepth(BufferView * bview)
        // and sel_end cursor
        cursor = selection.start;
 
-       bool anything_changed = false;
-
        while (true) {
                // NOTE: you can't change the depth of a bibliography entry
                if (cursor.par()->layout()->labeltype != LABEL_BIBLIO) {
@@ -586,7 +558,6 @@ void  LyXText::incDepth(BufferView * bview)
                                if (cursor.par()->getDepth()
                                    < prev->getMaxDepthAfter()) {
                                        cursor.par()->params().depth(cursor.par()->getDepth() + 1);
-                                       anything_changed = true;
                                }
                        }
                }
@@ -595,16 +566,6 @@ void  LyXText::incDepth(BufferView * bview)
                cursor.par(cursor.par()->next());
        }
 
-       // if nothing changed set all depth to 0
-       if (!anything_changed) {
-               cursor = selection.start;
-               while (cursor.par() != selection.end.par()) {
-                       cursor.par()->params().depth(0);
-                       cursor.par(cursor.par()->next());
-               }
-               cursor.par()->params().depth(0);
-       }
-
        redoParagraphs(bview, selection.start, endpar);
 
        // we have to reset the selection, because the
@@ -700,12 +661,8 @@ void LyXText::setFont(BufferView * bview, LyXFont const & font, bool toggleall)
                current_font = real_current_font;
                current_font.reduce(layoutfont);
                // And resolve it completely
-#ifndef INHERIT_LANGUAGE
                real_current_font.realize(layoutfont);
-#else
-               real_current_font.realize(layoutfont,
-                                         bview->buffer()->params.language);
-#endif
+
                return;
        }
 
@@ -1082,33 +1039,29 @@ void LyXText::toggleFree(BufferView * bview,
 
 string LyXText::getStringToIndex(BufferView * bview)
 {
-       string idxstring;
-
        // Try implicit word selection
        // If there is a change in the language the implicit word selection
        // is disabled.
        LyXCursor const reset_cursor = cursor;
        bool const implicitSelection = selectWordWhenUnderCursor(bview, PREVIOUS_WORD);
 
-       if (!selection.set()) {
+       string idxstring;
+       if (!selection.set())
                bview->owner()->message(_("Nothing to index!"));
-               return string();
-       }
-       if (selection.start.par() != selection.end.par()) {
+       else if (selection.start.par() != selection.end.par())
                bview->owner()->message(_("Cannot index more than one paragraph!"));
-               return string();
-       }
+       else
+               idxstring = selectionAsString(bview->buffer(), false);
 
-       idxstring = selectionAsString(bview->buffer(), false);
+       // Reset cursors to their original position.
+       cursor = reset_cursor;
+       setCursor(bview, cursor.par(), cursor.pos());
+       selection.cursor = cursor;
 
-       // Implicit selections are cleared afterwards
-       //and cursor is set to the original position.
-       if (implicitSelection) {
+       // Clear the implicit selection.
+       if (implicitSelection)
                clearSelection();
-               cursor = reset_cursor;
-               setCursor(bview, cursor.par(), cursor.pos());
-               selection.cursor = cursor;
-       }
+
        return idxstring;
 }
 
@@ -1263,30 +1216,24 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const
 
        // is it a layout that has an automatic label?
        if (layout->labeltype >= LABEL_COUNTER_CHAPTER) {
+               int const i = layout->labeltype - LABEL_COUNTER_CHAPTER;
 
-               int i = layout->labeltype - LABEL_COUNTER_CHAPTER;
-               string numbertype;
-               string langtype;
                ostringstream s;
 
                if (i >= 0 && i <= buf->params.secnumdepth) {
+                       string numbertype;
+                       string langtype;
 
                        textclass.counters().step(layout->latexname());
 
                        // Is there a label? Useful for Chapter layout
                        if (!par->params().appendix()) {
-                               if (!layout->labelstring().empty())
-                                       par->params().labelString(layout->labelstring());
-                               else
-                                       par->params().labelString(string());
+                               s << layout->labelstring();
                        } else {
-                               if (!layout->labelstring_appendix().empty())
-                                       par->params().labelString(layout->labelstring_appendix());
-                               else
-                                       par->params().labelString(string());
+                               s << layout->labelstring_appendix();
                        }
 
-                       // Use if an integer is here less than elegant. For now.
+                       // Use of an integer is here less than elegant. For now.
                        int head = textclass.maxcounter() - LABEL_COUNTER_CHAPTER;
                        if (!par->params().appendix()) {
                                numbertype = "sectioning";
@@ -1302,9 +1249,7 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const
                                .numberLabel(layout->latexname(),
                                             numbertype, langtype, head);
 
-                       par->params().labelString(par->params().labelString() + s.str().c_str());
-                       // We really want to remove the c_str as soon as
-                       // possible...
+                       par->params().labelString(STRCONV(s.str()));
 
                        // reset enum counters
                        textclass.counters().reset("enum");
@@ -1335,9 +1280,8 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const
                        textclass.counters().step(enumcounter);
 
                        s << textclass.counters()
-                               .numberLabel(enumcounter,
-                                            "enumeration", langtype);
-                       par->params().labelString(s.str().c_str());
+                               .numberLabel(enumcounter, "enumeration");
+                       par->params().labelString(STRCONV(s.str()));
                }
        } else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
                textclass.counters().step("bibitem");
@@ -1361,7 +1305,8 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const
                        while (tmppar && tmppar->inInset()
                               // the single '=' is intended below
                               && (in = tmppar->inInset()->owner())) {
-                               if (in->lyxCode() == Inset::FLOAT_CODE) {
+                               if (in->lyxCode() == Inset::FLOAT_CODE ||
+                                   in->lyxCode() == Inset::WRAP_CODE) {
                                        isOK = true;
                                        break;
                                } else {
@@ -1376,15 +1321,22 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const
                                textclass.counters().step(fl.type());
 
                                // Doesn't work... yet.
+#warning use boost.format
+#if USE_BOOST_FORMAT
+                               s = boost::io::str(boost::format(_("%1$s #:")) % fl.name());
+                               // s << boost::format(_("%1$s %1$d:")
+                               //        % fl.name()
+                               //        % buf->counters().value(fl.name());
+#else
                                ostringstream o;
-                               //o << fl.name() << " " << buf->counters().value(fl.name()) << ":";
+                               //o << fl.name() << ' ' << buf->counters().value(fl.name()) << ":";
                                o << fl.name() << " #:";
-                               s = o.str();
+                               s = STRCONV(o.str());
+#endif
                        } else {
                                // par->SetLayout(0);
                                // s = layout->labelstring;
-                               s = (par->getParLanguage(buf->params)->lang() == "hebrew")
-                                       ? " :úåòîùî øñç" : "Senseless: ";
+                               s = _("Senseless: ");
                        }
                }
                par->params().labelString(s);
@@ -1407,14 +1359,11 @@ void LyXText::setCounter(Buffer const * buf, Paragraph * par) const
 }
 
 
-// Updates all counters BEHIND the row. Changed paragraphs
-// with a dynamic left margin will be rebroken.
+// Updates all counters. Paragraphs with changed label string will be rebroken
 void LyXText::updateCounters(BufferView * bview) const
 {
-       Paragraph * par;
-
        Row * row = firstrow;
-       par = row->par();
+       Paragraph * par = row->par();
 
        // CHECK if this is really needed. (Lgb)
        bview->buffer()->params.getLyXTextClass().counters().reset();
@@ -1423,18 +1372,18 @@ void LyXText::updateCounters(BufferView * bview) const
                while (row->par() != par)
                        row = row->next();
 
+               string const oldLabel = par->params().labelString();
+
+               // setCounter can potentially change the labelString.
                setCounter(bview->buffer(), par);
 
-               // now check for the headline layouts. remember that they
-               // have a dynamic left margin
-               LyXLayout_ptr const & layout = par->layout();
+               string const & newLabel = par->params().labelString();
 
-               if (layout->margintype == MARGIN_DYNAMIC
-                   || layout->labeltype == LABEL_SENSITIVE) {
-                       // Rebreak the paragraph
+               if (oldLabel.empty() && !newLabel.empty()) {
                        removeParagraph(row);
                        appendParagraph(bview, row);
                }
+
                par = par->next();
        }
 }
@@ -1470,7 +1419,9 @@ void LyXText::copyEnvironmentType()
 
 void LyXText::pasteEnvironmentType(BufferView * bview)
 {
-       setLayout(bview, copylayouttype);
+       // do nothing if there has been no previous copyEnvironmentType()
+       if (!copylayouttype.empty())
+               setLayout(bview, copylayouttype);
 }
 
 
@@ -1542,7 +1493,8 @@ void LyXText::cutSelection(BufferView * bview, bool doclear, bool realcut)
 
        // cutSelection can invalidate the cursor so we need to set
        // it anew. (Lgb)
-       cursor = selection.start;
+       // we prefer the end for when tracking changes
+       cursor = selection.end;
 
        // need a valid cursor. (Lgb)
        clearSelection();
@@ -1606,14 +1558,13 @@ void LyXText::pasteSelection(BufferView * bview)
 }
 
 
-// sets the selection over the number of characters of string, no check!!
-void LyXText::setSelectionOverString(BufferView * bview, string const & str)
+void LyXText::setSelectionRange(BufferView * bview, lyx::pos_type length)
 {
-       if (str.empty())
+       if (!length)
                return;
 
        selection.cursor = cursor;
-       for (string::size_type i = 0; i < str.length(); ++i)
+       while (length--)
                cursorRight(bview);
        setSelection(bview);
 }
@@ -1850,7 +1801,11 @@ void LyXText::setCursor(BufferView * bview, LyXCursor & cur, Paragraph * par,
 
        pos_type last = rowLastPrintable(old_row);
 
-       if (pos > last + 1) {
+       // None of these should happen, but we're scaredy-cats
+       if (pos > par->size()) {
+               pos = 0;
+               cur.pos(0);
+       } else if (pos > last + 1) {
                // This shouldn't happen.
                pos = last + 1;
                cur.pos(pos);