]> git.saurik.com Git - wxWidgets.git/blobdiff - src/aui/tabartgtk.cpp
Only give capture to wxPopupTransientWindow child if it's the only one.
[wxWidgets.git] / src / aui / tabartgtk.cpp
index 7b3e6aa1f08d60495f49f34cd26f382b29fb92c0..1c86fbe9d03baab69316ca501e59bc02426c1dc3 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Jens Lody and Teodor Petrov
 // Modified by:
 // Created:     2012-03-23
-// RCS-ID:      $Id:$
 // Copyright:   (c) 2012 Jens Lody <jens@codeblocks.org>
 //                  and Teodor Petrov
 // Licence:     wxWindows licence
@@ -50,11 +49,7 @@ static int s_CloseIconSize = 16; // default size
 
 }
 
-wxAuiGtkTabArt::wxAuiGtkTabArt()//:
-//    m_Xthickness(0),
-//    m_Ythickness(0),
-//    m_TabHBorder(0),
-//    m_TabVBorder(0)
+wxAuiGtkTabArt::wxAuiGtkTabArt()
 
 {
 }
@@ -83,6 +78,23 @@ void wxAuiGtkTabArt::DrawBackground(wxDC& dc, wxWindow* WXUNUSED(wnd), const wxR
                                        rect.x, rect.y, rect.width, rect.height);
 }
 
+void wxAuiGtkTabArt::DrawBorder(wxDC& WXUNUSED(dc), wxWindow* wnd, const wxRect& rect)
+{
+    int generic_border_width = wxAuiGenericTabArt::GetBorderWidth(wnd);
+
+    if (!wnd) return;
+    if (!wnd->m_wxwindow) return;
+    if (!gtk_widget_is_drawable(wnd->m_wxwindow)) return;
+
+    GtkStyle *style_notebook = gtk_widget_get_style(wxGTKPrivate::GetNotebookWidget());
+
+    gtk_paint_box(style_notebook, wnd->GTKGetDrawingWindow(), GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+                  NULL, wnd->m_wxwindow,
+                  const_cast<char*>("notebook"),
+                  rect.x + generic_border_width + 1, rect.y + generic_border_width + 1,
+                  rect.width - (generic_border_width + 1), rect.height - (generic_border_width + 1));
+}
+
 void ButtonStateAndShadow(int button_state, GtkStateType &state, GtkShadowType &shadow)
 {
 
@@ -119,8 +131,7 @@ wxRect DrawCloseButton(wxDC& dc,
     int xthickness = style_button->xthickness;
     int ythickness = style_button->ythickness;
 
-    wxBitmap bmp;
-    bmp.SetPixbuf(gtk_widget_render_icon(widget, GTK_STOCK_CLOSE, GTK_ICON_SIZE_SMALL_TOOLBAR, "tab"));
+    wxBitmap bmp(gtk_widget_render_icon(widget, GTK_STOCK_CLOSE, GTK_ICON_SIZE_SMALL_TOOLBAR, "tab"));
 
     if(bmp.GetWidth() != s_CloseIconSize || bmp.GetHeight() != s_CloseIconSize)
     {
@@ -179,7 +190,6 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
                          "focus-line-width", &focus_width,
                          NULL);
 
-    int gap_x = 0, gap_width = 0;
     int tab_pos;
     if (m_flags &wxAUI_NB_BOTTOM)
         tab_pos = wxAUI_NB_BOTTOM;
@@ -200,12 +210,11 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
 
     if (page.active)
         tab_rect.height += 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder;
-    // if no bitmap is set, we need a tiny correction
-    if (! page.bitmap.IsOk())
-        tab_rect.height += 1;
 
-    int gap_height = 6 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder;
-    int gap_y = tab_rect.y - gap_height;
+    int gap_rect_height = 10 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder;
+    int gap_rect_x = 1, gap_start = 0, gap_width = 0;
+    int gap_rect_y = tab_rect.y - gap_rect_height;
+    int gap_rect_width = window_rect.width;
 
     switch (tab_pos)
     {
@@ -213,15 +222,17 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
             tab_rect.y -= 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder;
             if (!page.active)
                 tab_rect.y += 2 * GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder;
-            gap_y = tab_rect.y + tab_rect.height;
+            gap_rect_y = tab_rect.y + tab_rect.height - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2;
             // fall through
         case wxAUI_NB_BOTTOM:
-            gap_x = tab_rect.x - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder / 2;
+            gap_start = tab_rect.x - GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder / 2;
             gap_width = tab_rect.width;
             break;
+        // TODO: case wxAUI_NB_LEFT: break;
+        // TODO: case wxAUI_NB_RIGHT: break;
     }
     tab_rect.y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2;
-    gap_y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2;
+    gap_rect_y += GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder / 2;
 
     int padding = focus_width + GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder;
 
@@ -240,6 +251,15 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
     wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl();
     GdkWindow* window = impldc->GetGDKWindow();
 
+    // Before drawing the active tab itself, draw a box without border, because some themes
+    // have transparent gaps and a line would be visible at the bottom of the tab
+    if (page.active)
+        gtk_paint_box(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_NONE,
+                      NULL, widget,
+                      const_cast<char*>("notebook"),
+                      gap_rect_x, gap_rect_y,
+                      gap_rect_width, gap_rect_height);
+
     if (tab_pos == wxAUI_NB_BOTTOM)
     {
         if (page.active)
@@ -247,9 +267,9 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
             gtk_paint_box_gap(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
                               NULL, widget,
                               const_cast<char*>("notebook"),
-                              window_rect.x, gap_y,
-                              window_rect.width, gap_height,
-                              GTK_POS_BOTTOM, gap_x , gap_width);
+                              gap_rect_x, gap_rect_y,
+                              gap_rect_width, gap_rect_height,
+                              GTK_POS_BOTTOM, gap_start , gap_width);
         }
         gtk_paint_extension(style_notebook, window,
                            page.active ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE, GTK_SHADOW_OUT,
@@ -266,9 +286,9 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
             gtk_paint_box_gap(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
                               NULL, widget,
                               const_cast<char*>("notebook"),
-                              window_rect.x, gap_y,
-                              window_rect.width, gap_height,
-                              GTK_POS_TOP, gap_x , gap_width);
+                              gap_rect_x, gap_rect_y,
+                              gap_rect_width, gap_rect_height,
+                              GTK_POS_TOP, gap_start , gap_width);
         }
         gtk_paint_extension(style_notebook, window,
                            page.active ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE, GTK_SHADOW_OUT,
@@ -279,6 +299,15 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
                            GTK_POS_BOTTOM);
     }
 
+    // After drawing the inactive tab itself, draw a box with the same dimensions as the gap-box,
+    // otherwise we don't get a gap-box, if the active tab is invisible
+    if (!page.active)
+        gtk_paint_box(style_notebook, window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+                      NULL, widget,
+                      const_cast<char*>("notebook"),
+                      gap_rect_x, gap_rect_y,
+                      gap_rect_width, gap_rect_height);
+
     wxCoord textX = tab_rect.x + padding + style_notebook->xthickness;
 
     int bitmap_offset = 0;
@@ -353,7 +382,8 @@ void wxAuiGtkTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& p
         *out_button_rect = DrawCloseButton(dc, widget, close_button_state, rect, wxRIGHT, &area);
     }
 
-    tab_rect.width = std::min(tab_rect.width, clip_width);
+    if ( clip_width < tab_rect.width )
+        tab_rect.width = clip_width;
     *out_tab_rect = tab_rect;
 
     dc.DestroyClippingRegion();
@@ -451,6 +481,17 @@ int wxAuiGtkTabArt::GetBestTabCtrlSize(wxWindow* wnd,
     return tab_height;
 }
 
+int wxAuiGtkTabArt::GetBorderWidth(wxWindow* wnd)
+{
+    return wxAuiGenericTabArt::GetBorderWidth(wnd) + wxMax(GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_hborder,
+                                                           GTK_NOTEBOOK (wxGTKPrivate::GetNotebookWidget())->tab_vborder);
+}
+
+int wxAuiGtkTabArt::GetAdditionalBorderSpace(wxWindow* wnd)
+{
+    return 2 * GetBorderWidth(wnd);
+}
+
 wxSize wxAuiGtkTabArt::GetTabSize(wxDC& dc,
                               wxWindow* wnd,
                               const wxString& caption,