No known problems. [John, that should make you start...]
Andre' -- Those who desire to give up Freedom in order to gain Security, will not have, nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)
Index: lyxtext.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtext.h,v retrieving revision 1.184 diff -u -p -r1.184 lyxtext.h --- lyxtext.h 1 Jul 2003 11:51:18 -0000 1.184 +++ lyxtext.h 2 Jul 2003 14:58:37 -0000 @@ -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; Index: tabular.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/tabular.C,v retrieving revision 1.170 diff -u -p -r1.170 tabular.C --- tabular.C 30 Jun 2003 23:55:57 -0000 1.170 +++ tabular.C 2 Jul 2003 14:58:37 -0000 @@ -20,7 +20,6 @@ #include "vspace.h" #include "layout.h" #include "buffer.h" -#include "BufferView.h" #include "frontends/Painter.h" #include "LaTeXFeatures.h" #include "insets/insettabular.h" Index: tabular.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/tabular.h,v retrieving revision 1.72 diff -u -p -r1.72 tabular.h --- tabular.h 16 Jun 2003 11:49:29 -0000 1.72 +++ tabular.h 2 Jul 2003 14:58:37 -0000 @@ -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<cellstruct> cell_vector; /// @@ -531,8 +533,6 @@ private: bool calculate_width_of_column_NMC(int column); // no multi cells /// void calculate_width_of_tabular(); - /// - cellstruct * cellinfo_of_cell(int cell) const; /// void delete_column(int column); /// Index: text.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v retrieving revision 1.374 diff -u -p -r1.374 text.C --- text.C 1 Jul 2003 11:51:18 -0000 1.374 +++ text.C 2 Jul 2003 14:58:37 -0000 @@ -156,7 +156,10 @@ int LyXText::workWidth(Inset const * ins 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); Index: text2.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v retrieving revision 1.378 diff -u -p -r1.378 text2.C --- text2.C 1 Jul 2003 11:51:18 -0000 1.378 +++ text2.C 2 Jul 2003 14:58:38 -0000 @@ -83,6 +83,7 @@ LyXText::LyXText(BufferView * bv, InsetT void LyXText::init(BufferView * bview, bool reinit) { + bv_owner = bview; if (reinit) { rowlist_.clear(); need_break_row = rows().end(); Index: insets/insettabular.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettabular.C,v retrieving revision 1.292 diff -u -p -r1.292 insettabular.C --- insets/insettabular.C 30 Jun 2003 23:56:19 -0000 1.292 +++ insets/insettabular.C 2 Jul 2003 14:58:38 -0000 @@ -247,9 +247,16 @@ void InsetTabular::read(Buffer const * b } -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; Index: insets/insettext.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v retrieving revision 1.415 diff -u -p -r1.415 insettext.C --- insets/insettext.C 30 Jun 2003 23:56:20 -0000 1.415 +++ insets/insettext.C 2 Jul 2003 14:58:38 -0000 @@ -122,16 +122,8 @@ void InsetText::restoreLyXTextState(LyXT } -InsetText::InnerCache::InnerCache(boost::shared_ptr<LyXText> 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()); @@ -142,8 +134,7 @@ InsetText::InsetText(BufferParams const 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); } @@ -152,26 +143,26 @@ InsetText::InsetText(InsetText const & i 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; @@ -181,7 +172,6 @@ void InsetText::init(InsetText const * i locked = false; old_par = paragraphs.end(); last_drawn_width = -1; - cached_bview = 0; sstate.cursor.par(paragraphs.end()); in_insetAllowed = false; } @@ -351,15 +341,10 @@ void InsetText::draw(PainterInfo & pi, i 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(); @@ -371,11 +356,11 @@ void InsetText::draw(PainterInfo & pi, i ++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; } @@ -385,14 +370,14 @@ void InsetText::draw(PainterInfo & pi, i 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)); @@ -403,8 +388,6 @@ void InsetText::draw(PainterInfo & pi, i if (need_update != INIT) { need_update = NONE; } - if (clear) - lt = 0; } @@ -422,6 +405,9 @@ void InsetText::drawFrame(Painter & pain void InsetText::update(BufferView * bv, bool reinit) { + if (bv) + text_.bv_owner = const_cast<BufferView *>(bv); + if (in_update) { if (reinit && owner()) { reinitLyXText(); @@ -456,20 +442,13 @@ void InsetText::update(BufferView * bv, 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; @@ -481,28 +460,25 @@ void InsetText::update(BufferView * bv, } -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(); } } @@ -512,29 +488,21 @@ void InsetText::updateLocal(BufferView * 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<InsetText *>(this)); } - if (clear) - lt = 0; - if (need_update == CURSOR) need_update = NONE; bv->owner()->view_state_changed(); @@ -563,14 +531,9 @@ void InsetText::insetUnlock(BufferView * 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) @@ -580,12 +543,10 @@ void InsetText::insetUnlock(BufferView * // 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 @@ -603,24 +564,17 @@ void InsetText::lockInset(BufferView * b 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; @@ -722,11 +676,6 @@ bool InsetText::updateInsetInInset(Buffe 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; @@ -743,16 +692,12 @@ bool InsetText::updateInsetInInset(Buffe 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 && @@ -817,30 +762,22 @@ void InsetText::lfunMousePress(FuncReque 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! @@ -918,25 +855,15 @@ void InsetText::lfunMouseMotion(FuncRequ 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); } @@ -946,6 +873,8 @@ void InsetText::lfunMouseMotion(FuncRequ 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); @@ -962,22 +891,17 @@ Inset::RESULT InsetText::localDispatch(F 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; @@ -986,28 +910,26 @@ Inset::RESULT InsetText::localDispatch(F // 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; @@ -1080,18 +1002,13 @@ Inset::RESULT InsetText::localDispatch(F 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) { @@ -1110,21 +1027,21 @@ Inset::RESULT InsetText::localDispatch(F * 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; @@ -1154,42 +1071,42 @@ Inset::RESULT InsetText::localDispatch(F 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; @@ -1197,7 +1114,7 @@ Inset::RESULT InsetText::localDispatch(F } case LFUN_CUT: { - lt->cutSelection(true, true); + text_.cutSelection(true, true); updwhat = CURSOR_PAR; updflag = true; break; @@ -1205,7 +1122,7 @@ Inset::RESULT InsetText::localDispatch(F case LFUN_COPY: finishUndo(); - lt->copySelection(); + text_.copySelection(); updwhat = CURSOR_PAR; break; @@ -1216,12 +1133,12 @@ Inset::RESULT InsetText::localDispatch(F 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; @@ -1246,9 +1163,9 @@ Inset::RESULT InsetText::localDispatch(F #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; @@ -1259,7 +1176,7 @@ Inset::RESULT InsetText::localDispatch(F result = DISPATCHED; break; } - lt->breakParagraph(paragraphs, 0); + text_.breakParagraph(paragraphs, 0); updwhat = CURSOR | FULL; updflag = true; break; @@ -1269,7 +1186,7 @@ Inset::RESULT InsetText::localDispatch(F result = DISPATCHED; break; } - lt->breakParagraph(paragraphs, 1); + text_.breakParagraph(paragraphs, 1); updwhat = CURSOR | FULL; updflag = true; break; @@ -1280,7 +1197,7 @@ Inset::RESULT InsetText::localDispatch(F break; } - lt->insertInset(new InsetNewline); + text_.insertInset(new InsetNewline); updwhat = CURSOR | CURSOR_PAR; updflag = true; break; @@ -1315,7 +1232,7 @@ Inset::RESULT InsetText::localDispatch(F 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; @@ -1331,7 +1248,7 @@ Inset::RESULT InsetText::localDispatch(F // 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) { @@ -1407,8 +1324,6 @@ Inset::RESULT InsetText::localDispatch(F 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 @@ -1826,30 +1741,22 @@ void InsetText::setFont(BufferView * bv, 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); @@ -2008,12 +1915,10 @@ void InsetText::setFrameColor(BufferView 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); } @@ -2023,12 +1928,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); } @@ -2074,84 +1977,19 @@ RowList::iterator InsetText::crow(Buffer } -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<ParagraphList&>(paragraphs).begin()); - return lt; - } - // Super UGLY! (Lgb) - BufferView * bv = const_cast<BufferView *>(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<ParagraphList&>(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<InsetText *>(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<BufferView *>(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<ParagraphList&>(paragraphs).begin(), @@ -2163,35 +2001,26 @@ void InsetText::deleteLyXText(BufferView 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; } - // one endless line, resize normally not necessary - if (!force && getMaxWidth(bv, this) < 0) + if (!bv) return; - Cache::iterator it = cache.find(bv); - if (it == cache.end()) { - return; - } + Assert(bv); + text_.bv_owner = bv; - Assert(it->second.text.get()); + // one endless line, resize normally not necessary + if (!force && getMaxWidth(bv, this) < 0) + return; - LyXText * t = it->second.text.get(); + LyXText * t = &text_; saveLyXTextState(t); for_each(const_cast<ParagraphList&>(paragraphs).begin(), @@ -2219,40 +2048,31 @@ void InsetText::resizeLyXText(BufferView 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; - return; - } - do_reinit = false; - do_resize = 0; - for (Cache::iterator it = cache.begin(); it != cache.end(); ++it) { - Assert(it->second.text.get()); + LyXText * t = &text_; + BufferView * bv = text_.bv_owner; - LyXText * t = it->second.text.get(); - BufferView * bv = it->first; + if (!bv) + return; - saveLyXTextState(t); + saveLyXTextState(t); - for_each(const_cast<ParagraphList&>(paragraphs).begin(), - const_cast<ParagraphList&>(paragraphs).end(), - boost::bind(&Paragraph::resizeInsetsLyXText, _1, bv)); + for_each(const_cast<ParagraphList&>(paragraphs).begin(), + const_cast<ParagraphList&>(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<InsetText*>(this)->updateLocal(bv, FULL, false); - // this will scroll the screen such that the cursor becomes visible - bv->updateScrollbar(); - } else { - need_update = FULL; - } + 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<InsetText*>(this)->updateLocal(bv, FULL, false); + // this will scroll the screen such that the cursor becomes visible + bv->updateScrollbar(); + } else { + need_update = FULL; } } @@ -2370,31 +2190,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<InsetText *>(this)); else value = cy(bv); - if (clear) - lt = 0; return word; } @@ -2415,16 +2225,11 @@ void InsetText::toggleSelection(BufferVi 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)) { @@ -2436,38 +2241,29 @@ void InsetText::toggleSelection(BufferVi 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; } @@ -2475,30 +2271,23 @@ bool InsetText::nextChange(BufferView * 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); } @@ -2509,11 +2298,6 @@ bool InsetText::searchBackward(BufferVie 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(); @@ -2521,22 +2305,20 @@ bool InsetText::searchBackward(BufferVie 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); } @@ -2551,8 +2333,6 @@ bool InsetText::checkInsertChar(LyXFont 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); @@ -2564,16 +2344,16 @@ void InsetText::collapseParagraphs(Buffe 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 (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.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 (text_.selection.end.par() == next_par) { + text_.selection.end.par(first_par); + text_.selection.end.pos( + text_.selection.end.pos() + first_par_size); } } Index: insets/insettext.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.h,v retrieving revision 1.169 diff -u -p -r1.169 insettext.h --- insets/insettext.h 27 Jun 2003 11:53:41 -0000 1.169 +++ insets/insettext.h 2 Jul 2003 14:58:38 -0000 @@ -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 <boost/shared_ptr.hpp> -#include <map> class Painter; class BufferView; @@ -269,19 +270,6 @@ private: void lfunMouseMotion(FuncRequest const &); /// - struct InnerCache { - /// - InnerCache(boost::shared_ptr<LyXText>); - /// - boost::shared_ptr<LyXText> text; - /// - bool remove; - }; - /// - typedef std::map<BufferView *, InnerCache> Cache; - /// - typedef Cache::value_type value_type; - /// RESULT moveRight(BufferView *, bool activate_inset = true, bool selecting = false); @@ -336,8 +324,6 @@ private: /// void restoreLyXTextState(LyXText *) const; /// - void reinitLyXText() const; - /// void collapseParagraphs(BufferView *); /* Private structures and variables */ @@ -365,23 +351,13 @@ 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<LyXText> 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! /// mutable int frame_x; @@ -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