#include "insets/insetinclude.h"
#include "insets/insetbib.h"
#include "insets/insettext.h"
+#include "insets/insetoptarg.h"
#include "support/filetools.h"
#include "support/lstrings.h"
Paragraph::Paragraph()
: pimpl_(new Paragraph::Pimpl(this))
{
+#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))
bibkey = 0; // ale970302
params().clear();
}
+#endif
Paragraph::Paragraph(Paragraph const & lp, bool same_ids)
{
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.setInset(it.getInset()->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.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_;
+#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.getPos() == pos)
- break;
- }
-
- if (it != end && it.getPos() == pos)
- it.setInset(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.getPos() == pos)
- break;
- }
-
- if (it != end && it.getPos() == pos)
- return it.getInset();
-
- 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);
}
// 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(bparams.getLyXTextClass().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 && empty());
-
- if (!isempty && (size() > pos || empty() || 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(bparams.getLyXTextClass().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)
}
-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())
return -1;
}
+namespace {
+
+InsetOptArg * optArgInset(Paragraph const & par)
+{
+ // Find the entry.
+ 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);
+ }
+ }
+ return 0;
+}
+
+} // end namespace
Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
BufferParams const & 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) {
return next_;
}
+
// This could go to ParagraphParameters if we want to
int Paragraph::startTeXParParams(BufferParams const & bparams,
ostream & os, bool moving_arg) const
return column;
}
+
// This could go to ParagraphParameters if we want to
int Paragraph::endTeXParParams(BufferParams const & bparams,
ostream & os, bool moving_arg) const
return (pimpl_->inset_owner->owner()->lyxCode() == Inset::ERT_CODE);
return false;
}
-
-
-Counters & Paragraph::counters()
-{
- return pimpl_->ctrs;
-}