X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/179e085f05fab385b89a18281e115003de890388..7ad25aed02fa53612cd94a422904667c46fafcbb:/src/mac/carbon/mdi.cpp diff --git a/src/mac/carbon/mdi.cpp b/src/mac/carbon/mdi.cpp index c9798d0151..c3951ca0e1 100644 --- a/src/mac/carbon/mdi.cpp +++ b/src/mac/carbon/mdi.cpp @@ -9,25 +9,23 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "mdi.h" -#endif - #include "wx/wxprec.h" #if wxUSE_MDI -#include "wx/mdi.h" -#include "wx/menu.h" -#include "wx/settings.h" -#include "wx/log.h" +#ifndef WX_PRECOMP + #include "wx/mdi.h" + #include "wx/log.h" + #include "wx/menu.h" + #include "wx/settings.h" + #include "wx/statusbr.h" +#endif #include "wx/mac/private.h" #include "wx/mac/uma.h" extern wxWindowList wxModelessWindows; -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxFrame) IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame) IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow) @@ -41,8 +39,6 @@ BEGIN_EVENT_TABLE(wxMDIClientWindow, wxWindow) EVT_SCROLL(wxMDIClientWindow::OnScroll) END_EVENT_TABLE() -#endif - static const wxChar *TRACE_MDI = _T("mdi"); static const int IDM_WINDOWTILE = 4001; @@ -60,27 +56,27 @@ static const int wxLAST_MDI_CHILD = 4600; // Status border dimensions static const int wxTHICK_LINE_BORDER = 3; +// ---------------------------------------------------------------------------- // Parent frame +// ---------------------------------------------------------------------------- -wxMDIParentFrame::wxMDIParentFrame() +void wxMDIParentFrame::Init() { m_clientWindow = NULL; m_currentChild = NULL; m_windowMenu = (wxMenu*) NULL; - m_parentFrameActive = TRUE; + m_parentFrameActive = true; + m_shouldBeShown = false; } 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) { - m_clientWindow = NULL; - m_currentChild = NULL; - // this style can be used to prevent a window from having the standard MDI // "Window" menu if ( style & wxFRAME_NO_WINDOW_MENU ) @@ -101,11 +97,11 @@ bool wxMDIParentFrame::Create(wxWindow *parent, } wxFrame::Create( parent , id , title , pos , size , style , name ) ; - m_parentFrameActive = TRUE; + m_parentFrameActive = true; OnCreateClient(); - return TRUE; + return true; } wxMDIParentFrame::~wxMDIParentFrame() @@ -132,6 +128,61 @@ void wxMDIParentFrame::GetRectForTopLevelChildren(int *x, int *y, int *w, int *h wxDisplaySize(w,h); } +void wxMDIParentFrame::AddChild(wxWindowBase *child) +{ + if ( !m_currentChild ) + { + m_currentChild = wxDynamicCast(child, wxMDIChildFrame); + + if ( m_currentChild && IsShown() && !ShouldBeVisible() ) + { + // we shouldn't remain visible any more + wxFrame::Show(false); + m_shouldBeShown = true; + } + } + + wxFrame::AddChild(child); +} + +void wxMDIParentFrame::RemoveChild(wxWindowBase *child) +{ + if ( child == m_currentChild ) + { + // the current child isn't active any more, try to find another one + m_currentChild = NULL; + + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxMDIChildFrame * + childCur = wxDynamicCast(node->GetData(), wxMDIChildFrame); + if ( childCur != child ) + { + m_currentChild = childCur; + break; + } + } + } + + wxFrame::RemoveChild(child); + + // if there are no more children left we need to show the frame if we + // hadn't shown it before because there were active children and it was + // useless (note that we have to do it after fully removing the child, i.e. + // after calling the base class RemoveChild() as otherwise we risk to touch + // pointer to the child being deleted) + if ( !m_currentChild && m_shouldBeShown && !IsShown() ) + { + // we have to show it, but at least move it out of sight and make it of + // smallest possible size (unfortunately (0, 0) doesn't work so that it + // doesn't appear in expose + SetSize(-10000, -10000, 1, 1); + Show(); + } +} + 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")); @@ -212,7 +263,7 @@ void wxMDIParentFrame::Cascade() // TODO } -void wxMDIParentFrame::Tile() +void wxMDIParentFrame::Tile(wxOrientation WXUNUSED(orient)) { // TODO } @@ -232,25 +283,54 @@ void wxMDIParentFrame::ActivatePrevious() // TODO } +bool wxMDIParentFrame::ShouldBeVisible() const +{ + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + + if ( win->IsShown() + && !wxDynamicCast(win, wxMDIChildFrame) +#if wxUSE_STATUSBAR + && win != GetStatusBar() +#endif // wxUSE_STATUSBAR + && win != GetClientWindow() ) + { + // if we have a non-MDI child, do remain visible so that it could + // be used + return true; + } + } + + return false; +} + bool wxMDIParentFrame::Show( bool show ) { + m_shouldBeShown = false; + // don't really show the MDI frame unless it has any children other than // MDI children as it is pretty useless in this case if ( show ) { - // TODO: check for other children - if(!GetToolBar()) - Move(-10000, -10000); + if ( !ShouldBeVisible() && m_currentChild ) + { + // don't make the window visible now but remember that we should + // have had done it + m_shouldBeShown = true; + return false; + } } - if ( !wxFrame::Show(show) ) - return false; - - return true; + return wxFrame::Show(show); } +// ---------------------------------------------------------------------------- // Child frame +// ---------------------------------------------------------------------------- wxMDIChildFrame::wxMDIChildFrame() { @@ -282,15 +362,11 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); wxModelessWindows.Append(this); - return FALSE; + return false; } wxMDIChildFrame::~wxMDIChildFrame() { - wxMDIParentFrame *mdiparent = wxDynamicCast(m_parent, wxMDIParentFrame); - wxASSERT(mdiparent); - if(mdiparent->m_currentChild == this) - mdiparent->m_currentChild = NULL; DestroyChildren(); } @@ -379,10 +455,10 @@ wxMDIClientWindow::~wxMDIClientWindow() bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) { if ( !wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style)) - return FALSE; + return false; wxModelessWindows.Append(this); - return TRUE; + return true; } // Get size *available for subwindows* i.e. excluding menu bar. @@ -396,5 +472,5 @@ void wxMDIClientWindow::OnScroll(wxScrollEvent& event) { } -#endif +#endif // wxUSE_MDI