X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a69103348f3eb80c7d964e5f64918d1f4088e04e..e52d9c784ed95b099017cca9301b325085c7f4d1:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index f3af3b19a4..d8a82f4809 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -141,52 +141,47 @@ bool wxNotebook::Create(wxWindow *parent, long style, const wxString& name) { - // base init - if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) - return FALSE; - - // colors and font - m_backgroundColour = wxColour(GetSysColor(COLOR_BTNFACE)); - m_foregroundColour = *wxBLACK; - - // style - m_windowStyle = style | wxTAB_TRAVERSAL; - - long tabStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | TCS_TABS; - - if ( m_windowStyle & wxCLIP_SIBLINGS ) - tabStyle |= WS_CLIPSIBLINGS; - if (m_windowStyle & wxCLIP_CHILDREN) - tabStyle |= WS_CLIPCHILDREN; - if ( m_windowStyle & wxTC_MULTILINE ) - tabStyle |= TCS_MULTILINE; - if ( m_windowStyle & wxBORDER ) - tabStyle |= WS_BORDER; - if (m_windowStyle & wxNB_FIXEDWIDTH) - tabStyle |= TCS_FIXEDWIDTH ; - if (m_windowStyle & wxNB_BOTTOM) - tabStyle |= TCS_RIGHT; - if (m_windowStyle & wxNB_LEFT) - tabStyle |= TCS_VERTICAL; - if (m_windowStyle & wxNB_RIGHT) - tabStyle |= TCS_VERTICAL|TCS_RIGHT; - - // note that we don't want to have the default WS_EX_CLIENTEDGE style for the - // notebook, so explicitly specify 0 as last parameter - if ( !MSWCreateControl(WC_TABCONTROL, tabStyle, pos, size, _T(""), 0) ) - { - return FALSE; - } + // base init + if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) + return FALSE; - // Not all compilers recognise SetWindowFont - ::SendMessage(GetHwnd(), WM_SETFONT, - (WPARAM)::GetStockObject(DEFAULT_GUI_FONT), TRUE); + // notebook, so explicitly specify 0 as last parameter + if ( !MSWCreateControl(WC_TABCONTROL, _T(""), pos, size, + style | wxTAB_TRAVERSAL) ) + return FALSE; + SetBackgroundColour(wxColour(::GetSysColor(COLOR_BTNFACE))); - if ( parent != NULL ) - parent->AddChild(this); + return TRUE; +} - return TRUE; +WXDWORD wxNotebook::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + WXDWORD tabStyle = wxControl::MSWGetStyle(style, exstyle); + + tabStyle |= WS_TABSTOP | TCS_TABS; + + if ( style & wxTC_MULTILINE ) + tabStyle |= TCS_MULTILINE; + if ( style & wxNB_FIXEDWIDTH ) + tabStyle |= TCS_FIXEDWIDTH; + + if ( style & wxNB_BOTTOM ) + tabStyle |= TCS_RIGHT; + else if ( style & wxNB_LEFT ) + tabStyle |= TCS_VERTICAL; + else if ( style & wxNB_RIGHT ) + tabStyle |= TCS_VERTICAL | TCS_RIGHT; + + // ex style + if ( exstyle ) + { + // note that we never want to have the default WS_EX_CLIENTEDGE style + // as it looks too ugly for the notebooks + *exstyle = 0; + } + + return tabStyle; } // ---------------------------------------------------------------------------- @@ -309,48 +304,55 @@ void wxNotebook::SetTabSize(const wxSize& sz) // wxNotebook operations // ---------------------------------------------------------------------------- -// remove one page from the notebook -bool wxNotebook::DeletePage(int nPage) -{ - wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") ); - - if ( m_nSelection == nPage ) { - // advance selection backwards - the page being deleted shouldn't be left - // selected - AdvanceSelection(FALSE); - } - - TabCtrl_DeleteItem(m_hwnd, nPage); - - delete m_pages[nPage]; - m_pages.RemoveAt(nPage); - - if ( m_pages.IsEmpty() ) { - // no selection if the notebook became empty - m_nSelection = -1; - } - else - m_nSelection = TabCtrl_GetCurSel(m_hwnd); - - - return TRUE; -} - // remove one page from the notebook, without deleting wxNotebookPage *wxNotebook::DoRemovePage(int nPage) { - wxNotebookPage *pageRemoved = wxNotebookBase::DoRemovePage(nPage); - if ( !pageRemoved ) - return NULL; + wxNotebookPage *pageRemoved = wxNotebookBase::DoRemovePage(nPage); + if ( !pageRemoved ) + return NULL; + + TabCtrl_DeleteItem(m_hwnd, nPage); + + if ( m_pages.IsEmpty() ) + { + // no selection any more, the notebook becamse empty + m_nSelection = -1; + } + else // notebook still not empty + { + // change the selected page if it was deleted or became invalid + int selNew; + if ( m_nSelection == GetPageCount() ) + { + // last page deleted, make the new last page the new selection + selNew = m_nSelection - 1; + } + else if ( nPage <= m_nSelection ) + { + // we must show another page, even if it has the same index + selNew = m_nSelection; + } + else // nothing changes for the currently selected page + { + selNew = -1; - TabCtrl_DeleteItem(m_hwnd, nPage); + // we still must refresh the current page: this needs to be done + // for some unknown reason if the tab control shows the up-down + // control (i.e. when there are too many pages) -- otherwise after + // deleting a page nothing at all is shown + m_pages[m_nSelection]->Refresh(); + } - if ( m_pages.IsEmpty() ) - m_nSelection = -1; - else - m_nSelection = TabCtrl_GetCurSel(m_hwnd); + if ( selNew != -1 ) + { + // m_nSelection must be always valid so reset it before calling + // SetSelection() + m_nSelection = -1; + SetSelection(selNew); + } + } - return pageRemoved; + return pageRemoved; } // remove all pages @@ -586,6 +588,21 @@ bool wxNotebook::DoPhase(int WXUNUSED(nPhase)) return TRUE; } +// ---------------------------------------------------------------------------- +// wxNotebook Windows message handlers +// ---------------------------------------------------------------------------- + +bool wxNotebook::MSWOnScroll(int orientation, WXWORD nSBCode, + WXWORD pos, WXHWND control) +{ + // don't generate EVT_SCROLLWIN events for the WM_SCROLLs coming from the + // up-down control + if ( control ) + return FALSE; + + return wxNotebookBase::MSWOnScroll(orientation, nSBCode, pos, control); +} + bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) { wxNotebookEvent event(wxEVT_NULL, m_windowId);