// // Layout the toolbars // void ToolDock::LayoutToolBars() { wxRect stack[ ToolBarCount + 1 ]; wxPoint cpos, lpos; ToolBar *lt = NULL; int ndx, stkcnt = 0; int width, height; // Get size of our parent since we haven't been sized yet GetParent()->GetClientSize( &width, &height ); width -= toolbarGap; height -= toolbarGap; // Get the number of docked toolbars and take a quick exit // if we don't have any int cnt = mDockedBars.GetCount(); if( cnt == 0 ) { SetMinSize( wxSize( width, toolbarGap ) ); return; } // Set initial stack entry to maximum size stack[ 0 ].SetX( toolbarGap ); stack[ 0 ].SetY( toolbarGap ); stack[ 0 ].SetWidth( width ); stack[ 0 ].SetHeight( height ); // Process all docked and visible toolbars for( ndx = 0; ndx < cnt; ndx++ ) { // Cache toolbar pointer ToolBar *ct = (ToolBar *)mDockedBars[ ndx ]; // Get and cache the toolbar sizes wxSize sz = ct->GetSize(); int tw = sz.GetWidth() + toolbarGap; int th = sz.GetHeight() + toolbarGap; // Will this one fit in remaining horizontal space? if( ( tw > stack[ stkcnt ].GetWidth() ) || ( th > stack[ stkcnt ].GetHeight() ) ) { // Destack entries until one is found in which this bar // will fit or until we run out of stacked entries while( stkcnt > 0 ) { stkcnt--; // Get out if it will fit if( ( tw <= stack[ stkcnt ].GetWidth() ) && ( th <= stack[ stkcnt ].GetHeight() ) ) { break; } } } // The current stack entry position is where the bar // will be placed. cpos = stack[ stkcnt ].GetPosition(); // We'll be using at least a portion of this stack entry, so // adjust the location and size. It is possible that these // will become zero if this entry and the toolbar have the // same height. This is what we want as it will be destacked // in the next iteration. stack[ stkcnt ].SetY( stack[ stkcnt ].GetY() + th ); stack[ stkcnt ].SetHeight( stack[ stkcnt ].GetHeight() - th ); // Calc the next possible horizontal location. int x = cpos.x + tw; // Add a new stack entry stkcnt++; stack[ stkcnt ].SetX( x ); stack[ stkcnt ].SetY( cpos.y ); stack[ stkcnt ].SetWidth( width - x ); stack[ stkcnt ].SetHeight( th ); // Position the previous toolbar if( ndx > 0 ) { // Keep the tab order in order ct->MoveAfterInTabOrder( lt ); // Place the last toolbar lt->SetPosition( wxPoint( lpos.x, lpos.y ) ); } // Place the final toolbar if( ndx == cnt - 1 ) { ct->SetPosition( wxPoint( cpos.x, cpos.y ) ); } // Remember for next iteration lt = ct; lpos = cpos; } // Set the final size of the dock window SetMinSize( wxSize( -1, stack[ 0 ].GetY() ) ); // Clean things up Refresh( false ); }