////////////////////////////////////////////////////////////////////////
        public object Clone()
        {
            CFiltreSynchronisation filtreCopie = new CFiltreSynchronisation();

            C2iSerializer.CloneTo(this, filtreCopie);
            return(filtreCopie);
        }
        ////////////////////////////////////////////////////////////////////////
        private void CreateFiltreForAllParents(Hashtable tableRelationsFaites)
        {
            CStructureTable structure = CStructureTable.GetStructure(CContexteDonnee.GetTypeForTable(NomTable));

            foreach (CInfoRelation relationParente in structure.RelationsParentes)
            {
                if (tableRelationsFaites[relationParente.RelationKey] == null)
                {
                    tableRelationsFaites[relationParente.RelationKey] = true;
                    CFiltreSynchronisation filtreFils = GetFilsForRelation(relationParente);
                    if (filtreFils == null)
                    {
                        filtreFils = new CFiltreSynchronisation(relationParente.TableParente);
                        filtreFils.m_bIsAutoAdd             = true;
                        filtreFils.IsLienToFullTableParente = TouteLaTable;
                        AddFils(filtreFils, relationParente);
                    }
                    filtreFils.CreateFiltreForAllParents((Hashtable)tableRelationsFaites.Clone());
                }
            }
            foreach (CFiltreSynchronisation filtreFils in m_listeFils)
            {
                if (tableRelationsFaites[filtreFils.RelationToParent.RelationKey] == null)
                {
                    tableRelationsFaites[filtreFils.RelationToParent.RelationKey] = true;
                    if (filtreFils.NomTable == filtreFils.RelationToParent.TableFille)
                    {
                        filtreFils.CreateFiltreForAllParents((Hashtable)tableRelationsFaites.Clone());
                    }
                }
            }
        }
        ////////////////////////////////////////////////////////////////////////
        public CFiltresDynamiquesForTables CalculeFiltresForTables()
        {
            CFiltresDynamiquesForTables filtres = new CFiltresDynamiquesForTables();

            //Crée un filtre pour chaque les tables fullsnchro
            foreach (string strNomTable in CContexteDonnee.MappeurTableToClass.GetListeTables())
            {
                Type tp = CContexteDonnee.GetTypeForTable(strNomTable);
                if (tp != null && tp.GetCustomAttributes(typeof(FullTableSyncAttribute), true).Length > 0)
                {
                    CFiltreSynchronisation filtreTableFull = new CFiltreSynchronisation(strNomTable);
                    filtreTableFull.TouteLaTable = true;
                    filtreTableFull.IsAutoAdd    = true;
                    filtreTableFull.CreateFiltreForAllParents();
                    filtreTableFull.CreateFiltreForAllCompositions();
                    filtreTableFull.FiltreDynamique = CFiltreSynchronisation.GetFiltreDynamiqueSynchro(tp);
                    filtres.AddFiltreSynchronisation(filtreTableFull);
                }
            }



            foreach (CFiltreSynchronisation filtre in m_listefiltresSynchronisation)
            {
                filtre.CalculeFiltresForTables();
                filtres.AddFiltreSynchronisation(filtre);
            }
            return(filtres);
        }
 ////////////////////////////////////////////////////////////////////////
 public void CopySansFilsTo(CFiltreSynchronisation filtre)
 {
     filtre.m_strNomTable = m_strNomTable;
     if (m_filtreDynamique != null)
     {
         filtre.m_filtreDynamique = (CFiltreDynamique)m_filtreDynamique.Clone();
     }
     filtre.m_relationToParent = m_relationToParent;
     filtre.m_bTouteLaTable    = m_bTouteLaTable;
     filtre.m_bIsAutoAdd       = m_bIsAutoAdd;
 }
        ////////////////////////////////////////////////////////////////////////
        public CFiltreDynamique GetFiltreDynamiqueForTable(string strNomTable, ref bool bShouldSynchroniseTable)
        {
            ArrayList lst = (ArrayList)m_tableTableToFiltreSynchronisation[strNomTable];
            Type      tp  = CContexteDonnee.GetTypeForTable(strNomTable);

            if (tp != null && tp.GetCustomAttributes(typeof(FullTableSyncAttribute), true).Length > 0)
            {
                bShouldSynchroniseTable = true;
                return(null);
            }
            if (lst == null || lst.Count == 0)
            {
                bShouldSynchroniseTable = false;
                return(null);
            }
            bShouldSynchroniseTable = true;
            CFiltreDynamique filtreDynamique = CFiltreSynchronisation.GetFiltreDynamiqueSynchro(CContexteDonnee.GetTypeForTable(strNomTable));

            CComposantFiltreDynamiqueOu composantOu = new CComposantFiltreDynamiqueOu();

            foreach (CFiltreSynchronisation filtreSynchro in lst)
            {
                if (filtreSynchro.TouteLaTable || filtreSynchro.FiltreDynamique == null)
                {
                    return(null);
                }
                CFiltreDynamique filtreLocal = filtreSynchro.GetFiltreToElementPrincipal();
                if (filtreLocal != null && filtreLocal.ComposantPrincipal != null)
                {
                    composantOu.AddComposantFils(filtreLocal.ComposantPrincipal);
                }
                if (filtreLocal == null)
                {
                    return(null);
                }
            }
            if (composantOu.GetNbComposantsFils() == 0)
            {
                return(null);
            }
            if (composantOu.GetNbComposantsFils() == 1)
            {
                filtreDynamique.ComposantPrincipal = composantOu.ComposantsFils[0];
            }
            else
            {
                filtreDynamique.ComposantPrincipal = composantOu;
            }
            return(filtreDynamique);
        }
        ////////////////////////////////////////////////////////////////////////
        private void PrivateAddFiltre(CFiltreSynchronisation filtre)
        {
            ArrayList lst = (ArrayList)m_tableTableToFiltreSynchronisation[filtre.NomTable];

            if (lst == null)
            {
                lst = new ArrayList();
                m_tableTableToFiltreSynchronisation[filtre.NomTable] = lst;
            }
            CInfoRelation relation = filtre.RelationToParent;

            if (relation != null)
            {
                //Regarde s'il y a un filtre sur la table complète avant d'aller plus loin !
                foreach (CFiltreSynchronisation filtreExistant in lst)
                {
                    if (filtreExistant.IsLienToFullTableParente &&
                        filtreExistant.RelationToParent.Equals(relation))
                    {
                        //Il y a un filtre sur toute la table liée, on n'ajoute pas celui-ci
                        return;
                    }
                }
                if (filtre.IsLienToFullTableParente)
                {
                    //Supprime tous les autres filtres pour la même relation
                    //puisqu'on ajoute un filtre sur toute la table liée
                    for (int nFiltre = lst.Count - 1; nFiltre >= 0; nFiltre--)
                    {
                        CFiltreSynchronisation filtreExistant = (CFiltreSynchronisation)lst[nFiltre];
                        if (relation.Equals(filtreExistant.RelationToParent))
                        {
                            lst.RemoveAt(nFiltre);
                        }
                    }
                }
            }
            lst.Add(filtre);
            foreach (CFiltreSynchronisation filtreFils in filtre.FiltresFils)
            {
                PrivateAddFiltre(filtreFils);
            }
        }
 ////////////////////////////////////////////////////////////////////////
 protected void DefinitParent(CFiltreSynchronisation filtre, CInfoRelation relationToParent)
 {
     m_filtreParent     = filtre;
     m_relationToParent = relationToParent;
 }
 ////////////////////////////////////////////////////////////////////////
 public void AddFils(CFiltreSynchronisation filtreFils, CInfoRelation relationToParent)
 {
     m_listeFils.Add(filtreFils);
     filtreFils.DefinitParent(this, relationToParent);
 }
 ////////////////////////////////////////////////////////////////////////
 public void AddFiltreSynchronisation(CFiltreSynchronisation filtreSynchro)
 {
     PrivateAddFiltre(filtreSynchro);
 }
 ////////////////////////////////////////////////////////////////////////
 public void RemoveFiltre(CFiltreSynchronisation filtre)
 {
     m_listefiltresSynchronisation.Remove(filtre);
 }
 ////////////////////////////////////////////////////////////////////////
 public void AddFiltre(CFiltreSynchronisation filtre)
 {
     m_listefiltresSynchronisation.Add(filtre);
 }