4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Lars Gullik Bjønnes
10 * Full author contact details are available in file CREDITS.
16 #include "support/FileName.h"
17 #include "support/types.h"
19 #include <boost/utility.hpp>
20 #include <boost/tuple/tuple.hpp>
27 // used by at least frontends/qt2/QPref.C
28 const long maxlastfiles = 20;
30 /** This session file maintains
31 1. the latest documents loaded (lastfiles)
32 2. cursor positions of files closed (lastfilepos)
33 3. opened files when a lyx session is closed (lastopened)
35 5. general purpose session info in the form of key/value pairs
39 /** base class for all sections in the session file
41 class SessionSection : boost::noncopyable {
45 virtual ~SessionSection() {}
47 /// read section from std::istream
48 virtual void read(std::istream & is) = 0;
50 /// write to std::ostream
51 virtual void write(std::ostream & os) const = 0;
55 class LastFilesSection : SessionSection
59 typedef std::deque<support::FileName> LastFiles;
63 explicit LastFilesSection(unsigned int num = 4);
66 void read(std::istream & is);
69 void write(std::ostream & os) const;
71 /// Return lastfiles container (deque)
72 LastFiles const lastFiles() const { return lastfiles; }
74 /** Insert #file# into the lastfile dequeue.
75 This funtion inserts #file# into the last files list. If the file
76 already exists it is moved to the top of the list, else exist it
77 is placed on the top of the list. If the list is full the last
78 file in the list is popped from the end.
79 @param file the file to insert in the lastfile list.
81 void add(support::FileName const & file);
84 /// Default number of lastfiles.
85 unsigned int const default_num_last_files;
87 /// Max number of lastfiles.
88 unsigned int const absolute_max_last_files;
90 /// a list of lastfiles
93 /// number of files in the lastfiles list.
94 unsigned int num_lastfiles;
96 /** Used by the constructor to set the number of stored last files.
97 @param num the number of lastfiles to set.
99 void setNumberOfLastFiles(unsigned int num);
103 class LastOpenedSection : SessionSection
107 typedef std::vector<support::FileName> LastOpened;
111 void read(std::istream & is);
114 void write(std::ostream & os) const;
116 /// Return lastopened container (vector)
117 LastOpened const getfiles() const { return lastopened; }
119 /** add file to lastopened file list
120 @param file filename to add
122 void add(support::FileName const & file);
124 /** clear lastopened file list
129 /// a list of lastopened files
130 LastOpened lastopened;
134 class LastFilePosSection : SessionSection
138 typedef boost::tuple<pit_type, pos_type> FilePos;
141 typedef std::map<support::FileName, FilePos> FilePosMap;
145 LastFilePosSection() : num_lastfilepos(100) {}
148 void read(std::istream & is);
151 void write(std::ostream & os) const;
153 /** add cursor position to the fname entry in the filepos map
154 @param fname file entry for which to save position information
155 @param pos position of the cursor when the file is closed.
157 void save(support::FileName const & fname, FilePos pos);
159 /** load saved cursor position from the fname entry in the filepos map
160 @param fname file entry for which to load position information
162 FilePos load(support::FileName const & fname) const;
165 /// default number of lastfilepos to save */
166 unsigned int const num_lastfilepos;
169 /// a map of file positions
170 FilePosMap lastfilepos;
174 class BookmarksSection : SessionSection
177 /// A bookmark is composed of three parts
179 /// 2. bottom (whole document) level pit and pos, used to (inaccurately) save/restore a bookmark
180 /// 3. top level id and pos, used to accurately locate bookmark when lyx is running
181 /// top and bottom level information sometimes needs to be sync'ed. In particular,
182 /// top_id is determined when a bookmark is restored from session; and
183 /// bottom_pit and bottom_pos are determined from top_id when a bookmark
184 /// is save to session. (What a mess! :-)
186 /// TODO: bottom level pit and pos will be replaced by StableDocIterator
190 support::FileName filename;
191 /// Bottom level cursor pit, will be saved/restored by .lyx/session
193 /// Bottom level cursor position, will be saved/restore by .lyx/session
195 /// Top level cursor id, used to lcoate bookmarks for opened files
197 /// Top level cursor position within a paragraph
200 Bookmark() : bottom_pit(0), bottom_pos(0), top_id(0), top_pos(0) {}
202 Bookmark(support::FileName const & f, pit_type pit, pos_type pos, int id, pos_type tpos)
203 : filename(f), bottom_pit(pit), bottom_pos(pos), top_id(id), top_pos(tpos) {}
204 /// set bookmark top_id, this is because newly loaded bookmark
205 /// may have zero par_id and par_pit can change during editing, see bug 3092
206 void updatePos(pit_type pit, pos_type pos, int id) {
214 typedef std::vector<Bookmark> BookmarkList;
217 /// constructor, set max_bookmarks
218 /// allow 9 regular bookmarks, bookmark 0 is temporary
219 BookmarksSection() : bookmarks(10), max_bookmarks(9) {}
221 /// Save the current position as bookmark
222 void save(support::FileName const & fname, pit_type bottom_pit, pos_type bottom_pos,
223 int top_id, pos_type top_pos, unsigned int idx);
225 /// return bookmark 0-9, bookmark 0 is the temporary bookmark
226 Bookmark const & bookmark(unsigned int i) const;
228 /// does the given bookmark have a saved position ?
229 bool isValid(unsigned int i) const;
232 unsigned int size() const { return max_bookmarks; }
234 /// clear all bookmarks
238 void read(std::istream & is);
241 void write(std::ostream & os) const;
243 /** return bookmark list. Non-const container is used since
244 bookmarks will be cleaned after use.
246 BookmarkList & load() { return bookmarks; }
250 /// a list of bookmarks
251 BookmarkList bookmarks;
254 unsigned int const max_bookmarks;
258 class ToolbarSection : SessionSection
261 /// information about a toolbar, not all information can be
262 /// saved/restored by all frontends, but this class provides
263 /// a superset of things that can be managed by session.
269 state(ON), location(NOTSET), posx(0), posy(0) { }
271 ToolbarInfo(int s, int loc, int x=0, int y=0) :
272 state(static_cast<State>(s)),
273 location(static_cast<Location>(loc)),
288 /// location: this can be intepreted differently.
299 /// x-position of the toolbar
302 /// y-position of the toolbar
305 /// potentially, icons
308 typedef boost::tuple<std::string, ToolbarInfo> ToolbarItem;
310 /// info for each toolbar
311 typedef std::vector<ToolbarItem> ToolbarList;
316 void read(std::istream & is);
319 void write(std::ostream & os) const;
321 /// return reference to toolbar info, create a new one if needed
322 ToolbarInfo & load(std::string const & name);
325 ToolbarList::const_iterator begin() { return toolbars.begin(); }
328 ToolbarList::const_iterator end() { return toolbars.end(); }
331 /// toolbar information
332 ToolbarList toolbars;
335 /// comparison operator to sort toolbars, the rules are:
337 /// TOP < BOTTOM < LEFT < RIGHT
338 /// Line at each side
339 /// order in each line
340 bool operator< (ToolbarSection::ToolbarItem const & a, ToolbarSection::ToolbarItem const & b);
343 class SessionInfoSection : SessionSection
347 typedef std::map<std::string, std::string> MiscInfo;
351 void read(std::istream & is);
354 void write(std::ostream & os) const;
357 @param key key of the value to store
358 @param value value, a string without newline ('\n')
360 void save(std::string const & key, std::string const & value);
362 /** load session info
363 @param key a key to extract value from the session file
364 @param release whether or not clear the value. Default to true
365 since most of such values are supposed to be used only once.
367 std::string const load(std::string const & key, bool release = true);
370 /// a map to save session info
371 MiscInfo sessioninfo;
375 class Session : boost::noncopyable {
378 /** Read the session file.
379 @param num length of lastfiles
381 explicit Session(unsigned int num = 4);
383 /** Write the session file.
385 void writeFile() const;
388 LastFilesSection & lastFiles() { return last_files; }
391 LastFilesSection const & lastFiles() const { return last_files; }
394 LastOpenedSection & lastOpened() { return last_opened; }
397 LastOpenedSection const & lastOpened() const { return last_opened; }
400 LastFilePosSection & lastFilePos() { return last_file_pos; }
403 LastFilePosSection const & lastFilePos() const { return last_file_pos; }
406 BookmarksSection & bookmarks() { return bookmarks_; }
409 BookmarksSection const & bookmarks() const { return bookmarks_; }
412 ToolbarSection & toolbars() { return toolbars_; }
415 ToolbarSection const & toolbars() const { return toolbars_; }
418 SessionInfoSection & sessionInfo() { return session_info; }
421 SessionInfoSection const & sessionInfo() const { return session_info; }
424 /// file to save session, determined in the constructor.
425 support::FileName session_file;
427 /** Read the session file.
428 Reads the #.lyx/session# at the beginning of the LyX session.
429 This will read the session file (usually #.lyx/session#).
430 @param file the file containing the session.
435 LastFilesSection last_files;
438 LastOpenedSection last_opened;
441 LastFilePosSection last_file_pos;
444 BookmarksSection bookmarks_;
447 ToolbarSection toolbars_;
450 SessionInfoSection session_info;