+ // VERY IMPORTANT:
+ // just calling
+ // p->OnStateChange(sz);
+ // here would work work BUT:
+ // 1) in the expanded->collapsed transition it provokes a lot of flickering
+ // 2) in the collapsed->expanded transition using the "Change status" wxButton
+ // in samples/collpane application some strange warnings would be generated
+ // by the "clearlooks" theme, if that's your theme.
+ //
+ // So we prefer to use some GTK+ native optimized calls, which prevent too many resize
+ // calculations to happen. Note that the following code has been very carefully designed
+ // and tested - be VERY careful when changing it!
+
+ // 1) need to update our size hints
+ // NB: this function call won't actually do any long operation
+ // (redraw/relayouting/resizing) so that it's flicker-free
+ p->SetMinSize(sz);
+
+ if (p->HasFlag(wxCP_NO_TLW_RESIZE))
+ {
+ // the user asked to explicitely handle the resizing itself...
+ return;
+ }
+
+ wxTopLevelWindow *
+ top = wxDynamicCast(wxGetTopLevelParent(p), wxTopLevelWindow);
+ if ( top && top->GetSizer() )
+ {
+ // 2) recalculate minimal size of the top window
+ wxSize sz = top->GetSizer()->CalcMin();
+
+ if (top->m_mainWidget)
+ {
+ // 3) MAGIC HACK: if you ever used GtkExpander in a GTK+ program you know
+ // that this magic call is required to make it possible to shrink the
+ // top level window in the expanded->collapsed transition.
+ // This may be sometimes undesired but *is* necessary and if you look
+ // carefully, all GTK+ programs using GtkExpander perform this trick
+ // (e.g. the standard "open file" dialog of GTK+>=2.4 is not resizeable
+ // when the expander is collapsed!)
+ gtk_window_set_resizable (GTK_WINDOW (top->m_widget), p->IsExpanded());
+
+ // 4) set size hints: note that this code has been taken and adapted
+ // from src/gtk/toplevel.cpp
+ GdkGeometry geom;
+
+ geom.min_width = sz.x;
+ geom.min_height = sz.y;
+
+ gtk_window_set_geometry_hints( GTK_WINDOW(top->m_widget),
+ (GtkWidget*) NULL,
+ &geom,
+ GDK_HINT_MIN_SIZE );
+
+ // 5) set size: also this code has been adapted from src/gtk/toplevel.cpp
+ // to do the size changes immediately and not delaying them in the idle
+ // time
+ top->m_width = sz.x;
+ top->m_height = sz.y;
+
+ int client_x = top->m_miniEdge;
+ int client_y = top->m_miniEdge + top->m_miniTitle;
+ int client_w = top->m_width - 2*top->m_miniEdge;
+ int client_h = top->m_height - 2*top->m_miniEdge - top->m_miniTitle;
+ if (client_w < 0)
+ client_w = 0;
+ if (client_h < 0)
+ client_h = 0;
+
+ gtk_pizza_set_size( GTK_PIZZA(top->m_mainWidget),
+ top->m_wxwindow,
+ client_x, client_y, client_w, client_h );
+
+ gtk_widget_set_size_request( top->m_wxwindow, sz.x, sz.y );
+
+ }
+ }