X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsettabular.C;h=703c29742d7df88381a4166160ea3fd6acfcd7c0;hb=c130d5dbfd3f4d4a2721c9be786b7fa45b806aca;hp=2a4cca31209118e9ffd9b1246c1a15aba7dc4d43;hpb=86e4a9bc8aadab907061da24ca6c0f4b05198f7c;p=features.git diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 2a4cca3120..703c29742d 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -34,6 +34,7 @@ #include "LyXView.h" #include "insets/insettext.h" #include "frontends/Dialogs.h" +#include "frontends/Alert.h" #include "debug.h" #include "WorkArea.h" #include "gettext.h" @@ -139,6 +140,7 @@ InsetTabular::InsetTabular(Buffer const & buf, int rows, int columns) clearSelection(); need_update = INIT; in_update = false; + in_reset_pos = false; } @@ -146,7 +148,7 @@ InsetTabular::InsetTabular(InsetTabular const & tab, Buffer const & buf, bool same_id) : UpdatableInset(tab, same_id), buffer(&buf) { - tabular.reset(new LyXTabular(this, *(tab.tabular))); + tabular.reset(new LyXTabular(this, *(tab.tabular), same_id)); the_locking_inset = 0; locked = no_selection = false; oldcell = -1; @@ -154,6 +156,7 @@ InsetTabular::InsetTabular(InsetTabular const & tab, Buffer const & buf, sel_cell_start = sel_cell_end = 0; need_update = INIT; in_update = false; + in_reset_pos = false; } @@ -352,7 +355,7 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline, } i = tabular->row_of_cell(cell); if (the_locking_inset != tabular->GetCellInset(cell)) { - lyxerr[Debug::INSETS] << "ERROR this shouldn't happen\n"; + lyxerr[Debug::INSETTEXT] << "ERROR this shouldn't happen\n"; return; } float dx = nx + tabular->GetBeginningOfTextInCell(cell); @@ -523,7 +526,7 @@ void InsetTabular::edit(BufferView * bv, int x, int y, unsigned int button) UpdatableInset::edit(bv, x, y, button); if (!bv->lockInset(this)) { - lyxerr[Debug::INSETS] << "InsetTabular::Cannot lock inset" << endl; + lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl; return; } locked = true; @@ -544,7 +547,7 @@ void InsetTabular::edit(BufferView * bv, bool front) UpdatableInset::edit(bv, front); if (!bv->lockInset(this)) { - lyxerr[Debug::INSETS] << "InsetTabular::Cannot lock inset" << endl; + lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl; return; } locked = true; @@ -599,24 +602,24 @@ void InsetTabular::updateLocal(BufferView * bv, UpdateCodes what, bool InsetTabular::lockInsetInInset(BufferView * bv, UpdatableInset * inset) { - lyxerr[Debug::INSETS] << "InsetTabular::LockInsetInInset(" + lyxerr[Debug::INSETTEXT] << "InsetTabular::LockInsetInInset(" << inset << "): "; if (!inset) return false; oldcell = -1; if (inset == tabular->GetCellInset(actcell)) { - lyxerr[Debug::INSETS] << "OK" << endl; + lyxerr[Debug::INSETTEXT] << "OK" << endl; the_locking_inset = tabular->GetCellInset(actcell); resetPos(bv); return true; } else if (the_locking_inset && (the_locking_inset == inset)) { - lyxerr[Debug::INSETS] << "OK" << endl; + lyxerr[Debug::INSETTEXT] << "OK" << endl; resetPos(bv); } else if (the_locking_inset) { - lyxerr[Debug::INSETS] << "MAYBE" << endl; + lyxerr[Debug::INSETTEXT] << "MAYBE" << endl; return the_locking_inset->lockInsetInInset(bv, inset); } - lyxerr[Debug::INSETS] << "NOT OK" << endl; + lyxerr[Debug::INSETTEXT] << "NOT OK" << endl; return false; } @@ -878,6 +881,12 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, updateLocal(bv, CELL, false); the_locking_inset->toggleInsetCursor(bv); return result; + } else if (result == FINISHED_UP) { + action = LFUN_UP; + } else if (result == FINISHED_DOWN) { + action = LFUN_DOWN; + } else if (result == FINISHED_RIGHT) { + action = LFUN_RIGHT; } } @@ -1028,7 +1037,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, int cols = 1; int rows = 1; int maxCols = 1; - unsigned int len = clip.length(); + string::size_type len = clip.length(); string::size_type p = 0; while(p < len && @@ -1105,7 +1114,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, // reset need_update setted in above function! need_update = NONE; result = the_locking_inset->localDispatch(bv, action, arg); - if ((result == UNDISPATCHED) || (result == FINISHED)) { + if ((result == UNDISPATCHED) || (result >= FINISHED)) { unlockInsetInInset(bv, the_locking_inset); nodraw(false); the_locking_inset = 0; @@ -1121,7 +1130,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, } break; } - if (result!=FINISHED) { + if (result < FINISHED) { if (!the_locking_inset) { showInsetCursor(bv); } @@ -1145,15 +1154,33 @@ int InsetTabular::ascii(Buffer const * buf, ostream & os, int) const } -int InsetTabular::linuxdoc(Buffer const *, ostream &) const +int InsetTabular::linuxdoc(Buffer const * buf, ostream & os) const { - return 0; + return tabular->Ascii(buf,os); } -int InsetTabular::docBook(Buffer const * buf, ostream & os) const +int InsetTabular::docbook(Buffer const * buf, ostream & os) const { - return tabular->DocBook(buf,os); + int ret = 0; + Inset * master; + + // if the table is inside a float it doesn't need the informaltable + // wrapper. Search for it. + for(master = owner(); + master && master->lyxCode() != Inset::FLOAT_CODE; + master = master->owner()); + + if (!master) { + os << "\n"; + ret++; + } + ret+= tabular->DocBook(buf,os); + if (!master) { + os << "\n"; + ret++; + } + return ret; } @@ -1196,7 +1223,7 @@ bool InsetTabular::calculate_dimensions_of_cells(BufferView * bv, continue; ++cell; inset = tabular->GetCellInset(cell); - if (!reinit) + if (!reinit && !tabular->GetPWidth(cell).empty()) inset->update(bv, font, false); maxAsc = max(maxAsc, inset->ascent(bv, font)); maxDesc = max(maxDesc, inset->descent(bv, font)); @@ -1323,8 +1350,14 @@ int InsetTabular::getCellXPos(int cell) const void InsetTabular::resetPos(BufferView * bv) const { - if (!locked) + if (!locked || nodraw()) return; +#warning This should be fixed in the right manner (20011128 Jug) + // fast hack to fix infinite repaintings! + if (in_reset_pos) + return; + in_reset_pos = true; + actcol = tabular->column_of_cell(actcell); int cell = 0; @@ -1388,6 +1421,7 @@ void InsetTabular::resetPos(BufferView * bv) const bv->owner()->getDialogs()->updateTabular(inset); oldcell = actcell; } + in_reset_pos = false; } @@ -1400,7 +1434,7 @@ UpdatableInset::RESULT InsetTabular::moveRight(BufferView * bv, bool lock) bool moved = isRightToLeft(bv) ? movePrevCell(bv) : moveNextCell(bv); if (!moved) - return FINISHED; + return FINISHED_RIGHT; if (lock && activateCellInset(bv)) return DISPATCHED; } @@ -1428,7 +1462,7 @@ UpdatableInset::RESULT InsetTabular::moveUp(BufferView * bv, bool lock) int const ocell = actcell; actcell = tabular->GetCellAbove(actcell); if (actcell == ocell) // we moved out of the inset - return FINISHED; + return FINISHED_UP; resetPos(bv); if (lock) { int x = 0; @@ -1449,7 +1483,7 @@ UpdatableInset::RESULT InsetTabular::moveDown(BufferView * bv, bool lock) int const ocell = actcell; actcell = tabular->GetCellBelow(actcell); if (actcell == ocell) // we moved out of the inset - return FINISHED; + return FINISHED_DOWN; resetPos(bv); if (lock) { int x = 0; @@ -1523,7 +1557,7 @@ bool InsetTabular::movePrevCell(BufferView * bv, bool lock) } -bool InsetTabular::deletable() +bool InsetTabular::deletable() const { return true; } @@ -1638,10 +1672,11 @@ void InsetTabular::tabularFeatures(BufferView * bv, bv->text->cursor.par(), bv->text->cursor.par()->next()); - int row = tabular->row_of_cell(actcell); + LyXTabular::ltType ltt; + int row = ltt.row = tabular->row_of_cell(actcell); int column = tabular->column_of_cell(actcell); bool flag = true; - + switch (feature) { case LyXTabular::SET_PWIDTH: { @@ -1692,7 +1727,7 @@ void InsetTabular::tabularFeatures(BufferView * bv, for(int i = sel_row_start; i <= sel_row_end; ++i) { tabular->DeleteRow(sel_row_start); } - if ((sel_row_start) > tabular->rows()) + if (sel_row_start >= tabular->rows()) --sel_row_start; actcell = tabular->GetCellNumber(sel_row_start, column); clearSelection(); @@ -1703,7 +1738,7 @@ void InsetTabular::tabularFeatures(BufferView * bv, for(int i = sel_col_start; i <= sel_col_end; ++i) { tabular->DeleteColumn(sel_col_start); } - if ((sel_col_start+1) > tabular->columns()) + if (sel_col_start >= tabular->columns()) --sel_col_start; actcell = tabular->GetCellNumber(row, sel_col_start); clearSelection(); @@ -1800,7 +1835,7 @@ void InsetTabular::tabularFeatures(BufferView * bv, case LyXTabular::MULTICOLUMN: { if (sel_row_start != sel_row_end) { - WriteAlert(_("Impossible Operation!"), + Alert::alert(_("Impossible Operation!"), _("Multicolumns can only be horizontally."), _("Sorry.")); return; @@ -1882,17 +1917,25 @@ void InsetTabular::tabularFeatures(BufferView * bv, tabular->GetCellNumber(i, j), val); break; } + case LyXTabular::UNSET_LTFIRSTHEAD: + ltt.row = 0; case LyXTabular::SET_LTFIRSTHEAD: - tabular->SetLTHead(actcell, true); + tabular->SetLTHead(ltt, true); break; + case LyXTabular::UNSET_LTHEAD: + ltt.row = 0; case LyXTabular::SET_LTHEAD: - tabular->SetLTHead(actcell, false); + tabular->SetLTHead(ltt, false); break; + case LyXTabular::UNSET_LTFOOT: + ltt.row = 0; case LyXTabular::SET_LTFOOT: - tabular->SetLTFoot(actcell, false); + tabular->SetLTFoot(ltt, false); break; + case LyXTabular::UNSET_LTLASTFOOT: + ltt.row = 0; case LyXTabular::SET_LTLASTFOOT: - tabular->SetLTFoot(actcell, true); + tabular->SetLTFoot(ltt, true); break; case LyXTabular::SET_LTNEWPAGE: { @@ -1964,7 +2007,7 @@ int InsetTabular::getMaxWidth(BufferView * bv, cell = actcell; if (tabular->GetCellInset(cell) != inset) { - lyxerr << "Actcell not equal to actual cell!\n"; + lyxerr[Debug::INSETTEXT] << "Actcell not equal to actual cell!\n"; cell = -1; } } @@ -2084,6 +2127,7 @@ func_status::value_type InsetTabular::getStatus(string const & what) const int sel_row_start; int sel_row_end; int dummy; + LyXTabular::ltType dummyltt; bool flag = true; if (hasSelection()) { @@ -2238,25 +2282,25 @@ func_status::value_type InsetTabular::getStatus(string const & what) const status |= func_status::ToggleOff; break; case LyXTabular::SET_LTFIRSTHEAD: - if (tabular->GetRowOfLTHead(actcell, dummy)) + if (tabular->GetRowOfLTHead(actcell, dummyltt)) status |= func_status::ToggleOn; else status |= func_status::ToggleOff; break; case LyXTabular::SET_LTHEAD: - if (tabular->GetRowOfLTHead(actcell, dummy)) + if (tabular->GetRowOfLTHead(actcell, dummyltt)) status |= func_status::ToggleOn; else status |= func_status::ToggleOff; break; case LyXTabular::SET_LTFOOT: - if (tabular->GetRowOfLTFoot(actcell, dummy)) + if (tabular->GetRowOfLTFoot(actcell, dummyltt)) status |= func_status::ToggleOn; else status |= func_status::ToggleOff; break; case LyXTabular::SET_LTLASTFOOT: - if (tabular->GetRowOfLTFoot(actcell, dummy)) + if (tabular->GetRowOfLTFoot(actcell, dummyltt)) status |= func_status::ToggleOn; else status |= func_status::ToggleOff; @@ -2458,6 +2502,14 @@ Paragraph * InsetTabular::firstParagraph() const } +Paragraph * InsetTabular::getFirstParagraph(int i) const +{ + return (i < tabular->GetNumberOfCells()) + ? tabular->GetCellInset(i)->getFirstParagraph(0) + : 0; +} + + LyXCursor const & InsetTabular::cursor(BufferView * bv) const { if (the_locking_inset) @@ -2482,10 +2534,10 @@ Inset * InsetTabular::getInsetFromID(int id_arg) const } -string const InsetTabular::selectNextWord(BufferView * bv, float & value) const +string const InsetTabular::selectNextWordToSpellcheck(BufferView * bv, float & value) const { if (the_locking_inset) { - string const str(the_locking_inset->selectNextWord(bv, value)); + string const str(the_locking_inset->selectNextWordToSpellcheck(bv, value)); if (!str.empty()) return str; if (tabular->IsLastCell(actcell)) { @@ -2512,7 +2564,7 @@ string InsetTabular::selectNextWordInt(BufferView * bv, float & value) const // when entering this function the inset should be ALWAYS locked! lyx::Assert(the_locking_inset); - string const str(the_locking_inset->selectNextWord(bv, value)); + string const str(the_locking_inset->selectNextWordToSpellcheck(bv, value)); if (!str.empty()) return str; @@ -2524,7 +2576,7 @@ string InsetTabular::selectNextWordInt(BufferView * bv, float & value) const // otherwise we have to lock the next inset and ask for it's selecttion UpdatableInset * inset = static_cast(tabular->GetCellInset(++actcell)); - inset->edit(bv, 0, 0, 0); + inset->edit(bv); return selectNextWordInt(bv, value); }