#include "wx/dialog.h"
#include "wx/frame.h"
#include "wx/app.h"
+
+#include "gdk/gdk.h"
+#include "gtk/gtk.h"
#include "wx/gtk/win_gtk.h"
//-----------------------------------------------------------------------------
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 );
+}
+
+//-----------------------------------------------------------------------------
+// "configure_event"
+//-----------------------------------------------------------------------------
+
+static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxDialog *win )
+{
+ if (!win->HasVMT()) return FALSE;
+
+ win->m_x = event->x;
+ win->m_y = event->y;
+
+ wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() );
+ mevent.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( mevent );
+
+ return FALSE;
+}
+
//-----------------------------------------------------------------------------
// wxDialog
//-----------------------------------------------------------------------------
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,
long style, const wxString &name )
{
m_modalShowing = FALSE;
- wxTopLevelWindows.Insert( this );
Create( parent, id, title, pos, size, style, name );
}
const wxPoint &pos, const wxSize &size,
long style, const wxString &name )
{
+ wxTopLevelWindows.Append( this );
+
m_needParent = FALSE;
PreCreation( parent, id, pos, size, style, name );
gtk_widget_set_usize( m_widget, m_width, m_height );
+ gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
+ GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );
+
+ gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event",
+ GTK_SIGNAL_FUNC(gtk_dialog_configure_callback), (gpointer)this );
+
if (m_parent) m_parent->AddChild( this );
-
PostCreation();
return TRUE;
}
-wxDialog::~wxDialog(void)
+wxDialog::~wxDialog()
{
wxTopLevelWindows.DeleteObject( this );
- if (wxTopLevelWindows.Number() == 0) wxTheApp->ExitMainLoop();
+
+ if (wxTheApp->GetTopWindow() == this)
+ {
+ wxTheApp->SetTopWindow( (wxWindow*) NULL );
+ }
+
+ 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;
}
// yes
}
-bool wxDialog::OnClose(void)
+bool wxDialog::OnClose()
{
static wxList closing;
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())
{
}
}
+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;
+
+ 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 dialog" );
+
+ 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 (!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::SetSize( int x, int y, int width, int height, int sizeFlags )
{
wxASSERT_MSG( (m_widget != NULL), "invalid window" );
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;
+ 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))
{
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;
return TRUE;
}
-bool wxDialog::IsModal(void) const
+bool wxDialog::IsModal() const
{
return m_modalShowing;
}
wxFAIL_MSG( "wxDialog:SetModal obsolete now" );
}
-int wxDialog::ShowModal(void)
+int wxDialog::ShowModal()
{
if (IsModal())
{
Show( FALSE );
}
-void wxDialog::InitDialog(void)
+void wxDialog::InitDialog()
{
wxWindow::InitDialog();
}