X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c78e7c70271608b076b1dbed201b1204e6898d4..47c13eb766e12deeed992f46f0632c5edb6475fe:/src/qt/dialog.cpp diff --git a/src/qt/dialog.cpp b/src/qt/dialog.cpp index dffc5f64a9..d49b4cf98c 100644 --- a/src/qt/dialog.cpp +++ b/src/qt/dialog.cpp @@ -1,10 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// // 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 ///////////////////////////////////////////////////////////////////////////// @@ -13,179 +14,278 @@ #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(); +}