X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3a5df9d92fe2b22a7451e1251f1711064c22d67..9d5507f7a2701395e1d5c121bd877bb9066ee6ea:/src/aui/tabmdi.cpp?ds=sidebyside diff --git a/src/aui/tabmdi.cpp b/src/aui/tabmdi.cpp index 54cd7b7850..ccf9e885f5 100644 --- a/src/aui/tabmdi.cpp +++ b/src/aui/tabmdi.cpp @@ -82,8 +82,9 @@ wxAuiMDIParentFrame::~wxAuiMDIParentFrame() wxDELETE(m_pClientWindow); #if wxUSE_MENUS + wxDELETE(m_pMyMenuBar); RemoveWindowMenu(GetMenuBar()); - delete m_pWindowMenu; + wxDELETE(m_pWindowMenu); #endif // wxUSE_MENUS } @@ -114,6 +115,30 @@ bool wxAuiMDIParentFrame::Create(wxWindow *parent, return true; } + +void wxAuiMDIParentFrame::SetArtProvider(wxAuiTabArt* provider) +{ + if (m_pClientWindow) + { + m_pClientWindow->SetArtProvider(provider); + } +} + +wxAuiTabArt* wxAuiMDIParentFrame::GetArtProvider() +{ + if (!m_pClientWindow) + return NULL; + + return m_pClientWindow->GetArtProvider(); +} + +wxAuiNotebook* wxAuiMDIParentFrame::GetNotebook() const +{ + return static_cast(m_pClientWindow); +} + + + #if wxUSE_MENUS void wxAuiMDIParentFrame::SetWindowMenu(wxMenu* pMenu) { @@ -142,7 +167,7 @@ void wxAuiMDIParentFrame::SetMenuBar(wxMenuBar* pMenuBar) AddWindowMenu(pMenuBar); wxFrame::SetMenuBar(pMenuBar); - m_pMyMenuBar = GetMenuBar(); + //m_pMyMenuBar = GetMenuBar(); } #endif // wxUSE_MENUS @@ -152,12 +177,15 @@ void wxAuiMDIParentFrame::SetChildMenuBar(wxAuiMDIChildFrame* pChild) if (!pChild) { // No Child, set Our menu bar back. - SetMenuBar(m_pMyMenuBar); + if (m_pMyMenuBar) + SetMenuBar(m_pMyMenuBar); + else + SetMenuBar(GetMenuBar()); // Make sure we know our menu bar is in use - //m_pMyMenuBar = NULL; + m_pMyMenuBar = NULL; } - else + else { if (pChild->GetMenuBar() == NULL) return; @@ -173,14 +201,12 @@ void wxAuiMDIParentFrame::SetChildMenuBar(wxAuiMDIChildFrame* pChild) bool wxAuiMDIParentFrame::ProcessEvent(wxEvent& event) { - // Stops the same event being processed repeatedly - static wxEventType inEvent = wxEVT_NULL; - if (inEvent == event.GetEventType()) + // stops the same event being processed repeatedly + if (m_pLastEvt == &event) return false; + m_pLastEvt = &event; - inEvent = event.GetEventType(); - - // Let the active child (if any) process the event first. + // let the active child (if any) process the event first. bool res = false; if (m_pActiveChild && event.IsCommandEvent() && @@ -196,14 +222,15 @@ bool wxAuiMDIParentFrame::ProcessEvent(wxEvent& event) res = m_pActiveChild->GetEventHandler()->ProcessEvent(event); } - // If the event was not handled this frame will handle it! if (!res) { - //res = GetEventHandler()->ProcessEvent(event); + // if the event was not handled this frame will handle it, + // which is why we need the protection code at the beginning + // of this method res = wxEvtHandler::ProcessEvent(event); } - inEvent = wxEVT_NULL; + m_pLastEvt = NULL; return res; } @@ -218,14 +245,14 @@ void wxAuiMDIParentFrame::SetActiveChild(wxAuiMDIChildFrame* pChildFrame) m_pActiveChild = pChildFrame; } -wxAuiTabMDIClientWindow *wxAuiMDIParentFrame::GetClientWindow() const +wxAuiMDIClientWindow *wxAuiMDIParentFrame::GetClientWindow() const { return m_pClientWindow; } -wxAuiTabMDIClientWindow *wxAuiMDIParentFrame::OnCreateClient() +wxAuiMDIClientWindow *wxAuiMDIParentFrame::OnCreateClient() { - m_pClientWindow = new wxAuiTabMDIClientWindow( this ); + m_pClientWindow = new wxAuiMDIClientWindow( this ); return m_pClientWindow; } @@ -255,6 +282,7 @@ void wxAuiMDIParentFrame::ActivatePrevious() void wxAuiMDIParentFrame::Init() { + m_pLastEvt = NULL; m_pClientWindow = NULL; m_pActiveChild = NULL; #if wxUSE_MENUS @@ -286,7 +314,7 @@ void wxAuiMDIParentFrame::AddWindowMenu(wxMenuBar *pMenuBar) int pos = pMenuBar->FindMenu(wxGetStockLabel(wxID_HELP,wxSTOCK_NOFLAGS)); if (pos == wxNOT_FOUND) pMenuBar->Append(m_pWindowMenu, _("&Window")); - else + else pMenuBar->Insert(pos, m_pWindowMenu, _("&Window")); } } @@ -306,11 +334,6 @@ void wxAuiMDIParentFrame::DoHandleMenu(wxCommandEvent& event) { return; // failure } - else - { - delete m_pActiveChild; - m_pActiveChild = NULL; - } } break; case wxWINDOWNEXT: @@ -330,6 +353,26 @@ void wxAuiMDIParentFrame::DoGetClientSize(int* width, int* height) const wxFrame::DoGetClientSize(width, height); } +void wxAuiMDIParentFrame::Tile(wxOrientation orient) +{ + wxAuiMDIClientWindow* client_window = GetClientWindow(); + wxASSERT_MSG(client_window, wxT("Missing MDI Client Window")); + + int cur_idx = client_window->GetSelection(); + if (cur_idx == -1) + return; + + if (orient == wxVERTICAL) + { + client_window->Split(cur_idx, wxLEFT); + } + else if (orient == wxHORIZONTAL) + { + client_window->Split(cur_idx, wxTOP); + } +} + + //----------------------------------------------------------------------------- // wxAuiMDIChildFrame //----------------------------------------------------------------------------- @@ -356,11 +399,29 @@ 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() { + wxAuiMDIParentFrame* pParentFrame = GetMDIParentFrame(); + if (pParentFrame && pParentFrame->GetActiveChild() == this) + { + pParentFrame->SetActiveChild(NULL); + pParentFrame->SetChildMenuBar(NULL); + } + #if wxUSE_MENUS wxDELETE(m_pMenuBar); #endif // wxUSE_MENUS @@ -374,10 +435,23 @@ bool wxAuiMDIChildFrame::Create(wxAuiMDIParentFrame* parent, long style, const wxString& name) { - wxAuiTabMDIClientWindow* pClientWindow = parent->GetClientWindow(); + 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); @@ -386,7 +460,7 @@ 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; @@ -397,16 +471,21 @@ bool wxAuiMDIChildFrame::Destroy() wxAuiMDIParentFrame* pParentFrame = GetMDIParentFrame(); wxASSERT_MSG(pParentFrame, wxT("Missing MDI Parent Frame")); - wxAuiTabMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); + wxAuiMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); wxASSERT_MSG(pClientWindow, wxT("Missing MDI Client Window")); 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) @@ -451,7 +530,7 @@ void wxAuiMDIChildFrame::SetTitle(const wxString& title) wxAuiMDIParentFrame* pParentFrame = GetMDIParentFrame(); wxASSERT_MSG(pParentFrame, wxT("Missing MDI Parent Frame")); - wxAuiTabMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); + wxAuiMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); if (pClientWindow != NULL) { size_t pos; @@ -471,12 +550,52 @@ wxString wxAuiMDIChildFrame::GetTitle() const return m_title; } +void wxAuiMDIChildFrame::SetIcons(const wxIconBundle& icons) +{ + // get icon with the system icon size + SetIcon(icons.GetIcon(-1)); + m_icon_bundle = icons; +} + +const wxIconBundle& wxAuiMDIChildFrame::GetIcons() const +{ + return m_icon_bundle; +} + +void wxAuiMDIChildFrame::SetIcon(const wxIcon& icon) +{ + wxAuiMDIParentFrame* pParentFrame = GetMDIParentFrame(); + wxASSERT_MSG(pParentFrame, wxT("Missing MDI Parent Frame")); + + m_icon = icon; + + wxBitmap bmp; + bmp.CopyFromIcon(m_icon); + + wxAuiMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); + if (pClientWindow != NULL) + { + int idx = pClientWindow->GetPageIndex(this); + + if (idx != -1) + { + pClientWindow->SetPageBitmap((size_t)idx, bmp); + } + } +} + +const wxIcon& wxAuiMDIChildFrame::GetIcon() const +{ + return m_icon; +} + + void wxAuiMDIChildFrame::Activate() { wxAuiMDIParentFrame* pParentFrame = GetMDIParentFrame(); wxASSERT_MSG(pParentFrame, wxT("Missing MDI Parent Frame")); - wxAuiTabMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); + wxAuiMDIClientWindow* pClientWindow = pParentFrame->GetClientWindow(); if (pClientWindow != NULL) { @@ -528,14 +647,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; } @@ -572,75 +694,83 @@ void wxAuiMDIChildFrame::ApplyMDIChildFrameRect() //----------------------------------------------------------------------------- -// wxAuiTabMDIClientWindow +// wxAuiMDIClientWindow //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxAuiTabMDIClientWindow, wxAuiNotebook) +IMPLEMENT_DYNAMIC_CLASS(wxAuiMDIClientWindow, wxAuiNotebook) -BEGIN_EVENT_TABLE(wxAuiTabMDIClientWindow, wxAuiNotebook) - EVT_AUINOTEBOOK_PAGE_CHANGED(wxID_ANY, wxAuiTabMDIClientWindow::OnPageChanged) - EVT_SIZE(wxAuiTabMDIClientWindow::OnSize) +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() -wxAuiTabMDIClientWindow::wxAuiTabMDIClientWindow() +wxAuiMDIClientWindow::wxAuiMDIClientWindow() { } -wxAuiTabMDIClientWindow::wxAuiTabMDIClientWindow(wxAuiMDIParentFrame* parent, long style) +wxAuiMDIClientWindow::wxAuiMDIClientWindow(wxAuiMDIParentFrame* parent, long style) { CreateClient(parent, style); } -wxAuiTabMDIClientWindow::~wxAuiTabMDIClientWindow() +wxAuiMDIClientWindow::~wxAuiMDIClientWindow() { DestroyChildren(); } -bool wxAuiTabMDIClientWindow::CreateClient(wxAuiMDIParentFrame* parent, long style) +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), - wxSize(100, 100), - wxNO_BORDER)) + wxID_ANY, + wxPoint(0,0), + wxSize(100, 100), + wxAUI_NB_DEFAULT_STYLE | wxNO_BORDER)) { return false; } 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; } -int wxAuiTabMDIClientWindow::SetSelection(size_t nPage) +int wxAuiMDIClientWindow::SetSelection(size_t nPage) { return wxAuiNotebook::SetSelection(nPage); } -void wxAuiTabMDIClientWindow::PageChanged(int old_selection, int new_selection) +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) { wxAuiMDIChildFrame* old_child = (wxAuiMDIChildFrame*)GetPage(old_selection); - wxASSERT_MSG(old_child, wxT("wxAuiTabMDIClientWindow::PageChanged - null page pointer")); + wxASSERT_MSG(old_child, wxT("wxAuiMDIClientWindow::PageChanged - null page pointer")); wxActivateEvent event(wxEVT_ACTIVATE, false, old_child->GetId()); event.SetEventObject(old_child); @@ -651,7 +781,7 @@ void wxAuiTabMDIClientWindow::PageChanged(int old_selection, int new_selection) if (new_selection != -1) { wxAuiMDIChildFrame* active_child = (wxAuiMDIChildFrame*)GetPage(new_selection); - wxASSERT_MSG(active_child, wxT("wxAuiTabMDIClientWindow::PageChanged - null page pointer")); + wxASSERT_MSG(active_child, wxT("wxAuiMDIClientWindow::PageChanged - null page pointer")); wxActivateEvent event(wxEVT_ACTIVATE, true, active_child->GetId()); event.SetEventObject(active_child); @@ -663,15 +793,29 @@ void wxAuiTabMDIClientWindow::PageChanged(int old_selection, int new_selection) 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 wxAuiTabMDIClientWindow::OnPageChanged(wxAuiNotebookEvent& evt) +void wxAuiMDIClientWindow::OnPageChanged(wxAuiNotebookEvent& evt) { PageChanged(evt.GetOldSelection(), evt.GetSelection()); - evt.Skip(); } -void wxAuiTabMDIClientWindow::OnSize(wxSizeEvent& evt) +void wxAuiMDIClientWindow::OnSize(wxSizeEvent& evt) { wxAuiNotebook::OnSize(evt);