1 // -*- C++ -*-
2 /**
3  * \file LyXAction.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Lars Gullik Bjønnes
8  * \author John Levon
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12 
13 #ifndef LYXACTION_H
14 #define LYXACTION_H
15 
16 #include "FuncCode.h"
17 
18 #include <map>
19 #include <string>
20 
21 
22 namespace lyx {
23 
24 // current LFUN format
25 static unsigned int const LFUN_FORMAT = 4; // gm: tabular-feature
26 
27 class FuncRequest;
28 class LyXErr;
29 
30 /**
31  * This class is a container for LyX actions. It associates a name to
32  * most of them and describes some of their properties.
33  */
34 class LyXAction {
35 public:
36 	/// category of an action, used in the Shortcuts dialog
37 	enum FuncType {
38 		Hidden,  //< Not listed for configuration
39 		Edit,    //< Cursor and mouse movement, copy/paste etc
40 		Math,    //< Mathematics
41 		Buffer,  //< Buffer and window related
42 		Layout,  //< Font, Layout and textclass related
43 		System   //< Lyx preference, server etc
44 	};
45 
46 private:
47 	/// information for an action
48 	struct FuncInfo {
49 		/// the action name
50 		std::string name;
51 		/// the FuncAttribs values set
52 		unsigned int attrib;
53 		/// the category of this func
54 		FuncType type;
55 	};
56 	/// type for map between a function name and its action
57 	typedef std::map<std::string, FuncCode> FuncMap;
58 	/// type for map between an action and its info
59 	typedef std::map<FuncCode, FuncInfo> InfoMap;
60 
61 public:
62 	/// possible "permissions" for an action
63 	enum FuncAttribs {
64 		Noop = 0, //< Nothing special about this func
65 		ReadOnly = 1, //< Can be used in RO mode (perhaps this should change)
66 		NoBuffer = 2, //< Can be used when there is no document open
67 		Argument = 4, //< Requires argument
68 		NoUpdate = 8, //< Does not (usually) require update
69 		SingleParUpdate = 16, //< Usually only requires this par updated
70 		AtPoint = 32, //< dispatch first to inset at cursor if there is one
71 		NoInternal = 64 //< Cannot be used for internal, non-document Buffers
72 	};
73 
74 	LyXAction();
75 
76 	/**
77 	 * Creates a FuncRequest from a string of the form:
78 	 *   lyx-function [argument]
79 	 * where the argument is optional and "lyx-function" is in the form you'd
80 	 * enter it in the mini-buffer.
81 	 */
82 	FuncRequest lookupFunc(std::string const & func_name) const;
83 
84 	/// Return the command name associated with the given action
85 	/// Thus: getActionName(LFUN_ERT_INSERT) --> "ert-insert".
86 	std::string const getActionName(FuncCode action) const;
87 	///
88 	FuncType getActionType(FuncCode action) const;
89 
90 	/// True if the command has `flag' set
91 	bool funcHasFlag(FuncCode action, FuncAttribs flag) const;
92 
93 	/// iterator across all LFUNs
94 	typedef FuncMap::const_iterator const_iterator;
95 
96 	/// return an iterator to the start of the list of LFUNs
97 	const_iterator func_begin() const;
98 
99 	/// return an iterator to one past the end of the list of LFUNs
100 	const_iterator func_end() const;
101 
102 private:
103 	/// noncopyable
104 	LyXAction(LyXAction const &);
105 	void operator=(LyXAction const &);
106 
107 	/// populate the action container with our actions
108 	void init();
109 	/// add the given action
110 	void newFunc(FuncCode, std::string const & name, unsigned int attrib, FuncType type);
111 
112 	/**
113 	 * This maps LyX function names to function codes, e.g.:
114 	 *   lyx_func_map["ert-insert"] == LFUN_ERT_INSERT
115 	 */
116 	FuncMap lyx_func_map;
117 
118 	/**
119 	 * This maps function codes to objects holding info about the corresponding
120 	 * action. E.g., if
121 	 *   FuncInfo const & ert = lyx_info_map[LFUN_ERT_INSERT];
122 	 * then:
123 	 *   ert.name   == "ert-insert"'
124 	 *   ert.attrib == Noop
125 	 *   ert.type   == Edit
126 	 */
127 	InfoMap lyx_info_map;
128 };
129 
130 LyXErr & operator<<(LyXErr &, FuncCode);
131 
132 /// singleton instance
133 extern LyXAction lyxaction;
134 
135 
136 } // namespace lyx
137 
138 #endif // LYXACTION_H
139