bool ToolBarArea::ExpandRow(int rowIndex) { // Expand all of the toolbars in a given row so that the // whole width is filled, if possible. This is the last // step after laying out as many toolbars as possible in // that row. Returns false if it's not possible to fit // all of these toolbars in one row anymore. wxSize area = GetClientSize(); int i, j, x; int minWidth = 0; int leftoverSpace = 0; int expandableCount = 0; int toolbarCount = 0; for(i=0; i<(int)mChildArray.GetCount(); i++) if (mRowArray[i] == rowIndex) { ExpandingToolBar *child = mChildArray[i]; wxSize childMin = child->GetMinSize(); wxSize childMax = child->GetMaxSize(); minWidth += childMin.x; toolbarCount++; if (childMax.x > childMin.x) expandableCount++; } leftoverSpace = area.x - minWidth; if (leftoverSpace <= 0) { if (toolbarCount > 1) return false; // not possible to fit all in one row else return true; // there's only one, so it doesn't matter } j = 0; x = 0; for(i=0; i<(int)mChildArray.GetCount(); i++) if (mRowArray[i] == rowIndex) { ExpandingToolBar *child = mChildArray[i]; wxPoint childPos = child->GetPosition(); wxSize childMin = child->GetMinSize(); wxSize childMax = child->GetMaxSize(); int width = childMin.x; if (childMax.x > childMin.x) width += (leftoverSpace * (j+1) / expandableCount) - (leftoverSpace * (j) / expandableCount); mChildArray[i]->SetSize(x, childPos.y, width, childMin.y); x += width; j++; } return true; // success }
void ToolBarArea::LayoutOne(int childIndex) { wxSize area = GetClientSize(); ExpandingToolBar *child = mChildArray[childIndex]; wxSize childMin = child->GetMinSize(); wxSize childMax = child->GetMaxSize(); if (childIndex == 0) { mRowArray[childIndex] = 0; mChildArray[childIndex]->SetSize(0, 0, childMin.x, childMin.y); ExpandRow(0); wxPoint p = mChildArray[childIndex]->GetPosition(); wxSize s = mChildArray[childIndex]->GetSize(); #if 0 printf("ToolBar %d moved to row %d at (%d, %d), size (%d x %d)\n", childIndex, mRowArray[childIndex], p.x, p.y, s.x, s.y); #endif mLastLayoutSize = area; return; } int prevRow = mRowArray[childIndex-1]; ContractRow(prevRow); wxPoint prevPos = mChildArray[childIndex-1]->GetPosition(); wxSize prevSize = mChildArray[childIndex-1]->GetSize(); int prevX = prevPos.x + prevSize.x; int availableWidth = area.x - prevX; if (childMin.x <= availableWidth) { // It fits into the same row mRowArray[childIndex] = prevRow; mChildArray[childIndex]->SetSize(prevX, prevPos.y, childMin.x, childMin.y); ExpandRow(prevRow); } else { // Go to the next row ExpandRow(prevRow); mRowArray[childIndex] = prevRow + 1; int i; int maxRowHeight = 0; for(i=0; i<childIndex; i++) if (mRowArray[i] == prevRow && mChildArray[i]->GetSize().y > maxRowHeight) maxRowHeight = mChildArray[i]->GetSize().y; mChildArray[childIndex]->SetSize(0, prevPos.y + maxRowHeight, childMin.x, childMin.y); ExpandRow(prevRow+1); } // Save the size of the window the last time we moved one of the // toolbars around. If the user does a minor resize, we try to // preserve the layout. If the user does a major resize, we're // allowed to redo the layout. mLastLayoutSize = area; wxPoint p = mChildArray[childIndex]->GetPosition(); wxSize s = mChildArray[childIndex]->GetSize(); #if 0 printf("ToolBar %d moved to row %d at (%d, %d), size (%d x %d)\n", childIndex, mRowArray[childIndex], p.x, p.y, s.x, s.y); #endif }