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