private bool SaveQatControlData(
            VM.QatItemCollection remainingItems,
            VM.ControlData controlData)
        {
            bool matched = false;

            for (int qatIndex = 0; qatIndex < remainingItems.Count; qatIndex++)
            {
                VM.QatItem qatItem = remainingItems[qatIndex];
                if (qatItem.Instance == controlData)
                {
                    if (qatItem.IsSplitHeader)
                    {
                        // This is the case of the Header of a SplitButton
                        // or a SplitMenuItem added to the QAT. Note -1 is
                        // the sentinel being used to indicate this case.

                        qatItem.ControlIndices.Add(-1);
                    }

                    remainingItems.Remove(qatItem);
                    qatIndex--;
                    matched = true;
                }
            }

            VM.MenuButtonData menuButtonData = controlData as VM.MenuButtonData;
            if (menuButtonData != null)
            {
                for (int controlIndex = 0; controlIndex < menuButtonData.ControlDataCollection.Count && remainingItems.Count > 0; controlIndex++)
                {
                    controlData = menuButtonData.ControlDataCollection[controlIndex];

                    for (int qatIndex = 0; qatIndex < remainingItems.Count; qatIndex++)
                    {
                        VM.QatItem qatItem = remainingItems[qatIndex];
                        qatItem.ControlIndices.Add(controlIndex);
                    }

                    matched = SaveQatControlData(remainingItems, controlData);
                    if (!matched)
                    {
                        for (int qatIndex = 0; qatIndex < remainingItems.Count; qatIndex++)
                        {
                            VM.QatItem qatItem = remainingItems[qatIndex];
                            qatItem.ControlIndices.RemoveAt(qatItem.ControlIndices.Count - 1);
                        }
                    }
                }
            }

            return matched;
        }
        private static Control MapQatDataToControl(VM.QatItem qatItem)
        {
            string typeName = qatItem.Instance.GetType().Name;
            Control control = null;

            switch (typeName)
            {
                case "ButtonData":
                    {
                        control = new RibbonButton();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "ToggleButtonData":
                    {
                        control = new RibbonToggleButton();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "RadioButtonData":
                    {
                        control = new RibbonRadioButton();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "CheckBoxData":
                    {
                        control = new RibbonCheckBox();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "TextBoxData":
                    {
                        control = new RibbonTextBox();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "MenuButtonData":
                    {
                        control = new RibbonMenuButton();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "SplitButtonData":
                    {
                        if (!qatItem.IsSplitHeader)
                        {
                            control = new RibbonSplitButton();
                        }
                        else
                        {
                            VM.SplitButtonData splitButtonData = (VM.SplitButtonData)qatItem.Instance;
                            if (splitButtonData.IsCheckable)
                            {
                                control = new RibbonToggleButton();
                            }
                            else
                            {
                                control = new RibbonButton();
                            }
                        }
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "ComboBoxData":
                    {
                        control = new RibbonComboBox();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "MenuItemData":
                    {
                        VM.MenuItemData menuItemData = (VM.MenuItemData)qatItem.Instance;
                        if (menuItemData.ControlDataCollection.Count > 0)
                        {
                            control = new RibbonMenuButton();
                        }
                        else
                        {
                            control = new RibbonButton();
                        }
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "SplitMenuItemData":
                    {
                        VM.SplitMenuItemData splitMenuItemData = (VM.SplitMenuItemData)qatItem.Instance;
                        if (!qatItem.IsSplitHeader)
                        {
                            if (splitMenuItemData.ControlDataCollection.Count > 0)
                            {
                                control = new RibbonSplitButton();
                            }
                            else if (splitMenuItemData.IsCheckable)
                            {
                                control = new RibbonToggleButton();
                            }
                            else
                            {
                                control = new RibbonButton();
                            }
                        }
                        else
                        {
                            control = new RibbonToggleButton();
                        }
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "GalleryData":
                    {
                        RibbonGallery gallery = new RibbonGallery();
                        RibbonMenuButton menuButton = new RibbonMenuButton();
                        menuButton.ItemsSource = new object[] { gallery };

                        control = menuButton;
                        control.DataContext = qatItem.Instance;
                        break;
                    }
                case "GroupData":
                    {
                        control = new RibbonGroup();
                        control.DataContext = qatItem.Instance;
                        break;
                    }
            }

            return control;
        }
        private void LoadQatControlData(
            VM.QatItemCollection previouslyMatchedItems,
            int matchLevel,
            int controlIndex,
            VM.ControlData controlData,
            ref int remainingItemsCount)
        {
            VM.QatItemCollection matchedItems = new VM.QatItemCollection();
            for (int qatIndex = 0; qatIndex < previouslyMatchedItems.Count; qatIndex++)
            {
                VM.QatItem qatItem = previouslyMatchedItems[qatIndex];
                if (qatItem.ControlIndices[matchLevel] == controlIndex)
                {
                    if (qatItem.ControlIndices.Count == matchLevel + 1)
                    {
                        qatItem.Instance = controlData;
                        remainingItemsCount--;
                    }
                    else if (qatItem.ControlIndices.Count == matchLevel + 2 && qatItem.ControlIndices[matchLevel + 1] == -1)
                    {
                        qatItem.IsSplitHeader = true;
                        qatItem.Instance = controlData;
                        remainingItemsCount--;
                    }
                    else
                    {
                        matchedItems.Add(qatItem);
                    }
                }
            }

            VM.MenuButtonData menuButtonData = controlData as VM.MenuButtonData;
            if (menuButtonData != null)
            {
                for (controlIndex = 0; controlIndex < menuButtonData.ControlDataCollection.Count && matchedItems.Count > 0 && remainingItemsCount > 0; controlIndex++)
                {
                    controlData = menuButtonData.ControlDataCollection[controlIndex];
                    LoadQatControlData(matchedItems, matchLevel + 1, controlIndex, controlData, ref remainingItemsCount);
                }
            }
        }