]> git.lyx.org Git - lyx.git/blobdiff - src/Text2.cpp
Cleanup: Replace a bunch of Cursor arguments with DocIterators.
[lyx.git] / src / Text2.cpp
index af49b982dfd63cea12c53f754654beb7dd419259..5eedf4f3078bcf079c0844e8ec7924c8f8596f01 100644 (file)
@@ -63,19 +63,14 @@ using namespace std;
 
 namespace lyx {
 
-Text::Text()
-       : autoBreakRows_(false)
-{}
-
-
-bool Text::isMainText(Buffer const & buffer) const
+bool Text::isMainText() const
 {
-       return &buffer.text() == this;
+       return &owner_->buffer().text() == this;
 }
 
 
 // Note that this is supposed to return a fully realized font.
-FontInfo Text::layoutFont(Buffer const & buffer, pit_type const pit) const
+FontInfo Text::layoutFont(pit_type const pit) const
 {
        Layout const & layout = pars_[pit].layout();
 
@@ -83,7 +78,7 @@ FontInfo Text::layoutFont(Buffer const & buffer, pit_type const pit) const
                FontInfo lf = layout.resfont;
                // In case the default family has been customized
                if (layout.font.family() == INHERIT_FAMILY)
-                       lf.setFamily(buffer.params().getFont().fontInfo().family());
+                       lf.setFamily(owner_->buffer().params().getFont().fontInfo().family());
                // FIXME
                // It ought to be possible here just to use Inset::getLayout() and skip
                // the asInsetCollapsable() bit. Unfortunatley, that doesn't work right
@@ -101,15 +96,16 @@ FontInfo Text::layoutFont(Buffer const & buffer, pit_type const pit) const
        FontInfo font = layout.font;
        // Realize with the fonts of lesser depth.
        //font.realize(outerFont(pit, paragraphs()));
-       font.realize(buffer.params().getFont().fontInfo());
+       font.realize(owner_->buffer().params().getFont().fontInfo());
 
        return font;
 }
 
 
 // Note that this is supposed to return a fully realized font.
-FontInfo Text::labelFont(Buffer const & buffer, Paragraph const & par) const
+FontInfo Text::labelFont(Paragraph const & par) const
 {
+       Buffer const & buffer = owner_->buffer();
        Layout const & layout = par.layout();
 
        if (!par.getDepth()) {
@@ -128,9 +124,10 @@ FontInfo Text::labelFont(Buffer const & buffer, Paragraph const & par) const
 }
 
 
-void Text::setCharFont(Buffer const & buffer, pit_type pit,
+void Text::setCharFont(pit_type pit,
                pos_type pos, Font const & fnt, Font const & display_font)
 {
+       Buffer const & buffer = owner_->buffer();
        Font font = fnt;
        Layout const & layout = pars_[pit].layout();
 
@@ -156,7 +153,7 @@ void Text::setCharFont(Buffer const & buffer, pit_type pit,
 
        // Inside inset, apply the inset's font attributes if any
        // (charstyle!)
-       if (!isMainText(buffer))
+       if (!isMainText())
                layoutfont.realize(display_font.fontInfo());
 
        layoutfont.realize(buffer.params().getFont().fontInfo());
@@ -207,11 +204,12 @@ pit_type Text::undoSpan(pit_type pit)
 }
 
 
-void Text::setLayout(Buffer const & buffer, pit_type start, pit_type end,
+void Text::setLayout(pit_type start, pit_type end,
                     docstring const & layout)
 {
        LASSERT(start != end, /**/);
 
+       Buffer const & buffer = owner_->buffer();
        BufferParams const & bp = buffer.params();
        Layout const & lyxlayout = bp.documentClass()[layout];
 
@@ -233,7 +231,7 @@ void Text::setLayout(Cursor & cur, docstring const & layout)
        pit_type end = cur.selEnd().pit() + 1;
        pit_type undopit = undoSpan(end - 1);
        recUndo(cur, start, undopit - 1);
-       setLayout(*cur.buffer(), start, end, layout);
+       setLayout(start, end, layout);
        cur.buffer()->updateLabels();
 }
 
@@ -305,9 +303,9 @@ void Text::setFont(Cursor & cur, Font const & font, bool toggleall)
        FontInfo layoutfont;
        pit_type pit = cur.pit();
        if (cur.pos() < pars_[pit].beginOfBody())
-               layoutfont = labelFont(*cur.buffer(), pars_[pit]);
+               layoutfont = labelFont(pars_[pit]);
        else
-               layoutfont = layoutFont(*cur.buffer(), pit);
+               layoutfont = layoutFont(pit);
 
        // Update current font
        cur.real_current_font.update(font,
@@ -359,7 +357,7 @@ void Text::setFont(BufferView const & bv, CursorSlice const & begin,
                TextMetrics const & tm = bv.textMetrics(this);
                Font f = tm.displayFont(pit, pos);
                f.update(font, language, toggleall);
-               setCharFont(buffer, pit, pos, f, tm.font_);
+               setCharFont(pit, pos, f, tm.font_);
        }
 }
 
@@ -443,16 +441,23 @@ void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
 
        //FIXME UNICODE
        string const argument = to_utf8(arg);
+       depth_type priordepth = -1;
+       Layout priorlayout;
        for (pit_type pit = cur.selBegin().pit(), end = cur.selEnd().pit();
             pit <= end; ++pit) {
                Paragraph & par = pars_[pit];
                ParagraphParameters params = par.params();
                params.read(argument, merge);
-               // changes to label width string apply to all
-               // paragraph with same layout in a sequence
-               setLabelWidthStringToSequence(pit, pars_,
-                               params.labelWidthString());
+               // Changes to label width string apply to all paragraphs
+               // with same layout in a sequence.
+               // Do this only once for a selected range of paragraphs
+               // of the same layout and depth.
+               if (par.getDepth() != priordepth || par.layout() != priorlayout)
+                       setLabelWidthStringToSequence(pit, pars_,
+                                       params.labelWidthString());
                par.params().apply(params, par.layout());
+               priordepth = par.getDepth();
+               priorlayout = par.layout();
        }
 }
 
@@ -467,15 +472,22 @@ void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p)
        pit_type undopit = undoSpan(cur.selEnd().pit());
        recUndo(cur, cur.selBegin().pit(), undopit - 1);
 
+       depth_type priordepth = -1;
+       Layout priorlayout;
        for (pit_type pit = cur.selBegin().pit(), end = cur.selEnd().pit();
             pit <= end; ++pit) {
                Paragraph & par = pars_[pit];
-               // changes to label width string apply to all
-               // paragraph with same layout in a sequence
-               setLabelWidthStringToSequence(pit, pars_,
-                               par.params().labelWidthString());
+               // Changes to label width string apply to all paragraphs
+               // with same layout in a sequence.
+               // Do this only once for a selected range of paragraphs
+               // of the same layout and depth.
+               if (par.getDepth() != priordepth || par.layout() != priorlayout)
+                       setLabelWidthStringToSequence(pit, pars_,
+                                       par.params().labelWidthString());
                par.params().apply(p, par.layout());
-       }       
+               priordepth = par.getDepth();
+               priorlayout = par.layout();
+       }
 }
 
 
@@ -491,16 +503,60 @@ void Text::insertInset(Cursor & cur, Inset * inset)
 
 
 // needed to insert the selection
-void Text::insertStringAsLines(Cursor & cur, docstring const & str)
+void Text::insertStringAsLines(DocIterator const & dit, docstring const & str,
+               Font const & font)
 {
-       cur.buffer()->insertStringAsLines(pars_, cur.pit(), cur.pos(),
-               cur.current_font, str, autoBreakRows_);
+       BufferParams const & bparams = owner_->buffer().params();
+       pit_type pit = dit.pit();
+       pos_type pos = dit.pos();
+
+       // insert the string, don't insert doublespace
+       bool space_inserted = true;
+       for (docstring::const_iterator cit = str.begin();
+           cit != str.end(); ++cit) {
+               Paragraph & par = pars_[pit];
+               if (*cit == '\n') {
+                       if (autoBreakRows_ && (!par.empty() || par.allowEmpty())) {
+                               lyx::breakParagraph(bparams, pars_, pit, pos,
+                                              par.layout().isEnvironment());
+                               ++pit;
+                               pos = 0;
+                               space_inserted = true;
+                       } else {
+                               continue;
+                       }
+                       // do not insert consecutive spaces if !free_spacing
+               } else if ((*cit == ' ' || *cit == '\t') &&
+                          space_inserted && !par.isFreeSpacing()) {
+                       continue;
+               } else if (*cit == '\t') {
+                       if (!par.isFreeSpacing()) {
+                               // tabs are like spaces here
+                               par.insertChar(pos, ' ', font, bparams.trackChanges);
+                               ++pos;
+                               space_inserted = true;
+                       } else {
+                               par.insertChar(pos, *cit, font, bparams.trackChanges);
+                               ++pos;
+                               space_inserted = true;
+                       }
+               } else if (!isPrintable(*cit)) {
+                       // Ignore unprintables
+                       continue;
+               } else {
+                       // just insert the character
+                       par.insertChar(pos, *cit, font, bparams.trackChanges);
+                       ++pos;
+                       space_inserted = (*cit == ' ');
+               }
+       }
 }
 
 
 // turn double CR to single CR, others are converted into one
 // blank. Then insertStringAsLines is called
-void Text::insertStringAsParagraphs(Cursor & cur, docstring const & str)
+void Text::insertStringAsParagraphs(DocIterator const & dit, docstring const & str,
+               Font const & font)
 {
        docstring linestr = str;
        bool newline_inserted = false;
@@ -521,7 +577,7 @@ void Text::insertStringAsParagraphs(Cursor & cur, docstring const & str)
                        newline_inserted = false;
                }
        }
-       insertStringAsLines(cur, linestr);
+       insertStringAsLines(dit, linestr, font);
 }