public void PrependDomain()
        {
            Domain newDomain = new Domain()
            {
                name = "!!!newDomain" + _newDomainValueCounter++.ToString(),
            };

            if (MainFrameContainer.AddNewDomain(newDomain))
            {
                Domain = newDomain;

                ViewModelFramesHierarchy newDomainNode = new ViewModelFramesHierarchy()
                {
                    kbEntity = KBEntity.DOMAIN_NAME,

                    ParentalNode = _nodeCollection[1],
                    Name         = newDomain.name,
                    Frame        = null,
                };

                _moveAllOtherNodesRightAfterNewNode(ref newDomainNode, 1); //1 для доменов

                OnPropertyChanged("PrependDomain");
            }
        }
        void UpdateDomainNodes()
        {
            _nodeCollection[1].Nodes.Clear();
            foreach (Domain newDomain in MainFrameContainer.GetDomains())
            {
                ViewModelFramesHierarchy domainToNode = new ViewModelFramesHierarchy()
                {
                    kbEntity     = KBEntity.DOMAIN_NAME,
                    Domain       = newDomain,
                    ParentalNode = _nodeCollection[1],
                    Name         = newDomain.name,
                    Frame        = null,
                };

                for (int i = 0; i < newDomain.values.Count; i++)
                {
                    ViewModelFramesHierarchy domainValueNode = new ViewModelFramesHierarchy()
                    {
                        kbEntity  = KBEntity.DOMAIN_VALUE,
                        NodeIndex = i,

                        ParentalNode = domainToNode,

                        Name = newDomain.values[i],
                    };
                    domainToNode.Nodes.Add(domainValueNode);
                }

                _nodeCollection[1].Nodes.Add(domainToNode);
            }
        }
        public void PrependFrame()
        {
            Frame newFrame = new Frame()
            {
                name = "!!!newFrame" + _newFrameCounter++.ToString(),
            };

            MainFrameContainer.AddFrame(newFrame);
            newFrame.Id = MainFrameContainer.GetAllFrames().Last().Id;

            ViewModelFramesHierarchy newFrameNode = new ViewModelFramesHierarchy()
            {
                kbEntity = KBEntity.FRAME,

                ParentalNode = _nodeCollection[0],

                Id    = newFrame.Id,
                Name  = newFrame.name,
                Frame = newFrame
            };

            ViewModelFramesHierarchy isA_node = new ViewModelFramesHierarchy()
            {
                kbEntity = KBEntity.IS_A,

                ParentalNode = newFrameNode,
                Name         = frame.isA,
                NodeIndex    = 0,
            };

            newFrameNode.Nodes.Add(isA_node);

            _moveAllOtherNodesRightAfterNewNode(ref newFrameNode, 0); //0 для фреймов

            viewModelGraph.DrawAllKB(MainFrameContainer);

            OnPropertyChanged("PrepEnd");
        }
        private void _moveAllOtherNodesRightAfterNewNode(ref ViewModelFramesHierarchy newNode, int domainOrSlot)
        {
            if (_nodeCollection[domainOrSlot].Nodes.Count != 0)
            {
                ViewModelFramesHierarchy prevNode = _nodeCollection[domainOrSlot].Nodes[0];
                ViewModelFramesHierarchy nextNode = prevNode;
                //prevNode = firstNode[0].Nodes[0];// Сохраняем самый первый узел
                _nodeCollection[domainOrSlot].Nodes[0] = newNode;

                for (int i = 1; i < _nodeCollection[domainOrSlot].Nodes.Count; i++)
                {
                    nextNode = _nodeCollection[domainOrSlot].Nodes[i];
                    _nodeCollection[domainOrSlot].Nodes[i] = prevNode;
                    prevNode = nextNode;
                }

                _nodeCollection[domainOrSlot].Nodes.Add(nextNode);
            }
            else
            {
                Nodes = _nodeCollection;
                _nodeCollection[domainOrSlot].Nodes.Add(newNode);
            }
        }
        public ViewModelFramesHierarchy()
        {
            Nodes = new ObservableCollection <ViewModelFramesHierarchy>();
            if (_nodeCollection == null)
            {
                kbEntity = KBEntity.DEFAULT_ENTITY;
                Name     = "SYS_MAIN_NODE";

                _nodeCollection = new ObservableCollection <ViewModelFramesHierarchy>();

                ViewModelFramesHierarchy nodeCollectionFirstNode = new ViewModelFramesHierarchy()
                {
                    Name     = "Фреймы",
                    kbEntity = KBEntity.DEFAULT_ENTITY,
                };
                _nodeCollection.Add(nodeCollectionFirstNode);
                nodeCollectionFirstNode = new ViewModelFramesHierarchy()
                {
                    Name = "Домены", kbEntity = KBEntity.DEFAULT_ENTITY, NodeIndex = -1
                };
                _nodeCollection.Add(nodeCollectionFirstNode);
                OnPropertyChanged();
            }
        }
        public bool AddSlotOrDomainValueNode(ViewModelFramesHierarchy parentNode)
        {
            switch (parentNode.kbEntity)
            {
            case KBEntity.DEFAULT_ENTITY:
                if (parentNode.Name == "Фреймы")
                {
                    PrependFrame();
                }
                else if (parentNode.Name == "Домены")
                {
                    PrependDomain();
                }

                break;

            case KBEntity.FRAME:
                int  slotsCount       = parentNode.Nodes.Count - 1;
                Slot newSlotName_Slot = new Slot()
                {
                    name  = "!!!newSlotName " + _newSlotNameCounter++.ToString(),
                    value = null,
                };
                parentNode.Frame.slots.Add(newSlotName_Slot);

                //TODO: Нужно сделать с нормальной проверкой:
                MainFrameContainer.ReplaceFrame(parentNode.frame.name, parentNode.frame);


                ViewModelFramesHierarchy newSlotName_Node = new ViewModelFramesHierarchy()
                {
                    kbEntity = KBEntity.SLOT_NAME,

                    ParentalNode = parentNode,
                    NodeIndex    = slotsCount + 1,
                    Name         = newSlotName_Slot.name,
                };
                parentNode.Nodes.Add(newSlotName_Node);
                UpdateDomainNodes();
                ///////////////
                break;

            case KBEntity.SLOT_NAME:
                if (parentNode.Nodes.Count == 0)
                {
                    int   slotIndex   = parentNode.NodeIndex - 1;
                    Frame parentFrame = parentNode.ParentalNode.frame;

                    parentFrame.slots[slotIndex].value = "!!!newSlotValue ";
                    //TODO: Нужно сделать с нормальной проверкой:
                    MainFrameContainer.ReplaceFrame(parentFrame.name, parentFrame);


                    ViewModelFramesHierarchy newSlotValue_Node = new ViewModelFramesHierarchy()
                    {
                        kbEntity = KBEntity.SLOT_VALUE,

                        ParentalNode = parentNode,
                        Name         = parentFrame.slots[slotIndex].value,
                    };
                    parentNode.Nodes.Add(newSlotValue_Node);
                    UpdateDomainNodes();
                    viewModelGraph.DrawAllKB(MainFrameContainer);
                    break;
                }
                break;

            case KBEntity.DOMAIN_NAME:
                int domainsCount = parentNode.Nodes.Count - 1;

                string newDomain_ValueName = "!!!newDomainValue " + _newDomainValueCounter++.ToString();

                if (MainFrameContainer.AddNewValueToDomain(parentNode.Domain.name, newDomain_ValueName))
                {
                    parentNode.Domain.values.Add(newDomain_ValueName);

                    ViewModelFramesHierarchy newDomainValue_Node = new ViewModelFramesHierarchy()
                    {
                        kbEntity = KBEntity.DOMAIN_VALUE,

                        ParentalNode = parentNode,
                        NodeIndex    = domainsCount + 1,
                        Name         = newDomain_ValueName,
                    };
                    parentNode.Nodes.Add(newDomainValue_Node);
                }
                break;

            default:
                break;
            }
            OnPropertyChanged("AddSlotOrDomainValueNode");
            return(true);
        }
        public void FillOutFrameContainer(List <Frame> listOfFrames, List <Domain> listOfDomains)
        {
            //PrependFrame(); Запилить через это
            //DeleteSelectedNode() сделать это
            //MainFrameContainer.SetDomains(listOfDomains);
            //MainFrameContainer.SetFrame(listOfFrames);



            try
            {
                foreach (var frame in listOfFrames)
                {
                    if (MainFrameContainer.AddFrame(frame))
                    {
                        //////////////////////Ниже все старое
                        ViewModelFramesHierarchy frameToNode = new ViewModelFramesHierarchy()
                        {
                            kbEntity = KBEntity.FRAME,

                            ParentalNode = _nodeCollection[0],

                            Id    = frame.Id,
                            Name  = frame.name,
                            Frame = frame,
                        };

                        ViewModelFramesHierarchy isA_node = new ViewModelFramesHierarchy()
                        {
                            kbEntity = KBEntity.IS_A,

                            ParentalNode = frameToNode,
                            Name         = frame.isA,
                            NodeIndex    = 0,
                        };

                        frameToNode.Nodes.Add(isA_node);

                        int         slotIndex = 1;
                        List <Slot> newSlots  = new List <Slot>();
                        foreach (var slot in frame.slots)
                        {
                            newSlots.Add(slot);
                            ViewModelFramesHierarchy slotNameNode = new ViewModelFramesHierarchy()
                            {
                                kbEntity = KBEntity.SLOT_NAME,

                                ParentalNode = frameToNode,
                                NodeIndex    = slotIndex++,
                                Name         = slot.name,
                            };

                            ViewModelFramesHierarchy slotValueNode = new ViewModelFramesHierarchy()
                            {
                                kbEntity = KBEntity.SLOT_VALUE,

                                ParentalNode = slotNameNode,
                                Name         = slot.value,
                            };
                            slotNameNode.Nodes.Add(slotValueNode);
                            frameToNode.Nodes.Add(slotNameNode);
                        }
                        frameToNode.frame.slots = newSlots;//todo: проверить

                        _nodeCollection[0].Nodes.Add(frameToNode);
                    }
                }
                UpdateDomainNodes();
                Nodes = _nodeCollection;
                viewModelGraph.DrawAllKB(MainFrameContainer);
                OnPropertyChanged();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }