private void WlkFirstWalk(Elem v) { if (v.NumChildren() == 0) { v.prelim = 0; Elem left = WlkGetLeftSibling(v); if (left != null) v.prelim = left.prelim + MarginHorizontal() + left.Dimensions.Width; } else { Elem leftmostChild = WlkLeftmostChild(v); Elem rightmostChild = WlkRightmostChild(v); Elem defaultAncestor = leftmostChild; foreach (Elem w1 in v.Children()) { WlkFirstWalk(w1); WlkApportion(w1, defaultAncestor); } WlkExecuteShifts(v); int midpoint = (leftmostChild.prelim + leftmostChild.Dimensions.Width / 2 + rightmostChild.prelim + rightmostChild.Dimensions.Width / 2) - v.Dimensions.Width; midpoint /= 2; Elem w = WlkGetLeftSibling(v); if (w != null) { v.prelim = w.prelim + MarginHorizontal() + w.Dimensions.Width; v.mod = v.prelim - midpoint; } else v.prelim = midpoint; } }
private Elem WlkNextRight(Elem v) { if (v.NumChildren() > 0) return WlkRightmostChild(v); else return v.thread; }
private void WlkExecuteShifts(Elem v) { int shift = 0; int change = 0; List<Elem> reverse = new List<Elem>(v.NumChildren()); foreach (Elem e in v.Children()) /*and this monstrosity. ug!*/ reverse.Add(e); reverse.Reverse(); foreach (Elem w in reverse) { w.prelim = w.prelim + shift; w.mod = w.mod + shift; change = change + w.change; shift = shift + w.shift + change; } }