]> git.lyx.org Git - lyx.git/blobdiff - src/Text.cpp
Minor cleanup.
[lyx.git] / src / Text.cpp
index f6f75d90453f631b5c1a459566bf87ea210e9657..3cf1de49043f8fbb213201231caf6f3ded573af6 100644 (file)
@@ -46,7 +46,6 @@
 #include "ParIterator.h"
 #include "TextClass.h"
 #include "TextMetrics.h"
-#include "VSpace.h"
 #include "WordLangTuple.h"
 #include "WordList.h"
 
@@ -356,7 +355,13 @@ void Text::readParToken(Paragraph & par, Lexer & lex,
                // of this document. For example, when you apply class article to a beamer document,
                // all unknown layouts such as frame will be added to document class article so that
                // these layouts can keep their original names.
-               tclass.addLayoutIfNeeded(layoutname);
+               bool const added_one = tclass.addLayoutIfNeeded(layoutname);
+               if (added_one) {
+                       // Warn the user.
+                       docstring const s = bformat(_("Layout `%1$s' was not found."), layoutname);
+                       errorList.push_back(
+                               ErrorItem(_("Layout Not Found"), s, par.id(), 0, par.size()));
+               }
 
                par.setLayout(bp.documentClass()[layoutname]);
 
@@ -599,7 +604,6 @@ static void breakParagraph(Text & text, pit_type par_offset, pos_type pos,
        // end of a paragraph
        tmp->setPlainOrDefaultLayout(bparams.documentClass());
 
-       // layout stays the same with latex-environments
        if (keep_layout) {
                tmp->setLayout(par.layout());
                tmp->setLabelWidthString(par.params().labelWidthString());
@@ -665,7 +669,6 @@ static void breakParagraph(Text & text, pit_type par_offset, pos_type pos,
                par.setPlainOrDefaultLayout(bparams.documentClass());
        }
 
-       // layout stays the same with latex-environments
        if (keep_layout) {
                par.setLayout(tmp->layout());
                par.setLabelWidthString(tmp->params().labelWidthString());
@@ -701,9 +704,10 @@ void Text::breakParagraph(Cursor & cur, bool inverse_logic)
                cpar.eraseChar(cur.pos(), cur.buffer()->params().trackChanges);
 
        // What should the layout for the new paragraph be?
-       bool keep_layout = inverse_logic ? 
-               !layout.isEnvironment() 
-               : layout.isEnvironment();
+       bool keep_layout = layout.isEnvironment() 
+               || (layout.isParagraph() && layout.parbreak_is_newline);
+       if (inverse_logic)
+               keep_layout = !keep_layout;
 
        // We need to remember this before we break the paragraph, because
        // that invalidates the layout variable
@@ -750,12 +754,12 @@ void Text::breakParagraph(Cursor & cur, bool inverse_logic)
 
 
 // needed to insert the selection
-void Text::insertStringAsLines(DocIterator const & dit, docstring const & str,
+void Text::insertStringAsLines(Cursor & cur, docstring const & str,
                Font const & font)
 {
        BufferParams const & bparams = owner_->buffer().params();
-       pit_type pit = dit.pit();
-       pos_type pos = dit.pos();
+       pit_type pit = cur.pit();
+       pos_type pos = cur.pos();
 
        // insert the string, don't insert doublespace
        bool space_inserted = true;
@@ -797,12 +801,13 @@ void Text::insertStringAsLines(DocIterator const & dit, docstring const & str,
                        space_inserted = (*cit == ' ');
                }
        }
+       setCursor(cur, pit, pos);
 }
 
 
 // turn double CR to single CR, others are converted into one
 // blank. Then insertStringAsLines is called
-void Text::insertStringAsParagraphs(DocIterator const & dit, docstring const & str,
+void Text::insertStringAsParagraphs(Cursor & cur, docstring const & str,
                Font const & font)
 {
        docstring linestr = str;
@@ -824,7 +829,7 @@ void Text::insertStringAsParagraphs(DocIterator const & dit, docstring const & s
                        newline_inserted = false;
                }
        }
-       insertStringAsLines(dit, linestr, font);
+       insertStringAsLines(cur, linestr, font);
 }
 
 
@@ -851,7 +856,7 @@ void Text::insertChar(Cursor & cur, char_type c)
                static docstring const number_seperators = from_ascii(".,:");
 
                if (cur.current_font.fontInfo().number() == FONT_ON) {
-                       if (!isDigit(c) && !contains(number_operators, c) &&
+                       if (!isDigitASCII(c) && !contains(number_operators, c) &&
                            !(contains(number_seperators, c) &&
                              cur.pos() != 0 &&
                              cur.pos() != cur.lastpos() &&
@@ -859,7 +864,7 @@ void Text::insertChar(Cursor & cur, char_type c)
                              tm.displayFont(pit, cur.pos() - 1).fontInfo().number() == FONT_ON)
                           )
                                number(cur); // Set current_font.number to OFF
-               } else if (isDigit(c) &&
+               } else if (isDigitASCII(c) &&
                           cur.real_current_font.isVisibleRightToLeft()) {
                        number(cur); // Set current_font.number to ON
 
@@ -1244,7 +1249,11 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op)
 
                pos_type left  = (pit == begPit ? begPos : 0);
                pos_type right = (pit == endPit ? endPos : parSize);
-
+               
+               if (left == right)
+                       // there is no change here
+                       continue;
+               
                if (op == ACCEPT) {
                        pars_[pit].acceptChanges(left, right);
                } else {
@@ -1642,7 +1651,17 @@ bool Text::dissolveInset(Cursor & cur)
        spit += cur.pit();
        Buffer & b = *cur.buffer();
        cur.paragraph().eraseChar(cur.pos(), b.params().trackChanges);
+
        if (!plist.empty()) {
+               // see bug 7319
+               // we clear the cache so that we won't get conflicts with labels
+               // that get pasted into the buffer. we should update this before
+               // its being empty matters. if not (i.e., if we encounter bugs),
+               // then this should instead be:
+               //        cur.buffer().updateBuffer();
+               // but we'll try the cheaper solution here.
+               cur.buffer()->clearReferenceCache();
+
                // ERT paragraphs have the Language latex_language.
                // This is invalid outside of ERT, so we need to
                // change it to the buffer language.
@@ -1656,8 +1675,9 @@ bool Text::dissolveInset(Cursor & cur)
                // restore position
                cur.pit() = min(cur.lastpit(), spit);
                cur.pos() = min(cur.lastpos(), spos);
-       } else
-               cur.forceBufferUpdate();
+       }
+
+       cur.forceBufferUpdate();
 
        // Ensure the current language is set correctly (bug 6292)
        cur.text()->setCursor(cur, cur.pit(), cur.pos());
@@ -1898,8 +1918,6 @@ docstring Text::getPossibleLabel(Cursor const & cur) const
        }
 
        if (!name.empty())
-               // FIXME refstyle
-               // We should allow customization of the separator or else change it
                text = name + ':' + text;
 
        return text;
@@ -1924,6 +1942,15 @@ docstring Text::asString(pit_type beg, pit_type end, int options) const
 }
 
 
+void Text::forToc(docstring & os, size_t maxlen, bool shorten) const
+{
+       LASSERT(maxlen > 10, maxlen = 30);
+       for (size_t i = 0; i != pars_.size() && os.length() < maxlen; ++i)
+               pars_[i].forToc(os, maxlen);
+       if (shorten && os.length() >= maxlen)
+               os = os.substr(0, maxlen - 3) + from_ascii("...");
+}
+
 
 void Text::charsTranspose(Cursor & cur)
 {