]> git.lyx.org Git - lyx.git/blob - src/KeySequence.cpp
Allow \nocite again with the basic citation engine.
[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         // empty sequence?
129         if (sequence.size() == 0)
130                 return 0;
131
132         // everything is fine
133         return string::npos;
134 }
135
136
137 docstring const KeySequence::print(outputFormat format) const
138 {
139         docstring buf;
140
141         size_t const length = sequence.size();
142
143         for (size_t i = 0; i != length; ++i) {
144                 switch (format) {
145                 case Portable:
146                         buf += sequence[i].print(modifiers[i].first, false);
147                         break;
148                 case ForGui:
149                         buf += sequence[i].print(modifiers[i].first, true);
150                         break;
151                 case BindFile:
152                         KeyModifier mod = modifiers[i].first;
153                         if (mod & ControlModifier)
154                                 buf += "C-";
155                         if (mod & AltModifier)
156 #if defined(USE_MACOSX_PACKAGING) || defined(USE_META_KEYBINDING)
157                                 buf += "A-";
158                         if (mod & MetaModifier)
159 #endif
160                                 buf += "M-";
161                         if (mod & ShiftModifier)
162                                 buf += "S-";
163                 
164                         buf += from_utf8(sequence[i].getSymbolName());
165                         break;
166                 }
167                 // append a blank
168                 if (i + 1 != length)
169                         buf += ' ';
170         }
171         return buf;
172 }
173
174
175 docstring const KeySequence::printOptions(bool forgui) const
176 {
177         docstring buf = print(forgui ? ForGui : Portable);
178
179         if (!curmap)
180                 return buf;
181
182         buf += _("   options: ");
183         buf += curmap->print(forgui ? ForGui : Portable);
184         return buf;
185 }
186
187
188 void KeySequence::reset()
189 {
190         deleted_ = true;
191         curmap = stdmap;
192 }
193
194
195 void KeySequence::clear()
196 {
197         sequence.clear();
198         reset();
199 }
200
201
202 void KeySequence::removeKey()
203 {
204         if (deleted_)
205                 return;
206         sequence.pop_back();
207         modifiers.pop_back();
208         if (sequence.empty())
209                 deleted_ = true;
210 }
211
212
213 } // namespace lyx