diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 1549d3338a..ee6dde8a4c 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -547,12 +547,12 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) cursor.par(), cursor.pos()); int width = bv_->theLockingInset()->width(bv_, font); int inset_x = font.isVisibleRightToLeft() - ? cursor.x() - width : cursor.x(); + ? cursor.ix() - width : cursor.ix(); int start_x = inset_x + bv_->theLockingInset()->scroll(); bv_->theLockingInset()-> insetMotionNotify(bv_, x - start_x, - y - cursor.y() + bv_->text->first_y, + y - cursor.iy() + bv_->text->first_y, state); return; } diff --git a/src/ChangeLog b/src/ChangeLog index 3ae0942835..49d6fb4869 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,7 +1,21 @@ 2002-04-12 Juergen Vigna + * BufferView_pimpl.C (workAreaMotionNotify): use new ix() cursor pos. + + * text2.C (getCursorX): new helper function + (setCursor): compute also ix_ + (setCursorFromCoordinates): set also ix. + + * lyxcursor.h: added ix_ and helper functions. + + * BufferView_pimpl.C (workAreaMotionNotify): forgot to use iy(). + + * buffer.C (insertStringAsLines): dont break paragraph if the this + paragraph is inside an inset which does not permit it! + * text.C (breakParagraph): honor keepempty flag and break the paragraph also with no chars on this paragraph. + (paintRowText): only paint stuff if it's inside the workarea! * paragraph.C (breakParagraph): honor keepempty flag and break the paragraph always below not above. diff --git a/src/buffer.C b/src/buffer.C index 185e4ee4d6..d55a1b3835 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -1400,10 +1400,12 @@ void Buffer::insertStringAsLines(Paragraph *& par, pos_type & pos, par->checkInsertChar(font); // insert the string, don't insert doublespace bool space_inserted = true; + bool autobreakrows = !par->inInset() || + static_cast(par->inInset())->getAutoBreakRows(); for(string::const_iterator cit = str.begin(); cit != str.end(); ++cit) { if (*cit == '\n') { - if (par->size() || layout.keepempty) { + if (autobreakrows && (par->size() || layout.keepempty)) { par->breakParagraph(params, pos, layout.isEnvironment()); par = par->next(); diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index b0d4470e4e..448a456a03 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,3 +1,7 @@ +2002-04-12 Juergen Vigna + + * insettext.h: added cix() helper function and use it where appropriate + 2002-04-12 Jean-Marc Lasgouttes * insetgraphics.C (prepareFile): fix bug when graphics is a @@ -6,6 +10,9 @@ 2002-04-12 Juergen Vigna * insettext.C (insertInset): remove unneeded code! + (updateLocal): fitCursor() fixes. + (collapseParagraphs): fix a possible problem when having a selection + and collapsing the paragraphs. 2002-04-08 Herbert Voss diff --git a/src/insets/insettext.C b/src/insets/insettext.C index b532a4c79c..2919ea6d72 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -424,7 +424,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, if (the_locking_inset && (cpar(bv) == inset_par) && (cpos(bv) == inset_pos)) { - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; } if (!cleared && (need_update == CURSOR) @@ -555,10 +555,10 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit) } if (!autoBreakRows && par->next()) - collapseParagraphs(bv->buffer()->params); + collapseParagraphs(bv); if (the_locking_inset) { - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; the_locking_inset->update(bv, font, reinit); } @@ -610,7 +610,7 @@ void InsetText::setUpdateStatus(BufferView * bv, int what) const void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const { if (!autoBreakRows && par->next()) - collapseParagraphs(bv->buffer()->params); + collapseParagraphs(bv); bool clear = false; if (!lt) { lt = getLyXText(bv); @@ -625,8 +625,15 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const lt->selection.cursor = lt->cursor; if (clear) lt = 0; +#if 0 + // IMO this is not anymore needed as we do this in fitInsetCursor! + // and we always get "true" as returnvalue of this function in the + // case of a locking inset (Jug 20020412) if (locked && (need_update & CURSOR) && bv->fitCursor()) need_update |= FULL; +#else + bv->fitCursor(); +#endif if (flag) bv->updateInset(const_cast(this), mark_dirty); @@ -785,7 +792,7 @@ void InsetText::insetUnlock(BufferView * bv) void InsetText::lockInset(BufferView * bv, UpdatableInset * inset) { the_locking_inset = inset; - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; inset_pos = cpos(bv); inset_par = cpar(bv); @@ -831,7 +838,7 @@ bool InsetText::lockInsetInInset(BufferView * bv, UpdatableInset * inset) } else if (the_locking_inset && (the_locking_inset == inset)) { if (cpar(bv) == inset_par && cpos(bv) == inset_pos) { lyxerr[Debug::INSETS] << "OK" << endl; - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; } else { lyxerr[Debug::INSETS] << "cursor.pos != inset_pos" << endl; @@ -870,7 +877,7 @@ bool InsetText::unlockInsetInInset(BufferView * bv, UpdatableInset * inset, bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset) { if (!autoBreakRows && par->next()) - collapseParagraphs(bv->buffer()->params); + collapseParagraphs(bv); if (inset == this) return true; bool clear = false; @@ -909,7 +916,7 @@ bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset) if (the_locking_inset && cpar(bv) == inset_par && cpos(bv) == inset_pos) { - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; } } @@ -942,7 +949,7 @@ void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button) else if (inset) { // otherwise unlock the_locking_inset and lock the new inset the_locking_inset->insetUnlock(bv); - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; the_locking_inset = 0; inset->insetButtonPress(bv, x - inset_x, @@ -1043,7 +1050,7 @@ bool InsetText::insetButtonRelease(BufferView * bv, int x, int y, int button) ret = inset->insetButtonRelease(bv, x - inset_x, y - inset_y, button); } else { - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; ret = inset->insetButtonRelease(bv, x - inset_x, y - inset_y, button); @@ -2009,7 +2016,7 @@ bool InsetText::checkAndActivateInset(BufferView * bv, int x, int y, x = insetWidth; if (y < 0) y = insetDescent; - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; inset->edit(bv, x - inset_x, y - inset_y, button); if (!the_locking_inset) @@ -2120,6 +2127,21 @@ int InsetText::cx(BufferView * bv) const } +int InsetText::cix(BufferView * bv) const +{ + // we do nothing dangerous so we use a local cache + LyXText * llt = getLyXText(bv); + int x = llt->cursor.ix() + top_x + TEXT_TO_INSET_OFFSET; + if (the_locking_inset) { + LyXFont font = llt->getFont(bv->buffer(), llt->cursor.par(), + llt->cursor.pos()); + if (font.isVisibleRightToLeft()) + x -= the_locking_inset->width(bv, font); + } + return x; +} + + int InsetText::cy(BufferView * bv) const { LyXFont font; @@ -2282,7 +2304,7 @@ void InsetText::resizeLyXText(BufferView * bv, bool force) const t->init(bv, true); restoreLyXTextState(bv, t); if (the_locking_inset) { - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; } @@ -2323,7 +2345,7 @@ void InsetText::reinitLyXText() const t->init(bv, true); restoreLyXTextState(bv, t); if (the_locking_inset) { - inset_x = cx(bv) - top_x + drawTextXOffset; + inset_x = cix(bv) - top_x + drawTextXOffset; inset_y = ciy(bv) + drawTextYOffset; } if (bv->screen()) { @@ -2656,14 +2678,29 @@ bool InsetText::checkInsertChar(LyXFont & font) } -void InsetText::collapseParagraphs(BufferParams const & bparams) const +void InsetText::collapseParagraphs(BufferView * bv) const { + BufferParams const & bparams = bv->buffer()->params; + LyXText * llt = getLyXText(bv); + while(par->next()) { if (par->size() && par->next()->size() && !par->isSeparator(par->size()-1)) { par->insertChar(par->size(), ' '); } + if (llt->selection.set()) { + if (llt->selection.start.par() == par->next()) { + llt->selection.start.par(par); + llt->selection.start.pos( + llt->selection.start.pos() + par->size()); + } + if (llt->selection.end.par() == par->next()) { + llt->selection.end.par(par); + llt->selection.end.pos( + llt->selection.end.pos() + par->size()); + } + } par->pasteParagraph(bparams); } reinitLyXText(); diff --git a/src/insets/insettext.h b/src/insets/insettext.h index 69f712dbe8..20fcfbdaec 100644 --- a/src/insets/insettext.h +++ b/src/insets/insettext.h @@ -321,6 +321,8 @@ private: /// int cx(BufferView *) const; /// + int cix(BufferView *) const; + /// int cy(BufferView *) const; /// int ciy(BufferView *) const; @@ -345,7 +347,7 @@ private: /// void reinitLyXText() const; /// - void collapseParagraphs(BufferParams const & bparams) const; + void collapseParagraphs(BufferView *) const; /* Private structures and variables */ /// diff --git a/src/lyxcursor.C b/src/lyxcursor.C index 4e02327fbc..47489a0fdd 100644 --- a/src/lyxcursor.C +++ b/src/lyxcursor.C @@ -19,7 +19,7 @@ LyXCursor::LyXCursor() : par_(0), pos_(0), boundary_(false), - x_(0), x_fix_(0), y_(0), iy_(0), row_(0) + x_(0), ix_(0), x_fix_(0), y_(0), iy_(0), row_(0) {} @@ -70,6 +70,17 @@ int LyXCursor::x() const } +void LyXCursor::ix(int n) +{ + ix_ = n; +} + +int LyXCursor::ix() const +{ + return ix_; +} + + void LyXCursor::x_fix(int i) { x_fix_ = i; diff --git a/src/lyxcursor.h b/src/lyxcursor.h index 9c37d0dff9..fe3cc2842c 100644 --- a/src/lyxcursor.h +++ b/src/lyxcursor.h @@ -44,6 +44,10 @@ public: /// int x() const; /// + void ix(int i); + /// + int ix() const; + /// void x_fix(int i); /// int x_fix() const; @@ -68,6 +72,9 @@ private: bool boundary_; /// int x_; + /// the x position of the position before the inset when we put + /// the cursor on the end of the row before, otherwise equal to x. + int ix_; /// int x_fix_; /// diff --git a/src/lyxtext.h b/src/lyxtext.h index 646f736ffa..a595e2f785 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -321,6 +321,9 @@ public: bool setfont = true, bool boundary = false) const; /// + float getCursorX(BufferView *, Row *, lyx::pos_type pos, + lyx::pos_type last, bool boundary) const; + /// void setCurrentFont(BufferView *) const; /// diff --git a/src/text.C b/src/text.C index b53d26db66..217398f890 100644 --- a/src/text.C +++ b/src/text.C @@ -3609,7 +3609,14 @@ void LyXText::paintRowText(DrawRowParams & p) pos_type vpos = p.row->pos(); while (vpos <= last) { + if (p.x > p.bv->workWidth()) + break; pos_type pos = vis2log(vpos); + if (p.x + singleWidth(p.bv, par, pos) < 0) { + p.x += singleWidth(p.bv, par, pos); + ++vpos; + continue; + } if (main_body > 0 && pos == main_body - 1) { int const lwidth = lyxfont::width(layout.labelsep, getLabelFont(buffer, par)); diff --git a/src/text2.C b/src/text2.C index bab91e6928..089965c997 100644 --- a/src/text2.C +++ b/src/text2.C @@ -2083,14 +2083,6 @@ void LyXText::setCursor(BufferView * bview, LyXCursor & cur, Paragraph * par, // y is now the cursor baseline cur.y(y); - // now get the cursors x position - float x; - float fill_separator; - float fill_hfill; - float fill_label_hfill; - prepareToPrint(bview, row, x, fill_separator, fill_hfill, - fill_label_hfill); - pos_type cursor_vpos = 0; pos_type last = rowLastPrintable(old_row); if (pos > last + 1) { @@ -2102,6 +2094,30 @@ void LyXText::setCursor(BufferView * bview, LyXCursor & cur, Paragraph * par, cur.pos(pos); } + // now get the cursors x position + float x = getCursorX(bview, row, pos, last, boundary); + cur.x(int(x)); + cur.x_fix(cur.x()); + if (old_row != row) { + x = getCursorX(bview, old_row, pos, last, boundary); + cur.ix(int(x)); + } else + cur.ix(cur.x()); +} + + +float LyXText::getCursorX(BufferView * bview, Row * row, + pos_type pos, pos_type last, bool boundary) const +{ + pos_type cursor_vpos = 0; + float x; + float fill_separator; + float fill_hfill; + float fill_label_hfill; + // This call HAS to be here because of the BidiTables!!! + prepareToPrint(bview, row, x, fill_separator, fill_hfill, + fill_label_hfill); + if (last < row->pos()) cursor_vpos = row->pos(); else if (pos > last && !boundary) @@ -2125,7 +2141,7 @@ void LyXText::setCursor(BufferView * bview, LyXCursor & cur, Paragraph * par, main_body = 0; for (pos_type vpos = row->pos(); vpos < cursor_vpos; ++vpos) { - pos = vis2log(vpos); + pos_type pos = vis2log(vpos); if (main_body > 0 && pos == main_body - 1) { x += fill_label_hfill + lyxfont::width(textclasslist[ @@ -2149,9 +2165,7 @@ void LyXText::setCursor(BufferView * bview, LyXCursor & cur, Paragraph * par, } else x += singleWidth(bview, row->par(), pos); } - - cur.x(int(x)); - cur.x_fix(cur.x()); + return x; } @@ -2248,6 +2262,7 @@ void LyXText::setCursorFromCoordinates(BufferView * bview, LyXCursor & cur, cur.par(row->par()); cur.pos(row->pos() + column); cur.x(x); + cur.ix(x); cur.y(y + row->baseline()); Inset * ins; if (row->next() && cur.pos() &&