]> 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 4cf5dcb0808bd0c10c32f43d4bcd0f3f5c347941..63b9a9a03eef05dbf8f1215f88e9b708270a5285 100644 (file)
@@ -174,53 +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
                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;
+               /// 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(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
+               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 setPos(pit_type pit, int id) { 
-                       par_pit = pit;
-                       par_id = id;
+               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() : bookmarks(0), max_bookmarks(20) {}
+       /// 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(support::FileName const & fname, pit_type pit, 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);
@@ -234,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;