mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-28 04:17:43 +00:00
306b136cc0
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.
150 lines
4.3 KiB
C++
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
|