X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9b362935966dd8e7ae1aeb7a7ab857cef5687a07..a738f87caeafd5e51fc029a6228c540e942505b7:/src/aui/auibook.cpp diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index 5b40085343..1edd86ee91 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -317,7 +317,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, { wxCoord normal_textx, normal_texty; wxCoord selected_textx, selected_texty; - wxCoord textx, texty; + wxCoord texty; // if the caption is empty, measure some temporary text wxString caption = page.caption; @@ -353,13 +353,11 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, if (page.active) { dc.SetFont(m_selected_font); - textx = selected_textx; texty = selected_texty; } - else + else { dc.SetFont(m_normal_font); - textx = normal_textx; texty = normal_texty; } @@ -436,7 +434,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, wxColor bottom_color = m_base_colour; dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); } - else + else { // draw inactive tab @@ -474,7 +472,6 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, // this gets rid of the top one of those lines in the tab control if (page.active) { - wxColor start_color = m_base_colour; dc.SetPen(m_base_colour_pen); dc.DrawLine(border_points[0].x+1, border_points[0].y, @@ -504,7 +501,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, text_offset = bitmap_offset + page.bitmap.GetWidth(); text_offset += 3; // bitmap padding } - else + else { text_offset = tab_x + 8; } @@ -615,25 +612,25 @@ void wxAuiDefaultTabArt::DrawButton(wxDC& dc, case wxAUI_BUTTON_CLOSE: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_close_bmp; - else + else bmp = m_active_close_bmp; break; case wxAUI_BUTTON_LEFT: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_left_bmp; - else + else bmp = m_active_left_bmp; break; case wxAUI_BUTTON_RIGHT: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_right_bmp; - else + else bmp = m_active_right_bmp; break; case wxAUI_BUTTON_WINDOWLIST: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_windowlist_bmp; - else + else bmp = m_active_windowlist_bmp; break; } @@ -651,7 +648,7 @@ void wxAuiDefaultTabArt::DrawButton(wxDC& dc, rect.SetWidth(bmp.GetWidth()); rect.SetHeight(bmp.GetHeight()); } - else + else { rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), @@ -737,7 +734,7 @@ int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd, wxBitmap bmp; if (measure_bmp.IsOk()) bmp = measure_bmp; - else + else bmp = page.bitmap; // we don't use the caption text because we don't @@ -930,7 +927,7 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, textx = selected_textx; texty = selected_texty; } - else + else { dc.SetPen(m_normal_bkpen); dc.SetBrush(m_normal_bkbrush); @@ -975,7 +972,7 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, close_button_width = m_active_close_bmp.GetWidth(); text_offset = tab_x + (tab_height/2) + ((tab_width-close_button_width)/2) - (textx/2); } - else + else { text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2); } @@ -1001,7 +998,7 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, wxBitmap bmp; if (page.active) bmp = m_active_close_bmp; - else + else bmp = m_disabled_close_bmp; wxRect rect(tab_x + tab_width - close_button_width - 1, @@ -1070,25 +1067,25 @@ void wxAuiSimpleTabArt::DrawButton(wxDC& dc, case wxAUI_BUTTON_CLOSE: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_close_bmp; - else + else bmp = m_active_close_bmp; break; case wxAUI_BUTTON_LEFT: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_left_bmp; - else + else bmp = m_active_left_bmp; break; case wxAUI_BUTTON_RIGHT: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_right_bmp; - else + else bmp = m_active_right_bmp; break; case wxAUI_BUTTON_WINDOWLIST: if (button_state & wxAUI_BUTTON_STATE_DISABLED) bmp = m_disabled_windowlist_bmp; - else + else bmp = m_active_windowlist_bmp; break; } @@ -1105,7 +1102,7 @@ void wxAuiSimpleTabArt::DrawButton(wxDC& dc, rect.SetWidth(bmp.GetWidth()); rect.SetHeight(bmp.GetHeight()); } - else + else { rect = wxRect(in_rect.x + in_rect.width - bmp.GetWidth(), ((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2), @@ -1144,7 +1141,7 @@ int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd, pt = wnd->ScreenToClient(pt); if (pt.x < 100) pt.x = 0; - else + else pt.x -= 100; // find out the screen coordinate at the bottom of the tab ctrl @@ -1336,7 +1333,7 @@ bool wxAuiTabContainer::InsertPage(wxWindow* page, if (idx >= m_pages.GetCount()) m_pages.Add(page_info); - else + else m_pages.Insert(page_info, idx); // let the art provider know how many pages we have @@ -1403,7 +1400,7 @@ bool wxAuiTabContainer::SetActivePage(wxWindow* wnd) page.active = true; found = true; } - else + else { page.active = false; } @@ -1582,14 +1579,14 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) if (i+1 < page_count) total_width += x_extent; - else + else total_width += size.x; if (i >= m_tab_offset) { if (i+1 < page_count) visible_width += x_extent; - else + else visible_width += size.x; } } @@ -1607,7 +1604,7 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) } } } - else + else { // hide left/right buttons for (i = 0; i < button_count; ++i) @@ -1629,14 +1626,14 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) { if (m_tab_offset == 0) button.cur_state |= wxAUI_BUTTON_STATE_DISABLED; - else + else button.cur_state &= ~wxAUI_BUTTON_STATE_DISABLED; } if (button.id == wxAUI_BUTTON_RIGHT) { if (visible_width < m_rect.GetWidth() - ((int)button_count*16)) button.cur_state |= wxAUI_BUTTON_STATE_DISABLED; - else + else button.cur_state &= ~wxAUI_BUTTON_STATE_DISABLED; } } @@ -1754,11 +1751,9 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) wxAuiTabContainerButton& tab_button = m_tab_close_buttons.Item(i); // determine if a close button is on this tab - bool close_button = false; if ((m_flags & wxAUI_NB_CLOSE_ON_ALL_TABS) != 0 || ((m_flags & wxAUI_NB_CLOSE_ON_ACTIVE_TAB) != 0 && page.active)) { - close_button = true; if (tab_button.cur_state == wxAUI_BUTTON_STATE_HIDDEN) { tab_button.id = wxAUI_BUTTON_CLOSE; @@ -1766,7 +1761,7 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) tab_button.location = wxCENTER; } } - else + else { tab_button.cur_state = wxAUI_BUTTON_STATE_HIDDEN; } @@ -1811,14 +1806,6 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) wxAuiTabContainerButton& tab_button = m_tab_close_buttons.Item(active); - // determine if a close button is on this tab - bool close_button = false; - if ((m_flags & wxAUI_NB_CLOSE_ON_ALL_TABS) != 0 || - ((m_flags & wxAUI_NB_CLOSE_ON_ACTIVE_TAB) != 0 && page.active)) - { - close_button = true; - } - rect.x = active_offset; m_art->DrawTab(dc, wnd, @@ -1922,7 +1909,7 @@ static void ShowWnd(wxWindow* wnd, bool show) wxAuiMDIChildFrame* cf = (wxAuiMDIChildFrame*)wnd; cf->DoShow(show); } - else + else { wnd->Show(show); } @@ -2067,11 +2054,14 @@ void wxAuiTabCtrl::OnLeftUp(wxMouseEvent& evt) if (m_is_dragging) { + m_is_dragging = false; + wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, m_windowId); evt.SetSelection(GetIdxFromWindow(m_click_tab)); evt.SetOldSelection(evt.GetSelection()); evt.SetEventObject(this); GetEventHandler()->ProcessEvent(evt); + return; } @@ -2181,7 +2171,7 @@ void wxAuiTabCtrl::OnMotion(wxMouseEvent& evt) return; } } - else + else { if (m_hover_button) { @@ -2249,14 +2239,14 @@ void wxAuiTabCtrl::OnButton(wxAuiNotebookEvent& event) Update(); } } - else + else { SetTabOffset(GetTabOffset()+1); Refresh(); Update(); } } - else if (button == wxAUI_BUTTON_WINDOWLIST) + else if (button == wxAUI_BUTTON_WINDOWLIST) { int idx = GetArtProvider()->ShowDropDown(this, m_pages, GetActivePage()); @@ -2269,7 +2259,7 @@ void wxAuiTabCtrl::OnButton(wxAuiNotebookEvent& event) GetEventHandler()->ProcessEvent(e); } } - else + else { event.Skip(); } @@ -2294,16 +2284,17 @@ public: m_tab_ctrl_height = 20; } - ~wxTabFrame() - { - wxDELETE(m_tabs); - } + ~wxTabFrame() + { + wxDELETE(m_tabs); + } void SetTabCtrlHeight(int h) { m_tab_ctrl_height = h; } +protected: void DoSetSize(int x, int y, int width, int height, int WXUNUSED(sizeFlags = wxSIZE_AUTO)) @@ -2318,6 +2309,7 @@ public: *y = m_rect.height; } +public: bool Show( bool WXUNUSED(show = true) ) { return false; } void DoSizing() @@ -2348,6 +2340,7 @@ public: } } +protected: void DoGetSize(int* x, int* y) const { if (x) @@ -2356,13 +2349,12 @@ public: *y = m_rect.GetHeight(); } +public: void Update() { // does nothing } -public: - wxRect m_rect; wxRect m_tab_rect; wxAuiTabCtrl* m_tabs; @@ -2593,7 +2585,7 @@ wxSize wxAuiNotebook::CalculateNewSplitSize() new_split_size.x /= 2; new_split_size.y /= 2; } - else + else { // this is in place of a more complicated calculation // that needs to be implemented @@ -2691,7 +2683,7 @@ bool wxAuiNotebook::InsertPage(size_t page_idx, wxAuiTabCtrl* active_tabctrl = GetActiveTabCtrl(); if (page_idx >= active_tabctrl->GetPageCount()) active_tabctrl->AddPage(page, info); - else + else active_tabctrl->InsertPage(page, info, page_idx); UpdateTabCtrlHeight(); @@ -2713,9 +2705,9 @@ bool wxAuiNotebook::DeletePage(size_t page_idx) { if (page_idx >= m_tabs.GetPageCount()) return false; - + wxWindow* wnd = m_tabs.GetWindowFromIdx(page_idx); - + // hide the window in advance, as this will // prevent flicker ShowWnd(wnd, false); @@ -2731,7 +2723,7 @@ bool wxAuiNotebook::DeletePage(size_t page_idx) if (!wxPendingDelete.Member(wnd)) wxPendingDelete.Append(wnd); } - else + else { wnd->Destroy(); } @@ -2749,7 +2741,7 @@ bool wxAuiNotebook::RemovePage(size_t page_idx) wxWindow* active_wnd = NULL; if (m_curpage >= 0) active_wnd = m_tabs.GetWindowFromIdx(m_curpage); - + // save pointer of window being deleted wxWindow* wnd = m_tabs.GetWindowFromIdx(page_idx); wxWindow* new_active = NULL; @@ -2757,7 +2749,7 @@ bool wxAuiNotebook::RemovePage(size_t page_idx) // make sure we found the page if (!wnd) return false; - + // find out which onscreen tab ctrl owns this tab wxAuiTabCtrl* ctrl; int ctrl_idx; @@ -2778,15 +2770,15 @@ bool wxAuiNotebook::RemovePage(size_t page_idx) if (is_active_in_split) { int ctrl_new_page_count = (int)ctrl->GetPageCount(); - + if (ctrl_idx >= ctrl_new_page_count) ctrl_idx = ctrl_new_page_count-1; - + if (ctrl_idx >= 0 && ctrl_idx < (int)ctrl->GetPageCount()) { // set new page as active in the tab split ctrl->SetActivePage(ctrl_idx); - + // if the page deleted was the current page for the // entire tab control, then record the window // pointer of the new active page for activation @@ -2796,31 +2788,31 @@ bool wxAuiNotebook::RemovePage(size_t page_idx) } } } - else + else { // we are not deleting the active page, so keep it the same new_active = active_wnd; } - + if (!new_active) { // we haven't yet found a new page to active, // so select the next page from the main tab // catalogue - + if (page_idx < m_tabs.GetPageCount()) { new_active = m_tabs.GetPage(page_idx).window; } - + if (!new_active && m_tabs.GetPageCount() > 0) { new_active = m_tabs.GetPage(0).window; } } - + RemoveEmptyTabFrames(); // set new active pane @@ -2829,7 +2821,7 @@ bool wxAuiNotebook::RemovePage(size_t page_idx) m_curpage = -1; SetSelectionToWindow(new_active); } - + return true; } @@ -2968,7 +2960,7 @@ size_t wxAuiNotebook::SetSelection(size_t new_page) wxAuiTabCtrl* tabctrl = ((wxTabFrame*)pane.window)->m_tabs; if (tabctrl != ctrl) tabctrl->SetSelectedFont(m_normal_font); - else + else tabctrl->SetSelectedFont(m_selected_font); tabctrl->Refresh(); } @@ -3122,7 +3114,7 @@ void wxAuiNotebook::Split(size_t page, int direction) { split_size = CalculateNewSplitSize(); } - else + else { // because there are two panes, always split them // equally @@ -3155,17 +3147,17 @@ void wxAuiNotebook::Split(size_t page, int direction) pane_info.Left(); mouse_pt = wxPoint(0, cli_size.y/2); } - else if (direction == wxRIGHT) + else if (direction == wxRIGHT) { pane_info.Right(); mouse_pt = wxPoint(cli_size.x, cli_size.y/2); } - else if (direction == wxTOP) + else if (direction == wxTOP) { pane_info.Top(); mouse_pt = wxPoint(cli_size.x/2, 0); } - else if (direction == wxBOTTOM) + else if (direction == wxBOTTOM) { pane_info.Bottom(); mouse_pt = wxPoint(cli_size.x/2, cli_size.y); @@ -3323,7 +3315,7 @@ void wxAuiNotebook::OnTabDragMotion(wxCommandEvent& evt) } } } - else + else { if (!dest_tabs) { @@ -3356,7 +3348,7 @@ void wxAuiNotebook::OnTabDragMotion(wxCommandEvent& evt) ClientToScreen(&hint_rect.x, &hint_rect.y); m_mgr.ShowHint(hint_rect); } - else + else { m_mgr.DrawHintRect(m_dummy_wnd, client_pt, zero); } @@ -3422,6 +3414,17 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) int src_idx = evt.GetSelection(); wxWindow* src_page = src_tabs->GetWindowFromIdx(src_idx); + // Check that it's not an impossible parent relationship + wxWindow* p = nb; + while (p && !p->IsTopLevel()) + { + if (p == src_page) + { + return; + } + p = p->GetParent(); + } + // get main index of the page int main_idx = m_tabs.GetIdxFromWindow(src_page); wxCHECK_RET( main_idx != wxNOT_FOUND, _T("no source page?") ); @@ -3628,7 +3631,7 @@ void wxAuiNotebook::RemoveEmptyTabFrames() // window closing, refreshs are pending if (!wxPendingDelete.Member(tab_frame->m_tabs)) wxPendingDelete.Append(tab_frame->m_tabs); - + tab_frame->m_tabs = NULL; delete tab_frame; @@ -3662,6 +3665,27 @@ void wxAuiNotebook::RemoveEmptyTabFrames() void wxAuiNotebook::OnChildFocus(wxChildFocusEvent& evt) { + // if we're dragging a tab, don't change the current selection. + // This code prevents a bug that used to happen when the hint window + // was hidden. In the bug, the focus would return to the notebook + // child, which would then enter this handler and call + // SetSelection, which is not desired turn tab dragging. + + wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes(); + size_t i, pane_count = all_panes.GetCount(); + for (i = 0; i < pane_count; ++i) + { + wxAuiPaneInfo& pane = all_panes.Item(i); + if (pane.name == wxT("dummy")) + continue; + wxTabFrame* tabframe = (wxTabFrame*)pane.window; + if (tabframe->m_tabs->IsDragging()) + return; + } + + + // change the tab selection to the child + // which was focused int idx = m_tabs.GetIdxFromWindow(evt.GetWindow()); if (idx != -1 && idx != m_curpage) { @@ -3681,6 +3705,13 @@ void wxAuiNotebook::OnTabButton(wxCommandEvent& command_evt) { int selection = evt.GetSelection(); + if (selection == -1) + { + // if the close button is to the right, use the active + // page selection to determine which page to close + selection = GetSelection(); + } + if (selection != -1) { wxWindow* close_wnd = tabs->GetWindowFromIdx(selection); @@ -3729,7 +3760,7 @@ void wxAuiNotebook::OnTabMiddleUp(wxCommandEvent& evt) // click should act like a tab close action. However, first // give the owner an opportunity to handle the middle up event // for custom action - + wxAuiTabCtrl* tabs = (wxAuiTabCtrl*)evt.GetEventObject(); wxWindow* wnd = tabs->GetWindowFromIdx(evt.GetSelection()); @@ -3740,11 +3771,11 @@ void wxAuiNotebook::OnTabMiddleUp(wxCommandEvent& evt) return; if (!e.IsAllowed()) return; - + // check if we are supposed to close on middle-up if ((m_flags & wxAUI_NB_MIDDLE_CLICK_CLOSE) == 0) return; - + // simulate the user pressing the close button on the tab evt.SetInt(wxAUI_BUTTON_CLOSE); OnTabButton(evt);