/// <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)); }
/// <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)); }
/// <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); }
/// <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); }