/// <summary>
        /// Adds the item as child of the specified parent, at the specified position.
        ///
        /// After the addition, the \a parent's node will contain \a item as child
        /// at the \a position.
        /// </summary>
        /// <param name="newItem"></param>
        /// <param name="parentIndex"></param>
        /// <param name="position"></param>
        public virtual void AddItemAtPosition(GenericItem newItem, ModelIndex parentIndex, int position)
        {
            NotifyChildrenWillBeAdded(parentIndex, position, 1);

            var parent = (GenericItem)parentIndex.d_modelData;

            if (position > parent.GetChildren().Count)
            {
                throw new InvalidRequestException("The specified position is out of range.");
            }

            newItem.SetParent(parent);
            parent.GetChildren().Insert(position, newItem);

            NotifyChildrenAdded(parentIndex, position, 1);
        }
        /// <summary>
        /// Gets the ordinal id (index) of the specified item in parent's children list.
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public virtual int GetChildId(GenericItem item)
        {
            if (item == null || item.GetParent() == null)
            {
                return(-1);
            }

            var parentItem = item.GetParent();

            return(parentItem.GetChildren().IndexOf(item));
            //std::vector<GenericItem*>::iterator itor = std::find(
            //    parent_item->getChildren().begin(), parent_item->getChildren().end(), item);

            //if (itor == parent_item->getChildren().end())
            //    return -1;

            //return std::distance(parent_item->getChildren().begin(), itor);
        }
        /// <summary>
        /// Deletes all children of the specified item, optionally invoking the
        /// EventChildren(WillBe)Removed event
        /// </summary>
        /// <param name="item"></param>
        /// <param name="notify"></param>
        protected void DeleteChildren(GenericItem item, bool notify)
        {
            if (item == null)
            {
                throw new InvalidRequestException("Cannot delete children of a NULL item!");
            }

            var itemsCount = item.GetChildren().Count;

            //std::vector<GenericItem*>::iterator itor = item->getChildren().begin();

            if (notify)
            {
                NotifyChildrenWillBeRemoved(new ModelIndex(item), 0, itemsCount);
            }

            while (item.GetChildren().Count != 0)
            {
                var itor = item.GetChildren()[0];
                DeleteChildren(itor, notify);
                // TODO: delete *itor;
                item.GetChildren().Remove(itor);
            }

            //while (itor != item->getChildren().end())
            //{
            //    DeleteChildren(*itor, notify);
            //    // TODO: delete *itor;
            //    itor = item->getChildren().erase(itor);
            //}

            if (notify)
            {
                NotifyChildrenRemoved(new ModelIndex(item), 0, itemsCount);
            }
        }
 /// <summary>
 /// Adds the item as child of the root at the specified position.
 /// </summary>
 /// <param name="item"></param>
 /// <param name="pos"></param>
 public virtual void AddItemAtPosition(GenericItem item, int pos)
 {
     AddItemAtPosition(item, GetRootIndex(), pos);
 }