Example #1
0
        //-----------------------------------------------------
        private CSegmentDroite DrawLien(
            Graphics g,
            ISatisfactionBesoin besoinSatisfait,
            ISatisfactionBesoin satisfaction,
            Pen p)
        {
            if (besoinSatisfait == null || satisfaction == null)
            {
                return(null);
            }
            CInfoDessinSatisfaction dessin1 = null;
            CInfoDessinSatisfaction dessin2 = null;

            m_dicSatisfactionToRect.TryGetValue(besoinSatisfait, out dessin1);
            m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin2);
            CSegmentDroite segment = null;

            if (dessin1 != null && dessin2 != null)
            {
                segment = new CSegmentDroite(new Point(dessin1.Rectangle.Right, dessin1.Rectangle.Top + m_nHauteurSatisfactionDefaut / 2),
                                             new Point(dessin2.Rectangle.Left, dessin2.Rectangle.Top + m_nHauteurSatisfactionDefaut / 2));
                g.DrawLine(p, segment.Point1, segment.Point2);
                segment.DrawFlechePt1(g, p, 4);
            }
            return(segment);
        }
Example #2
0
        //------------------------------------------------------
        private void CalculeEnglobants(CNiveau niveau)
        {
            int nIndex    = 0;
            int nMaxWidth = 0;

            while (nIndex < niveau.Satisfactions.Count())
            {
                Rectangle rct = CalculeEnglobants(niveau, ref nIndex, 0);
                nMaxWidth = Math.Max(nMaxWidth, rct.Width);
            }
            int nOffset = nMaxWidth - m_nLargeurNiveauDefaut;

            if (nOffset > 0)
            {
                foreach (CNiveau autreNiveau in m_listeNiveaux)
                {
                    if (autreNiveau.Niveau > niveau.Niveau)
                    {
                        foreach (ISatisfactionBesoin sat in autreNiveau.Satisfactions)
                        {
                            CInfoDessinSatisfaction dessin = null;
                            m_dicSatisfactionToRect.TryGetValue(sat, out dessin);
                            dessin.Offset(nOffset, 0);
                        }
                    }
                }
            }
        }
Example #3
0
        //-----------------------------------------------------
        private ISatisfactionBesoin GetSatisfactionFromDisplay(Point ptDisplay)
        {
            CInfoDessinSatisfaction info = GetInfoFromDisplay(ptDisplay);

            if (info != null)
            {
                return(info.Satisfaction);
            }
            return(null);
        }
Example #4
0
        //------------------------------------------------------
        private Rectangle CalculeEnglobants(CNiveau niveau, ref int nIndexNext, int nIndexHierarchique)
        {
            ISatisfactionBesoin satisfaction = niveau.Satisfactions.ElementAt(nIndexNext);

            CInfoDessinSatisfaction dessin = null;

            m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin);
            Rectangle rctRetour = dessin.Rectangle;

            nIndexNext++;
            HashSet <ISatisfactionBesoin> besoinsFils = new HashSet <ISatisfactionBesoin>();
            int nIndexStartFils = nIndexNext;

            ISatisfactionBesoinAvecSousBesoins satB = satisfaction as ISatisfactionBesoinAvecSousBesoins;

            if (satB != null && m_setSatisfactionsExpanded.Contains(satB))
            {
                foreach (CBesoin besoin in satB.GetSousBesoinsDeSatisfaction())
                {
                    besoinsFils.Add(besoin);
                }
            }
            else if (satisfaction is CBesoin)
            {
                foreach (CBesoin besoin in ((CBesoin)satisfaction).BesoinsFils)
                {
                    besoinsFils.Add(besoin);
                }
            }

            if (besoinsFils.Count > 0)
            {
                while (nIndexNext < niveau.Satisfactions.Count() &&
                       besoinsFils.Contains(niveau.Satisfactions.ElementAt(nIndexNext)))
                {
                    Rectangle rctFils = CalculeEnglobants(niveau, ref nIndexNext, nIndexHierarchique + 1);
                    rctRetour = Rectangle.Union(rctRetour, rctFils);
                }
                for (int nFils = nIndexStartFils; nFils < nIndexNext; nFils++)
                {
                    ISatisfactionBesoin     satFils    = niveau.Satisfactions.ElementAt(nFils);
                    CInfoDessinSatisfaction dessinFils = null;
                    m_dicSatisfactionToRect.TryGetValue(satFils, out dessinFils);
                    dessinFils.Offset(m_nOffestNiveau, 0);
                }
                rctRetour.Width += m_nOffestNiveau;
                dessin.Rectangle = new Rectangle(rctRetour.Left + m_nOffestNiveau / 3, rctRetour.Top, m_nLargeurNiveauDefaut, rctRetour.Height + 4);
            }
            dessin.NiveauHierarchique = nIndexHierarchique;
            return(rctRetour);
        }
Example #5
0
 //-----------------------------------------------------
 private void Invalidate(ISatisfactionBesoin satisfaction)
 {
     if (satisfaction != null)
     {
         CInfoDessinSatisfaction dessin = null;
         m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin);
         if (dessin != null)
         {
             Rectangle r = new Rectangle(PointToDisplay(new Point(dessin.Rectangle.Left - 5, dessin.Rectangle.Top - 5)),
                                         new Size(SizeToDisplay(dessin.Rectangle.Width + 11), SizeToDisplay(dessin.Rectangle.Height + 11)));
             r.Inflate(2, 2);
             m_panelDessin.Invalidate(r);
         }
     }
 }
Example #6
0
        //-----------------------------------------------------
        private CInfoDessinSatisfaction GetInfoFromLogical(Point ptLogique)
        {
            CInfoDessinSatisfaction infoSel = null;

            foreach (KeyValuePair <ISatisfactionBesoin, CInfoDessinSatisfaction> kv in m_dicSatisfactionToRect)
            {
                if (kv.Value != null && kv.Value.Rectangle.Contains(ptLogique))
                {
                    if (infoSel == null || infoSel.Rectangle.Height > kv.Value.Rectangle.Height)
                    {
                        infoSel = kv.Value;
                    }
                }
            }
            return(infoSel);
        }
Example #7
0
        //------------------------------------------------------
        private int CalculeRectangles(ISatisfactionBesoin satisfaction, int nIndexNiveau, int nYTop)
        {
            int  nNextPos     = nYTop;
            bool bMargeOnNext = false;
            List <ISatisfactionBesoin> lstFils = new List <ISatisfactionBesoin>();
            CBesoin besoin = satisfaction as CBesoin;

            if (besoin != null)
            {
                foreach (CRelationBesoin_Satisfaction sat in besoin.RelationsSatisfactions)
                {
                    ISatisfactionBesoin fils = sat.Satisfaction;
                    if (fils != null)
                    {
                        if (m_setSatisfactionsIntegrés.Contains(fils) && !m_dicSatisfactionToRect.ContainsKey(fils))
                        {
                            lstFils.Add(fils);
                        }
                    }
                }
            }
            for (int nFils = 0; nFils < lstFils.Count; nFils++)
            {
                ISatisfactionBesoin fils = lstFils[nFils];
                if (!m_dicSatisfactionToRect.ContainsKey(fils))
                {
                    if (bMargeOnNext)
                    {
                        nNextPos += m_nMargeVerticale;
                    }
                    m_dicSatisfactionToRect[fils] = null;
                    nNextPos     = CalculeRectangles(fils, nIndexNiveau + 1, nNextPos);
                    bMargeOnNext = true;
                }
            }
            int       nHauteurTotale = Math.Max(m_nHauteurSatisfactionDefaut, nNextPos - nYTop);
            int       nX             = GetXIndexNiveau(nIndexNiveau, m_nLargeurNiveauDefaut, m_nLargeurFleches);
            Rectangle rct            = new Rectangle(nX, nYTop + nHauteurTotale / 2 - m_nMargeVerticale,
                                                     m_nLargeurNiveauDefaut,
                                                     m_nHauteurSatisfactionDefaut);

            m_dicSatisfactionToRect[satisfaction] = new CInfoDessinSatisfaction(rct, satisfaction, m_setSatisfactionsExpanded.Contains(satisfaction));
            return(nYTop + nHauteurTotale);
        }
Example #8
0
        //------------------------------------------------------
        public void CenterOn(ISatisfactionBesoin satisfaction)
        {
            CInfoDessinSatisfaction dessin = null;

            if (m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin))
            {
                if (dessin != null)
                {
                    Point ptCentre = new Point(dessin.Rectangle.Left + dessin.Rectangle.Width / 2,
                                               dessin.Rectangle.Top + dessin.Rectangle.Height / 2);
                    ptCentre = PointToDisplay(ptCentre);
                    //Calcule la position des scrollBars pour être centré sur cet élément
                    ptCentre.Offset(-m_panelDessin.Width / 2, -m_panelDessin.Height / 2);

                    m_panelDessin.AutoScrollPosition = new Point(ptCentre.X, ptCentre.Y);
                    Refresh();
                }
            }
        }
Example #9
0
 private void m_panelDessin_MouseMove(object sender, MouseEventArgs e)
 {
     if (e.Button == MouseButtons.Right && m_ptStartScroll != null)
     {
         Point ptEcart = new Point(m_ptStartScroll.Value.X - e.X,
                                   m_ptStartScroll.Value.Y - e.Y);
         Point pt = new Point(-m_panelDessin.AutoScrollPosition.X, -m_panelDessin.AutoScrollPosition.Y);
         pt.Offset(ptEcart);
         m_bHasScroll    = true;
         m_ptStartScroll = new Point(e.X, e.Y);
         m_panelDessin.AutoScrollPosition = pt;
         m_panelDessin.Invalidate();
     }
     if (e.Button == MouseButtons.Left && m_ptStartDrag != null && m_satisfactionSel != null)
     {
         if (Math.Abs(m_ptStartDrag.Value.X - e.X) > 3 ||
             Math.Abs(m_ptStartDrag.Value.Y - e.Y) > 3)
         {
             CObjetDonnee objet = m_satisfactionSel as CObjetDonnee;
             if (objet != null)
             {
                 DoDragDrop(new CReferenceObjetDonneeDragDropData(objet), DragDropEffects.Link | DragDropEffects.Copy);
             }
         }
     }
     if (e.Button == MouseButtons.None)
     {
         Point pt = new Point(e.X, e.Y);
         pt = PointToLogical(pt);
         CInfoDessinSatisfaction info = GetInfoFromLogical(pt);
         if (info != null)
         {
             info.OnMouseMove(this, info.PointToClient(pt));
         }
     }
 }
Example #10
0
 //-----------------------------------------------------
 private void m_panelDessin_MouseUp(object sender, MouseEventArgs e)
 {
     m_panelDessin.Capture = false;
     m_panelDessin.Cursor  = Cursors.Arrow;
     m_ptStartScroll       = null;
     if (e.Button == MouseButtons.Right && !m_bHasScroll)
     {
         DoSelection(new Point(e.X, e.Y), true);
         if (m_satisfactionSel != null)
         {
             m_menuSatisfaction.Show(m_panelDessin, new Point(e.X, e.Y));
         }
     }
     if (m_satisfactionSel != null)
     {
         CInfoDessinSatisfaction info = null;
         if (m_dicSatisfactionToRect.TryGetValue(m_satisfactionSel, out info))
         {
             Point pt = info.PointToClient(PointToLogical(new Point(e.X, e.Y)));
             info.OnMouseUp(this, pt);
         }
     }
     Cursor = Cursors.Arrow;
 }
Example #11
0
        private void m_panelDessin_Paint(object sender, PaintEventArgs e)
        {
            Matrix m = new Matrix();

            e.Graphics.FillRectangle(Brushes.White, e.ClipRectangle);


            PrepareGraphic(e.Graphics);

            int nX0 = PointToLogical(new Point(0, 0)).X;
            int nIndexNiveauStart = (nX0) / (m_nLargeurNiveauDefaut + m_nLargeurFleches);

            if (nX0 < 0)
            {
                nIndexNiveauStart--;
            }

            int nNbNiveauxVisibles = SizeToLogical(m_panelDessin.Width) / (m_nLargeurNiveauDefaut + m_nLargeurFleches) + 2;

            List <ISatisfactionBesoin> satisfactionsDessines = new List <ISatisfactionBesoin>();

            if (nIndexNiveauStart < 0)
            {
                nIndexNiveauStart = 0;
            }
            for (int nIndexNiveau = nIndexNiveauStart; nIndexNiveau <= nIndexNiveauStart + nNbNiveauxVisibles &&
                 nIndexNiveau < m_listeNiveaux.Count; nIndexNiveau++)
            {
                CNiveau niveau        = m_listeNiveaux[nIndexNiveau];
                int     nNiveau       = niveau.Niveau;
                Color   couleurNiveau = Color.LightGreen;
                if (nNiveau > 0)
                {
                    couleurNiveau = Color.White;
                }
                else if (nNiveau < 0)
                {
                    couleurNiveau = Color.LightBlue;
                }
                foreach (ISatisfactionBesoin satisfaction in niveau.Satisfactions)
                {
                    CInfoDessinSatisfaction dessin = null;
                    if (m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin))
                    {
                        Point pt = PointToDisplay(new Point(dessin.Rectangle.Left, dessin.Rectangle.Bottom));
                        if (pt.Y > 0)
                        {
                            pt = PointToDisplay(new Point(dessin.Rectangle.Left, dessin.Rectangle.Top));
                            if (pt.Y < m_panelDessin.Height)
                            {
                                bool bSel = dessin.Satisfaction.Equals(m_satisfactionSel);
                                dessin.Draw(this, couleurNiveau, bSel, e.Graphics);
                                satisfactionsDessines.Add(satisfaction);
                            }
                        }
                    }
                }
            }
            //Trace les lignes
            HashSet <CRelationBesoin_Satisfaction> liensDessines = new HashSet <CRelationBesoin_Satisfaction>();
            Pen p    = new Pen(Color.Black);
            Pen pSel = new Pen(Color.Yellow, 2);

            //p.EndCap = LineCap.ArrowAnchor;

            m_dicSatisfactionToSegment.Clear();
            foreach (ISatisfactionBesoin satDessinee in satisfactionsDessines)
            {
                CBesoin besoin = satDessinee as CBesoin;
                if (besoin != null)
                {
                    foreach (CRelationBesoin_Satisfaction rel in besoin.RelationsSatisfactions)
                    {
                        if (!liensDessines.Contains(rel))
                        {
                            CSegmentDroite segment = DrawLien(
                                e.Graphics,
                                rel.Besoin,
                                rel.Satisfaction,
                                rel == m_lienSel ? pSel : p);
                            liensDessines.Add(rel);
                            if (segment != null)
                            {
                                m_dicSatisfactionToSegment[rel] = segment;
                            }
                        }
                    }
                }
                foreach (CRelationBesoin_Satisfaction rel in satDessinee.RelationsSatisfaits)
                {
                    if (!liensDessines.Contains(rel))
                    {
                        CSegmentDroite segment = DrawLien(
                            e.Graphics,
                            rel.Besoin,
                            rel.Satisfaction,
                            rel == m_lienSel ? pSel : p);
                        liensDessines.Add(rel);
                        if (segment != null)
                        {
                            m_dicSatisfactionToSegment[rel] = segment;
                        }
                    }
                }
            }
            pSel.Dispose();
            p.Dispose();



            e.Graphics.ResetTransform();
        }
Example #12
0
        //------------------------------------------------------
        private void CalculeRectangles()
        {
            m_dicSatisfactionToRect.Clear();

            for (int nIndex = 1; nIndex < m_listeNiveaux.Count; nIndex++)
            {
                int nYTop = 0;

                /*
                 *          while (nIndex < m_listeNiveaux.Count && m_listeNiveaux[nIndex].Satisfactions.Count() == 0 )
                 *              nIndex++;*/

                if (nIndex < m_listeNiveaux.Count)
                {
                    int nWidthNiveau = 0;
                    //trouve le dernier élément de ce niveau
                    CNiveau niveau = m_listeNiveaux[nIndex];
                    foreach (ISatisfactionBesoin satisfaction in niveau.Satisfactions)
                    {
                        CInfoDessinSatisfaction dessin = null;
                        if (m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin))
                        {
                            if (dessin != null)
                            {
                                nYTop        = dessin.Rectangle.Bottom + m_nMargeVerticale;
                                nWidthNiveau = Math.Max(dessin.Rectangle.Width, nWidthNiveau);
                            }
                        }
                    }



                    foreach (ISatisfactionBesoin satisfaction in niveau.Satisfactions)
                    {
                        if (!m_dicSatisfactionToRect.ContainsKey(satisfaction))
                        {
                            nYTop  = CalculeRectangles(satisfaction, nIndex - 1, nYTop);
                            nYTop += m_nMargeVerticale;
                        }
                    }
                }
            }

            //Calcule tous les englobants = remplace les rectangles simples par des rectangles englobant
            //les fils qui suivent
            foreach (CNiveau niveaux in m_listeNiveaux)
            {
                CalculeEnglobants(niveaux);
            }



            int?nMinX = null;
            int?nMinY = null;
            int?nMaxX = null;
            int?nMaxY = null;

            foreach (CInfoDessinSatisfaction dessin in m_dicSatisfactionToRect.Values)
            {
                if (dessin != null)
                {
                    if (nMinX == null || nMinX.Value > dessin.Rectangle.Left)
                    {
                        nMinX = dessin.Rectangle.Left;
                    }
                    if (nMinY == null || nMinY.Value > dessin.Rectangle.Top)
                    {
                        nMinY = dessin.Rectangle.Top;
                    }
                    if (nMaxX == null || nMaxX.Value < dessin.Rectangle.Right)
                    {
                        nMaxX = dessin.Rectangle.Right;
                    }
                    if (nMaxY == null || nMaxY.Value < dessin.Rectangle.Bottom)
                    {
                        nMaxY = dessin.Rectangle.Bottom;
                    }
                }
            }
            if (nMinX == null || nMaxX == null || nMinY == null || nMaxY == null)
            {
                return;
            }
            //Offset de tous les rectangles
            Point ptOffset = new Point(-nMinX.Value, -nMinY.Value);

            foreach (KeyValuePair <ISatisfactionBesoin, CInfoDessinSatisfaction> kv in m_dicSatisfactionToRect)
            {
                if (kv.Value != null)
                {
                    kv.Value.Offset(ptOffset.X, ptOffset.Y);
                }
            }
            CalcScrollSizes();
        }