]> git.lyx.org Git - lyx.git/blobdiff - src/KeyMap.cpp
start using FileName::exists()
[lyx.git] / src / KeyMap.cpp
index a9bcb596227c1540154b0cb744ad25dfdc44d4ea..e923abd63ee1f12c8215c36e6235d5cf62154218 100644 (file)
 #include "LyXAction.h"
 #include "Lexer.h"
 
-#include "frontends/KeySymbol.h"
-
 #include "support/filetools.h"
 
 #include <sstream>
+#include <utility>
+
+using std::endl;
+using std::string;
+using std::make_pair;
 
 
 namespace lyx {
@@ -32,22 +35,18 @@ namespace lyx {
 using support::FileName;
 using support::i18nLibFileSearch;
 
-using std::endl;
-using std::string;
-
 
-string const KeyMap::printKeySym(KeySymbol const & key,
-                                   key_modifier::state mod)
+string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod)
 {
        string buf;
 
        string const s = key.getSymbolName();
 
-       if (mod & key_modifier::shift)
+       if (mod & ShiftModifier)
                buf += "S-";
-       if (mod & key_modifier::ctrl)
+       if (mod & ControlModifier)
                buf += "C-";
-       if (mod & key_modifier::alt)
+       if (mod & AltModifier)
                buf += "M-";
 
        buf += s;
@@ -170,9 +169,8 @@ bool KeyMap::read(string const & bind_file)
 }
 
 
-FuncRequest const &
-KeyMap::lookup(KeySymbolPtr key,
-                 key_modifier::state mod, KeySequence * seq) const
+FuncRequest const & KeyMap::lookup(KeySymbol const &key,
+                 KeyModifier mod, KeySequence * seq) const
 {
        static FuncRequest const unknown(LFUN_UNKNOWN_ACTION);
 
@@ -184,11 +182,10 @@ KeyMap::lookup(KeySymbolPtr key,
 
        Table::const_iterator end = table.end();
        for (Table::const_iterator cit = table.begin(); cit != end; ++cit) {
-               key_modifier::state mask(cit->mod.second);
-               key_modifier::state check =
-                       static_cast<key_modifier::state>(mod & ~mask);
+               KeyModifier mask = cit->mod.second;
+               KeyModifier check = static_cast<KeyModifier>(mod & ~mask);
 
-               if (*(cit->code) == *key && cit->mod.first == check) {
+               if (cit->code == key && cit->mod.first == check) {
                        // match found
                        if (cit->table.get()) {
                                // this is a prefix key - set new map
@@ -217,7 +214,7 @@ docstring const KeyMap::print(bool forgui) const
        docstring buf;
        Table::const_iterator end = table.end();
        for (Table::const_iterator cit = table.begin(); cit != end; ++cit) {
-               buf += cit->code->print(cit->mod.first, forgui);
+               buf += cit->code.print(cit->mod.first, forgui);
                buf += ' ';
        }
        return buf;
@@ -226,17 +223,17 @@ docstring const KeyMap::print(bool forgui) const
 
 void KeyMap::defkey(KeySequence * seq, FuncRequest const & func, unsigned int r)
 {
-       KeySymbolPtr code = seq->sequence[r];
-       if (!code->isOK())
+       KeySymbol code = seq->sequence[r];
+       if (!code.isOK())
                return;
 
-       key_modifier::state const mod1 = seq->modifiers[r].first;
-       key_modifier::state const mod2 = seq->modifiers[r].second;
+       KeyModifier const mod1 = seq->modifiers[r].first;
+       KeyModifier const mod2 = seq->modifiers[r].second;
 
        // check if key is already there
        Table::iterator end = table.end();
        for (Table::iterator it = table.begin(); it != end; ++it) {
-               if (*(code) == *(it->code)
+               if (code == it->code
                    && mod1 == it->mod.first
                    && mod2 == it->mod.second) {
                        // overwrite binding
@@ -253,7 +250,7 @@ void KeyMap::defkey(KeySequence * seq, FuncRequest const & func, unsigned int r)
                                it->func.origin = FuncRequest::KEYBOARD;
                                return;
                        } else if (!it->table.get()) {
-                               lyxerr << "Error: New binding for '" 
+                               lyxerr << "Error: New binding for '"
                                       << to_utf8(seq->print(false))
                                       << "' is overriding old binding..."
                                               << endl;
@@ -281,11 +278,18 @@ void KeyMap::defkey(KeySequence * seq, FuncRequest const & func, unsigned int r)
 
 docstring const KeyMap::printbindings(FuncRequest const & func) const
 {
-       odocstringstream res;
        Bindings bindings = findbindings(func);
-       for (Bindings::const_iterator cit = bindings.begin();
-            cit != bindings.end() ; ++cit)
-               res << '[' << cit->print(true) << ']';
+       if (bindings.empty())
+               return docstring();
+       
+       odocstringstream res;
+       Bindings::const_iterator cit = bindings.begin();
+       Bindings::const_iterator cit_end = bindings.end();
+       // prin the first item
+       res << cit->print(true);
+       // more than one shortcuts?
+       for (++cit; cit != cit_end; ++cit)
+               res << ", " << cit->print(true);
        return res.str();
 }
 
@@ -322,17 +326,48 @@ KeyMap::Bindings KeyMap::findbindings(FuncRequest const & func,
 }
 
 
-std::pair<KeySymbol const *, key_modifier::state>
-KeyMap::find1keybinding(FuncRequest const & func) const
+KeyMap::BindingList const KeyMap::listBindings(bool unbound) const
 {
-       Table::const_iterator end = table.end();
-       for (Table::const_iterator cit = table.begin();
-           cit != end; ++cit) {
-               if (!cit->table.get() && cit->func == func)
-                       return std::make_pair(cit->code.get(), cit->mod.first);
+       BindingList list;
+       listBindings(list, KeySequence(0, 0));
+       if (unbound) {
+               LyXAction::const_func_iterator fit = lyxaction.func_begin();
+               LyXAction::const_func_iterator fit_end = lyxaction.func_end();
+               for (; fit != fit_end; ++fit) {
+                       kb_action action = fit->second;
+                       bool has_action = false;
+                       BindingList::const_iterator it = list.begin();
+                       BindingList::const_iterator it_end = list.end();
+                       for (; it != it_end; ++it)
+                               if (it->first.action == action) {
+                                       has_action = true;
+                                       break;
+                               }
+                       if (!has_action)
+                               list.push_back(make_pair(action, KeySequence(0, 0)));
+               }       
        }
+       return list;
+}
+
 
-       return std::make_pair<KeySymbol const *, key_modifier::state>(0, key_modifier::none);
+void KeyMap::listBindings(BindingList & list,
+       KeySequence const & prefix) const
+{
+       Table::const_iterator it = table.begin();
+       Table::const_iterator it_end = table.end();
+       for (; it != it_end; ++it) {
+               // a LFUN_COMMAND_PREFIX
+               if (it->table.get()) {
+                       KeySequence seq = prefix;
+                       seq.addkey(it->code, it->mod.first);
+                       it->table->listBindings(list, seq);
+               } else {
+                       KeySequence seq = prefix;
+                       seq.addkey(it->code, it->mod.first);
+                       list.push_back(make_pair(it->func, seq));
+               }
+       }
 }