void UIElement::RaiseEvent(RoutedEventArgs* args) { args->m_originalSource = this; RoutedEvent* routedEvent = args->get_RoutedEvent(); if (routedEvent == NULL) { raise(SystemException("routedEvent = NULL")); } // preview phase if (routedEvent->get_RoutingStrategy() == RoutingStrategy_Tunnel) { #if 0 EventRoute route; UIElement* p = this;//dynamic_cast<UIElement*>(GetRParent()); while (p) { route.ancestors.push_front(p); p = dynamic_cast<UIElement*>(p->GetRParent()); } list<UIElement*>::iterator it = route.ancestors.begin(); while (it != route.ancestors.end()) { UIElement* el = *it; // Class handlers if (!args->get_Handled()) // TODO { EventManager::InvokeClassHandlers(el/*args->get_Source()*/->GetType(), el, args); } // Instance handlers signal_base* sig = el->m_handlers[routedEvent->m_index]; if (sig) { int nslots = sig->GetSlotCount(); // signal2<Object*,RoutedEventArgs*>::connection_type it2 = el->m_handlers[routedEvent->m_index]->m_slots.begin(); // while (it2 != el->m_handlers[routedEvent->m_index]->m_slots.end()) for (int i = 0; i < nslots; i++) { stub_interface_base* slot = sig->GetSlot(i); if (!args->get_Handled()) // TODO { args->InvokeEventHandler(this, slot); } // ++it2; } } ++it; } #endif } else if (routedEvent->get_RoutingStrategy() == RoutingStrategy_Bubble) { EventRoute route; UIElement* p = this; do { route.ancestors.push_back(p); p = p->get_Parent(); } while (p); if (args->get_Source() == nullptr) { args->set_Source(this); } for (auto it = route.ancestors.begin(); it != route.ancestors.end(); ++it) { UIElement* el = *it; // Class handlers if (!args->get_Handled()) // TODO { EventManager::InvokeClassHandlers(el->GetType(), el, args); } // Instance handlers Event* pEvent = el->m_events[routedEvent->GetIndex()]; if (pEvent) { try { switch (pEvent->get_NumArgs()) { case 2: { pEvent->Handle(el, args); } break; default: ASSERT(0); } } catch (Exception* e) { MessageBox(nullptr, e->get_Reason().c_strw(), L"GUI", MB_OK | MB_ICONERROR); } } args->set_Source(el); #if 0 list<IDispatch*>::iterator it = pEvent->m_handlers.begin(); while (it != pEvent->m_handlers.end()) { IDispatch* handler = *it; ++it; if (!args->get_Handled()) // TODO { args->InvokeEventHandler(this, handler); } } /* int nslots = el->m_handlers[routedEvent->m_index]->GetSlotCount(); signal2<Object*,RoutedEventArgs*>::connection_type it2 = el->m_handlers[routedEvent->m_index].m_slots.begin(); while (it2 != el->m_handlers[routedEvent->m_index].m_slots.end()) { args->InvokeEventHandler(this, *it2); ++it2; } */ } #endif } }
// virtual LDraw::SizeD DockPanel::MeasureOverride(LDraw::SizeD availSize) { LDraw::BBoxD layoutRect(0, 0, availSize.Width, availSize.Height); double minWidth = 0; double minHeight = 0; double totalWidth = 0; double totalHeight = 0; unsigned int ncount = get_InternalChildren()->GetCount(); #if 0 for (unsigned int i = 0; i < ncount; i++) { UIElement* pVisual = get_InternalChildren()->GetItem(i);//(*get_rchildList())[i]; // TODO remove this // pVisual->SetRParent(this); } #endif for (unsigned int i = 0; i < ncount; i++) { UIElement* pVisual = get_InternalChildren()->get_Item(i);//(*get_rchildList())[i]; ASSERT(pVisual->GetRParent() == this); if (pVisual->get_Visibility() != Collapsed) { DockEnum dock = GetDock(pVisual); if (dock == Fill || ((i == ncount-1) && get_LastChildFill())) { pVisual->Measure(LDraw::SizeD(layoutRect.GetWidth(), layoutRect.GetHeight())); totalWidth += pVisual->get_DesiredSize().Width; totalHeight += pVisual->get_DesiredSize().Height; break; } else if (dock == Left) { pVisual->Measure(LDraw::SizeD(0, layoutRect.GetHeight())); layoutRect.left += pVisual->get_DesiredSize().Width; totalWidth += pVisual->get_DesiredSize().Width; // totalHeight = max(totalHeight, pVisual->m_desiredHeight); minHeight = MAX(minHeight, pVisual->get_DesiredSize().Height); } else if (dock == Top) { pVisual->Measure(LDraw::SizeD(layoutRect.GetWidth(), 0)); layoutRect.top += pVisual->get_DesiredSize().Height; totalHeight += pVisual->get_DesiredSize().Height; // totalWidth = max(totalWidth, pVisual->m_desiredWidth); minWidth = MAX(minWidth, pVisual->get_DesiredSize().Width); } else if (dock == Right) { pVisual->Measure(LDraw::SizeD(0, layoutRect.GetHeight())); layoutRect.right -= pVisual->get_DesiredSize().Width; totalWidth += pVisual->get_DesiredSize().Width; // totalHeight = max(totalHeight, pVisual->m_desiredHeight); minHeight = MAX(minHeight, pVisual->get_DesiredSize().Height); } else if (dock == Bottom) { pVisual->Measure(LDraw::SizeD(layoutRect.GetWidth(), 0)); layoutRect.bottom -= pVisual->get_DesiredSize().Height; totalHeight += pVisual->get_DesiredSize().Height; // totalWidth = max(totalWidth, pVisual->m_desiredWidth); minWidth = MAX(minWidth, pVisual->get_DesiredSize().Width); } else ASSERT(0); // pVisual->SetLayoutOffset(fLeft, fTop); // pVisual->Arrange(LDraw::SizeF(pVisual->m_computedWidth, pVisual->m_computedHeight)); /* if (dock == Fill || layoutRect.GetWidth() <= 0 || layoutRect.GetHeight() <= 0) { break; } */ } } return LDraw::SizeD(MAX(minWidth, totalWidth), MAX(minHeight, totalHeight)); }