Fix crash when layout file cannot be read due to failure to call makeTextClass() in that case.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20150 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2007-09-08 17:46:02 +00:00
parent b7877999f7
commit aebd5ebaf9
7 changed files with 44 additions and 13 deletions

View File

@ -531,8 +531,9 @@ bool Buffer::readDocument(Lexer & lex)
BOOST_ASSERT(paragraphs().empty());
readHeader(lex);
if (!params().getTextClass().load(filePath())) {
string theclass = params().getTextClass().name();
TextClass const & baseClass = textclasslist[params().getBaseClass()];
if (!baseClass.load(filePath())) {
string theclass = baseClass.name();
Alert::error(_("Can't load document class"), bformat(
_("Using the default document class, because the "
"class %1$s could not be loaded."), from_utf8(theclass)));

View File

@ -1227,17 +1227,18 @@ void BufferParams::setTextClass(TextClass_ptr tc) {
bool BufferParams::setBaseClass(textclass_type tc)
{
if (!textclasslist[tc].load()) {
docstring s = bformat(_("The document class %1$s."
"could not be loaded."),
bool retVal = true;
if (textclasslist[tc].load())
baseClass_ = tc;
else {
docstring s =
bformat(_("The document class %1$s could not be loaded."),
from_utf8(textclasslist[tc].name()));
frontend::Alert::error(_("Could not load class"), s);
return false;
retVal = false;
}
baseClass_ = tc;
makeTextClass();
return true;
return retVal;
}

View File

@ -374,6 +374,7 @@ void LyXAction::init()
{ LFUN_LISTING_INSERT, "listing-insert", Noop },
{ LFUN_LAYOUT_MODULES_CLEAR, "layout-modules-clear", Noop },
{ LFUN_LAYOUT_MODULE_ADD, "layout-module-add", Noop },
{ LFUN_LAYOUT_RELOAD, "layout-reload", Noop },
{ LFUN_NOACTION, "", Noop }
};

View File

@ -731,6 +731,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
case LFUN_BUFFER_PARAMS_APPLY:
case LFUN_LAYOUT_MODULES_CLEAR:
case LFUN_LAYOUT_MODULE_ADD:
case LFUN_LAYOUT_RELOAD:
case LFUN_LYXRC_APPLY:
case LFUN_BUFFER_NEXT:
case LFUN_BUFFER_PREVIOUS:
@ -1835,6 +1836,18 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
updateFlags = Update::Force | Update::FitCursor;
break;
}
case LFUN_LAYOUT_RELOAD: {
BOOST_ASSERT(lyx_view_);
Buffer * buffer = lyx_view_->buffer();
TextClass_ptr oldClass = buffer->params().getTextClass_ptr();
textclass_type const tc = buffer->params().getBaseClass();
textclasslist.reset(tc);
buffer->params().setBaseClass(tc);
updateLayout(oldClass, buffer);
updateFlags = Update::Force | Update::FitCursor;
break;
}
case LFUN_TEXTCLASS_LOAD:
loadTextclass(argument);

View File

@ -66,11 +66,12 @@ TextClassList::numberOfClass(string const & textclass) const
TextClass const &
TextClassList::operator[](textclass_type textclass) const
{
classlist_[textclass].load();
if (textclass < classlist_.size())
return classlist_[textclass];
else
if (textclass >= classlist_.size())
return classlist_[0];
//FIXME I don't believe the following line is actually necessary (rgh)
classlist_[textclass].load();
return classlist_[textclass];
}
@ -175,6 +176,16 @@ bool TextClassList::read()
}
void TextClassList::reset(textclass_type const textclass) {
if (textclass >= classlist_.size())
return;
TextClass const & tc = classlist_[textclass];
TextClass tmpl(tc.name(), tc.latexname(), tc.description(),
tc.isTeXClassAvailable());
classlist_[textclass] = tmpl;
}
std::pair<bool, textclass_type> const
TextClassList::addTextClass(std::string const & textclass, std::string const & path)
{

View File

@ -50,6 +50,9 @@ public:
/// Read textclass list. Returns false if this fails.
bool read();
/// Clears the textclass so as to force it to be reloaded
void reset(textclass_type const textclass);
/// add a textclass from user local directory.
/// Return ture/false, and textclass number

View File

@ -402,6 +402,7 @@ enum kb_action {
LFUN_PARAGRAPH_PARAMS, // rgh, 200708XX
LFUN_LAYOUT_MODULES_CLEAR, // rgh, 20070825
LFUN_LAYOUT_MODULE_ADD, // rgh, 20070825
LFUN_LAYOUT_RELOAD, // rgh, 20070903
LFUN_LASTACTION // end of the table
};