lyx_mirror/src/Session.h

453 lines
11 KiB
C
Raw Normal View History

// -*- C++ -*-
/**
* \file Session.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Bo Peng
*
* Full author contact details are available in file CREDITS.
*/
#ifndef SESSION_H
#define SESSION_H
Rename files in src/support, step one. src/support/package.h src/support/Package.h Package src/support/package.C.in src/support/Package.C.in Package src/support/path.h src/support/Path.h Path src/support/fs_extras.h src/support/fs_extras.h NOCLASSES src/support/RandomAccessList.h src/support/RandomAccessList.h RandomAccessList src/support/lyxmanip.h src/support/lyxmanip.h NOCLASSES src/support/rename.C src/support/rename.cpp NOCLASSES src/support/abort.C src/support/abort.cpp NOCLASSES src/support/lyxlib.h src/support/lyxlib.h NOCLASSES src/support/ExceptionMessage.h src/support/ExceptionMessage.h ExceptionMessage src/support/copy.C src/support/copy.cpp NOCLASSES src/support/limited_stack.h src/support/limited_stack.h limited_stack src/support/filefilterlist.C src/support/FileFilterList.cpp ['FileFilterList', 'Filter'] src/support/cow_ptr.h src/support/cow_ptr.h cow_ptr src/support/os_unix.C src/support/os_unix.cpp NOCLASSES src/support/socktools.h src/support/socktools.h NOCLASSES src/support/forkedcontr.h src/support/ForkedcallsController.h ForkedcallsController src/support/os.h src/support/os.h NOCLASSES src/support/FileMonitor.h src/support/FileMonitor.h FileMonitor src/support/copied_ptr.h src/support/copied_ptr.h copied_ptr src/support/translator.h src/support/Translator.h Translator src/support/filetools.C src/support/filetools.cpp NOCLASSES src/support/unlink.C src/support/unlink.cpp NOCLASSES src/support/os_win32.C src/support/os_win32.cpp GetFolderPath src/support/lstrings.C src/support/lstrings.cpp NOCLASSES src/support/qstring_helpers.C src/support/qstring_helpers.cpp NOCLASSES src/support/getcwd.C src/support/getcwd.cpp NOCLASSES src/support/systemcall.C src/support/Systemcall.cpp Systemcall src/support/lyxalgo.h src/support/lyxalgo.h NOCLASSES src/support/filefilterlist.h src/support/FileFilterList.h ['FileFilterList', 'Filter'] src/support/unicode.C src/support/unicode.cpp IconvProcessor src/support/userinfo.C src/support/userinfo.cpp NOCLASSES src/support/lyxtime.C src/support/lyxtime.cpp NOCLASSES src/support/kill.C src/support/kill.cpp NOCLASSES src/support/docstring.C src/support/docstring.cpp to_local8bit_failure src/support/os_cygwin.C src/support/os_cygwin.cpp NOCLASSES src/support/lyxsum.C src/support/lyxsum.cpp NOCLASSES src/support/environment.C src/support/environment.cpp NOCLASSES src/support/filetools.h src/support/filetools.h NOCLASSES src/support/textutils.C src/support/textutils.cpp NOCLASSES src/support/mkdir.C src/support/mkdir.cpp NOCLASSES src/support/forkedcall.C src/support/Forkedcall.cpp ['ForkedProcess', 'Forkedcall'] src/support/tempname.C src/support/tempname.cpp NOCLASSES src/support/os_win32.h src/support/os_win32.h GetFolderPath src/support/types.h src/support/types.h NOCLASSES src/support/lstrings.h src/support/lstrings.h NOCLASSES src/support/forkedcallqueue.C src/support/ForkedCallQueue.cpp ForkedCallQueue src/support/qstring_helpers.h src/support/qstring_helpers.h NOCLASSES src/support/convert.C src/support/convert.cpp NOCLASSES src/support/filename.C src/support/FileName.cpp ['FileName', 'DocFileName'] src/support/tests/convert.C src/support/tests/convert.cpp NOCLASSES src/support/tests/filetools.C src/support/tests/filetools.cpp NOCLASSES src/support/tests/lstrings.C src/support/tests/lstrings.cpp NOCLASSES src/support/tests/boost.C src/support/tests/boost.cpp NOCLASSES src/support/docstream.C src/support/docstream.cpp ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream'] src/support/std_istream.h src/support/std_istream.h NOCLASSES src/support/systemcall.h src/support/Systemcall.h Systemcall src/support/chdir.C src/support/chdir.cpp NOCLASSES src/support/std_ostream.h src/support/std_ostream.h NOCLASSES src/support/unicode.h src/support/unicode.h IconvProcessor src/support/path.C src/support/Path.cpp Path src/support/fs_extras.C src/support/fs_extras.cpp NOCLASSES src/support/userinfo.h src/support/userinfo.h NOCLASSES src/support/lyxtime.h src/support/lyxtime.h NOCLASSES src/support/docstring.h src/support/docstring.h to_local8bit_failure src/support/debugstream.h src/support/debugstream.h basic_debugstream src/support/environment.h src/support/environment.h NOCLASSES src/support/textutils.h src/support/textutils.h NOCLASSES src/support/forkedcall.h src/support/Forkedcall.h ['ForkedProcess', 'Forkedcall'] src/support/socktools.C src/support/socktools.cpp NOCLASSES src/support/forkedcallqueue.h src/support/ForkedCallQueue.h ForkedCallQueue src/support/forkedcontr.C src/support/ForkedcallsController.cpp ForkedcallsController src/support/os.C src/support/os.cpp NOCLASSES src/support/convert.h src/support/convert.h NOCLASSES src/support/filename.h src/support/FileName.h ['FileName', 'DocFileName'] src/support/docstream.h src/support/docstream.h ['iconv_codecvt_facet_exception', 'idocfstream', 'odocfstream'] src/support/FileMonitor.C src/support/FileMonitor.cpp FileMonitor git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18024 a592a061-630c-0410-9148-cb99ea01b6c8
2007-04-26 05:12:52 +00:00
#include "support/FileName.h"
#include "support/types.h"
#include <list>
#include <string>
#include <vector>
/** This session file maintains
1. the latest documents loaded (lastfiles)
2. cursor positions of files closed (lastfilepos)
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
*/
class SessionSection
{
public:
///
SessionSection() {}
///
virtual ~SessionSection() {}
/// read section from std::istream
virtual void read(std::istream & is) = 0;
/// write to std::ostream
virtual void write(std::ostream & os) const = 0;
private:
/// uncopiable
SessionSection(SessionSection const &);
void operator=(SessionSection const &);
};
class LastFilesSection : SessionSection
{
public:
///
typedef std::vector<support::FileName> LastFiles;
public:
///
explicit LastFilesSection(unsigned int num = 4);
///
void read(std::istream & is) override;
///
void write(std::ostream & os) const override;
/// Return lastfiles container (vector)
LastFiles const lastFiles() const { return lastfiles; }
/** 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
file in the list is popped from the end.
@param file the file to insert in the lastfile list.
*/
void add(support::FileName const & file);
private:
/// Default number of lastfiles.
unsigned int const default_num_last_files;
/// Max number of lastfiles.
unsigned int const absolute_max_last_files;
/// a list of lastfiles
LastFiles lastfiles;
/// number of files in the lastfiles list.
unsigned int num_lastfiles;
/** Used by the constructor to set the number of stored last files.
@param num the number of lastfiles to set.
*/
void setNumberOfLastFiles(unsigned int num);
};
class LastOpenedSection : SessionSection
{
public:
///
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) override;
///
void write(std::ostream & os) const override;
/// Return lastopened container (vector)
LastOpened const getfiles() const { return lastopened; }
/** add file to lastopened file list
@param file filename to add
*/
void add(support::FileName const & file, bool active = false);
/** clear lastopened file list
*/
void clear();
private:
/// a list of lastopened files
LastOpened lastopened;
};
class LastFilePosSection : SessionSection
{
public:
///
struct FilePos {
FilePos() : pit(0), pos(0) {}
support::FileName file;
pit_type pit;
pos_type pos;
};
///
typedef std::list<FilePos> FilePosList;
public:
///
LastFilePosSection() : num_lastfilepos(100) {}
///
void read(std::istream & is) override;
///
void write(std::ostream & os) const override;
/** 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(FilePos const & pos);
/** 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;
private:
/// default number of lastfilepos to save */
unsigned int const num_lastfilepos;
/// a list of file positions
FilePosList lastfilepos;
};
class BookmarksSection : SessionSection
{
public:
/// 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;
/// 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() : bottom_pit(0), bottom_pos(0), top_id(0), top_pos(0) {}
///
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 updatePos(pit_type pit, pos_type pos, int id) {
bottom_pit = pit;
bottom_pos = pos;
top_id = id;
}
};
///
typedef std::vector<Bookmark> BookmarkList;
public:
/// constructor, set max_bookmarks
/// allow 9 regular bookmarks, bookmark 0 is temporary
BookmarksSection() : bookmarks(10), max_bookmarks(9) {}
/// Save the current position as bookmark
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 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;
/// is there at least one bookmark that has a saved position ?
bool hasValid() const;
///
unsigned int size() const { return max_bookmarks; }
/// clear all bookmarks
void clear();
///
void read(std::istream & is) override;
///
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; }
private:
/// a list of bookmarks
BookmarkList bookmarks;
///
unsigned int const max_bookmarks;
};
class LastCommandsSection : SessionSection
{
public:
///
typedef std::vector<std::string> LastCommands;
public:
///
LastCommandsSection(unsigned int num);
///
void read(std::istream & is) override;
///
void write(std::ostream & os) const override;
/// Return lastcommands container (vector)
LastCommands const getcommands() const { return lastcommands; }
/** add command to lastcommands list
@param command command to add
*/
void add(std::string const & command);
/** clear lastcommands list
*/
void clear();
private:
/// number of commands in the lastcommands list.
unsigned int num_lastcommands;
/** 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);
/// a list of lastopened commands
LastCommands lastcommands;
/// Default number of lastcommands.
unsigned int const default_num_last_commands;
/// Max number of lastcommands.
unsigned int const absolute_max_last_commands;
};
class AuthFilesSection : SessionSection
{
public:
///
explicit AuthFilesSection();
///
void read(std::istream & is) override;
///
void write(std::ostream & os) const override;
///
bool find(std::string const & name) const;
///
void insert(std::string const & name);
private:
/// set of document files authorized for external conversion
std::set<std::string> auth_files_;
};
class ShellEscapeSection : SessionSection
{
public:
///
explicit ShellEscapeSection() {};
///
void read(std::istream & is) override;
///
void write(std::ostream & os) const override;
///
bool find(std::string const & name) const;
///
bool findAuth(std::string const & name) const;
///
void insert(std::string const & name, bool auth = false);
///
void remove(std::string const & name);
private:
/// set of document files authorized for external conversion
std::set<std::string> shellescape_files_;
};
class Session
{
public:
/// 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_; }
///
LastCommandsSection & lastCommands() { return last_commands; }
///
LastCommandsSection const & lastCommands() const { return last_commands; }
///
AuthFilesSection & authFiles() { return auth_files; }
///
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;
/** Read the session file.
Reads the #.lyx/session# at the beginning of the LyX session.
This will read the session file (usually #.lyx/session#).
@param file the file containing the session.
*/
void readFile();
///
LastFilesSection last_files;
///
LastOpenedSection last_opened;
///
LastFilePosSection last_file_pos;
///
BookmarksSection bookmarks_;
///
LastCommandsSection last_commands;
///
AuthFilesSection auth_files;
///
ShellEscapeSection shellescape_files;
};
/// This is a singleton class. Get the instance.
/// Implemented in LyX.cpp.
Session & theSession();
Bulk cleanup/fix incorrect annotation at the end of namespaces. This commit does a bulk fix of incorrect annotations (comments) at the end of namespaces. The commit was generated by initially running clang-format, and then from the diff of the result extracting the hunks corresponding to fixes of namespace comments. The changes being applied and all the results have been manually reviewed. The source code successfully builds on macOS. Further details on the steps below, in case they're of interest to someone else in the future. 1. Checkout a fresh and up to date version of src/ git pull && git checkout -- src && git status src 2. Ensure there's a suitable .clang-format in place, i.e. with options to fix the comment at the end of namespaces, including: FixNamespaceComments: true SpacesBeforeTrailingComments: 1 and that clang-format is >= 5.0.0, by doing e.g.: clang-format -dump-config | grep Comments: clang-format --version 3. Apply clang-format to the source: clang-format -i $(find src -name "*.cpp" -or -name "*.h") 4. Create and filter out hunks related to fixing the namespace git diff -U0 src > tmp.patch grepdiff '^} // namespace' --output-matching=hunk tmp.patch > fix_namespace.patch 5. Filter out hunks corresponding to simple fixes into to a separate patch: pcregrep -M -e '^diff[^\n]+\nindex[^\n]+\n--- [^\n]+\n\+\+\+ [^\n]+\n' \ -e '^@@ -[0-9]+ \+[0-9]+ @@[^\n]*\n-\}[^\n]*\n\+\}[^\n]*\n' \ fix_namespace.patch > fix_namespace_simple.patch 6. Manually review the simple patch and then apply it, after first restoring the source. git checkout -- src patch -p1 < fix_namespace_simple.path 7. Manually review the (simple) changes and then stage the changes git diff src git add src 8. Again apply clang-format and filter out hunks related to any remaining fixes to the namespace, this time filter with more context. There will be fewer hunks as all the simple cases have already been handled: clang-format -i $(find src -name "*.cpp" -or -name "*.h") git diff src > tmp.patch grepdiff '^} // namespace' --output-matching=hunk tmp.patch > fix_namespace2.patch 9. Manually review/edit the resulting patch file to remove hunks for files which need to be dealt with manually, noting the file names and line numbers. Then restore files to as before applying clang-format and apply the patch: git checkout src patch -p1 < fix_namespace2.patch 10. Manually fix the files noted in the previous step. Stage files, review changes and commit.
2017-07-23 11:11:54 +00:00
} // namespace lyx
#endif