private UserControl_Bordered_MessageTreeMessage AddMessageTreeMessage(int messageId, string messageName, string messageText, int? messageParentMessageChoiceId)
 {
     var userControl = new UserControl_Bordered_MessageTreeMessage(messageId, messageName, messageText, messageParentMessageChoiceId, false, true);
     userControl.SetActiveAndRegisterForGinTubEvents();
     userControl = SetInitialPosition(AssignMovementHandlers(userControl)) as UserControl_Bordered_MessageTreeMessage;
     EnableMessageAppending(userControl);
     m_canvas_messageTree.Children.Add(userControl);
     return userControl;
 }
        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;
        }