#if wxUSE_COMBOCTRL
+#include "wx/combobox.h"
+
#ifndef WX_PRECOMP
#include "wx/log.h"
- #include "wx/combobox.h"
#include "wx/dcclient.h"
#include "wx/settings.h"
#include "wx/dialog.h"
OnThemeChange();
m_absIndent = GetNativeTextIndent();
+ m_iFlags |= wxCC_IFLAG_CREATED;
+
+ // If x and y indicate valid size, wxSizeEvent won't be
+ // emitted automatically, so we need to add artifical one.
+ if ( size.x > 0 && size.y > 0 )
+ {
+ wxSizeEvent evt(size,GetId());
+ GetEventHandler()->AddPendingEvent(evt);
+ }
+
return true;
}
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);
+ // 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;
+
+ 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);
if ( butWidth <= 0 )
return;
+ int butHeight = sz.y - btnBorder*2;
+
// Adjust button width
if ( m_btnWid < 0 )
butWidth += m_btnWid;
else if ( m_btnWid > 0 )
butWidth = m_btnWid;
+ else
+ {
+ // Adjust button width to match aspect ratio
+ // (but only if control is smaller than best size).
+ int bestHeight = GetBestSize().y;
+ int height = GetSize().y;
- int butHeight = sz.y;
-
- butHeight -= btnBorder*2;
+ if ( height < bestHeight )
+ {
+ // Make very small buttons square, as it makes
+ // them accommodate arrow image better and still
+ // looks decent.
+ if ( height > 18 )
+ butWidth = (height*butWidth)/bestHeight;
+ else
+ butWidth = butHeight;
+ }
+ }
// Adjust button height
if ( m_btnHei < 0 )
if ( (sz.y-(customBorder*2)) < butHeight && btnWidth == 0 )
{
int newY = butHeight+(customBorder*2);
- SetClientSize(-1,newY);
+ SetClientSize(wxDefaultCoord,newY);
sz.y = newY;
}
}
return ret;
}
-void wxComboCtrlBase::DoMoveWindow(int x, int y, int width, int height)
-{
- // SetSize is called last in create, so it marks the end of creation
- m_iFlags |= wxCC_IFLAG_CREATED;
-
- wxControl::DoMoveWindow(x, y, width, height);
-}
-
void wxComboCtrlBase::OnSizeEvent( wxSizeEvent& event )
{
if ( !IsCreated() )
// ----------------------------------------------------------------------------
// draw focus background on area in a way typical on platform
-void wxComboCtrlBase::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags )
+void wxComboCtrlBase::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) const
{
wxSize sz = GetClientSize();
bool isEnabled;
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;
void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event)
{
- // Change event id and relay it forward
+ // 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();
}
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") );