]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
"Inter-word Space"
[lyx.git] / src / text.C
index 228f46c4f49d5a1e5afd13a6132f919c6ad660d2..bc95c353bd216582c69705fcd84df1fce687e817 100644 (file)
@@ -87,16 +87,24 @@ void LyXText::updateRowPositions()
 
 int LyXText::top_y() const
 {
-       if (isInInset() || anchor_row_ == rowlist_.end() )
+       if (anchor_row_ == rowlist_.end())
                return 0;
+
        return anchor_row_->y() + anchor_row_offset_;
 }
 
 
 void LyXText::top_y(int newy)
 {
-       if (rows().empty() || isInInset())
+       if (rows().empty())
                return;
+
+       if (isInInset()) {
+               anchor_row_ = rows().begin();
+               anchor_row_offset_ = newy;
+               return;
+       }
+
        lyxerr[Debug::GUI] << "setting top y = " << newy << endl;
 
        int y = newy;
@@ -137,10 +145,12 @@ int LyXText::workWidth() const
 }
 
 
-int LyXText::workWidth(Inset * inset) const
+int LyXText::workWidth(Inset const * inset) const
 {
-       Paragraph * par = inset->parOwner();
-       lyx::Assert(par);
+       ParagraphList::iterator par = std::find(ownerParagraphs().begin(),
+                                               ownerParagraphs().end(),
+                                               *inset->parOwner());
+       //lyx::Assert(par);
 
        pos_type pos = par->getPositionOfInset(inset);
        lyx::Assert(pos != -1);
@@ -538,29 +548,33 @@ int LyXText::leftMargin(Row const & row) const
                if (row.par()->layout() == tclass.defaultLayout()) {
                        // find the previous same level paragraph
                        if (row.par() != ownerParagraphs().begin()) {
-                               Paragraph * newpar =
-                                       depthHook(&*row.par(), row.par()->getDepth());
-                               if (newpar &&
-                                   newpar->layout()->nextnoindent)
+                               ParagraphList::iterator newpit =
+                                       depthHook(row.par(), ownerParagraphs(),
+                                                 row.par()->getDepth());
+                               if (newpit == row.par() &&
+                                   newpit->layout()->nextnoindent)
                                        parindent.erase();
                        }
                }
        } else {
                // find the next level paragraph
 
-               Paragraph * newpar = outerHook(&*row.par());
+               ParagraphList::iterator newpar = outerHook(row.par(),
+                                                          ownerParagraphs());
 
                // make a corresponding row. Needed to call leftMargin()
 
                // check wether it is a sufficent paragraph
-               if (newpar && newpar->layout()->isEnvironment()) {
+               if (newpar != ownerParagraphs().end() &&
+                   newpar->layout()->isEnvironment()) {
                        Row dummyrow;
                        dummyrow.par(newpar);
                        dummyrow.pos(newpar->size());
                        x = leftMargin(dummyrow);
                }
 
-               if (newpar && row.par()->layout() == tclass.defaultLayout()) {
+               if (newpar != ownerParagraphs().end() &&
+                   row.par()->layout() == tclass.defaultLayout()) {
                        if (newpar->params().noindent())
                                parindent.erase();
                        else {
@@ -614,7 +628,7 @@ int LyXText::leftMargin(Row const & row) const
                           // theorems (JMarc)
                           || (layout->labeltype == LABEL_STATIC
                               && layout->latextype == LATEX_ENVIRONMENT
-                              && !isFirstInSequence(&*row.par()))) {
+                              && !isFirstInSequence(row.par(), ownerParagraphs()))) {
                        x += font_metrics::signedWidth(layout->leftmargin,
                                                  labelfont);
                } else if (layout->labeltype != LABEL_TOP_ENVIRONMENT
@@ -679,7 +693,7 @@ int LyXText::leftMargin(Row const & row) const
                     || layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT
                     || (layout->labeltype == LABEL_STATIC
                         && layout->latextype == LATEX_ENVIRONMENT
-                        && !isFirstInSequence(&*row.par())))
+                        && !isFirstInSequence(row.par(), ownerParagraphs())))
                    && align == LYX_ALIGN_BLOCK
                    && !row.par()->params().noindent()
                        // in tabulars and ert paragraphs are never indented!
@@ -1153,7 +1167,7 @@ void LyXText::setHeightOfRow(RowList::iterator rit)
                if ((layout->labeltype == LABEL_TOP_ENVIRONMENT
                     || layout->labeltype == LABEL_BIBLIO
                     || layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
-                   && isFirstInSequence(&*pit)
+                   && isFirstInSequence(pit, ownerParagraphs())
                    && !pit->getLabelstring().empty())
                {
                        float spacing_val = 1.0;
@@ -1174,14 +1188,15 @@ void LyXText::setHeightOfRow(RowList::iterator rit)
                                + layout->labelbottomsep * defaultRowHeight());
                }
 
-               // and now the layout spaces, for example before and after a section,
-               // or between the items of a itemize or enumerate environment
+               // And now the layout spaces, for example before and after
+               // a section, or between the items of a itemize or enumerate
+               // environment.
 
                if (!pit->params().pagebreakTop()) {
-                       Paragraph * prev = pit->previous();
-                       if (prev)
-                               prev = depthHook(&*pit, pit->getDepth());
-                       if (prev && prev->layout() == layout &&
+                       ParagraphList::iterator prev =
+                               depthHook(pit, ownerParagraphs(),
+                                         pit->getDepth());
+                       if (prev != pit && prev->layout() == layout &&
                                prev->getDepth() == pit->getDepth() &&
                                prev->getLabelWidthString() == pit->getLabelWidthString())
                        {
@@ -1201,8 +1216,8 @@ void LyXText::setHeightOfRow(RowList::iterator rit)
                                        layoutasc = (tmptop * defaultRowHeight());
                        }
 
-                       prev = outerHook(&*pit);
-                       if (prev)  {
+                       prev = outerHook(pit, ownerParagraphs());
+                       if (prev != ownerParagraphs().end())  {
                                maxasc += int(prev->layout()->parsep * defaultRowHeight());
                        } else if (pit != ownerParagraphs().begin()) {
                                ParagraphList::iterator prior_pit = boost::prior(pit);
@@ -1250,7 +1265,7 @@ void LyXText::setHeightOfRow(RowList::iterator rit)
 
                        if (comparepit->getDepth() > nextpit->getDepth()) {
                                usual = (comparepit->layout()->bottomsep * defaultRowHeight());
-                               comparepit = depthHook(&*comparepit, nextpit->getDepth());
+                               comparepit = depthHook(comparepit, ownerParagraphs(), nextpit->getDepth());
                                if (comparepit->layout()!= nextpit->layout()
                                        || nextpit->getLabelWidthString() !=
                                        comparepit->getLabelWidthString())
@@ -1452,7 +1467,7 @@ void LyXText::breakParagraph(ParagraphList & paragraphs, char keep_layout)
           && !layout->keepempty)
                return;
 
-       setUndo(bv(), Undo::FINISH, &*cursor.par(), &*boost::next(cursor.par()));
+       setUndo(bv(), Undo::FINISH, cursor.par());
 
        // Always break behind a space
        //
@@ -1557,7 +1572,7 @@ void LyXText::redoParagraph()
 // same Paragraph one to the right and make a rebreak
 void LyXText::insertChar(char c)
 {
-       setUndo(bv(), Undo::INSERT, &*cursor.par(), &*boost::next(cursor.par()));
+       setUndo(bv(), Undo::INSERT, cursor.par());
 
        // When the free-spacing option is set for the current layout,
        // disable the double-space checking
@@ -2104,12 +2119,10 @@ void LyXText::acceptChange()
        if (!selection.set() && cursor.par()->size())
                return;
 
-       bv()->hideCursor();
-
        if (selection.start.par() == selection.end.par()) {
                LyXCursor & startc = selection.start;
                LyXCursor & endc = selection.end;
-               setUndo(bv(), Undo::INSERT, &*startc.par(), &*boost::next(startc.par()));
+               setUndo(bv(), Undo::INSERT, startc.par());
                startc.par()->acceptChange(startc.pos(), endc.pos());
                finishUndo();
                clearSelection();
@@ -2125,13 +2138,10 @@ void LyXText::rejectChange()
        if (!selection.set() && cursor.par()->size())
                return;
 
-       bv()->hideCursor();
-
        if (selection.start.par() == selection.end.par()) {
                LyXCursor & startc = selection.start;
                LyXCursor & endc = selection.end;
-               setUndo(bv(), Undo::INSERT, &*startc.par(),
-                       &*boost::next(startc.par()));
+               setUndo(bv(), Undo::INSERT, startc.par());
                startc.par()->rejectChange(startc.pos(), endc.pos());
                finishUndo();
                clearSelection();
@@ -2202,7 +2212,8 @@ LyXText::selectNextWordToSpellcheck(float & value)
        if (cursor.pos() < cursor.par()->size() &&
            cursor.par()->isInset(cursor.pos())) {
                // lock the inset!
-               cursor.par()->getInset(cursor.pos())->edit(bv());
+               FuncRequest cmd(bv(), LFUN_INSET_EDIT, "left");
+               cursor.par()->getInset(cursor.pos())->localDispatch(cmd);
                // now call us again to do the above trick
                // but obviously we have to start from down below ;)
                return bv()->text->selectNextWordToSpellcheck(value);
@@ -2347,7 +2358,7 @@ void LyXText::changeCase(LyXText::TextCase action)
 
        lyx::Assert(from <= to);
 
-       setUndo(bv(), Undo::FINISH, &*from.par(), &*boost::next(to.par()));
+       setUndo(bv(), Undo::FINISH, from.par(), to.par());
 
        pos_type pos = from.pos();
        ParagraphList::iterator pit = from.par();
@@ -2417,8 +2428,7 @@ void LyXText::Delete()
                LyXCursor tmpcursor = cursor;
                // to make sure undo gets the right cursor position
                cursor = old_cursor;
-               setUndo(bv(), Undo::DELETE,
-                       &*cursor.par(), &*boost::next(cursor.par()));
+               setUndo(bv(), Undo::DELETE, cursor.par());
                cursor = tmpcursor;
                backspace();
        }
@@ -2476,8 +2486,8 @@ void LyXText::backspace()
 
                if (cursor.par() != ownerParagraphs().begin()) {
                        setUndo(bv(), Undo::DELETE,
-                               &*boost::prior(cursor.par()),
-                               &*boost::next(cursor.par()));
+                               boost::prior(cursor.par()),
+                               cursor.par());
                }
 
                ParagraphList::iterator tmppit = cursor.par();
@@ -2543,8 +2553,7 @@ void LyXText::backspace()
        } else {
                // this is the code for a normal backspace, not pasting
                // any paragraphs
-               setUndo(bv(), Undo::DELETE,
-                       &*cursor.par(), &*boost::next(cursor.par()));
+               setUndo(bv(), Undo::DELETE, cursor.par());
                // We used to do cursorLeftIntern() here, but it is
                // not a good idea since it triggers the auto-delete
                // mechanism. So we do a cursorLeftIntern()-lite,