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
181 support::FileName filename;
182 /// Cursor paragraph Id
187 Bookmark() : par_id(0), par_pos(0) {}
189 Bookmark(support::FileName const & f, int id, pos_type pos)
190 : filename(f), par_id(id), par_pos(pos) {}
194 typedef std::deque<Bookmark> BookmarkList;
197 /// constructor, set max_bookmarks
198 /// allow 20 regular bookmarks
199 BookmarksSection() : bookmarks(0), max_bookmarks(20) {}
201 /// Save the current position as bookmark
202 /// if save==false, save to temp_bookmark
203 void save(support::FileName const & fname, int par_id, pos_type par_pos, bool persistent);
205 /// return bookmark, return temp_bookmark if i==0
206 Bookmark const & bookmark(unsigned int i) const;
208 /// does the given bookmark have a saved position ?
209 bool isValid(unsigned int i) const;
212 unsigned int size() const { return bookmarks.size(); }
214 /// clear all bookmarks
215 void clear() { bookmarks.clear(); }
218 void read(std::istream & is);
221 void write(std::ostream & os) const;
223 /** return bookmark list. Non-const container is used since
224 bookmarks will be cleaned after use.
226 BookmarkList & load() { return bookmarks; }
229 /// temp bookmark (previously saved_positions[0]), this is really ugly
230 /// c.f. ./frontends/controllers/ControlRef.C
231 /// FIXME: a separate LFUN may be a better solution
232 Bookmark temp_bookmark;
234 /// a list of bookmarks
235 BookmarkList bookmarks;
238 unsigned int const max_bookmarks;
242 class ToolbarSection : SessionSection
245 /// information about a toolbar, not all information can be
246 /// saved/restored by all frontends, but this class provides
247 /// a superset of things that can be managed by session.
253 state(ON), location(NOTSET) { }
255 ToolbarInfo(int s, int loc) :
256 state(static_cast<State>(s)), location(static_cast<Location>(loc)) { }
268 /// location: this can be intepreted differently.
279 /// potentially, icons
282 /// info for each toolbar
283 typedef std::map<std::string, ToolbarInfo> ToolbarMap;
287 void read(std::istream & is);
290 void write(std::ostream & os) const;
292 /// return reference to toolbar info, create a new one if needed
293 ToolbarInfo & load(std::string const & name);
296 /// toolbar information
301 class SessionInfoSection : SessionSection
305 typedef std::map<std::string, std::string> MiscInfo;
309 void read(std::istream & is);
312 void write(std::ostream & os) const;
315 @param key key of the value to store
316 @param value value, a string without newline ('\n')
318 void save(std::string const & key, std::string const & value);
320 /** load session info
321 @param key a key to extract value from the session file
322 @param release whether or not clear the value. Default to true
323 since most of such values are supposed to be used only once.
325 std::string const load(std::string const & key, bool release = true);
328 /// a map to save session info
329 MiscInfo sessioninfo;
333 class Session : boost::noncopyable {
336 /** Read the session file.
337 @param num length of lastfiles
339 explicit Session(unsigned int num = 4);
341 /** Write the session file.
343 void writeFile() const;
346 LastFilesSection & lastFiles() { return last_files; }
349 LastFilesSection const & lastFiles() const { return last_files; }
352 LastOpenedSection & lastOpened() { return last_opened; }
355 LastOpenedSection const & lastOpened() const { return last_opened; }
358 LastFilePosSection & lastFilePos() { return last_file_pos; }
361 LastFilePosSection const & lastFilePos() const { return last_file_pos; }
364 BookmarksSection & bookmarks() { return bookmarks_; }
367 BookmarksSection const & bookmarks() const { return bookmarks_; }
370 ToolbarSection & toolbars() { return toolbars_; }
373 ToolbarSection const & toolbars() const { return toolbars_; }
376 SessionInfoSection & sessionInfo() { return session_info; }
379 SessionInfoSection const & sessionInfo() const { return session_info; }
382 /// file to save session, determined in the constructor.
383 support::FileName session_file;
385 /** Read the session file.
386 Reads the #.lyx/session# at the beginning of the LyX session.
387 This will read the session file (usually #.lyx/session#).
388 @param file the file containing the session.
393 LastFilesSection last_files;
396 LastOpenedSection last_opened;
399 LastFilePosSection last_file_pos;
402 BookmarksSection bookmarks_;
405 ToolbarSection toolbars_;
408 SessionInfoSection session_info;