Hi John, hi Jean-Marc,
please find the patch attached to this mail. I guess you want to make some changes before committing it. Hence I post it to the mailing list.Michael can you attach your patch ??
As mentioned before, the patch is much smaller than it was originally.
Here comes a short description:
- lyx-devel-1.3.Xcvs/lib/chkconfig.ltx
LyX stores information on _all_ its layout files in textclass.lst.
A fourth field (true/false) has been introduced that keeps track
on whether the corresponding LaTeX class is available or not
- lyx-devel-1.3.Xcvs/src/buffer.C
Nothing but a simple new warning
- lyx-devel-1.3.Xcvs/src/exporter.C
The document is only exportable to its BufferFormat if the
TeX class is available
- lyx-devel-1.3.Xcvs/src/lyxtextclass.C
lyx-devel-1.3.Xcvs/src/lyxtextclass.h
Trivial member var & method for checking the availability of
the TeX class
- lyx-devel-1.3.Xcvs/src/lyxtextclasslist.C
Sort text classes appropriately (available classes first)
Extended parser for textclass.lst (read fourth field)
- lyx-devel-1.3.Xcvs/src/frontends/qt2/QDocument.C
lyx-devel-1.3.Xcvs/src/frontends/xforms/FormDocument.C
List all text classes; mark missing classes with "No TeX:"
(I decided to choose a short prefix; it looks best in the
xforms dialog)
AFAICS the code in the frontends isn't optimal. I had to make some modifications because neither the xforms nor the QT frontend made proper use of the controller methods. I wonder whether there are other places that could be simplified. Checking the necessity of all "for" statements systematically could be a good starting point. If I understand the concept correctly, there should be as little logic in the frontends as possible. Right?
OK, that's all for the moment. Please let me know if something is unclear about the patch (I hope it's intuitive).
Concerning testing: The patch is in use for several weeks now. No problems so far, everything works as expected.
Have a nice weekend, Michael
Index: lyx-devel-1.3.Xcvs/lib/chkconfig.ltx =================================================================== RCS file: /cvs/lyx/lyx-devel/lib/chkconfig.ltx,v retrieving revision 1.9 diff -u -r1.9 chkconfig.ltx --- lyx-devel-1.3.Xcvs/lib/chkconfig.ltx 2002/03/01 12:39:19 1.9 +++ lyx-devel-1.3.Xcvs/lib/chkconfig.ltx 2003/02/07 23:48:33 @@ -59,9 +59,9 @@ % the variable chk_<name>. %%% \newcommand{\prefix}{+} % the character used by grep to filter 'good' output -\newcommand{\AddLayout}[3][\default]{ +\newcommand{\AddLayout}[4][\default]{ \def\default{#2} - \immediate\write\layouts{"#2" "#1" "#3"}} + \immediate\write\layouts{"#2" "#1" "#3" "#4"}} \newcommand{\AddVariable}[2]{ \immediate\write\sed{s!@chk_#1@!#2!g} \immediate\write\vars{chk_#1='#2'}} @@ -107,15 +107,17 @@ } \newcommand{\DeclareLaTeXClass}[2][\default]{ \TestItem[#1]{\layoutname}{document class}{cls} - {\AddLayout[\firstelement]{\layoutname}{#2}}{} + {\AddLayout[\firstelement]{\layoutname}{#2}{true}} + {\AddLayout[\firstelement]{\layoutname}{#2}{false}} \expandafter\endinput } \newcommand{\DeclareLinuxDocClass}[2][\default]{ \message{^^J\prefix checking for linuxdoc class \layoutname... } \@ifundefined{haslinuxdoc} - {\message{no^^J}} + {\message{no^^J} + \AddLayout[#1]{\layoutname}{#2}{false}} {\message{yes^^J} - \AddLayout[#1]{\layoutname}{#2}} + \AddLayout[#1]{\layoutname}{#2}{true}} \expandafter\endinput } % Only for compatibility. Will be removed later. @@ -124,9 +126,10 @@ \newcommand{\DeclareDocBookClass}[2][\default]{ \message{^^J\prefix checking for docbook\space\space class \layoutname... } \@ifundefined{hasdocbook} - {\message{no^^J}} + {\message{no^^J} + \AddLayout[#1]{\layoutname}{#2}{false}} {\message{yes^^J} - \AddLayout[#1]{\layoutname}{#2}} + \AddLayout[#1]{\layoutname}{#2}{true}} \expandafter\endinput } Index: lyx-devel-1.3.Xcvs/src/buffer.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/buffer.C,v retrieving revision 1.399 diff -u -r1.399 buffer.C --- lyx-devel-1.3.Xcvs/src/buffer.C 2003/01/23 16:23:36 1.399 +++ lyx-devel-1.3.Xcvs/src/buffer.C 2003/02/07 23:48:44 @@ -650,6 +650,19 @@ #endif params.textclass = 0; } + if (!params.getLyXTextClass().isTeXClassAvailable()) { +#if USE_BOOST_FORMAT + Alert::alert(_("Textclass error"), + boost::io::str(boost::format(_("The document uses a +missing TeX class \"%1$s\".")) % lex.getString()), + _("LyX will not be able to produce output.")); +#else + Alert::alert( + _("Textclass error"), + _("The document uses a missing TeX class ") + + lex.getString(), + _("LyX will not be able to produce output.")); +#endif + } } else if (token == "\\options") { lex.eatLine(); params.options = lex.getString(); Index: lyx-devel-1.3.Xcvs/src/exporter.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/exporter.C,v retrieving revision 1.25 diff -u -r1.25 exporter.C --- lyx-devel-1.3.Xcvs/src/exporter.C 2003/01/06 14:02:21 1.25 +++ lyx-devel-1.3.Xcvs/src/exporter.C 2003/02/07 23:48:44 @@ -169,7 +169,8 @@ vector<string> const Exporter::Backends(Buffer const * buffer) { vector<string> v; - v.push_back(BufferFormat(buffer)); + if (buffer->params.getLyXTextClass().isTeXClassAvailable()) + v.push_back(BufferFormat(buffer)); v.push_back("text"); return v; } Index: lyx-devel-1.3.Xcvs/src/lyxtextclass.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/lyxtextclass.C,v retrieving revision 1.22 diff -u -r1.22 lyxtextclass.C --- lyx-devel-1.3.Xcvs/src/lyxtextclass.C 2002/11/27 10:30:13 1.22 +++ lyx-devel-1.3.Xcvs/src/lyxtextclass.C 2003/02/07 23:48:46 @@ -49,9 +49,9 @@ LyXTextClass::LyXTextClass(string const & fn, string const & cln, - string const & desc) + string const & desc, bool texClassAvail ) : name_(fn), latexname_(cln), description_(desc), - floatlist_(new FloatList), ctrs_(new Counters) + floatlist_(new FloatList), ctrs_(new Counters), texClassAvail_(texClassAvail) { outputType_ = LATEX; columns_ = 1; @@ -65,6 +65,11 @@ opt_pagestyle_ = "empty|plain|headings|fancy"; provides_ = nothing; loaded = false; +} + + +bool LyXTextClass::isTeXClassAvailable() const { + return texClassAvail_; } Index: lyx-devel-1.3.Xcvs/src/lyxtextclass.h =================================================================== RCS file: /cvs/lyx/lyx-devel/src/lyxtextclass.h,v retrieving revision 1.11 diff -u -r1.11 lyxtextclass.h --- lyx-devel-1.3.Xcvs/src/lyxtextclass.h 2002/11/07 19:51:22 1.11 +++ lyx-devel-1.3.Xcvs/src/lyxtextclass.h 2003/02/07 23:48:46 @@ -39,8 +39,12 @@ explicit LyXTextClass(string const & = string(), string const & = string(), - string const & = string()); + string const & = string(), + bool = false); + /// check whether the TeX class is available + bool isTeXClassAvailable() const; + /// paragraph styles begin iterator. const_iterator begin() const { return layoutlist_.begin(); } /// paragraph styles end iterator @@ -142,6 +146,8 @@ /// int size() const; private: + /// Is the TeX class available? + bool texClassAvail_; /// bool delete_layout(string const &); /// Index: lyx-devel-1.3.Xcvs/src/lyxtextclasslist.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/lyxtextclasslist.C,v retrieving revision 1.9 diff -u -r1.9 lyxtextclasslist.C --- lyx-devel-1.3.Xcvs/src/lyxtextclasslist.C 2002/11/27 10:30:13 1.9 +++ lyx-devel-1.3.Xcvs/src/lyxtextclasslist.C 2003/02/07 23:48:47 @@ -69,7 +69,9 @@ class less_textclass_desc { public: int operator()(LyXTextClass const & tc1, LyXTextClass const & tc2) { - return tc1.description() < tc2.description(); + return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) || + (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && + tc1.description() < tc2.description()); } }; @@ -130,13 +132,17 @@ if (lex.next()) { string const desc = lex.getString(); lyxerr[Debug::TCLASS] << "Desc: " << desc << endl; - // This code is run when we have - // fname, clname and desc - LyXTextClass tmpl(fname, clname, desc); - if (lyxerr.debugging(Debug::TCLASS)) { - tmpl.load(); + if (lex.next()) { + bool avail = lex.getBool(); + lyxerr[Debug::TCLASS] << "Avail: " << +avail << endl; + // This code is run when we have + // fname, clname, desc, and avail + LyXTextClass tmpl(fname, clname, desc, +avail); + if (lyxerr.debugging(Debug::TCLASS)) { + tmpl.load(); + } + classlist_.push_back(tmpl); } - classlist_.push_back(tmpl); } } } Index: lyx-devel-1.3.Xcvs/src/frontends/qt2/QDocument.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QDocument.C,v retrieving revision 1.33 diff -u -r1.33 QDocument.C --- lyx-devel-1.3.Xcvs/src/frontends/qt2/QDocument.C 2003/01/23 16:23:39 1.33 +++ lyx-devel-1.3.Xcvs/src/frontends/qt2/QDocument.C 2003/02/07 23:48:57 @@ -115,7 +115,12 @@ // layout for (LyXTextClassList::const_iterator cit = textclasslist.begin(); cit != textclasslist.end(); ++cit) { - dialog_->layoutModule->classCO->insertItem(toqstr(cit->description())); + if (cit->isTeXClassAvailable()) { + +dialog_->layoutModule->classCO->insertItem(toqstr(cit->description())); + } else { + dialog_->layoutModule->classCO->insertItem(toqstr("No TeX: " + + +cit->description())); + } } for (int n = 0; tex_fonts[n][0]; ++n) { @@ -463,13 +468,7 @@ // layout - for (int n = 0; n<dialog_->layoutModule->classCO->count(); ++n) { - if (dialog_->layoutModule->classCO->text(n) == - toqstr(controller().textClass().description())) { - dialog_->layoutModule->classCO->setCurrentItem(n); - break; - } - } + dialog_->layoutModule->classCO->setCurrentItem(controller().textClass()); dialog_->updateFontsize(controller().textClass().opt_fontsize(), params.fontsize); Index: lyx-devel-1.3.Xcvs/src/frontends/xforms/FormDocument.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/frontends/xforms/FormDocument.C,v retrieving revision 1.126.2.1 diff -u -r1.126.2.1 FormDocument.C --- lyx-devel-1.3.Xcvs/src/frontends/xforms/FormDocument.C 2003/02/07 14:25:59 1.126.2.1 +++ lyx-devel-1.3.Xcvs/src/frontends/xforms/FormDocument.C 2003/02/07 23:49:01 @@ -134,7 +134,11 @@ fl_end_form(); for (LyXTextClassList::const_iterator cit = textclasslist.begin(); cit != textclasslist.end(); ++cit) { - combo_doc_class->addto(cit->description()); + if (cit->isTeXClassAvailable()) { + combo_doc_class->addto(cit->description()); + } else { + combo_doc_class->addto("No TeX: " + cit->description()); + } } fl_addto_choice(class_->choice_doc_spacing, @@ -832,7 +836,7 @@ LyXTextClass const & tclass = textclasslist[params.textclass]; - combo_doc_class->select(tclass.description()); + combo_doc_class->select(params.textclass + 1); fl_clear_choice(class_->choice_doc_fontsize); fl_addto_choice(class_->choice_doc_fontsize, "default"); fl_addto_choice(class_->choice_doc_fontsize,