-  // TODO: emulate PAGE_CHANGING event
-  
-  wxNotebookEvent event( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
-                         notebook->GetId(),  nPage, old );
-  event.SetEventObject( notebook );
-  notebook->GetEventHandler()->ProcessEvent( event );
+    int old = notebook->GetSelection();
+
+    wxNotebookEvent eventChanging( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
+                                   notebook->GetId(), page, old );
+    eventChanging.SetEventObject( notebook );
+
+    if ( (notebook->GetEventHandler()->ProcessEvent(eventChanging)) &&
+         !eventChanging.IsAllowed() )
+    {
+        /* program doesn't allow the page change */
+        gtk_signal_emit_stop_by_name( GTK_OBJECT(notebook->m_widget),
+                                      "switch_page" );
+    }
+    else // change allowed
+    {
+        // make wxNotebook::GetSelection() return the correct (i.e. consistent
+        // with wxNotebookEvent::GetSelection()) value even though the page is
+        // not really changed in GTK+
+        notebook->m_selection = page;
+
+        wxNotebookEvent eventChanged( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
+                                      notebook->GetId(), page, old );
+        eventChanged.SetEventObject( notebook );
+        notebook->GetEventHandler()->ProcessEvent( eventChanged );
+    }
+
+    notebook->m_inSwitchPage = FALSE;