]> git.lyx.org Git - lyx.git/blobdiff - src/session.h
* src/LaTeX.C
[lyx.git] / src / session.h
index e4654a0de57a0a84579a86824f8a17a2c9bcb5ee..4cf5dcb0808bd0c10c32f43d4bcd0f3f5c347941 100644 (file)
@@ -13,7 +13,8 @@
 #ifndef SESSION_H
 #define SESSION_H
 
-#include <support/types.h>
+#include "support/filename.h"
+#include "support/types.h"
 
 #include <boost/utility.hpp>
 #include <boost/tuple/tuple.hpp>
@@ -30,39 +31,46 @@ const long maxlastfiles = 20;
   1. the latest documents loaded (lastfiles)
   2. cursor positions of files closed (lastfilepos)
   3. opened files when a lyx session is closed (lastopened)
-  4. bookmarks 
+  4. bookmarks
   5. general purpose session info in the form of key/value pairs
  */
 namespace lyx {
 
-class Session : boost::noncopyable {
+/** base class for all sections in the session file
+*/
+class SessionSection : boost::noncopyable {
 
 public:
        ///
-       typedef boost::tuple<lyx::pit_type, lyx::pos_type> FilePos;
-       ///
-       typedef std::map<std::string, FilePos> FilePosMap;
-       ///
-       typedef std::deque<std::string> LastFiles;
+       virtual ~SessionSection() {}
+
+       /// read section from std::istream
+       virtual void read(std::istream & is) = 0;
+
+       /// write to std::ostream
+       virtual void write(std::ostream & os) const = 0;
+};
+
+
+class LastFilesSection : SessionSection
+{
+public:
        ///
-       typedef std::vector<std::string> LastOpened;
+       typedef std::deque<support::FileName> LastFiles;
+
+public:
        ///
-       typedef boost::tuple<unsigned int, std::string, unsigned int, lyx::pos_type> Bookmark;
+       explicit LastFilesSection(unsigned int num = 4);
+
        ///
-       typedef std::vector<Bookmark> BookmarkList;
+       void read(std::istream & is);
+
        ///
-       typedef std::map<std::string, std::string> MiscInfo;
+       void write(std::ostream & os) const;
 
-public:
-       /** Read the session file.
-           @param num length of lastfiles
-       */
-       explicit Session(unsigned int num = 4);
+       /// Return lastfiles container (deque)
+       LastFiles const lastFiles() const { return lastfiles; }
 
-       /** Write the session file.
-       */
-       void writeFile() const;
-       
        /** Insert #file# into the lastfile dequeue.
            This funtion inserts #file# into the last files list. If the file
            already exists it is moved to the top of the list, else exist it
@@ -70,98 +78,368 @@ public:
            file in the list is popped from the end.
            @param file the file to insert in the lastfile list.
        */
-       void addLastFile(std::string const & file);
-       
-       /** add cursor position to the fname entry in the filepos map
-           @param fname file entry for which to save position information
-           @param pos position of the cursor when the file is closed.
+       void add(support::FileName const & file);
+
+private:
+       /// Default number of lastfiles.
+       unsigned int const default_num_last_files;
+
+       /// Max number of lastfiles.
+       unsigned int const absolute_max_last_files;
+
+       /// a list of lastfiles
+       LastFiles lastfiles;
+
+       /// number of files in the lastfiles list.
+       unsigned int num_lastfiles;
+
+       /** Used by the constructor to set the number of stored last files.
+           @param num the number of lastfiles to set.
        */
-       void saveFilePosition(std::string const & fname, FilePos pos);
-       
+       void setNumberOfLastFiles(unsigned int num);
+};
+
+
+class LastOpenedSection : SessionSection
+{
+public:
+       ///
+       typedef std::vector<support::FileName> LastOpened;
+
+public:
+       ///
+       void read(std::istream & is);
+
+       ///
+       void write(std::ostream & os) const;
+
+       /// Return lastopened container (vector)
+       LastOpened const getfiles() const { return lastopened; }
+
+       /** add file to lastopened file list
+           @param file filename to add
+       */
+       void add(support::FileName const & file);
+
        /** clear lastopened file list
         */
-       void clearLastOpenedFiles();
-       
-       /** set lastopened file list
-           @param files filenames of a list of opened files 
+       void clear();
+
+private:
+       /// a list of lastopened files
+       LastOpened lastopened;
+};
+
+
+class LastFilePosSection : SessionSection
+{
+public:
+       ///
+       typedef boost::tuple<pit_type, pos_type> FilePos;
+
+       ///
+       typedef std::map<support::FileName, FilePos> FilePosMap;
+
+public:
+       ///
+       LastFilePosSection() : num_lastfilepos(100) {}
+
+       ///
+       void read(std::istream & is);
+
+       ///
+       void write(std::ostream & os) const;
+
+       /** add cursor position to the fname entry in the filepos map
+           @param fname file entry for which to save position information
+           @param pos position of the cursor when the file is closed.
        */
-       void setLastOpenedFiles(std::vector<std::string> const & files);
-       
+       void save(support::FileName const & fname, FilePos pos);
+
        /** load saved cursor position from the fname entry in the filepos map
            @param fname file entry for which to load position information
        */
-       FilePos loadFilePosition(std::string const & fname) const;
-       
-       /// Return lastfiles container (deque)
-       LastFiles const lastFiles() const { return lastfiles; }
-       
-       /// Return lastopened container (vector)
-       LastOpened const lastOpenedFiles() const { return lastopened; }
+       FilePos load(support::FileName const & fname) const;
 
-       /** save a bookmark
-               @bookmark bookmark to be saved
-       */
-       void saveBookmark(Bookmark const & bookmark);
-       
-       /** return bookmark list. Non-const container is used since 
+private:
+       /// default number of lastfilepos to save */
+       unsigned int const num_lastfilepos;
+
+
+       /// a map of file positions
+       FilePosMap lastfilepos;
+};
+
+
+class BookmarksSection : SessionSection
+{
+public:
+       /// bookmarks
+       class Bookmark {
+       public:
+               /// Filename
+               support::FileName filename;
+               /// Cursor pit, will be saved/restored by .lyx/session
+               pit_type par_pit;
+               /// Cursor paragraph Id, used to lcoate bookmarks for opened files
+               int par_id;
+               /// Cursor position within a paragraph
+               pos_type par_pos;
+               ///
+               Bookmark() : par_id(0), par_pos(0) {}
+               ///
+               Bookmark(support::FileName const & f, pit_type pit, int id, pos_type pos)
+                       : filename(f), par_pit(pit), par_id(id), par_pos(pos) {}
+               /// set bookmark par_id, this is because newly loaded bookmark
+               /// may have zero par_id and par_pit can change during editing, see bug 3092
+               void setPos(pit_type pit, int id) { 
+                       par_pit = pit;
+                       par_id = id;
+               }
+       };
+
+       ///
+       typedef std::deque<Bookmark> BookmarkList;
+
+public:
+       /// constructor, set max_bookmarks
+       /// allow 20 regular bookmarks
+       BookmarksSection() : bookmarks(0), max_bookmarks(20) {}
+
+       /// Save the current position as bookmark
+       /// if save==false, save to temp_bookmark
+       void save(support::FileName const & fname, pit_type pit, int par_id, pos_type par_pos, bool persistent);
+
+       /// return bookmark, return temp_bookmark if i==0
+       Bookmark const & bookmark(unsigned int i) const;
+
+       /// does the given bookmark have a saved position ?
+       bool isValid(unsigned int i) const;
+
+       ///
+       unsigned int size() const { return bookmarks.size(); }
+
+       /// clear all bookmarks
+       void clear() { bookmarks.clear(); }
+
+       ///
+       void read(std::istream & is);
+
+       ///
+       void write(std::ostream & os) const;
+
+       /** return bookmark list. Non-const container is used since
                bookmarks will be cleaned after use.
        */
-       BookmarkList & loadBookmarks() { return bookmarks; }
+       BookmarkList & load() { return bookmarks; }
+
+private:
+       /// temp bookmark (previously saved_positions[0]), this is really ugly
+       /// c.f. ./frontends/controllers/ControlRef.C
+       /// FIXME: a separate LFUN may be a better solution
+       Bookmark temp_bookmark;
+
+       /// a list of bookmarks
+       BookmarkList bookmarks;
+
+       ///
+       unsigned int const max_bookmarks;
+};
+
+
+class ToolbarSection : SessionSection
+{
+public:
+       /// information about a toolbar, not all information can be
+       /// saved/restored by all frontends, but this class provides
+       /// a superset of things that can be managed by session.
+       class ToolbarInfo
+       {
+       public:
+               ///
+               ToolbarInfo() :
+                       state(ON), location(NOTSET), posx(0), posy(0) { }
+               ///
+               ToolbarInfo(int s, int loc, int x=0, int y=0) :
+                       state(static_cast<State>(s)), 
+                       location(static_cast<Location>(loc)),
+                       posx(x),
+                       posy(y)
+                       { }
+
+       public:
+               enum State {
+                       ON,
+                       OFF,
+                       AUTO
+               };
+
+               /// on/off/auto
+               State state;
+
+               /// location: this can be intepreted differently.
+               enum Location {
+                       TOP,
+                       BOTTOM,
+                       LEFT,
+                       RIGHT,
+                       NOTSET
+               };
+
+               Location location;
+
+               /// x-position of the toolbar
+               int posx;
+
+               /// y-position of the toolbar
+               int posy;
+               
+               /// potentially, icons
+       };
+
+       typedef boost::tuple<std::string, ToolbarInfo> ToolbarItem;
+
+       /// info for each toolbar
+       typedef std::vector<ToolbarItem> ToolbarList;
+
+
+public:
+       ///
+       void read(std::istream & is);
+
+       ///
+       void write(std::ostream & os) const;
+
+       /// return reference to toolbar info, create a new one if needed
+       ToolbarInfo & load(std::string const & name);
+
+       /// toolbar begin
+       ToolbarList::const_iterator begin() { return toolbars.begin(); }
+
+       /// toolbar end
+       ToolbarList::const_iterator end() { return toolbars.end(); }
 
-       /** set session info 
+private:
+       /// toolbar information
+       ToolbarList toolbars;
+};
+
+/// comparison operator to sort toolbars, the rules are:
+///        ON before OFF
+///     TOP < BOTTOM < LEFT < RIGHT
+///     Line at each side
+///     order in each line
+bool operator< (ToolbarSection::ToolbarItem const & a, ToolbarSection::ToolbarItem const & b);
+
+
+class SessionInfoSection : SessionSection
+{
+public:
+       ///
+       typedef std::map<std::string, std::string> MiscInfo;
+
+public:
+       ///
+       void read(std::istream & is);
+
+       ///
+       void write(std::ostream & os) const;
+
+       /** set session info
                @param key key of the value to store
                @param value value, a string without newline ('\n')
        */
-       void saveSessionInfo(std::string const & key, std::string const & value);
+       void save(std::string const & key, std::string const & value);
 
        /** load session info
-               @param key a key to extract value from the session file 
+               @param key a key to extract value from the session file
                @param release whether or not clear the value. Default to true
                        since most of such values are supposed to be used only once.
        */
-       std::string const loadSessionInfo(std::string const & key, bool release = true);        
+       std::string const load(std::string const & key, bool release = true);
+
 private:
-       /// Default number of lastfiles.
-       unsigned int const default_num_last_files;
+       /// a map to save session info
+       MiscInfo sessioninfo;
+};
 
-       /// Max number of lastfiles.
-       unsigned int const absolute_max_last_files;
 
-       /// default number of lastfilepos to save */
-       unsigned int const num_lastfilepos;
+class Session : boost::noncopyable {
 
-       /// file to save session, determined in the constructor.
-       std::string session_file;
-       
-       /// a list of lastfiles
-       LastFiles lastfiles;
+public:
+       /** Read the session file.
+           @param num length of lastfiles
+       */
+       explicit Session(unsigned int num = 4);
 
-       /// a list of bookmarks
-       BookmarkList bookmarks;
+       /** Write the session file.
+       */
+       void writeFile() const;
 
-       /// a map to save session info
-       MiscInfo sessioninfo;
-       
-       /// number of files in the lastfiles list.
-       unsigned int num_lastfiles;
+       ///
+       LastFilesSection & lastFiles() { return last_files; }
        
-       /// a map of file positions
-       FilePosMap lastfilepos;
+       ///
+       LastFilesSection const & lastFiles() const { return last_files; }
+
+       ///
+       LastOpenedSection & lastOpened() { return last_opened; }
+
+       ///
+       LastOpenedSection const & lastOpened() const { return last_opened; }
        
-       /// a list of lastopened files
-       LastOpened lastopened;
+       ///
+       LastFilePosSection & lastFilePos() { return last_file_pos; }
        
+       ///
+       LastFilePosSection const & lastFilePos() const { return last_file_pos; }
+
+       ///
+       BookmarksSection & bookmarks() { return bookmarks_; }
+
+       ///
+       BookmarksSection const & bookmarks() const { return bookmarks_; }
+
+       ///
+       ToolbarSection & toolbars() { return toolbars_; }
+
+       ///
+       ToolbarSection const & toolbars() const { return toolbars_; }
+
+       ///
+       SessionInfoSection & sessionInfo() { return session_info; }
+
+       ///
+       SessionInfoSection const & sessionInfo() const { return session_info; }
+
+private:
+       /// file to save session, determined in the constructor.
+       support::FileName session_file;
+
        /** Read the session file.
            Reads the #.lyx/session# at the beginning of the LyX session.
-           This will read the session file (usually #.lyx/session#). 
+           This will read the session file (usually #.lyx/session#).
            @param file the file containing the session.
        */
        void readFile();
 
-       /** Used by the constructor to set the number of stored last files.
-           @param num the number of lastfiles to set.
-       */
-       void setNumberOfLastFiles(unsigned int num);
+       ///
+       LastFilesSection last_files;
+
+       ///
+       LastOpenedSection last_opened;
+
+       ///
+       LastFilePosSection last_file_pos;
+
+       ///
+       BookmarksSection bookmarks_;
+
+       ///
+       ToolbarSection toolbars_;
+
+       ///
+       SessionInfoSection session_info;
 };
 
 }