+/// Do the adaptation
+bool wxWizard::DoLayoutAdaptation()
+{
+ wxWindowList windows;
+ wxWindowList pages;
+
+ // Make all the pages (that use sizers) scrollable
+ for ( wxSizerItemList::compatibility_iterator node = m_sizerPage->GetChildren().GetFirst(); node; node = node->GetNext() )
+ {
+ wxSizerItem * const item = node->GetData();
+ if ( item->IsWindow() )
+ {
+ wxWizardPage* page = wxDynamicCast(item->GetWindow(), wxWizardPage);
+ if (page)
+ {
+ while (page)
+ {
+ if (!pages.Find(page) && page->GetSizer())
+ {
+ // Create a scrolled window and reparent
+ wxScrolledWindow* scrolledWindow = new wxScrolledWindow(page, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxVSCROLL|wxHSCROLL|wxBORDER_NONE);
+ wxSizer* oldSizer = page->GetSizer();
+
+ wxSizer* newSizer = new wxBoxSizer(wxVERTICAL);
+ newSizer->Add(scrolledWindow,1, wxEXPAND, 0);
+
+ page->SetSizer(newSizer, false /* don't delete the old sizer */);
+
+ scrolledWindow->SetSizer(oldSizer);
+
+ wxStandardDialogLayoutAdapter::DoReparentControls(page, scrolledWindow);
+
+ pages.Append(page);
+ windows.Append(scrolledWindow);
+ }
+ page = page->GetNext();
+ }
+ }
+ }
+ }
+
+ wxStandardDialogLayoutAdapter::DoFitWithScrolling(this, windows);
+
+ // Size event doesn't get sent soon enough on wxGTK
+ DoLayout();
+
+ SetLayoutAdaptationDone(true);
+
+ return true;
+}
+
+bool wxWizard::ResizeBitmap(wxBitmap& bmp)
+{
+ if (!GetBitmapPlacement())
+ return false;
+
+ if (bmp.IsOk())
+ {
+ wxSize pageSize = m_sizerPage->GetSize();
+ if (pageSize == wxSize(0,0))
+ pageSize = GetPageSize();
+ int bitmapWidth = wxMax(bmp.GetWidth(), GetMinimumBitmapWidth());
+ int bitmapHeight = pageSize.y;
+
+ if (!m_statbmp->GetBitmap().IsOk() || m_statbmp->GetBitmap().GetHeight() != bitmapHeight)
+ {
+ wxBitmap bitmap(bitmapWidth, bitmapHeight);
+ {
+ wxMemoryDC dc;
+ dc.SelectObject(bitmap);
+ dc.SetBackground(wxBrush(m_bitmapBackgroundColour));
+ dc.Clear();
+
+ if (GetBitmapPlacement() & wxWIZARD_TILE)
+ {
+ TileBitmap(wxRect(0, 0, bitmapWidth, bitmapHeight), dc, bmp);
+ }
+ else
+ {
+ int x, y;
+
+ if (GetBitmapPlacement() & wxWIZARD_HALIGN_LEFT)
+ x = 0;
+ else if (GetBitmapPlacement() & wxWIZARD_HALIGN_RIGHT)
+ x = bitmapWidth - bmp.GetWidth();
+ else
+ x = (bitmapWidth - bmp.GetWidth())/2;
+
+ if (GetBitmapPlacement() & wxWIZARD_VALIGN_TOP)
+ y = 0;
+ else if (GetBitmapPlacement() & wxWIZARD_VALIGN_BOTTOM)
+ y = bitmapHeight - bmp.GetHeight();
+ else
+ y = (bitmapHeight - bmp.GetHeight())/2;
+
+ dc.DrawBitmap(bmp, x, y, true);
+ dc.SelectObject(wxNullBitmap);
+ }
+ }
+
+ bmp = bitmap;
+ }
+ }
+
+ return true;
+}
+
+bool wxWizard::TileBitmap(const wxRect& rect, wxDC& dc, const wxBitmap& bitmap)
+{
+ int w = bitmap.GetWidth();
+ int h = bitmap.GetHeight();
+
+ wxMemoryDC dcMem;
+
+ dcMem.SelectObjectAsSource(bitmap);
+
+ int i, j;
+ for (i = rect.x; i < rect.x + rect.width; i += w)
+ {
+ for (j = rect.y; j < rect.y + rect.height; j+= h)
+ dc.Blit(i, j, bitmap.GetWidth(), bitmap.GetHeight(), & dcMem, 0, 0);
+ }
+ dcMem.SelectObject(wxNullBitmap);
+
+ return true;
+}
+