]> git.saurik.com Git - wxWidgets.git/blobdiff - src/aui/dockart.cpp
use WX_DEFINE_ARRAY_INT for an array of ints (bug 1536482)
[wxWidgets.git] / src / aui / dockart.cpp
index 2890dbd4328e9802c26e161b3ed3db94c679f086..1eab5042d2a609048efc924d169a457ef3f6bdb1 100644 (file)
@@ -1,10 +1,10 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        dockart.cpp
+// Name:        src/aui/dockart.cpp
 // Purpose:     wxaui: wx advanced user interface - docking window manager
 // Author:      Benjamin I. Williams
 // Modified by:
 // Created:     2005-05-17
-// RCS-ID:      
+// RCS-ID:      $Id$
 // Copyright:   (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved
 // Licence:     wxWindows Library Licence, Version 3.1
 ///////////////////////////////////////////////////////////////////////////////
 
 #if wxUSE_AUI
 
-#include "wx/image.h"
 #include "wx/aui/framemanager.h"
 #include "wx/aui/dockart.h"
 
 #ifndef WX_PRECOMP
-//    #include "wx/log.h"
+    #include "wx/settings.h"
+    #include "wx/dcclient.h"
+    #include "wx/image.h"
 #endif
 
+#ifdef __WXMAC__
+#include "wx/mac/private.h"
+#include "wx/graphics.h"
+#endif
+
+#ifdef __WXGTK__
+#include <gtk/gtk.h>
+#include "wx/gtk/win_gtk.h"
+#include "wx/renderer.h"
+#endif
+
+
 // -- wxDefaultDockArt class implementation --
 
 // wxDefaultDockArt is an art provider class which does all of the drawing for
@@ -48,9 +61,9 @@
 static wxColor StepColour(const wxColor& c, int percent)
 {
     int r = c.Red(), g = c.Green(), b = c.Blue();
-    return wxColour(wxMin((r*percent)/100,255),
-                    wxMin((g*percent)/100,255),
-                    wxMin((b*percent)/100,255));
+    return wxColour((unsigned char)wxMin((r*percent)/100,255),
+                    (unsigned char)wxMin((g*percent)/100,255),
+                    (unsigned char)wxMin((b*percent)/100,255));
 }
 
 static wxColor LightContrastColour(const wxColour& c)
@@ -71,8 +84,8 @@ static wxBitmap BitmapFromBits(const unsigned char bits[], int w, int h,
                                const wxColour& color)
 {
     wxImage img = wxBitmap((const char*)bits, w, h).ConvertToImage();
-    img.Replace(255,255,255,123,123,123);
-    img.Replace(0,0,0,color.Red(),color.Green(),color.Blue());
+    img.Replace(0,0,0,123,123,123);
+    img.Replace(255,255,255,color.Red(),color.Green(),color.Blue());
     img.SetMaskColour(123,123,123);
     return wxBitmap(img);
 }
@@ -100,7 +113,9 @@ static void DrawGradientRectangle(wxDC& dc,
         int g = start_color.Green() + ((i*gd*100)/high)/100;
         int b = start_color.Blue() + ((i*bd*100)/high)/100;
 
-        wxPen p(wxColor(r,g,b));
+        wxPen p(wxColor((unsigned char)r,
+                        (unsigned char)g,
+                        (unsigned char)b));
         dc.SetPen(p);
 
         if (direction == wxAUI_GRADIENT_VERTICAL)
@@ -120,7 +135,7 @@ wxDefaultDockArt::wxDefaultDockArt()
 #else
     wxColor base_color = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
 #endif
-    
+
     wxColor darker1_color = StepColour(base_color, 85);
     wxColor darker2_color = StepColour(base_color, 70);
     wxColor darker3_color = StepColour(base_color, 60);
@@ -155,11 +170,16 @@ wxDefaultDockArt::wxDefaultDockArt()
 #endif
 
     // some built in bitmaps
-#ifdef __WXMAC__
+#if defined( __WXMAC__ )
      static unsigned char close_bits[]={
          0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3,
          0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3,
          0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF };
+#elif defined( __WXGTK__)
+    static unsigned char close_bits[]={
+         0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8,
+         0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef,
+         0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 #else
     static unsigned char close_bits[]={
         0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xfb,0xcf,0xf9,
@@ -171,7 +191,7 @@ wxDefaultDockArt::wxDefaultDockArt()
         0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xdf,0xfc,0xdf,0xfc,
         0xdf,0xfc,0xdf,0xfc,0xdf,0xfc,0x0f,0xf8,0x7f,0xff,0x7f,0xff,
         0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
-          
+
 #ifdef __WXMAC__
     m_inactive_close_bitmap = BitmapFromBits(close_bits, 16, 16, *wxWHITE);
 #else
@@ -186,10 +206,12 @@ wxDefaultDockArt::wxDefaultDockArt()
     m_active_pin_bitmap = BitmapFromBits(pin_bits, 16, 16, m_active_caption_text_colour);
 
     // default metric values
-#ifdef __WXMAC__
+#if defined(__WXMAC__)
     SInt32 height;
     GetThemeMetric( kThemeMetricSmallPaneSplitterHeight , &height );
     m_sash_size = height;
+#elif defined(__WXGTK__)
+    m_sash_size = wxRendererNative::Get().GetSplitterParams(NULL).widthSash;
 #else
     m_sash_size = 4;
 #endif
@@ -234,16 +256,16 @@ wxColour wxDefaultDockArt::GetColour(int id)
 {
     switch (id)
     {
-        case wxAUI_ART_BACKGROUND_COLOUR:                return m_background_brush.GetColour(); break;
-        case wxAUI_ART_SASH_COLOUR:                      return m_sash_brush.GetColour(); break;
-        case wxAUI_ART_INACTIVE_CAPTION_COLOUR:          return m_inactive_caption_colour; break;
-        case wxAUI_ART_INACTIVE_CAPTION_GRADIENT_COLOUR: return m_inactive_caption_gradient_colour; break;
-        case wxAUI_ART_INACTIVE_CAPTION_TEXT_COLOUR:     return m_inactive_caption_text_colour; break;
-        case wxAUI_ART_ACTIVE_CAPTION_COLOUR:            return m_active_caption_colour; break;
-        case wxAUI_ART_ACTIVE_CAPTION_GRADIENT_COLOUR:   return m_active_caption_gradient_colour; break;
-        case wxAUI_ART_ACTIVE_CAPTION_TEXT_COLOUR:       return m_active_caption_text_colour; break;
-        case wxAUI_ART_BORDER_COLOUR:                    return m_border_pen.GetColour(); break;
-        case wxAUI_ART_GRIPPER_COLOUR:                   return m_gripper_brush.GetColour(); break;
+        case wxAUI_ART_BACKGROUND_COLOUR:                return m_background_brush.GetColour();
+        case wxAUI_ART_SASH_COLOUR:                      return m_sash_brush.GetColour();
+        case wxAUI_ART_INACTIVE_CAPTION_COLOUR:          return m_inactive_caption_colour;
+        case wxAUI_ART_INACTIVE_CAPTION_GRADIENT_COLOUR: return m_inactive_caption_gradient_colour;
+        case wxAUI_ART_INACTIVE_CAPTION_TEXT_COLOUR:     return m_inactive_caption_text_colour;
+        case wxAUI_ART_ACTIVE_CAPTION_COLOUR:            return m_active_caption_colour;
+        case wxAUI_ART_ACTIVE_CAPTION_GRADIENT_COLOUR:   return m_active_caption_gradient_colour;
+        case wxAUI_ART_ACTIVE_CAPTION_TEXT_COLOUR:       return m_active_caption_text_colour;
+        case wxAUI_ART_BORDER_COLOUR:                    return m_border_pen.GetColour();
+        case wxAUI_ART_GRIPPER_COLOUR:                   return m_gripper_brush.GetColour();
         default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
     }
 
@@ -285,13 +307,13 @@ wxFont wxDefaultDockArt::GetFont(int id)
     return wxNullFont;
 }
 
-void wxDefaultDockArt::DrawSash(wxDC& dc, int, const wxRect& rect)
+void wxDefaultDockArt::DrawSash(wxDC& dc, wxWindow *window, int orientation, const wxRect& rect)
 {
-#ifdef __WXMAC__
+#if defined(__WXMAC__)
     HIRect splitterRect = CGRectMake( rect.x , rect.y , rect.width , rect.height );
     CGContextRef cgContext ;
 #if wxMAC_USE_CORE_GRAPHICS
-    cgContext = ((wxMacCGContext*)(dc.GetGraphicContext()))->GetNativeContext() ;
+    cgContext = (CGContextRef) dc.GetGraphicsContext()->GetNativeContext() ;
 #else
     Rect bounds ;
     GetPortBounds( (CGrafPtr) dc.m_macPort , &bounds ) ;
@@ -299,19 +321,60 @@ void wxDefaultDockArt::DrawSash(wxDC& dc, int, const wxRect& rect)
     CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ;
     CGContextScaleCTM( cgContext , 1 , -1 ) ;
 #endif
-    
+
     HIThemeSplitterDrawInfo drawInfo ;
     drawInfo.version = 0 ;
     drawInfo.state = kThemeStateActive ;
     drawInfo.adornment = kHIThemeSplitterAdornmentNone ;
-    HIThemeDrawPaneSplitter( &splitterRect , &drawInfo , cgContext , kHIThemeOrientationNormal ) ;    
-    
+    HIThemeDrawPaneSplitter( &splitterRect , &drawInfo , cgContext , kHIThemeOrientationNormal ) ;
+
 #if wxMAC_USE_CORE_GRAPHICS
 #else
     QDEndCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ;
 #endif
 
+#elif defined(__WXGTK__)
+
+    GdkRectangle gdk_rect;
+    if (orientation == wxVERTICAL )
+    {
+        gdk_rect.x = rect.x;
+        gdk_rect.y = rect.y;
+        gdk_rect.width = m_sash_size;
+        gdk_rect.height = rect.height;
+    }
+    else
+    {
+        gdk_rect.x = rect.x;
+        gdk_rect.y = rect.y;
+        gdk_rect.width = rect.width;
+        gdk_rect.height = m_sash_size;
+    }
+
+    if (!window) return;
+    if (!window->m_wxwindow) return;
+    if (!GTK_PIZZA(window->m_wxwindow)->bin_window) return;
+
+    gtk_paint_handle
+    (
+        window->m_wxwindow->style,
+        GTK_PIZZA(window->m_wxwindow)->bin_window,
+        // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL,
+        GTK_STATE_NORMAL,
+        GTK_SHADOW_NONE,
+        NULL /* no clipping */,
+        window->m_wxwindow,
+        "paned",
+        rect.x,
+        rect.y,
+        rect.width,
+        rect.height,
+        (orientation == wxVERTICAL) ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL
+    );
+
 #else
+    wxUnusedVar(window);
+    wxUnusedVar(orientation);
     dc.SetPen(*wxTRANSPARENT_PEN);
     dc.SetBrush(m_sash_brush);
     dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
@@ -319,7 +382,7 @@ void wxDefaultDockArt::DrawSash(wxDC& dc, int, const wxRect& rect)
 }
 
 
-void wxDefaultDockArt::DrawBackground(wxDC& dc, int, const wxRect& rect)
+void wxDefaultDockArt::DrawBackground(wxDC& dc, wxWindow *WXUNUSED(window), int, const wxRect& rect)
 {
     dc.SetPen(*wxTRANSPARENT_PEN);
 #ifdef __WXMAC__
@@ -332,7 +395,7 @@ void wxDefaultDockArt::DrawBackground(wxDC& dc, int, const wxRect& rect)
     dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
 }
 
-void wxDefaultDockArt::DrawBorder(wxDC& dc, const wxRect& _rect,
+void wxDefaultDockArt::DrawBorder(wxDC& dc, wxWindow *WXUNUSED(window), const wxRect& _rect,
                                   wxPaneInfo& pane)
 {
     dc.SetPen(m_border_pen);
@@ -348,7 +411,7 @@ void wxDefaultDockArt::DrawBorder(wxDC& dc, const wxRect& _rect,
             dc.SetPen(*wxWHITE_PEN);
             dc.DrawLine(rect.x, rect.y, rect.x+rect.width, rect.y);
             dc.DrawLine(rect.x, rect.y, rect.x, rect.y+rect.height);
-            dc.SetPen(m_border_pen);       
+            dc.SetPen(m_border_pen);
             dc.DrawLine(rect.x, rect.y+rect.height-1,
                         rect.x+rect.width, rect.y+rect.height-1);
             dc.DrawLine(rect.x+rect.width-1, rect.y,
@@ -356,7 +419,7 @@ void wxDefaultDockArt::DrawBorder(wxDC& dc, const wxRect& _rect,
             rect.Deflate(1);
         }
     }
-     else
+    else
     {
         for (i = 0; i < border_width; ++i)
         {
@@ -378,7 +441,7 @@ void wxDefaultDockArt::DrawCaptionBackground(wxDC& dc, const wxRect& rect, bool
 
         dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
     }
-     else
+    else
     {
         if (active)
         {
@@ -414,7 +477,7 @@ void wxDefaultDockArt::DrawCaptionBackground(wxDC& dc, const wxRect& rect, bool
 }
 
 
-void wxDefaultDockArt::DrawCaption(wxDC& dc,
+void wxDefaultDockArt::DrawCaption(wxDC& dc, wxWindow *WXUNUSED(window),
                                    const wxString& text,
                                    const wxRect& rect,
                                    wxPaneInfo& pane)
@@ -427,7 +490,7 @@ void wxDefaultDockArt::DrawCaption(wxDC& dc,
 
     if (pane.state & wxPaneInfo::optionActive)
         dc.SetTextForeground(m_active_caption_text_colour);
-     else
+    else
         dc.SetTextForeground(m_inactive_caption_text_colour);
 
 
@@ -439,7 +502,7 @@ void wxDefaultDockArt::DrawCaption(wxDC& dc,
     dc.DestroyClippingRegion();
 }
 
-void wxDefaultDockArt::DrawGripper(wxDC& dc,
+void wxDefaultDockArt::DrawGripper(wxDC& dc, wxWindow *WXUNUSED(window),
                                    const wxRect& rect,
                                    wxPaneInfo& pane)
 {
@@ -490,7 +553,7 @@ void wxDefaultDockArt::DrawGripper(wxDC& dc,
     }
 }
 
-void wxDefaultDockArt::DrawPaneButton(wxDC& dc,
+void wxDefaultDockArt::DrawPaneButton(wxDC& dc, wxWindow *WXUNUSED(window),
                                       int button,
                                       int button_state,
                                       const wxRect& _rect,