Esempio n. 1
0
        /// <summary>
        /// Metoda vrací relativní souřadnici bodu v daném containeru pro danou absolutní souřadnici.
        /// Metoda určí souřadný systém <see cref="BoundsInfo"/> uvnitř daného containeru,
        /// získá jeho <see cref="BoundsInfo.AbsolutePhysicalOriginPoint"/>, a vrátí rozdíl.
        /// </summary>
        /// <param name="container"></param>
        /// <param name="absolutePoint"></param>
        /// <returns></returns>
        public static Point GetRelativePointInContainer(IInteractiveParent container, Point absolutePoint)
        {
            if (container == null)
            {
                return(absolutePoint);
            }
            BoundsInfo boundsInfo = BoundsInfo.CreateForContainer(container);

            return(absolutePoint.Sub(boundsInfo.AbsolutePhysicalOriginPoint));
        }
Esempio n. 2
0
        /// <summary>
        /// Metoda vrátí absolutní souřadnice prostoru, který je zadán jako relativní souřadnice v daném containeru.
        /// Pokud tedy například daný container je umístěn na (absolutní) souřadnici Bounds = { 100,20,200,50 }, a dané relativní souřadnice jsou { 5,5,10,10 },
        /// pak výsledné absolutní souřadnice jsou { 105,25,10,10 }.
        /// </summary>
        /// <param name="container"></param>
        /// <param name="relativeBounds"></param>
        /// <param name="currentLayer">Vrstva, jejíž souřadnice řešíme. Každý prvek může mít souřadnice různé podle toho, o kterou vrstvu se jedná.
        /// To je důsledek procesu Drag and Drop, kdy ve standardní vrstvě se prvek nachází na výchozích souřadnicích Bounds,
        /// ale ve vrstvě <see cref="GInteractiveDrawLayer.Interactive"/> je na souřadnicích Drag.</param>
        /// <returns></returns>
        public static Rectangle GetAbsoluteBoundsInContainer(IInteractiveParent container, Rectangle relativeBounds, GInteractiveDrawLayer currentLayer)
        {
            if (container == null)
            {
                return(relativeBounds);
            }
            BoundsInfo boundsInfo = BoundsInfo.CreateForContainer(container, currentLayer);

            return(relativeBounds.Add(boundsInfo.AbsolutePhysicalOriginPoint));
        }
Esempio n. 3
0
        /// <summary>
        /// Vrací <see cref="BoundsInfo"/> pro daného parenta a danou vrstvu souřadnic
        /// </summary>
        /// <param name="forItem"></param>
        /// <param name="asContainer"></param>
        /// <param name="layer">Vrstva, jejíž souřadnice řešíme. Každý prvek může mít souřadnice různé podle toho, o kterou vrstvu se jedná.
        /// To je důsledek procesu Drag and Drop, kdy ve standardní vrstvě se prvek nachází na výchozích souřadnicích Bounds,
        /// ale ve vrstvě <see cref="GInteractiveDrawLayer.Interactive"/> je na souřadnicích Drag = <see cref="IInteractiveItem.BoundsInteractive"/>.</param>
        /// <returns></returns>
        private static BoundsInfo _CreateForItem(IInteractiveParent forItem, bool asContainer, GInteractiveDrawLayer layer)
        {
            // Nejprve si nastřádám řadu prvků počínaje daným prvkem/nebo jeho parentem, přes jeho Parenty, až k nejspodnějšímu prvku (který nemá parenta):
            List <IInteractiveParent> parents = new List <IInteractiveParent>();
            Dictionary <uint, object> scanned = new Dictionary <uint, object>();
            IInteractiveParent        parent  = (asContainer ? forItem : forItem.Parent);

            while (parent != null)
            {
                if (scanned.ContainsKey(parent.Id))
                {
                    break;                                   // Zacyklení!
                }
                parents.Add(parent);
                parent = parent.Parent;                      // Krok na dalšího parenta
            }

            // Pak vytvořím postupně řadu BoundsInfo, počínaje od posledního v poli parents (=fyzický Control):
            int last = parents.Count - 1;

            // Pokud na vstupu byl předán container = fyzický Control, pak pole má 0 prvků a výstupní BoundsInfo je vytvořeno pro daný Control!
            if (last < 0)
            {
                return(BoundsInfo.CreateForParent(forItem));
            }
            // Poslední prvek pole = parents[last] = fyzický Control:
            BoundsInfo boundsInfo = BoundsInfo.CreateForParent(parents[last], layer);

            for (int i = last - 1; i >= 0; i--)
            {
                IInteractiveItem it = parents[i] as IInteractiveItem;
                if (it == null)
                {
                    continue;
                }
                boundsInfo = boundsInfo.GetChildsBoundsInfo(it, layer);
            }

            // Na závěr do výsledného boundsInfo vepíšu dodaný Child prvek (forItem) jako Current prvek:
            if (!asContainer && forItem is IInteractiveItem)
            {
                boundsInfo.CurrentItem = forItem as IInteractiveItem;
            }
            return(boundsInfo);
        }
Esempio n. 4
0
        /// <summary>
        /// Metoda vrátí absolutní souřadnice daného objektu.
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public static Rectangle GetAbsoluteBounds(IInteractiveItem item)
        {
            BoundsInfo boundsInfo = BoundsInfo.CreateForChild(item);

            return(boundsInfo.CurrentItemAbsoluteBounds);
        }