]> git.saurik.com Git - wxWidgets.git/blame - src/msw/notebook.cpp
Added BCC include dir in XRC makefile
[wxWidgets.git] / src / msw / notebook.cpp
CommitLineData
88310e2e
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: msw/notebook.cpp
3// Purpose: implementation of wxNotebook
4// Author: Vadim Zeitlin
907f37b3 5// Modified by:
88310e2e
VZ
6// Created: 11.06.98
7// RCS-ID: $Id$
8// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
6c9a19aa 9// Licence: wxWindows licence
88310e2e
VZ
10///////////////////////////////////////////////////////////////////////////////
11
88310e2e 12#ifdef __GNUG__
a3b46648 13#pragma implementation "notebook.h"
88310e2e
VZ
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
1e6feb95 20 #pragma hdrstop
88310e2e
VZ
21#endif
22
1e6feb95
VZ
23#if wxUSE_NOTEBOOK
24
88310e2e
VZ
25// wxWindows
26#ifndef WX_PRECOMP
3096bd2f 27 #include "wx/string.h"
88310e2e
VZ
28#endif // WX_PRECOMP
29
3096bd2f
VZ
30#include "wx/log.h"
31#include "wx/imaglist.h"
32#include "wx/event.h"
33#include "wx/control.h"
34#include "wx/notebook.h"
88310e2e 35
3096bd2f 36#include "wx/msw/private.h"
88310e2e
VZ
37
38// Windows standard headers
39#ifndef __WIN95__
2432b92d 40 #error "wxNotebook is only supported Windows 95 and above"
88310e2e
VZ
41#endif //Win95
42
aaab7c01
VZ
43#include <windowsx.h> // for SetWindowFont
44
b39dbf34
JS
45#ifdef __GNUWIN32_OLD__
46 #include "wx/msw/gnuwin32/extra.h"
65fd5cb0 47#endif
57c208c5 48
b39dbf34 49#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__))
c42404a5 50 #include <commctrl.h>
88310e2e
VZ
51#endif
52
53// ----------------------------------------------------------------------------
54// macros
55// ----------------------------------------------------------------------------
56
57// check that the page index is valid
58#define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount()))
59
60// hide the ugly cast
61#define m_hwnd (HWND)GetHWND()
62
74b31181
VZ
63// ----------------------------------------------------------------------------
64// constants
65// ----------------------------------------------------------------------------
66
67// This is a work-around for missing defines in gcc-2.95 headers
68#ifndef TCS_RIGHT
69 #define TCS_RIGHT 0x0002
70#endif
71
72#ifndef TCS_VERTICAL
73 #define TCS_VERTICAL 0x0080
74#endif
75
76#ifndef TCS_BOTTOM
77 #define TCS_BOTTOM TCS_RIGHT
78#endif
79
88310e2e
VZ
80// ----------------------------------------------------------------------------
81// event table
82// ----------------------------------------------------------------------------
83
2e4df4bf
VZ
84DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
85DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
86
d9317fd4 87BEGIN_EVENT_TABLE(wxNotebook, wxControl)
88310e2e
VZ
88 EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange)
89
9026ad85 90 EVT_SIZE(wxNotebook::OnSize)
42e69d6b 91
88310e2e 92 EVT_SET_FOCUS(wxNotebook::OnSetFocus)
42e69d6b 93
88310e2e 94 EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
d9317fd4 95END_EVENT_TABLE()
88310e2e 96
d9317fd4
VZ
97IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
98IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
88310e2e
VZ
99
100// ============================================================================
101// implementation
102// ============================================================================
103
104// ----------------------------------------------------------------------------
105// wxNotebook construction
106// ----------------------------------------------------------------------------
107
108// common part of all ctors
109void wxNotebook::Init()
110{
1e6feb95 111 m_imageList = NULL;
88310e2e
VZ
112 m_nSelection = -1;
113}
114
115// default for dynamic class
116wxNotebook::wxNotebook()
117{
118 Init();
119}
120
121// the same arguments as for wxControl
122wxNotebook::wxNotebook(wxWindow *parent,
8b9518ee 123 wxWindowID id,
88310e2e
VZ
124 const wxPoint& pos,
125 const wxSize& size,
8b9518ee 126 long style,
88310e2e
VZ
127 const wxString& name)
128{
129 Init();
130
131 Create(parent, id, pos, size, style, name);
132}
133
134// Create() function
135bool wxNotebook::Create(wxWindow *parent,
8b9518ee 136 wxWindowID id,
88310e2e
VZ
137 const wxPoint& pos,
138 const wxSize& size,
8b9518ee 139 long style,
88310e2e
VZ
140 const wxString& name)
141{
0df3fbd7 142 // base init
6dd16e4f
VZ
143 if ( !CreateControl(parent, id, pos, size, style | wxTAB_TRAVERSAL,
144 wxDefaultValidator, name) )
0df3fbd7 145 return FALSE;
88310e2e 146
6dd16e4f 147 if ( !MSWCreateControl(WC_TABCONTROL, _T(""), pos, size) )
0df3fbd7 148 return FALSE;
907f37b3 149
0df3fbd7
VZ
150 SetBackgroundColour(wxColour(::GetSysColor(COLOR_BTNFACE)));
151
152 return TRUE;
153}
154
155WXDWORD wxNotebook::MSWGetStyle(long style, WXDWORD *exstyle) const
156{
157 WXDWORD tabStyle = wxControl::MSWGetStyle(style, exstyle);
158
159 tabStyle |= WS_TABSTOP | TCS_TABS;
160
2b5f62a0 161 if ( style & wxNB_MULTILINE )
0df3fbd7
VZ
162 tabStyle |= TCS_MULTILINE;
163 if ( style & wxNB_FIXEDWIDTH )
164 tabStyle |= TCS_FIXEDWIDTH;
165
166 if ( style & wxNB_BOTTOM )
167 tabStyle |= TCS_RIGHT;
168 else if ( style & wxNB_LEFT )
169 tabStyle |= TCS_VERTICAL;
170 else if ( style & wxNB_RIGHT )
171 tabStyle |= TCS_VERTICAL | TCS_RIGHT;
172
173 // ex style
174 if ( exstyle )
175 {
176 // note that we never want to have the default WS_EX_CLIENTEDGE style
177 // as it looks too ugly for the notebooks
178 *exstyle = 0;
179 }
180
181 return tabStyle;
88310e2e
VZ
182}
183
88310e2e
VZ
184// ----------------------------------------------------------------------------
185// wxNotebook accessors
186// ----------------------------------------------------------------------------
07b8d7ec 187
88310e2e
VZ
188int wxNotebook::GetPageCount() const
189{
190 // consistency check
1e6feb95 191 wxASSERT( (int)m_pages.Count() == TabCtrl_GetItemCount(m_hwnd) );
88310e2e 192
1e6feb95 193 return m_pages.Count();
88310e2e
VZ
194}
195
196int wxNotebook::GetRowCount() const
197{
198 return TabCtrl_GetRowCount(m_hwnd);
199}
200
201int wxNotebook::SetSelection(int nPage)
202{
223d09f6 203 wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
88310e2e 204
2b5f62a0
VZ
205 if ( nPage != m_nSelection )
206 {
207 wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId);
208 event.SetSelection(nPage);
209 event.SetOldSelection(m_nSelection);
210 event.SetEventObject(this);
211 if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() )
212 {
213 // program allows the page change
214 event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
215 (void)GetEventHandler()->ProcessEvent(event);
216
217 TabCtrl_SetCurSel(m_hwnd, nPage);
218 }
219 }
88310e2e 220
2b5f62a0 221 return m_nSelection;
88310e2e
VZ
222}
223
88310e2e
VZ
224bool wxNotebook::SetPageText(int nPage, const wxString& strText)
225{
223d09f6 226 wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
88310e2e
VZ
227
228 TC_ITEM tcItem;
229 tcItem.mask = TCIF_TEXT;
837e5743 230 tcItem.pszText = (wxChar *)strText.c_str();
88310e2e
VZ
231
232 return TabCtrl_SetItem(m_hwnd, nPage, &tcItem) != 0;
233}
234
235wxString wxNotebook::GetPageText(int nPage) const
236{
223d09f6 237 wxCHECK_MSG( IS_VALID_PAGE(nPage), wxT(""), wxT("notebook page out of range") );
88310e2e 238
837e5743 239 wxChar buf[256];
88310e2e
VZ
240 TC_ITEM tcItem;
241 tcItem.mask = TCIF_TEXT;
242 tcItem.pszText = buf;
243 tcItem.cchTextMax = WXSIZEOF(buf);
244
245 wxString str;
246 if ( TabCtrl_GetItem(m_hwnd, nPage, &tcItem) )
247 str = tcItem.pszText;
248
249 return str;
250}
251
252int wxNotebook::GetPageImage(int nPage) const
253{
223d09f6 254 wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
88310e2e
VZ
255
256 TC_ITEM tcItem;
257 tcItem.mask = TCIF_IMAGE;
258
259 return TabCtrl_GetItem(m_hwnd, nPage, &tcItem) ? tcItem.iImage : -1;
260}
261
262bool wxNotebook::SetPageImage(int nPage, int nImage)
263{
223d09f6 264 wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
88310e2e
VZ
265
266 TC_ITEM tcItem;
267 tcItem.mask = TCIF_IMAGE;
268 tcItem.iImage = nImage;
269
270 return TabCtrl_SetItem(m_hwnd, nPage, &tcItem) != 0;
271}
272
273void wxNotebook::SetImageList(wxImageList* imageList)
907f37b3 274{
07b8d7ec
VZ
275 wxNotebookBase::SetImageList(imageList);
276
277 if ( imageList )
1e6feb95 278 {
07b8d7ec 279 TabCtrl_SetImageList(m_hwnd, (HIMAGELIST)imageList->GetHIMAGELIST());
1e6feb95 280 }
b656febd
VS
281}
282
d9506e77
VZ
283// ----------------------------------------------------------------------------
284// wxNotebook size settings
285// ----------------------------------------------------------------------------
286
287void wxNotebook::SetPageSize(const wxSize& size)
288{
289 // transform the page size into the notebook size
290 RECT rc;
291 rc.left =
292 rc.top = 0;
293 rc.right = size.x;
294 rc.bottom = size.y;
295
296 TabCtrl_AdjustRect(GetHwnd(), TRUE, &rc);
297
298 // and now set it
299 SetSize(rc.right - rc.left, rc.bottom - rc.top);
300}
301
302void wxNotebook::SetPadding(const wxSize& padding)
303{
304 TabCtrl_SetPadding(GetHwnd(), padding.x, padding.y);
305}
42e69d6b
VZ
306
307// Windows-only at present. Also, you must use the wxNB_FIXEDWIDTH
308// style.
309void wxNotebook::SetTabSize(const wxSize& sz)
310{
311 ::SendMessage(GetHwnd(), TCM_SETITEMSIZE, 0, MAKELPARAM(sz.x, sz.y));
312}
313
2015f2b3
VZ
314void wxNotebook::AdjustPageSize(wxNotebookPage *page)
315{
316 wxCHECK_RET( page, _T("NULL page in wxNotebook::AdjustPageSize") );
317
318 RECT rc;
319 rc.left =
320 rc.top = 0;
321
322 // get the page size from the notebook size
323 GetSize((int *)&rc.right, (int *)&rc.bottom);
324 TabCtrl_AdjustRect(m_hwnd, FALSE, &rc);
325
326 page->SetSize(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
327}
328
88310e2e
VZ
329// ----------------------------------------------------------------------------
330// wxNotebook operations
331// ----------------------------------------------------------------------------
332
621793f4 333// remove one page from the notebook, without deleting
1e6feb95 334wxNotebookPage *wxNotebook::DoRemovePage(int nPage)
621793f4 335{
df7145da
VZ
336 wxNotebookPage *pageRemoved = wxNotebookBase::DoRemovePage(nPage);
337 if ( !pageRemoved )
338 return NULL;
621793f4 339
df7145da 340 TabCtrl_DeleteItem(m_hwnd, nPage);
621793f4 341
df7145da
VZ
342 if ( m_pages.IsEmpty() )
343 {
344 // no selection any more, the notebook becamse empty
345 m_nSelection = -1;
346 }
347 else // notebook still not empty
348 {
43a997b6
VZ
349 // change the selected page if it was deleted or became invalid
350 int selNew;
df7145da
VZ
351 if ( m_nSelection == GetPageCount() )
352 {
43a997b6
VZ
353 // last page deleted, make the new last page the new selection
354 selNew = m_nSelection - 1;
df7145da 355 }
43a997b6
VZ
356 else if ( nPage <= m_nSelection )
357 {
358 // we must show another page, even if it has the same index
359 selNew = m_nSelection;
360 }
361 else // nothing changes for the currently selected page
362 {
363 selNew = -1;
df7145da 364
43a997b6
VZ
365 // we still must refresh the current page: this needs to be done
366 // for some unknown reason if the tab control shows the up-down
367 // control (i.e. when there are too many pages) -- otherwise after
368 // deleting a page nothing at all is shown
369 m_pages[m_nSelection]->Refresh();
370 }
371
372 if ( selNew != -1 )
373 {
374 // m_nSelection must be always valid so reset it before calling
375 // SetSelection()
376 m_nSelection = -1;
377 SetSelection(selNew);
378 }
df7145da 379 }
47f12f58 380
df7145da 381 return pageRemoved;
621793f4
JS
382}
383
88310e2e
VZ
384// remove all pages
385bool wxNotebook::DeleteAllPages()
386{
88310e2e
VZ
387 int nPageCount = GetPageCount();
388 int nPage;
389 for ( nPage = 0; nPage < nPageCount; nPage++ )
1e6feb95 390 delete m_pages[nPage];
88310e2e 391
1e6feb95 392 m_pages.Clear();
88310e2e 393
907f37b3
VZ
394 TabCtrl_DeleteAllItems(m_hwnd);
395
47f12f58
JS
396 m_nSelection = -1;
397
88310e2e
VZ
398 return TRUE;
399}
400
88310e2e
VZ
401// same as AddPage() but does it at given position
402bool wxNotebook::InsertPage(int nPage,
403 wxNotebookPage *pPage,
404 const wxString& strText,
405 bool bSelect,
406 int imageId)
407{
22f3361e
VZ
408 wxCHECK_MSG( pPage != NULL, FALSE, _T("NULL page in wxNotebook::InsertPage") );
409 wxCHECK_MSG( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE,
410 _T("invalid index in wxNotebook::InsertPage") );
88310e2e 411
efa14cf2
VZ
412 wxASSERT_MSG( pPage->GetParent() == this,
413 _T("notebook pages must have notebook as parent") );
43427087 414
22f3361e
VZ
415 // add a new tab to the control
416 // ----------------------------
58a8ab88 417
22f3361e
VZ
418 // init all fields to 0
419 TC_ITEM tcItem;
420 wxZeroMemory(tcItem);
58a8ab88 421
22f3361e
VZ
422 // set the image, if any
423 if ( imageId != -1 )
424 {
425 tcItem.mask |= TCIF_IMAGE;
426 tcItem.iImage = imageId;
427 }
88310e2e 428
22f3361e
VZ
429 // and the text
430 if ( !strText.IsEmpty() )
431 {
432 tcItem.mask |= TCIF_TEXT;
433 tcItem.pszText = (wxChar *)strText.c_str(); // const_cast
434 }
43427087 435
22f3361e
VZ
436 // fit the notebook page to the tab control's display area: this should be
437 // done before adding it to the notebook or TabCtrl_InsertItem() will
438 // change the notebooks size itself!
2015f2b3 439 AdjustPageSize(pPage);
43427087 440
22f3361e 441 // finally do insert it
2015f2b3
VZ
442 if ( TabCtrl_InsertItem(m_hwnd, nPage, &tcItem) == -1 )
443 {
22f3361e 444 wxLogError(wxT("Can't create the notebook page '%s'."), strText.c_str());
88310e2e 445
22f3361e
VZ
446 return FALSE;
447 }
88310e2e 448
22f3361e
VZ
449 // succeeded: save the pointer to the page
450 m_pages.Insert(pPage, nPage);
42e69d6b 451
2015f2b3
VZ
452 // for the first page (only) we need to adjust the size again because the
453 // notebook size changed: the tabs which hadn't been there before are now
454 // shown
455 if ( m_pages.GetCount() == 1 )
456 {
457 AdjustPageSize(pPage);
458 }
459
22f3361e
VZ
460 // hide the page: unless it is selected, it shouldn't be shown (and if it
461 // is selected it will be shown later)
462 HWND hwnd = GetWinHwnd(pPage);
463 SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_VISIBLE);
0398b1d6 464
22f3361e
VZ
465 // this updates internal flag too -- otherwise it would get out of sync
466 // with the real state
467 pPage->Show(FALSE);
43427087 468
96d37807 469
22f3361e
VZ
470 // now deal with the selection
471 // ---------------------------
472
473 // if the inserted page is before the selected one, we must update the
474 // index of the selected page
475 if ( nPage <= m_nSelection )
476 {
477 // one extra page added
478 m_nSelection++;
479 }
480
481 // some page should be selected: either this one or the first one if there
482 // is still no selection
483 int selNew = -1;
484 if ( bSelect )
485 selNew = nPage;
486 else if ( m_nSelection == -1 )
487 selNew = 0;
488
489 if ( selNew != -1 )
490 SetSelection(selNew);
491
492 return TRUE;
88310e2e
VZ
493}
494
495// ----------------------------------------------------------------------------
496// wxNotebook callbacks
497// ----------------------------------------------------------------------------
498
9026ad85 499void wxNotebook::OnSize(wxSizeEvent& event)
88310e2e 500{
b5c3b538
VZ
501 // fit the notebook page to the tab control's display area
502 RECT rc;
503 rc.left = rc.top = 0;
504 GetSize((int *)&rc.right, (int *)&rc.bottom);
505
506 TabCtrl_AdjustRect(m_hwnd, FALSE, &rc);
4b7f2165
VZ
507
508 int width = rc.right - rc.left,
509 height = rc.bottom - rc.top;
1e6feb95 510 size_t nCount = m_pages.Count();
c86f1403 511 for ( size_t nPage = 0; nPage < nCount; nPage++ ) {
1e6feb95 512 wxNotebookPage *pPage = m_pages[nPage];
4b7f2165 513 pPage->SetSize(rc.left, rc.top, width, height);
b5c3b538
VZ
514 }
515
88310e2e
VZ
516 event.Skip();
517}
518
519void wxNotebook::OnSelChange(wxNotebookEvent& event)
520{
521 // is it our tab control?
522 if ( event.GetEventObject() == this )
5d1d2d46 523 {
5d1d2d46
VZ
524 int sel = event.GetOldSelection();
525 if ( sel != -1 )
1e6feb95 526 m_pages[sel]->Show(FALSE);
0398b1d6 527
5d1d2d46
VZ
528 sel = event.GetSelection();
529 if ( sel != -1 )
530 {
1e6feb95 531 wxNotebookPage *pPage = m_pages[sel];
5d1d2d46
VZ
532 pPage->Show(TRUE);
533 pPage->SetFocus();
534 }
0398b1d6 535
5d1d2d46
VZ
536 m_nSelection = sel;
537 }
88310e2e
VZ
538
539 // we want to give others a chance to process this message as well
540 event.Skip();
541}
542
543void wxNotebook::OnSetFocus(wxFocusEvent& event)
544{
d9506e77
VZ
545 // this function is only called when the focus is explicitly set (i.e. from
546 // the program) to the notebook - in this case we don't need the
547 // complicated OnNavigationKey() logic because the programmer knows better
548 // what [s]he wants
88310e2e 549
d9506e77
VZ
550 // set focus to the currently selected page if any
551 if ( m_nSelection != -1 )
1e6feb95 552 m_pages[m_nSelection]->SetFocus();
d9506e77
VZ
553
554 event.Skip();
88310e2e
VZ
555}
556
557void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
558{
d9506e77
VZ
559 if ( event.IsWindowChange() ) {
560 // change pages
561 AdvanceSelection(event.GetDirection());
562 }
563 else {
564 // we get this event in 2 cases
565 //
566 // a) one of our pages might have generated it because the user TABbed
567 // out from it in which case we should propagate the event upwards and
568 // our parent will take care of setting the focus to prev/next sibling
569 //
570 // or
571 //
572 // b) the parent panel wants to give the focus to us so that we
573 // forward it to our selected page. We can't deal with this in
574 // OnSetFocus() because we don't know which direction the focus came
575 // from in this case and so can't choose between setting the focus to
576 // first or last panel child
577
578 wxWindow *parent = GetParent();
579 if ( event.GetEventObject() == parent )
580 {
581 // no, it doesn't come from child, case (b): forward to a page
582 if ( m_nSelection != -1 )
583 {
584 // so that the page knows that the event comes from it's parent
585 // and is being propagated downwards
586 event.SetEventObject(this);
587
1e6feb95 588 wxWindow *page = m_pages[m_nSelection];
d9506e77
VZ
589 if ( !page->GetEventHandler()->ProcessEvent(event) )
590 {
591 page->SetFocus();
592 }
593 //else: page manages focus inside it itself
594 }
595 else
596 {
597 // we have no pages - still have to give focus to _something_
598 SetFocus();
599 }
600 }
601 else
602 {
603 // it comes from our child, case (a), pass to the parent
604 if ( parent ) {
605 event.SetCurrentFocus(this);
606 parent->GetEventHandler()->ProcessEvent(event);
607 }
608 }
88310e2e 609 }
88310e2e
VZ
610}
611
612// ----------------------------------------------------------------------------
613// wxNotebook base class virtuals
614// ----------------------------------------------------------------------------
b5c3b538 615
0b481c72
VZ
616#if wxUSE_CONSTRAINTS
617
b5c3b538
VZ
618// override these 2 functions to do nothing: everything is done in OnSize
619
4b7f2165 620void wxNotebook::SetConstraintSizes(bool WXUNUSED(recurse))
b5c3b538
VZ
621{
622 // don't set the sizes of the pages - their correct size is not yet known
623 wxControl::SetConstraintSizes(FALSE);
624}
625
4b7f2165 626bool wxNotebook::DoPhase(int WXUNUSED(nPhase))
b5c3b538
VZ
627{
628 return TRUE;
629}
630
0b481c72
VZ
631#endif // wxUSE_CONSTRAINTS
632
0df3fbd7
VZ
633// ----------------------------------------------------------------------------
634// wxNotebook Windows message handlers
635// ----------------------------------------------------------------------------
636
637bool wxNotebook::MSWOnScroll(int orientation, WXWORD nSBCode,
638 WXWORD pos, WXHWND control)
639{
640 // don't generate EVT_SCROLLWIN events for the WM_SCROLLs coming from the
641 // up-down control
642 if ( control )
643 return FALSE;
644
645 return wxNotebookBase::MSWOnScroll(orientation, nSBCode, pos, control);
646}
647
a23fd0e1 648bool wxNotebook::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result)
88310e2e 649{
93a19f17 650 wxNotebookEvent event(wxEVT_NULL, m_windowId);
88310e2e
VZ
651
652 NMHDR* hdr = (NMHDR *)lParam;
653 switch ( hdr->code ) {
654 case TCN_SELCHANGE:
655 event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
656 break;
657
658 case TCN_SELCHANGING:
659 event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING);
660 break;
661
fd3f686c 662 default:
a23fd0e1 663 return wxControl::MSWOnNotify(idCtrl, lParam, result);
88310e2e
VZ
664 }
665
93a19f17
VZ
666 event.SetSelection(TabCtrl_GetCurSel(m_hwnd));
667 event.SetOldSelection(m_nSelection);
88310e2e 668 event.SetEventObject(this);
a23fd0e1 669 event.SetInt(idCtrl);
88310e2e 670
fd3f686c
VZ
671 bool processed = GetEventHandler()->ProcessEvent(event);
672 *result = !event.IsAllowed();
673 return processed;
88310e2e
VZ
674}
675
1e6feb95 676#endif // wxUSE_NOTEBOOK