X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftexrow.C;h=84d9c7ce009cdb11c7198477d50702135ab064da;hb=98c966c64594611e469313314abd1e59524adb4a;hp=7399843df0f5532b36697d4eb823a600b89a01a8;hpb=35584afc1162dec2cf9fff79305e95cb3b75aefb;p=lyx.git diff --git a/src/texrow.C b/src/texrow.C index 7399843df0..84d9c7ce00 100644 --- a/src/texrow.C +++ b/src/texrow.C @@ -1,117 +1,121 @@ /* This file is part of * ====================================================== - * + * * LyX, The Document Processor - * - * Copyright (C) 1995 Matthias Ettrich - * Copyright (C) 1995-1999 The LyX Team. * - * ======================================================*/ + * Copyright 1995 Matthias Ettrich + * Copyright 1995-2001 The LyX Team. + * + * ====================================================== */ #include +#include + #ifdef __GNUG__ #pragma implementation #endif #include "texrow.h" -#include "lyxparagraph.h" +#include "paragraph.h" #include "debug.h" +using std::find_if; +using std::endl; + // Delete linked list void TexRow::reset() { - TexRow_Item *current, *iter = next; - while (iter) { - // Iterate through the list deleting as you go. - // A bit easier to debug than recursive deletion. - current = iter; - iter = iter->next; - delete current; - } + rowlist.clear(); count = 0; - next = 0; lastpar = 0; lastpos = -1; } + // Defines paragraph and position for the beginning of this row -void TexRow::start(LyXParagraph *par, int pos) { +void TexRow::start(Paragraph * par, int pos) +{ lastpar = par; lastpos = pos; } + // Insert node when line is completed void TexRow::newline() { - TexRow_Item *tmp = new TexRow_Item; - tmp->pos = lastpos; - + RowItem tmp; + tmp.pos(lastpos); if (lastpar) - tmp->id = lastpar->GetID(); + tmp.id(lastpar->id()); else - tmp->id = -1; - - // Inserts at the beginning of the list - tmp->next = next; - next = tmp; - count++; - tmp->rownumber = count; + tmp.id(-1); + tmp.rownumber(++count); + rowlist.push_back(tmp); } -void TexRow::getIdFromRow(int row, int &id, int &pos) -{ - TexRow_Item *tmp = next; - while (tmp && tmp->rownumber != row) { - tmp = tmp->next; +class same_rownumber { +public: + same_rownumber(TexRow::RowList::value_type const & v):vt(v) {} + bool operator()(TexRow::RowList::value_type const & vt1) const { + return vt.rownumber() == vt1.rownumber(); } - if (tmp) { - TexRow_Item *tmp2 = next; - // Increase the pos of all rows with the - // same id (and where the pos is larger) - // to avoid putting errorinsets at the - // same pos. - while (tmp2) { - if (tmp2 != tmp && - tmp2->id == tmp->id && - tmp2->pos >= tmp->pos) - tmp2->pos++; - tmp2 = tmp2->next; - } - id = tmp->id; - pos = tmp->pos; - } else { - id = -1; - pos = 0; +private: + TexRow::RowList::value_type const & vt; +}; + + + +bool TexRow::getIdFromRow(int row, int & id, int & pos) const +{ + RowList::value_type vt; + vt.rownumber(row); + RowList::const_iterator cit = + find_if(rowlist.begin(), rowlist.end(), same_rownumber(vt)); + + if (cit != rowlist.end()) { + id = cit->id(); + pos = cit->pos(); + return true; } + id = -1; + pos = 0; + return false; } -TexRow & TexRow::operator+=(const TexRow &tr) +// should perhaps have a better name... +// Increase the pos of all rows with the +// same id (and where the pos is larger) +// to avoid putting errorinsets at the +// same pos. +void TexRow::increasePos(int id, int pos) const { - // remember that the lists are stored in reverse - // so you've got to turn the second one around - // as you insert it in the first - for (int counter = tr.count; counter > 0; --counter) { - int i = 1; - TexRow_Item *iter = tr.next; - while (i < counter) { - iter = iter->next; - ++i; + RowList::iterator kit = rowlist.begin(); + RowList::iterator end = rowlist.end(); + for (; kit != end; ++kit) { + if (id == kit->id() + && pos < kit->pos()) { + kit->pos(kit->pos() + 1); + lyxerr[Debug::INFO] + << "TeXRow::increasePos: ideally this " + "should never happen..." << endl; + } + // When verified to work this clause should be deleted. + if (id == kit->id() + && pos == kit->pos()) { + lyxerr[Debug::INFO] + << "TexRow::increasePos: this should happen " + "maximum one time for each run of " + "increasePos!" << endl; } - - ++count; - TexRow_Item *tmp; - tmp = new TexRow_Item; - tmp->id = iter->id; - tmp->pos = iter->pos; - tmp->next = next; - tmp->rownumber = count; - next = tmp; } - // should I be doing this or not? - //lastpar = tr.lastpar; - //lastpos = tr.lastpos; +} + + +TexRow & TexRow::operator+= (TexRow const & tr) +{ + rowlist.insert(rowlist.end(), tr.rowlist.begin(), tr.rowlist.end()); return *this; -} +}