static void GetDefaultPosition( Widget child, Widget parent, Position *xRtn, Position *yRtn ) { Display *disp; int max_w, max_h; Position x, y; x = HALFDIFF(XtWidth(parent), XtWidth(child)); y = HALFDIFF(XtHeight(parent), XtHeight(child)); /* * find root co-ords of the parent's center */ if (XtIsRealized (parent)) XtTranslateCoords(parent, x, y, &x, &y); /* * try to keep the popup from dribbling off the display */ disp = XtDisplay (child); max_w = DisplayWidth (disp, DefaultScreen (disp)); max_h = DisplayHeight (disp, DefaultScreen (disp)); if ((x + (int)TotalWidth (child)) > max_w) x = max_w - TotalWidth (child); if ((y + (int)TotalHeight (child)) > max_h) y = max_h - TotalHeight (child); if (x < 0) x = 0; if (y < 0) y = 0; *xRtn = x; *yRtn = y; }
void PopupMenu::updateLayout(void) { //Determine the Max Preferred Width of my MenuItems Real32 MaxWidth(0); Real32 TotalHeight(0); for(UInt32 i(0) ; i<getMFChildren()->size() ; ++i) { if(MaxWidth < getChildren(i)->getRequestedSize().x()) { MaxWidth = getChildren(i)->getRequestedSize().x(); } TotalHeight += getChildren(i)->getRequestedSize().y(); if(i!=0) { TotalHeight += 1.0f; } } //Set My preferred Size Pnt2f TopLeft, BottomRight; Pnt2f InsetsTopLeft, InsetsBottomRight; getBounds(TopLeft, BottomRight); getInsideInsetsBounds(InsetsTopLeft, InsetsBottomRight); Vec2f InsetSize( (BottomRight-TopLeft) - (InsetsBottomRight-InsetsTopLeft) ); setPreferredSize(Vec2f(MaxWidth+InsetSize.x(), TotalHeight+InsetSize.y())); //Sneakily set my size _sfSize.setValue(getPreferredSize()); getInsideInsetsBounds(InsetsTopLeft, InsetsBottomRight); //Now position and size the Items Real32 TopOffset(InsetsTopLeft.y()); for(UInt32 i(0) ; i<getMFChildren()->size() ; ++i) { getChildren(i)->setSize(Vec2f(MaxWidth, getChildren(i)->getRequestedSize().y())); getChildren(i)->setPosition(Pnt2f(InsetsTopLeft.x(), TopOffset)); TopOffset += getChildren(i)->getRequestedSize().y() +1; } }