X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e0dc13d470f31c31f38927a2565b94cd126ddf9a..f1b18eba7fe703f9bd13c01741b852840fabe711:/src/aui/tabmdi.cpp diff --git a/src/aui/tabmdi.cpp b/src/aui/tabmdi.cpp index c216c63588..dd9046aef8 100644 --- a/src/aui/tabmdi.cpp +++ b/src/aui/tabmdi.cpp @@ -380,7 +380,18 @@ wxAuiMDIChildFrame::wxAuiMDIChildFrame(wxAuiMDIParentFrame *parent, const wxString& name) { Init(); - Create(parent, id, title, wxDefaultPosition, size, style, name); + + // There are two ways to create an tabbed mdi child fram without + // making it the active document. Either Show(false) can be called + // before Create() (as is customary on some ports with wxFrame-type + // windows), or wxMINIMIZE can be passed in the style flags. Note that + // wxAuiMDIChildFrame is not really derived from wxFrame, as wxMDIChildFrame + // is, but those are the expected symantics. No style flag is passed + // onto the panel underneath. + if (style & wxMINIMIZE) + m_activate_on_create = false; + + Create(parent, id, title, wxDefaultPosition, size, 0, name); } wxAuiMDIChildFrame::~wxAuiMDIChildFrame() @@ -401,7 +412,20 @@ bool wxAuiMDIChildFrame::Create(wxAuiMDIParentFrame* parent, wxAuiMDIClientWindow* pClientWindow = parent->GetClientWindow(); wxASSERT_MSG((pClientWindow != (wxWindow*) NULL), wxT("Missing MDI client window.")); - wxPanel::Create(pClientWindow, id, wxDefaultPosition, size, style|wxNO_BORDER, name); + // see comment in constructor + if (style & wxMINIMIZE) + m_activate_on_create = false; + + wxSize cli_size = pClientWindow->GetClientSize(); + + // create the window off-screen to prevent flicker + wxPanel::Create(pClientWindow, + id, + wxPoint(cli_size.x+1, cli_size.y+1), + size, + wxNO_BORDER, name); + + DoShow(false); SetMDIParentFrame(parent); @@ -410,9 +434,9 @@ bool wxAuiMDIChildFrame::Create(wxAuiMDIParentFrame* parent, m_title = title; - pClientWindow->AddPage(this, title, true); + pClientWindow->AddPage(this, title, m_activate_on_create); pClientWindow->Refresh(); - + return true; } @@ -426,11 +450,16 @@ bool wxAuiMDIChildFrame::Destroy() if (pParentFrame->GetActiveChild() == this) { + // deactivate ourself + wxActivateEvent event(wxEVT_ACTIVATE, false, GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + pParentFrame->SetActiveChild(NULL); pParentFrame->SetChildMenuBar(NULL); } - const size_t page_count = pClientWindow->GetPageCount(); + size_t page_count = pClientWindow->GetPageCount(); for (size_t pos = 0; pos < page_count; pos++) { if (pClientWindow->GetPage(pos) == this) @@ -516,7 +545,7 @@ void wxAuiMDIChildFrame::SetIcon(const wxIcon& icon) wxBitmap bmp; bmp.CopyFromIcon(m_icon); - + wxAuiMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); if (pClientWindow != NULL) { @@ -592,14 +621,17 @@ wxAuiMDIParentFrame* wxAuiMDIChildFrame::GetMDIParentFrame() const void wxAuiMDIChildFrame::Init() { + m_activate_on_create = true; m_pMDIParentFrame = NULL; #if wxUSE_MENUS m_pMenuBar = NULL; #endif // wxUSE_MENUS } -bool wxAuiMDIChildFrame::Show(bool WXUNUSED(show)) +bool wxAuiMDIChildFrame::Show(bool show) { + m_activate_on_create = show; + // do nothing return true; } @@ -643,6 +675,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxAuiMDIClientWindow, wxAuiNotebook) BEGIN_EVENT_TABLE(wxAuiMDIClientWindow, wxAuiNotebook) EVT_AUINOTEBOOK_PAGE_CHANGED(wxID_ANY, wxAuiMDIClientWindow::OnPageChanged) + EVT_AUINOTEBOOK_PAGE_CLOSE(wxID_ANY, wxAuiMDIClientWindow::OnPageClose) EVT_SIZE(wxAuiMDIClientWindow::OnSize) END_EVENT_TABLE() @@ -664,6 +697,11 @@ bool wxAuiMDIClientWindow::CreateClient(wxAuiMDIParentFrame* parent, long style) { SetWindowStyleFlag(style); + wxSize caption_icon_size = + wxSize(wxSystemSettings::GetMetric(wxSYS_SMALLICON_X), + wxSystemSettings::GetMetric(wxSYS_SMALLICON_Y)); + SetUniformBitmapSize(caption_icon_size); + if (!wxAuiNotebook::Create(parent, wxID_ANY, wxPoint(0,0), @@ -674,9 +712,9 @@ bool wxAuiMDIClientWindow::CreateClient(wxAuiMDIParentFrame* parent, long style) } wxColour bkcolour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE); - SetBackgroundColour(bkcolour); + SetOwnBackgroundColour(bkcolour); - m_mgr.GetArtProvider()->SetColour(wxAUI_ART_BACKGROUND_COLOUR, bkcolour); + m_mgr.GetArtProvider()->SetColour(wxAUI_DOCKART_BACKGROUND_COLOUR, bkcolour); return true; } @@ -691,15 +729,17 @@ void wxAuiMDIClientWindow::PageChanged(int old_selection, int new_selection) // don't do anything if the page doesn't actually change if (old_selection == new_selection) return; - + + /* // don't do anything if the new page is already active if (new_selection != -1) { wxAuiMDIChildFrame* child = (wxAuiMDIChildFrame*)GetPage(new_selection); if (child->GetMDIParentFrame()->GetActiveChild() == child) return; - } - + }*/ + + // notify old active child that it has been deactivated if (old_selection != -1) { @@ -710,29 +750,43 @@ void wxAuiMDIClientWindow::PageChanged(int old_selection, int new_selection) event.SetEventObject(old_child); old_child->GetEventHandler()->ProcessEvent(event); } - + // notify new active child that it has been activated if (new_selection != -1) { wxAuiMDIChildFrame* active_child = (wxAuiMDIChildFrame*)GetPage(new_selection); wxASSERT_MSG(active_child, wxT("wxAuiMDIClientWindow::PageChanged - null page pointer")); - + wxActivateEvent event(wxEVT_ACTIVATE, true, active_child->GetId()); event.SetEventObject(active_child); active_child->GetEventHandler()->ProcessEvent(event); - + if (active_child->GetMDIParentFrame()) { active_child->GetMDIParentFrame()->SetActiveChild(active_child); active_child->GetMDIParentFrame()->SetChildMenuBar(active_child); } } + + +} + +void wxAuiMDIClientWindow::OnPageClose(wxAuiNotebookEvent& evt) +{ + wxAuiMDIChildFrame* wnd; + wnd = static_cast(GetPage(evt.GetSelection())); + + wnd->Close(); + + // regardless of the result of wnd->Close(), we've + // already taken care of the close operations, so + // suppress further processing + evt.Veto(); } void wxAuiMDIClientWindow::OnPageChanged(wxAuiNotebookEvent& evt) { PageChanged(evt.GetOldSelection(), evt.GetSelection()); - evt.Skip(); } void wxAuiMDIClientWindow::OnSize(wxSizeEvent& evt)