]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dialog.cpp
* Fixed a bug in notebook.tex
[wxWidgets.git] / src / gtk / dialog.cpp
index 1756334f0c46e9ebb092ca24e1016c9b7540c3e9..73ae00a02b40b5746350640e9e2f7ad115160987 100644 (file)
 #include "wx/gtk/win_gtk.h"
 
 //-----------------------------------------------------------------------------
-// delete
+
+extern wxList wxPendingDelete;
+
+//-----------------------------------------------------------------------------
+// "delete_event"
+//-----------------------------------------------------------------------------
 
 bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
 { 
@@ -32,36 +37,37 @@ bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED
   win->Close();
 
   return TRUE;
-};
+}
 
 //-----------------------------------------------------------------------------
 // wxDialog
 //-----------------------------------------------------------------------------
 
-BEGIN_EVENT_TABLE(wxDialog,wxWindow)
-  EVT_BUTTON  (wxID_OK,       wxDialog::OnOk)
+BEGIN_EVENT_TABLE(wxDialog,wxPanel)
+  EVT_BUTTON  (wxID_OK,       wxDialog::OnOK)
   EVT_BUTTON  (wxID_CANCEL,   wxDialog::OnCancel)
   EVT_BUTTON  (wxID_APPLY,    wxDialog::OnApply)
   EVT_CLOSE   (wxDialog::OnCloseWindow)
 END_EVENT_TABLE()
 
-IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxWindow)
+IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxPanel)
 
 wxDialog::wxDialog(void)
 {
   m_title = "";
-  m_modalShowing = TRUE;
+  m_modalShowing = FALSE;
   wxTopLevelWindows.Insert( this );
-};
+}
 
 wxDialog::wxDialog( wxWindow *parent, 
       wxWindowID id, const wxString &title,
       const wxPoint &pos, const wxSize &size, 
       long style, const wxString &name )
 {
+  m_modalShowing = FALSE;
   wxTopLevelWindows.Insert( this );
   Create( parent, id, title, pos, size, style, name );
-};
+}
 
 bool wxDialog::Create( wxWindow *parent,
       wxWindowID id, const wxString &title,
@@ -72,8 +78,6 @@ bool wxDialog::Create( wxWindow *parent,
   
   PreCreation( parent, id, pos, size, style, name );
   
-  m_modalShowing = ((m_windowStyle & wxDIALOG_MODAL) == wxDIALOG_MODAL);
-  
   m_widget = gtk_window_new( GTK_WINDOW_TOPLEVEL );
   GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
  
@@ -90,70 +94,79 @@ bool wxDialog::Create( wxWindow *parent,
   
   SetTitle( title );
   
+  if ((m_x != -1) || (m_y != -1))
+     gtk_widget_set_uposition( m_widget, m_x, m_y );
+     
+  gtk_widget_set_usize( m_widget, m_width, m_height );
+     
   PostCreation();
   
   return TRUE;
-};
+}
 
 wxDialog::~wxDialog(void)
 {
   wxTopLevelWindows.DeleteObject( this );
   if (wxTopLevelWindows.Number() == 0) wxTheApp->ExitMainLoop();
-};
+}
 
 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
 {
   return (wxString&)m_title;
-};
+}
 
 void wxDialog::OnApply( wxCommandEvent &WXUNUSED(event) )
 {
   if (Validate()) TransferDataFromWindow();
-};
+}
 
 void wxDialog::OnCancel( wxCommandEvent &WXUNUSED(event) )
 {
   if (IsModal())
+  {
     EndModal(wxID_CANCEL);
+  }
   else
   {
     SetReturnCode(wxID_CANCEL);
     this->Show(FALSE);
-  };
-};
+  }
+}
 
-void wxDialog::OnOk( wxCommandEvent &WXUNUSED(event) )
+void wxDialog::OnOK( wxCommandEvent &WXUNUSED(event) )
 {
   if ( Validate() && TransferDataFromWindow())
   {
     if (IsModal()) 
+    {
       EndModal(wxID_OK);
+    }
     else
     {
       SetReturnCode(wxID_OK);
       this->Show(FALSE);
-    };
-  };
-  EndModal( wxID_OK );
-};
+    }
+  }
+}
 
 void wxDialog::OnPaint( wxPaintEvent& WXUNUSED(event) )
 {
   // yes
-};
+}
 
 bool wxDialog::OnClose(void)
 {
   static wxList closing;
 
   if (closing.Member(this)) return FALSE;   // no loops
-
+  
   closing.Append(this);
 
   wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
@@ -164,49 +177,116 @@ bool wxDialog::OnClose(void)
   return FALSE;
 }
 
+bool wxDialog::Destroy(void)
+{
+  if (!wxPendingDelete.Member(this))
+    wxPendingDelete.Append(this);
+
+  return TRUE;
+}
+
 void wxDialog::OnCloseWindow(wxCloseEvent& event)
 {
   if (GetEventHandler()->OnClose() || event.GetForce())
   {
     this->Destroy();
-  };
-};
+  }
+}
+
+void wxDialog::ImplementSetPosition(void)
+{
+  if ((m_x != -1) || (m_y != -1))
+     gtk_widget_set_uposition( m_widget, m_x, m_y );
+}
+
+void wxDialog::Centre( int direction )
+{
+  if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (gdk_screen_width () - m_width) / 2;
+  if (direction & wxVERTICAL == wxVERTICAL) m_y = (gdk_screen_height () - m_height) / 2;
+  ImplementSetPosition();
+}
 
 bool wxDialog::Show( bool show )
 {
-  if (!show && m_modalShowing)
+  if (!show && IsModal())
   {
     EndModal( wxID_CANCEL );
-  };
+  }
 
   wxWindow::Show( show );
   
   if (show) InitDialog();
   
-  if (show && m_modalShowing)
-  {
-    gtk_grab_add( m_widget );
-    gtk_main();
-    gtk_grab_remove( m_widget );
-  };
-  
   return TRUE;
-};
+}
+
+bool wxDialog::IsModal(void) const
+{
+  return m_modalShowing;
+}
+
+void wxDialog::SetModal( bool WXUNUSED(flag) )
+{
+/*
+  if (flag)
+    m_windowStyle |= wxDIALOG_MODAL;
+  else
+    if (m_windowStyle & wxDIALOG_MODAL) m_windowStyle -= wxDIALOG_MODAL;
+*/
+  wxFAIL_MSG( "wxDialog:SetModal obsolete now" );
+}
 
 int wxDialog::ShowModal(void)
 {
+  if (IsModal())
+  {
+    wxFAIL_MSG( "wxDialog:ShowModal called twice" );
+    return GetReturnCode();
+  }
+
   Show( TRUE );
+  
+  m_modalShowing = TRUE;
+  
+  gtk_grab_add( m_widget );
+  gtk_main();
+  gtk_grab_remove( m_widget );
+  
   return GetReturnCode();
-};
+}
 
 void wxDialog::EndModal( int retCode )
 {
-  gtk_main_quit();
   SetReturnCode( retCode );
-};
+  
+  if (!IsModal())
+  {
+     wxFAIL_MSG( "wxDialog:EndModal called twice" );
+     return;
+  }
+  
+  m_modalShowing = FALSE;
+  
+  gtk_main_quit();
+  
+  Show( FALSE );
+}
 
 void wxDialog::InitDialog(void)
 {
   wxWindow::InitDialog();
-};
+}
+
+void wxDialog::SetIcon( const wxIcon &icon )
+{
+  m_icon = icon;
+  if (!icon.Ok()) return;
+  
+  wxMask *mask = icon.GetMask();
+  GdkBitmap *bm = (GdkBitmap *) NULL;
+  if (mask) bm = mask->GetBitmap();
+  
+  gdk_window_set_icon( m_widget->window, (GdkWindow *) NULL, icon.GetPixmap(), bm );
+}
+