From 8e9ec7239f5395666be46b3edd3a6b889fecfe48 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 9 Oct 2006 20:12:19 +0000 Subject: [PATCH] [ 1573855 ] Improved appearance of wxComboCtrl's wxTextCtrl More work needs to be done for the version with images. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41835 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/combo.h | 2 + src/common/combocmn.cpp | 6 ++- src/generic/combog.cpp | 108 ++++++++++++++++++++++++++++++++----- 3 files changed, 102 insertions(+), 14 deletions(-) diff --git a/include/wx/generic/combo.h b/include/wx/generic/combo.h index 6d19c75808..8ed30e4e32 100644 --- a/include/wx/generic/combo.h +++ b/include/wx/generic/combo.h @@ -65,6 +65,8 @@ public: virtual ~wxGenericComboCtrl(); + void SetCustomPaintWidth( int width ); + virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const; static int GetFeatures() { return wxComboCtrlFeatures::All; } diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 7f613330e3..84a4a7e9c5 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -697,6 +697,9 @@ wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator) { if ( !(m_windowStyle & wxCB_READONLY) ) { + if ( m_text ) + m_text->Destroy(); + // wxTE_PROCESS_TAB is needed because on Windows, wxTAB_TRAVERSAL is // not used by the wxPropertyGrid and therefore the tab is processed by // looking at ancestors to see if they have wxTAB_TRAVERSAL. The @@ -906,9 +909,10 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust } else { + // If it has border, have textctrl will the entire text field. m_text->SetSize( m_tcArea.x, 0, - sz.x - m_btnArea.x - m_widthCustomPaint - customBorder, + sz.x - m_btnArea.width - m_widthCustomPaint - customBorder, sz.y ); } } diff --git a/src/generic/combog.cpp b/src/generic/combog.cpp index b8a193a68c..0db207c152 100644 --- a/src/generic/combog.cpp +++ b/src/generic/combog.cpp @@ -110,15 +110,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 +128,42 @@ 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 ); + #endif + style = (style & ~(wxBORDER_MASK)) | border; if ( style & wxCC_STD_BUTTON ) m_iFlags |= wxCC_POPUP_ON_MOUSE_UP; @@ -158,7 +179,7 @@ bool wxGenericComboCtrl::Create(wxWindow *parent, return false; // Create textctrl, if necessary - CreateTextCtrl( wxNO_BORDER, validator ); + CreateTextCtrl( tcBorder, validator ); // Add keyboard input handlers for main control and textctrl InstallInputHandlers(); @@ -323,6 +344,67 @@ 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; + + wxValidator* pValidator = tc->GetValidator(); + if ( pValidator ) + { + pValidator = (wxValidator*) pValidator->Clone(); + CreateTextCtrl( tcCreateStyle, *pValidator ); + delete pValidator; + } + else + { + CreateTextCtrl( tcCreateStyle, wxDefaultValidator ); + } + + InstallInputHandlers(); + } + } +#endif // UNRELIABLE_TEXTCTRL_BORDER + + wxComboCtrlBase::SetCustomPaintWidth( width ); +} + bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const { int keycode = event.GetKeyCode(); -- 2.45.2