X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/524c47aa3adf2af11a3069fd5da035a604f08f66..cd95f7e65c4e1ee61a5d90eb13687ff468cb13ad:/src/osx/carbon/frame.cpp diff --git a/src/osx/carbon/frame.cpp b/src/osx/carbon/frame.cpp index 17df9bcf0d..e7c53a27aa 100644 --- a/src/osx/carbon/frame.cpp +++ b/src/osx/carbon/frame.cpp @@ -29,10 +29,9 @@ BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) EVT_ACTIVATE(wxFrame::OnActivate) EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) + EVT_SIZE(wxFrame::OnSize) END_EVENT_TABLE() -IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow) - #define WX_MAC_STATUSBAR_HEIGHT 18 // ---------------------------------------------------------------------------- @@ -52,7 +51,6 @@ bool wxFrame::Create(wxWindow *parent, long style, const wxString& name) { - if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) ) return false; @@ -61,7 +59,8 @@ bool wxFrame::Create(wxWindow *parent, wxFrame::~wxFrame() { - m_isBeingDeleted = true; + SendDestroyEvent(); + DeleteAllBars(); } @@ -77,11 +76,11 @@ wxPoint wxFrame::GetClientAreaOrigin() const int w, h; toolbar->GetSize(&w, &h); - if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) + if ( toolbar->HasFlag(wxTB_LEFT) ) { pt.x += w; } - else + else if ( toolbar->HasFlag(wxTB_TOP) ) { #if !wxOSX_USE_NATIVE_TOOLBAR pt.y += h; @@ -99,7 +98,9 @@ bool wxFrame::Enable(bool enable) return false; #if wxUSE_MENUS - if ( m_frameMenuBar && m_frameMenuBar == wxMenuBar::MacGetInstalledMenuBar() ) + // we should always enable/disable the menubar, even if we are not current, otherwise + // we might miss some state change later (happened eg in the docview sample after PrintPreview) + if ( m_frameMenuBar /*&& m_frameMenuBar == wxMenuBar::MacGetInstalledMenuBar()*/) { int iMaxMenu = m_frameMenuBar->GetMenuCount(); for ( int i = 0 ; i < iMaxMenu ; ++ i ) @@ -150,7 +151,7 @@ void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) wxSysColourChangedEvent event2; event2.SetEventObject( m_frameStatusBar ); - m_frameStatusBar->ProcessEvent(event2); + m_frameStatusBar->GetEventHandler()->ProcessEvent(event2); } #endif // wxUSE_STATUSBAR @@ -215,22 +216,17 @@ void wxFrame::OnActivate(wxActivateEvent& event) } } -void wxFrame::HandleResized( long timestamp ) -{ - // according to the other ports we handle this within the OS level - // resize event, not within a wxSizeEvent +void wxFrame::OnSize(wxSizeEvent& event) +{ PositionBars(); - - wxNonOwnedWindow::HandleResized( timestamp ); + + event.Skip(); } #if wxUSE_MENUS void wxFrame::DetachMenuBar() { - if ( m_frameMenuBar ) - m_frameMenuBar->UnsetInvokingWindow(); - wxFrameBase::DetachMenuBar(); } @@ -254,7 +250,6 @@ void wxFrame::AttachMenuBar( wxMenuBar *menuBar ) if (m_frameMenuBar) { - m_frameMenuBar->SetInvokingWindow( this ); if (makeCurrent) m_frameMenuBar->MacInstallMenuBar(); } @@ -277,11 +272,16 @@ void wxFrame::DoGetClientSize(int *x, int *y) const int w, h; toolbar->GetSize(&w, &h); - if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) + if ( toolbar->IsVertical() ) { if ( x ) *x -= w; } + else if ( toolbar->HasFlag( wxTB_BOTTOM ) ) + { + if ( y ) + *y -= h; + } else { #if !wxOSX_USE_NATIVE_TOOLBAR @@ -334,17 +334,20 @@ void wxFrame::SetToolBar(wxToolBar *toolbar) if ( m_frameToolBar == toolbar ) return ; +#ifndef __WXOSX_IPHONE__ #if wxOSX_USE_NATIVE_TOOLBAR if ( m_frameToolBar ) m_frameToolBar->MacInstallNativeToolbar( false ) ; #endif - +#endif m_frameToolBar = toolbar ; +#ifndef __WXOSX_IPHONE__ #if wxOSX_USE_NATIVE_TOOLBAR if ( toolbar ) toolbar->MacInstallNativeToolbar( true ) ; #endif +#endif } wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name) @@ -359,39 +362,50 @@ void wxFrame::PositionToolBar() { int cw, ch; - GetSize( &cw , &ch ) ; - + wxTopLevelWindow::DoGetClientSize( &cw , &ch ); + int statusX = 0 ; int statusY = 0 ; #if wxUSE_STATUSBAR if (GetStatusBar() && GetStatusBar()->IsShown()) { - GetStatusBar()->GetClientSize(&statusX, &statusY); + GetStatusBar()->GetSize(&statusX, &statusY); ch -= statusY; } #endif +#ifdef __WXOSX_IPHONE__ + // TODO integrate this in a better way, on iphone the status bar is not a child of the content view + // but the toolbar is + ch -= 20; +#endif + if (GetToolBar()) { int tx, ty, tw, th; tx = ty = 0 ; GetToolBar()->GetSize(&tw, &th); - if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL) + if (GetToolBar()->HasFlag(wxTB_LEFT)) + { + // Use the 'real' position. wxSIZE_NO_ADJUSTMENTS + // means, pretend we don't have toolbar/status bar, so we + // have the original client size. + GetToolBar()->SetSize(tx , ty , tw, ch , wxSIZE_NO_ADJUSTMENTS ); + } + else if (GetToolBar()->HasFlag(wxTB_RIGHT)) { // Use the 'real' position. wxSIZE_NO_ADJUSTMENTS // means, pretend we don't have toolbar/status bar, so we // have the original client size. + tx = cw - tw; GetToolBar()->SetSize(tx , ty , tw, ch , wxSIZE_NO_ADJUSTMENTS ); } - else if (GetToolBar()->GetWindowStyleFlag() & wxTB_BOTTOM) + else if (GetToolBar()->HasFlag(wxTB_BOTTOM)) { - //FIXME: this positions the tool bar almost correctly, but still it doesn't work right yet, - //as 1) the space for the 'old' top toolbar is still taken up, and 2) the toolbar - //doesn't extend it's width to the width of the frame. tx = 0; - ty = ch - (th + statusY); + ty = ch - th; GetToolBar()->SetSize(tx, ty, cw, th, wxSIZE_NO_ADJUSTMENTS ); } else