X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1efad474fdc991183054287762e93756c5084e6c..703e3c42d11a74be69cc1dee560e2c0f359ac13f:/src/generic/combog.cpp diff --git a/src/generic/combog.cpp b/src/generic/combog.cpp index 5864782b95..c70e9d405a 100644 --- a/src/generic/combog.cpp +++ b/src/generic/combog.cpp @@ -32,6 +32,7 @@ #include "wx/combobox.h" #include "wx/dcclient.h" #include "wx/settings.h" + #include "wx/textctrl.h" #endif #include "wx/dcbuffer.h" @@ -41,35 +42,50 @@ #if defined(__WXUNIVERSAL__) -#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent +// 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 TEXTCTRLYADJUST 0 #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 +// 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 TEXTCTRLYADJUST 3 #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 +// 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 TEXTCTRLYADJUST 0 #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 +// 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 TEXTCTRLYADJUST 0 #define TEXTXADJUST 0 // how much is read-only text's x adjusted -#define DEFAULT_DROPBUTTON_WIDTH 19 +#define DEFAULT_DROPBUTTON_WIDTH 22 #else -#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent +// 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 TEXTCTRLYADJUST 0 #define TEXTXADJUST 0 // how much is read-only text's x adjusted #define DEFAULT_DROPBUTTON_WIDTH 19 @@ -110,15 +126,16 @@ bool wxGenericComboCtrl::Create(wxWindow *parent, const wxValidator& validator, const wxString& name) { - - // Set border + // + // Note that technically we only support 'default' border and wxNO_BORDER. long border = style & wxBORDER_MASK; + int tcBorder = wxNO_BORDER; - if ( !border ) - { #if defined(__WXUNIVERSAL__) + if ( !border ) border = wxBORDER_SIMPLE; #elif defined(__WXMSW__) + if ( !border ) // For XP, have 1-width custom border, for older version use sunken /*if ( wxUxThemeEngine::GetIfActive() ) { @@ -127,22 +144,43 @@ bool wxGenericComboCtrl::Create(wxWindow *parent, } else*/ border = wxBORDER_SUNKEN; -#elif defined(__WXGTK__) - border = wxBORDER_NONE; - //m_widthCustomBorder = 2; - m_widthCustomBorder = 1; #else - border = wxBORDER_SIMPLE; -#endif - style = (style & ~(wxBORDER_MASK)) | border; + // + // Generic version is optimized for wxGTK + // + + #define UNRELIABLE_TEXTCTRL_BORDER + + if ( !border ) + { + if ( style & wxCB_READONLY ) + { + m_widthCustomBorder = 1; + } + else + { + m_widthCustomBorder = 0; + tcBorder = 0; + } + } + else + { + // Have textctrl instead use the border given. + tcBorder = border; } -#if defined(__WXGTK__) + // Because we are going to have button outside the border, + // let's use wxBORDER_NONE for the whole control. + border = wxBORDER_NONE; + Customize( wxCC_BUTTON_OUTSIDE_BORDER | - wxCC_NO_TEXT_AUTO_SELECT ); + wxCC_NO_TEXT_AUTO_SELECT | + wxCC_BUTTON_STAYS_DOWN ); + #endif + style = (style & ~(wxBORDER_MASK)) | border; if ( style & wxCC_STD_BUTTON ) m_iFlags |= wxCC_POPUP_ON_MOUSE_UP; @@ -153,12 +191,12 @@ bool wxGenericComboCtrl::Create(wxWindow *parent, pos, size, style | wxFULL_REPAINT_ON_RESIZE, - wxDefaultValidator, + validator, name) ) return false; // Create textctrl, if necessary - CreateTextCtrl( wxNO_BORDER, validator ); + CreateTextCtrl( tcBorder ); // Add keyboard input handlers for main control and textctrl InstallInputHandlers(); @@ -166,8 +204,8 @@ bool wxGenericComboCtrl::Create(wxWindow *parent, // Set background SetBackgroundStyle( wxBG_STYLE_CUSTOM ); // for double-buffering - // SetBestSize should be called last - SetBestSize(size); + // SetInitialSize should be called last + SetInitialSize(size); return true; } @@ -201,7 +239,7 @@ void wxGenericComboCtrl::OnResize() void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) { wxSize sz = GetClientSize(); - wxBufferedPaintDC dc(this,GetBufferBitmap(sz)); + wxAutoBufferedPaintDC dc(this); const wxRect& rectb = m_btnArea; wxRect rect = m_tcArea; @@ -214,7 +252,7 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) // Set border colour wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT), customBorder, - wxSOLID ); + wxPENSTYLE_SOLID); dc.SetPen( pen1 ); // area around both controls @@ -244,7 +282,11 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) 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); @@ -255,8 +297,10 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) dc.DrawRectangle(rect); if ( !m_btn ) + { // Standard button rendering - DrawButton(dc,rectb,true); + DrawButton(dc,rectb); + } // paint required portion on the control if ( (!m_text || m_widthCustomPaint) ) @@ -323,6 +367,57 @@ void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event ) } +void wxGenericComboCtrl::SetCustomPaintWidth( int width ) +{ +#ifdef UNRELIABLE_TEXTCTRL_BORDER + // + // If starting/stopping to show an image in front + // of a writable text-field, then re-create textctrl + // with different kind of border (because we can't + // assume that textctrl fully supports wxNO_BORDER). + // + wxTextCtrl* tc = GetTextCtrl(); + + if ( tc && (m_iFlags & wxCC_BUTTON_OUTSIDE_BORDER) ) + { + int borderType = tc->GetWindowStyle() & wxBORDER_MASK; + int tcCreateStyle = -1; + + if ( width > 0 ) + { + // Re-create textctrl with no border + if ( borderType != wxNO_BORDER ) + { + m_widthCustomBorder = 1; + tcCreateStyle = wxNO_BORDER; + } + } + else if ( width == 0 ) + { + // Re-create textctrl with normal border + if ( borderType == wxNO_BORDER ) + { + m_widthCustomBorder = 0; + tcCreateStyle = 0; + } + } + + // Common textctrl re-creation code + if ( tcCreateStyle != -1 ) + { + tc->RemoveEventHandler(m_textEvtHandler); + delete m_textEvtHandler; + + CreateTextCtrl( tcCreateStyle ); + + InstallInputHandlers(); + } + } +#endif // UNRELIABLE_TEXTCTRL_BORDER + + wxComboCtrlBase::SetCustomPaintWidth( width ); +} + bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const { int keycode = event.GetKeyCode(); @@ -338,7 +433,8 @@ bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const } else { - if ( keycode == WXK_DOWN && event.AltDown() ) + if ( (keycode == WXK_DOWN && event.AltDown()) || + (keycode == WXK_F4) ) return true; } @@ -354,7 +450,7 @@ bool wxGenericComboCtrl::PerformAction(const wxControlAction& action, bool processed = false; if ( action == wxACTION_COMBOBOX_POPUP ) { - if ( !m_isPopupShown ) + if ( !IsPopupShown() ) { ShowPopup(); @@ -363,7 +459,7 @@ bool wxGenericComboCtrl::PerformAction(const wxControlAction& action, } else if ( action == wxACTION_COMBOBOX_DISMISS ) { - if ( m_isPopupShown ) + if ( IsPopupShown() ) { HidePopup();