X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/519cb848a8f4c91c73421bb75314754284e593a4..8290d43d0d43369d007f1c47abf98a45da461a30:/src/mac/dialog.cpp?ds=sidebyside diff --git a/src/mac/dialog.cpp b/src/mac/dialog.cpp index 7e82133eb2..d75706f6a3 100644 --- a/src/mac/dialog.cpp +++ b/src/mac/dialog.cpp @@ -27,7 +27,6 @@ wxList wxModalDialogs; wxList wxModelessWindows; // Frames and modeless dialogs extern wxList wxPendingDelete; -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel) BEGIN_EVENT_TABLE(wxDialog, wxPanel) @@ -40,10 +39,11 @@ BEGIN_EVENT_TABLE(wxDialog, wxPanel) EVT_CLOSE(wxDialog::OnCloseWindow) END_EVENT_TABLE() -#endif wxDialog::wxDialog() { + m_isShown = FALSE; + m_modalShowing = FALSE; SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); } @@ -55,7 +55,12 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, const wxString& name) { m_windowStyle = style; + m_isShown = FALSE; + m_modalShowing = FALSE; +#if wxUSE_TOOLTIPS + m_hwndToolTip = 0; +#endif SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); SetName(name); @@ -108,7 +113,6 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, m_macWindowData->m_macWindowBackgroundTheme = kThemeBrushDialogBackgroundActive ; UMACreateRootControl( m_macWindowData->m_macWindow , &m_macWindowData->m_macRootControl ) ; m_macWindowData->m_macFocus = NULL ; - m_macShown = false ; return TRUE; } @@ -127,10 +131,13 @@ void wxDialog::SetModal(bool flag) wxDialog::~wxDialog() { + m_isBeingDeleted = TRUE ; wxTopLevelWindows.DeleteObject(this); - if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL ) - wxModelessWindows.DeleteObject(this); + m_modalShowing = FALSE; + + if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL ) + wxModelessWindows.DeleteObject(this); // If this is the last top-level window, exit. if (wxTheApp && (wxTopLevelWindows.Number() == 0)) @@ -163,50 +170,98 @@ void wxDialog::OnCharHook(wxKeyEvent& event) void wxDialog::Iconize(bool WXUNUSED(iconize)) { - // TODO + // mac dialogs cannot be iconized } bool wxDialog::IsIconized() const { - // TODO + // mac dialogs cannot be iconized return FALSE; } +void wxDialog::DoSetClientSize(int width, int height) +{ + wxWindow::DoSetClientSize( width , height ) ; +} + +void wxDialog::GetPosition(int *x, int *y) const +{ + DoGetPosition( x , y ) ; +} + +bool wxDialog::IsShown() const +{ + return m_isShown; +} + +bool wxDialog::IsModal() const +{ + return wxModalDialogs.Find((wxDialog *)this) != 0; // const_cast +} + + extern bool s_macIsInModalLoop ; bool wxDialog::Show(bool show) { - if ( m_macShown == show ) - return TRUE ; + m_isShown = show; - m_macShown = show ; + if (show) + InitDialog(); bool modal = ((GetWindowStyleFlag() & wxDIALOG_MODAL) == wxDIALOG_MODAL) ; +#if WXGARBAGE_COLLECTION_ON /* MATTHEW: GC */ + if (!modal) + { + if (show) + { + if (!wxModelessWindows.Find(this)) + wxModelessWindows.Append(this); + } + else + wxModelessWindows.DeleteObject(this); + } + if (show) + { + if (!wxTopLevelWindows.Find(this)) + wxTopLevelWindows.Append(this); + } + else + wxTopLevelWindows.DeleteObject(this); +#endif + if ( modal ) { s_macIsInModalLoop = true ; - if (show) - { - // if we don't do it, some window might be deleted while we have pointers - // to them in our disabledWindows list and the program will crash when it - // will try to reenable them after the modal dialog end - wxTheApp->DeletePendingObjects(); - - UMAShowWindow( m_macWindowData->m_macWindow ) ; - UMASelectWindow( m_macWindowData->m_macWindow ) ; - - if (!wxModalDialogs.Member(this)) - wxModalDialogs.Append(this); - - while (wxModalDialogs.Member(this) ) - { - wxTheApp->MacDoOneEvent() ; - } + if (show) + { + if (m_modalShowing) + { +// BringWindowToTop((HWND) GetHWND()); + return TRUE; + } + + m_modalShowing = TRUE; + // if we don't do it, some window might be deleted while we have pointers + // to them in our disabledWindows list and the program will crash when it + // will try to reenable them after the modal dialog end + wxTheApp->DeletePendingObjects(); + + UMAShowWindow( m_macWindowData->m_macWindow ) ; + UMASelectWindow( m_macWindowData->m_macWindow ) ; + + if (!wxModalDialogs.Member(this)) + wxModalDialogs.Append(this); + + while (wxModalDialogs.Member(this) ) + { + wxTheApp->MacDoOneEvent() ; + } } else { - wxModalDialogs.DeleteObject(this); + wxModalDialogs.DeleteObject(this); UMAHideWindow( m_macWindowData->m_macWindow ) ; } s_macIsInModalLoop = false ; @@ -226,42 +281,79 @@ bool wxDialog::Show(bool show) return TRUE ; } +void wxDialog::SetTitle(const wxString& title) +{ + wxWindow::SetTitle( title ) ; +} + +wxString wxDialog::GetTitle() const +{ + return wxWindow::GetTitle() ; +} + +void wxDialog::Centre(int direction) +{ + int x_offset,y_offset ; + int display_width, display_height; + int width, height, x, y; + wxWindow *parent = GetParent(); + if ((direction & wxCENTER_FRAME) && parent) + { + parent->GetPosition(&x_offset,&y_offset) ; + parent->GetSize(&display_width,&display_height) ; + } + else + { + wxDisplaySize(&display_width, &display_height); + x_offset = 0 ; + y_offset = 0 ; + } + + GetSize(&width, &height); + GetPosition(&x, &y); + + if (direction & wxHORIZONTAL) + x = (int)((display_width - width)/2); + if (direction & wxVERTICAL) + y = (int)((display_height - height)/2); + + SetSize(x+x_offset, y+y_offset, width, height); +} // Replacement for Show(TRUE) for modal dialogs - returns return code int wxDialog::ShowModal() { m_windowStyle |= wxDIALOG_MODAL; - Show(TRUE); - return GetReturnCode(); + Show(TRUE); + return GetReturnCode(); } void wxDialog::EndModal(int retCode) { - SetReturnCode(retCode); - // TODO modal un-showing - Show(FALSE); + SetReturnCode(retCode); + Show(FALSE); } // Standard buttons void wxDialog::OnOK(wxCommandEvent& event) { - if ( Validate() && TransferDataFromWindow() ) - { + if ( Validate() && TransferDataFromWindow() ) + { if ( IsModal() ) EndModal(wxID_OK); else { - SetReturnCode(wxID_OK); - this->Show(FALSE); + SetReturnCode(wxID_OK); + this->Show(FALSE); } - } + } } void wxDialog::OnApply(wxCommandEvent& event) { - if (Validate()) - TransferDataFromWindow(); - // TODO probably need to disable the Apply button until things change again + if (Validate()) + TransferDataFromWindow(); + // TODO probably need to disable the Apply button until things change again } void wxDialog::OnCancel(wxCommandEvent& event) @@ -271,10 +363,17 @@ void wxDialog::OnCancel(wxCommandEvent& event) else { SetReturnCode(wxID_CANCEL); - this->Show(FALSE); + this->Show(FALSE); } } +void wxDialog::OnPaint(wxPaintEvent& event) +{ + // No: if you call the default procedure, it makes + // the following painting code not work. +// wxWindow::OnPaint(event); +} + void wxDialog::OnCloseWindow(wxCloseEvent& event) { // We'll send a Cancel message by default, @@ -292,12 +391,12 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event) // 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 @@ -317,7 +416,8 @@ void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event)) { // if we're using constraints - do use them #if wxUSE_CONSTRAINTS - if ( GetAutoLayout() ) { + if ( GetAutoLayout() ) + { Layout(); } #endif @@ -334,125 +434,3 @@ void wxDialog::Fit() wxWindow::Fit(); } -wxSizer *wxDialog::CreateTextSizer( const wxString &message ) -{ - wxBoxSizer *box = new wxBoxSizer( wxVERTICAL ); - - // get line height for empty lines - int y = 0; - wxFont new_font( GetFont() ); - if (!new_font.Ok()) new_font = *wxSWISS_FONT; - GetTextExtent( "H", (int*)NULL, &y, (int*)NULL, (int*)NULL, &new_font ); - - wxString line; - for (size_t pos = 0; pos < message.Len(); pos++) - { - if (message[pos] == _T('\n')) - { - if (!line.IsEmpty()) - { - wxStaticText *s1 = new wxStaticText( this, -1, line ); - box->Add( s1 ); - line = _T(""); - } - else - { - box->Add( 5, y ); - } - } - else - { - line += message[pos]; - } - } - - // remaining text behind last '\n' - if (!line.IsEmpty()) - { - wxStaticText *s2 = new wxStaticText( this, -1, line ); - box->Add( s2 ); - } - - return box; -} - -wxSizer *wxDialog::CreateButtonSizer( long flags ) -{ - wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL ); - -#if defined(__WXMSW__) || defined(__WXMAC__) - int margin = 6; -#else - int margin = 10; -#endif - - wxButton *ok = (wxButton *) NULL; - wxButton *cancel = (wxButton *) NULL; - wxButton *yes = (wxButton *) NULL; - wxButton *no = (wxButton *) NULL; - - // always show an OK button, unless only YES_NO is given - if ((flags & wxYES_NO) == 0) flags = flags | wxOK; - - if (flags & wxYES_NO) - { - yes = new wxButton( this, wxID_YES, _("Yes") ); - box->Add( yes, 0, wxLEFT|wxRIGHT, margin ); - no = new wxButton( this, wxID_NO, _("No") ); - box->Add( no, 0, wxLEFT|wxRIGHT, margin ); - } else - if (flags & wxYES) - { - yes = new wxButton( this, wxID_YES, _("Yes") ); - box->Add( yes, 0, wxLEFT|wxRIGHT, margin ); - } else - if (flags & wxNO) - { - no = new wxButton( this, wxID_NO, _("No") ); - box->Add( no, 0, wxLEFT|wxRIGHT, margin ); - } - - if (flags & wxOK) - { - ok = new wxButton( this, wxID_OK, _("OK") ); - box->Add( ok, 0, wxLEFT|wxRIGHT, margin ); - } - - if (flags & wxFORWARD) - box->Add( new wxButton( this, wxID_FORWARD, _("Forward") ), 0, wxLEFT|wxRIGHT, margin ); - - if (flags & wxBACKWARD) - box->Add( new wxButton( this, wxID_BACKWARD, _("Backward") ), 0, wxLEFT|wxRIGHT, margin ); - - if (flags & wxSETUP) - box->Add( new wxButton( this, wxID_SETUP, _("Setup") ), 0, wxLEFT|wxRIGHT, margin ); - - if (flags & wxMORE) - box->Add( new wxButton( this, wxID_MORE, _("More...") ), 0, wxLEFT|wxRIGHT, margin ); - - if (flags & wxHELP) - box->Add( new wxButton( this, wxID_HELP, _("Help") ), 0, wxLEFT|wxRIGHT, margin ); - - if (flags & wxCANCEL) - { - cancel = new wxButton( this, wxID_CANCEL, _("Cancel") ); - box->Add( cancel, 0, wxLEFT|wxRIGHT, margin ); - } - - if ((flags & wxNO_DEFAULT) == 0) - { - if (ok) - { - ok->SetDefault(); - ok->SetFocus(); - } - else if (yes) - { - yes->SetDefault(); - yes->SetFocus(); - } - } - - return box; -} -