X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5c3b53817d5b3a63513ae11e34a84d91aeb49f0..520e470fdd0daef09c77938db642e4583933c90d:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 6bbc8d4fea..742d04e8b9 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -9,28 +9,15 @@ // Licence: wxWindows license /////////////////////////////////////////////////////////////////////////////// -// TODO: -// 1) keyboard interface for changing pages ([Shift]+Ctrl-Tab) -// 2) using OnSize() for showing pages for the first time works, but it surely -// us ugly -// 3) I'm not sure that setting fonts works - -// ============================================================================ -// declarations -// ============================================================================ - -// ---------------------------------------------------------------------------- -// headers -// ---------------------------------------------------------------------------- #ifdef __GNUG__ - #pragma implementation "notebook.h" +#pragma implementation "notebook.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop +#pragma hdrstop #endif // wxWindows @@ -49,6 +36,8 @@ #error "wxNotebook is not supported under Windows 3.1" #endif //Win95 +#include // for SetWindowFont + #ifdef __GNUWIN32__ #include "wx/msw/gnuwin32/extra.h" #else //!GnuWin32 @@ -134,11 +123,8 @@ bool wxNotebook::Create(wxWindow *parent, m_backgroundColour = wxColour(GetSysColor(COLOR_BTNFACE)); m_foregroundColour = *wxBLACK ; - m_defaultForegroundColour = *wxBLACK ; - m_defaultBackgroundColour = wxColour(GetSysColor(COLOR_BTNFACE)); - // style - m_windowStyle = style; + m_windowStyle = style | wxTAB_TRAVERSAL; long tabStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | TCS_TABS; if ( m_windowStyle & wxTC_MULTILINE ) @@ -165,6 +151,12 @@ bool wxNotebook::Create(wxWindow *parent, return FALSE; } + // Not all compilers recognise SetWindowFont +// SetWindowFont((HWND)m_hwnd, ::GetStockObject(DEFAULT_GUI_FONT), FALSE); + ::SendMessage((HWND) m_hwnd, WM_SETFONT, + (WPARAM)::GetStockObject(DEFAULT_GUI_FONT),TRUE); + + if ( parent != NULL ) parent->AddChild(this); @@ -196,7 +188,7 @@ int wxNotebook::GetRowCount() const int wxNotebook::SetSelection(int nPage) { - wxASSERT( IS_VALID_PAGE(nPage) ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, "notebook page out of range" ); ChangePage(m_nSelection, nPage); @@ -215,7 +207,7 @@ void wxNotebook::AdvanceSelection(bool bForward) bool wxNotebook::SetPageText(int nPage, const wxString& strText) { - wxASSERT( IS_VALID_PAGE(nPage) ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, "notebook page out of range" ); TC_ITEM tcItem; tcItem.mask = TCIF_TEXT; @@ -226,7 +218,7 @@ bool wxNotebook::SetPageText(int nPage, const wxString& strText) wxString wxNotebook::GetPageText(int nPage) const { - wxASSERT( IS_VALID_PAGE(nPage) ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), "", "notebook page out of range" ); char buf[256]; TC_ITEM tcItem; @@ -243,7 +235,7 @@ wxString wxNotebook::GetPageText(int nPage) const int wxNotebook::GetPageImage(int nPage) const { - wxASSERT( IS_VALID_PAGE(nPage) ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, "notebook page out of range" ); TC_ITEM tcItem; tcItem.mask = TCIF_IMAGE; @@ -253,7 +245,7 @@ int wxNotebook::GetPageImage(int nPage) const bool wxNotebook::SetPageImage(int nPage, int nImage) { - wxASSERT( IS_VALID_PAGE(nPage) ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, "notebook page out of range" ); TC_ITEM tcItem; tcItem.mask = TCIF_IMAGE; @@ -275,7 +267,7 @@ void wxNotebook::SetImageList(wxImageList* imageList) // remove one page from the notebook bool wxNotebook::DeletePage(int nPage) { - wxCHECK( IS_VALID_PAGE(nPage), FALSE ); + wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, "notebook page out of range" ); TabCtrl_DeleteItem(m_hwnd, nPage); @@ -351,18 +343,8 @@ bool wxNotebook::InsertPage(int nPage, // wxNotebook callbacks // ---------------------------------------------------------------------------- -// @@@ OnSize() is used for setting the font when it's called for the first -// time because doing it in ::Create() doesn't work (for unknown reasons) void wxNotebook::OnSize(wxSizeEvent& event) { - static bool s_bFirstTime = TRUE; - if ( s_bFirstTime ) { - SendMessage((HWND)m_hwnd, WM_SETFONT, - (WPARAM)GetStockObject(DEFAULT_GUI_FONT), - MAKELPARAM(TRUE, 0)); - s_bFirstTime = FALSE; - } - // emulate page change (it's esp. important to do it first time because // otherwise our page would stay invisible) int nSel = m_nSelection; @@ -375,8 +357,8 @@ void wxNotebook::OnSize(wxSizeEvent& event) GetSize((int *)&rc.right, (int *)&rc.bottom); TabCtrl_AdjustRect(m_hwnd, FALSE, &rc); - uint nCount = m_aPages.Count(); - for ( uint nPage = 0; nPage < nCount; nPage++ ) { + size_t nCount = m_aPages.Count(); + for ( size_t nPage = 0; nPage < nCount; nPage++ ) { wxNotebookPage *pPage = m_aPages[nPage]; pPage->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); if ( pPage->GetAutoLayout() ) @@ -444,8 +426,7 @@ void wxNotebook::Command(wxCommandEvent& event) bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) { - wxNotebookEvent event(wxEVT_NULL, m_windowId, - TabCtrl_GetCurSel(m_hwnd), m_nSelection); + wxNotebookEvent event(wxEVT_NULL, m_windowId); NMHDR* hdr = (NMHDR *)lParam; switch ( hdr->code ) { @@ -457,10 +438,17 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING); break; + // prevent this msg from being passed to wxControl::MSWNotify which would + // retrun FALSE disabling the change of page + case UDN_DELTAPOS: + return TRUE; + default : return wxControl::MSWNotify(wParam, lParam); } + event.SetSelection(TabCtrl_GetCurSel(m_hwnd)); + event.SetOldSelection(m_nSelection); event.SetEventObject(this); event.SetInt(LOWORD(wParam)); @@ -474,11 +462,13 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) // hide the currently active panel and show the new one void wxNotebook::ChangePage(int nOldSel, int nSel) { - wxASSERT( nOldSel != nSel ); // impossible + // 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; - if ( nOldSel != -1 ) { + if ( nOldSel != -1 ) m_aPages[nOldSel]->Show(FALSE); - } wxNotebookPage *pPage = m_aPages[nSel]; pPage->Show(TRUE);