//---------------------------------------------------
        public void InsertBefore(int nIndex)
        {
            if (!CanAddNew())
            {
                return;
            }
            if (nIndex >= m_listeControlsUtiles.Count - 1)
            {
                return;
            }
            CControlePrevisionOperation ctrl = GetControle(nIndex);

            if (ctrl.TypeOperation == null)
            {
                return;
            }
            int nNiveau = ctrl.TypeOperation.Niveau;

            m_panelControles.SuspendDrawing();
            ctrl = GetNewControle(nIndex);
            ctrl.InitControle(null, nIndex, nNiveau, false);
            ReordonneeTout();
            m_panelControles.ResumeDrawing();
            m_panelControles.Visible = false;
            m_panelControles.Visible = true;
            ctrl.Focus();
        }
        public void Init(IElementAOperationPrevisionnelle element)
        {
            Visible = false;
            m_panelControles.SuspendDrawing();
            m_elementEdite = element;
            foreach (Control ctrl in m_listeControlsUtiles)
            {
                ctrl.Visible = false;
                ((CControlePrevisionOperation)ctrl).Operation = null;
            }

            m_listeControlesReserve.AddRange(m_listeControlsUtiles);
            m_listeControlsUtiles.Clear();
            CListeObjetsDonnees liste = m_elementEdite.Operations;

            liste.Filtre = new CFiltreData(COperation.c_champIdOpParente + " is null");
            int nIndex = 0;

            foreach (COperation donnee in liste)
            {
                AddOperation(donnee, ref nIndex, false);
            }
            if (m_listeControlsUtiles.Count == 0 && m_gestionnaireModeEdition.ModeEdition)
            {
                CControlePrevisionOperation ctrl = GetNewControle(0);
                ctrl.InitControle(null, 0, 0, true);
            }
            ReordonneeTout();

            RecalcSize();

            m_panelControles.ResumeDrawing();
            Visible = true;
        }
 public bool GoUp(int nIndex, string strNomControle)
 {
     if (nIndex - 1 >= 0)
     {
         CControlePrevisionOperation ctrl = GetControle(nIndex - 1);
         return(ctrl.FocusOn(strNomControle));
     }
     return(false);
 }
 public bool GoDown(int nIndex, string strNomControle)
 {
     if (nIndex + 1 < m_listeControlsUtiles.Count)
     {
         CControlePrevisionOperation ctrl = GetControle(nIndex + 1);
         return(ctrl.FocusOn(strNomControle));
     }
     return(false);
 }
 //-----------------------------------------
 /// <summary>
 /// Retourne le type de donnée correspondant au niveau demandé pour l'index de controle demandé
 /// </summary>
 /// <param name="nNiveau"></param>
 /// <param name="nIndexControle"></param>
 public CTypeOperation GetTypeDonneeNiveau(int nNiveau, int nIndexControle)
 {
     for (int nCtrl = nIndexControle - 1; nCtrl >= 0; nCtrl--)
     {
         if (nCtrl < m_listeControlsUtiles.Count - 1)
         {
             CControlePrevisionOperation ctrl = (CControlePrevisionOperation)m_listeControlsUtiles[nCtrl];
             CTypeOperation tdq = ctrl.TypeOperation;
             if (tdq != null && tdq.Niveau == nNiveau)
             {
                 return(tdq);
             }
         }
     }
     return(null);
 }
        //----------------------------------------------------------
        public bool CanChangeNiveau(int nIndex, int nNiveauDemande)
        {
            if (nNiveauDemande < 0)
            {
                return(false);
            }


            CControlePrevisionOperation ctrlPrecedent = null,
                                        ctrlSuivant   = null;

            if (nIndex == 0)
            {
                return(false);
            }

            ctrlPrecedent = (CControlePrevisionOperation)m_listeControlsUtiles[nIndex - 1];

            /*if (ctrlPrecedent != null && ctrlPrecedent.TypeOperation != null &&
             *      ctrlPrecedent.TypeOperation.TypesOperationsFilles.Count == 0)
             *      return false;*/

            if (nIndex < m_listeControlsUtiles.Count - 1)
            {
                ctrlSuivant = (CControlePrevisionOperation)m_listeControlsUtiles[nIndex + 1];
            }

            bool bOkPourPrecedent = nNiveauDemande <= ctrlPrecedent.TypeOperation.Niveau + 1;

            //Dernier contrôle ?
            if (nIndex >= m_listeControlsUtiles.Count - 1)
            {
                return(bOkPourPrecedent);
            }

            //Regarde le niveau du controle suivant
            if (ctrlSuivant.TypeOperation == null)
            {
                return(bOkPourPrecedent);
            }
            if (ctrlSuivant.TypeOperation.Niveau <= nNiveauDemande)              //fils de celui qui veut changer
            {
                return(bOkPourPrecedent);
            }

            return(false);
        }
        //------------------------------------------------------------------------------------------
        public CControlePrevisionOperation GetControleNiveauParent(CControlePrevisionOperation controleFils)
        {
            CControlePrevisionOperation ctrlParent = null;

            foreach (CControlePrevisionOperation ctrl in m_listeControlsUtiles)
            {
                if (ctrl.Niveau == controleFils.Niveau - 1)
                {
                    ctrlParent = ctrl;
                }
                if (ctrl == controleFils)
                {
                    return(ctrlParent);
                }
            }
            return(null);
        }
        //------------------------------------------------------------------------------------
        private void AddOperation(COperation operation, ref int nIndex, bool bRecalcSize)
        {
            bool bEntete = m_panelControles.Controls.Count == 0;
            CControlePrevisionOperation ctrl = GetNewControle(nIndex);

            ctrl.Visible = true;
            ctrl.InitControle(operation, nIndex, operation.TypeOperation.Niveau, bEntete);
            nIndex++;
            foreach (COperation operationFille in operation.OperationsFilles)
            {
                AddOperation(operationFille, ref nIndex, false);
            }
            if (bRecalcSize)
            {
                RecalcSize();
            }
        }
        //-----------------------------------------
        private CControlePrevisionOperation GetNewControle(int nIndex)
        {
            CControlePrevisionOperation ctrl = null;

            if (m_listeControlesReserve.Count == 0)
            {
                ctrl = new CControlePrevisionOperation(this);
            }
            else
            {
                ctrl           = (CControlePrevisionOperation)m_listeControlesReserve[0];
                ctrl.Operation = null;
            }

            ctrl.Parent   = m_panelControles;
            ctrl.Visible  = true;
            ctrl.Dock     = DockStyle.Top;
            ctrl.TabIndex = nIndex;
            m_listeControlesReserve.Remove(ctrl);
            if (nIndex < m_listeControlsUtiles.Count)
            {
                m_listeControlsUtiles.Insert(nIndex, ctrl);
            }
            else
            {
                m_listeControlsUtiles.Add(ctrl);
            }
            //Décale tous les controles suivants
            for (int nCtrl = nIndex + 1; nCtrl < m_listeControlsUtiles.Count; nCtrl++)
            {
                CControlePrevisionOperation ctrlApres = (CControlePrevisionOperation)m_listeControlsUtiles[nCtrl];
                ctrlApres.Index = nCtrl;
            }
            ReordonneeTout();
            ctrl.LockEdition = !m_gestionnaireModeEdition.ModeEdition;
            ctrl.BackColor   = m_panelControles.BackColor;

            ctrl.SizeChanged += new EventHandler(ctrlOperation_SizeChanged);

            return(ctrl);
        }
        //Appelé lorsqu'un élément change de type de donnée
        public void OnChangeTypeDonnee(int nIndex, CTypeOperation typeDonnee)
        {
            if (nIndex > m_listeControlsUtiles.Count - 1)
            {
                return;
            }
            CControlePrevisionOperation ctrl = (CControlePrevisionOperation)m_listeControlsUtiles[nIndex];
            int nNiveau = ctrl.Niveau;

            nIndex++;
            while (nIndex < m_listeControlsUtiles.Count)
            {
                CControlePrevisionOperation ctrlSuivant = (CControlePrevisionOperation)m_listeControlsUtiles[nIndex];
                if (ctrlSuivant.Niveau <= nNiveau)
                {
                    return;
                }
                if (ctrlSuivant.Niveau == nNiveau + 1)
                {
                    ctrlSuivant.OnChangeTypeParent(typeDonnee);
                }
                nIndex++;
            }
        }
        //---------------------------------------------------
        public void InsertAfter(int nIndex)
        {
            if (!CanAddNew())
            {
                return;
            }
            CControlePrevisionOperation ctrl = GetControle(nIndex);

            if (ctrl.TypeOperation == null)
            {
                return;
            }
            int nNiveau = ctrl.TypeOperation.Niveau;

            m_panelControles.SuspendDrawing();
            ctrl = GetNewControle(nIndex + 1);
            ctrl.InitControle(null, nIndex + 1, nNiveau, false);
            ReordonneeTout();
            m_panelControles.ResumeDrawing();
            m_panelControles.Visible = false;
            m_panelControles.Visible = true;
            ctrl.Focus();
            RecalcSize();
        }
        //---------------------------------------------------
        public bool RemoveDonnee(CControlePrevisionOperation controle)
        {
            CResultAErreur result = CResultAErreur.True;

            if (controle.Operation != null)
            {
                result = controle.Operation.CanDelete();
                if (!result)
                {
                    CFormAlerte.Afficher(result.Erreur);
                    return(false);
                }
            }
            int nNiveau = controle.Niveau;
            int nIndex  = controle.Index;

            CControlePrevisionOperation ctrlSuivant = null;

            if (nIndex + 1 < m_listeControlsUtiles.Count)
            {
                ctrlSuivant = (CControlePrevisionOperation)m_listeControlsUtiles[nIndex + 1];
            }
            while (ctrlSuivant != null && ctrlSuivant.Niveau > nNiveau)
            {
                if (!RemoveDonnee(ctrlSuivant))
                {
                    return(false);
                }
                if (nIndex + 1 < m_listeControlsUtiles.Count)
                {
                    ctrlSuivant = (CControlePrevisionOperation)m_listeControlsUtiles[nIndex + 1];
                }
                else
                {
                    ctrlSuivant = null;
                }
            }
            if (controle.Operation != null)
            {
                result = controle.Operation.Delete();
                if (!result)
                {
                    return(false);
                }
            }

            m_listeControlsUtiles.Remove(controle);
            m_listeControlesReserve.Add(controle);
            nIndex = controle.Index;
            for (int nChange = nIndex; nChange < m_listeControlsUtiles.Count; nChange++)
            {
                ((CControlePrevisionOperation)m_listeControlsUtiles[nChange]).Index = nIndex;
                nIndex++;
            }

            controle.Operation = null;
            controle.Hide();

            //s'il n'y a plus de contrôle, il faut en ajouter 1 !!!
            if (m_listeControlsUtiles.Count == 0 && m_gestionnaireModeEdition.ModeEdition)
            {
                CControlePrevisionOperation ctrl = GetNewControle(0);
                ctrl.InitControle(null, 0, 0, true);
            }
            RecalcSize();

            return(true);
        }