//---------------------------------------------------------------
        public virtual void IncrementeNiveau(CCustomizableListItemANiveau item)
        {
            if (item == null || LockEdition)
            {
                return;
            }
            int nIndex     = item.Index;
            int nOldNiveau = item.Niveau;

            if (nIndex > 0)
            {
                List <CCustomizableListItemANiveau> lstSuivants = GetItemsDependants(item);
                CCustomizableListItemANiveau        itemPrec    = GetPrecedentPourNiveau(nIndex, nOldNiveau);
                if (itemPrec != null && !itemPrec.IsCollapse)
                {
                    RefreshItem(GetParent(item));
                    item.ItemParent = itemPrec;
                    RefreshItem(item);
                    if (itemPrec != null)
                    {
                        RefreshItem(itemPrec);
                    }
                    foreach (CCustomizableListItemANiveau itemSuivant in lstSuivants)
                    {
                        RefreshItem(itemSuivant);
                    }
                }
            }
        }
 //---------------------------------------------------------------
 public virtual CCustomizableListItemANiveau GetParent(CCustomizableListItemANiveau item)
 {
     if (item.Niveau == 0)
     {
         return(null);
     }
     return(GetPrecedentPourNiveau(item.Index, item.Niveau - 1));
 }
 public CCustomizableListItemANiveau(CCustomizableListItemANiveau itemParentInitial)
 {
     m_itemParent = itemParentInitial;
     if (m_itemParent != null)
     {
         m_itemParent.m_childsItems.Add(this);
     }
 }
 //---------------------------------------------------------------
 protected virtual CCustomizableListItemANiveau GetPrecedentPourNiveau(int nIndex, int nNiveauSouhaité)
 {
     if (nIndex > 0)
     {
         CCustomizableListItemANiveau itemPrec = null;
         //Trouve l'item précédent qui a le niveau inférieur
         for (int nPrec = nIndex - 1; nPrec >= 0; nPrec--)
         {
             itemPrec = Items.ElementAt(nPrec) as CCustomizableListItemANiveau;
             if (itemPrec.Niveau <= nNiveauSouhaité)
             {
                 return(itemPrec);
             }
         }
     }
     return(null);
 }
        //---------------------------------------------------------------
        public virtual void DecrementeNiveau(CCustomizableListItemANiveau item)
        {
            if (item == null || LockEdition)
            {
                return;
            }
            int nIndex     = item.Index;
            int nOldNiveau = item.Niveau;
            //On ne peut pas décaller s'il y a un frère derrière, sinon, ça changerait les parentées
            bool bHasFrereApres = false;

            for (int nSuite = nIndex + 1; nSuite < Items.Count(); nSuite++)
            {
                CCustomizableListItemANiveau suite = Items[nSuite] as CCustomizableListItemANiveau;
                if (suite.Niveau == nOldNiveau)
                {
                    bHasFrereApres = true;
                    break;
                }
                if (suite.Niveau < nOldNiveau)
                {
                    break;//Pas de frère après;
                }
            }
            if (nOldNiveau > 0 && !bHasFrereApres)
            {
                List <CCustomizableListItemANiveau> lstSuivants = GetItemsDependants(item);
                CCustomizableListItemANiveau        itemPrec    = GetPrecedentPourNiveau(nIndex, nOldNiveau - 2);
                if (itemPrec != null || nOldNiveau - 1 <= 0)
                {
                    RefreshItem(GetParent(item));
                    item.ItemParent = itemPrec;
                    RefreshItem(item);
                    if (itemPrec != null)
                    {
                        RefreshItem(itemPrec);
                    }
                    foreach (CCustomizableListItemANiveau itemSuivant in lstSuivants)
                    {
                        RefreshItem(itemSuivant);
                    }
                }
            }
        }
        //---------------------------------------------------------------
        protected virtual List <CCustomizableListItemANiveau> GetItemsDependants(CCustomizableListItemANiveau item)
        {
            int nNiveau = item.Niveau;
            List <CCustomizableListItemANiveau> items = new List <CCustomizableListItemANiveau>();

            for (int nIndex = item.Index + 1; nIndex < Items.Count(); nIndex++)
            {
                CCustomizableListItemANiveau itN = Items[nIndex] as CCustomizableListItemANiveau;
                if (itN != null && itN.Niveau > nNiveau)
                {
                    items.Add(itN);
                }
                else
                {
                    break;
                }
            }
            return(items);
        }
        //---------------------------------------------------------------
        protected override void MoveItem(int nIndexSource, int nIndexDest, bool bCursorIsAvantIndex)
        {
            //Si glisse sous un truc collapse, considère qu'on glisse sous le dernier
            //du collapse
            if (nIndexDest - 1 >= 0)
            {
                CCustomizableListItemANiveau itemSel = Items[nIndexDest - 1] as CCustomizableListItemANiveau;
                if (itemSel != null &&
                    itemSel.IsCollapse && !itemSel.IsMasque)
                {
                    //Va chercher la dernière de ses dépendances
                    List <CCustomizableListItemANiveau> deps = GetItemsDependants(itemSel);
                    if (deps.Count > 0)
                    {
                        nIndexDest = deps[deps.Count - 1].Index;
                    }
                }
            }


            //Trouve tous les items qui sont fils de celui-ci
            CCustomizableListItemANiveau        item      = Items[nIndexSource] as CCustomizableListItemANiveau;
            CCustomizableListItemANiveau        oldParent = GetParent(item);
            List <CCustomizableListItemANiveau> toMove    = GetItemsDependants(item);

            toMove.Insert(0, item);
            int nFirst = toMove[0].Index;
            int nLast  = toMove[toMove.Count() - 1].Index;

            if (nIndexDest >= nFirst && nIndexDest <= nLast)
            {
                return;
            }
            if (nIndexDest > nIndexSource)
            {
                foreach (CCustomizableListItemANiveau itemToMove in toMove)
                {
                    int nIndex = itemToMove.Index;
                    InsertItem(nIndexDest, itemToMove, false);
                    base.RemoveItem(nIndex, false);
                }
            }
            else
            {
                foreach (CCustomizableListItemANiveau itemToMove in toMove)
                {
                    int nIndex = itemToMove.Index;
                    base.RemoveItem(nIndex, false);
                    InsertItem(nIndexDest, itemToMove, false);
                    nIndexDest++;
                }
            }
            RenumerotteItems();
            //Décalle le premier là où il faut
            item = toMove[0] as CCustomizableListItemANiveau;

            CCustomizableListItemANiveau itemAvant = GetVisibleItemBefore(item.Index) as CCustomizableListItemANiveau;
            CCustomizableListItemANiveau itemApres = GetVisibleItemAfter(item.Index) as CCustomizableListItemANiveau;

            while (itemApres != null && toMove.Contains(itemApres))
            {
                itemApres = GetVisibleItemAfter(itemApres.Index) as CCustomizableListItemANiveau;
            }

            int nNiveauItem  = item.Niveau;
            int?nNiveauAvant = itemAvant != null ? (int?)itemAvant.Niveau : null;
            int?nNiveauApres = itemApres != null ? (int?)itemApres.Niveau : null;

            int?nNiveauDest = null;

            if (nNiveauAvant != null)
            {
                if (nNiveauApres != null)
                {
                    if (nNiveauApres >= nNiveauAvant)
                    {
                        nNiveauDest = nNiveauApres.Value;
                    }
                }
                if (nNiveauDest == null)
                {
                    //Si on est sous le même parent
                    CCustomizableListItemANiveau itemParentDeNiveau = null;
                    if (nNiveauItem > 0)
                    {
                        itemParentDeNiveau = GetPrecedentPourNiveau(item.Index, nNiveauItem - 1);
                        if (itemParentDeNiveau != null &&
                            itemParentDeNiveau.Equals(oldParent))
                        {
                            nNiveauDest = nNiveauItem;
                        }
                    }
                    if (nNiveauDest == null && nNiveauApres != null)
                    {
                        nNiveauDest = nNiveauApres;
                    }
                }
            }
            if (item.Index == 0 || nNiveauDest == null)
            {
                nNiveauDest = 0;
            }
            CCustomizableListItemANiveau itemParent = GetPrecedentPourNiveau(item.Index, nNiveauDest.Value - 1);

            if (itemParent != null || nNiveauDest == 0)
            {
                if (itemParent != null)
                {
                    RefreshItem(itemParent);
                }
                RefreshItem(oldParent);
                toMove[0].ItemParent = itemParent;
                foreach (CCustomizableListItemANiveau itemtoRefresh in toMove)
                {
                    RefreshItem(itemtoRefresh);
                }
            }

            Refresh();
        }
 //Retourne true si le setParent a fonctionné
 public abstract bool OnChangeParent(CCustomizableListItemANiveau item);