private void EnableMessageAppending(UserControl_Bordered_MessageTreeMessage control)
        {
            MenuItem menuItem_messageAppending = new MenuItem() { Header = "Append Message" };
            menuItem_messageAppending.Click += (x, y) =>
                {
                    var window_messageChoice =
                        new Window_MessageChoice
                        (
                            null,
                            string.Format("{0} - XYZ Choice", control.MessageName),
                            "\"...\"",
                            MessageId,
                            (win) =>
                            {
                                Window_MessageChoice wWin = win as Window_MessageChoice;
                                if (wWin != null)
                                {
                                    int selectedMessageId = -1;
                                    ComboBox_Message comboBox_message = new ComboBox_Message();
                                    comboBox_message.SelectionChanged += (w, v) =>
                                    {
                                        var cb = w as ComboBox_Message;
                                        ComboBox_Message.ComboBoxItem_Message cbi;
                                        if (cb != null && cb == comboBox_message && (cbi = cb.SelectedItem as ComboBox_Message.ComboBoxItem_Message) != null)
                                            selectedMessageId = cbi.MessageId;
                                    };
                                    comboBox_message.SetActiveAndRegisterForGinTubEvents();
                                    GinTubBuilderManager.ReadAllMessages();

                                    var window_message =
                                        new Window_TaskOnAccept
                                        (
                                            "Select Message",
                                            (wwWin) =>
                                            {
                                                Window_TaskOnAccept wwwWin = wwWin as Window_TaskOnAccept;
                                                if (wwwWin != null)
                                                {
                                                    // This is a preeeetty hack-y way to handle this, but you reap what you sow
                                                    int
                                                        newMessageChoiceId = -1,
                                                        newResultId = -1;
                                                    GinTubBuilderManager.MessageChoiceReadEventHandler messageChoiceReadHandler = new GinTubBuilderManager.MessageChoiceReadEventHandler((sender, args) =>
                                                        {
                                                            newMessageChoiceId = args.Id;
                                                        });
                                                    GinTubBuilderManager.ResultReadEventHandler resultReadHandler = new GinTubBuilderManager.ResultReadEventHandler((sender, args) =>
                                                        {
                                                            newResultId = args.Id;
                                                        });

                                                    GinTubBuilderManager.MessageChoiceRead += messageChoiceReadHandler;
                                                    GinTubBuilderManager.CreateMessageChoice(wWin.MessageChoiceName, wWin.MessageChoiceText, control.MessageId.Value);
                                                    GinTubBuilderManager.MessageChoiceRead -= messageChoiceReadHandler;

                                                    GinTubBuilderManager.ResultRead += resultReadHandler;
                                                    // TODO: less hardcoding here
                                                    GinTubBuilderManager.CreateResult
                                                    (
                                                        string.Format("Message - {0} NEXT", control.MessageName),
                                                        "{\"messageId\":" + selectedMessageId.ToString() + "}",
                                                        10 // MAGIC NUMBER
                                                    );
                                                    GinTubBuilderManager.ResultRead -= resultReadHandler;

                                                    GinTubBuilderManager.CreateMessageChoiceResult(newResultId, newMessageChoiceId);

                                                    GinTubBuilderManager.ReadMessageTreeForMessage(control.MessageId.Value, control.MessageParentMessageChoiceId);
                                                }
                                            }
                                        );
                                    window_message.Content = comboBox_message;
                                    window_message.ShowDialog();
                                }
                            }
                        );
                    window_messageChoice.ShowDialog();

                };

            ContextMenu contextMenu_messageAppending = new ContextMenu();
            contextMenu_messageAppending.Items.Add(menuItem_messageAppending);

            control.ContextMenu = contextMenu_messageAppending;
        }
        private void CreateControls()
        {
            Grid grid_main = new Grid();
            grid_main.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            grid_main.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            grid_main.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            grid_main.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });

            ////////
            // Id Grid
            Grid grid_id = new Grid();
            grid_id.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            grid_id.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            grid_main.SetGridRowColumn(grid_id, 0, 0);

            ////////
            // Id
            TextBlock textBlock_id =
                new TextBlock()
                {
                    VerticalAlignment = VerticalAlignment.Center,
                    Text = (MessageChoiceId.HasValue) ? MessageChoiceId.ToString() : "NewMessageChoice"
                };
            Label label_id = new Label() { Content = "Id:", FontWeight = FontWeights.Bold, VerticalAlignment = VerticalAlignment.Center };
            grid_id.SetGridRowColumn(textBlock_id, 0, 1);
            grid_id.SetGridRowColumn(label_id, 0, 0);

            ////////
            // Name Grid
            Grid grid_name = new Grid();
            grid_name.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            grid_name.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(100.0, GridUnitType.Star) });
            grid_main.SetGridRowColumn(grid_name, 1, 0);

            ////////
            // Name
            m_textBox_name = new TextBox() { VerticalAlignment = VerticalAlignment.Center, Text = MessageChoiceName };
            m_textBox_name.TextChanged += TextBox_Name_TextChanged;
            Label label_name = new Label() { Content = "Name:", FontWeight = FontWeights.Bold, VerticalAlignment = VerticalAlignment.Center };
            grid_name.SetGridRowColumn(m_textBox_name, 1, 0);
            grid_name.SetGridRowColumn(label_name, 0, 0);

            ////////
            // Text Grid
            Grid grid_text = new Grid();
            grid_text.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            grid_text.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            grid_main.SetGridRowColumn(grid_text, 2, 0);

            ////////
            // Text
            m_textBox_text = new TextBox() { VerticalAlignment = VerticalAlignment.Center, Text = MessageChoiceText };
            m_textBox_text.TextChanged += TextBox_Text_TextChanged;
            Label label_text = new Label() { Content = "Text:", FontWeight = FontWeights.Bold, VerticalAlignment = VerticalAlignment.Center };
            grid_text.SetGridRowColumn(m_textBox_text, 0, 1);
            grid_text.SetGridRowColumn(label_text, 0, 0);

            ////////
            // Message Grid
            Grid grid_message = new Grid();
            grid_message.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            grid_message.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(100.0, GridUnitType.Star) });
            grid_main.SetGridRowColumn(grid_message, 3, 0);

            ////////
            // Message
            m_comboBox_message = new ComboBox_Message();
            m_comboBox_message.SetActiveAndRegisterForGinTubEvents(); // never unregister; we want updates no matter where we are
            m_comboBox_message.SelectionChanged += ComboBox_Message_SelectionChanged;
            Label label_message = new Label() { Content = "Message:", FontWeight = FontWeights.Bold, VerticalAlignment = VerticalAlignment.Center };
            grid_message.SetGridRowColumn(m_comboBox_message, 1, 0);
            grid_message.SetGridRowColumn(label_message, 0, 0);

            ////////
            // Fin
            Content = grid_main;
        }
        private UIElement CreateControls()
        {
            m_grid_main = new Grid();
            m_grid_main.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(33.0, GridUnitType.Star) });
            m_grid_main.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(33.0, GridUnitType.Star) });
            m_grid_main.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(33.0, GridUnitType.Star) });

            m_grid_selectedMessage = new Grid();
            m_grid_selectedMessage.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            m_grid_selectedMessage.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            m_grid_selectedMessage.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
            m_grid_main.SetGridRowColumn(m_grid_selectedMessage, 0, 0);

            m_comboBox_message = new ComboBox_Message();
            m_comboBox_message.SetActiveAndRegisterForGinTubEvents();
            m_comboBox_message.SelectionChanged += ComboBox_Event_SelectionChanged;
            m_grid_selectedMessage.SetGridRowColumn(m_comboBox_message, 0, 0);

            m_button_messageTree = new Button() { Content = "View Message Tree", Visibility = System.Windows.Visibility.Collapsed };
            m_button_messageTree.Click += (x, y) =>
            {
                if(SelectedMessageId.HasValue)
                {
                    var window = new Window_MessageTree(SelectedMessageId.Value, SelectedMessageName, SelectedMessageText);
                    window.SetActiveAndRegisterForGinTubEvents();
                    window.Show();
                    GinTubBuilderManager.ReadMessageTreeForMessage(SelectedMessageId.Value, null);
                }
            };
            m_grid_selectedMessage.SetGridRowColumn(m_button_messageTree, 2, 0);

            return m_grid_main;
        }