public void ReadXml(XmlTextReader xmlReader)
        {
            try
            {
                var isEndCycle = false;

                while (!isEndCycle && xmlReader.Read())
                {
                    if (xmlReader.NodeType == XmlNodeType.Element)
                    {
                        if (xmlReader.Name.Equals("group", StringComparison.OrdinalIgnoreCase))
                        {
                            #region Группа

                            var g = new Group();

                            if (xmlReader.GetAttribute("name") != null)
                            {
                                g.Text = xmlReader.GetAttribute("name");
                            }
                            else
                            {
                                g.Text = string.Concat("Группа ", testModule.Groups.Count + 1);
                            }

                            g.ChosenQuestionsCount = int.Parse(xmlReader.GetAttribute("count"));
                            g.XmlReader.ReadXml(xmlReader);
                            testModule.Nodes.Add(g);

                            #endregion
                        }

                        if (xmlReader.Name.Equals("question", StringComparison.OrdinalIgnoreCase))
                        {
                            // Название вопроса.
                            var qname = xmlReader.GetAttribute("name");
                            // Идентификатор вопроса.
                            var qid = xmlReader.GetAttribute("id").Substring(8, 36);
                            // Тип вопроса.
                            var qtype = xmlReader.GetAttribute("type");
                            // Ограничение по времени на прохождение вопроса.
                            var qtime = xmlReader.GetAttribute("time");
                            // Идентификатор следующего вопроса.
                            var qNextQuestion = xmlReader.GetAttribute("next_question");
                            if (!string.IsNullOrEmpty(qNextQuestion))
                            {
                                qNextQuestion = qNextQuestion.Substring(8, 36);
                            }
                            
                            if (qtype.Equals("radio", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Одновариантный выбор

                                var q = new ChoiceQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //q.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                if (!string.IsNullOrEmpty(qNextQuestion))
                                {
                                    // q_ - временное хранилище для идентификатора следующего вопроса.
                                    // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос.
                                    var q_ = new ChoiceQuestion
                                    {
                                        Id = new Guid(qNextQuestion)
                                    };
                                    q.NextQuestion = q_;
                                }
                                q.XmlReader.ReadXml(xmlReader);
                                testModule.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("checkbox", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Множественный выбор

                                var q = new MultichoiceQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //mq.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                if (!string.IsNullOrEmpty(qNextQuestion))
                                {
                                    // q_ - временное хранилище для идентификатора следующего вопроса.
                                    // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос.
                                    var q_ = new ChoiceQuestion
                                    {
                                        Id = new Guid(qNextQuestion)
                                    };
                                    q.NextQuestion = q_;
                                }
                                q.XmlReader.ReadXml(xmlReader);
                                testModule.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("order", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Ранжирование

                                var q = new OrderingQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //mq.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                if (!string.IsNullOrEmpty(qNextQuestion))
                                {
                                    // q_ - временное хранилище для идентификатора следующего вопроса.
                                    // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос.
                                    var q_ = new ChoiceQuestion
                                    {
                                        Id = new Guid(qNextQuestion)
                                    };
                                    q.NextQuestion = q_;
                                }
                                q.XmlReader.ReadXml(xmlReader);
                                testModule.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase) ||
                                qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Открытый вопрос

                                var q = new OpenQuestion
                                {
                                    Text = qname
                                };

                                if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase))
                                {
                                    q.IsAnswerNumeric = false;
                                }
                                else if (qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase))
                                {
                                    q.IsAnswerNumeric = true;
                                }

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //mq.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                if (!string.IsNullOrEmpty(qNextQuestion))
                                {
                                    // q_ - временное хранилище для идентификатора следующего вопроса.
                                    // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос.
                                    var q_ = new ChoiceQuestion
                                    {
                                        Id = new Guid(qNextQuestion)
                                    };
                                    q.NextQuestion = q_;
                                }
                                q.XmlReader.ReadXml(xmlReader);
                                testModule.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("outer", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Внешний вопрос

                                var q = new OuterQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //q.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                if (!string.IsNullOrEmpty(qNextQuestion))
                                {
                                    // q_ - временное хранилище для идентификатора следующего вопроса.
                                    // После чтения всего контроля, q.NextQuestion заменяется на реальный вопрос.
                                    var q_ = new ChoiceQuestion
                                    {
                                        Id = new Guid(qNextQuestion)
                                    };
                                    q.NextQuestion = q_;
                                }
                                q.XmlReader.ReadXml(xmlReader);
                                testModule.Nodes.Add(q);

                                #endregion
                            }
                        }
                    }
                    else if (xmlReader.NodeType == XmlNodeType.EndElement)
                    {
                        if (xmlReader.Name.Equals("module", StringComparison.OrdinalIgnoreCase))
                        {
                            isEndCycle = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.LogException(ex);
            }
        }
        private static OuterQuestion PrepareOuterQuestion()
        {
            var q = new OuterQuestion
                        {
                            Id = Guid.NewGuid()
                        };

            if (Warehouse.Warehouse.Instance.CourseTree.CurrentNode is Group)
            {
                var g = Warehouse.Warehouse.Instance.CourseTree.CurrentNode as Group;
                q.TimeRestriction = g.TimeRestriction;
                q.Profile = g.Profile;
                q.Marks = g.Marks;
            }

            Warehouse.Warehouse.Instance.CourseTree.CurrentNode.Nodes.Add(q);

            if (!Warehouse.Warehouse.Instance.CourseTree.CurrentNode.IsExpanded)
            {
                Warehouse.Warehouse.Instance.CourseTree.CurrentNode.Toggle();
            }

            // Создает и отображает редактор.
            q.QuestionDocument = new QuestionDocument
                                     {
                                         Question = q,
                                         HtmlEditingTool =
                                             {Mode = Utils.Controls.HtmlEditing.Enums.HtmlEditingToolMode.Design}
                                     };

            //q.QuestionDocument.VisualHtmlEditor.SetDefaultFont();
            HtmlEditingToolHelper.SetDefaultDocumentHtml(q.QuestionDocument.HtmlEditingTool);
            PreviewObserver.AddDocument(q.QuestionDocument);
            q.QuestionDocument.Show();

            return q;
        }
        public static Question Clone(Question question)
        {
            Question newQuestion = null;

            #region Инициализация вопроса

            if (question is ChoiceQuestion)
            {
                newQuestion = new ChoiceQuestion();
            }
            else if (question is MultichoiceQuestion)
            {
                newQuestion = new MultichoiceQuestion();
            }
            else if (question is InteractiveQuestion)
            {
                newQuestion = new InteractiveQuestion();
            }
            else if (question is OrderingQuestion)
            {
                newQuestion = new OrderingQuestion();
            }
            else if (question is OpenQuestion)
            {
                newQuestion = new OpenQuestion();
            }
            else if (question is CorrespondenceQuestion)
            {
                newQuestion = new CorrespondenceQuestion();
            }
            else if (question is OuterQuestion)
            {
                newQuestion = new OuterQuestion();
                (newQuestion as OuterQuestion).TaskId = (question as OuterQuestion).TaskId;
                (newQuestion as OuterQuestion).TaskName = (question as OuterQuestion).TaskName;
                (newQuestion as OuterQuestion).TestName = (question as OuterQuestion).TestName;
                (newQuestion as OuterQuestion).SubjectName = (question as OuterQuestion).SubjectName;
                (newQuestion as OuterQuestion).Declaration = (question as OuterQuestion).Declaration;
                (newQuestion as OuterQuestion).Url = (question as OuterQuestion).Url;
            }

            #endregion

            newQuestion.LowerBound = question.LowerBound;
            newQuestion.Cardinality = question.Cardinality;
            newQuestion.Text = question.Text;
            newQuestion.Id = Guid.NewGuid();
            newQuestion.DocumentHtml = string.Copy(question.DocumentHtml);
            newQuestion.TimeRestriction = question.TimeRestriction;
            newQuestion.Profile = question.Profile;
            newQuestion.Marks = question.Marks;
            newQuestion.Hint = question.Hint;
            newQuestion.NextQuestion = question.NextQuestion;
            newQuestion.IsAdaptive = question.IsAdaptive;
            newQuestion.BaseType = question.BaseType;
            newQuestion.DefaultValue = question.DefaultValue;
            //newQuestion.Mark = question.Mark;
            newQuestion.IsShuffle = question.IsShuffle;
            newQuestion.MaxChoices = question.MaxChoices;
            //  newQuestion.timeRestriction = question.timeRestriction;
            newQuestion.identifier = question.identifier;    // идентификатор вопроса ("VE-" + questionNumber + questionType)  

            foreach (var questionResponse in question.Responses)
            {
                var response = Response.Clone(questionResponse);
                newQuestion.Nodes.Add(response);
            }

            foreach (ResponseVariant questionResponseVariant in question.ResponseVariants)
            {
                var responseVariant = new ResponseVariant(question);

                if (!(question is OrderingQuestion) && !(question is OpenQuestion))
                {
                    foreach (Response response in questionResponseVariant.Responses)
                    {
                        for (var i = 0; i < question.Responses.Count; i++)
                        {
                            if ((question.Responses[i]).Text.Equals(response.Text))
                            {
                                responseVariant.Responses.Add(question.Responses[i]);

                                break;
                            }
                        }
                    }
                }
                else
                {
                    for (var i = 0; i < questionResponseVariant.Responses.Count; i++)
                    {
                        responseVariant.Responses.Add(questionResponseVariant.Responses[i]);
                    }
                }

                responseVariant.Weight = questionResponseVariant.Weight;
                responseVariant.Hint = questionResponseVariant.Hint;
                responseVariant.NextQuestion = questionResponseVariant.NextQuestion; // моё 


                newQuestion.ResponseVariants.Add(responseVariant);
            }

            return newQuestion;
        }
        public void ReadXml(XmlTextReader xmlReader)
        {
            try
            {
                var isEndCycle = false;

                group.ChosenQuestionsCount = int.Parse(xmlReader.GetAttribute("count"));

                while (!isEndCycle && xmlReader.Read())
                {
                    if (xmlReader.NodeType == XmlNodeType.Element)
                    {
                        if (xmlReader.Name.Equals("question", StringComparison.OrdinalIgnoreCase))
                        {
                            var qname = xmlReader.GetAttribute("name");
                            var qid = xmlReader.GetAttribute("id").Substring(8, 36);
                            var qtype = xmlReader.GetAttribute("type");
                            var qtime = xmlReader.GetAttribute("time");
                            group.TimeRestriction = int.Parse(qtime);

                            if (qtype.Equals("radio", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Одновариантный выбор

                                var q = new ChoiceQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //q.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                q.XmlReader.ReadXml(xmlReader);
                                group.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("checkbox", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Множественный выбор

                                var q = new MultichoiceQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //mq.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                q.XmlReader.ReadXml(xmlReader);
                                group.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("order", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Ранжирование

                                var q = new OrderingQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //mq.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                q.XmlReader.ReadXml(xmlReader);
                                group.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase) ||
                                qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Открытый вопрос

                                var q = new OpenQuestion
                                {
                                    Text = qname
                                };

                                if (qtype.Equals("edit", StringComparison.OrdinalIgnoreCase))
                                {
                                    q.IsAnswerNumeric = false;
                                }
                                else if (qtype.Equals("explicit", StringComparison.OrdinalIgnoreCase))
                                {
                                    q.IsAnswerNumeric = true;
                                }

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //mq.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                q.XmlReader.ReadXml(xmlReader);
                                group.Nodes.Add(q);

                                #endregion
                            }
                            else if (qtype.Equals("outer", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Вопросы Внешний вопрос

                                var q = new OuterQuestion
                                {
                                    Text = qname
                                };

                                try
                                {
                                    q.Id = new Guid(qid);
                                }
                                catch
                                {
                                    //q.Identifier = qid;
                                }

                                q.TimeRestriction = int.Parse(qtime);
                                q.XmlReader.ReadXml(xmlReader);
                                group.Nodes.Add(q);

                                #endregion
                            }
                        }

                        if (xmlReader.Name.Equals("mark", StringComparison.OrdinalIgnoreCase))
                        {
                            group.Marks = int.Parse(xmlReader.GetAttribute("value"));

                            try
                            {
                                var id = new Guid(xmlReader.GetAttribute("concept_id").Substring(6, 36));

                                foreach (Concept c in Warehouse.Warehouse.Instance.ConceptTree.Nodes)
                                {
                                    if (c.Id.Equals(id))
                                    {
                                        group.Profile = c;

                                        break;
                                    }
                                }
                            }
                            catch
                            {
                                group.Profile = null;
                            }

                            foreach (var q in group.Questions)
                            {
                                q.Marks = group.Marks;
                                q.Profile = group.Profile;
                            }
                        }
                    }
                    else if (xmlReader.NodeType == XmlNodeType.EndElement)
                    {
                        if (xmlReader.Name.Equals("group", StringComparison.OrdinalIgnoreCase))
                        {
                            isEndCycle = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.LogException(ex);
            }
        }