]> git.lyx.org Git - lyx.git/blob - src/kbsequence.C
redraw fix 1.
[lyx.git] / src / kbsequence.C
1 /**
2  * \file kbsequence.C
3  * Copyright 1995-2002 the LyX Team
4  * Read the file COPYING
5  *
6  * \author John Levon <moz@compsoc.man.ac.uk>
7  */
8
9 #include <config.h>
10
11 #include "gettext.h"
12
13 #ifdef __GNUG__
14 #pragma implementation
15 #endif
16
17 #include "frontends/mouse_state.h"
18 #include "frontends/LyXKeySymFactory.h"
19 #include "kbsequence.h"
20 #include "kbmap.h"
21 #include "commandtags.h"
22 #include "debug.h"
23
24 using std::make_pair;
25 using std::vector;
26 using std::endl;
27 using std::hex;
28 using std::dec;
29
30
31
32 int kb_sequence::addkey(LyXKeySymPtr key,
33                         key_modifier::state mod, key_modifier::state nmod)
34 {
35         // adding a key to a deleted sequence
36         // starts a new sequence
37         if (deleted_) {
38                 deleted_ = false;
39                 sequence.clear();
40                 modifiers.clear();
41         }
42
43         modifiers.push_back(make_pair(mod, nmod));
44         sequence.push_back(key);
45
46         if (curmap) {
47                 return curmap->lookup(key, mod, this);
48         }
49
50         return LFUN_UNKNOWN_ACTION;
51 }
52
53
54 string::size_type kb_sequence::parse(string const & s)
55 {
56         if (s.empty()) return 1;
57
58         string::size_type i = 0;
59         key_modifier::state mod = key_modifier::none;
60         key_modifier::state nmod = key_modifier::none;
61  
62         while (i < s.length()) {
63                 if (s[i] == ' ')
64                         ++i;
65                 if (i >= s.length())
66                         break;
67
68                 if (i + 1 < s.length() && s[i + 1] == '-') {
69                         switch (s[i]) {
70                         case 's': case 'S':
71                                 mod |= key_modifier::shift;
72                                 i += 2;
73                                 continue;
74                         case 'c': case 'C':
75                                 mod |= key_modifier::ctrl;
76                                 i += 2;
77                                 continue;
78                         case 'm': case 'M':
79                                 mod |= key_modifier::alt;
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 |= key_modifier::shift;
90                                 i += 3;
91                                 continue;
92                         case 'c': case 'C':
93                                 nmod |= key_modifier::ctrl;
94                                 i += 3;
95                                 continue;
96                         case 'm': case 'M':
97                                 nmod |= key_modifier::alt;
98                                 i += 3;
99                                 continue;
100                         default:
101                                 return i + 2;
102                         }
103                 } else {
104                         string tbuf;
105                         string::size_type j = i;
106                         for (; j < s.length() && s[j] != ' '; ++j)
107                                 tbuf += s[j];    // (!!!check bounds :-)
108
109                         LyXKeySymPtr key(LyXKeySymFactory::create());
110                         key->init(tbuf);
111                         
112                         if ( ! key->isOK() ) {
113                                 return j;
114                         }
115
116                         i = j;
117
118                         addkey(key, mod, nmod);
119                         mod = key_modifier::none;
120                 }
121         }
122
123         // empty sequence?
124         if (sequence.size() == 0)
125                 return 0;
126
127         // everything is fine
128         return string::npos;
129 }
130
131
132 string const kb_sequence::print() const
133 {
134         string buf;
135
136         //if (deleted_)
137         //      return buf;
138
139         KeySequence::size_type i, length = sequence.size();
140         
141         for (i = 0; i < length; ++i) {
142                 buf += kb_keymap::printKeysym(sequence[i], modifiers[i].first);
143
144                 // append a blank
145                 if (i + 1 < length) {
146                         buf += ' ';
147                 }
148         }
149         return buf;
150 }
151
152
153 string const kb_sequence::printOptions() const
154 {
155         string buf;
156
157         buf += print();
158
159         if (!curmap)
160                 return buf;
161
162         buf += _("   options: ");
163         buf += curmap->print();
164         return buf;
165 }
166
167
168 void kb_sequence::mark_deleted()
169 {
170         deleted_ = true;
171 }
172
173
174 LyXKeySymPtr kb_sequence::getsym() const
175 {
176         if (sequence.size() == 0)
177                 return LyXKeySymPtr(LyXKeySymFactory::create());
178         return sequence.back();
179 }
180
181
182 char kb_sequence::getLastKeyEncoded() const
183 {
184         return getsym()->getISOEncoded();
185 }
186
187
188 void kb_sequence::reset()
189 {
190         mark_deleted();
191         curmap = stdmap;
192 }
193
194 void kb_sequence::clear()
195 {
196         sequence.clear();
197         reset();
198 }