X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsettabular.C;h=7f9ae0cf01b9cbf289de21f8a7a1c7c4abf4a5c2;hb=dbd7a961fc46bb10c85bdd8c7fb6626477ae63d8;hp=222ae6dc8a891dbfb348228d64b63e88b24a540b;hpb=de3b5aab16e517258d6bebb6122697adf8999ae5;p=lyx.git diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 222ae6dc8a..7f9ae0cf01 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -24,7 +24,6 @@ #include "Painter.h" #include "font.h" #include "lyxtext.h" -#include "lyx_gui_misc.h" #include "LyXView.h" #include "insets/insettext.h" #include "debug.h" @@ -48,6 +47,8 @@ #include //#include + +using std::vector; using std::ostream; using std::ifstream; using std::max; @@ -372,16 +373,18 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline, // Here we use rectangular backgroundColor patches to clean up // within a cell around the cell's red inset box. As follows: // - // +---+ +---+ - // | | | | The rectangles are A, B and C + // +--------------------+ + // | C | The rectangles are A, B and C // | A |------------| B | below, origin top left (tx, ty), // | | inset box | | dimensions w(idth), h(eight). // +---+------------+---+ x grows rightward, y downward // | D | // +--------------------+ // +#if 0 // clear only if we didn't have a change if (bv->text->status() != LyXText::CHANGED_IN_DRAW) { +#endif // clear before the inset int tx, ty, w, h; tx = nx + 1; @@ -407,7 +410,16 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline, h = tabular->GetDescentOfRow(i) - the_locking_inset->descent(bv, font) - 1; pain.fillRectangle(tx, ty, w, h, backgroundColor()); + // clear above the inset + tx = nx + 1; + ty = baseline - tabular->GetAscentOfRow(i) + 1; + w = tabular->GetWidthOfColumn(cell) - + tabular->GetAdditionalWidth(cell) - 1; + h = tabular->GetAscentOfRow(i) - the_locking_inset->ascent(bv, font); + pain.fillRectangle(tx, ty, w, h, backgroundColor()); +#if 0 } +#endif } x -= ADD_TO_TABULAR_WIDTH; x += width(bv, font); @@ -521,7 +533,7 @@ void InsetTabular::update(BufferView * bv, LyXFont const & font, bool reinit) need_update = INIT; break; case SELECTION: - need_update = INIT; + need_update = FULL; break; default: break; @@ -599,7 +611,7 @@ void InsetTabular::insetUnlock(BufferView * bv) void InsetTabular::updateLocal(BufferView * bv, UpdateCodes what, - bool mark_dirty) const + bool mark_dirty) const { if (what == INIT) { LyXFont font; @@ -607,9 +619,11 @@ void InsetTabular::updateLocal(BufferView * bv, UpdateCodes what, } if (need_update < what) // only set this if it has greater update need_update = what; +#if 0 // maybe this should not be done! if ((what == INIT) && hasSelection()) { clearSelection(); } +#endif // Dirty Cast! (Lgb) if (need_update != NONE) { bv->updateInset(const_cast(this), mark_dirty); @@ -645,9 +659,7 @@ bool InsetTabular::lockInsetInInset(BufferView * bv, UpdatableInset * inset) } if (in->getInsetFromID(id)) { actcell = i; - the_locking_inset = in; - locked = true; - resetPos(bv); + in->edit(bv); return the_locking_inset->lockInsetInInset(bv, inset); } } @@ -1018,27 +1030,37 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, updateLocal(bv, SELECTION, false); break; case LFUN_NEXT: { + UpdateCodes code = CURSOR; + if (hs) { + clearSelection(); + code = SELECTION; + } int column = actcol; unlockInsetInInset(bv, the_locking_inset); if (bv->text->first + bv->painter().paperHeight() < (top_baseline + tabular->GetHeightOfTabular())) { bv->scrollCB(bv->text->first + bv->painter().paperHeight()); - updateLocal(bv, FULL, false); + code = FULL; actcell = tabular->GetCellBelow(first_visible_cell) + column; } else { actcell = tabular->GetFirstCellInRow(tabular->rows() - 1) + column; } resetPos(bv); - updateLocal(bv, CURSOR, false); + updateLocal(bv, code, false); break; } case LFUN_PRIOR: { + UpdateCodes code = CURSOR; + if (hs) { + clearSelection(); + code = SELECTION; + } int column = actcol; unlockInsetInInset(bv, the_locking_inset); if (top_baseline < 0) { bv->scrollCB(bv->text->first - bv->painter().paperHeight()); - updateLocal(bv, FULL, false); + code = FULL; if (top_baseline > 0) actcell = column; else @@ -1047,7 +1069,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, actcell = column; } resetPos(bv); - updateLocal(bv, CURSOR, false); + updateLocal(bv, code, false); break; } // none of these make sense for insettabular, @@ -1111,7 +1133,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, while (p < len && ((p = clip.find_first_of("\t\n", p)) != string::npos)) { - switch(clip[p]) { + switch (clip[p]) { case '\t': ++cols; break; @@ -1135,7 +1157,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, (p = clip.find_first_of("\t\n", p)) != string::npos) { if (p >= len) break; - switch(clip[p]) { + switch (clip[p]) { case '\t': paste_tabular->GetCellInset(cell)->setText(clip.substr(op, p-op)); ++cols; @@ -1173,10 +1195,31 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, } // ATTENTION: the function above has to be PASTE and PASTESELECTION!!! default: + // handle font changing stuff on selection before we lock the inset + // in the default part! + result = UNDISPATCHED; + if (hs) { + switch(action) { + case LFUN_LANGUAGE: + case LFUN_EMPH: + case LFUN_BOLD: + case LFUN_NOUN: + case LFUN_CODE: + case LFUN_SANS: + case LFUN_ROMAN: + case LFUN_DEFAULT: + case LFUN_UNDERLINE: + case LFUN_FONT_SIZE: + if (bv->Dispatch(action, arg)) + result = DISPATCHED; + break; + default: + break; + } + } // we try to activate the actual inset and put this event down to // the insets dispatch function. - result = UNDISPATCHED; - if (the_locking_inset) + if ((result == DISPATCHED) || the_locking_inset) break; nodraw(true); if (activateCellInset(bv)) { @@ -1191,6 +1234,9 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, return UNDISPATCHED; } else if (hs) { clearSelection(); + // so the below CELL is not set because this is higher + // priority and we get a full redraw + need_update = SELECTION; } nodraw(false); updateLocal(bv, CELL, false); @@ -1226,7 +1272,12 @@ int InsetTabular::ascii(Buffer const * buf, ostream & os, int ll) const int InsetTabular::linuxdoc(Buffer const * buf, ostream & os) const { - return tabular->ascii(buf,os, (int)parOwner()->params().depth(), false, 0); + os << "ascii(buf,os, + (int)parOwner()->params().depth(), + false, 0); + os << "]]>"; + return ret; } @@ -2109,37 +2160,18 @@ int InsetTabular::getMaxWidthOfCell(BufferView * bv, int cell) const if (len.zero()) return -1; -#ifdef WITH_WARNINGS -#warning Remove use of VSpace as soon as LyXLength::inPixels exists (JMarc) -#endif - return VSpace(len).inPixels(bv); + return len.inPixels(latexTextWidth(bv), bv->text->defaultHeight()); } int InsetTabular::getMaxWidth(BufferView * bv, UpdatableInset const * inset) const { - int cell = tabular->cur_cell; - if (tabular->GetCellInset(cell) != inset) { - cell = actcell; - if (tabular->GetCellInset(cell) != inset) { - - lyxerr[Debug::INSETTEXT] << "Actcell not equal to actual cell!\n"; - cell = -1; - } - } - - int const n = tabular->GetNumberOfCells(); + int cell = tabular->GetCellFromInset(inset, actcell); if (cell == -1) { - for (cell = 0; cell < n; ++cell) { - if (tabular->GetCellInset(cell) == inset) - break; - } - } - - if (cell >= n) { - lyxerr << "Own inset not found, shouldn't really happen!\n"; + lyxerr << "Own inset not found, shouldn't really happen!" + << endl; return -1; } @@ -2365,7 +2397,7 @@ FuncStatus InsetTabular::getStatus(string const & what) const } -std::vector const InsetTabular::getLabelList() const +vector const InsetTabular::getLabelList() const { return tabular->getLabelList(); } @@ -2481,7 +2513,7 @@ bool InsetTabular::cutSelection() } -bool InsetTabular::isRightToLeft(BufferView *bv ) +bool InsetTabular::isRightToLeft(BufferView * bv) { return bv->getParentLanguage(this)->RightToLeft(); } @@ -2722,30 +2754,11 @@ bool InsetTabular::insetAllowed(Inset::Code code) const bool InsetTabular::forceDefaultParagraphs(Inset const * in) const { - int const n = tabular->GetNumberOfCells(); - static int last = 0; + const int cell = tabular->GetCellFromInset(in, actcell); - // maybe some speedup - if ((last < n) && tabular->GetCellInset(last) == in) { - if (tabular->GetPWidth(last+1).zero()) - return true; - return false; - } - if ((++last < n) && tabular->GetCellInset(last) == in) { - if (tabular->GetPWidth(last).zero()) - return true; - return false; - } + if (cell != -1) + return tabular->GetPWidth(cell).zero(); - for(int i=0; i < n; ++i) { - if (tabular->GetCellInset(i) == in) { - last = i; - if (tabular->GetPWidth(i).zero()) - return true; - return false; - } - } - last = 0; // well we didn't obviously find it so maybe our owner knows more if (owner()) return owner()->forceDefaultParagraphs(in);