X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a57d600f1aa4bae88f4c9b8d89a35332c412939e..03e7d1397ecbc051c6ee3adbc7928ffd404b57f2:/src/msw/combo.cpp?ds=sidebyside diff --git a/src/msw/combo.cpp b/src/msw/combo.cpp index 92711ac9d6..124204b43f 100644 --- a/src/msw/combo.cpp +++ b/src/msw/combo.cpp @@ -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