X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a5bbd1cc9119aa8df58e11d7d9db7ace0ef98bfd..cd7d36c065d638f48cff0845a43e35b9ed1e25f6:/src/common/combocmn.cpp diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 36a3bbe91a..aef6c75cbf 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -35,7 +35,6 @@ #include "wx/timer.h" #endif -#include "wx/dcbuffer.h" #include "wx/tooltip.h" #include "wx/combo.h" @@ -53,7 +52,7 @@ #define BMP_BUTTON_MARGIN 4 -#define DEFAULT_POPUP_HEIGHT 200 +#define DEFAULT_POPUP_HEIGHT 400 #define DEFAULT_TEXT_INDENT 3 @@ -63,6 +62,7 @@ #if defined(__WXMSW__) #define USE_TRANSIENT_POPUP 1 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TEXTCTRL_TEXT_CENTERED 0 // 1 if text in textctrl is vertically centered //#undef wxUSE_POPUPWIN //#define wxUSE_POPUPWIN 0 @@ -70,14 +70,17 @@ #elif defined(__WXGTK__) #define USE_TRANSIENT_POPUP 1 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered #elif defined(__WXMAC__) #define USE_TRANSIENT_POPUP 0 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered #else #define USE_TRANSIENT_POPUP 0 // Use wxPopupWindowTransient (preferred, if it works properly on platform) +#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered #endif @@ -140,7 +143,7 @@ class wxComboFrameEventHandler : public wxEvtHandler { public: wxComboFrameEventHandler( wxComboCtrlBase* pCb ); - ~wxComboFrameEventHandler(); + virtual ~wxComboFrameEventHandler(); void OnPopup(); @@ -191,7 +194,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) { wxWindow* winFocused = ::wxWindow::FindFocus(); - wxWindow* popup = m_combo->GetPopupControl(); + wxWindow* popup = m_combo->GetPopupControl()->GetControl(); wxWindow* winpopup = m_combo->GetPopupWindow(); if ( @@ -386,7 +389,7 @@ void wxComboPopup::DefaultPaintComboControl( wxComboCtrlBase* combo, { if ( combo->GetWindowStyle() & wxCB_READONLY ) // ie. no textctrl { - combo->DrawFocusBackground(dc,rect,0); + combo->PrepareBackground(dc,rect,0); dc.DrawText( combo->GetValue(), rect.x + combo->GetTextIndent(), @@ -427,8 +430,7 @@ void wxComboPopup::Dismiss() // ---------------------------------------------------------------------------- // -// This is pushed to the event handler queue of either combo box -// or its textctrl (latter if not readonly combo). +// This is pushed to the event handler queue of the child textctrl. // class wxComboBoxExtraInputHandler : public wxEvtHandler { @@ -439,7 +441,7 @@ public: { m_combo = combo; } - ~wxComboBoxExtraInputHandler() { } + virtual ~wxComboBoxExtraInputHandler() { } void OnKey(wxKeyEvent& event); void OnFocus(wxFocusEvent& event); @@ -459,56 +461,16 @@ END_EVENT_TABLE() void wxComboBoxExtraInputHandler::OnKey(wxKeyEvent& event) { - int keycode = event.GetKeyCode(); + // Let the wxComboCtrl event handler have a go first. + wxComboCtrlBase* combo = m_combo; + wxObject* prevObj = event.GetEventObject(); - if ( keycode == WXK_TAB ) - { - wxNavigationKeyEvent evt; - evt.SetFlags(wxNavigationKeyEvent::FromTab| - (!event.ShiftDown()?wxNavigationKeyEvent::IsForward: - wxNavigationKeyEvent::IsBackward)); - evt.SetEventObject(m_combo); - m_combo->GetParent()->GetEventHandler()->AddPendingEvent(evt); - return; - } - - if ( m_combo->IsPopupShown() ) - { - // pass it to the popped up control - m_combo->GetPopupControl()->GetControl()->AddPendingEvent(event); - } - else // no popup - { - int comboStyle = m_combo->GetWindowStyle(); - wxComboPopup* popupInterface = m_combo->GetPopupControl(); + event.SetId(combo->GetId()); + event.SetEventObject(combo); + combo->GetEventHandler()->ProcessEvent(event); - if ( !popupInterface ) - { - event.Skip(); - return; - } - - if ( (comboStyle & wxCB_READONLY) || - ( keycode != WXK_RIGHT && keycode != WXK_LEFT ) - ) - { - // Alternate keys: UP and DOWN show the popup instead of cycling - if ( (comboStyle & wxCC_ALT_KEYS) ) - { - if ( keycode == WXK_UP || keycode == WXK_DOWN ) - { - m_combo->OnButtonClick(); - return; - } - else - event.Skip(); - } - else - popupInterface->OnComboKeyEvent(event); - } - else - event.Skip(); - } + event.SetId(((wxWindow*)prevObj)->GetId()); + event.SetEventObject(prevObj); } void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event) @@ -523,17 +485,15 @@ void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event) m_combo->SetSelection(-1,-1); } - if ( event.GetId() != m_combo->GetId() ) - { - // Add textctrl set focus events as combo set focus events - // NOTE: Simply changing the event and skipping didn't seem - // to do the trick. - wxFocusEvent evt2(wxEVT_SET_FOCUS,m_combo->GetId()); - evt2.SetEventObject(m_combo); - m_combo->GetEventHandler()->ProcessEvent(evt2); - } - else - event.Skip(); + // Send focus indication to parent. + // NB: This is needed for cases where the textctrl gets focus + // instead of its parent. While this may trigger multiple + // wxEVT_SET_FOCUSes (since m_text->SetFocus is called + // from combo's focus event handler), they should be quite + // harmless. + wxFocusEvent evt2(wxEVT_SET_FOCUS,m_combo->GetId()); + evt2.SetEventObject(m_combo); + m_combo->GetEventHandler()->ProcessEvent(evt2); event.Skip(); } @@ -553,7 +513,7 @@ public: m_combo = combo; m_beenInside = false; } - ~wxComboPopupExtraEventHandler() { } + virtual ~wxComboPopupExtraEventHandler() { } void OnMouseEvent( wxMouseEvent& event ); @@ -645,6 +605,7 @@ BEGIN_EVENT_TABLE(wxComboCtrlBase, wxControl) EVT_SET_FOCUS(wxComboCtrlBase::OnFocusEvent) EVT_KILL_FOCUS(wxComboCtrlBase::OnFocusEvent) //EVT_BUTTON(wxID_ANY,wxComboCtrlBase::OnButtonClickEvent) + EVT_KEY_DOWN(wxComboCtrlBase::OnKeyEvent) EVT_TEXT_ENTER(wxID_ANY,wxComboCtrlBase::OnTextCtrlEvent) EVT_SYS_COLOUR_CHANGED(wxComboCtrlBase::OnSysColourChanged) END_EVENT_TABLE() @@ -652,9 +613,6 @@ END_EVENT_TABLE() IMPLEMENT_ABSTRACT_CLASS(wxComboCtrlBase, wxControl) -// Have global double buffer - should be enough for multiple combos -static wxBitmap* gs_doubleBuffer = (wxBitmap*) NULL; - void wxComboCtrlBase::Init() { m_winPopup = (wxWindow *)NULL; @@ -664,7 +622,6 @@ void wxComboCtrlBase::Init() m_text = (wxTextCtrl*) NULL; m_popupInterface = (wxComboPopup*) NULL; - m_extraEvtHandler = (wxEvtHandler*) NULL; m_popupExtraHandler = (wxEvtHandler*) NULL; m_textEvtHandler = (wxEvtHandler*) NULL; @@ -681,7 +638,8 @@ void wxComboCtrlBase::Init() m_btnState = 0; m_btnWidDefault = 0; m_blankButtonBg = false; - m_btnWid = m_btnHei = 0; + m_ignoreEvtText = 0; + m_btnWid = m_btnHei = -1; m_btnSide = wxRIGHT; m_btnSpacingX = 0; @@ -689,7 +647,6 @@ void wxComboCtrlBase::Init() m_extRight = 0; m_absIndent = -1; m_iFlags = 0; - m_downReceived = false; m_timeCanAcceptClick = 0; } @@ -730,37 +687,43 @@ bool wxComboCtrlBase::Create(wxWindow *parent, return true; } -void wxComboCtrlBase::InstallInputHandlers( bool alsoTextCtrl ) +void wxComboCtrlBase::InstallInputHandlers() { - if ( m_text && alsoTextCtrl ) + if ( m_text ) { m_textEvtHandler = new wxComboBoxExtraInputHandler(this); m_text->PushEventHandler(m_textEvtHandler); } - - wxComboBoxExtraInputHandler* inputHandler = new wxComboBoxExtraInputHandler(this); - PushEventHandler(inputHandler); - m_extraEvtHandler = inputHandler; } -void wxComboCtrlBase::CreateTextCtrl( int extraStyle, const wxValidator& validator ) +void +wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator) { if ( !(m_windowStyle & wxCB_READONLY) ) { - m_text = new wxTextCtrl(this, - wxID_ANY, - m_valueString, - wxDefaultPosition, - wxDefaultSize, - // 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 navigation event is then sent to - // the wrong window. - wxTE_PROCESS_TAB | - wxTE_PROCESS_ENTER | - extraStyle, - validator); + 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 + // navigation event is then sent to the wrong window. + style |= wxTE_PROCESS_TAB; + + if ( HasFlag(wxTE_PROCESS_ENTER) ) + style |= wxTE_PROCESS_ENTER; + + // Ignore EVT_TEXT generated by the constructor (but only + // if the event redirector already exists) + // NB: This must be " = 1" instead of "++"; + if ( m_textEvtHandler ) + m_ignoreEvtText = 1; + else + m_ignoreEvtText = 0; + + m_text = new wxTextCtrl(this, wxID_ANY, m_valueString, + wxDefaultPosition, wxDefaultSize, + style, validator); // This is required for some platforms (GTK+ atleast) m_text->SetSizeHints(2,4); @@ -777,9 +740,6 @@ wxComboCtrlBase::~wxComboCtrlBase() if ( HasCapture() ) ReleaseMouse(); - delete gs_doubleBuffer; - gs_doubleBuffer = (wxBitmap*) NULL; - #if INSTALL_TOPLEV_HANDLER delete ((wxComboFrameEventHandler*)m_toplevEvtHandler); m_toplevEvtHandler = (wxEvtHandler*) NULL; @@ -787,13 +747,10 @@ wxComboCtrlBase::~wxComboCtrlBase() DestroyPopup(); - RemoveEventHandler(m_extraEvtHandler); - if ( m_text ) m_text->RemoveEventHandler(m_textEvtHandler); delete m_textEvtHandler; - delete m_extraEvtHandler; } @@ -814,7 +771,7 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth ) if ( ( (m_iFlags & wxCC_BUTTON_OUTSIDE_BORDER) || (m_bmpNormal.Ok() && m_blankButtonBg) ) && m_btnSpacingX == 0 && - m_btnHei == 0 ) + m_btnHei <= 0 ) { m_iFlags |= wxCC_IFLAG_BUTTON_OUTSIDE; btnBorder = 0; @@ -842,9 +799,7 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth ) int butHeight = sz.y - btnBorder*2; // Adjust button width - if ( m_btnWid < 0 ) - butWidth += m_btnWid; - else if ( m_btnWid > 0 ) + if ( m_btnWid > 0 ) butWidth = m_btnWid; else { @@ -866,9 +821,7 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth ) } // Adjust button height - if ( m_btnHei < 0 ) - butHeight += m_btnHei; - else if ( m_btnHei > 0 ) + if ( m_btnHei > 0 ) butHeight = m_btnHei; // Use size of normal bitmap if... @@ -933,6 +886,7 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust wxSize sz = GetClientSize(); int customBorder = m_widthCustomBorder; +#if !TEXTCTRL_TEXT_CENTERED if ( (m_text->GetWindowStyleFlag() & wxBORDER_MASK) == wxNO_BORDER ) { // Centre textctrl @@ -959,11 +913,16 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust } } else +#else + wxUnusedVar(textCtrlXAdjust); + wxUnusedVar(textCtrlYAdjust); +#endif { - m_text->SetSize( m_tcArea.x, - 0, - sz.x - m_btnArea.x - m_widthCustomPaint - customBorder, - sz.y ); + // If it has border, have textctrl will the entire text field. + m_text->SetSize( m_tcArea.x + m_widthCustomPaint, + customBorder, + sz.x - m_btnArea.width - m_widthCustomPaint - customBorder, + sz.y-(customBorder*2) ); } } @@ -1091,8 +1050,9 @@ void wxComboCtrlBase::DoSetToolTip(wxToolTip *tooltip) // painting // ---------------------------------------------------------------------------- -// draw focus background on area in a way typical on platform -void wxComboCtrlBase::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) +#if (!defined(__WXMSW__)) || defined(__WXUNIVERSAL__) +// prepare combo box background on area in a way typical on platform +void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const { wxSize sz = GetClientSize(); bool isEnabled; @@ -1126,8 +1086,14 @@ void wxComboCtrlBase::DrawFocusBackground( wxDC& dc, const wxRect& rect, int fla 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); wxColour bgCol; @@ -1155,7 +1121,19 @@ void wxComboCtrlBase::DrawFocusBackground( wxDC& dc, const wxRect& rect, int fla dc.SetBrush( bgCol ); dc.SetPen( bgCol ); dc.DrawRectangle( selRect ); + + // Don't clip exactly to the selection rectangle so we can draw + // to the non-selected area in front of it. + wxRect clipRect(rect.x,rect.y, + (selRect.x+selRect.width)-rect.x,rect.height); + dc.SetClippingRegion(clipRect); +} +#else +// Save the library size a bit for platforms that re-implement this. +void wxComboCtrlBase::PrepareBackground( wxDC&, const wxRect&, int ) const +{ } +#endif void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, bool paintBg ) { @@ -1266,27 +1244,26 @@ void wxComboCtrlBase::RecalcAndRefresh() } } -wxBitmap& wxComboCtrlBase::GetBufferBitmap( const wxSize& sz ) const -{ - // If size is larger, recalculate double buffer bitmap - if ( !gs_doubleBuffer || - sz.x > gs_doubleBuffer->GetWidth() || - sz.y > gs_doubleBuffer->GetHeight() ) - { - delete gs_doubleBuffer; - gs_doubleBuffer = new wxBitmap(sz.x+25,sz.y); - } - return *gs_doubleBuffer; -} - // ---------------------------------------------------------------------------- // miscellaneous event handlers // ---------------------------------------------------------------------------- void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event) { - // Change event id and relay it forward + if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED ) + { + if ( m_ignoreEvtText > 0 ) + { + m_ignoreEvtText--; + return; + } + } + + // Change event id, object and string before relaying it forward event.SetId(GetId()); + wxString s = event.GetString(); + event.SetEventObject(this); + event.SetString(s); event.Skip(); } @@ -1318,26 +1295,17 @@ bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event, } else if ( type == wxEVT_LEFT_DOWN ) { - // Only accept event if it wasn't right after popup dismiss - //if ( ::wxGetLocalTimeMillis() > m_timeCanClick ) + if ( flags & (wxCC_MF_ON_CLICK_AREA|wxCC_MF_ON_BUTTON) ) { - // Need to test this, because it might be outside. - if ( flags & wxCC_MF_ON_BUTTON ) - { - m_btnState |= wxCONTROL_PRESSED; - Refresh(); + m_btnState |= wxCONTROL_PRESSED; + Refresh(); - if ( !(m_iFlags & wxCC_POPUP_ON_MOUSE_UP) ) - OnButtonClick(); - else - // If showing popup now, do not capture mouse or there will be interference - CaptureMouse(); - } + if ( !(m_iFlags & wxCC_POPUP_ON_MOUSE_UP) ) + OnButtonClick(); + else + // If showing popup now, do not capture mouse or there will be interference + CaptureMouse(); } - /*else - { - m_btnState = 0; - }*/ } else if ( type == wxEVT_LEFT_UP ) { @@ -1351,7 +1319,7 @@ bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event, // If mouse was inside, fire the click event. if ( m_iFlags & wxCC_POPUP_ON_MOUSE_UP ) { - if ( flags & wxCC_MF_ON_BUTTON ) + if ( flags & (wxCC_MF_ON_CLICK_AREA|wxCC_MF_ON_BUTTON) ) OnButtonClick(); } @@ -1379,56 +1347,21 @@ bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event, return true; } -// Conversion to double-clicks and some basic filtering // returns true if event was consumed or filtered -//bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, bool isOnButtonArea ) bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, - int flags ) + int WXUNUSED(flags) ) { wxLongLong t = ::wxGetLocalTimeMillis(); int evtType = event.GetEventType(); - // - // Generate our own double-clicks - // (to allow on-focus dc-event on double-clicks instead of triple-clicks) - if ( (m_windowStyle & wxCC_SPECIAL_DCLICK) && - !m_isPopupShown && - //!(handlerFlags & wxCC_MF_ON_BUTTON) ) - !(flags & wxCC_MF_ON_BUTTON) ) +#if !USE_TRANSIENT_POPUP + if ( m_isPopupShown && + ( evtType == wxEVT_LEFT_DOWN || evtType == wxEVT_RIGHT_DOWN ) ) { - if ( evtType == wxEVT_LEFT_DOWN ) - { - // Set value to avoid up-events without corresponding downs - m_downReceived = true; - } - else if ( evtType == wxEVT_LEFT_DCLICK ) - { - // We'll make our own double-clicks - //evtType = 0; - event.SetEventType(0); - return true; - } - else if ( evtType == wxEVT_LEFT_UP ) - { - if ( m_downReceived || m_timeLastMouseUp == 1 ) - { - wxLongLong timeFromLastUp = (t-m_timeLastMouseUp); - - if ( timeFromLastUp < DOUBLE_CLICK_CONVERSION_TRESHOLD ) - { - //type = wxEVT_LEFT_DCLICK; - event.SetEventType(wxEVT_LEFT_DCLICK); - m_timeLastMouseUp = 1; - } - else - { - m_timeLastMouseUp = t; - } - - //m_downReceived = false; - } - } + HidePopup(); + return true; } +#endif // Filter out clicks on button immediately after popup dismiss (Windows like behaviour) if ( evtType == wxEVT_LEFT_DOWN && t < m_timeCanAcceptClick ) @@ -1484,23 +1417,62 @@ void wxComboCtrlBase::HandleNormalMouseEvent( wxMouseEvent& event ) event.Skip(); } -void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& ) +void wxComboCtrlBase::OnKeyEvent(wxKeyEvent& event) { - // First click is the first part of double-click - // Some platforms don't generate down-less mouse up-event - // (Windows does, GTK+2 doesn't), so that's why we have - // to do this. - m_timeLastMouseUp = ::wxGetLocalTimeMillis(); + if ( IsPopupShown() ) + { + // pass it to the popped up control + GetPopupControl()->GetControl()->AddPendingEvent(event); + } + else // no popup + { + int keycode = event.GetKeyCode(); - if ( m_text ) + if ( keycode == WXK_TAB ) + { + wxNavigationKeyEvent evt; + evt.SetFlags(wxNavigationKeyEvent::FromTab| + (!event.ShiftDown() ? wxNavigationKeyEvent::IsForward + : wxNavigationKeyEvent::IsBackward)); + evt.SetEventObject(this); + GetParent()->GetEventHandler()->AddPendingEvent(evt); + return; + } + + if ( IsKeyPopupToggle(event) ) + { + OnButtonClick(); + return; + } + + int comboStyle = GetWindowStyle(); + wxComboPopup* popupInterface = GetPopupControl(); + + if ( !popupInterface ) + { + event.Skip(); + return; + } + + if ( (comboStyle & wxCB_READONLY) || + (keycode != WXK_RIGHT && keycode != WXK_LEFT) ) + { + popupInterface->OnComboKeyEvent(event); + } + else + event.Skip(); + } +} + +void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) +{ + if ( event.GetEventType() == wxEVT_SET_FOCUS ) { - m_text->SetFocus(); + if ( m_text && m_text != ::wxWindow::FindFocus() ) + m_text->SetFocus(); } - else - // no need to check for m_widthCustomPaint - that - // area never gets special handling when selected - // (in writable mode, that is) - Refresh(); + + Refresh(); } void wxComboCtrlBase::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) @@ -1542,24 +1514,25 @@ void wxComboCtrlBase::CreatePopup() // Destroy popup window and the child control void wxComboCtrlBase::DestroyPopup() { + HidePopup(); + if ( m_popup ) m_popup->RemoveEventHandler(m_popupExtraHandler); delete m_popupExtraHandler; - HidePopup(); - delete m_popupInterface; if ( m_winPopup ) m_winPopup->Destroy(); + m_popupExtraHandler = (wxEvtHandler*) NULL; m_popupInterface = (wxComboPopup*) NULL; m_winPopup = (wxWindow*) NULL; m_popup = (wxWindow*) NULL; } -void wxComboCtrlBase::SetPopupControl( wxComboPopup* iface ) +void wxComboCtrlBase::DoSetPopupControl(wxComboPopup* iface) { wxCHECK_RET( iface, wxT("no popup interface set for wxComboCtrl") ); @@ -1803,7 +1776,7 @@ void wxComboCtrlBase::OnPopupDismiss() // If cursor not on dropdown button, then clear its state // (technically not required by all ports, but do it for all just in case) - if ( !m_btnArea.Inside(ScreenToClient(::wxGetMousePosition())) ) + if ( !m_btnArea.Contains(ScreenToClient(::wxGetMousePosition())) ) m_btnState = 0; // Return parent's tab traversal flag. @@ -1848,7 +1821,7 @@ void wxComboCtrlBase::HidePopup() // ---------------------------------------------------------------------------- void wxComboCtrlBase::SetButtonPosition( int width, int height, - int side, int spacingX ) + int side, int spacingX ) { m_btnWid = width; m_btnHei = height; @@ -1858,6 +1831,25 @@ void wxComboCtrlBase::SetButtonPosition( int width, int height, RecalcAndRefresh(); } +wxSize wxComboCtrlBase::GetButtonSize() +{ + if ( m_btnSize.x > 0 ) + return m_btnSize; + + wxSize retSize(m_btnWid,m_btnHei); + + // Need to call CalculateAreas now if button size is + // is not explicitly specified. + if ( retSize.x <= 0 || retSize.y <= 0) + { + OnResize(); + + retSize = m_btnSize; + } + + return retSize; +} + void wxComboCtrlBase::SetButtonBitmaps( const wxBitmap& bmpNormal, bool blankButtonBg, const wxBitmap& bmpPressed, @@ -1934,10 +1926,13 @@ wxString wxComboCtrlBase::GetValue() const return m_valueString; } -void wxComboCtrlBase::SetValue(const wxString& value) +void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent) { if ( m_text ) { + if ( !withEvent ) + m_ignoreEvtText++; + m_text->SetValue(value); if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) ) m_text->SelectAll(); @@ -1955,6 +1950,11 @@ void wxComboCtrlBase::SetValue(const wxString& value) } } +void wxComboCtrlBase::SetValue(const wxString& value) +{ + SetValueWithEvent(value, false); +} + // In this SetValue variant wxComboPopup::SetStringValue is not called void wxComboCtrlBase::SetText(const wxString& value) { @@ -1964,6 +1964,12 @@ void wxComboCtrlBase::SetText(const wxString& value) m_valueString = value; + if ( m_text ) + { + m_ignoreEvtText++; + m_text->SetValue( value ); + } + Refresh(); }