Improve handling of local layout files. There are two bugs here that still need fixing, though: 4593 and 4594.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23372 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2008-03-01 16:32:16 +00:00
parent c3e4e47fb7
commit 9dfbadcb2c
3 changed files with 15 additions and 38 deletions

View File

@ -189,22 +189,13 @@ string const BaseClassList::localPrefix = "LOCAL:";
LayoutFileIndex
BaseClassList::addLayoutFile(string const & textclass, string const & path)
{
// FIXME BUGS
// There be bugs here. The way this presently works, the local class gets
// added to the global list of available document classes. It will then
// appear on the list in Document>Settings, where it could be chosen in,
// say, a new document, with no real warning that the class may not be
// available when the document is saved, since the new document may not be
// in the same directory as the layout file.
//
// Another bug is this: If the Document>Settings dialog is open when a file
// with a local layout is opened, the dialog doesn't update.
// FIXME There is a bug here: 4593
//
// only check for textclass.layout file, .cls can be anywhere in $TEXINPUTS
// NOTE: latex class name is defined in textclass.layout, which can be
// different from textclass
string fullName = addName(path, textclass + ".layout");
string localIndex = localPrefix + textclass;
string localIndex = localPrefix + fullName;
// if the local file has already been loaded, return it
if (haveClass(localIndex))
@ -231,14 +222,6 @@ LayoutFileIndex
// now, create a TextClass with description containing path information
LayoutFile tmpl(textclass, sub.str(2) == "" ? textclass : sub.str(2),
sub.str(3) + " <" + path + ">", true);
// Do not add this local TextClass to classmap_ if it has
// already been loaded by, for example, a master buffer.
if (haveClass(textclass)
// FIXME I don't understand this comment (rgh)
// only layouts from the same directory are considered to be identical.
&& classmap_[textclass].description() == tmpl.description()
)
return textclass;
classmap_[localIndex] = tmpl;
// This textclass is added on request so it will definitely be
// used. Load it now because other load() calls may fail if they

View File

@ -1386,22 +1386,18 @@ void BufferParams::setDocumentClass(DocumentClass const * const tc) {
bool BufferParams::setBaseClass(string const & classname)
{
string localtc = classname;
LYXERR(Debug::TCLASS, "setBaseClass: " << classname);
BaseClassList const & bcl = BaseClassList::get();
if (!bcl.haveClass(localtc)) {
// OK, let's try again assuming it's a local file
localtc = BaseClassList::localPrefix + localtc;
if (!bcl.haveClass(localtc)) {
docstring s =
bformat(_("The document class %1$s could not be found."),
from_utf8(classname));
frontend::Alert::error(_("Class not found"), s);
return false;
}
if (!bcl.haveClass(classname)) {
docstring s =
bformat(_("The document class %1$s could not be found."),
from_utf8(classname));
frontend::Alert::error(_("Class not found"), s);
return false;
}
if (bcl[localtc].load()) {
pimpl_->baseClass_ = localtc;
if (bcl[classname].load()) {
pimpl_->baseClass_ = classname;
return true;
}

View File

@ -901,9 +901,6 @@ GuiDocument::GuiDocument(GuiView & lv)
latexModule->psdriverCO->addItem(enc);
}
// latex classes
//FIXME This seems too involved with the kernel. Some of this
//should be moved to the kernel---which should perhaps just
//give us a list of entries or something of the sort.
latexModule->classCO->setModel(&classes_model_);
BaseClassList const & bcl = BaseClassList::get();
vector<LayoutFileIndex> classList = bcl.classList();
@ -916,7 +913,7 @@ GuiDocument::GuiDocument(GuiView & lv)
docstring item = (tc.isTeXClassAvailable()) ?
from_utf8(tc.description()) :
bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
classes_model_.insertRow(i, toqstr(item), tc.name());
classes_model_.insertRow(i, toqstr(item), *cit);
}
// branches
@ -1245,6 +1242,7 @@ void GuiDocument::classChanged()
if (idx < 0)
return;
string const classname = classes_model_.getIDString(idx);
// FIXME There is a bug here: 4594
if (!bp_.setBaseClass(classname)) {
Alert::error(_("Error"), _("Unable to set document class."));
return;
@ -1832,7 +1830,7 @@ void GuiDocument::updateParams(BufferParams const & params)
}
// text layout
string const & classname = params.baseClass()->name();
string const & classname = params.baseClassID();
int idx = classes_model_.findIDString(classname);
if (idx < 0)
lyxerr << "Unable to set layout for classname " << classname << std::endl;