// /// Tiles the gadgets in the direction requested (horizontal or vertical). Derived /// classes can adjust the spacing between gadgets. /// /// Horizontal direction results in a row-major layout, /// and vertical direction results in column-major layout // TRect TToolBox::TileGadgets() { TSize cellSize; ComputeCellSize(cellSize); int numRows, numColumns; ComputeNumRowsColumns(numRows, numColumns); TRect innerRect; GetInnerRect(innerRect); TRect invalidRect; invalidRect.SetEmpty(); if (Direction == Horizontal) { // Row Major // int y = innerRect.top; TGadget* g = Gadgets; for (int r = 0; r < numRows; r++) { int x = innerRect.left; for (int c = 0; c < numColumns && g; c++) { TRect bounds(TPoint(x, y), cellSize); TRect originalBounds(g->GetBounds()); if (bounds != g->GetBounds()) { g->SetBounds(bounds); if (invalidRect.IsNull()) invalidRect = bounds; else invalidRect |= bounds; if (originalBounds.TopLeft() != TPoint(0, 0)) invalidRect |= originalBounds; } x += cellSize.cx; g = g->NextGadget(); } y += cellSize.cy; } } else { // Column Major // int x = innerRect.left; TGadget* g = Gadgets; for (int c = 0; c < numColumns; c++) { int y = innerRect.top; for (int r = 0; r < numRows && g; r++) { TRect bounds(TPoint(x, y), cellSize); TRect originalBounds(g->GetBounds()); if (bounds != originalBounds) { g->SetBounds(bounds); if (invalidRect.IsNull()) invalidRect = bounds; else invalidRect |= bounds; if (originalBounds.TopLeft() != TPoint(0, 0)) invalidRect |= originalBounds; } y += cellSize.cy; g = g->NextGadget(); } x += cellSize.cx; } } return invalidRect; }