public override void Execute(object @object)
        {
            if (!Enabled)
            {
                return;
            }

            var q = new OrderingQuestion
                        {
                            Id = Guid.NewGuid()
                        };

            if (Warehouse.Warehouse.Instance.CourseTree.CurrentNode is TestModule)
            {
                var tm = Warehouse.Warehouse.Instance.CourseTree.CurrentNode as TestModule;
                q.Text = string.Concat("Вопрос ", tm.Questions.Count + 1);
            }

            if (Warehouse.Warehouse.Instance.CourseTree.CurrentNode is Group)
            {
                var g = Warehouse.Warehouse.Instance.CourseTree.CurrentNode as Group;
                q.Text = string.Concat("Вопрос ", g.Questions.Count + 1);

                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,
                                         Text = q.Text,
                                         HtmlEditingTool =
                                             {Mode = Utils.Controls.HtmlEditing.Enums.HtmlEditingToolMode.Design}
                                     };

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

            Warehouse.Warehouse.Instance.CourseTree.CurrentNode = q;
            Warehouse.Warehouse.IsProjectModified = true;
        }
        /// <summary>
        /// считывает файл вопроса
        /// </summary>
        /// <returns>считанный вопрос</returns>
        public Question ReadQuestionFile(string qfPath, TestModule test)
        {
            // пока сделан вариант только для вопроса типов Choice

            // когда будут реализованы все варианты вопросов, сделать Question question = null
            Question question = new MultichoiceQuestion();
            XmlTextReader reader = null;

            string interaction = string.Empty;
            string title = string.Empty;
            string cardinality = string.Empty;
            bool isAdaptive = false;
            bool isSupported = false;

            if (!File.Exists(qfPath))
            {
                MessageBox.Show("Файла " + qfPath + " не существует!");
            }
            else
            {
                try
                {
                    bool isQuestion = false;

                    // проверяем, является ли файл вопросом
                    reader = new XmlTextReader(qfPath);
                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element)
                        {
                            if (reader.Name.Equals("assessmentItem", StringComparison.OrdinalIgnoreCase))
                            {
                                isQuestion = true;
                            }
                        }
                        if (isQuestion == true) break;
                    }
                    reader.Close();
                    if (isQuestion)
                    {
                        // считываем из файла тип вопроса                 
                        reader = new XmlTextReader(qfPath);
                        while (reader.Read())
                        {
                            if (reader.NodeType == XmlNodeType.Element)
                            {
                                // считываем название вопроса
                                if (reader.Name.Equals("assessmentItem", StringComparison.OrdinalIgnoreCase))
                                {
                                    if (reader.GetAttribute("title") != null)
                                    {
                                        title = reader.GetAttribute("title");
                                    }
                                    if (reader.GetAttribute("adaptive") != null)
                                    {
                                        isAdaptive = bool.Parse(reader.GetAttribute("adaptive"));
                                    }
                                }
                                if (!isAdaptive)
                                {
                                    // считываем признак типа вопроса
                                    if (reader.Name.Equals("responseDeclaration", StringComparison.OrdinalIgnoreCase))
                                    {
                                        cardinality = reader.GetAttribute("cardinality");
                                    }
                                    // вопросы типа "Выбор"
                                    if (reader.Name.Equals("choiceInteraction", StringComparison.OrdinalIgnoreCase))
                                    {
                                        isSupported = true;
                                        // Одновариантный выбор
                                        if (cardinality.Equals("single", StringComparison.OrdinalIgnoreCase))
                                        {
                                            question = new ChoiceQuestion();
                                        }
                                        // Множественный выбор
                                        else if (cardinality.Equals("multiple", StringComparison.OrdinalIgnoreCase))
                                        {
                                            question = new MultichoiceQuestion();
                                        }
                                    }
                                    // вопросы типа "Упорядочивание элементов ответа"
                                    if (reader.Name.Equals("orderInteraction", StringComparison.OrdinalIgnoreCase))
                                    {
                                        isSupported = true;
                                        question = new OrderingQuestion();
                                    }
                                    // Открытые вопросы
                                    if (reader.Name.Equals("textEntryInteraction", StringComparison.OrdinalIgnoreCase))
                                    {
                                        isSupported = true;
                                        question = new OpenQuestion();
                                    }
                                }
                            }
                        }
                        if (!isSupported)
                        {
                            // question = new UnknownQuestion(title);
                            MessageBox.Show("Данный тип вопросов не поддерживается приложением Visual Editor.",
                                    "Visual Editor",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                            question = null;
                        }
                        question.TestModule = test;
                        if (!question.ReadQti(qfPath))
                        {
                            question = null;
                        }
                    }
                    else
                    {
                        MessageBox.Show("Данный файл не является файлом вопроса в стандарте IMS QTI 2.1.",
                                    "Visual Editor",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                        question = null;
                    }
                }
                catch
                {
                    MessageBox.Show("При чтении файла вопроса произошла ошибка. (" + qfPath + ")",
                                    "Visual Editor",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                    question = null;
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                }
            }

            return question;
        }
        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);
            }
        }
        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);
            }
        }