X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aaab7c01dc470f100910f2b8c2bbf67120e6fff6..2de8030dbe61287fb398057d61dd22fe45078c1d:/src/msw/notebook.cpp diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 98aa1ad74f..34e0b589af 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -9,22 +9,15 @@ // Licence: wxWindows license /////////////////////////////////////////////////////////////////////////////// -// ============================================================================ -// 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 @@ -34,20 +27,26 @@ #include #include +#include +#include #include #include // Windows standard headers #ifndef __WIN95__ - #error "wxNotebook is not supported under Windows 3.1" + #error "wxNotebook is only supported Windows 95 and above" #endif //Win95 #include // for SetWindowFont +#ifndef __TWIN32__ #ifdef __GNUWIN32__ #include "wx/msw/gnuwin32/extra.h" -#else //!GnuWin32 +#endif +#endif + +#if !defined(__GNUWIN32__) || defined(__TWIN32__) #include #endif @@ -70,12 +69,13 @@ EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange) EVT_SIZE(wxNotebook::OnSize) + EVT_ERASE_BACKGROUND(wxNotebook::OnEraseBackground) EVT_SET_FOCUS(wxNotebook::OnSetFocus) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl) - IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent) #endif // ============================================================================ @@ -130,11 +130,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 ) @@ -161,9 +158,11 @@ bool wxNotebook::Create(wxWindow *parent, return FALSE; } - // @@@ this crashes the application with "Invalid instruction" exception - // deep inside Windows -- why??? - SetWindowFont((HWND)m_hwnd, ::GetStockObject(DEFAULT_GUI_FONT), 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 +195,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 +214,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 +225,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 +242,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 +252,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 +274,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); @@ -285,6 +284,18 @@ bool wxNotebook::DeletePage(int nPage) return TRUE; } +// remove one page from the notebook, without deleting +bool wxNotebook::RemovePage(int nPage) +{ + wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, "notebook page out of range" ); + + TabCtrl_DeleteItem(m_hwnd, nPage); + + m_aPages.Remove(nPage); + + return TRUE; +} + // remove all pages bool wxNotebook::DeleteAllPages() { @@ -353,11 +364,13 @@ bool wxNotebook::InsertPage(int nPage, void wxNotebook::OnSize(wxSizeEvent& event) { - // emulate page change (it's esp. important to do it first time because - // otherwise our page would stay invisible) - int nSel = m_nSelection; - m_nSelection = -1; - SetSelection(nSel); + // make sure the current page is shown and has focus (it's useful because all + // pages are created invisible initially) + if ( m_nSelection != -1 ) { + wxNotebookPage *pPage = m_aPages[m_nSelection]; + pPage->Show(TRUE); + pPage->SetFocus(); + } // fit the notebook page to the tab control's display area RECT rc; @@ -365,8 +378,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() ) @@ -405,7 +418,7 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) // pass to the parent if ( GetParent() ) { event.SetCurrentFocus(this); - GetParent()->ProcessEvent(event); + GetParent()->GetEventHandler()->ProcessEvent(event); } } } @@ -432,10 +445,9 @@ void wxNotebook::Command(wxCommandEvent& event) wxFAIL_MSG("wxNotebook::Command not implemented"); } -bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) +bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam, WXLPARAM* result) { - 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 ) { @@ -447,20 +459,18 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING); break; - // if we don't intercept it here this message is passed to our parent (if - // we have one) and then lost in it's DefWindowProc - case UDN_DELTAPOS: - MSWDefWindowProc(WM_NOTIFY, wParam, lParam); - return TRUE; - - default : - return wxControl::MSWNotify(wParam, lParam); + default: + return wxControl::MSWNotify(wParam, lParam, result); } + event.SetSelection(TabCtrl_GetCurSel(m_hwnd)); + event.SetOldSelection(m_nSelection); event.SetEventObject(this); - event.SetInt(LOWORD(wParam)); + event.SetInt(LOWORD(wParam)); // ctrl id - return ProcessEvent(event); + bool processed = GetEventHandler()->ProcessEvent(event); + *result = !event.IsAllowed(); + return processed; } // ---------------------------------------------------------------------------- @@ -470,11 +480,32 @@ bool wxNotebook::MSWNotify(WXWPARAM wParam, WXLPARAM lParam) // 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 ( ProcessEvent(event) && !event.IsAllowed() ) + { + // program doesn't allow the page change + s_bInsideChangePage = FALSE; + return; + } + if ( nOldSel != -1 ) m_aPages[nOldSel]->Show(FALSE); @@ -482,5 +513,15 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) pPage->Show(TRUE); pPage->SetFocus(); + event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED); + ProcessEvent(event); + m_nSelection = nSel; + s_bInsideChangePage = FALSE; } + +void wxNotebook::OnEraseBackground(wxEraseEvent& event) +{ + Default(); +} +