/////////////////////////////////////////////////////////////////////////////
// Name: dialog.cpp
-// Purpose:
-// Author: Robert Roebling
-// Created: 01/02/97
-// Id:
-// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
+// Purpose: wxDialog class
+// Author: AUTHOR
+// Modified by:
+// Created: ??/??/98
+// RCS-ID: $Id$
+// Copyright: (c) AUTHOR
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#endif
#include "wx/dialog.h"
+#include "wx/utils.h"
#include "wx/frame.h"
#include "wx/app.h"
+#include "wx/settings.h"
-//-----------------------------------------------------------------------------
-
+// Lists to keep track of windows, so we can disable/enable them
+// for modal dialogs
+wxList wxModalDialogs;
+wxList wxModelessWindows; // Frames and modeless dialogs
extern wxList wxPendingDelete;
-//-----------------------------------------------------------------------------
-// wxDialog
-//-----------------------------------------------------------------------------
+IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
-BEGIN_EVENT_TABLE(wxDialog,wxWindow)
- EVT_BUTTON (wxID_OK, wxDialog::OnOk)
- EVT_BUTTON (wxID_CANCEL, wxDialog::OnCancel)
- EVT_BUTTON (wxID_APPLY, wxDialog::OnApply)
- EVT_CLOSE (wxDialog::OnCloseWindow)
+BEGIN_EVENT_TABLE(wxDialog, wxPanel)
+ EVT_BUTTON(wxID_OK, wxDialog::OnOK)
+ EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
+ EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
+ EVT_CHAR_HOOK(wxDialog::OnCharHook)
+ EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged)
+ EVT_CLOSE(wxDialog::OnCloseWindow)
END_EVENT_TABLE()
-IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxWindow)
-wxDialog::wxDialog(void)
+wxDialog::wxDialog()
+{
+ SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
+}
+
+bool wxDialog::Create(wxWindow *parent, wxWindowID id,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
{
- m_title = "";
- m_modalShowing = FALSE;
- wxTopLevelWindows.Insert( this );
-};
+ m_windowStyle = style;
+
+ SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
+ SetName(name);
+
+ if (!parent)
+ wxTopLevelWindows.Append(this);
+
+ if (parent) parent->AddChild(this);
+
+ if ( id == -1 )
+ m_windowId = (int)NewControlId();
+ else
+ m_windowId = id;
+
+ // TODO: create dialog
+
+ return FALSE;
+}
-wxDialog::wxDialog( wxWindow *parent,
- wxWindowID id, const wxString &title,
- const wxPoint &pos, const wxSize &size,
- long style, const wxString &name )
+void wxDialog::SetModal(bool flag)
{
- m_modalShowing = FALSE;
- wxTopLevelWindows.Insert( this );
- Create( parent, id, title, pos, size, style, name );
-};
+ if ( flag )
+ m_windowStyle |= wxDIALOG_MODAL ;
+ else
+ if ( m_windowStyle & wxDIALOG_MODAL )
+ m_windowStyle -= wxDIALOG_MODAL ;
+
+ wxModelessWindows.DeleteObject(this);
+ if (!flag)
+ wxModelessWindows.Append(this);
+}
-bool wxDialog::Create( wxWindow *parent,
- wxWindowID id, const wxString &title,
- const wxPoint &pos, const wxSize &size,
- long style, const wxString &name )
+wxDialog::~wxDialog()
{
- return TRUE;
-};
+ // TODO
+ wxTopLevelWindows.DeleteObject(this);
+
+ if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
+ wxModelessWindows.DeleteObject(this);
+
+ // If this is the last top-level window, exit.
+ if (wxTheApp && (wxTopLevelWindows.Number() == 0))
+ {
+ wxTheApp->SetTopWindow(NULL);
+
+ if (wxTheApp->GetExitOnFrameDelete())
+ {
+ // TODO: exit
+ }
+ }
+}
-wxDialog::~wxDialog(void)
+// By default, pressing escape cancels the dialog
+void wxDialog::OnCharHook(wxKeyEvent& event)
{
- wxTopLevelWindows.DeleteObject( this );
- if (wxTopLevelWindows.Number() == 0) wxTheApp->ExitMainLoop();
-};
+ if (GetHWND())
+ {
+ if (event.m_keyCode == WXK_ESCAPE)
+ {
+ // Behaviour changed in 2.0: we'll send a Cancel message
+ // to the dialog instead of Close.
+ wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
+ cancelEvent.SetEventObject( this );
+ GetEventHandler()->ProcessEvent(cancelEvent);
+
+ return;
+ }
+ }
+ // We didn't process this event.
+ event.Skip();
+}
-void wxDialog::SetTitle(const wxString& title )
+void wxDialog::Iconize(bool WXUNUSED(iconize))
{
- m_title = title;
-};
+ // TODO
+}
-wxString wxDialog::GetTitle(void) const
+bool wxDialog::IsIconized() const
{
- return (wxString&)m_title;
-};
+ // TODO
+ return FALSE;
+}
-void wxDialog::OnApply( wxCommandEvent &WXUNUSED(event) )
+void wxDialog::SetClientSize(int width, int height)
{
- if (Validate()) TransferDataFromWindow();
-};
+ // TODO
+}
-void wxDialog::OnCancel( wxCommandEvent &WXUNUSED(event) )
+void wxDialog::GetPosition(int *x, int *y) const
{
- if (IsModal())
- {
- EndModal(wxID_CANCEL);
- }
- else
- {
- SetReturnCode(wxID_CANCEL);
- this->Show(FALSE);
- };
-};
+ // TODO
+}
+
+bool wxDialog::Show(bool show)
+{
+ // TODO
+ return FALSE;
+}
+
+void wxDialog::SetTitle(const wxString& title)
+{
+ // TODO
+}
+
+wxString wxDialog::GetTitle() const
+{
+ // TODO
+ return wxString("");
+}
-void wxDialog::OnOk( wxCommandEvent &WXUNUSED(event) )
+void wxDialog::Centre(int direction)
{
- if ( Validate() && TransferDataFromWindow())
+ int x_offset,y_offset ;
+ int display_width, display_height;
+ int width, height, x, y;
+ wxFrame *frame ;
+ if (direction & wxCENTER_FRAME)
{
- if (IsModal())
+ frame = (wxFrame*)GetParent() ;
+ if (frame)
{
- EndModal(wxID_OK);
+ frame->GetPosition(&x_offset,&y_offset) ;
+ frame->GetSize(&display_width,&display_height) ;
}
- else
- {
- SetReturnCode(wxID_OK);
- this->Show(FALSE);
- };
- };
-};
+ }
+ else
+ frame = NULL ;
-void wxDialog::OnPaint( wxPaintEvent& WXUNUSED(event) )
-{
- // yes
-};
+ if (frame==NULL)
+ {
+ wxDisplaySize(&display_width, &display_height);
+ x_offset = 0 ;
+ y_offset = 0 ;
+ }
-bool wxDialog::OnClose(void)
-{
- static wxList closing;
+ GetSize(&width, &height);
+ GetPosition(&x, &y);
- if (closing.Member(this)) return FALSE; // no loops
-
- closing.Append(this);
+ if (direction & wxHORIZONTAL)
+ x = (int)((display_width - width)/2);
+ if (direction & wxVERTICAL)
+ y = (int)((display_height - height)/2);
- wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
- cancelEvent.SetEventObject( this );
- GetEventHandler()->ProcessEvent(cancelEvent);
- closing.DeleteObject(this);
-
- return FALSE;
+ SetSize(x+x_offset, y+y_offset, width, height);
}
-bool wxDialog::Destroy(void)
+// Replacement for Show(TRUE) for modal dialogs - returns return code
+int wxDialog::ShowModal()
{
- if (!wxPendingDelete.Member(this))
- wxPendingDelete.Append(this);
+ m_windowStyle |= wxDIALOG_MODAL;
+ // TODO: modal showing
+ Show(TRUE);
+ return GetReturnCode();
+}
- return TRUE;
+void wxDialog::EndModal(int retCode)
+{
+ SetReturnCode(retCode);
+ // TODO modal un-showing
+ Show(FALSE);
}
-void wxDialog::OnCloseWindow(wxCloseEvent& event)
+// Standard buttons
+void wxDialog::OnOK(wxCommandEvent& event)
{
- if (GetEventHandler()->OnClose() || event.GetForce())
- {
- this->Destroy();
- };
-};
+ if ( Validate() && TransferDataFromWindow() )
+ {
+ if ( IsModal() )
+ EndModal(wxID_OK);
+ else
+ {
+ SetReturnCode(wxID_OK);
+ this->Show(FALSE);
+ }
+ }
+}
-bool wxDialog::Show( bool show )
+void wxDialog::OnApply(wxCommandEvent& event)
{
- if (!show && IsModal() && m_modalShowing)
- {
- EndModal( wxID_CANCEL );
- };
+ if (Validate())
+ TransferDataFromWindow();
+ // TODO probably need to disable the Apply button until things change again
+}
- wxWindow::Show( show );
-
- if (show) InitDialog();
-
- return TRUE;
-};
+void wxDialog::OnCancel(wxCommandEvent& event)
+{
+ if ( IsModal() )
+ EndModal(wxID_CANCEL);
+ else
+ {
+ SetReturnCode(wxID_CANCEL);
+ this->Show(FALSE);
+ }
+}
-int wxDialog::ShowModal(void)
+void wxDialog::OnCloseWindow(wxCloseEvent& event)
{
- if (m_modalShowing) return GetReturnCode();
+ // We'll send a Cancel message by default,
+ // which may close the dialog.
+ // Check for looping if the Cancel event handler calls Close().
- Show( TRUE );
-
- m_modalShowing = TRUE;
-
- // grab here
- // main here
- // release here
-
- return GetReturnCode();
-};
+ // 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 closing;
+
+ if ( closing.Member(this) )
+ return;
+
+ closing.Append(this);
+
+ wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
+ cancelEvent.SetEventObject( this );
+ GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog
+
+ closing.DeleteObject(this);
+}
-void wxDialog::EndModal( int retCode )
+// Destroy the window (delayed, if a managed window)
+bool wxDialog::Destroy()
{
- SetReturnCode( retCode );
-
- if (!m_modalShowing) return;
- m_modalShowing = FALSE;
-
- // quit main
-};
+ if (!wxPendingDelete.Member(this))
+ wxPendingDelete.Append(this);
+ return TRUE;
+}
-void wxDialog::InitDialog(void)
+void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event)
{
- wxWindow::InitDialog();
-};
+ SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
+ Refresh();
+}