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);
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;