#include "encoding.h"
#include "ParameterStruct.h"
#include "gettext.h"
-#include "lyxtextclasslist.h"
#include "insets/insetinclude.h"
#include "insets/insetbib.h"
#include "insets/insettext.h"
+#include "insets/insetoptarg.h"
#include "support/filetools.h"
#include "support/lstrings.h"
using lyx::pos_type;
-int tex_code_break_column = 72; // needs non-zero initialization. set later.
// this is a bad idea, but how can Paragraph find its buffer to get
// parameters? (JMarc)
Paragraph::Paragraph()
: pimpl_(new Paragraph::Pimpl(this))
{
- for (int i = 0; i < 10; ++i)
- setCounter(i, 0);
+#ifndef NO_NEXT
next_ = 0;
previous_ = 0;
+#endif
enumdepth = 0;
itemdepth = 0;
bibkey = 0; // ale970302
}
+#ifndef NO_NEXT
// This constructor inserts the new paragraph in a list.
Paragraph::Paragraph(Paragraph * par)
: pimpl_(new Paragraph::Pimpl(this))
{
- for (int i = 0; i < 10; ++i)
- setCounter(i, 0);
enumdepth = 0;
itemdepth = 0;
bibkey = 0; // ale970302
params().clear();
}
+#endif
Paragraph::Paragraph(Paragraph const & lp, bool same_ids)
: pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this, same_ids))
{
- for (int i = 0; i < 10; ++i)
- setCounter(i, 0);
enumdepth = 0;
itemdepth = 0;
+#ifndef NO_NEXT
next_ = 0;
previous_ = 0;
-
+#endif
// this is because of the dummy layout of the paragraphs that
// follow footnotes
layout_ = lp.layout();
// copy everything behind the break-position to the new paragraph
insetlist = lp.insetlist;
- for (InsetList::iterator it = insetlist.begin();
- it != insetlist.end(); ++it)
- {
- it->inset = it->inset->clone(*current_view->buffer(), same_ids);
+ InsetList::iterator it = insetlist.begin();
+ InsetList::iterator end = insetlist.end();
+ for (; it != end; ++it) {
+ it.setInset(it.getInset()->clone(*current_view->buffer(),
+ same_ids));
// tell the new inset who is the boss now
- it->inset->parOwner(this);
+ it.getInset()->parOwner(this);
}
}
// the destructor removes the new paragraph from the list
Paragraph::~Paragraph()
{
+#ifndef NO_NEXT
if (previous_)
previous_->next_ = next_;
if (next_)
next_->previous_ = previous_;
-
- for (InsetList::iterator it = insetlist.begin();
- it != insetlist.end(); ++it) {
- delete it->inset;
- }
+#endif
// ale970302
delete bibkey;
}
-void Paragraph::writeFile(Buffer const * buf, ostream & os,
+void Paragraph::write(Buffer const * buf, ostream & os,
BufferParams const & bparams,
- depth_type dth) const
+ depth_type & dth) const
{
// The beginning or end of a deeper (i.e. nested) area?
if (dth != params().depth()) {
break;
}
}
-
- // now write the next paragraph
- if (next_)
- next_->writeFile(buf, os, bparams, dth);
}
minibuffer_inset = 0;
if (minibuffer_char == Paragraph::META_INSET) {
if (getInset(pos)) {
- minibuffer_inset = getInset(pos);
- // This is a little hack since I want exactly
- // the inset, not just a clone. Otherwise
- // the inset would be deleted when calling Erase(pos)
- // find the entry
- InsetList::iterator it = insetlist.begin();
- InsetList::iterator end = insetlist.end();
- for (; it != end; ++it) {
- if (it->pos == pos)
- break;
- }
-
- if (it != end && it->pos == pos)
- it->inset = 0;
// the inset is not in a paragraph anymore
+ minibuffer_inset = insetlist.release(pos);
minibuffer_inset->parOwner(0);
} else {
minibuffer_inset = 0;
{
lyx::Assert(pos < size());
- // Find the inset.
- InsetList::iterator it = insetlist.begin();
- InsetList::iterator end = insetlist.end();
- for (; it != end; ++it) {
- if (it->pos == pos)
- break;
- }
-
- if (it != end && it->pos == pos)
- return it->inset;
-
- lyxerr << "ERROR (Paragraph::getInset): "
- << "Inset does not exist: " << pos << endl;
- //::raise(SIGSTOP);
-
- // text[pos] = ' '; // WHY!!! does this set the pos to ' '????
- // Did this commenting out introduce a bug? So far I have not
- // see any, please enlighten me. (Lgb)
- // My guess is that since the inset does not exist, we might
- // as well replace it with a space to prevent craches. (Asger)
- return 0;
+ return insetlist.get(pos);
}
{
lyx::Assert(pos < size());
- // Find the inset.
- InsetList::const_iterator cit = insetlist.begin();
- InsetList::const_iterator end = insetlist.end();
- for (; cit != end; ++cit) {
- if (cit->pos == pos)
- break;
- }
-
- if (cit != end && cit->pos == pos)
- return cit->inset;
-
- lyxerr << "ERROR (Paragraph::getInset): "
- << "Inset does not exist: " << pos << endl;
- //::raise(SIGSTOP);
- //text[pos] = ' '; // WHY!!! does this set the pos to ' '????
- // Did this commenting out introduce a bug? So far I have not
- // see any, please enlighten me. (Lgb)
- // My guess is that since the inset does not exist, we might
- // as well replace it with a space to prevent craches. (Asger)
- return 0;
+ return insetlist.get(pos);
}
LyXFont retfont;
if (cit != end) {
retfont = cit->font();
- } else if (pos == size() && size()) {
+ } else if (pos == size() && !empty()) {
retfont = getFontSettings(bparams, pos - 1);
} else
retfont = LyXFont(LyXFont::ALL_INHERIT, getParLanguage(bparams));
// Gets uninstantiated font setting at position 0
LyXFont const Paragraph::getFirstFontSettings() const
{
- if (size() > 0 && !pimpl_->fontlist.empty())
+ if (!empty() && !pimpl_->fontlist.empty())
return pimpl_->fontlist[0].font();
return LyXFont(LyXFont::ALL_INHERIT);
// Merge the singleton block with the next block
pimpl_->fontlist.erase(pimpl_->fontlist.begin() + i);
if (i > 0 && pimpl_->fontlist[i - 1].font() == font)
- pimpl_->fontlist.erase(pimpl_->fontlist.begin() + i-1);
+ pimpl_->fontlist.erase(pimpl_->fontlist.begin() + i - 1);
} else if (i > 0 && pimpl_->fontlist[i - 1].font() == font) {
// Merge the singleton block with the previous block
pimpl_->fontlist[i - 1].pos(pos);
}
-
+#ifndef NO_NEXT
void Paragraph::next(Paragraph * p)
{
next_ = p;
{
return previous_;
}
-
-
-void Paragraph::breakParagraph(BufferParams const & bparams,
- pos_type pos,
- int flag)
-{
- // create a new paragraph
- Paragraph * tmp = new Paragraph(this);
- tmp->layout(textclasslist[bparams.textclass].defaultLayout());
- // remember to set the inset_owner
- tmp->setInsetOwner(inInset());
-
- // this is an idea for a more userfriendly layout handling, I will
- // see what the users say
-
- // layout stays the same with latex-environments
- if (flag) {
- tmp->layout(layout());
- tmp->setLabelWidthString(params().labelWidthString());
- }
-
- bool isempty = (layout()->keepempty && !size());
-
- if (!isempty && (size() > pos || !size() || flag == 2)) {
- tmp->layout(layout());
- tmp->params().align(params().align());
- tmp->setLabelWidthString(params().labelWidthString());
-
- tmp->params().lineBottom(params().lineBottom());
- params().lineBottom(false);
- tmp->params().pagebreakBottom(params().pagebreakBottom());
- params().pagebreakBottom(false);
- tmp->params().spaceBottom(params().spaceBottom());
- params().spaceBottom(VSpace(VSpace::NONE));
-
- tmp->params().depth(params().depth());
- tmp->params().noindent(params().noindent());
-
- // copy everything behind the break-position
- // to the new paragraph
- pos_type pos_end = size() - 1;
- pos_type i = pos;
- pos_type j = pos;
- for (; i <= pos_end; ++i) {
- cutIntoMinibuffer(bparams, i);
- if (tmp->insertFromMinibuffer(j - pos))
- ++j;
- }
- for (i = pos_end; i >= pos; --i) {
- erase(i);
- }
- }
-
- // just an idea of me
- if (!isempty && !pos) {
- tmp->params().lineTop(params().lineTop());
- tmp->params().pagebreakTop(params().pagebreakTop());
- tmp->params().spaceTop(params().spaceTop());
- tmp->bibkey = bibkey;
-
- bibkey = 0;
- params().clear();
-
- layout(textclasslist[bparams.textclass].defaultLayout());
-
- // layout stays the same with latex-environments
- if (flag) {
- layout(tmp->layout());
- setLabelWidthString(tmp->params().labelWidthString());
- params().depth(tmp->params().depth());
- }
- }
-}
+#endif
void Paragraph::makeSameLayout(Paragraph const * par)
}
int i = 0;
- while (size() && (isNewline(0) || isLineSeparator(0))) {
+ while (!empty() && (isNewline(0) || isLineSeparator(0))) {
erase(0);
++i;
}
}
-void Paragraph::breakParagraphConservative(BufferParams const & bparams,
- pos_type pos)
-{
- // create a new paragraph
- Paragraph * tmp = new Paragraph(this);
- tmp->makeSameLayout(this);
-
- // When can pos > Last()?
- // I guess pos == Last() is possible.
- if (size() > pos) {
- // copy everything behind the break-position to the new
- // paragraph
- pos_type pos_end = size() - 1;
-
- //pos_type i = pos;
- //pos_type j = pos;
- for (pos_type i = pos, j = pos; i <= pos_end; ++i) {
- cutIntoMinibuffer(bparams, i);
- if (tmp->insertFromMinibuffer(j - pos))
- ++j;
- }
-
- for (pos_type k = pos_end; k >= pos; --k) {
- erase(k);
- }
- }
-}
-
-
-// Be carefull, this does not make any check at all.
-// This method has wrong name, it combined this par with the next par.
-// In that sense it is the reverse of break paragraph. (Lgb)
-void Paragraph::pasteParagraph(BufferParams const & bparams)
-{
- // copy the next paragraph to this one
- Paragraph * the_next = next();
-
- // first the DTP-stuff
- params().lineBottom(the_next->params().lineBottom());
- params().spaceBottom(the_next->params().spaceBottom());
- params().pagebreakBottom(the_next->params().pagebreakBottom());
-
- pos_type pos_end = the_next->pimpl_->size() - 1;
- pos_type pos_insert = size();
-
- // ok, now copy the paragraph
- for (pos_type i = 0, j = 0; i <= pos_end; ++i) {
- the_next->cutIntoMinibuffer(bparams, i);
- if (insertFromMinibuffer(pos_insert + j))
- ++j;
- }
-
- // delete the next paragraph
- Paragraph * ppar = the_next->previous_;
- Paragraph * npar = the_next->next_;
- delete the_next;
- ppar->next(npar);
-}
-
-
int Paragraph::getEndLabel() const
{
Paragraph const * par = this;
}
-int Paragraph::getFirstCounter(int i) const
-{
- return pimpl_->counter_[i];
-}
-
-
// the next two functions are for the manual labels
string const Paragraph::getLabelWidthString() const
{
return newpar;
}
+
Paragraph * Paragraph::outerHook()
{
if (!getDepth())
return depthHook(depth_type(getDepth() - 1));
}
+
Paragraph const * Paragraph::outerHook() const
{
if (!getDepth())
}
-Paragraph::inset_iterator
-Paragraph::InsetIterator(pos_type pos)
+// returns -1 if inset not found
+int Paragraph::getPositionOfInset(Inset const * inset) const
{
+ // Find the entry.
InsetList::iterator it = insetlist.begin();
InsetList::iterator end = insetlist.end();
for (; it != end; ++it) {
- if (it->pos >= pos)
- break;
+ if (it.getInset() == inset) {
+ return it.getPos();
+ }
}
+ if (inset == bibkey)
+ return 0;
- return inset_iterator(it);
+ return -1;
}
+namespace {
-// returns -1 if inset not found
-int Paragraph::getPositionOfInset(Inset const * inset) const
+InsetOptArg * optArgInset(Paragraph const & par)
{
// Find the entry.
- InsetList::const_iterator cit = insetlist.begin();
- InsetList::const_iterator end = insetlist.end();
- for (; cit != end; ++cit) {
- if (cit->inset == inset) {
- return cit->pos;
+ InsetList::iterator it = par.insetlist.begin();
+ InsetList::iterator end = par.insetlist.end();
+ for (; it != end; ++it) {
+ Inset * ins = it.getInset();
+ if (ins->lyxCode() == Inset::OPTARG_CODE) {
+ return static_cast<InsetOptArg *>(ins);
}
}
- if (inset == bibkey)
- return 0;
-
- return -1;
+ return 0;
}
+} // end namespace
Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
BufferParams const & bparams,
texrow.newline();
}
- if (tex_code_break_column && style->isCommand()) {
+ if (style->isCommand()) {
os << '\n';
texrow.newline();
}
texrow.newline();
}
} else {
- style = textclasslist[bparams.textclass].defaultLayout();
+ style = bparams.getLyXTextClass().defaultLayout();
}
Language const * language = getParLanguage(bparams);
switch (style->latextype) {
case LATEX_COMMAND:
os << '\\'
- << style->latexname()
- << style->latexparam();
+ << style->latexname();
+
+ // Separate handling of optional argument inset.
+ if (style->optionalargs == 1) {
+ InsetOptArg * it = optArgInset(*this);
+ if (it != 0)
+ it->latexOptional(buf, os, false, false);
+ }
+ else
+ os << style->latexparam();
break;
case LATEX_ITEM_ENVIRONMENT:
if (bibkey) {
// We do not need to use to change the font for the last paragraph
// or for a command.
LyXFont const font =
- (size() == 0
+ (empty()
? getLayoutFont(bparams) : getFont(bparams, size() - 1));
bool is_command = style->isCommand();
return next_;
}
+
// This could go to ParagraphParameters if we want to
int Paragraph::startTeXParParams(BufferParams const & bparams,
ostream & os, bool moving_arg) const
}
break;
}
-
+
switch (params().align()) {
case LYX_ALIGN_NONE:
case LYX_ALIGN_BLOCK:
return column;
}
+
// This could go to ParagraphParameters if we want to
int Paragraph::endTeXParParams(BufferParams const & bparams,
ostream & os, bool moving_arg) const
}
break;
}
-
+
switch (params().align()) {
case LYX_ALIGN_NONE:
case LYX_ALIGN_BLOCK:
(inInset() && inInset()->forceDefaultParagraphs(inInset()));
if (asdefault) {
- style = textclasslist[bparams.textclass].defaultLayout();
+ style = bparams.getLyXTextClass().defaultLayout();
} else {
style = layout();
}
texrow.start(this, 0);
// if the paragraph is empty, the loop will not be entered at all
- if (!size()) {
+ if (empty()) {
if (style->isCommand()) {
os << '{';
++column;
}
-bool Paragraph::sgmlConvertChar(char c, string & sgml_string)
-{
- bool retval = false;
- switch (c) {
- case Paragraph::META_HFILL:
- sgml_string.erase();
- break;
- case Paragraph::META_NEWLINE:
- sgml_string = '\n';
- break;
- case '&':
- sgml_string = "&";
- break;
- case '<':
- sgml_string = "<";
- break;
- case '>':
- sgml_string = ">";
- break;
- case '$':
- sgml_string = "$";
- break;
- case '#':
- sgml_string = "#";
- break;
- case '%':
- sgml_string = "%";
- break;
- case '[':
- sgml_string = "[";
- break;
- case ']':
- sgml_string = "]";
- break;
- case '{':
- sgml_string = "{";
- break;
- case '}':
- sgml_string = "}";
- break;
- case '~':
- sgml_string = "˜";
- break;
- case '"':
- sgml_string = """;
- break;
- case '\\':
- sgml_string = "\";
- break;
- case ' ':
- retval = true;
- sgml_string = ' ';
- break;
- case '\0': // Ignore :-)
- sgml_string.erase();
- break;
- default:
- sgml_string = c;
- break;
- }
- return retval;
-}
-
-
Paragraph * Paragraph::TeXEnvironment(Buffer const * buf,
BufferParams const & bparams,
ostream & os, TexRow & texrow)
Language const *
Paragraph::getParLanguage(BufferParams const & bparams) const
{
- if (size() > 0) {
+ if (!empty()) {
#ifndef INHERIT_LANGUAGE
return getFirstFontSettings().language();
#else
void Paragraph::setInsetOwner(Inset * i)
{
pimpl_->inset_owner = i;
- InsetList::const_iterator cit = insetlist.begin();
- InsetList::const_iterator end = insetlist.end();
- for (; cit != end; ++cit) {
- if (cit->inset)
- cit->inset->setOwner(i);
+ InsetList::iterator it = insetlist.begin();
+ InsetList::iterator end = insetlist.end();
+ for (; it != end; ++it) {
+ if (it.getInset())
+ it.getInset()->setOwner(i);
}
}
void Paragraph::deleteInsetsLyXText(BufferView * bv)
{
// then the insets
- InsetList::const_iterator cit = insetlist.begin();
- InsetList::const_iterator end = insetlist.end();
- for (; cit != end; ++cit) {
- if (cit->inset && cit->inset->isTextInset()) {
- static_cast<UpdatableInset *>
- (cit->inset)->deleteLyXText(bv, true);
- }
- }
+ insetlist.deleteInsetsLyXText(bv);
}
void Paragraph::resizeInsetsLyXText(BufferView * bv)
{
// then the insets
- InsetList::const_iterator cit = insetlist.begin();
- InsetList::const_iterator end = insetlist.end();
- for (; cit != end; ++cit) {
- if (cit->inset) {
- if (cit->inset->isTextInset()) {
- static_cast<UpdatableInset *>
- (cit->inset)->resizeLyXText(bv, true);
- }
- }
- }
+ insetlist.resizeInsetsLyXText(bv);
}
}
-Paragraph::value_type Paragraph::getChar(pos_type pos) const
+bool Paragraph::empty() const
{
- return pimpl_->getChar(pos);
+ return pimpl_->empty();
}
-int Paragraph::id() const
+Paragraph::value_type Paragraph::getChar(pos_type pos) const
{
- return pimpl_->id_;
+ return pimpl_->getChar(pos);
}
-void Paragraph::id(int id_arg)
+int Paragraph::id() const
{
- pimpl_->id_ = id_arg;
+ return pimpl_->id_;
}
pimpl_->clear();
}
-
-void Paragraph::setCounter(int i, int v)
-{
- pimpl_->counter_[i] = v;
-}
-
-
-int Paragraph::getCounter(int i) const
-{
- return pimpl_->counter_[i];
-}
-
-
-void Paragraph::incCounter(int i)
-{
- pimpl_->counter_[i]++;
-}
-
-
void Paragraph::setChar(pos_type pos, value_type c)
{
pimpl_->setChar(pos, c);
}
-Paragraph::inset_iterator::inset_iterator(Paragraph::InsetList::iterator const & iter)
- : it(iter)
-{}
-
-
-Paragraph::inset_iterator Paragraph::inset_iterator_begin()
-{
- return inset_iterator(insetlist.begin());
-}
-
-
-Paragraph::inset_iterator Paragraph::inset_iterator_end()
-{
- return inset_iterator(insetlist.end());
-}
-
-
ParagraphParameters & Paragraph::params()
{
return pimpl_->params;