void MenuBar::updateLayout(void) { //Determine the Max Preferred Height of my MenuItems Real32 MaxHeight(0); Real32 TotalWidth(0); for(UInt32 i(0) ; i<getMFChildren()->size() ; ++i) { if(MaxHeight < getChildren(i)->getPreferredSize().y()) { MaxHeight = getChildren(i)->getPreferredSize().y(); } TotalWidth += getChildren(i)->getPreferredSize().x(); } //Set My preferred Size Pnt2f TopLeft, BottomRight; Pnt2f InsetsTopLeft, InsetsBottomRight; getBounds(TopLeft, BottomRight); getInsideInsetsBounds(InsetsTopLeft, InsetsBottomRight); Vec2f InsetSize( (BottomRight-TopLeft) - (InsetsBottomRight-InsetsTopLeft) ); Vec2f NewSize( TotalWidth+InsetSize.x(), MaxHeight+InsetSize.y()); if(getPreferredSize() != NewSize) { setPreferredSize(NewSize); } getInsideInsetsBounds(InsetsTopLeft, InsetsBottomRight); //Now position and size the Items Real32 LeftOffset(InsetsTopLeft.x()); Vec2f Size; Pnt2f Pos; for(UInt32 i(0) ; i<getMFChildren()->size() ; ++i) { Size.setValues(getChildren(i)->getPreferredSize().x(), MaxHeight); if(getChildren(i)->getSize() != Size) { getChildren(i)->setSize(Size); } Pos.setValues(LeftOffset, InsetsTopLeft.y()); if(getChildren(i)->getPosition() != Pos) { getChildren(i)->setPosition(Pos); } LeftOffset += getChildren(i)->getPreferredSize().x(); } }
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; }