bool Canvas::IsLayoutContainer () { Types *types = Deployment::GetCurrent ()->GetTypes (); DeepTreeWalker walker = DeepTreeWalker (this); while (UIElement *child = walker.Step ()) { if (!types->IsSubclassOf (child->GetObjectType (), Type::CANVAS) && child->IsLayoutContainer ()) return true; } return false; }
void Popup::PropagateIsEnabledState (UIElement *child, bool enabled_parent) { DeepTreeWalker walker (child); while (UIElement *e = walker.Step ()) { if (!e->Is (Type::CONTROL)) continue; Control *control = (Control *) e; control->enabled_parent = enabled_parent; control->UpdateEnabled (); walker.SkipBranch (); } }
bool Control::Focus (bool recurse) { if (!IsAttached ()) return false; /* according to msdn, these three things must be true for an element to be focusable: * * 1. the element must be visible * 2. the element must have IsTabStop = true * 3. the element must be part of the plugin's visual tree, and must have had its Loaded event fired. */ /* * If the current control is not focusable, we walk the visual tree and stop as soon * as we find the first focusable child. That then becomes focused */ Types *types = GetDeployment ()->GetTypes (); Surface *surface = GetDeployment ()->GetSurface (); DeepTreeWalker walker (this); while (UIElement *e = walker.Step ()) { if (!types->IsSubclassOf (e->GetObjectType (), Type::CONTROL)) continue; Control *c = (Control *)e; if (!c->GetIsEnabled ()) { if (!recurse) return false; walker.SkipBranch (); continue; } // A control is focusable if it is attached to a visual tree whose root // element has been loaded bool loaded = false; for (UIElement *check = this; !loaded && check != NULL; check = check->GetVisualParent ()) loaded |= check->IsLoaded (); if (loaded && c->GetRenderVisible () && c->GetIsTabStop ()) return surface->FocusElement (c); if (!recurse) return false; } return false; }