From 485313c6d77eaddfdbc1a44f7e7e019927733d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20P=C3=B6nitz?= Date: Thu, 10 Jul 2003 08:00:41 +0000 Subject: [PATCH] The insettext patch. This has been out in the wild now for two weeks.... git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7252 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferView_pimpl.C | 9 +- src/ChangeLog | 9 + src/insets/ChangeLog | 6 + src/insets/insettabular.C | 11 +- src/insets/insettext.C | 564 ++++++++++++-------------------------- src/insets/insettext.h | 37 +-- src/lyxtext.h | 2 + src/tabular.h | 6 +- src/text.C | 5 +- src/text2.C | 1 + 10 files changed, 218 insertions(+), 432 deletions(-) diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 4b751ef2ff..a3cc67c144 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -382,16 +382,14 @@ int BufferView::Pimpl::resizeCurrentBuffer() mark_set = bv_->text->selection.mark(); the_locking_inset = bv_->theLockingInset(); buffer_->resizeInsets(bv_); - // I don't think the delete and new are necessary here we - // just could call only init! (Jug 20020419) - delete bv_->text; - bv_->text = new LyXText(bv_); bv_->text->init(bv_); } else { + lyxerr << "text not available!\n"; // See if we have a text in TextCache that fits // the new buffer_ with the correct width. bv_->text = textcache.findFit(buffer_, workarea().workWidth()); if (bv_->text) { + lyxerr << "text in cache!\n"; if (lyxerr.debugging()) { lyxerr << "Found a LyXText that fits:\n"; textcache.show(lyxerr, make_pair(buffer_, make_pair(workarea().workWidth(), bv_->text))); @@ -403,9 +401,10 @@ int BufferView::Pimpl::resizeCurrentBuffer() buffer_->resizeInsets(bv_); } else { + lyxerr << "no text in cache!\n"; bv_->text = new LyXText(bv_); + buffer_->resizeInsets(bv_); bv_->text->init(bv_); - //buffer_->resizeInsets(bv_); } par = bv_->text->ownerParagraphs().end(); diff --git a/src/ChangeLog b/src/ChangeLog index 050cd75e76..a0c987ff3d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ + +2003-07-10 André Pönitz + + * BufferView_pimpl.C: + * tabular.h: + * tabular_funcs.C: + * text.C: + * text2.C: remove InsetText::InnerCache, clean up consequences + 2003-07-07 Adrien Rebollo * ispell.C: fix two typos in error messages diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index bd932cb58a..fc040161dd 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,3 +1,9 @@ + +2003-07-10 André Pönitz + + * insettabular.C: + * insettext.[Ch]: remove InsetText::InnerCache, clean up consequences + 2003-07-04 Lars Gullik Bjřnnes * introduce namespace lyx::graphics diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 4d07fb85c8..a174f7dd61 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -249,9 +249,16 @@ void InsetTabular::read(Buffer const * buf, LyXLex & lex) } -void InsetTabular::metrics(MetricsInfo &, - Dimension & dim) const +void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const { + if (mi.base.bv) { + //lyxerr << "InsetTabular::metrics, bv: " << mi.base.bv << endl; + for (int i = 0; i < tabular.getNumberOfCells(); ++i) { + tabular.cellinfo_of_cell(i)->inset.text_.bv_owner = mi.base.bv; + tabular.cellinfo_of_cell(i)->inset.reinitLyXText(); + } + } + dim.asc = tabular.getAscentOfRow(0); dim.des = tabular.getHeightOfTabular() - tabular.getAscentOfRow(0) + 1; dim.wid = tabular.getWidthOfTabular() + 2 * ADD_TO_TABULAR_WIDTH; diff --git a/src/insets/insettext.C b/src/insets/insettext.C index 295b97f074..ddd9fb4598 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -123,16 +123,8 @@ void InsetText::restoreLyXTextState(LyXText * t) const } -InsetText::InnerCache::InnerCache(boost::shared_ptr t) -{ - text = t; - remove = false; -} - - InsetText::InsetText(BufferParams const & bp) - : UpdatableInset(), lt(0), in_update(false), do_resize(0), - do_reinit(false) + : UpdatableInset(), in_update(false), text_(0, this) { paragraphs.push_back(Paragraph()); paragraphs.begin()->layout(bp.getLyXTextClass().defaultLayout()); @@ -143,8 +135,7 @@ InsetText::InsetText(BufferParams const & bp) InsetText::InsetText(InsetText const & in) - : UpdatableInset(in), lt(0), in_update(false), do_resize(0), - do_reinit(false) + : UpdatableInset(in), in_update(false), text_(0, this) { init(&in); } @@ -153,26 +144,26 @@ InsetText::InsetText(InsetText const & in) InsetText & InsetText::operator=(InsetText const & it) { init(&it); - return * this; + return *this; } void InsetText::init(InsetText const * ins) { if (ins) { + text_.bv_owner = ins->text_.bv_owner; setParagraphData(ins->paragraphs); autoBreakRows = ins->autoBreakRows; drawFrame_ = ins->drawFrame_; frame_color = ins->frame_color; } else { - for_each(paragraphs.begin(), paragraphs.end(), - boost::bind(&Paragraph::setInsetOwner, _1, this)); - - the_locking_inset = 0; drawFrame_ = NEVER; frame_color = LColor::insetframe; autoBreakRows = false; } + the_locking_inset = 0; + for_each(paragraphs.begin(), paragraphs.end(), + boost::bind(&Paragraph::setInsetOwner, _1, this)); top_y = 0; old_max_width = 0; no_selection = true; @@ -182,7 +173,6 @@ void InsetText::init(InsetText const * ins) locked = false; old_par = paragraphs.end(); last_drawn_width = -1; - cached_bview = 0; sstate.cursor.par(paragraphs.end()); in_insetAllowed = false; } @@ -352,15 +342,10 @@ void InsetText::draw(PainterInfo & pi, int x, int baseline) const inset_y = ciy(bv) + drawTextYOffset; } - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } x += TEXT_TO_INSET_OFFSET; - RowList::iterator rowit = lt->rows().begin(); - RowList::iterator end = lt->rows().end(); + RowList::iterator rowit = text_.rows().begin(); + RowList::iterator end = text_.rows().end(); int y_offset = baseline - rowit->ascent_of_text(); int ph = pain.paperHeight(); @@ -372,11 +357,11 @@ void InsetText::draw(PainterInfo & pi, int x, int baseline) const ++rowit; } if (y_offset < 0) { - lt->top_y(-y_offset); + text_.top_y(-y_offset); first = y; y_offset = 0; } else { - lt->top_y(first); + text_.top_y(first); first = 0; } @@ -386,14 +371,14 @@ void InsetText::draw(PainterInfo & pi, int x, int baseline) const bv->hideCursor(); while ((rowit != end) && (yf < ph)) { - RowPainter rp(*bv, *lt, rowit); - rp.paint(y + y_offset + first, int(x), y + lt->top_y()); + RowPainter rp(*bv, text_, rowit); + rp.paint(y + y_offset + first, int(x), y + text_.top_y()); y += rowit->height(); yf += rowit->height(); ++rowit; } - lt->clearPaint(); + text_.clearPaint(); if ((drawFrame_ == ALWAYS) || (drawFrame_ == LOCKED && locked)) { drawFrame(pain, int(start_x)); @@ -404,8 +389,6 @@ void InsetText::draw(PainterInfo & pi, int x, int baseline) const if (need_update != INIT) { need_update = NONE; } - if (clear) - lt = 0; } @@ -423,6 +406,9 @@ void InsetText::drawFrame(Painter & pain, int x) const void InsetText::update(BufferView * bv, bool reinit) { + if (bv) + text_.bv_owner = const_cast(bv); + if (in_update) { if (reinit && owner()) { reinitLyXText(); @@ -457,20 +443,13 @@ void InsetText::update(BufferView * bv, bool reinit) the_locking_inset->update(bv, reinit); } - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } - if ((need_update & CURSOR_PAR) && (lt->refreshStatus() == LyXText::REFRESH_NONE) && + if ((need_update & CURSOR_PAR) && (text_.refreshStatus() == LyXText::REFRESH_NONE) && the_locking_inset) { - lt->updateInset(the_locking_inset); + text_.updateInset(the_locking_inset); } - if (lt->refreshStatus() == LyXText::REFRESH_AREA) + if (text_.refreshStatus() == LyXText::REFRESH_AREA) need_update |= FULL; - if (clear) - lt = 0; in_update = false; @@ -482,28 +461,25 @@ void InsetText::update(BufferView * bv, bool reinit) } -void InsetText::setUpdateStatus(BufferView * bv, int what) const +void InsetText::setUpdateStatus(BufferView *, int what) const { - // this does nothing dangerous so use only a localized buffer - LyXText * llt = getLyXText(bv); - need_update |= what; // we have to redraw us full if our LyXText REFRESH_AREA or // if we don't break row so that we only have one row to update! - if ((llt->refreshStatus() == LyXText::REFRESH_AREA) || + if ((text_.refreshStatus() == LyXText::REFRESH_AREA) || (!autoBreakRows && - (llt->refreshStatus() == LyXText::REFRESH_ROW))) + (text_.refreshStatus() == LyXText::REFRESH_ROW))) { need_update |= FULL; - } else if (llt->refreshStatus() == LyXText::REFRESH_ROW) { + } else if (text_.refreshStatus() == LyXText::REFRESH_ROW) { need_update |= CURSOR_PAR; } // this to not draw a selection when we redraw all of it! if (need_update & CURSOR && !(need_update & SELECTION)) { - if (llt->selection.set()) + if (text_.selection.set()) need_update = FULL; - llt->clearSelection(); + text_.clearSelection(); } } @@ -513,29 +489,21 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) if (!autoBreakRows && paragraphs.size() > 1) collapseParagraphs(bv); - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } - lt->partialRebreak(); + text_.partialRebreak(); setUpdateStatus(bv, what); bool flag = mark_dirty || (((need_update != CURSOR) && (need_update != NONE)) || - (lt->refreshStatus() != LyXText::REFRESH_NONE) || lt->selection.set()); - if (!lt->selection.set()) - lt->selection.cursor = lt->cursor; + (text_.refreshStatus() != LyXText::REFRESH_NONE) || text_.selection.set()); + if (!text_.selection.set()) + text_.selection.cursor = text_.cursor; bv->fitCursor(); if (flag) { - lt->postPaint(0); + text_.postPaint(0); bv->updateInset(const_cast(this)); } - if (clear) - lt = 0; - if (need_update == CURSOR) need_update = NONE; bv->owner()->view_state_changed(); @@ -564,14 +532,9 @@ void InsetText::insetUnlock(BufferView * bv) no_selection = true; locked = false; int code = NONE; - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } - if (lt->selection.set()) { - lt->clearSelection(); + if (text_.selection.set()) { + text_.clearSelection(); code = FULL; } else if (owner()) { bv->owner()->setLayout(owner()->getLyXText(bv) @@ -581,12 +544,10 @@ void InsetText::insetUnlock(BufferView * bv) // hack for deleteEmptyParMech ParagraphList::iterator first_par = paragraphs.begin(); if (!first_par->empty()) { - lt->setCursor(first_par, 0); + text_.setCursor(first_par, 0); } else if (paragraphs.size() > 1) { - lt->setCursor(boost::next(first_par), 0); + text_.setCursor(boost::next(first_par), 0); } - if (clear) - lt = 0; #if 0 updateLocal(bv, code, false); #else @@ -604,24 +565,17 @@ void InsetText::lockInset(BufferView * bv) inset_boundary = false; inset_par = paragraphs.end(); old_par = paragraphs.end(); - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } - lt->setCursor(paragraphs.begin(), 0); - lt->clearSelection(); + text_.setCursor(paragraphs.begin(), 0); + text_.clearSelection(); finishUndo(); // If the inset is empty set the language of the current font to the // language to the surronding text (if different). if (paragraphs.begin()->empty() && paragraphs.size() == 1 && - bv->getParentLanguage(this) != lt->current_font.language()) { + bv->getParentLanguage(this) != text_.current_font.language()) { LyXFont font(LyXFont::ALL_IGNORE); font.setLanguage(bv->getParentLanguage(this)); setFont(bv, font, false); } - if (clear) - lt = 0; int code = CURSOR; if (drawFrame_ == LOCKED) code = CURSOR|DRAW_FRAME; @@ -723,11 +677,6 @@ bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset) if (inset == this) return true; - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } if (inset->owner() != this) { int ustat = CURSOR_PAR; bool found = false; @@ -744,16 +693,12 @@ bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset) ustat = FULL; } if (found) - lt->updateInset(tl_inset); - if (clear) - lt = 0; + text_.updateInset(tl_inset); if (found) setUpdateStatus(bv, ustat); return found; } - bool found = lt->updateInset(inset); - if (clear) - lt = 0; + bool found = text_.updateInset(inset); if (found) { setUpdateStatus(bv, CURSOR_PAR); if (the_locking_inset && @@ -818,30 +763,22 @@ void InsetText::lfunMousePress(FuncRequest const & cmd) localDispatch(FuncRequest(bv, LFUN_COPY)); paste_internally = true; } - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } - int old_top_y = lt->top_y(); + int old_top_y = text_.top_y(); - lt->setCursorFromCoordinates(cmd.x - drawTextXOffset, + text_.setCursorFromCoordinates(cmd.x - drawTextXOffset, cmd.y + dim_.asc); // set the selection cursor! - lt->selection.cursor = lt->cursor; - lt->cursor.x_fix(lt->cursor.x()); + text_.selection.cursor = text_.cursor; + text_.cursor.x_fix(text_.cursor.x()); - if (lt->selection.set()) { - lt->clearSelection(); + if (text_.selection.set()) { + text_.clearSelection(); updateLocal(bv, FULL, false); } else { - lt->clearSelection(); + text_.clearSelection(); updateLocal(bv, CURSOR, false); } - if (clear) - lt = 0; - bv->owner()->setLayout(cpar(bv)->layout()->name()); // we moved the view we cannot do mouse selection in this case! @@ -919,25 +856,15 @@ void InsetText::lfunMouseMotion(FuncRequest const & cmd) return; BufferView * bv = cmd.view(); - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } - LyXCursor cur = lt->cursor; - lt->setCursorFromCoordinates + LyXCursor cur = text_.cursor; + text_.setCursorFromCoordinates (cmd.x - drawTextXOffset, cmd.y + dim_.asc); - lt->cursor.x_fix(lt->cursor.x()); - if (cur == lt->cursor) { - if (clear) - lt = 0; + text_.cursor.x_fix(text_.cursor.x()); + if (cur == text_.cursor) return; - } - lt->setSelection(); - bool flag = (lt->toggle_cursor.par() != lt->toggle_end_cursor.par() || - lt->toggle_cursor.pos() != lt->toggle_end_cursor.pos()); - if (clear) - lt = 0; + text_.setSelection(); + bool flag = (text_.toggle_cursor.par() != text_.toggle_end_cursor.par() || + text_.toggle_cursor.pos() != text_.toggle_end_cursor.pos()); if (flag) { updateLocal(bv, SELECTION, false); } @@ -947,6 +874,8 @@ void InsetText::lfunMouseMotion(FuncRequest const & cmd) Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) { BufferView * bv = cmd.view(); + if (bv) + text_.bv_owner = bv; if (cmd.action == LFUN_INSET_EDIT) { UpdatableInset::localDispatch(cmd); @@ -963,22 +892,17 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) inset_par = paragraphs.end(); old_par = paragraphs.end(); - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } if (cmd.argument.size()) { if (cmd.argument == "left") - lt->setCursor(paragraphs.begin(), 0); + text_.setCursor(paragraphs.begin(), 0); else { ParagraphList::iterator it = paragraphs.begin(); ParagraphList::iterator end = paragraphs.end(); while (boost::next(it) != end) ++it; // int const pos = (p->size() ? p->size()-1 : p->size()); - lt->setCursor(it, it->size()); + text_.setCursor(it, it->size()); } } else { int tmp_y = (cmd.y < 0) ? 0 : cmd.y; @@ -987,28 +911,26 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) // cycle hopefully (Jug 20020509) // FIXME: GUII I've changed this to none: probably WRONG if (!checkAndActivateInset(bv, cmd.x, tmp_y, mouse_button::none)) { - lt->setCursorFromCoordinates(cmd.x - drawTextXOffset, + text_.setCursorFromCoordinates(cmd.x - drawTextXOffset, cmd.y + dim_.asc); - lt->cursor.x_fix(lt->cursor.x()); + text_.cursor.x_fix(text_.cursor.x()); } } - lt->clearSelection(); + text_.clearSelection(); finishUndo(); // If the inset is empty set the language of the current font to the // language to the surronding text (if different). if (paragraphs.begin()->empty() && paragraphs.size() == 1 && - bv->getParentLanguage(this) != lt->current_font.language()) + bv->getParentLanguage(this) != text_.current_font.language()) { LyXFont font(LyXFont::ALL_IGNORE); font.setLanguage(bv->getParentLanguage(this)); setFont(bv, font, false); } - if (clear) - lt = 0; int code = CURSOR; if (drawFrame_ == LOCKED) code = CURSOR | DRAW_FRAME; @@ -1081,18 +1003,13 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) return result; } } - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } int updwhat = 0; int updflag = false; // what type of update to do on a cursor movement int cursor_update = CURSOR; - if (lt->selection.set()) + if (text_.selection.set()) cursor_update = SELECTION; switch (cmd.action) { @@ -1111,21 +1028,21 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) * true (on). */ #if 0 // This should not be needed here and is also WRONG! - setUndo(bv, Undo::INSERT, lt->cursor.par()); + setUndo(bv, Undo::INSERT, text_.cursor.par()); #endif bv->switchKeyMap(); if (lyxrc.auto_region_delete) { - if (lt->selection.set()) { - lt->cutSelection(false, false); + if (text_.selection.set()) { + text_.cutSelection(false, false); } } - lt->clearSelection(); + text_.clearSelection(); for (string::size_type i = 0; i < cmd.argument.length(); ++i) { bv->owner()->getIntl().getTransManager(). - TranslateAndInsert(cmd.argument[i], lt); + TranslateAndInsert(cmd.argument[i], &text_); } } - lt->selection.cursor = lt->cursor; + text_.selection.cursor = text_.cursor; updwhat = CURSOR | CURSOR_PAR; updflag = true; result = DISPATCHED_NOUPDATE; @@ -1155,42 +1072,42 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) break; case LFUN_PRIOR: - if (crow(bv) == lt->rows().begin()) + if (crow(bv) == text_.rows().begin()) result = FINISHED_UP; else { - lt->cursorPrevious(); - lt->clearSelection(); + text_.cursorPrevious(); + text_.clearSelection(); result = DISPATCHED_NOUPDATE; } updwhat = cursor_update; break; case LFUN_NEXT: - if (boost::next(crow(bv)) == lt->rows().end()) + if (boost::next(crow(bv)) == text_.rows().end()) result = FINISHED_DOWN; else { - lt->cursorNext(); - lt->clearSelection(); + text_.cursorNext(); + text_.clearSelection(); result = DISPATCHED_NOUPDATE; } updwhat = cursor_update; break; case LFUN_BACKSPACE: { - if (lt->selection.set()) - lt->cutSelection(true, false); + if (text_.selection.set()) + text_.cutSelection(true, false); else - lt->backspace(); + text_.backspace(); updwhat = CURSOR_PAR; updflag = true; break; } case LFUN_DELETE: { - if (lt->selection.set()) { - lt->cutSelection(true, false); + if (text_.selection.set()) { + text_.cutSelection(true, false); } else { - lt->Delete(); + text_.Delete(); } updwhat = CURSOR_PAR; updflag = true; @@ -1198,7 +1115,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) } case LFUN_CUT: { - lt->cutSelection(true, true); + text_.cutSelection(true, true); updwhat = CURSOR_PAR; updflag = true; break; @@ -1206,7 +1123,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) case LFUN_COPY: finishUndo(); - lt->copySelection(); + text_.copySelection(); updwhat = CURSOR_PAR; break; @@ -1217,12 +1134,12 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) if (clip.empty()) break; if (cmd.argument == "paragraph") { - lt->insertStringAsParagraphs(clip); + text_.insertStringAsParagraphs(clip); } else { - lt->insertStringAsLines(clip); + text_.insertStringAsLines(clip); } // bug 393 - lt->clearSelection(); + text_.clearSelection(); updwhat = CURSOR_PAR; updflag = true; @@ -1247,9 +1164,9 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) #warning FIXME Check if the arg is in the domain of available selections. sel_index = paste_arg; } - lt->pasteSelection(sel_index); + text_.pasteSelection(sel_index); // bug 393 - lt->clearSelection(); + text_.clearSelection(); updwhat = CURSOR_PAR; updflag = true; break; @@ -1260,7 +1177,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) result = DISPATCHED; break; } - lt->breakParagraph(paragraphs, 0); + text_.breakParagraph(paragraphs, 0); updwhat = CURSOR | FULL; updflag = true; break; @@ -1270,7 +1187,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) result = DISPATCHED; break; } - lt->breakParagraph(paragraphs, 1); + text_.breakParagraph(paragraphs, 1); updwhat = CURSOR | FULL; updflag = true; break; @@ -1281,7 +1198,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) break; } - lt->insertInset(new InsetNewline); + text_.insertInset(new InsetNewline); updwhat = CURSOR | CURSOR_PAR; updflag = true; break; @@ -1316,7 +1233,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) if (cur_layout != layout) { cur_layout = layout; - lt->setLayout(layout); + text_.setLayout(layout); bv->owner()->setLayout(cpar(bv)->layout()->name()); updwhat = CURSOR_PAR; updflag = true; @@ -1332,7 +1249,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) // inherit bufferparams/paragraphparams in a strange way. (Lgb) // FIXME: how old is this comment ? ... { - ParagraphList::iterator pit = lt->cursor.par(); + ParagraphList::iterator pit = text_.cursor.par(); Spacing::Space cur_spacing = pit->params().spacing().getSpace(); float cur_value = 1.0; if (cur_spacing == Spacing::Other) { @@ -1408,8 +1325,6 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & cmd) break; } - if (clear) - lt = 0; if (updwhat > 0) updateLocal(bv, updwhat, updflag); /// If the action has deleted all text in the inset, we need to change the @@ -1827,30 +1742,22 @@ void InsetText::setFont(BufferView * bv, LyXFont const & font, bool toggleall, return; } - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } - if (lt->selection.set()) { - setUndo(bv, Undo::EDIT, lt->cursor.par()); + if (text_.selection.set()) { + setUndo(bv, Undo::EDIT, text_.cursor.par()); } if (selectall) selectAll(bv); - lt->toggleFree(font, toggleall); + text_.toggleFree(font, toggleall); if (selectall) - lt->clearSelection(); + text_.clearSelection(); bv->fitCursor(); - bool flag = (selectall || lt->selection.set()); - - if (clear) - lt = 0; + bool flag = (selectall || text_.selection.set()); if (flag) updateLocal(bv, FULL, true); @@ -2009,12 +1916,10 @@ void InsetText::setFrameColor(BufferView * bv, LColor::color col) int InsetText::cx(BufferView * bv) const { - // we do nothing dangerous so we use a local cache - LyXText * llt = getLyXText(bv); - int x = llt->cursor.x() + top_x + TEXT_TO_INSET_OFFSET; + int x = text_.cursor.x() + top_x + TEXT_TO_INSET_OFFSET; if (the_locking_inset) { - LyXFont font = llt->getFont(bv->buffer(), llt->cursor.par(), - llt->cursor.pos()); + LyXFont font = text_.getFont(bv->buffer(), text_.cursor.par(), + text_.cursor.pos()); if (font.isVisibleRightToLeft()) x -= the_locking_inset->width(bv, font); } @@ -2024,12 +1929,10 @@ 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; + int x = text_.cursor.ix() + top_x + TEXT_TO_INSET_OFFSET; if (the_locking_inset) { - LyXFont font = llt->getFont(bv->buffer(), llt->cursor.par(), - llt->cursor.pos()); + LyXFont font = text_.getFont(bv->buffer(), text_.cursor.par(), + text_.cursor.pos()); if (font.isVisibleRightToLeft()) x -= the_locking_inset->width(bv, font); } @@ -2075,84 +1978,19 @@ RowList::iterator InsetText::crow(BufferView * bv) const } -LyXText * InsetText::getLyXText(BufferView const * lbv, +LyXText * InsetText::getLyXText(BufferView const * bv, bool const recursive) const { - if (cached_bview == lbv) { - if (recursive && the_locking_inset) - return the_locking_inset->getLyXText(lbv, true); - LyXText * lt = cached_text.get(); - Assert(lt && lt->rows().begin()->par() == const_cast(paragraphs).begin()); - return lt; - } - // Super UGLY! (Lgb) - BufferView * bv = const_cast(lbv); - - cached_bview = bv; - Cache::iterator it = cache.find(bv); - - if (it != cache.end()) { - if (do_reinit) { - reinitLyXText(); - } else if (do_resize) { - resizeLyXText(do_resize); - } else { - if (lt || !it->second.remove) { - Assert(it->second.text.get()); - cached_text = it->second.text; - if (recursive && the_locking_inset) { - return the_locking_inset->getLyXText(bv, true); - } - return cached_text.get(); - } else if (it->second.remove) { - if (locked) { - saveLyXTextState(it->second.text.get()); - } else { - sstate.cursor.par(const_cast(paragraphs).end()); - } - } - // - // when we have to reinit the existing LyXText! - // - it->second.text->init(bv); - restoreLyXTextState(it->second.text.get()); - it->second.remove = false; - } - cached_text = it->second.text; - if (the_locking_inset && recursive) { - return the_locking_inset->getLyXText(bv); - } - return cached_text.get(); - } - /// - // we are here only if we don't have a BufferView * in the cache!!! - /// - cached_text.reset(new LyXText(bv, const_cast(this))); - cached_text->init(bv); - restoreLyXTextState(cached_text.get()); - - cache.insert(make_pair(bv, cached_text)); - - if (the_locking_inset && recursive) { - return the_locking_inset->getLyXText(bv); - } - return cached_text.get(); + if (bv) + text_.bv_owner = const_cast(bv); + if (recursive && the_locking_inset) + return the_locking_inset->getLyXText(bv, true); + return &text_; } void InsetText::deleteLyXText(BufferView * bv, bool recursive) const { - cached_bview = 0; - - Cache::iterator it = cache.find(bv); - - if (it == cache.end()) { - return; - } - - Assert(it->second.text.get()); - - it->second.remove = true; if (recursive) { /// then remove all LyXText in text-insets for_each(const_cast(paragraphs).begin(), @@ -2164,35 +2002,26 @@ void InsetText::deleteLyXText(BufferView * bv, bool recursive) const void InsetText::resizeLyXText(BufferView * bv, bool force) const { - if (lt) { - // we cannot resize this because we are in use! - // so do this on the next possible getLyXText() - do_resize = bv; - return; - } - do_resize = 0; if (paragraphs.size() == 1 && paragraphs.begin()->empty()) { // no data, resize not neccessary! // we have to do this as a fixed width may have changed! - LyXText * t = getLyXText(bv); - saveLyXTextState(t); - t->init(bv, true); - restoreLyXTextState(t); + saveLyXTextState(&text_); + text_.init(bv, true); + restoreLyXTextState(&text_); return; } + if (!bv) + return; + + Assert(bv); + text_.bv_owner = bv; + // one endless line, resize normally not necessary if (!force && getMaxWidth(bv, this) < 0) return; - Cache::iterator it = cache.find(bv); - if (it == cache.end()) { - return; - } - - Assert(it->second.text.get()); - - LyXText * t = it->second.text.get(); + LyXText * t = &text_; saveLyXTextState(t); for_each(const_cast(paragraphs).begin(), @@ -2220,40 +2049,31 @@ void InsetText::resizeLyXText(BufferView * bv, bool force) const void InsetText::reinitLyXText() const { - if (lt) { - // we cannot resize this because we are in use! - // so do this on the next possible getLyXText() - do_reinit = true; + LyXText * t = &text_; + BufferView * bv = text_.bv_owner; + + if (!bv) return; + + saveLyXTextState(t); + + for_each(const_cast(paragraphs).begin(), + const_cast(paragraphs).end(), + boost::bind(&Paragraph::resizeInsetsLyXText, _1, bv)); + + t->init(bv, true); + restoreLyXTextState(t); + if (the_locking_inset) { + inset_x = cix(bv) - top_x + drawTextXOffset; + inset_y = ciy(bv) + drawTextYOffset; } - do_reinit = false; - do_resize = 0; - for (Cache::iterator it = cache.begin(); it != cache.end(); ++it) { - Assert(it->second.text.get()); - - LyXText * t = it->second.text.get(); - BufferView * bv = it->first; - - saveLyXTextState(t); - - for_each(const_cast(paragraphs).begin(), - const_cast(paragraphs).end(), - boost::bind(&Paragraph::resizeInsetsLyXText, _1, bv)); - - t->init(bv, true); - restoreLyXTextState(t); - if (the_locking_inset) { - inset_x = cix(bv) - top_x + drawTextXOffset; - inset_y = ciy(bv) + drawTextYOffset; - } - t->top_y(bv->screen().topCursorVisible(t)); - if (!owner()) { - const_cast(this)->updateLocal(bv, FULL, false); - // this will scroll the screen such that the cursor becomes visible - bv->updateScrollbar(); - } else { - need_update = FULL; - } + t->top_y(bv->screen().topCursorVisible(t)); + if (!owner()) { + const_cast(this)->updateLocal(bv, FULL, false); + // this will scroll the screen such that the cursor becomes visible + bv->updateScrollbar(); + } else { + need_update = FULL; } } @@ -2371,31 +2191,21 @@ WordLangTuple const InsetText::selectNextWordToSpellcheck(BufferView * bv, float & value) const { - bool clear = false; WordLangTuple word; - - if (!lt) { - lt = getLyXText(bv); - clear = true; - } if (the_locking_inset) { word = the_locking_inset->selectNextWordToSpellcheck(bv, value); if (!word.word().empty()) { value += cy(bv); - if (clear) - lt = 0; return word; } // we have to go on checking so move cursor to the next char - lt->cursor.pos(lt->cursor.pos() + 1); + text_.cursor.pos(text_.cursor.pos() + 1); } - word = lt->selectNextWordToSpellcheck(value); + word = text_.selectNextWordToSpellcheck(value); if (word.word().empty()) bv->unlockInset(const_cast(this)); else value = cy(bv); - if (clear) - lt = 0; return word; } @@ -2416,16 +2226,11 @@ void InsetText::toggleSelection(BufferView * bv, bool kill_selection) if (the_locking_inset) { the_locking_inset->toggleSelection(bv, kill_selection); } - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } int x = top_x + TEXT_TO_INSET_OFFSET; - RowList::iterator rowit = lt->rows().begin(); - RowList::iterator end = lt->rows().end(); + RowList::iterator rowit = text_.rows().begin(); + RowList::iterator end = text_.rows().end(); int y_offset = top_baseline - rowit->ascent_of_text(); int y = y_offset; while ((rowit != end) && ((y + rowit->height()) <= 0)) { @@ -2437,38 +2242,29 @@ void InsetText::toggleSelection(BufferView * bv, bool kill_selection) if (need_update & SELECTION) need_update = NONE; - bv->screen().toggleSelection(lt, bv, kill_selection, y_offset, x); - if (clear) - lt = 0; + bv->screen().toggleSelection(&text_, bv, kill_selection, y_offset, x); } bool InsetText::nextChange(BufferView * bv, lyx::pos_type & length) { - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } if (the_locking_inset) { if (the_locking_inset->nextChange(bv, length)) return true; - lt->cursorRight(true); + text_.cursorRight(true); } lyxfind::SearchResult result = - lyxfind::findNextChange(bv, lt, length); + lyxfind::findNextChange(bv, &text_, length); if (result == lyxfind::SR_FOUND) { - LyXCursor cur = lt->cursor; + LyXCursor cur = text_.cursor; bv->unlockInset(bv->theLockingInset()); if (bv->lockInset(this)) locked = true; - lt->cursor = cur; - lt->setSelectionRange(length); + text_.cursor = cur; + text_.setSelectionRange(length); updateLocal(bv, SELECTION, false); } - if (clear) - lt = 0; return result != lyxfind::SR_NOT_FOUND; } @@ -2476,30 +2272,23 @@ bool InsetText::nextChange(BufferView * bv, lyx::pos_type & length) bool InsetText::searchForward(BufferView * bv, string const & str, bool cs, bool mw) { - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } if (the_locking_inset) { if (the_locking_inset->searchForward(bv, str, cs, mw)) return true; - lt->cursorRight(true); + text_.cursorRight(true); } lyxfind::SearchResult result = - lyxfind::LyXFind(bv, lt, str, true, cs, mw); + lyxfind::LyXFind(bv, &text_, str, true, cs, mw); if (result == lyxfind::SR_FOUND) { - LyXCursor cur = lt->cursor; + LyXCursor cur = text_.cursor; bv->unlockInset(bv->theLockingInset()); if (bv->lockInset(this)) locked = true; - lt->cursor = cur; - lt->setSelectionRange(str.length()); + text_.cursor = cur; + text_.setSelectionRange(str.length()); updateLocal(bv, SELECTION, false); } - if (clear) - lt = 0; return (result != lyxfind::SR_NOT_FOUND); } @@ -2510,11 +2299,6 @@ bool InsetText::searchBackward(BufferView * bv, string const & str, if (the_locking_inset->searchBackward(bv, str, cs, mw)) return true; } - bool clear = false; - if (!lt) { - lt = getLyXText(bv); - clear = true; - } if (!locked) { ParagraphList::iterator pit = paragraphs.begin(); ParagraphList::iterator pend = paragraphs.end(); @@ -2522,22 +2306,20 @@ bool InsetText::searchBackward(BufferView * bv, string const & str, while (boost::next(pit) != pend) ++pit; - lt->setCursor(pit, pit->size()); + text_.setCursor(pit, pit->size()); } lyxfind::SearchResult result = - lyxfind::LyXFind(bv, lt, str, false, cs, mw); + lyxfind::LyXFind(bv, &text_, str, false, cs, mw); if (result == lyxfind::SR_FOUND) { - LyXCursor cur = lt->cursor; + LyXCursor cur = text_.cursor; bv->unlockInset(bv->theLockingInset()); if (bv->lockInset(this)) locked = true; - lt->cursor = cur; - lt->setSelectionRange(str.length()); + text_.cursor = cur; + text_.setSelectionRange(str.length()); updateLocal(bv, SELECTION, false); } - if (clear) - lt = 0; return (result != lyxfind::SR_NOT_FOUND); } @@ -2552,8 +2334,6 @@ bool InsetText::checkInsertChar(LyXFont & font) void InsetText::collapseParagraphs(BufferView * bv) { - LyXText * llt = getLyXText(bv); - while (paragraphs.size() > 1) { ParagraphList::iterator first_par = paragraphs.begin(); ParagraphList::iterator next_par = boost::next(first_par); @@ -2565,16 +2345,16 @@ void InsetText::collapseParagraphs(BufferView * bv) first_par->insertChar(first_par_size, ' '); } - if (llt->selection.set()) { - if (llt->selection.start.par() == next_par) { - llt->selection.start.par(first_par); - llt->selection.start.pos( - llt->selection.start.pos() + first_par_size); + if (text_.selection.set()) { + if (text_.selection.start.par() == next_par) { + text_.selection.start.par(first_par); + text_.selection.start.pos( + text_.selection.start.pos() + first_par_size); } - if (llt->selection.end.par() == next_par) { - llt->selection.end.par(first_par); - llt->selection.end.pos( - llt->selection.end.pos() + first_par_size); + if (text_.selection.end.par() == next_par) { + text_.selection.end.par(first_par); + text_.selection.end.pos( + text_.selection.end.pos() + first_par_size); } } diff --git a/src/insets/insettext.h b/src/insets/insettext.h index 290d949592..0a6b1ae8c3 100644 --- a/src/insets/insettext.h +++ b/src/insets/insettext.h @@ -19,12 +19,13 @@ #include "ParagraphList.h" #include "RowList.h" #include "dimension.h" -#include "frontends/mouse_state.h" +#include "lyxtext.h" #include "support/types.h" +#include "frontends/mouse_state.h" + #include -#include class Painter; class BufferView; @@ -268,19 +269,6 @@ private: /// void lfunMouseMotion(FuncRequest const &); - /// - struct InnerCache { - /// - InnerCache(boost::shared_ptr); - /// - boost::shared_ptr text; - /// - bool remove; - }; - /// - typedef std::map Cache; - /// - typedef Cache::value_type value_type; /// RESULT moveRight(BufferView *, bool activate_inset = true, @@ -336,8 +324,6 @@ private: /// void restoreLyXTextState(LyXText *) const; /// - void reinitLyXText() const; - /// void collapseParagraphs(BufferView *); /* Private structures and variables */ @@ -365,22 +351,12 @@ private: UpdatableInset * the_locking_inset; /// mutable ParagraphList::iterator old_par; - /// The cache. - mutable Cache cache; /// mutable int last_drawn_width; - /// - mutable BufferView * cached_bview; - /// - mutable boost::shared_ptr cached_text; /// some funny 'temporarily saved state' mutable TextCursor sstate; - /// - // this is needed globally so we know that we're using it actually and - // so the LyXText-Cache is not erased until used! - mutable LyXText * lt; /// // to remember old painted frame dimensions to clear it on the right spot! /// @@ -390,13 +366,16 @@ private: mutable int frame_h; /// bool in_update; /* as update is not reentrant! */ - mutable BufferView * do_resize; - mutable bool do_reinit; mutable bool in_insetAllowed; /// // these are used to check for mouse movement in Motion selection code /// int mouse_x; int mouse_y; +public: + /// + void reinitLyXText() const; + /// + mutable LyXText text_; }; #endif diff --git a/src/lyxtext.h b/src/lyxtext.h index eb5f55fcb8..1163ff2748 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -223,9 +223,11 @@ private: refresh_status refresh_status_; +public: /// only the top-level LyXText has this non-zero BufferView * bv_owner; +private: /// returns a pointer to a specified row. RowList::iterator getRow(ParagraphList::iterator pit, lyx::pos_type pos) const; diff --git a/src/tabular.h b/src/tabular.h index 47008152d7..5d1ec5b74f 100644 --- a/src/tabular.h +++ b/src/tabular.h @@ -386,7 +386,8 @@ public: /// /// recalculate the widths/heights only! void reinit(); -private: + /// +//private: /// mutable int cur_cell; /// @@ -422,6 +423,7 @@ private: /// InsetText inset; }; + cellstruct * cellinfo_of_cell(int cell) const; /// typedef std::vector cell_vector; /// @@ -532,8 +534,6 @@ private: /// void calculate_width_of_tabular(); /// - cellstruct * cellinfo_of_cell(int cell) const; - /// void delete_column(int column); /// int cells_in_multicolumn(int cell) const; diff --git a/src/text.C b/src/text.C index 8e68a70a32..aaca6ccb5f 100644 --- a/src/text.C +++ b/src/text.C @@ -156,7 +156,10 @@ int LyXText::workWidth(Inset const * inset) const ParagraphList::iterator par = std::find(ownerParagraphs().begin(), ownerParagraphs().end(), *inset->parOwner()); - //Assert(par); + if (par == ownerParagraphs().end()) { + lyxerr[Debug::GUI] << "LyXText::workWidth: unexpected\n"; + return -1; + } pos_type pos = par->getPositionOfInset(inset); Assert(pos != -1); diff --git a/src/text2.C b/src/text2.C index 75fbd4acde..5aadd9e718 100644 --- a/src/text2.C +++ b/src/text2.C @@ -83,6 +83,7 @@ LyXText::LyXText(BufferView * bv, InsetText * inset) void LyXText::init(BufferView * bview, bool reinit) { + bv_owner = bview; if (reinit) { rowlist_.clear(); need_break_row = rows().end();