#include "factory.h"
#include "Buffer.h"
-#include "BufferView.h"
#include "BufferParams.h"
-#include "debug.h"
#include "FloatList.h"
#include "FuncRequest.h"
#include "Lexer.h"
#include "LyX.h"
+#include "TextClass.h"
#include "insets/InsetBibitem.h"
#include "insets/InsetBibtex.h"
#include "insets/InsetBox.h"
#include "insets/InsetBranch.h"
#include "insets/InsetOptArg.h"
-#include "insets/InsetPagebreak.h"
+#include "insets/InsetNewpage.h"
#include "insets/InsetRef.h"
#include "insets/InsetSpace.h"
#include "insets/InsetTabular.h"
#include "frontends/alert.h"
+#include "support/debug.h"
#include "support/lstrings.h"
#include "support/ExceptionMessage.h"
#include <boost/assert.hpp>
-#include <boost/current_function.hpp>
#include <sstream>
-using std::auto_ptr;
-using std::endl;
-using std::string;
-
+using namespace std;
+using namespace lyx::support;
namespace lyx {
namespace Alert = frontend::Alert;
-using support::compare_ascii_no_case;
-
-Inset * createInset(BufferView * bv, FuncRequest const & cmd)
+Inset * createInsetHelper(Buffer & buf, FuncRequest const & cmd)
{
- BufferParams const & params = bv->buffer().params();
+ BufferParams const & params = buf.params();
try {
case LFUN_LINE_INSERT:
return new InsetLine;
+ case LFUN_NEWPAGE_INSERT:
+ return new InsetNewpage;
+
case LFUN_PAGEBREAK_INSERT:
return new InsetPagebreak;
case LFUN_FLEX_INSERT: {
string s = cmd.getArg(0);
- TextClass tclass = params.getTextClass();
- InsetLayout il = tclass.insetlayout(from_utf8(s));
- return new InsetFlex(params, il);
+ return new InsetFlex(buf, buf.params().documentClassPtr(), s);
}
case LFUN_NOTE_INSERT: {
string arg = cmd.getArg(0);
if (arg.empty())
arg = "Note";
- return new InsetNote(params, arg);
+ return new InsetNote(buf, arg);
}
case LFUN_BOX_INSERT: {
string arg = cmd.getArg(0);
if (arg.empty())
arg = "Boxed";
- return new InsetBox(params, arg);
+ return new InsetBox(buf, arg);
}
case LFUN_BRANCH_INSERT: {
docstring arg = cmd.argument();
if (arg.empty())
arg = from_ascii("none");
- return new InsetBranch(params, InsetBranchParams(arg));
+ return new InsetBranch(buf, InsetBranchParams(arg));
}
case LFUN_ERT_INSERT:
- return new InsetERT(params);
+ return new InsetERT(buf);
case LFUN_LISTING_INSERT:
- return new InsetListings(params);
+ return new InsetListings(buf);
case LFUN_FOOTNOTE_INSERT:
- return new InsetFoot(params);
+ return new InsetFoot(buf);
case LFUN_MARGINALNOTE_INSERT:
- return new InsetMarginal(params);
+ return new InsetMarginal(buf);
case LFUN_OPTIONAL_INSERT:
- return new InsetOptArg(params);
+ return new InsetOptArg(buf);
case LFUN_BIBITEM_INSERT:
return new InsetBibitem(InsetCommandParams(BIBITEM_CODE));
case LFUN_FLOAT_INSERT: {
// check if the float type exists
string const argument = to_utf8(cmd.argument());
- if (params.getTextClass().floats().typeExist(argument))
- return new InsetFloat(params, argument);
+ if (buf.params().documentClass().floats().typeExist(argument))
+ return new InsetFloat(buf, argument);
lyxerr << "Non-existent float type: " << argument << endl;
- return 0;
}
case LFUN_FLOAT_WIDE_INSERT: {
// check if the float type exists
string const argument = to_utf8(cmd.argument());
- if (params.getTextClass().floats().typeExist(argument)) {
- auto_ptr<InsetFloat> p(new InsetFloat(params, argument));
+ if (params.documentClass().floats().typeExist(argument)) {
+ auto_ptr<InsetFloat> p(new InsetFloat(buf, argument));
p->wide(true, params);
return p.release();
}
case LFUN_WRAP_INSERT: {
string const argument = to_utf8(cmd.argument());
if (argument == "figure" || argument == "table")
- return new InsetWrap(params, argument);
+ return new InsetWrap(buf, argument);
lyxerr << "Non-existent wrapfig type: " << argument << endl;
return 0;
}
case LFUN_INDEX_INSERT:
- return new InsetIndex(params);
+ return new InsetIndex(buf);
case LFUN_NOMENCL_INSERT: {
InsetCommandParams icp(NOMENCL_CODE);
- icp["symbol"] = cmd.argument().empty() ?
- bv->cursor().innerText()->getStringToIndex(bv->cursor()) :
- cmd.argument();
+ icp["symbol"] = cmd.argument();
return new InsetNomencl(icp);
}
case LFUN_TABULAR_INSERT: {
if (cmd.argument().empty())
return 0;
- std::istringstream ss(to_utf8(cmd.argument()));
+ istringstream ss(to_utf8(cmd.argument()));
int r = 0, c = 0;
ss >> r >> c;
if (r <= 0)
r = 2;
if (c <= 0)
c = 2;
- return new InsetTabular(bv->buffer(), r, c);
+ return new InsetTabular(buf, r, c);
}
- case LFUN_CAPTION_INSERT: {
- auto_ptr<InsetCaption> inset(new InsetCaption(params));
- inset->setAutoBreakRows(true);
- inset->setDrawFrame(true);
- inset->setFrameColor(Color_captionframe);
- return inset.release();
- }
+ case LFUN_CAPTION_INSERT:
+ return new InsetCaption(buf);
case LFUN_INDEX_PRINT:
return new InsetPrintIndex(InsetCommandParams(INDEX_PRINT_CODE));
return new InsetTOC(InsetCommandParams(TOC_CODE));
case LFUN_ENVIRONMENT_INSERT:
- return new InsetEnvironment(params, cmd.argument());
+ return new InsetEnvironment(buf, cmd.argument());
case LFUN_INFO_INSERT:
- return new InsetInfo(params, to_utf8(cmd.argument()));
-#if 0
- case LFUN_THEOREM_INSERT:
- return new InsetTheorem;
-#endif
+ return new InsetInfo(buf, to_utf8(cmd.argument()));
case LFUN_INSET_INSERT: {
string const name = cmd.getArg(0);
case ERT_CODE: {
InsetCollapsable::CollapseStatus st;
InsetERTMailer::string2params(to_utf8(cmd.argument()), st);
- return new InsetERT(params, st);
+ return new InsetERT(buf, st);
}
case LISTINGS_CODE: {
InsetListingsParams par;
InsetListingsMailer::string2params(to_utf8(cmd.argument()), par);
- return new InsetListings(params, par);
+ return new InsetListings(buf, par);
}
case EXTERNAL_CODE: {
- Buffer const & buffer = bv->buffer();
InsetExternalParams iep;
- InsetExternalMailer::string2params(to_utf8(cmd.argument()), buffer, iep);
+ InsetExternalMailer::string2params(to_utf8(cmd.argument()), buf, iep);
auto_ptr<InsetExternal> inset(new InsetExternal);
- inset->setParams(iep, buffer);
+ inset->setParams(iep);
return inset.release();
}
case GRAPHICS_CODE: {
- Buffer const & buffer = bv->buffer();
InsetGraphicsParams igp;
- InsetGraphicsMailer::string2params(to_utf8(cmd.argument()), buffer, igp);
+ InsetGraphicsMailer::string2params(to_utf8(cmd.argument()), buf, igp);
auto_ptr<InsetGraphics> inset(new InsetGraphics);
inset->setParams(igp);
return inset.release();
}
case INDEX_CODE:
- return new InsetIndex(params);
+ return new InsetIndex(buf);
case NOMENCL_CODE: {
InsetCommandParams icp(code);
case REF_CODE: {
InsetCommandParams icp(code);
InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), icp);
- return new InsetRef(icp, bv->buffer());
+ return new InsetRef(buf, icp);
}
case TOC_CODE: {
default:
lyxerr << "Inset '" << name << "' not permitted with LFUN_INSET_INSERT."
- << std::endl;
+ << endl;
return 0;
}
string const name = to_utf8(cmd.argument());
if (name == "normal")
return new InsetSpace(InsetSpace::NORMAL);
- else if (name == "protected")
+ if (name == "protected")
return new InsetSpace(InsetSpace::PROTECTED);
- else if (name == "thin")
+ if (name == "thin")
return new InsetSpace(InsetSpace::THIN);
- else if (name == "quad")
+ if (name == "quad")
return new InsetSpace(InsetSpace::QUAD);
- else if (name == "qquad")
+ if (name == "qquad")
return new InsetSpace(InsetSpace::QQUAD);
- else if (name == "enspace")
+ if (name == "enspace")
return new InsetSpace(InsetSpace::ENSPACE);
- else if (name == "enskip")
+ if (name == "enskip")
return new InsetSpace(InsetSpace::ENSKIP);
- else if (name == "negthinspace")
+ if (name == "negthinspace")
return new InsetSpace(InsetSpace::NEGTHIN);
- else if (name.empty())
+ if (name.empty())
lyxerr << "LyX function 'space' needs an argument." << endl;
else
lyxerr << "Wrong argument for LyX function 'space'." << endl;
break;
}
- } catch (support::ExceptionMessage const & message) {
- if (message.type_ == support::ErrorException) {
+ } catch (ExceptionMessage const & message) {
+ if (message.type_ == ErrorException) {
+ // This should never happen!
Alert::error(message.title_, message.details_);
- LyX::cref().emergencyCleanup();
- abort();
- } else if (message.type_ == support::WarningException) {
+ LyX::cref().exit(1);
+ } else if (message.type_ == WarningException) {
Alert::warning(message.title_, message.details_);
return 0;
}
return 0;
}
+Inset * createInset(Buffer & buf, FuncRequest const & cmd)
+{
+ Inset * inset = createInsetHelper(buf, cmd);
+ if (inset)
+ inset->setBuffer(buf);
+ return inset;
+}
Inset * readInset(Lexer & lex, Buffer const & buf)
{
auto_ptr<Inset> inset;
- TextClass tclass = buf.params().getTextClass();
-
lex.next();
string tmptok = lex.getString();
break;
case REF_CODE:
if (!inscmd["name"].empty() || !inscmd["reference"].empty())
- inset.reset(new InsetRef(inscmd, buf));
+ inset.reset(new InsetRef(buf, inscmd));
break;
case TOC_CODE:
inset.reset(new InsetTOC(inscmd));
case NO_CODE:
default:
lyxerr << "unknown CommandInset '" << insetType
- << "'" << std::endl;
+ << "'" << endl;
while (lex.isOK() && lex.getString() != "\\end_inset")
lex.next();
return 0;
}
+ inset->setBuffer(const_cast<Buffer &>(buf));
} else {
// FIXME This branch should be made to use inset codes as the preceding
// branch does. Unfortunately, that will take some doing. It requires
} else if (tmptok == "Graphics") {
inset.reset(new InsetGraphics);
} else if (tmptok == "Note") {
- inset.reset(new InsetNote(buf.params(), tmptok));
+ inset.reset(new InsetNote(buf, tmptok));
} else if (tmptok == "Box") {
- inset.reset(new InsetBox(buf.params(), tmptok));
+ inset.reset(new InsetBox(buf, tmptok));
} else if (tmptok == "Flex") {
lex.next();
string s = lex.getString();
- InsetLayout il = tclass.insetlayout(from_utf8(s));
- inset.reset(new InsetFlex(buf.params(), il));
+ inset.reset(new InsetFlex(buf,
+ buf.params().documentClassPtr(), s));
} else if (tmptok == "Branch") {
- inset.reset(new InsetBranch(buf.params(),
+ inset.reset(new InsetBranch(buf,
InsetBranchParams()));
} else if (tmptok == "Environment") {
lex.next();
- inset.reset(new InsetEnvironment(buf.params(), lex.getDocString()));
+ inset.reset(new InsetEnvironment(buf, lex.getDocString()));
} else if (tmptok == "ERT") {
- inset.reset(new InsetERT(buf.params()));
+ inset.reset(new InsetERT(buf));
} else if (tmptok == "listings") {
- inset.reset(new InsetListings(buf.params()));
+ inset.reset(new InsetListings(buf));
} else if (tmptok == "InsetSpace") {
inset.reset(new InsetSpace);
} else if (tmptok == "Tabular") {
inset.reset(new InsetTabular(buf));
} else if (tmptok == "Text") {
- inset.reset(new InsetText(buf.params()));
+ inset.reset(new InsetText(buf));
} else if (tmptok == "VSpace") {
inset.reset(new InsetVSpace);
} else if (tmptok == "Foot") {
- inset.reset(new InsetFoot(buf.params()));
+ inset.reset(new InsetFoot(buf));
} else if (tmptok == "Marginal") {
- inset.reset(new InsetMarginal(buf.params()));
+ inset.reset(new InsetMarginal(buf));
} else if (tmptok == "OptArg") {
- inset.reset(new InsetOptArg(buf.params()));
+ inset.reset(new InsetOptArg(buf));
} else if (tmptok == "Float") {
lex.next();
string tmptok = lex.getString();
- inset.reset(new InsetFloat(buf.params(), tmptok));
+ inset.reset(new InsetFloat(buf, tmptok));
} else if (tmptok == "Wrap") {
lex.next();
string tmptok = lex.getString();
- inset.reset(new InsetWrap(buf.params(), tmptok));
+ inset.reset(new InsetWrap(buf, tmptok));
#if 0
} else if (tmptok == "Theorem") {
inset.reset(new InsetList);
#endif
} else if (tmptok == "Caption") {
- inset.reset(new InsetCaption(buf.params()));
+ inset.reset(new InsetCaption(buf));
} else if (tmptok == "Index") {
- inset.reset(new InsetIndex(buf.params()));
+ inset.reset(new InsetIndex(buf));
} else if (tmptok == "FloatList") {
inset.reset(new InsetFloatList);
} else if (tmptok == "Info") {
- inset.reset(new InsetInfo(buf.params()));
+ inset.reset(new InsetInfo(buf));
} else {
lyxerr << "unknown Inset type '" << tmptok
- << "'" << std::endl;
+ << "'" << endl;
while (lex.isOK() && lex.getString() != "\\end_inset")
lex.next();
return 0;
}
- inset->read(buf, lex);
+ // Set the buffer reference for proper parsing of some insets
+ // (InsetCollapsable for example)
+ inset->setBuffer(const_cast<Buffer &>(buf));
+ inset->read(lex);
+ // Set again the buffer for insets that are created inside this inset
+ // (InsetMathHull for example).
+ inset->setBuffer(const_cast<Buffer &>(buf));
}
-
return inset.release();
}