]> git.lyx.org Git - lyx.git/blobdiff - src/session.h
Fix loop when opening TOC widget in an empty document, basically by Richard Heck.
[lyx.git] / src / session.h
index 5ab5ef32f6090e54fb2b18551b7a3a6d679757b9..63b9a9a03eef05dbf8f1215f88e9b708270a5285 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>
@@ -55,7 +56,7 @@ class LastFilesSection : SessionSection
 {
 public:
        ///
-       typedef std::deque<std::string> LastFiles;
+       typedef std::deque<support::FileName> LastFiles;
 
 public:
        ///
@@ -77,7 +78,7 @@ public:
            file in the list is popped from the end.
            @param file the file to insert in the lastfile list.
        */
-       void add(std::string const & file);
+       void add(support::FileName const & file);
 
 private:
        /// Default number of lastfiles.
@@ -103,7 +104,7 @@ class LastOpenedSection : SessionSection
 {
 public:
        ///
-       typedef std::vector<std::string> LastOpened;
+       typedef std::vector<support::FileName> LastOpened;
 
 public:
        ///
@@ -118,7 +119,7 @@ public:
        /** add file to lastopened file list
            @param file filename to add
        */
-       void add(std::string const & file);
+       void add(support::FileName const & file);
 
        /** clear lastopened file list
         */
@@ -137,7 +138,7 @@ public:
        typedef boost::tuple<pit_type, pos_type> FilePos;
 
        ///
-       typedef std::map<std::string, FilePos> FilePosMap;
+       typedef std::map<support::FileName, FilePos> FilePosMap;
 
 public:
        ///
@@ -153,12 +154,12 @@ public:
            @param fname file entry for which to save position information
            @param pos position of the cursor when the file is closed.
        */
-       void save(std::string const & fname, FilePos pos);
+       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 load(std::string const & fname) const;
+       FilePos load(support::FileName const & fname) const;
 
 private:
        /// default number of lastfilepos to save */
@@ -173,45 +174,65 @@ private:
 class BookmarksSection : SessionSection
 {
 public:
-       /// bookmarks
+       /// A bookmark is composed of three parts
+       /// 1. filename
+       /// 2. bottom (whole document) level pit and pos, used to (inaccurately) save/restore a bookmark
+       /// 3. top level id and pos, used to accurately locate bookmark when lyx is running
+       /// top and bottom level information sometimes needs to be sync'ed. In particular,
+       /// top_id is determined when a bookmark is restored from session; and
+       /// bottom_pit and bottom_pos are determined from top_id when a bookmark
+       /// is save to session. (What a mess! :-)
+       /// 
+       /// TODO: bottom level pit and pos will be replaced by StableDocIterator
        class Bookmark {
        public:
                /// Filename
-               std::string filename;
-               /// Cursor paragraph Id
-               int par_id;
-               /// Cursor position
-               pos_type par_pos;
+               support::FileName filename;
+               /// Bottom level cursor pit, will be saved/restored by .lyx/session
+               pit_type bottom_pit;
+               /// Bottom level cursor position, will be saved/restore by .lyx/session
+               pos_type bottom_pos;
+               /// Top level cursor id, used to lcoate bookmarks for opened files
+               int top_id;
+               /// Top level cursor position within a paragraph
+               pos_type top_pos;
                ///
-               Bookmark() : par_id(0), par_pos(0) {}
+               Bookmark() : bottom_pit(0), bottom_pos(0), top_id(0), top_pos(0) {}
                ///
-               Bookmark(std::string const & f, int id, pos_type pos)
-                       : filename(f), par_id(id), par_pos(pos) {}
+               Bookmark(support::FileName const & f, pit_type pit, pos_type pos, int id, pos_type tpos)
+                       : filename(f), bottom_pit(pit), bottom_pos(pos), top_id(id), top_pos(tpos) {}
+               /// set bookmark top_id, this is because newly loaded bookmark
+               /// may have zero par_id and par_pit can change during editing, see bug 3092
+               void updatePos(pit_type pit, pos_type pos, int id) { 
+                       bottom_pit = pit;
+                       bottom_pos = pos;
+                       top_id = id;
+               }
        };
 
        ///
-       typedef std::deque<Bookmark> BookmarkList;
+       typedef std::vector<Bookmark> BookmarkList;
 
 public:
        /// constructor, set max_bookmarks
-       /// allow 20 regular bookmarks
-       BookmarksSection::BookmarksSection() : max_bookmarks(20), bookmarks(0) {}
+       /// allow 9 regular bookmarks, bookmark 0 is temporary
+       BookmarksSection() : bookmarks(10), max_bookmarks(9) {}
 
        /// Save the current position as bookmark
-       /// if save==false, save to temp_bookmark
-       void save(std::string const & fname, int par_id, pos_type par_pos, bool persistent);
+       void save(support::FileName const & fname, pit_type bottom_pit, pos_type bottom_pos,
+               int top_id, pos_type top_pos, unsigned int idx);
 
-       /// return bookmark, return temp_bookmark if i==0
+       /// return bookmark 0-9, bookmark 0 is the temporary bookmark
        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(); }
+       unsigned int size() const { return max_bookmarks; }
 
        /// clear all bookmarks
-       void clear() { bookmarks.clear(); }
+       void clear();
 
        ///
        void read(std::istream & is);
@@ -225,10 +246,6 @@ public:
        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;
@@ -238,6 +255,91 @@ private:
 };
 
 
+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(); }
+
+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:
@@ -306,6 +408,12 @@ public:
        ///
        BookmarksSection const & bookmarks() const { return bookmarks_; }
 
+       ///
+       ToolbarSection & toolbars() { return toolbars_; }
+
+       ///
+       ToolbarSection const & toolbars() const { return toolbars_; }
+
        ///
        SessionInfoSection & sessionInfo() { return session_info; }
 
@@ -314,7 +422,7 @@ public:
 
 private:
        /// file to save session, determined in the constructor.
-       std::string session_file;
+       support::FileName session_file;
 
        /** Read the session file.
            Reads the #.lyx/session# at the beginning of the LyX session.
@@ -335,6 +443,9 @@ private:
        ///
        BookmarksSection bookmarks_;
 
+       ///
+       ToolbarSection toolbars_;
+
        ///
        SessionInfoSection session_info;
 };