]> git.lyx.org Git - features.git/commitdiff
React better if we can't find bind files. Related to bug 6076.
authorRichard Heck <rgheck@comcast.net>
Thu, 16 Jul 2009 23:12:45 +0000 (23:12 +0000)
committerRichard Heck <rgheck@comcast.net>
Thu, 16 Jul 2009 23:12:45 +0000 (23:12 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@30639 a592a061-630c-0410-9148-cb99ea01b6c8

src/KeyMap.cpp
src/KeyMap.h
src/frontends/qt4/GuiPrefs.cpp

index a45bfc6998181f54e63ad4a8599f467dbb682f6c..c8f15d1cf96534c70b295f16b7defc2bc62be856 100644 (file)
 #include "support/docstream.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
+#include "support/gettext.h"
+#include "support/lstrings.h"
+
+#include "frontends/alert.h"
 
 #include <fstream>
 #include <sstream>
@@ -205,7 +209,36 @@ void KeyMap::clear()
 }
 
 
-bool KeyMap::read(string const & bind_file, KeyMap * unbind_map)
+bool KeyMap::read(string const & bind_file, KeyMap * unbind_map, BindReadType rt)
+{
+       FileName bf = i18nLibFileSearch("bind", bind_file, "bind");
+       if (bf.empty()) {
+               if (rt == MissingOK)
+                       return true;
+               lyxerr << "Could not find bind file: " << bind_file;
+               if (rt == Default) {
+                       frontend::Alert::warning(_("Could not find bind file"),
+                               bformat(_("Unable to find the bind file\n%1$s.\n"
+                                               "Please check your installation."), from_utf8(bind_file)));
+                       return false;
+               }
+               frontend::Alert::warning(_("Could not find bind file"),
+                       bformat(_("Unable to find the bind file\n%1$s.\n"
+                                 "Falling back to default."), from_utf8(bind_file)));
+               // So try it with the default file.
+               if (read("cua", unbind_map))
+                       return true;
+               lyxerr << "Could not find cua bind file!";
+               frontend::Alert::warning(_("Could not find cua bind file"),
+                               _("Unable to find the default bind file `cua'.\n"
+                                 "Please check your installation."));
+               return false;
+       }
+       return read(bf, unbind_map);
+}
+
+
+bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
 {
        enum {
                BN_BIND,
@@ -223,14 +256,13 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map)
        if (lyxerr.debugging(Debug::PARSER))
                lexrc.printTable(lyxerr);
 
-       FileName const tmp = i18nLibFileSearch("bind", bind_file, "bind");
-       lexrc.setFile(tmp);
+       lexrc.setFile(bind_file);
        if (!lexrc.isOK()) {
-               LYXERR0("KeyMap::read: cannot open bind file:" << tmp);
+               LYXERR0("KeyMap::read: cannot open bind file:" << bind_file.absFilename());
                return false;
        }
 
-       LYXERR(Debug::KBMAP, "Reading bind file:" << tmp);
+       LYXERR(Debug::KBMAP, "Reading bind file:" << bind_file.absFilename());
 
        bool error = false;
        while (lexrc.isOK()) {
@@ -313,7 +345,7 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map)
        }
 
        if (error)
-               LYXERR0("KeyMap::read: error while reading bind file:" << tmp);
+               LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFilename());
        return !error;
 }
 
index 81c7b82ebfb8d37256d55fc87a8e1ea9103462d0..1a37a1fc99772fae1ded88eaaf5c86dee5950e86 100644 (file)
 
 namespace lyx {
 
+namespace support {
+       class FileName; 
+}
+
 /// Defines key maps and actions for key sequences
 class KeyMap {
 public:
@@ -37,6 +41,12 @@ public:
                UserExtraUnbind //< \unbind loaded from user.bind, without
                                //<    corresponding entry in system bind file.
        };
+       enum BindReadType {
+               MissingOK,      //< It's OK if this file is missing.
+               Fallback,       //< If missing, fallback to default "cua". This should only 
+                               //< be used when attempting to read the user-secified bind file.
+               Default         //< Report error and return.
+       };
        /**
         * Bind/Unbind a key sequence to an action.
         * @return 0 on success, or position in string seq where error
@@ -72,8 +82,10 @@ public:
         *
         * @param bind_file bind file
         * @param unbind_map pointer to a KeyMap that holds \unbind bindings
+        * @param rt how to respond if the file can't be found
         */
-       bool read(std::string const & bind_file, KeyMap * unbind_map = 0);
+       bool read(std::string const & bind_file, KeyMap * unbind_map = 0, 
+                       BindReadType rt = Default);
 
        /** write to a bind file.
         * @param append append to the bind_file instead of overwrite it
@@ -156,6 +168,9 @@ private:
                FuncRequest func;
        };
 
+       ///
+       bool read(support::FileName const & bind_file, KeyMap * unbind_map = 0);
+
        /**
         * Given an action, find all keybindings
         * @param func the action
index 027d1dc4d3c36346705bb642d8d7e31edfc63856..0789a964d1b08b9bdf29ea73c68a5c2e2899e309 100644 (file)
@@ -2264,8 +2264,8 @@ void PrefShortcuts::apply(LyXRC & rc) const
        // The good thing is that the menus are updated automatically.
        theTopLevelKeymap().clear();
        theTopLevelKeymap().read("site");
-       theTopLevelKeymap().read(rc.bind_file);
-       theTopLevelKeymap().read("user");
+       theTopLevelKeymap().read(rc.bind_file, 0, KeyMap::Fallback);
+       theTopLevelKeymap().read("user", 0, KeyMap::MissingOK);
 }
 
 
@@ -2279,7 +2279,7 @@ void PrefShortcuts::update(LyXRC const & rc)
        system_bind_.read("site");
        system_bind_.read(rc.bind_file);
        // \unbind in user.bind is added to user_unbind_
-       user_bind_.read("user", &user_unbind_);
+       user_bind_.read("user", &user_unbind_, KeyMap::MissingOK);
        updateShortcutsTW();
 }