From 8fec5f512d1a95709ae75a8f57c51a144ac4e381 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Tue, 5 Feb 2008 22:57:33 +0000 Subject: [PATCH] Partially fix bug 4532: http://bugzilla.lyx.org/show_bug.cgi?id=4532. See in particular comment 6. We forcibly load stdinsets.inc unless the TextClass declares: Provides stdinsets 1 There isn't really any such package, of course. We're just using this (per a suggestion by JMarc) to say we've loaded relevant info about the standard insets. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22802 a592a061-630c-0410-9148-cb99ea01b6c8 --- lib/layouts/stdinsets.inc | 12 ++++--- src/TextClass.cpp | 73 ++++++++++++++++++++++++++------------- 2 files changed, 56 insertions(+), 29 deletions(-) diff --git a/lib/layouts/stdinsets.inc b/lib/layouts/stdinsets.inc index 46ddf5f379..71e17bd63c 100644 --- a/lib/layouts/stdinsets.inc +++ b/lib/layouts/stdinsets.inc @@ -16,7 +16,7 @@ # Font Nothing to put here, below are descriptions of the different # allowable adjustments for the font used to draw the text # appearing within the inset text. All these items are optional. -# Color Color of +# Color Color of text # Size Font size of the textallowed value: Small, Smaller, ... # FIXME defined in FontSize in FontEnums.h # Family FIXME defined in FontFamily in FontEnums.h @@ -31,24 +31,26 @@ # optional. # Color see definition above (in the Font node). # Size see definition above (in the Font node). -# ... +# # EndFont Nothing to put here, it's just a markup to indicate that we are # finished with the LabelFont definition. # MultiPar Indicates that multiple paragraphs are allowed within the inset # or not. FIXME: what is the default? # Decoration: Classic, Minimalistic, Conglomerate. Decoration styles # PassThru Do not do various LaTeX conversions, like the phrases -# LaTeX, LyX, quote commands, etc. +# LaTeX, LyX, quote commands, etc. # KeepEmpty Do not delete empty paragraphs (?) # FreeSpacing Preserve multiple spaces etc. # ForceLTR Force the "latex" language, leading to Left-to-Right -# (latin) output, e.g., in ERT or URL. A kludge. +# (latin) output, e.g., in ERT or URL. A kludge. # Requires Require a given (supported) feature. Multiple features must -# be comma-separated. +# be comma-separated. #End Format 6 +Provides stdinsets 1 + InsetLayout Marginal LabelString margin LatexType command diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 3444630ef7..45c8fc6a30 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -454,34 +454,59 @@ bool TextClass::read(FileName const & filename, ReadType rt) LYXERR(Debug::TCLASS, "Finished reading " + translateRT(rt) + ": " + to_utf8(makeDisplayPath(filename.absFilename()))); - if (rt == BASECLASS) { - if (defaultlayout_.empty()) { - lyxerr << "Error: Textclass '" << name_ - << "' is missing a defaultstyle." << endl; + if (rt != BASECLASS) + return error; + + if (defaultlayout_.empty()) { + lyxerr << "Error: Textclass '" << name_ + << "' is missing a defaultstyle." << endl; + error = true; + } + + //Try to erase "stdinsets" from the provides_ set. + //The + // Provides stdinsets 1 + //declaration simply tells us that the standard insets have been + //defined. (It's found in stdinsets.inc but could also be used in + //user-defined files.) There isn't really any such package. So we + //might as well go ahead and erase it. + //If we do not succeed, then it was not there, which means that + //the textclass did not provide the definitions of the standard + //insets. So we need to try to load them. + int erased = provides_.erase("stdinsets"); + if (!erased) { + FileName tmp = libFileSearch("layouts", "stdinsets.inc"); + + if (tmp.empty()) { + frontend::Alert::warning(_("Missing File"), + _("Could not find stdinsets.inc! This may lead to data loss!")); + error = true; + } else if (read(tmp, MERGE)) { + frontend::Alert::warning(_("Corrupt File"), + _("Could not read stdinsets.inc! This may lead to data loss!")); error = true; } - - min_toclevel_ = Layout::NOT_IN_TOC; - max_toclevel_ = Layout::NOT_IN_TOC; - const_iterator cit = begin(); - const_iterator the_end = end(); - for ( ; cit != the_end ; ++cit) { - int const toclevel = (*cit)->toclevel; - if (toclevel != Layout::NOT_IN_TOC) { - if (min_toclevel_ == Layout::NOT_IN_TOC) - min_toclevel_ = toclevel; - else - min_toclevel_ = min(min_toclevel_, - toclevel); - max_toclevel_ = max(max_toclevel_, - toclevel); - } - } - LYXERR(Debug::TCLASS, "Minimum TocLevel is " << min_toclevel_ - << ", maximum is " << max_toclevel_); - } + min_toclevel_ = Layout::NOT_IN_TOC; + max_toclevel_ = Layout::NOT_IN_TOC; + const_iterator cit = begin(); + const_iterator the_end = end(); + for ( ; cit != the_end ; ++cit) { + int const toclevel = (*cit)->toclevel; + if (toclevel != Layout::NOT_IN_TOC) { + if (min_toclevel_ == Layout::NOT_IN_TOC) + min_toclevel_ = toclevel; + else + min_toclevel_ = min(min_toclevel_, + toclevel); + max_toclevel_ = max(max_toclevel_, + toclevel); + } + } + LYXERR(Debug::TCLASS, "Minimum TocLevel is " << min_toclevel_ + << ", maximum is " << max_toclevel_); + return error; }