lyx_mirror/src/LayoutFile.h
Enrico Forestieri 306b136cc0 Fix bug #4812 (Layout in local directory lost on Save As, Copying)
The "save-as" part of the bug is fixed by extending the \textclass tag
such that, if a local layout file is used, its path relative to the
document directory is now stored together with the name. If a relative
path cannot be used, an absolute one is used but, in this case, the
document is not usable on a different platform.

The "copy" part is fixed by introducing a new \origin tag, which is
written when the file is saved. This tag stores the absolute path of
the document directory. If the document is manually copied to a
different location, the local layout file is retrivied by using
\origin (which is only updated on save).
This new tag may prove useful also for locating other files when the
document is manually moved to a different directory.

As in the original implementation the files needed for the layout
(for example, a latex class) had to be in the same directory as the
layout file, this directory has also to be added to TEXINPUTS.
2015-05-13 22:02:13 +02:00

150 lines
4.3 KiB
C++

// -*- C++ -*-
/**
* \file LayoutFile.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Richard Heck (typedefs and such)
*
* Full author contact details are available in file CREDITS.
*/
#ifndef BASECLASSLIST_H
#define BASECLASSLIST_H
#include "LayoutModuleList.h"
#include "TextClass.h"
#include "support/strfwd.h"
#include <string>
#include <vector>
namespace lyx {
class Layout;
/// Index into LayoutFileList. Basically a 'strong typedef'.
class LayoutFileIndex {
public:
///
typedef std::string base_type;
///
LayoutFileIndex(base_type const & t) : data_(t) { }
///
operator base_type() const { return data_; }
///
bool empty() const { return data_.empty(); }
private:
base_type data_;
};
/// This class amounts to little more than a `strong typedef'.
///
/// A LayoutFile represents the layout information that is
/// contained in a *.layout file.
///
/// No document- (that is, Buffer-) specific information should
/// be placed in these objects. They are used as the basis for
/// constructing DocumentClass objects, which are what represent
/// the layout information associated with a Buffer. (This is also
/// a subclass of TextClass, implemented in TextClass.{h,cpp}.)
/// Buffer-specific information should therefore be placed in a
/// DocumentClass object.
///
class LayoutFile : public TextClass {
public:
/// check whether the TeX class is available
bool isTeXClassAvailable() const { return tex_class_avail_; }
///
LayoutModuleList const & defaultModules() const
{ return default_modules_; }
///
LayoutModuleList const & providedModules() const
{ return provided_modules_; }
///
LayoutModuleList const & excludedModules() const
{ return excluded_modules_; }
private:
/// noncopyable
LayoutFile(LayoutFile const &);
void operator=(LayoutFile const &);
/// Construct a layout with default values. Actual values loaded later.
explicit LayoutFile(std::string const & filename,
std::string const & className = std::string(),
std::string const & description = std::string(),
std::string const & prerequisites = std::string(),
std::string const & category = std::string(),
bool texclassavail = false);
/// The only class that should create a LayoutFile is
/// LayoutFileList, which calls the private constructor.
friend class LayoutFileList;
/// can't create empty LayoutFile
LayoutFile() {}
};
/// A list of base document classes (*.layout files).
/// This is a singleton class. The sole instance is accessed
/// via LayoutFileList::get()
class LayoutFileList {
public:
///
~LayoutFileList();
/// \return The sole instance of this class.
static LayoutFileList & get();
///
bool empty() const { return classmap_.empty(); }
///
bool haveClass(std::string const & classname) const;
/// Note that this will assert if we don't have classname, so
/// check via haveClass() first.
LayoutFile const & operator[](std::string const & classname) const;
/// Note that this will assert if we don't have classname, so
/// check via haveClass() first.
LayoutFile & operator[](std::string const & classname);
/// Read textclass list. Returns false if this fails.
bool read();
/// Clears the textclass so as to force it to be reloaded
void reset(LayoutFileIndex const & tc);
/// Add a default textclass with all standard layouts.
/// Note that this will over-write any information we may have
/// gotten from textclass.lst about this class.
LayoutFileIndex addEmptyClass(std::string const & textclass);
/// add a textclass from user local directory.
/// \return the identifier for the loaded file, or else an
/// empty string if no file was loaded.
LayoutFileIndex addLocalLayout(std::string const & textclass,
std::string const & path,
std::string const & oldpath = empty_string());
/// a list of the available classes
std::vector<LayoutFileIndex> classList() const;
///
bool load(std::string const & name, std::string const & buf_path);
private:
///
LayoutFileList() {}
///
typedef std::map<std::string, LayoutFile *> ClassMap;
/// noncopyable
LayoutFileList(LayoutFileList const &);
/// nonassignable
void operator=(LayoutFileList const &);
///
mutable ClassMap classmap_; //FIXME
};
///
LayoutFileIndex defaultBaseclass();
} // namespace lyx
#endif