+// helper for HitTest(): check if the point lies inside the given widget which
+// is the child of the notebook whose position and border size are passed as
+// parameters
+static bool
+IsPointInsideWidget(const wxPoint& pt, GtkWidget *w,
+ gint x, gint y, gint border = 0)
+{
+ return
+ (pt.x >= w->allocation.x - x - border) &&
+ (pt.x <= w->allocation.x - x + border + w->allocation.width) &&
+ (pt.y >= w->allocation.y - y - border) &&
+ (pt.y <= w->allocation.y - y + border + w->allocation.height);
+}
+
+int wxNotebook::HitTest(const wxPoint& pt, long *flags) const
+{
+ const gint x = m_widget->allocation.x;
+ const gint y = m_widget->allocation.y;
+
+ const size_t count = GetPageCount();
+ size_t i = 0;
+
+ GtkNotebook * notebook = GTK_NOTEBOOK(m_widget);
+ if (gtk_notebook_get_scrollable(notebook))
+ i = g_list_position( notebook->children, notebook->first_tab );
+
+ for ( ; i < count; i++ )
+ {
+ wxGtkNotebookPage* pageData = GetNotebookPage(i);
+ GtkWidget* box = pageData->m_box;
+
+ const gint border = gtk_container_get_border_width(GTK_CONTAINER(box));
+
+ if ( IsPointInsideWidget(pt, box, x, y, border) )
+ {
+ // ok, we're inside this tab -- now find out where, if needed
+ if ( flags )
+ {
+ if (pageData->m_image && IsPointInsideWidget(pt, pageData->m_image, x, y))
+ {
+ *flags = wxBK_HITTEST_ONICON;
+ }
+ else if (IsPointInsideWidget(pt, pageData->m_label, x, y))
+ {
+ *flags = wxBK_HITTEST_ONLABEL;
+ }
+ else
+ {
+ *flags = wxBK_HITTEST_ONITEM;
+ }
+ }
+
+ return i;
+ }
+ }
+
+ if ( flags )
+ {
+ *flags = wxBK_HITTEST_NOWHERE;
+ wxWindowBase * page = GetCurrentPage();
+ if ( page )
+ {
+ // rect origin is in notebook's parent coordinates
+ wxRect rect = page->GetRect();
+
+ // adjust it to the notebook's coordinates
+ wxPoint pos = GetPosition();
+ rect.x -= pos.x;
+ rect.y -= pos.y;
+ if ( rect.Contains( pt ) )
+ *flags |= wxBK_HITTEST_ONPAGE;
+ }
+ }
+
+ return wxNOT_FOUND;