X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb1585ae85bc09432ae4c1afd805fb4aebf6e0c8..e487524e492809638b7e335937c41fd432458a54:/src/gtk1/dialog.cpp diff --git a/src/gtk1/dialog.cpp b/src/gtk1/dialog.cpp index f4a4883c61..0e26ee1808 100644 --- a/src/gtk1/dialog.cpp +++ b/src/gtk1/dialog.cpp @@ -38,6 +38,24 @@ bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED return TRUE; } +//----------------------------------------------------------------------------- +// "size_allocate" +//----------------------------------------------------------------------------- + +static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxDialog *win ) +{ + if (!win->HasVMT()) return; + +/* + printf( "OnDialogResize from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); +*/ + + win->GtkOnSize( alloc->x, alloc->y, alloc->width, alloc->height ); +} + //----------------------------------------------------------------------------- // wxDialog //----------------------------------------------------------------------------- @@ -46,16 +64,16 @@ BEGIN_EVENT_TABLE(wxDialog,wxPanel) EVT_BUTTON (wxID_OK, wxDialog::OnOK) EVT_BUTTON (wxID_CANCEL, wxDialog::OnCancel) EVT_BUTTON (wxID_APPLY, wxDialog::OnApply) + EVT_SIZE (wxDialog::OnSize) EVT_CLOSE (wxDialog::OnCloseWindow) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxPanel) -wxDialog::wxDialog(void) +wxDialog::wxDialog() { m_title = ""; m_modalShowing = FALSE; - wxTopLevelWindows.Insert( this ); } wxDialog::wxDialog( wxWindow *parent, @@ -64,7 +82,6 @@ wxDialog::wxDialog( wxWindow *parent, long style, const wxString &name ) { m_modalShowing = FALSE; - wxTopLevelWindows.Insert( this ); Create( parent, id, title, pos, size, style, name ); } @@ -73,6 +90,8 @@ bool wxDialog::Create( wxWindow *parent, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { + wxTopLevelWindows.Append( this ); + m_needParent = FALSE; PreCreation( parent, id, pos, size, style, name ); @@ -85,6 +104,9 @@ bool wxDialog::Create( wxWindow *parent, gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event", GTK_SIGNAL_FUNC(gtk_dialog_delete_callback), (gpointer)this ); + gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", + GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this ); + m_wxwindow = gtk_myfixed_new(); gtk_widget_show( m_wxwindow ); GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); @@ -106,20 +128,20 @@ bool wxDialog::Create( wxWindow *parent, return TRUE; } -wxDialog::~wxDialog(void) +wxDialog::~wxDialog() { wxTopLevelWindows.DeleteObject( this ); if (wxTopLevelWindows.Number() == 0) wxTheApp->ExitMainLoop(); } -void wxDialog::SetTitle(const wxString& title ) +void wxDialog::SetTitle( const wxString& title ) { m_title = title; if (m_title.IsNull()) m_title = ""; gtk_window_set_title( GTK_WINDOW(m_widget), m_title ); } -wxString wxDialog::GetTitle(void) const +wxString wxDialog::GetTitle() const { return (wxString&)m_title; } @@ -163,7 +185,7 @@ void wxDialog::OnPaint( wxPaintEvent& WXUNUSED(event) ) // yes } -bool wxDialog::OnClose(void) +bool wxDialog::OnClose() { static wxList closing; @@ -179,14 +201,14 @@ bool wxDialog::OnClose(void) return FALSE; } -bool wxDialog::Destroy(void) +bool wxDialog::Destroy() { if (!wxPendingDelete.Member(this)) wxPendingDelete.Append(this); return TRUE; } -void wxDialog::OnCloseWindow(wxCloseEvent& event) +void wxDialog::OnCloseWindow( wxCloseEvent& event ) { if (GetEventHandler()->OnClose() || event.GetForce()) { @@ -194,6 +216,66 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event) } } +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_minWidth; + if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_minHeight; + + gtk_widget_set_usize( m_widget, m_width, m_height ); + + m_sizeSet = TRUE; + + wxSizeEvent event( wxSize(m_width,m_height), GetId() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); +} + +void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) ) +{ + wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); + + if (GetAutoLayout()) + { + Layout(); + } + else + { + // 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 (!IS_KIND_OF(win,wxFrame) && !IS_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::SetSize( int x, int y, int width, int height, int sizeFlags ) { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -254,16 +336,22 @@ void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) wxSizeEvent event( wxSize(m_width,m_height), GetId() ); event.SetEventObject( this ); - ProcessEvent( event ); + GetEventHandler()->ProcessEvent( event ); m_resizing = FALSE; } +void wxDialog::SetSize( int width, int height ) +{ + SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); +} + void wxDialog::Centre( int direction ) { wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); - int x,y; + int x = 0; + int y = 0; if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (gdk_screen_width () - m_width) / 2; if (direction & wxVERTICAL == wxVERTICAL) y = (gdk_screen_height () - m_height) / 2; @@ -285,7 +373,7 @@ bool wxDialog::Show( bool show ) return TRUE; } -bool wxDialog::IsModal(void) const +bool wxDialog::IsModal() const { return m_modalShowing; } @@ -301,7 +389,7 @@ void wxDialog::SetModal( bool WXUNUSED(flag) ) wxFAIL_MSG( "wxDialog:SetModal obsolete now" ); } -int wxDialog::ShowModal(void) +int wxDialog::ShowModal() { if (IsModal()) { @@ -337,7 +425,7 @@ void wxDialog::EndModal( int retCode ) Show( FALSE ); } -void wxDialog::InitDialog(void) +void wxDialog::InitDialog() { wxWindow::InitDialog(); }