+ // yes
+}
+
+void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
+{
+ // We'll send a Cancel message by default,
+ // which may close the dialog.
+ // Check for looping if the Cancel event handler calls Close().
+
+ // Note that if a cancel button and handler aren't present in the dialog,
+ // nothing will happen when you close the dialog via the window manager, or
+ // via Close().
+ // We wouldn't want to destroy the dialog by default, since the dialog may have been
+ // created on the stack.
+ // However, this does mean that calling dialog->Close() won't delete the dialog
+ // unless the handler for wxID_CANCEL does so. So use Destroy() if you want to be
+ // sure to destroy the dialog.
+ // The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog.
+
+ static wxList s_closing;
+
+ if (s_closing.Member(this))
+ return; // no loops
+
+ s_closing.Append(this);
+
+ wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
+ cancelEvent.SetEventObject( this );
+ GetEventHandler()->ProcessEvent(cancelEvent);
+ s_closing.DeleteObject(this);
+}
+
+bool wxDialog::Destroy()
+{
+ // schedule the dialog for the deletion
+ if ( !wxPendingDelete.Member(this) )
+ {
+ wxPendingDelete.Append(this);
+ }
+
+ // don't leave a dangling pointer as the app top window, we can be deleted
+ // any moment at all now!
+ CleanUp();
+
+ return TRUE;
+}
+
+void wxDialog::CleanUp()
+{
+ m_isBeingDeleted = TRUE;
+
+ if ( wxTheApp->GetTopWindow() == this )
+ {
+ wxTheApp->SetTopWindow( (wxWindow*) NULL );
+ }
+
+ wxTopLevelWindows.DeleteObject( this );
+}
+
+void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) )
+{
+ wxASSERT_MSG( (m_widget != NULL), wxT("invalid dialog") );
+
+#if wxUSE_CONSTRAINTS
+ if (GetAutoLayout())
+ {
+ Layout();
+ }
+ else
+#endif // wxUSE_CONSTRAINTS
+ {
+ /* no child: go out ! */
+ if (!GetChildren().First()) return;
+
+ /* do we have exactly one child? */
+ wxWindow *child = (wxWindow *) NULL;
+ for(wxNode *node = GetChildren().First(); node; node = node->Next())
+ {
+ wxWindow *win = (wxWindow *)node->Data();
+ if (!wxIS_KIND_OF(win,wxFrame) && !wxIS_KIND_OF(win,wxDialog))
+ {
+ /* it's the second one: do nothing */
+ if (child) return;
+ child = win;
+ }
+ }
+
+ /* yes: set it's size to fill all the frame */
+ int client_x, client_y;
+ GetClientSize( &client_x, &client_y );
+ child->SetSize( 1, 1, client_x-2, client_y);
+ }
+}
+
+void wxDialog::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
+{
+ wxFAIL_MSG( wxT("DoMoveWindow called for wxDialog") );
+}
+
+void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags )
+{
+ wxASSERT_MSG( (m_widget != NULL), wxT("invalid dialog") );
+ wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid dialog") );
+
+ if (m_resizing) return; /* I don't like recursions */
+ m_resizing = TRUE;
+
+ int old_x = m_x;
+ int old_y = m_y;
+
+ int old_width = m_width;
+ int old_height = m_height;
+
+ if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
+ {
+ if (x != -1) m_x = x;
+ if (y != -1) m_y = y;
+ if (width != -1) m_width = width;
+ if (height != -1) m_height = height;
+ }
+ else
+ {
+ m_x = x;
+ m_y = y;
+ m_width = width;
+ m_height = height;
+ }
+
+/*
+ if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
+ {
+ if (width == -1) m_width = 80;
+ }
+
+ if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
+ {
+ if (height == -1) m_height = 26;
+ }
+*/
+
+ if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
+ if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
+ if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
+ if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
+
+ if ((m_x != -1) || (m_y != -1))
+ {
+ if ((m_x != old_x) || (m_y != old_y))
+ {
+ /* we set the position here and when showing the dialog
+ for the first time in idle time */
+ gtk_widget_set_uposition( m_widget, m_x, m_y );
+ }
+ }
+
+ if ((m_width != old_width) || (m_height != old_height))
+ {
+ gtk_widget_set_usize( m_widget, m_width, m_height );
+
+ /* actual resizing is deferred to GtkOnSize in idle time and
+ when showing the dialog */
+ m_sizeSet = FALSE;
+ }
+
+ m_resizing = FALSE;
+}
+
+void wxDialog::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height )
+{
+ // due to a bug in gtk, x,y are always 0
+ // m_x = x;
+ // m_y = y;
+
+ if ((m_height == height) && (m_width == width) && (m_sizeSet)) return;
+ if (!m_wxwindow) return;
+
+ m_width = width;
+ m_height = height;
+
+ if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
+ if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
+ if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
+ if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
+
+ /* set size hints */
+ gint flag = 0; // GDK_HINT_POS;
+ if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
+ if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
+ GdkGeometry geom;
+ geom.min_width = m_minWidth;
+ geom.min_height = m_minHeight;
+ geom.max_width = m_maxWidth;
+ geom.max_height = m_maxHeight;
+ gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
+ (GtkWidget*) NULL,
+ &geom,
+ (GdkWindowHints) flag );
+
+ m_sizeSet = TRUE;
+
+ wxSizeEvent event( wxSize(m_width,m_height), GetId() );
+ event.SetEventObject( this );
+ GetEventHandler()->ProcessEvent( event );
+}
+
+void wxDialog::OnInternalIdle()
+{
+ if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
+ GtkOnSize( m_x, m_y, m_width, m_height );
+
+ wxWindow::OnInternalIdle();
+}