]> git.lyx.org Git - lyx.git/blob - src/KeySequence.cpp
Update shortcuts in fr.po
[lyx.git] / src / KeySequence.cpp
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.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author Jean-Marc Lasgouttes
8  * \author John Levon
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #include <config.h>
14
15 #include "KeySequence.h"
16 #include "KeyMap.h"
17
18 #include "support/gettext.h"
19
20 #include "frontends/KeySymbol.h"
21
22 using namespace std;
23
24 namespace lyx {
25
26 FuncRequest const & KeySequence::addkey(KeySymbol const & key,
27         KeyModifier mod, KeyModifier nmod)
28 {
29         // adding a key to a deleted sequence
30         // starts a new sequence
31         if (deleted_) {
32                 deleted_ = false;
33                 sequence.clear();
34                 modifiers.clear();
35         }
36
37         modifiers.push_back(make_pair(mod, nmod));
38         sequence.push_back(key);
39
40         if (curmap)
41                 return curmap->lookup(key, mod, this);
42
43         return FuncRequest::unknown;
44 }
45
46
47 size_t KeySequence::parse(string const & s)
48 {
49         if (s.empty())
50                 return 1;
51
52         size_t i = 0;
53         KeyModifier mod = NoModifier;
54         KeyModifier nmod = NoModifier;
55
56         while (i < s.length()) {
57                 if (s[i] == ' ')
58                         ++i;
59                 if (i >= s.length())
60                         break;
61
62                 if (i + 1 < s.length() && s[i + 1] == '-') {
63                         switch (s[i]) {
64                         case 's': case 'S':
65                                 mod |= ShiftModifier;
66                                 i += 2;
67                                 continue;
68                         case 'c': case 'C':
69                                 mod |= ControlModifier;
70                                 i += 2;
71                                 continue;
72                         case 'm': case 'M':
73 #if defined(USE_MACOSX_PACKAGING) || defined(USE_META_KEYBINDING)
74                                 mod |= MetaModifier;
75                                 i += 2;
76                                 continue;
77 #endif
78                         case 'a': case 'A':
79                                 mod |= AltModifier;
80                                 i += 2;
81                                 continue;
82                         default:
83                                 return i + 1;
84                         }
85                 } else if (i + 2 < s.length() && s[i] == '~'
86                            && s[i + 2] == '-') {
87                         switch (s[i + 1]) {
88                         case 's': case 'S':
89                                 nmod |= ShiftModifier;
90                                 i += 3;
91                                 continue;
92                         case 'c': case 'C':
93                                 nmod |= ControlModifier;
94                                 i += 3;
95                                 continue;
96                         case 'm': case 'M':
97 #if defined(USE_MACOSX_PACKAGING) || defined(USE_META_KEYBINDING)
98                                 nmod |= MetaModifier;
99                                 i += 3;
100                                 continue;
101 #endif
102                         case 'a': case 'A':
103                                 nmod |= AltModifier;
104                                 i += 3;
105                                 continue;
106                         default:
107                                 return i + 2;
108                         }
109                 } else {
110                         string tbuf;
111                         size_t j = i;
112                         for (; j < s.length() && s[j] != ' '; ++j)
113                                 tbuf += s[j];    // (!!!check bounds :-)
114
115                         KeySymbol key;
116                         key.init(tbuf);
117
118                         if (!key.isOK())
119                                 return j;
120
121                         i = j;
122
123                         addkey(key, mod, nmod);
124                         mod = NoModifier;
125                 }
126         }
127
128         if (sequence.empty())
129                 return 0;
130
131         // everything is fine
132         return string::npos;
133 }
134
135
136 docstring const KeySequence::print(outputFormat format) const
137 {
138         docstring buf;
139
140         size_t const length = sequence.size();
141
142         for (size_t i = 0; i != length; ++i) {
143                 switch (format) {
144                 case Portable:
145                         buf += sequence[i].print(modifiers[i].first, false);
146                         break;
147                 case ForGui:
148                         buf += sequence[i].print(modifiers[i].first, true);
149                         break;
150                 case BindFile:
151                         KeyModifier mod = modifiers[i].first;
152                         if (mod & ControlModifier)
153                                 buf += "C-";
154                         if (mod & AltModifier)
155 #if defined(USE_MACOSX_PACKAGING) || defined(USE_META_KEYBINDING)
156                                 buf += "A-";
157                         if (mod & MetaModifier)
158 #endif
159                                 buf += "M-";
160                         if (mod & ShiftModifier)
161                                 buf += "S-";
162
163                         buf += from_utf8(sequence[i].getSymbolName());
164                         break;
165                 }
166                 // append a blank
167                 if (i + 1 != length)
168                         buf += ' ';
169         }
170         return buf;
171 }
172
173
174 docstring const KeySequence::printOptions(bool forgui) const
175 {
176         docstring buf = print(forgui ? ForGui : Portable);
177
178         if (!curmap)
179                 return buf;
180
181         buf += _("   options: ");
182         buf += curmap->print(forgui ? ForGui : Portable);
183         return buf;
184 }
185
186
187 void KeySequence::reset()
188 {
189         deleted_ = true;
190         curmap = stdmap;
191 }
192
193
194 void KeySequence::clear()
195 {
196         sequence.clear();
197         reset();
198 }
199
200
201 void KeySequence::removeKey()
202 {
203         if (deleted_)
204                 return;
205         sequence.pop_back();
206         modifiers.pop_back();
207         if (sequence.empty())
208                 deleted_ = true;
209 }
210
211
212 } // namespace lyx