#include "TextClass.h"
-#include "BaseClassList.h"
+#include "LayoutFile.h"
#include "Color.h"
#include "Counters.h"
#include "Floating.h"
#include "support/lstrings.h"
#include "support/os.h"
+#include <algorithm>
#include <sstream>
+#include "boost/assert.hpp"
+
using namespace std;
using namespace lyx::support;
namespace {
-class LayoutNamesEqual : public unary_function<LayoutPtr, bool> {
+class LayoutNamesEqual : public unary_function<Layout, bool> {
public:
LayoutNamesEqual(docstring const & name)
: name_(name)
{}
- bool operator()(LayoutPtr const & c) const
+ bool operator()(Layout const & c) const
{
- return c->name() == name_;
+ return c.name() == name_;
}
private:
docstring name_;
TextClass::TextClass()
{
- floatlist_ = boost::shared_ptr<FloatList>(new FloatList);
- counters_ = boost::shared_ptr<Counters>(new Counters);
outputType_ = LATEX;
columns_ = 1;
sides_ = OneSide;
// The only way this happens is because the hardcoded layout above
// is wrong.
BOOST_ASSERT(false);
- }
- layoutlist_.push_back(boost::shared_ptr<Layout>(new Layout(lay)));
+ };
+ layoutlist_.push_back(lay);
}
Lexer lexrc(textClassTags,
//error to true, since we couldn't even read the name?
error = !readStyle(lexrc, lay);
} else if (hasLayout(name)) {
- Layout * lay = operator[](name).get();
- error = !readStyle(lexrc, *lay);
+ Layout & lay = operator[](name);
+ error = !readStyle(lexrc, lay);
} else {
Layout lay;
lay.setName(name);
lay.is_environment = true;
error = !readStyle(lexrc, lay);
if (!error)
- layoutlist_.push_back(boost::shared_ptr<Layout>(new Layout(lay)));
+ layoutlist_.push_back(lay);
if (defaultlayout_.empty()) {
// We do not have a default layout yet, so we choose
case TC_NOFLOAT:
if (lexrc.next()) {
string const nofloat = lexrc.getString();
- floatlist_->erase(nofloat);
+ floatlist_.erase(nofloat);
}
break;
}
min_toclevel_ = Layout::NOT_IN_TOC;
max_toclevel_ = Layout::NOT_IN_TOC;
- DocumentClass::const_iterator lit = begin();
- DocumentClass::const_iterator len = end();
+ const_iterator lit = begin();
+ const_iterator len = end();
for (; lit != len; ++lit) {
- Layout const & lt = **lit;
- int const toclevel = lt.toclevel;
+ int const toclevel = lit->toclevel;
if (toclevel != Layout::NOT_IN_TOC) {
if (min_toclevel_ == Layout::NOT_IN_TOC)
min_toclevel_ = toclevel;
case FT_TYPE:
lexrc.next();
type = lexrc.getString();
- if (floatlist_->typeExist(type)) {
- Floating const & fl = floatlist_->getType(type);
+ if (floatlist_.typeExist(type)) {
+ Floating const & fl = floatlist_.getType(type);
placement = fl.placement();
ext = fl.ext();
within = fl.within();
if (getout) {
Floating fl(type, placement, ext, within,
style, name, listName, builtin);
- floatlist_->newFloat(fl);
+ floatlist_.newFloat(fl);
// each float has its own counter
- counters_->newCounter(from_ascii(type), from_ascii(within),
+ counters_.newCounter(from_ascii(type), from_ascii(within),
docstring(), docstring());
// also define sub-float counters
docstring const subtype = "sub-" + from_ascii(type);
- counters_->newCounter(subtype, from_ascii(type),
+ counters_.newCounter(subtype, from_ascii(type),
"\\alph{" + subtype + "}", docstring());
}
case CT_NAME:
lexrc.next();
name = lexrc.getDocString();
- if (counters_->hasCounter(name))
+ if (counters_.hasCounter(name))
LYXERR(Debug::TCLASS, "Reading existing counter " << to_utf8(name));
else
LYXERR(Debug::TCLASS, "Reading new counter " << to_utf8(name));
// Here if have a full counter if getout == true
if (getout)
- counters_->newCounter(name, within,
+ counters_.newCounter(name, within,
labelstring, labelstring_appendix);
lexrc.popTable();
-LayoutPtr const & TextClass::operator[](docstring const & name) const
+Layout const & TextClass::operator[](docstring const & name) const
+{
+ BOOST_ASSERT(!name.empty());
+
+ const_iterator it =
+ find_if(begin(), end(), LayoutNamesEqual(name));
+
+ if (it == end()) {
+ lyxerr << "We failed to find the layout '" << to_utf8(name)
+ << "' in the layout list. You MUST investigate!"
+ << endl;
+ for (const_iterator cit = begin(); cit != end(); ++cit)
+ lyxerr << " " << to_utf8(cit->name()) << endl;
+
+ // we require the name to exist
+ BOOST_ASSERT(false);
+ }
+
+ return *it;
+}
+
+
+Layout & TextClass::operator[](docstring const & name)
{
BOOST_ASSERT(!name.empty());
- LayoutList::const_iterator cit =
- find_if(layoutlist_.begin(),
- layoutlist_.end(),
- LayoutNamesEqual(name));
+ iterator it = find_if(begin(), end(), LayoutNamesEqual(name));
- if (cit == layoutlist_.end()) {
+ if (it == end()) {
lyxerr << "We failed to find the layout '" << to_utf8(name)
<< "' in the layout list. You MUST investigate!"
<< endl;
- for (LayoutList::const_iterator it = layoutlist_.begin();
- it != layoutlist_.end(); ++it)
- lyxerr << " " << to_utf8(it->get()->name()) << endl;
+ for (const_iterator cit = begin(); cit != end(); ++cit)
+ lyxerr << " " << to_utf8(cit->name()) << endl;
// we require the name to exist
BOOST_ASSERT(false);
}
- return *cit;
+ return *it;
}
InsetLayout const & DocumentClass::insetLayout(docstring const & name) const
{
docstring n = name;
+ InsetLayouts::const_iterator cen = insetlayoutlist_.end();
while (!n.empty()) {
- if (insetlayoutlist_.count(n) > 0)
- return insetlayoutlist_[n];
+ InsetLayouts::const_iterator cit = insetlayoutlist_.lower_bound(n);
+ if (cit != cen && cit->first == n)
+ return cit->second;
size_t i = n.find(':');
if (i == string::npos)
break;
}
-LayoutPtr const & TextClass::defaultLayout() const
+Layout const & TextClass::defaultLayout() const
{
return operator[](defaultLayoutName());
}
+bool TextClass::isDefaultLayout(Layout const & lay) const
+{
+ return lay.name() == defaultLayoutName();
+}
+
+
+bool TextClass::isEmptyLayout(Layout const & lay) const
+{
+ return lay.name() == emptyLayoutName();
+}
+
+
DocumentClass & DocumentClassBundle::newClass(LayoutFile const & baseClass)
{
- DocumentClass dc(baseClass);
+ DocumentClass * dc = new DocumentClass(baseClass);
tc_list_.push_back(dc);
- return tc_list_.back();
+ return *tc_list_.back();
}
LayoutList::const_iterator it = layoutlist_.begin();
LayoutList::const_iterator end = layoutlist_.end();
for (; it != end; ++it)
- if (it->get()->latexname() == lay)
+ if (it->latexname() == lay)
return true;
return false;
}