X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..84be293d47d586ed72b1a8da0f1e76636a30063b:/src/mac/carbon/mdi.cpp diff --git a/src/mac/carbon/mdi.cpp b/src/mac/carbon/mdi.cpp index 1d9e43f170..1cdfc54d3b 100644 --- a/src/mac/carbon/mdi.cpp +++ b/src/mac/carbon/mdi.cpp @@ -16,8 +16,10 @@ #include "wx/mdi.h" #include "wx/menu.h" #include "wx/settings.h" +#include "wx/log.h" #include "wx/mac/private.h" +#include "wx/mac/uma.h" extern wxWindowList wxModelessWindows; @@ -27,7 +29,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame) IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow) BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame) - EVT_SIZE(wxMDIParentFrame::OnSize) EVT_ACTIVATE(wxMDIParentFrame::OnActivate) EVT_SYS_COLOUR_CHANGED(wxMDIParentFrame::OnSysColourChanged) END_EVENT_TABLE() @@ -93,7 +94,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent, m_windowMenu->Append(IDM_WINDOWNEXT, wxT("&Next")); } - wxFrame::Create( parent , id , title , wxPoint( 2000 , 2000 ) , size , style , name ) ; + wxFrame::Create( parent , id , title , pos , size , style , name ) ; m_parentFrameActive = TRUE; OnCreateClient(); @@ -105,8 +106,12 @@ wxMDIParentFrame::~wxMDIParentFrame() { DestroyChildren(); // already delete by DestroyChildren() +#if wxUSE_TOOLBAR m_frameToolBar = NULL; +#endif +#if wxUSE_STATUSBAR m_frameStatusBar = NULL; +#endif m_clientWindow = NULL ; if (m_windowMenu) @@ -123,50 +128,62 @@ wxMDIParentFrame::~wxMDIParentFrame() } -// Get size *available for subwindows* i.e. excluding menu bar. -void wxMDIParentFrame::DoGetClientSize(int *x, int *y) const -{ - wxDisplaySize( x , y ) ; -} - void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar) { wxFrame::SetMenuBar( menu_bar ) ; } -void wxMDIParentFrame::OnSize(wxSizeEvent& event) -{ -#if wxUSE_CONSTRAINTS - if (GetAutoLayout()) - Layout(); -#endif - int x = 0; - int y = 0; - int width, height; - GetClientSize(&width, &height); - - if ( GetClientWindow() ) - GetClientWindow()->SetSize(x, y, width, height); -} - -void wxMDIParentFrame::OnActivate(wxActivateEvent& event) +void wxMDIParentFrame::MacActivate(long timestamp, bool activating) { - if ( m_currentChild && event.GetActive() ) + wxLogDebug(wxT("MDI PARENT=%p MacActivate(0x%08lx,%s)"),this,timestamp,activating?wxT("ACTIV"):wxT("deact")); + if(activating) { - wxActivateEvent event(wxEVT_ACTIVATE, TRUE, m_currentChild->GetId()); - event.SetEventObject( m_currentChild ); - m_currentChild->GetEventHandler()->ProcessEvent(event) ; + if(s_macDeactivateWindow && s_macDeactivateWindow->GetParent()==this) + { + wxLogDebug(wxT("child had been scheduled for deactivation, rehighlighting")); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); + wxLogDebug(wxT("done highliting child")); + s_macDeactivateWindow = NULL; + } + else if(s_macDeactivateWindow == this) + { + wxLogDebug(wxT("Avoided deactivation/activation of this=%p"), this); + s_macDeactivateWindow = NULL; + } + else // window to deactivate is NULL or is not us or one of our kids + { + // activate kid instead + if(m_currentChild) + m_currentChild->MacActivate(timestamp,activating); + else + wxFrame::MacActivate(timestamp,activating); + } } - else if ( event.GetActive() ) + else { - if ( m_frameMenuBar != NULL ) + // We were scheduled for deactivation, and now we do it. + if(s_macDeactivateWindow==this) { - m_frameMenuBar->MacInstallMenuBar() ; + s_macDeactivateWindow = NULL; + if(m_currentChild) + m_currentChild->MacActivate(timestamp,activating); + wxFrame::MacActivate(timestamp,activating); + } + else // schedule ourselves for deactivation + { + if(s_macDeactivateWindow) + wxLogDebug(wxT("window=%p SHOULD have been deactivated, oh well!"),s_macDeactivateWindow); + wxLogDebug(wxT("Scheduling delayed MDI Parent deactivation")); + s_macDeactivateWindow = this; } - } } +void wxMDIParentFrame::OnActivate(wxActivateEvent& event) +{ + event.Skip(); +} + // Returns the active MDI child window wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const { @@ -245,19 +262,26 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ; - m_macWindowBackgroundTheme = kThemeBrushDocumentWindowBackground ; - SetThemeWindowBackground( (WindowRef) m_macWindow , m_macWindowBackgroundTheme , false ) ; - + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); + wxModelessWindows.Append(this); return FALSE; } wxMDIChildFrame::~wxMDIChildFrame() { + wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame); + wxASSERT(mdiparent); + if(mdiparent->m_currentChild == this) + mdiparent->m_currentChild = NULL; DestroyChildren(); // already delete by DestroyChildren() +#if wxUSE_TOOLBAR m_frameToolBar = NULL; +#endif +#if wxUSE_STATUSBAR m_frameStatusBar = NULL; +#endif } void wxMDIChildFrame::SetMenuBar(wxMenuBar *menu_bar) @@ -265,6 +289,55 @@ void wxMDIChildFrame::SetMenuBar(wxMenuBar *menu_bar) return wxFrame::SetMenuBar( menu_bar ) ; } +void wxMDIChildFrame::MacActivate(long timestamp, bool activating) +{ + wxLogDebug(wxT("MDI child=%p MacActivate(0x%08lx,%s)"),this,timestamp,activating?wxT("ACTIV"):wxT("deact")); + wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame); + wxASSERT(mdiparent); + if(activating) + { + if(s_macDeactivateWindow == m_parent) + { + wxLogDebug(wxT("parent had been scheduled for deactivation, rehighlighting")); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); + wxLogDebug(wxT("done highliting parent")); + s_macDeactivateWindow = NULL; + } + else if((mdiparent->m_currentChild==this) || !s_macDeactivateWindow) + mdiparent->wxFrame::MacActivate(timestamp,activating); + + if(mdiparent->m_currentChild && mdiparent->m_currentChild!=this) + mdiparent->m_currentChild->wxFrame::MacActivate(timestamp,false); + mdiparent->m_currentChild = this; + + if(s_macDeactivateWindow==this) + { + wxLogDebug(wxT("Avoided deactivation/activation of this=%p"),this); + s_macDeactivateWindow=NULL; + } + else + wxFrame::MacActivate(timestamp, activating); + } + else + { + // We were scheduled for deactivation, and now we do it. + if(s_macDeactivateWindow==this) + { + s_macDeactivateWindow = NULL; + wxFrame::MacActivate(timestamp,activating); + if(mdiparent->m_currentChild==this) + mdiparent->wxFrame::MacActivate(timestamp,activating); + } + else // schedule ourselves for deactivation + { + if(s_macDeactivateWindow) + wxLogDebug(wxT("window=%p SHOULD have been deactivated, oh well!"),s_macDeactivateWindow); + wxLogDebug(wxT("Scheduling delayed deactivation")); + s_macDeactivateWindow = this; + } + } +} + // MDI operations void wxMDIChildFrame::Maximize() { @@ -295,19 +368,19 @@ wxMDIClientWindow::~wxMDIClientWindow() bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) { - - m_windowId = (int)NewControlId(); - - if ( parent ) - { - parent->AddChild(this); - } - m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE); + if ( !wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style)) + return FALSE; wxModelessWindows.Append(this); return TRUE; } +// Get size *available for subwindows* i.e. excluding menu bar. +void wxMDIClientWindow::DoGetClientSize(int *x, int *y) const +{ + wxDisplaySize( x , y ) ; +} + // Explicitly call default scroll behaviour void wxMDIClientWindow::OnScroll(wxScrollEvent& event) {