]> git.lyx.org Git - lyx.git/blobdiff - src/Session.h
Fix bug #12772
[lyx.git] / src / Session.h
index 119b2a47af4095c2626ce9e365f1ca009e810545..a433cbaf59abdf5f5b3b938949754d5972b8e156 100644 (file)
 #include "support/FileName.h"
 #include "support/types.h"
 
-#include <boost/noncopyable.hpp>
-#include <boost/tuple/tuple.hpp>
-
+#include <list>
 #include <string>
-#include <deque>
 #include <vector>
-#include <map>
-
-// used by at least frontends/qt2/QPref.C
-const long maxlastfiles = 20;
 
 /** This session file maintains
   1. the latest documents loaded (lastfiles)
@@ -33,14 +26,17 @@ const long maxlastfiles = 20;
   3. opened files when a lyx session is closed (lastopened)
   4. bookmarks
   5. general purpose session info in the form of key/value pairs
+  6. the latest commands entered in the command buffer (lastcommands)
  */
 namespace lyx {
 
-/** base class for all sections in the session file
+/* base class for all sections in the session file
 */
-class SessionSection : boost::noncopyable {
-
+class SessionSection
+{
 public:
+       ///
+       SessionSection() {}
        ///
        virtual ~SessionSection() {}
 
@@ -49,6 +45,11 @@ public:
 
        /// write to std::ostream
        virtual void write(std::ostream & os) const = 0;
+
+private:
+       /// uncopiable
+       SessionSection(SessionSection const &);
+       void operator=(SessionSection const &);
 };
 
 
@@ -56,22 +57,22 @@ class LastFilesSection : SessionSection
 {
 public:
        ///
-       typedef std::deque<support::FileName> LastFiles;
+       typedef std::vector<support::FileName> LastFiles;
 
 public:
        ///
        explicit LastFilesSection(unsigned int num = 4);
 
        ///
-       void read(std::istream & is);
+       void read(std::istream & is) override;
 
        ///
-       void write(std::ostream & os) const;
+       void write(std::ostream & os) const override;
 
-       /// Return lastfiles container (deque)
+       /// Return lastfiles container (vector)
        LastFiles const lastFiles() const { return lastfiles; }
 
-       /** Insert #file# into the lastfile dequeue.
+       /** Insert #file# into the lastfile vector.
            This funtion inserts #file# into the last files list. If the file
            already exists it is moved to the top of the list, else exist it
            is placed on the top of the list. If the list is full the last
@@ -104,14 +105,24 @@ class LastOpenedSection : SessionSection
 {
 public:
        ///
-       typedef std::vector<support::FileName> LastOpened;
+       struct LastOpenedFile {
+               LastOpenedFile() : file_name(), active(false) {}
+
+               LastOpenedFile(support::FileName file_name_, bool active_)
+                       : file_name(file_name_), active(active_) {}
+
+               support::FileName file_name;
+               bool active;
+       };
+       ///
+       typedef std::vector<LastOpenedFile> LastOpened;
 
 public:
        ///
-       void read(std::istream & is);
+       void read(std::istream & is) override;
 
        ///
-       void write(std::ostream & os) const;
+       void write(std::ostream & os) const override;
 
        /// Return lastopened container (vector)
        LastOpened const getfiles() const { return lastopened; }
@@ -119,7 +130,7 @@ public:
        /** add file to lastopened file list
            @param file filename to add
        */
-       void add(support::FileName const & file);
+       void add(support::FileName const & file, bool active = false);
 
        /** clear lastopened file list
         */
@@ -135,28 +146,32 @@ class LastFilePosSection : SessionSection
 {
 public:
        ///
-       typedef boost::tuple<pit_type, pos_type> FilePos;
+       struct FilePos {
+               FilePos() : pit(0), pos(0) {}
+               support::FileName file;
+               pit_type pit;
+               pos_type pos;
+       };
 
        ///
-       typedef std::map<support::FileName, FilePos> FilePosMap;
+       typedef std::list<FilePos> FilePosList;
 
 public:
        ///
        LastFilePosSection() : num_lastfilepos(100) {}
 
        ///
-       void read(std::istream & is);
+       void read(std::istream & is) override;
 
        ///
-       void write(std::ostream & os) const;
+       void write(std::ostream & os) const override;
 
-       /** add cursor position to the fname entry in the filepos map
-           @param fname file entry for which to save position information
-           @param pos position of the cursor when the file is closed.
+       /** add cursor position to the fname entry in the filepos list
+           @param pos file name and position of the cursor when the BufferView is closed.
        */
-       void save(support::FileName const & fname, FilePos pos);
+       void save(FilePos const & pos);
 
-       /** load saved cursor position from the fname entry in the filepos map
+       /** load saved cursor position from the fname entry in the filepos list
            @param fname file entry for which to load position information
        */
        FilePos load(support::FileName const & fname) const;
@@ -166,8 +181,8 @@ private:
        unsigned int const num_lastfilepos;
 
 
-       /// a map of file positions
-       FilePosMap lastfilepos;
+       /// a list of file positions
+       FilePosList lastfilepos;
 };
 
 
@@ -181,7 +196,7 @@ public:
        /// 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! :-)
+       /// is saved to session. (What a mess! :-)
        ///
        /// TODO: bottom level pit and pos will be replaced by StableDocIterator
        class Bookmark {
@@ -214,9 +229,8 @@ public:
        typedef std::vector<Bookmark> BookmarkList;
 
 public:
-       /// constructor, set max_bookmarks
-       /// allow 9 regular bookmarks, bookmark 0 is temporary
-       BookmarksSection() : bookmarks(10), max_bookmarks(9) {}
+       ///
+       BookmarksSection() : bookmarks(max_bookmarks + 1) {}
 
        /// Save the current position as bookmark
        void save(support::FileName const & fname, pit_type bottom_pit, pos_type bottom_pos,
@@ -228,199 +242,194 @@ public:
        /// does the given bookmark have a saved position ?
        bool isValid(unsigned int i) const;
 
+       /// is there at least one bookmark that has a saved position ?
+       bool hasValid() const;
+
        ///
-       unsigned int size() const { return max_bookmarks; }
+       unsigned int size() const { return bookmarks.size(); }
 
        /// clear all bookmarks
        void clear();
 
        ///
-       void read(std::istream & is);
+       void read(std::istream & is) override;
 
        ///
-       void write(std::ostream & os) const;
+       void write(std::ostream & os) const override;
 
        /** return bookmark list. Non-const container is used since
                bookmarks will be cleaned after use.
        */
        BookmarkList & load() { return bookmarks; }
 
+       ///
+       typedef std::vector<std::pair<unsigned int, pos_type>> BookmarkPosList;
+
+       /// return a list of bookmarks and position for this paragraph
+       BookmarkPosList bookmarksInPar(support::FileName const & fn, int par_id) const;
+
+       /* An insertion/deletion in paragraph \c par_id of buffer \c fn
+        * lead to an offset \c offset after position \c pos. Update
+        * bookmarks accordingly.
+        */
+       void adjustPosAfterPos(support::FileName const & fn,
+                              int const par_id, pos_type pos, int offset);
+
 private:
 
+       /// allow 9 regular bookmarks, bookmark 0 is temporary
+       unsigned int const max_bookmarks = 9;
+
        /// a list of bookmarks
        BookmarkList bookmarks;
 
-       ///
-       unsigned int const max_bookmarks;
 };
 
 
-class ToolbarSection : SessionSection
+class LastCommandsSection : 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)
-                       { }
+       ///
+       typedef std::vector<std::string> LastCommands;
 
-       public:
-               enum State {
-                       ON,
-                       OFF,
-                       AUTO
-               };
+public:
+       ///
+       LastCommandsSection(unsigned int num);
+       ///
+       void read(std::istream & is) override;
 
-               /// on/off/auto
-               State state;
+       ///
+       void write(std::ostream & os) const override;
+
+       /// Return lastcommands container (vector)
+       LastCommands const & getcommands() const { return lastcommands; }
 
-               /// location: this can be intepreted differently.
-               enum Location {
-                       TOP,
-                       BOTTOM,
-                       LEFT,
-                       RIGHT,
-                       NOTSET
-               };
+       /** add command to lastcommands list
+           @param command command to add
+       */
+       void add(std::string const & command);
 
-               Location location;
+       /** clear lastcommands list
+        */
+       void clear();
 
-               /// x-position of the toolbar
-               int posx;
+private:
+       /// number of commands in the lastcommands list.
+       unsigned int num_lastcommands;
 
-               /// y-position of the toolbar
-               int posy;
+       /** Used by the constructor to set the number of stored last commands.
+           @param num the number of lastcommands to set.
+       */
+       void setNumberOfLastCommands(unsigned int num);
 
-               /// potentially, icons
-       };
+       /// a list of lastopened commands
+       LastCommands lastcommands;
 
-       typedef boost::tuple<std::string, ToolbarInfo> ToolbarItem;
+       /// Default number of lastcommands.
+       unsigned int const default_num_last_commands;
 
-       /// info for each toolbar
-       typedef std::vector<ToolbarItem> ToolbarList;
+       /// Max number of lastcommands.
+       unsigned int const absolute_max_last_commands;
+};
 
 
+class AuthFilesSection : SessionSection
+{
 public:
        ///
-       void read(std::istream & is);
+       explicit AuthFilesSection();
 
        ///
-       void write(std::ostream & os) const;
+       void read(std::istream & is) override;
 
-       /// return reference to toolbar info, create a new one if needed
-       ToolbarInfo & load(std::string const & name);
+       ///
+       void write(std::ostream & os) const override;
 
-       /// toolbar begin
-       ToolbarList::const_iterator begin() { return toolbars.begin(); }
+       ///
+       bool find(std::string const & name) const;
 
-       /// toolbar end
-       ToolbarList::const_iterator end() { return toolbars.end(); }
+       ///
+       void insert(std::string const & name);
 
 private:
-       /// toolbar information
-       ToolbarList toolbars;
+       /// set of document files authorized for external conversion
+       std::set<std::string> auth_files_;
 };
 
-/// 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
+class ShellEscapeSection : SessionSection
 {
 public:
        ///
-       typedef std::map<std::string, std::string> MiscInfo;
+       explicit ShellEscapeSection() {}
 
-public:
        ///
-       void read(std::istream & is);
+       void read(std::istream & is) override;
 
        ///
-       void write(std::ostream & os) const;
+       void write(std::ostream & os) const override;
 
-       /** set session info
-               @param key key of the value to store
-               @param value value, a string without newline ('\n')
-       */
-       void save(std::string const & key, std::string const & value);
+       ///
+       bool find(std::string const & name) const;
 
-       /** load session info
-               @param key a key to extract value from the session file
-               @param release whether or not clear the value. Default to true
-                       since most of such values are supposed to be used only once.
-       */
-       std::string const load(std::string const & key, bool release = true);
+       ///
+       bool findAuth(std::string const & name) const;
+
+       ///
+       void insert(std::string const & name, bool auth = false);
+
+       ///
+       void remove(std::string const & name);
 
 private:
-       /// a map to save session info
-       MiscInfo sessioninfo;
+       /// set of document files authorized for external conversion
+       std::set<std::string> shellescape_files_;
 };
 
 
-class Session : boost::noncopyable {
-
+class Session
+{
 public:
-       /** Read the session file.
-           @param num length of lastfiles
-       */
-       explicit Session(unsigned int num = 4);
-
-       /** Write the session file.
-       */
+       /// Read the session file.  @param num length of lastfiles
+       explicit Session(unsigned int num_last_files = 4,
+               unsigned int num_last_commands = 30);
+       /// Write the session file.
        void writeFile() const;
-
        ///
        LastFilesSection & lastFiles() { return last_files; }
-
        ///
        LastFilesSection const & lastFiles() const { return last_files; }
-
        ///
        LastOpenedSection & lastOpened() { return last_opened; }
-
        ///
        LastOpenedSection const & lastOpened() const { return last_opened; }
-
        ///
        LastFilePosSection & lastFilePos() { return last_file_pos; }
-
        ///
        LastFilePosSection const & lastFilePos() const { return last_file_pos; }
-
        ///
        BookmarksSection & bookmarks() { return bookmarks_; }
-
        ///
        BookmarksSection const & bookmarks() const { return bookmarks_; }
-
        ///
-       ToolbarSection & toolbars() { return toolbars_; }
-
+       LastCommandsSection & lastCommands() { return last_commands; }
        ///
-       ToolbarSection const & toolbars() const { return toolbars_; }
-
+       LastCommandsSection const & lastCommands() const { return last_commands; }
        ///
-       SessionInfoSection & sessionInfo() { return session_info; }
-
+       AuthFilesSection & authFiles() { return auth_files; }
        ///
-       SessionInfoSection const & sessionInfo() const { return session_info; }
+       AuthFilesSection const & authFiles() const { return auth_files; }
+       ///
+       ShellEscapeSection & shellescapeFiles() { return shellescape_files; }
+       ///
+       ShellEscapeSection const & shellescapeFiles() const { return shellescape_files; }
 
 private:
+       friend class LyX;
+       /// uncopiable
+       Session(Session const &);
+       void operator=(Session const &);
+
        /// file to save session, determined in the constructor.
        support::FileName session_file;
 
@@ -433,23 +442,24 @@ private:
 
        ///
        LastFilesSection last_files;
-
        ///
        LastOpenedSection last_opened;
-
        ///
        LastFilePosSection last_file_pos;
-
        ///
        BookmarksSection bookmarks_;
-
        ///
-       ToolbarSection toolbars_;
-
+       LastCommandsSection last_commands;
        ///
-       SessionInfoSection session_info;
+       AuthFilesSection auth_files;
+       ///
+       ShellEscapeSection shellescape_files;
 };
 
-}
+/// This is a singleton class. Get the instance.
+/// Implemented in LyX.cpp.
+Session & theSession();
+
+} // namespace lyx
 
 #endif