X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/38c8fce8c4348a61a1e55da13142b84e44924845..8d1547ef4697a49cf4f4b8f09f662705e064c416:/src/mac/carbon/mdi.cpp diff --git a/src/mac/carbon/mdi.cpp b/src/mac/carbon/mdi.cpp index c3951ca0e1..ef630d2fc8 100644 --- a/src/mac/carbon/mdi.cpp +++ b/src/mac/carbon/mdi.cpp @@ -1,20 +1,21 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: mdi.cpp +// Name: src/mac/carbon/mdi.cpp // Purpose: MDI classes // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" #if wxUSE_MDI +#include "wx/mdi.h" + #ifndef WX_PRECOMP - #include "wx/mdi.h" #include "wx/log.h" #include "wx/menu.h" #include "wx/settings.h" @@ -31,30 +32,21 @@ IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame) IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow) BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame) - EVT_ACTIVATE(wxMDIParentFrame::OnActivate) - EVT_SYS_COLOUR_CHANGED(wxMDIParentFrame::OnSysColourChanged) + EVT_ACTIVATE(wxMDIParentFrame::OnActivate) + EVT_SYS_COLOUR_CHANGED(wxMDIParentFrame::OnSysColourChanged) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxMDIClientWindow, wxWindow) - EVT_SCROLL(wxMDIClientWindow::OnScroll) + EVT_SCROLL(wxMDIClientWindow::OnScroll) END_EVENT_TABLE() static const wxChar *TRACE_MDI = _T("mdi"); -static const int IDM_WINDOWTILE = 4001; static const int IDM_WINDOWTILEHOR = 4001; static const int IDM_WINDOWCASCADE = 4002; static const int IDM_WINDOWICONS = 4003; static const int IDM_WINDOWNEXT = 4004; static const int IDM_WINDOWTILEVERT = 4005; -static const int IDM_WINDOWPREV = 4006; - -// This range gives a maximum of 500 MDI children. Should be enough :-) -static const int wxFIRST_MDI_CHILD = 4100; -static const int wxLAST_MDI_CHILD = 4600; - -// Status border dimensions -static const int wxTHICK_LINE_BORDER = 3; // ---------------------------------------------------------------------------- // Parent frame @@ -70,12 +62,12 @@ void wxMDIParentFrame::Init() } bool wxMDIParentFrame::Create(wxWindow *parent, - wxWindowID id, - const wxString& title, - const wxPoint& pos, - const wxSize& size, - long style, - const wxString& name) + wxWindowID id, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) { // this style can be used to prevent a window from having the standard MDI // "Window" menu @@ -87,7 +79,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent, else // normal case: we have the window menu, so construct it { m_windowMenu = new wxMenu; - + m_windowMenu->Append(IDM_WINDOWCASCADE, wxT("&Cascade")); m_windowMenu->Append(IDM_WINDOWTILEHOR, wxT("Tile &Horizontally")); m_windowMenu->Append(IDM_WINDOWTILEVERT, wxT("Tile &Vertically")); @@ -95,25 +87,25 @@ bool wxMDIParentFrame::Create(wxWindow *parent, m_windowMenu->Append(IDM_WINDOWICONS, wxT("&Arrange Icons")); m_windowMenu->Append(IDM_WINDOWNEXT, wxT("&Next")); } - + wxFrame::Create( parent , id , title , pos , size , style , name ) ; m_parentFrameActive = true; - + OnCreateClient(); - + return true; } wxMDIParentFrame::~wxMDIParentFrame() { DestroyChildren(); + // already deleted by DestroyChildren() m_clientWindow = NULL ; - + delete m_windowMenu; } - void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar) { wxFrame::SetMenuBar( menu_bar ) ; @@ -121,15 +113,19 @@ void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar) void wxMDIParentFrame::GetRectForTopLevelChildren(int *x, int *y, int *w, int *h) { - if(x) + if (x) *x = 0; - if(y) + if (y) *y = 0; - wxDisplaySize(w,h); + + wxDisplaySize(w, h); } void wxMDIParentFrame::AddChild(wxWindowBase *child) { + // moved this to front, so that we don't run into unset m_parent problems later + wxFrame::AddChild(child); + if ( !m_currentChild ) { m_currentChild = wxDynamicCast(child, wxMDIChildFrame); @@ -141,8 +137,6 @@ void wxMDIParentFrame::AddChild(wxWindowBase *child) m_shouldBeShown = true; } } - - wxFrame::AddChild(child); } void wxMDIParentFrame::RemoveChild(wxWindowBase *child) @@ -185,45 +179,51 @@ void wxMDIParentFrame::RemoveChild(wxWindowBase *child) void wxMDIParentFrame::MacActivate(long timestamp, bool activating) { - wxLogTrace(TRACE_MDI, wxT("MDI PARENT=%p MacActivate(0x%08lx,%s)"),this,timestamp,activating?wxT("ACTIV"):wxT("deact")); - if(activating) + wxLogTrace(TRACE_MDI, wxT("MDI PARENT=%p MacActivate(0x%08lx,%s)"), this, timestamp, activating ? wxT("ACTIV") : wxT("deact")); + + if (activating) { - if(s_macDeactivateWindow && s_macDeactivateWindow->GetParent()==this) + if (s_macDeactivateWindow && s_macDeactivateWindow->GetParent() == this) { wxLogTrace(TRACE_MDI, wxT("child had been scheduled for deactivation, rehighlighting")); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); - wxLogTrace(TRACE_MDI, wxT("done highliting child")); + + wxLogTrace(TRACE_MDI, wxT("finished highliting child")); + s_macDeactivateWindow = NULL; } - else if(s_macDeactivateWindow == this) + else if (s_macDeactivateWindow == this) { wxLogTrace(TRACE_MDI, 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); + if (m_currentChild) + m_currentChild->MacActivate(timestamp, activating); else - wxFrame::MacActivate(timestamp,activating); + wxFrame::MacActivate(timestamp, activating); } } else { // We were scheduled for deactivation, and now we do it. - if(s_macDeactivateWindow==this) + if (s_macDeactivateWindow == this) { s_macDeactivateWindow = NULL; - if(m_currentChild) - m_currentChild->MacActivate(timestamp,activating); - wxFrame::MacActivate(timestamp,activating); + if (m_currentChild) + m_currentChild->MacActivate(timestamp, activating); + wxFrame::MacActivate(timestamp, activating); } else // schedule ourselves for deactivation { - if(s_macDeactivateWindow) - wxLogTrace(TRACE_MDI, wxT("window=%p SHOULD have been deactivated, oh well!"),s_macDeactivateWindow); + if (s_macDeactivateWindow) + wxLogTrace(TRACE_MDI, wxT("window=%p SHOULD have been deactivated, oh well!"), s_macDeactivateWindow); wxLogTrace(TRACE_MDI, wxT("Scheduling delayed MDI Parent deactivation")); + s_macDeactivateWindow = this; } } @@ -245,6 +245,7 @@ wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const wxMDIClientWindow *wxMDIParentFrame::OnCreateClient() { m_clientWindow = new wxMDIClientWindow( this ); + return m_clientWindow; } @@ -252,7 +253,7 @@ wxMDIClientWindow *wxMDIParentFrame::OnCreateClient() void wxMDIParentFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { // TODO - + // Propagate the event to the non-top-level children wxFrame::OnSysColourChanged(event); } @@ -294,9 +295,9 @@ bool wxMDIParentFrame::ShouldBeVisible() const if ( win->IsShown() && !wxDynamicCast(win, wxMDIChildFrame) #if wxUSE_STATUSBAR - && win != GetStatusBar() -#endif // wxUSE_STATUSBAR - && win != GetClientWindow() ) + && win != (wxWindow*) GetStatusBar() +#endif + && win != GetClientWindow() ) { // if we have a non-MDI child, do remain visible so that it could // be used @@ -321,6 +322,7 @@ bool wxMDIParentFrame::Show( bool show ) // don't make the window visible now but remember that we should // have had done it m_shouldBeShown = true; + return false; } } @@ -349,20 +351,22 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, const wxString& name) { SetName(name); - - if ( id > -1 ) - m_windowId = id; - else + + if ( id == wxID_ANY ) m_windowId = (int)NewControlId(); - - if (parent) parent->AddChild(this); - + else + m_windowId = id; + + if (parent) + parent->AddChild(this); + MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ; - + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); wxModelessWindows.Append(this); - return false; + + return true; } wxMDIChildFrame::~wxMDIChildFrame() @@ -377,29 +381,35 @@ void wxMDIChildFrame::SetMenuBar(wxMenuBar *menu_bar) void wxMDIChildFrame::MacActivate(long timestamp, bool activating) { - wxLogTrace(TRACE_MDI, wxT("MDI child=%p MacActivate(0x%08lx,%s)"),this,timestamp,activating?wxT("ACTIV"):wxT("deact")); + wxLogTrace(TRACE_MDI, 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 (activating) { - if(s_macDeactivateWindow == m_parent) + if (s_macDeactivateWindow == m_parent) { wxLogTrace(TRACE_MDI, wxT("parent had been scheduled for deactivation, rehighlighting")); + UMAHighlightAndActivateWindow((WindowRef)s_macDeactivateWindow->MacGetWindowRef(), true); - wxLogTrace(TRACE_MDI, wxT("done highliting parent")); + + wxLogTrace(TRACE_MDI, wxT("finished 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); + 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) + if (s_macDeactivateWindow == this) { - wxLogTrace(TRACE_MDI, wxT("Avoided deactivation/activation of this=%p"),this); - s_macDeactivateWindow=NULL; + wxLogTrace(TRACE_MDI, wxT("Avoided deactivation/activation of this=%p"), this); + + s_macDeactivateWindow = NULL; } else wxFrame::MacActivate(timestamp, activating); @@ -407,18 +417,19 @@ void wxMDIChildFrame::MacActivate(long timestamp, bool activating) else { // We were scheduled for deactivation, and now we do it. - if(s_macDeactivateWindow==this) + if (s_macDeactivateWindow == this) { s_macDeactivateWindow = NULL; - wxFrame::MacActivate(timestamp,activating); - if(mdiparent->m_currentChild==this) - mdiparent->wxFrame::MacActivate(timestamp,activating); + wxFrame::MacActivate(timestamp, activating); + if (mdiparent->m_currentChild == this) + mdiparent->wxFrame::MacActivate(timestamp, activating); } else // schedule ourselves for deactivation { - if(s_macDeactivateWindow) - wxLogTrace(TRACE_MDI, wxT("window=%p SHOULD have been deactivated, oh well!"),s_macDeactivateWindow); + if (s_macDeactivateWindow) + wxLogTrace(TRACE_MDI, wxT("window=%p SHOULD have been deactivated, oh well!"), s_macDeactivateWindow); wxLogTrace(TRACE_MDI, wxT("Scheduling delayed deactivation")); + s_macDeactivateWindow = this; } } @@ -454,10 +465,11 @@ wxMDIClientWindow::~wxMDIClientWindow() bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) { - if ( !wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style)) + if ( !wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style) ) return false; - + wxModelessWindows.Append(this); + return true; } @@ -473,4 +485,3 @@ void wxMDIClientWindow::OnScroll(wxScrollEvent& event) } #endif // wxUSE_MDI -