]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/combog.cpp
Ensure there is valid context for DrawRectangle
[wxWidgets.git] / src / generic / combog.cpp
index 674e5f1806286c21dcf2012751b14f68acef7dd8..615106085c867a398baeebc34a36d0c861e94030 100644 (file)
@@ -32,6 +32,7 @@
     #include "wx/combobox.h"
     #include "wx/dcclient.h"
     #include "wx/settings.h"
     #include "wx/combobox.h"
     #include "wx/dcclient.h"
     #include "wx/settings.h"
+    #include "wx/textctrl.h"
 #endif
 
 #include "wx/dcbuffer.h"
 #endif
 
 #include "wx/dcbuffer.h"
 
 #if defined(__WXUNIVERSAL__)
 
 
 #if defined(__WXUNIVERSAL__)
 
-#define TEXTCTRLXADJUST                 0 // position adjustment for wxTextCtrl, with zero indent
-#define TEXTCTRLYADJUST                 0
+// position adjustment for wxTextCtrl, to achieve zero left margin
+// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
+#define TEXTCTRLXADJUST                 0
+
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        19
 
 #elif defined(__WXMSW__)
 
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        19
 
 #elif defined(__WXMSW__)
 
-#define TEXTCTRLXADJUST                 2 // position adjustment for wxTextCtrl, with zero indent
-#define TEXTCTRLYADJUST                 3
+// position adjustment for wxTextCtrl, to achieve zero left margin
+// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
+#define TEXTCTRLXADJUST                 2
+
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        17
 
 #elif defined(__WXGTK__)
 
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        17
 
 #elif defined(__WXGTK__)
 
-#define TEXTCTRLXADJUST                 -1 // position adjustment for wxTextCtrl, with zero indent
-#define TEXTCTRLYADJUST                 0
+// position adjustment for wxTextCtrl, to achieve zero left margin
+// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
+#define TEXTCTRLXADJUST                 -1
+
 #define TEXTXADJUST                     1 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        23
 
 #elif defined(__WXMAC__)
 
 #define TEXTXADJUST                     1 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        23
 
 #elif defined(__WXMAC__)
 
-#define TEXTCTRLXADJUST                 0 // position adjustment for wxTextCtrl, with zero indent
-#define TEXTCTRLYADJUST                 0
+// position adjustment for wxTextCtrl, to achieve zero left margin
+// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
+#define TEXTCTRLXADJUST                 0
+
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        22
 
 #else
 
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        22
 
 #else
 
-#define TEXTCTRLXADJUST                 0 // position adjustment for wxTextCtrl, with zero indent
-#define TEXTCTRLYADJUST                 0
+// position adjustment for wxTextCtrl, to achieve zero left margin
+// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
+#define TEXTCTRLXADJUST                 0
+
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        19
 
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define DEFAULT_DROPBUTTON_WIDTH        19
 
@@ -159,7 +170,8 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
     border = wxBORDER_NONE;
 
     Customize( wxCC_BUTTON_OUTSIDE_BORDER |
     border = wxBORDER_NONE;
 
     Customize( wxCC_BUTTON_OUTSIDE_BORDER |
-               wxCC_NO_TEXT_AUTO_SELECT );
+               wxCC_NO_TEXT_AUTO_SELECT |
+               wxCC_BUTTON_STAYS_DOWN );
 
 #endif
 
 
 #endif
 
@@ -174,18 +186,20 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
                                   pos,
                                   size,
                                   style | wxFULL_REPAINT_ON_RESIZE,
                                   pos,
                                   size,
                                   style | wxFULL_REPAINT_ON_RESIZE,
-                                  wxDefaultValidator,
+                                  validator,
                                   name) )
         return false;
 
     // Create textctrl, if necessary
                                   name) )
         return false;
 
     // Create textctrl, if necessary
-    CreateTextCtrl( tcBorder, validator );
+    CreateTextCtrl( tcBorder );
 
     // Add keyboard input handlers for main control and textctrl
     InstallInputHandlers();
 
 
     // Add keyboard input handlers for main control and textctrl
     InstallInputHandlers();
 
-    // Set background
-    SetBackgroundStyle( wxBG_STYLE_CUSTOM ); // for double-buffering
+    // Set background style for double-buffering, when needed
+    // (cannot use when system draws background automatically)
+    if ( !HasTransparentBackground() )
+        SetBackgroundStyle( wxBG_STYLE_PAINT );
 
     // SetInitialSize should be called last
     SetInitialSize(size);
 
     // SetInitialSize should be called last
     SetInitialSize(size);
@@ -216,16 +230,24 @@ void wxGenericComboCtrl::OnResize()
 #endif
 
     // Move textctrl, if any, accordingly
 #endif
 
     // Move textctrl, if any, accordingly
-    PositionTextCtrl( TEXTCTRLXADJUST, TEXTCTRLYADJUST );
+    PositionTextCtrl( TEXTCTRLXADJUST );
 }
 
 void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 {
 }
 
 void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 {
-    wxSize sz = GetClientSize();
-    wxAutoBufferedPaintDC dc(this);
+    // Determine wxDC to use based on need to double-buffer or
+    // use system-generated transparent background portions
+    wxDC* dcPtr;
+    if ( HasTransparentBackground() )
+        dcPtr = new wxPaintDC(this);
+    else
+        dcPtr = new wxAutoBufferedPaintDC(this);
+    wxDC& dc = *dcPtr;
 
 
-    const wxRect& rectb = m_btnArea;
-    wxRect rect = m_tcArea;
+    wxSize sz = GetClientSize();
+    const wxRect& butRect = m_btnArea;
+    wxRect tcRect = m_tcArea;
+    wxRect fullRect(0, 0, sz.x, sz.y);
 
     // artificial simple border
     if ( m_widthCustomBorder )
 
     // artificial simple border
     if ( m_widthCustomBorder )
@@ -233,16 +255,22 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
         int customBorder = m_widthCustomBorder;
 
         // Set border colour
         int customBorder = m_widthCustomBorder;
 
         // Set border colour
-        wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT),
+#ifdef __WXMAC__
+        wxPen pen1( wxColour(133,133,133),
                     customBorder,
                     wxSOLID );
                     customBorder,
                     wxSOLID );
+#else
+        wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT),
+                    customBorder,
+                    wxPENSTYLE_SOLID);
+#endif
         dc.SetPen( pen1 );
 
         // area around both controls
         dc.SetPen( pen1 );
 
         // area around both controls
-        wxRect rect2(0,0,sz.x,sz.y);
+        wxRect rect2(fullRect);
         if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE )
         {
         if ( m_iFlags & wxCC_IFLAG_BUTTON_OUTSIDE )
         {
-            rect2 = m_tcArea;
+            rect2 = tcRect;
             if ( customBorder == 1 )
             {
                 rect2.Inflate(1);
             if ( customBorder == 1 )
             {
                 rect2.Inflate(1);
@@ -265,44 +293,49 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
         dc.DrawRectangle(rect2);
     }
 
         dc.DrawRectangle(rect2);
     }
 
-#ifndef __WXMAC__  // see note in OnThemeChange
-    wxColour winCol = GetBackgroundColour();
-#else
-    wxColour winCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
-#endif
-    dc.SetBrush(winCol);
-    dc.SetPen(winCol);
+    // Clear the main background if the system doesn't do it by itself
+    if ( !HasTransparentBackground() &&
+         (tcRect.x > 0 || tcRect.y > 0) )
+    {
+        wxColour winCol = GetParent()->GetBackgroundColour();
+        dc.SetBrush(winCol);
+        dc.SetPen(winCol);
 
 
-    //wxLogDebug(wxT("hei: %i tcy: %i tchei: %i"),GetClientSize().y,m_tcArea.y,m_tcArea.height);
-    //wxLogDebug(wxT("btnx: %i tcx: %i tcwid: %i"),m_btnArea.x,m_tcArea.x,m_tcArea.width);
+        dc.DrawRectangle(fullRect);
+    }
 
 
-    // clear main background
-    dc.DrawRectangle(rect);
-    
     if ( !m_btn )
     {
         // Standard button rendering
     if ( !m_btn )
     {
         // Standard button rendering
-        DrawButton(dc,rectb);
+        DrawButton(dc, butRect);
     }
 
     // paint required portion on the control
     }
 
     // paint required portion on the control
-    if ( (!m_text || m_widthCustomPaint) )
+    if ( !m_text || m_widthCustomPaint )
     {
         wxASSERT( m_widthCustomPaint >= 0 );
 
     {
         wxASSERT( m_widthCustomPaint >= 0 );
 
+        // Clear the text-control area background
+        wxColour tcCol = GetBackgroundColour();
+        dc.SetBrush(tcCol);
+        dc.SetPen(tcCol);
+        dc.DrawRectangle(tcRect);
+
         // this is intentionally here to allow drawed rectangle's
         // right edge to be hidden
         if ( m_text )
         // this is intentionally here to allow drawed rectangle's
         // right edge to be hidden
         if ( m_text )
-            rect.width = m_widthCustomPaint;
+            tcRect.width = m_widthCustomPaint;
 
         dc.SetFont( GetFont() );
 
 
         dc.SetFont( GetFont() );
 
-        dc.SetClippingRegion(rect);
+        dc.SetClippingRegion(tcRect);
         if ( m_popupInterface )
         if ( m_popupInterface )
-            m_popupInterface->PaintComboControl(dc,rect);
+            m_popupInterface->PaintComboControl(dc, tcRect);
         else
         else
-            wxComboPopup::DefaultPaintComboControl(this,dc,rect);
+            wxComboPopup::DefaultPaintComboControl(this, dc, tcRect);
     }
     }
+
+    delete dcPtr;
 }
 
 void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event )
 }
 
 void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event )
@@ -391,17 +424,7 @@ void wxGenericComboCtrl::SetCustomPaintWidth( int width )
             tc->RemoveEventHandler(m_textEvtHandler);
             delete m_textEvtHandler;
 
             tc->RemoveEventHandler(m_textEvtHandler);
             delete m_textEvtHandler;
 
-            wxValidator* pValidator = tc->GetValidator();
-            if ( pValidator )
-            {
-                pValidator = (wxValidator*) pValidator->Clone();
-                CreateTextCtrl( tcCreateStyle, *pValidator );
-                delete pValidator;
-            }
-            else
-            {
-                CreateTextCtrl( tcCreateStyle, wxDefaultValidator );
-            }
+            CreateTextCtrl( tcCreateStyle );
 
             InstallInputHandlers();
         }
 
             InstallInputHandlers();
         }
@@ -426,7 +449,8 @@ bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
     }
     else
     {
     }
     else
     {
-        if ( keycode == WXK_DOWN && event.AltDown() )
+        if ( (keycode == WXK_DOWN && event.AltDown()) ||
+             (keycode == WXK_F4) )
             return true;
     }
 
             return true;
     }