]> git.lyx.org Git - lyx.git/blob - src/KeySequence.cpp
Fix compilation with Qt4.2
[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                                 mod |= AltModifier;
74                                 i += 2;
75                                 continue;
76                         default:
77                                 return i + 1;
78                         }
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;
96                         }
97                 } else {
98                         string tbuf;
99                         size_t j = i;
100                         for (; j < s.length() && s[j] != ' '; ++j)
101                                 tbuf += s[j];    // (!!!check bounds :-)
102
103                         KeySymbol key;
104                         key.init(tbuf);
105
106                         if (!key.isOK())
107                                 return j;
108
109                         i = j;
110
111                         addkey(key, mod, nmod);
112                         mod = NoModifier;
113                 }
114         }
115
116         // empty sequence?
117         if (sequence.size() == 0)
118                 return 0;
119
120         // everything is fine
121         return string::npos;
122 }
123
124
125 docstring const KeySequence::print(outputFormat format) const
126 {
127         docstring buf;
128
129         size_t const length = sequence.size();
130
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-";
147                 
148                         buf += from_utf8(sequence[i].getSymbolName());
149                         break;
150                 }
151                 // append a blank
152                 if (i + 1 != length)
153                         buf += ' ';
154         }
155         return buf;
156 }
157
158
159 docstring const KeySequence::printOptions(bool forgui) const
160 {
161         docstring buf = print(forgui ? ForGui : Portable);
162
163         if (!curmap)
164                 return buf;
165
166         buf += _("   options: ");
167         buf += curmap->print(forgui ? ForGui : Portable);
168         return buf;
169 }
170
171
172 void KeySequence::reset()
173 {
174         deleted_ = true;
175         curmap = stdmap;
176 }
177
178
179 void KeySequence::clear()
180 {
181         sequence.clear();
182         reset();
183 }
184
185
186 void KeySequence::removeKey()
187 {
188         if (deleted_)
189                 return;
190         sequence.pop_back();
191         modifiers.pop_back();
192         if (sequence.empty())
193                 deleted_ = true;
194 }
195
196
197 } // namespace lyx