]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/combo.cpp
Fix compilation under MSW with GCC cross.
[wxWidgets.git] / src / msw / combo.cpp
index 92711ac9d6a0a2c2262da2d689a5fc4eb931cad5..124204b43f69d7a614a3423b831fdc73a43ee834 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        combo.cpp
+// Name:        src/msw/combo.cpp
 // Purpose:     wxMSW wxComboCtrl
 // Author:      Jaakko Salli
 // Modified by:
@@ -119,13 +119,13 @@ bool wxComboCtrl::Create(wxWindow *parent,
 
     // create main window
     if ( !wxComboCtrlBase::Create(parent,
-                            id,
-                            value,
-                            wxDefaultPosition,
-                            wxDefaultSize,
-                            style | wxFULL_REPAINT_ON_RESIZE,
-                            wxDefaultValidator,
-                            name) )
+                           id,
+                           value,
+                           pos,
+                           size,
+                           style | wxFULL_REPAINT_ON_RESIZE,
+                           wxDefaultValidator,
+                           name) )
         return false;
 
     if ( style & wxCC_STD_BUTTON )
@@ -135,13 +135,13 @@ bool wxComboCtrl::Create(wxWindow *parent,
     CreateTextCtrl( wxNO_BORDER, validator );
 
     // Add keyboard input handlers for main control and textctrl
-    InstallInputHandlers( true );
+    InstallInputHandlers();
 
     // Prepare background for double-buffering
     SetBackgroundStyle( wxBG_STYLE_CUSTOM );
 
-    // SetSize should be called last
-    SetSize(pos.x,pos.y,size.x,size.y);
+    // SetBestSize should be called last
+    SetBestSize(size);
 
     return true;
 }
@@ -239,9 +239,12 @@ static void wxMSWDrawFocusRect( wxDC& dc, const wxRect& rect )
 }
 
 // draw focus background on area in a way typical on platform
-void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags )
+void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) const
 {
     wxUxThemeEngine* theme = (wxUxThemeEngine*) NULL;
+
+    // Constructor only calls GetHWND() const, so it should be safe
+    // to cast "this" to const.
     wxUxThemeHandle hTheme(this, L"COMBOBOX");
     //COLORREF cref;
 
@@ -295,8 +298,14 @@ void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags )
     wxRect selRect(rect);
     selRect.y += focusSpacingY;
     selRect.height -= (focusSpacingY*2);
-    selRect.x += m_widthCustomPaint + focusSpacingX;
-    selRect.width -= m_widthCustomPaint + (focusSpacingX*2);
+
+    int wcp = 0;
+
+    if ( !(flags & wxCONTROL_ISSUBMENU) )
+        wcp += m_widthCustomPaint;
+
+    selRect.x += wcp + focusSpacingX;
+    selRect.width -= wcp + (focusSpacingX*2);
 
     if ( hTheme )
         theme = wxUxThemeEngine::GetIfActive();
@@ -448,7 +457,7 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
                                          &r);
 
         drawButBg = false;
-    } 
+    }
 
     // Standard button rendering
     DrawButton(dc,rectb,drawButBg);
@@ -520,5 +529,39 @@ wxCoord wxComboCtrl::GetNativeTextIndent() const
     return NATIVE_TEXT_INDENT_CLASSIC;
 }
 
+bool wxComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
+{
+    const bool isPopupShown = IsPopupShown();
+
+    switch ( event.GetKeyCode() )
+    {
+        case WXK_F4:
+            // F4 toggles the popup in the native comboboxes, so emulate them
+            if ( !event.AltDown() )
+                return true;
+            break;
+
+        case WXK_ESCAPE:
+            if ( isPopupShown )
+                return true;
+            break;
+
+        case WXK_DOWN:
+        case WXK_UP:
+            // On XP or with writable combo in Classic, arrows don't open the
+            // popup but Alt-arrow does
+            if ( event.AltDown() ||
+                    ( !isPopupShown &&
+                      HasFlag(wxCB_READONLY) &&
+                      !wxUxThemeEngine::GetIfActive()
+                    ) )
+            {
+                return true;
+            }
+            break;
+    }
+
+    return false;
+}
 
 #endif // wxUSE_COMBOCTRL