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

            var path = Path.Combine(Warehouse.Warehouse.ProjectEditorLocation, Warehouse.Warehouse.ProjectArchiveName);

            #region Заполнение дерева компетенций

            var ct = Warehouse.Warehouse.Instance.ConceptTree;
            var xmlReader = new XmlTextReader(path);

            try
            {
                while (xmlReader.Read())
                {
                    System.Windows.Forms.Application.DoEvents();

                    if (xmlReader.NodeType == XmlNodeType.Element)
                    {
                        if (xmlReader.Name.Equals("concept"))
                        {
                            var io = xmlReader.GetAttribute("io");

                            // В старых файлах проекта атрибута "io" нет.
                            if (io == null || io.Equals("o"))
                            {
                                var c = new Logic.Course.Items.Concept
                                            {
                                                Id = new Guid(xmlReader.GetAttribute("id").Substring(6, 36)),
                                                Text = xmlReader.GetAttribute("name"),
                                                Type = Enums.ConceptType.Internal,
                                                ImageIndex = 1,
                                                SelectedImageIndex = 1
                                            };
                                ct.Nodes.Add(c);
                            }
                            else if (io.Equals("i"))
                            {
                                var c = new Logic.Course.Items.Concept
                                            {
                                                Id = new Guid(xmlReader.GetAttribute("id").Substring(6, 36)),
                                                Text = xmlReader.GetAttribute("name"),
                                                Type = Enums.ConceptType.External,
                                                ImageIndex = 1,
                                                SelectedImageIndex = 1
                                            };
                                ct.Nodes.Add(c);
                            }
                        }
                        else if (xmlReader.Name.Equals("profile"))
                        {
                            var id = new Guid(xmlReader.GetAttribute("concept_id").Substring(6, 36));

                            foreach (Logic.Course.Items.Concept c in ct.Nodes)
                            {
                                if (c.Id.Equals(id))
                                {
                                    var lb = xmlReader.GetAttribute("min");
                                    var separator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator;
                                    lb = lb.Replace(".", separator);
                                    lb = lb.Replace(",", separator);

                                    c.LowerBound = (float)Convert.ToDouble(lb);
                                    c.IsProfile = true;
                                    c.ImageIndex = 0;
                                    c.SelectedImageIndex = 0;

                                    break;
                                }
                            }
                        }
                    }
                }
            }
            catch { }
            finally
            {
                xmlReader.Close();
            }

            #endregion

            ////
            RibbonStatusStripEx.Instance.SetProgress(10);
            ////

            #region Определение свойства ModuleId компетенций

            var mid = Guid.Empty;
            xmlReader = new XmlTextReader(path);
            var modulesCount = 0;

            try
            {
                while (xmlReader.Read())
                {
                    System.Windows.Forms.Application.DoEvents();

                    if (xmlReader.NodeType == XmlNodeType.Element)
                    {
                        if (xmlReader.Name.Equals("module"))
                        {
                            if (xmlReader.GetAttribute("type").Equals("text"))
                            {
                                mid = new Guid(xmlReader.GetAttribute("id").Substring(8, 36));
                            }

                            modulesCount++;
                        }
                        else if (xmlReader.Name.Equals("output"))
                        {
                            var id = new Guid(xmlReader.GetAttribute("concept_id").Substring(6, 36));

                            foreach (Logic.Course.Items.Concept c in ct.Nodes)
                            {
                                if (c.Id.Equals(id))
                                {
                                    c.ModuleId = new Guid(mid.ToString());

                                    break;
                                }
                            }
                        }
                    }
                }
            }
            catch { }
            finally
            {
                xmlReader.Close();
            }

            RibbonStatusStripEx.Instance.ModulesCount = modulesCount;

            #endregion

            #region Чтение структуры проекта, закладок, контента контролей

            var depth = 1;
            var cst = Warehouse.Warehouse.Instance.CourseTree;
            // Узел, в который добавляется следующий создаваемый узел.
            TreeNode activeNode = null;

            xmlReader = new XmlTextReader(path);

            try
            {
                while (xmlReader.Read())
                {
                    System.Windows.Forms.Application.DoEvents();

                    if (xmlReader.NodeType == XmlNodeType.Element)
                    {
                        if (xmlReader.Name.Equals("project"))
                        {
                            #region Корень учебного курса

                            var cr = new Logic.Course.Items.CourseRoot
                                         {
                                             Text = xmlReader.GetAttribute("name")
                                         };

                            cst.Nodes.Add(cr);
                            activeNode = cr;

                            #endregion
                        }
                        else if (xmlReader.Name.Equals("module"))
                        {
                            if (xmlReader.GetAttribute("type").Equals("text"))
                            {
                                #region Учебный модуль

                                mid = new Guid(xmlReader.GetAttribute("id").Substring(8, 36));
                                var tm = new TrainingModule
                                             {
                                                 Id = mid,
                                                 Text = xmlReader.GetAttribute("name")
                                             };

                                TrainingModule.Count++;
                                Warehouse.Warehouse.Instance.TrainingModules.Add(tm);

                                if (xmlReader.Depth == depth)
                                {
                                    activeNode.Nodes.Add(tm);
                                }
                                else if (xmlReader.Depth - depth > 0)
                                {
                                    activeNode = activeNode.Nodes[activeNode.Nodes.Count - 1];
                                    activeNode.Nodes.Add(tm);
                                }
                                else if (xmlReader.Depth - depth < 0)
                                {
                                    for (var i = 0; i < depth - xmlReader.Depth; i++)
                                    {
                                        activeNode = activeNode.Parent;
                                    }

                                    activeNode.Nodes.Add(tm);
                                }

                                depth = xmlReader.Depth;

                                #endregion
                            }
                            else if (xmlReader.GetAttribute("type").Equals("test", StringComparison.OrdinalIgnoreCase) ||
                                     xmlReader.GetAttribute("type").Equals("training", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Контроль

                                mid = Guid.Empty;
                                var tm = new TestModule
                                             {
                                                 Text = xmlReader.GetAttribute("name"),
                                                 Id = new Guid(xmlReader.GetAttribute("id").Substring(8, 36))
                                             };

                                #region Входной/выходной контроль

                                if (xmlReader.GetAttribute("io") != null)
                                {
                                    if (xmlReader.GetAttribute("io").Equals("i", StringComparison.OrdinalIgnoreCase))
                                    {
                                        tm.TestType = Enums.TestType.InTest;
                                    }
                                    else if (xmlReader.GetAttribute("io").Equals("o", StringComparison.OrdinalIgnoreCase))
                                    {
                                        tm.TestType = Enums.TestType.OutTest;
                                    }
                                }
                                else
                                {
                                    tm.TestType = Enums.TestType.OutTest;
                                }

                                #endregion

                                #region Тренажер

                                if (xmlReader.GetAttribute("type").Equals("test", StringComparison.OrdinalIgnoreCase))
                                {
                                    tm.Trainer = false;
                                }
                                else if (xmlReader.GetAttribute("type").Equals("training",
                                                                               StringComparison.OrdinalIgnoreCase))
                                {
                                    tm.Trainer = true;
                                }

                                #endregion

                                #region Последовательность вопросов

                                if (xmlReader.GetAttribute("order").Equals("natural", StringComparison.OrdinalIgnoreCase))
                                {
                                    tm.QuestionSequence = Enums.QuestionSequence.Natural;
                                }
                                else if (xmlReader.GetAttribute("order").Equals("random",
                                                                                StringComparison.OrdinalIgnoreCase))
                                {
                                    tm.QuestionSequence = Enums.QuestionSequence.Random;
                                }
                                else if (xmlReader.GetAttribute("order").Equals("network",
                                                                                StringComparison.OrdinalIgnoreCase))
                                {
                                    tm.QuestionSequence = Enums.QuestionSequence.Network;
                                }

                                #endregion

                                tm.MistakesNumber = int.Parse(xmlReader.GetAttribute("errlimit"));
                                tm.TimeRestriction = int.Parse(xmlReader.GetAttribute("time"));

                                #region Вложенность контролей

                                if (xmlReader.Depth == depth)
                                {
                                    activeNode.Nodes.Add(tm);
                                }
                                else if (xmlReader.Depth - depth > 0)
                                {
                                    activeNode = activeNode.Nodes[activeNode.Nodes.Count - 1];
                                    activeNode.Nodes.Add(tm);
                                }
                                else if (xmlReader.Depth - depth < 0)
                                {
                                    for (int i = 0; i < depth - xmlReader.Depth; i++)
                                    {
                                        activeNode = activeNode.Parent;
                                    }

                                    activeNode.Nodes.Add(tm);
                                }

                                depth = xmlReader.Depth;

                                #endregion

                                tm.XmlReader.ReadXml(xmlReader);

                                #region Замена q.NextQuestion на реальные, после того, как все вопросы считаны

                                foreach (var q in tm.Questions)
                                {
                                    if (q.NextQuestion != null)
                                    {
                                        q.NextQuestion = Warehouse.Warehouse.GetQuestionById(q.NextQuestion.Id);
                                    }
                                }

                                #endregion

                                #endregion

                                RibbonStatusStripEx.Instance.MakeProgressStep(10);
                            }
                        }
                        else if (xmlReader.Name.Equals("input"))
                        {
                            #region Входная компетенция

                            var id = new Guid(xmlReader.GetAttribute("concept_id").Substring(6, 36));
                            Logic.Course.Items.Concept con = null;

                            foreach (Logic.Course.Items.Concept c in ct.Nodes)
                            {
                                if (c.Id.Equals(id))
                                {
                                    con = c;

                                    break;
                                }
                            }

                            var idc = new InDummyConcept
                            {
                                Text = con.Text,
                                Concept = con
                            };
                            idc.Concept.InDummyConcepts.Add(idc);

                            if (con.Type.Equals(Enums.ConceptType.Internal))
                            {
                                // Добавляет компетенцию-пустышку во входы учебного модуля.
                                var tm = Warehouse.Warehouse.GetTrainingModuleById(mid);
                                tm.InConceptParent.Nodes.Add(idc);
                            }
                            else if (con.Type.Equals(Enums.ConceptType.External))
                            {
                                // Добавляет компетенцию-пустышку во входы учебного курса.
                                cst.InConceptsParent.Nodes.Add(idc);
                            }

                            #endregion
                        }
                        else if (xmlReader.Name.Equals("output"))
                        {
                            #region Выходная компетенция

                            var id = new Guid(xmlReader.GetAttribute("concept_id").Substring(6, 36));
                            Logic.Course.Items.Concept con = null;

                            foreach (Logic.Course.Items.Concept c in ct.Nodes)
                            {
                                if (c.Id.Equals(id))
                                {
                                    con = c;

                                    break;
                                }
                            }

                            var odc = new OutDummyConcept
                                          {
                                              Text = con.Text,
                                              Concept = con
                                          };
                            odc.Concept.OutDummyConcept = odc;

                            // Добавляет компетенцию-пустышку в выходы учебного модуля.
                            var tm = Warehouse.Warehouse.GetTrainingModuleById(mid);
                            tm.OutConceptParent.Nodes.Add(odc);

                            #endregion
                        }
                        else if (xmlReader.Name.Equals("html_text"))
                        {
                            #region Чтение закладок

                            // Разбирает DocumentHtml только учебного модуля.
                            if (!mid.Equals(Guid.Empty))
                            {
                                var documentHtml = xmlReader.ReadElementString();
                                documentHtml = documentHtml.Trim();
                                TrainingModuleXmlReader.ReadBookmarksIds(documentHtml);
                            }

                            #endregion
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.LogException(ex);
            }
            finally
            {
                xmlReader.Close();
            }

            #endregion

            #region Чтение контента учебных модулей

            xmlReader = new XmlTextReader(path);

            try
            {
                while (xmlReader.Read())
                {
                    System.Windows.Forms.Application.DoEvents();

                    if (xmlReader.NodeType == XmlNodeType.Element)
                    {
                        if (xmlReader.Name.Equals("module"))
                        {
                            if (xmlReader.GetAttribute("type").Equals("text"))
                            {
                                #region Учебный модуль

                                mid = new Guid(xmlReader.GetAttribute("id").Substring(8, 36));

                                #endregion
                            }
                            else if (xmlReader.GetAttribute("type").Equals("test", StringComparison.OrdinalIgnoreCase) ||
                                     xmlReader.GetAttribute("type").Equals("training", StringComparison.OrdinalIgnoreCase))
                            {
                                #region Контроль

                                mid = Guid.Empty;

                                #endregion
                            }
                        }
                        else if (xmlReader.Name.Equals("html_text"))
                        {
                            #region Контент документа

                            // Разбирает DocumentHtml только учебного модуля.
                            if (!mid.Equals(Guid.Empty))
                            {
                                var documentHtml = xmlReader.ReadElementString();
                                documentHtml = documentHtml.Trim();
                                var tm = Warehouse.Warehouse.GetTrainingModuleById(mid);
                                documentHtml = tm.XmlReader.XmlToHtml(documentHtml);
                                tm.DocumentHtml = documentHtml;
                            }

                            #endregion

                            RibbonStatusStripEx.Instance.MakeProgressStep(10);
                        }
                    }
                }
            }
            catch { }
            finally
            {
                xmlReader.Close();
            }

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

            if (EditorObserver.ActiveEditor == null)
            {
                return;
            }

            if (EditorObserver.ActiveEditor.IsSelection)//
            {
                return;
            }

            using (var cd = new ConceptDialog())
            {
                if (cd.ShowDialog(EditorObserver.DialogOwner) == DialogResult.OK)
                {
                    var tm = ((TrainingModuleDocument)Controls.HtmlEditing.HtmlEditingToolHelper.GetParentDocument(EditorObserver.ActiveEditor)).TrainingModule;                        

                    // Добавляет компетенцию в дерево компетенций.
                    var c = new Logic.Course.Items.Concept
                                {
                                    Id = Guid.NewGuid(),
                                    ModuleId = tm.Id,
                                    Text = cd.DataTransferUnit.GetNodeValue("ConceptName")
                                };

                    if (cd.DataTransferUnit.GetNodeValue("ConceptType").Equals(Enums.ConceptType.Internal.ToString()))
                    {
                        c.Type = Enums.ConceptType.Internal;
                    }
                    else
                    {
                        c.Type = Enums.ConceptType.External;
                    }

                    Warehouse.Warehouse.Instance.ConceptTree.Nodes.Add(c);

                    if (c.Type.Equals(Enums.ConceptType.Internal))
                    {
                        #region Внутренняя компетенция

                        // Добавляет компетенцию-пустышку в дерево учебного курса.
                        var odc = new OutDummyConcept
                                      {
                                          Concept = c,
                                          Text = c.Text
                                      };
                        tm.OutConceptParent.Nodes.Add(odc);
                        odc.Concept.OutDummyConcept = odc;

                        // Добавляет компетенцию в Html-код.
                        var d = new Dictionary<string, string>
                                    {
                                        {"id", c.Id.ToString()},
                                        {"class", "concept"}
                                    };

                        try
                        {
                            HtmlEditingToolHelper.InsertHtml(EditorObserver.ActiveEditor, TagNames.AnchorTagName, d);
                        }
                        catch (Exception exception)
                        {
                            ExceptionManager.Instance.LogException(exception);
                            UIHelper.ShowMessage(operationCantBePerformedMessage, MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                            return;
                        }

                        #endregion
                    }
                    else
                    {
                        #region Внешняя компетенция

                        // Добавляет компетенцию-пустышку в дерево учебного курса.
                        var idc = new InDummyConcept
                                      {
                                          Concept = c,
                                          Text = c.Text
                                      };
                        Warehouse.Warehouse.Instance.CourseTree.InConceptsParent.Nodes.Add(idc);
                        idc.Concept.InDummyConcepts.Add(idc);

                        #endregion
                    }
                }
            }
        }
        private void CourseTree_DragDrop(object sender, DragEventArgs e)
        {
            if (EditorObserver.HostEditorMode == Utils.Controls.HtmlEditing.Enums.HtmlEditingToolMode.Design)
            {
                DragHelper.ImageList_DragLeave(CourseTree.Handle);
                // Узел, над которым находится указатель мыши.
                var dropNode = CourseTree.GetNodeAt(CourseTree.PointToClient(new Point(e.X, e.Y)));
                if (dragNode != dropNode)
                {
                    if (dragNode.Parent != dropNode)
                    {
                        // Если копируется входная компетенция из родительского узла внешних компетенций.
                        if (dragNode is InDummyConcept)
                        {
                            // Предотвращение копирования уже имеющеейся во входах компетенции.
                            var ico = IsConceptOccurrence(dropNode as InConceptParent, (dragNode as InDummyConcept).Concept.Id);

                            if (!ico)
                            {
                                var inDummyConcept1 = dragNode as InDummyConcept;
                                var inDummyConcept2 = new InDummyConcept
                                {
                                    Text = inDummyConcept1.Text,
                                    Concept = inDummyConcept1.Concept
                                };

                                dropNode.Nodes.Add(inDummyConcept2);

                                Warehouse.Warehouse.IsProjectModified = true;
                            }
                        }

                        // Если копируется выходная компетенция.
                        if (dragNode is OutDummyConcept)
                        {
                            // Предотвращение копирования уже имеющеейся во входах компетенции.
                            var ico = IsConceptOccurrence(dropNode as InConceptParent, (dragNode as OutDummyConcept).Concept.Id);

                            if (!ico)
                            {
                                var icc = false;

                                // Если не перетаскиваем внешнюю компетенцию учебного курса.
                                if (dragNode.Parent.Parent is TrainingModule)
                                {
                                    isCycle = false;
                                    icc = IsConceptCycle((TrainingModule)dragNode.Parent.Parent, (TrainingModule)dropNode.Parent);
                                }

                                // Если нет зацикливания компетенций.
                                if (!icc)
                                {
                                    var outDummyConcept = dragNode as OutDummyConcept;
                                    var inDummyConcept = new InDummyConcept
                                    {
                                        Text = outDummyConcept.Text,
                                        Concept = outDummyConcept.Concept
                                    };
                                    inDummyConcept.Concept.InDummyConcepts.Add(inDummyConcept);

                                    dropNode.Nodes.Add(inDummyConcept);

                                    Warehouse.Warehouse.IsProjectModified = true;
                                }
                                else
                                {
                                    MessageBox.Show(message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                            }
                        }

                        // Если перемещается контроль.
                        if (dragNode is TestModule)
                        {
                            // Если перемещаем из корня учебной программы в учебный модуль или
                            // из учебного модуля в учебный модуль в сторону уменьшения ответственности.
                            if (dragNode.Parent is CourseRoot &&
                                dropNode is TrainingModule ||
                                dragNode.Parent is TrainingModule &&
                                dropNode is TrainingModule &&
                                dropNode.Parent.Equals(dragNode.Parent))
                            {
                                MessageBox.Show("Данная операция запрещена.", Application.ProductName,
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);

                                return;
                            }
                        }

                        // Если перемещается узел, отличный от компетенции.
                        if (!(dragNode is OutDummyConcept) &&
                            !(dragNode is InDummyConcept))
                        {
                            #region Перемещается вопрос

                            if (dragNode is Question)
                            {
                                // Перемещение вопроса из контроля в группу.
                                if (dragNode.Parent is TestModule &&
                                    dropNode is Group)
                                {
                                    var g = dropNode as Group;
                                    var q = dragNode as Question;

                                    q.TimeRestriction = g.TimeRestriction;
                                    q.Profile = g.Profile;
                                    q.Marks = g.Marks;
                                }

                                // Перемещение вопроса из группы в контроль.
                                if (dragNode.Parent is Group &&
                                    dropNode is TestModule)
                                {
                                    var q = dragNode as Question;

                                    q.TimeRestriction = 0;
                                    q.Profile = null;
                                    q.Marks = 0;

                                    // Если перемещается последний вопрос из группы, параметры группы обнуляются.
                                    var g = dragNode.Parent as Group;
                                    if (g.Questions.Count.Equals(1))
                                    {
                                        g.TimeRestriction = 0;
                                        g.Profile = null;
                                        g.Marks = 0;
                                    }

                                    if (!g.ChosenQuestionsCount.Equals(0))
                                    {
                                        if (g.ChosenQuestionsCount > g.Questions.Count - 1)
                                        {
                                            g.ChosenQuestionsCount = g.Questions.Count - 1;
                                        }
                                    }
                                }

                                // Перемещение вопроса из группы в группу.
                                if (dragNode.Parent is Group &&
                                    dropNode is Group)
                                {
                                    var g = dropNode as Group;
                                    var q = dragNode as Question;

                                    q.TimeRestriction = g.TimeRestriction;
                                    q.Profile = g.Profile;
                                    q.Marks = g.Marks;

                                    // Если перемещается последний вопрос из группы, параметры группы обнуляются.
                                    g = dragNode.Parent as Group;
                                    if (g.Questions.Count.Equals(1))
                                    {
                                        g.TimeRestriction = 0;
                                        g.Profile = null;
                                        g.Marks = 0;
                                    }

                                    if (!g.ChosenQuestionsCount.Equals(0))
                                    {
                                        if (g.ChosenQuestionsCount > g.Questions.Count - 1)
                                        {
                                            g.ChosenQuestionsCount = g.Questions.Count - 1;
                                        }
                                    }
                                }
                            }

                            #endregion

                            if (dragNode.Parent == null)
                            {
                                CourseTree.Nodes.Remove(dragNode);
                            }
                            else
                            {
                                dragNode.Parent.Nodes.Remove(dragNode);
                            }

                            dropNode.Nodes.Add(dragNode);
                            Warehouse.Warehouse.IsProjectModified = true;
                            //dropNode.ExpandAll();
                            dragNode = null;
                        }
                    }
                    timer.Enabled = false;
                }
            }
        }