/// <summary>
        ///   Loads the keymap file and creates the mapping.
        /// </summary>
        /// <returns>True if the load was successfull, false if it failed.</returns>
        public bool LoadKeyMap()
        {
            mapWindows.Clear();
            string strFilename = String.Format(@"{0}\{1}", Options.ConfigDir, "keymap.xml");

            if (!File.Exists(strFilename))
            {
                strFilename = String.Format(@"{0}\bin\{1}", Application.StartupPath, "keymap.xml");
            }
            log.Info("Load key mapping from {0}", strFilename);
            try
            {
                // Load the XML file
                XmlDocument doc = new XmlDocument();
                doc.Load(strFilename);
                // Check if it is a keymap
                if (doc.DocumentElement == null)
                {
                    return(false);
                }
                string strRoot = doc.DocumentElement.Name;
                if (strRoot != "keymap")
                {
                    return(false);
                }

                // For each window
                XmlNodeList listWindows = doc.DocumentElement.SelectNodes("/keymap/window");
                foreach (XmlNode nodeWindow in listWindows)
                {
                    XmlNode nodeWindowId = nodeWindow.SelectSingleNode("id");
                    if (null != nodeWindowId)
                    {
                        WindowMap map = new WindowMap();
                        map.Window = Int32.Parse(nodeWindowId.InnerText);
                        XmlNodeList listNodes = nodeWindow.SelectNodes("action");
                        // Create a list of key/actiontype mappings
                        foreach (XmlNode node in listNodes)
                        {
                            XmlNode nodeId        = node.SelectSingleNode("id");
                            XmlNode nodeKey       = node.SelectSingleNode("key");
                            XmlNode nodeRibbonKey = node.SelectSingleNode("ribbon");
                            MapAction(ref map, nodeId, nodeKey, nodeRibbonKey);
                        }
                        if (map.Buttons.Count > 0)
                        {
                            mapWindows.Add(map);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error("exception loading keymap {0} err:{1} stack:{2}", strFilename, ex.Message, ex.StackTrace);
            }
            return(false);
        }
        /// <summary>
        ///   Map an action in a windowmap based on the id and key xml nodes.
        /// </summary>
        /// <param name = "map">The windowmap that needs to be filled in.</param>
        /// <param name = "nodeId">The id of the action</param>
        /// <param name = "nodeKey">The key corresponding to the mapping.</param>
        private void MapAction(ref WindowMap map, XmlNode nodeId, XmlNode nodeKey, XmlNode nodeRibbonKey)
        {
            if (null == nodeId)
            {
                return;
            }
            Button but = new Button();

            but.ActionType = (Action.ActionType)Int32.Parse(nodeId.InnerText);

            if (nodeRibbonKey != null)
            {
                but.RibbonKeyCode = nodeRibbonKey.InnerText;
            }

            if (nodeKey != null)
            {
                string[] buttons = nodeKey.InnerText.Split('-');
                for (int i = 0; i < buttons.Length - 1; i++)
                {
                    if (buttons[i] == "Alt")
                    {
                        but.Modifiers |= Keys.Alt;
                    }
                    else if (buttons[i] == "Ctrl")
                    {
                        but.Modifiers |= Keys.Control;
                    }
                    else if (buttons[i] == "Shift")
                    {
                        but.Modifiers |= Keys.Shift;
                    }
                }

                string strButton = buttons[buttons.Length - 1];

                try
                {
                    if (strButton != "")
                    {
                        but.KeyCode = (int)Enum.Parse(typeof(Keys), strButton);
                    }
                }
                catch (ArgumentException)
                {
                    log.Error("Invalid buttons for action {0}", nodeId.InnerText);
                }
            }

            map.Buttons.Add(but);
        }
        /// <summary>
        ///   Loads the keymap file and creates the mapping.
        /// </summary>
        /// <returns>True if the load was successfull, false if it failed.</returns>
        public bool LoadKeyMap()
        {
            mapWindows.Clear();
              string strFilename = String.Format(@"{0}\{1}", Options.ConfigDir, "keymap.xml");
              if (!File.Exists(strFilename))
            strFilename = String.Format(@"{0}\bin\{1}", Application.StartupPath, "keymap.xml");
              log.Info("Load key mapping from {0}", strFilename);
              try
              {
            // Load the XML file
            XmlDocument doc = new XmlDocument();
            doc.Load(strFilename);
            // Check if it is a keymap
            if (doc.DocumentElement == null) return false;
            string strRoot = doc.DocumentElement.Name;
            if (strRoot != "keymap") return false;

            // For each window
            XmlNodeList listWindows = doc.DocumentElement.SelectNodes("/keymap/window");
            foreach (XmlNode nodeWindow in listWindows)
            {
              XmlNode nodeWindowId = nodeWindow.SelectSingleNode("id");
              if (null != nodeWindowId)
              {
            WindowMap map = new WindowMap();
            map.Window = Int32.Parse(nodeWindowId.InnerText);
            XmlNodeList listNodes = nodeWindow.SelectNodes("action");
            // Create a list of key/actiontype mappings
            foreach (XmlNode node in listNodes)
            {
              XmlNode nodeId = node.SelectSingleNode("id");
              XmlNode nodeKey = node.SelectSingleNode("key");
              XmlNode nodeRibbonKey = node.SelectSingleNode("ribbon");
              MapAction(ref map, nodeId, nodeKey, nodeRibbonKey);
            }
            if (map.Buttons.Count > 0)
            {
              mapWindows.Add(map);
            }
              }
            }
              }
              catch (Exception ex)
              {
            log.Error("exception loading keymap {0} err:{1} stack:{2}", strFilename, ex.Message, ex.StackTrace);
              }
              return false;
        }
        /// <summary>
        ///   Map an action in a windowmap based on the id and key xml nodes.
        /// </summary>
        /// <param name = "map">The windowmap that needs to be filled in.</param>
        /// <param name = "nodeId">The id of the action</param>
        /// <param name = "nodeKey">The key corresponding to the mapping.</param>
        private void MapAction(ref WindowMap map, XmlNode nodeId, XmlNode nodeKey, XmlNode nodeRibbonKey)
        {
            if (null == nodeId) return;
              Button but = new Button();
              but.ActionType = (Action.ActionType)Int32.Parse(nodeId.InnerText);

              if (nodeRibbonKey != null)
              {
            but.RibbonKeyCode = nodeRibbonKey.InnerText;
              }

              if (nodeKey != null)
              {
            string[] buttons = nodeKey.InnerText.Split('-');
            for (int i = 0; i < buttons.Length - 1; i++)
            {
              if (buttons[i] == "Alt")
            but.Modifiers |= Keys.Alt;
              else if (buttons[i] == "Ctrl")
            but.Modifiers |= Keys.Control;
              else if (buttons[i] == "Shift")
            but.Modifiers |= Keys.Shift;
            }

            string strButton = buttons[buttons.Length - 1];

            try
            {
              if (strButton != "")
            but.KeyCode = (int)Enum.Parse(typeof (Keys), strButton);
            }
            catch (ArgumentException)
            {
              log.Error("Invalid buttons for action {0}", nodeId.InnerText);
            }
              }

              map.Buttons.Add(but);
        }