Update translations for LyX 1.6.0
[lyx.git] / src / KeySequence.cpp
blobef1cc33e2482c16d96eaf328a017ed9a28167799
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"
16 #include "KeyMap.h"
18 #include "support/gettext.h"
20 #include "frontends/KeySymbol.h"
22 using namespace std;
24 namespace lyx {
26 FuncRequest const & KeySequence::addkey(KeySymbol const & key,
27 KeyModifier mod, KeyModifier nmod)
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();
37 modifiers.push_back(make_pair(mod, nmod));
38 sequence.push_back(key);
40 if (curmap)
41 return curmap->lookup(key, mod, this);
43 return FuncRequest::unknown;
47 size_t KeySequence::parse(string const & s)
49 if (s.empty())
50 return 1;
52 size_t i = 0;
53 KeyModifier mod = NoModifier;
54 KeyModifier nmod = NoModifier;
56 while (i < s.length()) {
57 if (s[i] == ' ')
58 ++i;
59 if (i >= s.length())
60 break;
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 mod |= AltModifier;
74 i += 2;
75 continue;
76 default:
77 return i + 1;
79 } else if (i + 2 < s.length() && s[i] == '~'
80 && s[i + 2] == '-') {
81 switch (s[i + 1]) {
82 case 's': case 'S':
83 nmod |= ShiftModifier;
84 i += 3;
85 continue;
86 case 'c': case 'C':
87 nmod |= ControlModifier;
88 i += 3;
89 continue;
90 case 'm': case 'M':
91 nmod |= AltModifier;
92 i += 3;
93 continue;
94 default:
95 return i + 2;
97 } else {
98 string tbuf;
99 size_t j = i;
100 for (; j < s.length() && s[j] != ' '; ++j)
101 tbuf += s[j]; // (!!!check bounds :-)
103 KeySymbol key;
104 key.init(tbuf);
106 if (!key.isOK())
107 return j;
109 i = j;
111 addkey(key, mod, nmod);
112 mod = NoModifier;
116 // empty sequence?
117 if (sequence.size() == 0)
118 return 0;
120 // everything is fine
121 return string::npos;
125 docstring const KeySequence::print(outputFormat format) const
127 docstring buf;
129 size_t const length = sequence.size();
131 for (size_t i = 0; i != length; ++i) {
132 switch (format) {
133 case Portable:
134 buf += sequence[i].print(modifiers[i].first, false);
135 break;
136 case ForGui:
137 buf += sequence[i].print(modifiers[i].first, true);
138 break;
139 case BindFile:
140 KeyModifier mod = modifiers[i].first;
141 if (mod & ControlModifier)
142 buf += "C-";
143 if (mod & AltModifier)
144 buf += "M-";
145 if (mod & ShiftModifier)
146 buf += "S-";
148 buf += from_utf8(sequence[i].getSymbolName());
149 break;
151 // append a blank
152 if (i + 1 != length)
153 buf += ' ';
155 return buf;
159 docstring const KeySequence::printOptions(bool forgui) const
161 docstring buf = print(forgui ? ForGui : Portable);
163 if (!curmap)
164 return buf;
166 buf += _(" options: ");
167 buf += curmap->print(forgui ? ForGui : Portable);
168 return buf;
172 void KeySequence::mark_deleted()
174 deleted_ = true;
178 void KeySequence::reset()
180 mark_deleted();
181 curmap = stdmap;
185 void KeySequence::clear()
187 sequence.clear();
188 reset();
192 void KeySequence::removeKey()
194 if (deleted_)
195 return;
196 sequence.pop_back();
197 modifiers.pop_back();
201 } // namespace lyx