scramble email addresses
[lyx.git] / src / KeySequence.cpp
blob727c49d636883ffe6bc61681d885af53ac714ce6
1 /**
2 * \file KeySequence.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Lars Gullik Bjønnes
7 * \author Jean-Marc Lasgouttes
8 * \author John Levon
10 * Full author contact details are available in file CREDITS.
13 #include <config.h>
15 #include "KeySequence.h"
17 #include "gettext.h"
18 #include "KeyMap.h"
19 #include "lfuns.h"
21 #include "frontends/KeySymbol.h"
23 using std::make_pair;
24 using std::string;
27 namespace lyx {
29 FuncRequest const & KeySequence::addkey(KeySymbol const & key,
30 KeyModifier mod, KeyModifier nmod)
32 // adding a key to a deleted sequence
33 // starts a new sequence
34 if (deleted_) {
35 deleted_ = false;
36 sequence.clear();
37 modifiers.clear();
40 modifiers.push_back(make_pair(mod, nmod));
41 sequence.push_back(key);
43 if (curmap) {
44 return curmap->lookup(key, mod, this);
47 static FuncRequest unknown(LFUN_UNKNOWN_ACTION);
48 return unknown;
52 size_t KeySequence::parse(string const & s)
54 if (s.empty())
55 return 1;
57 size_t i = 0;
58 KeyModifier mod = NoModifier;
59 KeyModifier nmod = NoModifier;
61 while (i < s.length()) {
62 if (s[i] == ' ')
63 ++i;
64 if (i >= s.length())
65 break;
67 if (i + 1 < s.length() && s[i + 1] == '-') {
68 switch (s[i]) {
69 case 's': case 'S':
70 mod |= ShiftModifier;
71 i += 2;
72 continue;
73 case 'c': case 'C':
74 mod |= ControlModifier;
75 i += 2;
76 continue;
77 case 'm': case 'M':
78 mod |= AltModifier;
79 i += 2;
80 continue;
81 default:
82 return i + 1;
84 } else if (i + 2 < s.length() && s[i] == '~'
85 && s[i + 2] == '-') {
86 switch (s[i + 1]) {
87 case 's': case 'S':
88 nmod |= ShiftModifier;
89 i += 3;
90 continue;
91 case 'c': case 'C':
92 nmod |= ControlModifier;
93 i += 3;
94 continue;
95 case 'm': case 'M':
96 nmod |= AltModifier;
97 i += 3;
98 continue;
99 default:
100 return i + 2;
102 } else {
103 string tbuf;
104 size_t j = i;
105 for (; j < s.length() && s[j] != ' '; ++j)
106 tbuf += s[j]; // (!!!check bounds :-)
108 KeySymbol key;
109 key.init(tbuf);
111 if (!key.isOK())
112 return j;
114 i = j;
116 addkey(key, mod, nmod);
117 mod = NoModifier;
121 // empty sequence?
122 if (sequence.size() == 0)
123 return 0;
125 // everything is fine
126 return string::npos;
130 docstring const KeySequence::print(outputFormat format) const
132 docstring buf;
134 size_t const length = sequence.size();
136 for (size_t i = 0; i != length; ++i) {
137 switch (format) {
138 case Portable:
139 buf += sequence[i].print(modifiers[i].first, false);
140 break;
141 case ForGui:
142 buf += sequence[i].print(modifiers[i].first, true);
143 break;
144 case BindFile:
145 KeyModifier mod = modifiers[i].first;
146 if (mod & ShiftModifier)
147 buf += "S-";
148 if (mod & ControlModifier)
149 buf += "C-";
150 if (mod & AltModifier)
151 buf += "M-";
153 buf += from_utf8(sequence[i].getSymbolName());
154 break;
156 // append a blank
157 if (i + 1 != length)
158 buf += ' ';
160 return buf;
164 docstring const KeySequence::printOptions(bool forgui) const
166 docstring buf = print(forgui ? ForGui : Portable);
168 if (!curmap)
169 return buf;
171 buf += _(" options: ");
172 buf += curmap->print(forgui ? ForGui : Portable);
173 return buf;
177 void KeySequence::mark_deleted()
179 deleted_ = true;
183 void KeySequence::reset()
185 mark_deleted();
186 curmap = stdmap;
190 void KeySequence::clear()
192 sequence.clear();
193 reset();
197 } // namespace lyx