]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.h
* Hartmut's csv2lyx script
[lyx.git] / src / TextClass.h
index e4067ffd20eae613f11a764d3f49cd123b39646f..13d2234873af1180318583e63c566d9b05bbdda6 100644 (file)
 #define TEXTCLASS_H
 
 #include "ColorCode.h"
+#include "Counters.h"
+#include "FloatList.h"
 #include "FontInfo.h"
+#include "Layout.h"
 #include "LayoutEnums.h"
-#include "LayoutPtr.h"
 
 #include "insets/InsetLayout.h"
 
 #include "support/docstring.h"
 #include "support/types.h"
 
-#include <boost/shared_ptr.hpp>
+#include <boost/noncopyable.hpp>
 
-#include <list>
 #include <map>
 #include <set>
 #include <vector>
@@ -37,6 +38,19 @@ class Layout;
 class LayoutFile;
 class Lexer;
 
+/// Based upon ideas in boost::noncopyable, inheriting from this
+/// class effectively makes the copy constructor protected but the
+/// assignment constructor private.
+class ProtectCopy
+{
+protected:
+       ProtectCopy() {}
+       ~ProtectCopy() {}
+       ProtectCopy(const ProtectCopy &) {};
+private:
+       const ProtectCopy & operator=(const ProtectCopy &);
+};
+
 
 /// A TextClass represents a collection of layout information: At the 
 /// moment, this includes Layout's and InsetLayout's.
@@ -46,7 +60,7 @@ class Lexer;
 /// Simple TextClass objects are not directly constructed in the main 
 /// LyX code---the constructor is protected. (That said, in tex2lyx
 /// there are what amount to simple TextClass objects.)
-class TextClass {
+class TextClass : protected ProtectCopy {
 public:
        ///
        virtual ~TextClass() {};
@@ -54,7 +68,18 @@ public:
        // typedefs
        ///////////////////////////////////////////////////////////////////
        /// The individual paragraph layouts comprising the document class
-       typedef std::vector<LayoutPtr> LayoutList;
+       // NOTE Do NOT try to make this a container of Layout pointers, e.g.,
+       // std::vector<Layout *>. This will lead to problems. The reason is
+       // that DocumentClass objects are generally created by copying a 
+       // LayoutFile, which serves as a base for the DocumentClass. If the
+       // LayoutList is a container of pointers, then every DocumentClass
+       // that derives from a given LayoutFile (e.g., article) will SHARE
+       // a basic set of layouts. So if one Buffer were to modify a layout
+       // (say, Standard), that would modify that layout for EVERY Buffer
+       // that was based upon the same DocumentClass. (Of course, if you 
+       // really, REALLY want to make LayoutList a vector<Layout *>, then
+       // you can implement custom assignment and copy constructors.)
+       typedef std::vector<Layout> LayoutList;
        /// The inset layouts available to this class
        typedef std::map<docstring, InsetLayout> InsetLayouts;
        ///
@@ -63,8 +88,7 @@ public:
        ///////////////////////////////////////////////////////////////////
        // Iterators
        ///////////////////////////////////////////////////////////////////
-       /// Note that this returns a (LayoutPtr *). We really need a custom
-       /// iterator here.
+       ///
        const_iterator begin() const { return layoutlist_.begin(); }
        ///
        const_iterator end() const { return layoutlist_.end(); }
@@ -74,12 +98,16 @@ public:
        // Layout Info
        ///////////////////////////////////////////////////////////////////
        ///
-       LayoutPtr const & defaultLayout() const;
+       Layout const & defaultLayout() const;
        ///
        docstring const & defaultLayoutName() const;
+       ///
+       bool isDefaultLayout(Layout const &) const;
+       /// 
+       bool isEmptyLayout(Layout const &) const;
        /// returns a special layout for use when we don't really want one,
        /// e.g., in table cells
-       LayoutPtr const & emptyLayout() const 
+       Layout const & emptyLayout() const 
                        { return operator[](emptylayout_); };
        /// the name of the empty layout
        docstring const & emptyLayoutName() const 
@@ -89,7 +117,7 @@ public:
        ///
        bool hasLayout(docstring const & name) const;
        ///
-       LayoutPtr const & operator[](docstring const & vname) const;
+       Layout const & operator[](docstring const & vname) const;
 
        ///////////////////////////////////////////////////////////////////
        // reading routines
@@ -98,11 +126,25 @@ public:
        enum ReadType { 
                BASECLASS, //>This is a base class, i.e., top-level layout file
                MERGE, //>This is a file included in a layout file
-               MODULE //>This is a layout module
+               MODULE, //>This is a layout module
+               VALIDATION //>We're just validating
        };
+       /// return values for read()
+       enum ReturnValues {
+               OK,
+               ERROR,
+               FORMAT_MISMATCH
+       };
+
        /// Performs the read of the layout file.
        /// \return true on success.
        bool read(support::FileName const & filename, ReadType rt = BASECLASS);
+       ///
+       bool read(std::string const & str, ReadType rt = BASECLASS);
+       ///
+       ReturnValues read(Lexer & lex, ReadType rt = BASECLASS);
+       /// validates the layout information passed in str
+       static bool validate(std::string const & str);
 
        ///////////////////////////////////////////////////////////////////
        // loading
@@ -125,6 +167,19 @@ public:
 protected:
        /// Protect construction
        TextClass();
+       ///
+       Layout & operator[](docstring const & vname);
+
+       ///////////////////////////////////////////////////////////////////
+       // non-const iterators
+       ///////////////////////////////////////////////////////////////////
+       ///
+       typedef LayoutList::iterator iterator;
+       ///
+       iterator begin() { return layoutlist_.begin(); }
+       ///
+       iterator end() { return layoutlist_.end(); }
+
        ///////////////////////////////////////////////////////////////////
        // members
        ///////////////////////////////////////////////////////////////////
@@ -137,9 +192,9 @@ protected:
        /// document class description
        std::string description_;
        /// available types of float, eg. figure, algorithm.
-       boost::shared_ptr<FloatList> floatlist_;
+       mutable FloatList floatlist_;
        /// Types of counters, eg. sections, eqns, figures, avail. in document class.
-       boost::shared_ptr<Counters> counters_;
+       mutable Counters counters_;
        /// Has this layout file been loaded yet?
        mutable bool loaded_;
        /// Is the TeX class available?
@@ -189,7 +244,7 @@ protected:
        /// The name of the title command
        std::string titlename_;
        /// Input layouts available to this layout
-       mutable InsetLayouts insetlayoutlist_;
+       InsetLayouts insetlayoutlist_;
        /// The minimal TocLevel of sectioning layouts
        int min_toclevel_;
        /// The maximal TocLevel of sectioning layouts
@@ -200,6 +255,8 @@ private:
        ///////////////////////////////////////////////////////////////////
        ///
        bool deleteLayout(docstring const &);
+       ///
+       bool convertLayoutFormat(support::FileName const &, ReadType);
        /// \return true for success.
        bool readStyle(Lexer &, Layout &);
        ///
@@ -226,7 +283,7 @@ private:
 ///
 /// In the main LyX code, DocumentClass objects are created only by
 /// DocumentClassBundle, for which see below.
-class DocumentClass : public TextClass {
+class DocumentClass : public TextClass, boost::noncopyable {
 public:
        ///
        virtual ~DocumentClass() {}
@@ -239,7 +296,7 @@ public:
        /// A DocumentClass nevers count as loaded, since it is dynamic
        virtual bool loaded() { return false; }
        /// Inset layouts of this doc class
-       InsetLayouts & insetLayouts() const { return insetlayoutlist_; };
+       InsetLayouts const & insetLayouts() const { return insetlayoutlist_; };
        /// \return the layout object of an inset given by name. If the name
        /// is not found as such, the part after the ':' is stripped off, and
        /// searched again. In this way, an error fallback can be provided:
@@ -247,7 +304,6 @@ public:
        /// will invoke the layout object defined by name = 'CharStyle'.
        /// If that doesn't work either, an empty object returns (shouldn't
        /// happen).  -- Idea JMarc, comment MV
-       ///
        InsetLayout const & insetLayout(docstring const & name) const;
        /// an empty inset layout for use as a default
        static InsetLayout const & emptyInsetLayout() { return empty_insetlayout_; }
@@ -256,11 +312,9 @@ public:
        // accessors
        ///////////////////////////////////////////////////////////////////
        /// the list of floats defined in the document class
-       FloatList & floats() { return *floatlist_.get(); }
-       /// the list of floats defined in the document class
-       FloatList const & floats() const { return *floatlist_.get(); }
-       /// The Counters present in this document class.
-       Counters & counters() const { return *counters_.get(); }
+       FloatList const & floats() const { return floatlist_; }
+       ///
+       Counters & counters() const { return counters_; }
        ///
        std::string const & opt_fontsize() const { return opt_fontsize_; }
        ///
@@ -309,10 +363,10 @@ protected:
        /// Constructs a DocumentClass based upon a LayoutFile.
        DocumentClass(LayoutFile const & tc);
        /// Needed in tex2lyx
-       DocumentClass() {};
+       DocumentClass() {}
 private:
        /// The only class that can create a DocumentClass is
-       /// DocumentClassBundle, which calls the private constructor.
+       /// DocumentClassBundle, which calls the protected constructor.
        friend class DocumentClassBundle;
        ///
        static InsetLayout empty_insetlayout_;
@@ -329,7 +383,7 @@ private:
 ///
 /// This is a singleton class. Its sole instance is accessed via 
 /// DocumentClassBundle::get().
-class DocumentClassBundle {
+class DocumentClassBundle : boost::noncopyable {
 public:
        /// \return Pointer to a new class equal to baseClass
        DocumentClass & newClass(LayoutFile const & baseClass);
@@ -338,10 +392,10 @@ public:
 private:
        /// control instantiation
        DocumentClassBundle() {}
-       /// noncopyable
-       DocumentClassBundle(DocumentClassBundle const &);
+       /// clean up
+       ~DocumentClassBundle();
        ///
-       std::list<DocumentClass> tc_list_;
+       std::vector<DocumentClass *> documentClasses_;
 };