]> git.lyx.org Git - lyx.git/blob - src/kbsequence.C
rename commandtags.h to lfuns.h and renumber/cleanup. Rebuild the tree !
[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 #include "frontends/mouse_state.h"
14 #include "frontends/LyXKeySymFactory.h"
15 #include "kbsequence.h"
16 #include "kbmap.h"
17 #include "lfuns.h"
18 #include "debug.h"
19
20 using std::make_pair;
21
22
23 int kb_sequence::addkey(LyXKeySymPtr key,
24                         key_modifier::state mod, key_modifier::state nmod)
25 {
26         // adding a key to a deleted sequence
27         // starts a new sequence
28         if (deleted_) {
29                 deleted_ = false;
30                 sequence.clear();
31                 modifiers.clear();
32         }
33
34         modifiers.push_back(make_pair(mod, nmod));
35         sequence.push_back(key);
36
37         if (curmap) {
38                 return curmap->lookup(key, mod, this);
39         }
40
41         return LFUN_UNKNOWN_ACTION;
42 }
43
44
45 string::size_type kb_sequence::parse(string const & s)
46 {
47         if (s.empty()) return 1;
48
49         string::size_type i = 0;
50         key_modifier::state mod = key_modifier::none;
51         key_modifier::state nmod = key_modifier::none;
52
53         while (i < s.length()) {
54                 if (s[i] == ' ')
55                         ++i;
56                 if (i >= s.length())
57                         break;
58
59                 if (i + 1 < s.length() && s[i + 1] == '-') {
60                         switch (s[i]) {
61                         case 's': case 'S':
62                                 mod |= key_modifier::shift;
63                                 i += 2;
64                                 continue;
65                         case 'c': case 'C':
66                                 mod |= key_modifier::ctrl;
67                                 i += 2;
68                                 continue;
69                         case 'm': case 'M':
70                                 mod |= key_modifier::alt;
71                                 i += 2;
72                                 continue;
73                         default:
74                                 return i + 1;
75                         }
76                 } else if (i + 2 < s.length() && s[i] == '~'
77                            && s[i + 2] == '-') {
78                         switch (s[i + 1]) {
79                         case 's': case 'S':
80                                 nmod |= key_modifier::shift;
81                                 i += 3;
82                                 continue;
83                         case 'c': case 'C':
84                                 nmod |= key_modifier::ctrl;
85                                 i += 3;
86                                 continue;
87                         case 'm': case 'M':
88                                 nmod |= key_modifier::alt;
89                                 i += 3;
90                                 continue;
91                         default:
92                                 return i + 2;
93                         }
94                 } else {
95                         string tbuf;
96                         string::size_type j = i;
97                         for (; j < s.length() && s[j] != ' '; ++j)
98                                 tbuf += s[j];    // (!!!check bounds :-)
99
100                         LyXKeySymPtr key(LyXKeySymFactory::create());
101                         key->init(tbuf);
102
103                         if ( ! key->isOK() ) {
104                                 return j;
105                         }
106
107                         i = j;
108
109                         addkey(key, mod, nmod);
110                         mod = key_modifier::none;
111                 }
112         }
113
114         // empty sequence?
115         if (sequence.size() == 0)
116                 return 0;
117
118         // everything is fine
119         return string::npos;
120 }
121
122
123 string const kb_sequence::print() const
124 {
125         string buf;
126
127         //if (deleted_)
128         //      return buf;
129
130         KeySequence::size_type i, length = sequence.size();
131
132         for (i = 0; i < length; ++i) {
133                 buf += kb_keymap::printKeysym(sequence[i], modifiers[i].first);
134
135                 // append a blank
136                 if (i + 1 < length) {
137                         buf += ' ';
138                 }
139         }
140         return buf;
141 }
142
143
144 string const kb_sequence::printOptions() const
145 {
146         string buf;
147
148         buf += print();
149
150         if (!curmap)
151                 return buf;
152
153         buf += _("   options: ");
154         buf += curmap->print();
155         return buf;
156 }
157
158
159 void kb_sequence::mark_deleted()
160 {
161         deleted_ = true;
162 }
163
164
165 void kb_sequence::reset()
166 {
167         mark_deleted();
168         curmap = stdmap;
169 }
170
171 void kb_sequence::clear()
172 {
173         sequence.clear();
174         reset();
175 }