//------------------------------------------------------ /// <summary> /// Ajoute un predecesseur et crée le lien projet /// </summary> /// <param name="element"></param> public CResultAErreur AddPredecesseur(IElementDeGantt element) { CResultAErreur result = CResultAErreur.True; if (!m_listePredecesseurs.Contains(element)) { CElementDeGanttProjet eltThis = this as CElementDeGanttProjet; CElementDeGanttProjet eltPredecesseur = element as CElementDeGanttProjet; if (eltThis != null && eltPredecesseur != null) { CLienDeProjet lien = eltThis.ProjetAssocie.AddPredecessor(eltPredecesseur.ProjetAssocie); if (lien != null) { m_listePredecesseurs.Add(eltPredecesseur); } /*new CLienDeProjet(eltThis.ProjetAssocie.ContexteDonnee); * lien.CreateNewInCurrentContexte(); * lien.ProjetA = eltPredecesseur.ProjetAssocie; * lien.ProjetB = eltThis.ProjetAssocie; * result = lien.ControleCoherenceLien(); * if (!result) * lien.CancelCreate(); * else * m_listePredecesseurs.Add(element); * eltPredecesseur.ProjetAssocie.OptimizeDates(eltPredecesseur.ProjetAssocie.DateDebutGantt);*/ } } return(result); }
//------------------------------------------------------ public void RegroupeBarresEnMulti() { //trouve les idgantt avec plusieurs projets Dictionary <string, List <CElementDeGanttProjet> > dicMultiToProjets = new Dictionary <string, List <CElementDeGanttProjet> >(); foreach (IElementDeGantt elt in ElementsFils.ToArray()) { CElementDeGanttProjet eltPrj = elt as CElementDeGanttProjet; if (eltPrj != null && eltPrj.ProjetAssocie.GanttId.Length > 0) { List <CElementDeGanttProjet> lst = null; if (!dicMultiToProjets.TryGetValue(eltPrj.ProjetAssocie.GanttId, out lst)) { lst = new List <CElementDeGanttProjet>(); dicMultiToProjets[eltPrj.ProjetAssocie.GanttId] = lst; } lst.Add(eltPrj); } } Dictionary <string, CElementDeGanttMulti> dicMultis = new Dictionary <string, CElementDeGanttMulti>(); foreach (List <CElementDeGanttProjet> lstPrjs in dicMultiToProjets.Values) { if (lstPrjs.Count > 1) { foreach (CElementDeGanttProjet eltProjet in lstPrjs) { CElementDeGanttMulti eltMulti = null; if (!dicMultis.TryGetValue(eltProjet.ProjetAssocie.GanttId, out eltMulti)) { eltMulti = new CElementDeGanttMulti(this, eltProjet.Libelle, eltProjet.ProjetAssocie.GanttId); dicMultis[eltProjet.ProjetAssocie.GanttId] = eltMulti; } //Ajoute le fils eltMulti.AddElementDeLaLigne(eltProjet); eltProjet.ElementParent = null; foreach (IElementDeGantt eltFils in eltProjet.ElementsFils.ToArray()) { eltFils.ElementParent = eltMulti; } } } } //Regroupe les barres des fils foreach (IElementDeGantt elt in ElementsFils.ToArray()) { elt.RegroupeBarresEnMulti(); } }
//----------------------------------------------- public void AddChildsTrouvesParmis(Dictionary <int, List <CProjet> > dicIdsToChilds) { List <CProjet> lstFils = null; if (dicIdsToChilds.TryGetValue(ProjetAssocie.Id, out lstFils)) { foreach (CProjet projet in lstFils) { CElementDeGanttProjet eltFils = new CElementDeGanttProjet(this, projet); eltFils.AddChildsTrouvesParmis(dicIdsToChilds); } } }
//------------------------------------------------------ public void RemovePredecesseur(IElementDeGantt element) { //supprime le lien projet CElementDeGanttProjet predecesseur = element as CElementDeGanttProjet; CElementDeGanttProjet thisProjet = this as CElementDeGanttProjet; if (predecesseur != null && thisProjet != null) { //Trouve le lien foreach (CLienDeProjet lien in predecesseur.ProjetAssocie.LiensDeProjetAttaches) { if ((lien.ProjetA == predecesseur.ProjetAssocie && lien.ProjetB == thisProjet.ProjetAssocie) || lien.ProjetB == predecesseur.ProjetAssocie && lien.ProjetA == thisProjet.ProjetAssocie) { if (!lien.Delete(true)) { return; } break; } } } m_listePredecesseurs.Remove(element); }
//-------------------------------------------------------------------------------------- private static CResultAErreur PrepareGantt( CParametreNiveauArbreGanttGroupe groupeRacine, CResultAErreur result, CElementDeGantt elementRacine, List<CProjet> lstProjets, CContexteDonnee contexteDeTravail) { //Isole tous les projets qui n'ont pas leur parent dans la liste des sélectionnés HashSet<int> dicsIds = new HashSet<int>(); foreach (CProjet prj in lstProjets) dicsIds.Add(prj.Id); /*IEnumerable<CProjet> lstSansRacine = from p in lstProjets where p.Row[CProjet.c_champIdParent] == DBNull.Value || !dicsIds.Contains((int)p.Row[CProjet.c_champIdParent]) select p;*/ List<CProjet> lstSansRacine = new List<CProjet>(); foreach (CProjet p in lstProjets) { if (p.Row[CProjet.c_champIdParent] == DBNull.Value || !dicsIds.Contains((int)p.Row[CProjet.c_champIdParent])) lstSansRacine.Add(p); } //Crée tous les éléments projet(avant regroupement) List<CElementDeGanttProjet> lstRacines = new List<CElementDeGanttProjet>(); Dictionary<int, List<CProjet>> dicIdProjetToChild = new Dictionary<int, List<CProjet>>(); foreach (CProjet projetTest in lstProjets) { if (projetTest.Row[CProjet.c_champIdParent] != DBNull.Value) { int nId = (int)projetTest.Row[CProjet.c_champIdParent]; List<CProjet> lstChilds = null; if (!dicIdProjetToChild.TryGetValue(nId, out lstChilds)) { lstChilds = new List<CProjet>(); dicIdProjetToChild[nId] = lstChilds; } lstChilds.Add(projetTest); } } foreach (CProjet prj in lstSansRacine) { CElementDeGanttProjet eltProjet = new CElementDeGanttProjet(elementRacine, prj); eltProjet.AddChildsTrouvesParmis(dicIdProjetToChild); lstRacines.Add(eltProjet); } CParametreNiveauArbreGanttGroupe groupe = groupeRacine; if (groupe != null) groupe.RangeProjets(lstRacines, elementRacine); elementRacine.RegroupeBarresEnMulti(); CBaseGantt baseGantt = new CBaseGantt(elementRacine); result.Data = baseGantt; //Création des liens StringBuilder blIdsProjets = new StringBuilder(); Dictionary<int, CElementDeGantt> dicIdProjetToElements = new Dictionary<int, CElementDeGantt>(baseGantt.GetElements().Count()); HashSet<CLienDeProjet> lstLiensConcernes = new HashSet<CLienDeProjet>(); //IDentifie les relations vers les liens List<DataRelation> lstRelationsToLien = new List<DataRelation>(); foreach (DataRelation rel in contexteDeTravail.Tables[CProjet.c_nomTable].ChildRelations) { if (rel.ChildTable.TableName == CLienDeProjet.c_nomTable) lstRelationsToLien.Add(rel); } foreach ( IElementDeGantt elt in baseGantt.GetElements() ) { foreach (IElementDeGantt eltDraw in elt.ElementsADessinerSurLaLigne) { CElementDeGanttProjet eltPrj = eltDraw as CElementDeGanttProjet; if (eltPrj != null) { int nId = eltPrj.ProjetAssocie.Id; dicIdProjetToElements[nId] = eltPrj; blIdsProjets.Append(nId); blIdsProjets.Append(","); foreach ( DataRelation rel in lstRelationsToLien ) { DataRow[] rows = eltPrj.ProjetAssocie.Row.Row.GetChildRows ( rel ); foreach ( DataRow row in rows ) lstLiensConcernes.Add ( new CLienDeProjet ( row )); } } } } /*CListeObjetsDonnees lstLiensConcernes = new CListeObjetsDonnees(contexteDeTravail, typeof(CLienDeProjet)); if (blIdsProjets.Length > 0) { blIdsProjets.Remove(blIdsProjets.Length - 1, 1); lstLiensConcernes.Filtre = new CFiltreData(CLienDeProjet.c_champPrjA + " in (" + blIdsProjets.ToString() + ") or " + CLienDeProjet.c_champPrjB + " in (" + blIdsProjets.ToString() + ")"); } else lstLiensConcernes.Filtre = new CFiltreDataImpossible(); lstLiensConcernes.InterditLectureInDB = true; lstLiensConcernes.AssureLectureFaite();*/ foreach (CLienDeProjet lien in lstLiensConcernes) { CElementDeGantt eltPredecesseur = null; CElementDeGantt eltSuccesseur = null; if (dicIdProjetToElements.TryGetValue(lien.ProjetA.Id, out eltPredecesseur) && dicIdProjetToElements.TryGetValue(lien.ProjetB.Id, out eltSuccesseur)) { eltSuccesseur.AddPredecesseurSansCreation(eltPredecesseur); } } try { elementRacine.RecalculAvancement(); } catch (Exception e) { } return result; }
// ///////////////////////////////////////////////////////// /// <summary> /// Le data du result contient un IBaseGantt /// </summary> /// <returns></returns> public static CResultAErreur CreateGantt ( CProjet projet, CParametreNiveauArbreGanttGroupe groupeRacine, CFiltreData filtreElements ) { CResultAErreur result = CResultAErreur.True; if (projet == null) return result; CElementDeGanttProjet elementRacine = new CElementDeGanttProjet(null, projet); if (!result) return result; List<CProjet> lstProjets = new List<CProjet>(); if (!projet.IsNew())//Si le projet est nouveau, on ne peut pas filtrer //car les éléments ne sont pas encore en base { CFiltreData filtre = result.Data as CFiltreData; filtre = CFiltreData.GetAndFiltre(filtreElements, new CFiltreData(CProjet.c_champCodeSystemeComplet + " like @1 and " + CProjet.c_champId + "<>@2", projet.CodeSystemeComplet + "%", projet.Id)); CListeObjetsDonnees lstObjetProjets = new CListeObjetsDonnees(projet.ContexteDonnee, typeof(CProjet), filtre); lstObjetProjets.PreserveChanges = true; lstObjetProjets.ModeSansTri = true; lstProjets.AddRange(lstObjetProjets.ToList<CProjet>()); lstObjetProjets.ReadDependances("ProjetsFils","LiensEnTantQueProjetA", "LiensEnTantQueProjetB", "ContraintesPropres", "AnomaliesDuProjet"); CUtilElementAChamps.ReadChampsCustom(lstObjetProjets); } //Il faut ajouter les projets qui ne sont pas encore en base et qui n'ont donc pas de code system List<CProjet> lstALire = new List<CProjet>(); lstALire.Add(projet); DataRelation relation = null; foreach ( DataRelation rel in projet.ContexteDonnee.Tables[CProjet.c_nomTable].ChildRelations ) { if ( rel.ChildTable.TableName == CProjet.c_nomTable ) { relation = rel; break; } } while (lstALire.Count > 0 && relation != null) { List<CProjet> prochaineGeneration = new List<CProjet>(); foreach (CProjet test in lstALire) { DataRow[] rowsDeps = test.Row.Row.GetChildRows(relation); foreach (DataRow row in rowsDeps) { if (row.RowState != DataRowState.Deleted) { CProjet prj = new CProjet(row); if (prj.IsNew() && !lstProjets.Contains(prj) ) { lstProjets.Add(prj); } prochaineGeneration.Add(prj); } } } lstALire = prochaineGeneration; } //Comme on est passé par un filtre Avancé, les nouveaux éléments ne sont //pas dans la liste. On les ajoute donc ! //Vérifie qu'il y a des éléments dont l'id est négatif CListeObjetsDonnees lstTmp = new CListeObjetsDonnees(projet.ContexteDonnee, typeof(CProjet)); lstTmp.Filtre = new CFiltreData(CProjet.c_champId + "<@1", 0); lstTmp.InterditLectureInDB = true; if (lstTmp.Count > 0)//Il y a des projets tous neufs dans le contexte { foreach (CProjet projetTmp in new ArrayList(lstProjets)) { //N'utilise pas ProjetsFils pour ne pas lire dans la base CListeObjetsDonnees lstFils = new CListeObjetsDonnees(projet.ContexteDonnee, typeof(CProjet), new CFiltreData(CProjet.c_champIdParent + "=@1", projetTmp.Id)); lstFils.InterditLectureInDB = true; lstFils.Filtre = new CFiltreData(CProjet.c_champId + "<0"); foreach (CProjet projetFils in lstFils) if (!lstProjets.Contains(projetFils)) lstProjets.Add(projetFils); } //Les nouveaux sous projet du projet principal doivent également être ajoutés CListeObjetsDonnees lstFilsPrincipal = projet.ProjetsFils; lstFilsPrincipal.Filtre = new CFiltreData(CProjet.c_champId + "<0"); foreach (CProjet projetFils in lstFilsPrincipal) if (!lstProjets.Contains(projetFils)) lstProjets.Add(projetFils); } CContexteDonnee contexteDeTravail = projet.ContexteDonnee; return PrepareGantt(groupeRacine,result, elementRacine, lstProjets, contexteDeTravail); }