X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/43a997b6e2064a189fa73ca1816908fb740ce297..6ae0daf6c515a80547e90963d04531dc886292d0:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index d8a82f4809..0cd903edfe 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -6,7 +6,7 @@ // Created: 11.06.98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -142,12 +142,11 @@ bool wxNotebook::Create(wxWindow *parent, const wxString& name) { // base init - if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) + if ( !CreateControl(parent, id, pos, size, style | wxTAB_TRAVERSAL, + wxDefaultValidator, name) ) return FALSE; - // notebook, so explicitly specify 0 as last parameter - if ( !MSWCreateControl(WC_TABCONTROL, _T(""), pos, size, - style | wxTAB_TRAVERSAL) ) + if ( !MSWCreateControl(WC_TABCONTROL, _T(""), pos, size) ) return FALSE; SetBackgroundColour(wxColour(::GetSysColor(COLOR_BTNFACE))); @@ -161,7 +160,7 @@ WXDWORD wxNotebook::MSWGetStyle(long style, WXDWORD *exstyle) const tabStyle |= WS_TABSTOP | TCS_TABS; - if ( style & wxTC_MULTILINE ) + if ( style & wxNB_MULTILINE ) tabStyle |= TCS_MULTILINE; if ( style & wxNB_FIXEDWIDTH ) tabStyle |= TCS_FIXEDWIDTH; @@ -205,9 +204,23 @@ int wxNotebook::SetSelection(int nPage) { wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") ); - ChangePage(m_nSelection, nPage); + if ( nPage != m_nSelection ) + { + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId); + event.SetSelection(nPage); + event.SetOldSelection(m_nSelection); + event.SetEventObject(this); + if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() ) + { + // program allows the page change + event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); + (void)GetEventHandler()->ProcessEvent(event); - return TabCtrl_SetCurSel(m_hwnd, nPage); + TabCtrl_SetCurSel(m_hwnd, nPage); + } + } + + return m_nSelection; } bool wxNotebook::SetPageText(int nPage, const wxString& strText) @@ -300,6 +313,21 @@ void wxNotebook::SetTabSize(const wxSize& sz) ::SendMessage(GetHwnd(), TCM_SETITEMSIZE, 0, MAKELPARAM(sz.x, sz.y)); } +void wxNotebook::AdjustPageSize(wxNotebookPage *page) +{ + wxCHECK_RET( page, _T("NULL page in wxNotebook::AdjustPageSize") ); + + RECT rc; + rc.left = + rc.top = 0; + + // get the page size from the notebook size + GetSize((int *)&rc.right, (int *)&rc.bottom); + TabCtrl_AdjustRect(m_hwnd, FALSE, &rc); + + page->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); +} + // ---------------------------------------------------------------------------- // wxNotebook operations // ---------------------------------------------------------------------------- @@ -372,15 +400,6 @@ bool wxNotebook::DeleteAllPages() return TRUE; } -// add a page to the notebook -bool wxNotebook::AddPage(wxNotebookPage *pPage, - const wxString& strText, - bool bSelect, - int imageId) -{ - return InsertPage(GetPageCount(), pPage, strText, bSelect, imageId); -} - // same as AddPage() but does it at given position bool wxNotebook::InsertPage(int nPage, wxNotebookPage *pPage, @@ -388,70 +407,91 @@ bool wxNotebook::InsertPage(int nPage, bool bSelect, int imageId) { - wxASSERT( pPage != NULL ); - wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE ); + wxCHECK_MSG( pPage != NULL, FALSE, _T("NULL page in wxNotebook::InsertPage") ); + wxCHECK_MSG( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE, + _T("invalid index in wxNotebook::InsertPage") ); - // do add the tab to the control + wxASSERT_MSG( pPage->GetParent() == this, + _T("notebook pages must have notebook as parent") ); - // init all fields to 0 - TC_ITEM tcItem; - memset(&tcItem, 0, sizeof(tcItem)); + // add a new tab to the control + // ---------------------------- - if ( imageId != -1 ) - { - tcItem.mask |= TCIF_IMAGE; - tcItem.iImage = imageId; - } + // init all fields to 0 + TC_ITEM tcItem; + wxZeroMemory(tcItem); - if ( !strText.IsEmpty() ) - { - tcItem.mask |= TCIF_TEXT; - tcItem.pszText = (wxChar *)strText.c_str(); // const_cast - } + // set the image, if any + if ( imageId != -1 ) + { + tcItem.mask |= TCIF_IMAGE; + tcItem.iImage = imageId; + } - if ( TabCtrl_InsertItem(m_hwnd, nPage, &tcItem) == -1 ) { - wxLogError(wxT("Can't create the notebook page '%s'."), strText.c_str()); + // and the text + if ( !strText.IsEmpty() ) + { + tcItem.mask |= TCIF_TEXT; + tcItem.pszText = (wxChar *)strText.c_str(); // const_cast + } - return FALSE; - } + // fit the notebook page to the tab control's display area: this should be + // done before adding it to the notebook or TabCtrl_InsertItem() will + // change the notebooks size itself! + AdjustPageSize(pPage); - // if the inserted page is before the selected one, we must update the - // index of the selected page - if ( nPage <= m_nSelection ) - { - // one extra page added - m_nSelection++; - } + // finally do insert it + if ( TabCtrl_InsertItem(m_hwnd, nPage, &tcItem) == -1 ) + { + wxLogError(wxT("Can't create the notebook page '%s'."), strText.c_str()); - // save the pointer to the page - m_pages.Insert(pPage, nPage); + return FALSE; + } - // don't show pages by default (we'll need to adjust their size first) - HWND hwnd = GetWinHwnd(pPage); - SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_VISIBLE); + // succeeded: save the pointer to the page + m_pages.Insert(pPage, nPage); - // this updates internal flag too - otherwise it will get out of sync - pPage->Show(FALSE); + // for the first page (only) we need to adjust the size again because the + // notebook size changed: the tabs which hadn't been there before are now + // shown + if ( m_pages.GetCount() == 1 ) + { + AdjustPageSize(pPage); + } - // fit the notebook page to the tab control's display area - RECT rc; - rc.left = rc.top = 0; - GetSize((int *)&rc.right, (int *)&rc.bottom); - TabCtrl_AdjustRect(m_hwnd, FALSE, &rc); - pPage->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); + // hide the page: unless it is selected, it shouldn't be shown (and if it + // is selected it will be shown later) + HWND hwnd = GetWinHwnd(pPage); + SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_VISIBLE); - // some page should be selected: either this one or the first one if there is - // still no selection - int selNew = -1; - if ( bSelect ) - selNew = nPage; - else if ( m_nSelection == -1 ) - selNew = 0; + // this updates internal flag too -- otherwise it would get out of sync + // with the real state + pPage->Show(FALSE); - if ( selNew != -1 ) - SetSelection(selNew); - return TRUE; + // now deal with the selection + // --------------------------- + + // if the inserted page is before the selected one, we must update the + // index of the selected page + if ( nPage <= m_nSelection ) + { + // one extra page added + m_nSelection++; + } + + // some page should be selected: either this one or the first one if there + // is still no selection + int selNew = -1; + if ( bSelect ) + selNew = nPage; + else if ( m_nSelection == -1 ) + selNew = 0; + + if ( selNew != -1 ) + SetSelection(selNew); + + return TRUE; } // ---------------------------------------------------------------------------- @@ -575,6 +615,8 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) // wxNotebook base class virtuals // ---------------------------------------------------------------------------- +#if wxUSE_CONSTRAINTS + // override these 2 functions to do nothing: everything is done in OnSize void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse)) @@ -588,6 +630,8 @@ bool wxNotebook::DoPhase(int WXUNUSED(nPhase)) return TRUE; } +#endif // wxUSE_CONSTRAINTS + // ---------------------------------------------------------------------------- // wxNotebook Windows message handlers // ---------------------------------------------------------------------------- @@ -631,44 +675,4 @@ bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) return processed; } -// ---------------------------------------------------------------------------- -// wxNotebook helper functions -// ---------------------------------------------------------------------------- - -// generate the page changing and changed events, hide the currently active -// panel and show the new one -void wxNotebook::ChangePage(int nOldSel, int nSel) -{ - // MT-FIXME should use a real semaphore - static bool s_bInsideChangePage = FALSE; - - // when we call ProcessEvent(), our own OnSelChange() is called which calls - // this function - break the infinite loop - if ( s_bInsideChangePage ) - return; - - // it's not an error (the message may be generated by the tab control itself) - // and it may happen - just do nothing - if ( nSel == nOldSel ) - return; - - s_bInsideChangePage = TRUE; - - wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId); - event.SetSelection(nSel); - event.SetOldSelection(nOldSel); - event.SetEventObject(this); - if ( GetEventHandler()->ProcessEvent(event) && !event.IsAllowed() ) - { - // program doesn't allow the page change - s_bInsideChangePage = FALSE; - return; - } - - event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); - GetEventHandler()->ProcessEvent(event); - - s_bInsideChangePage = FALSE; -} - #endif // wxUSE_NOTEBOOK