From 70024cfb08196f1e154b03fec3ba1b4368ab9f36 Mon Sep 17 00:00:00 2001 From: David Elliott Date: Fri, 13 Jun 2003 20:29:48 +0000 Subject: [PATCH] Proposed wxMac MDI interface (in limbo) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21128 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/mac/mdi.h | 7 +++ src/mac/carbon/mdi.cpp | 108 +++++++++++++++++++++++++++++++++++++---- src/mac/mdi.cpp | 108 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 203 insertions(+), 20 deletions(-) diff --git a/include/wx/mac/mdi.h b/include/wx/mac/mdi.h index c66b4ee2c3..d92254fe4d 100644 --- a/include/wx/mac/mdi.h +++ b/include/wx/mac/mdi.h @@ -54,6 +54,10 @@ public: long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL, const wxString& name = wxFrameNameStr); + // Mac OS activate event + virtual void MacActivate(long timestamp, bool activating); + + // wxWindows activate event void OnActivate(wxActivateEvent& event); void OnSysColourChanged(wxSysColourChangedEvent& event); @@ -119,6 +123,9 @@ public: long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxFrameNameStr); + // Mac OS activate event + virtual void MacActivate(long timestamp, bool activating); + // Set menu bar void SetMenuBar(wxMenuBar *menu_bar); diff --git a/src/mac/carbon/mdi.cpp b/src/mac/carbon/mdi.cpp index de481635e2..ef00515991 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; @@ -92,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(); @@ -127,24 +129,57 @@ void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar) wxFrame::SetMenuBar( menu_bar ) ; } -void wxMDIParentFrame::OnActivate(wxActivateEvent& event) +void wxMDIParentFrame::MacActivate(long timestamp, bool activating) { - if ( m_currentChild && event.GetActive() ) + wxLogDebug("MDI PARENT=%p MacActivate(0x%08lx,%s)",this,timestamp,activating?"ACTIV":"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("child had been scheduled for deactivation, rehighlighting"); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); + wxLogDebug("done highliting child"); + s_macDeactivateWindow = NULL; + } + else if(s_macDeactivateWindow == this) + { + wxLogDebug("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("window=%p SHOULD have been deactivated, oh well!",s_macDeactivateWindow); + wxLogDebug("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 { @@ -232,6 +267,10 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, wxMDIChildFrame::~wxMDIChildFrame() { + wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame); + wxASSERT(mdiparent); + if(mdiparent->m_currentChild == this) + mdiparent->m_currentChild = NULL; DestroyChildren(); // already delete by DestroyChildren() m_frameToolBar = NULL; @@ -243,6 +282,55 @@ void wxMDIChildFrame::SetMenuBar(wxMenuBar *menu_bar) return wxFrame::SetMenuBar( menu_bar ) ; } +void wxMDIChildFrame::MacActivate(long timestamp, bool activating) +{ + wxLogDebug("MDI child=%p MacActivate(0x%08lx,%s)",this,timestamp,activating?"ACTIV":"deact"); + wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame); + wxASSERT(mdiparent); + if(activating) + { + if(s_macDeactivateWindow == m_parent) + { + wxLogDebug("parent had been scheduled for deactivation, rehighlighting"); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); + wxLogDebug("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("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("window=%p SHOULD have been deactivated, oh well!",s_macDeactivateWindow); + wxLogDebug("Scheduling delayed deactivation"); + s_macDeactivateWindow = this; + } + } +} + // MDI operations void wxMDIChildFrame::Maximize() { diff --git a/src/mac/mdi.cpp b/src/mac/mdi.cpp index de481635e2..ef00515991 100644 --- a/src/mac/mdi.cpp +++ b/src/mac/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; @@ -92,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(); @@ -127,24 +129,57 @@ void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar) wxFrame::SetMenuBar( menu_bar ) ; } -void wxMDIParentFrame::OnActivate(wxActivateEvent& event) +void wxMDIParentFrame::MacActivate(long timestamp, bool activating) { - if ( m_currentChild && event.GetActive() ) + wxLogDebug("MDI PARENT=%p MacActivate(0x%08lx,%s)",this,timestamp,activating?"ACTIV":"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("child had been scheduled for deactivation, rehighlighting"); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); + wxLogDebug("done highliting child"); + s_macDeactivateWindow = NULL; + } + else if(s_macDeactivateWindow == this) + { + wxLogDebug("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("window=%p SHOULD have been deactivated, oh well!",s_macDeactivateWindow); + wxLogDebug("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 { @@ -232,6 +267,10 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, wxMDIChildFrame::~wxMDIChildFrame() { + wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame); + wxASSERT(mdiparent); + if(mdiparent->m_currentChild == this) + mdiparent->m_currentChild = NULL; DestroyChildren(); // already delete by DestroyChildren() m_frameToolBar = NULL; @@ -243,6 +282,55 @@ void wxMDIChildFrame::SetMenuBar(wxMenuBar *menu_bar) return wxFrame::SetMenuBar( menu_bar ) ; } +void wxMDIChildFrame::MacActivate(long timestamp, bool activating) +{ + wxLogDebug("MDI child=%p MacActivate(0x%08lx,%s)",this,timestamp,activating?"ACTIV":"deact"); + wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame); + wxASSERT(mdiparent); + if(activating) + { + if(s_macDeactivateWindow == m_parent) + { + wxLogDebug("parent had been scheduled for deactivation, rehighlighting"); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); + wxLogDebug("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("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("window=%p SHOULD have been deactivated, oh well!",s_macDeactivateWindow); + wxLogDebug("Scheduling delayed deactivation"); + s_macDeactivateWindow = this; + } + } +} + // MDI operations void wxMDIChildFrame::Maximize() { -- 2.47.2