#include "wx/dcclient.h"
#include "wx/settings.h"
#include "wx/dialog.h"
+ #include "wx/textctrl.h"
#endif
#include "wx/combo.h"
Dismiss();
- wxString valStr;
if ( selection != wxNOT_FOUND )
- valStr = m_strings[selection];
+ m_stringValue = m_strings[selection];
else
- valStr = wxEmptyString;
+ m_stringValue = wxEmptyString;
- m_value = selection;
+ if ( m_stringValue != m_combo->GetValue() )
+ m_combo->SetValueWithEvent(m_stringValue);
- if ( valStr != m_combo->GetValue() )
- m_combo->SetValueWithEvent(valStr);
+ m_value = selection;
SendComboBoxEvent(selection);
}
// returns true if key was consumed
bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode )
{
+ const int itemCount = GetCount();
+
+ // keys do nothing in the empty control and returning immediately avoids
+ // using invalid indices below
+ if ( !itemCount )
+ return false;
+
int value = m_value;
- int itemCount = GetCount();
int comboStyle = m_combo->GetWindowStyle();
// this is the character equivalent of the code
- wxChar keychar=0;
- if ((keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode))
+ wxChar keychar = 0;
+ if ( keycode < WXK_START )
{
- keychar = (wxChar)keycode;
- }
- else if (unicode>0)
- {
- keychar = unicode;
+ if ( unicode > 0 )
+ {
+ if ( wxIsprint(unicode) )
+ keychar = unicode;
+ }
+ else if ( wxIsprint(keycode) )
+ {
+ keychar = (wxChar) keycode;
+ }
}
if ( keycode == WXK_DOWN || keycode == WXK_RIGHT )
value-=10;
StopPartialCompletion();
}
- else if ( comboStyle & wxCB_READONLY )
+ else if ( keychar && (comboStyle & wxCB_READONLY) )
{
// Try partial completion
}
m_strings.Insert(item,pos);
- m_clientDatas.Insert(NULL, pos);
+ if ( (int)m_clientDatas.size() >= pos )
+ m_clientDatas.Insert(NULL, pos);
m_widths.Insert(-1,pos);
m_widthsDirty = true;
for ( i=0; i<strings.GetCount(); i++ )
{
- if ( item.Cmp(strings.Item(i)) < 0 )
+ if ( item.CmpNoCase(strings.Item(i)) < 0 )
{
pos = (int)i;
break;
wxString wxVListBoxComboPopup::GetStringValue() const
{
- if ( m_value >= 0 )
- return m_strings[m_value];
- return wxEmptyString;
+ return m_stringValue;
}
void wxVListBoxComboPopup::SetSelection( int item )
m_value = item;
+ if ( item >= 0 )
+ m_stringValue = m_strings[item];
+ else
+ m_stringValue = wxEmptyString;
+
if ( IsCreated() )
wxVListBox::SetSelection(item);
}
{
int index = m_strings.Index(value);
- m_value = index;
+ m_stringValue = value;
- if ( index >= -1 && index < (int)wxVListBox::GetItemCount() )
+ if ( index >= 0 && index < (int)wxVListBox::GetItemCount() )
+ {
wxVListBox::SetSelection(index);
+ m_value = index;
+ }
}
void wxVListBoxComboPopup::CalcWidths()
height = maxHeight;
int totalHeight = GetTotalHeight(); // + 3;
+
+ // Take borders into account on Mac or scrollbars always appear
+#if defined(__WXMAC__)
+ totalHeight += 2;
+#endif
if ( height >= totalHeight )
{
height = totalHeight;
void wxOwnerDrawnComboBox::DoDeleteOneItem(unsigned int n)
{
- wxCHECK_RET( IsValid(n), _T("invalid index in wxOwnerDrawnComboBox::Delete") );
+ wxCHECK_RET( IsValid(n), wxT("invalid index in wxOwnerDrawnComboBox::Delete") );
if ( GetSelection() == (int) n )
SetValue(wxEmptyString);
wxString wxOwnerDrawnComboBox::GetString(unsigned int n) const
{
- wxCHECK_MSG( IsValid(n), wxEmptyString, _T("invalid index in wxOwnerDrawnComboBox::GetString") );
+ wxCHECK_MSG( IsValid(n), wxEmptyString, wxT("invalid index in wxOwnerDrawnComboBox::GetString") );
if ( !m_popupInterface )
return m_initChs.Item(n);
{
EnsurePopupControl();
- wxCHECK_RET( IsValid(n), _T("invalid index in wxOwnerDrawnComboBox::SetString") );
+ wxCHECK_RET( IsValid(n), wxT("invalid index in wxOwnerDrawnComboBox::SetString") );
GetVListBoxComboPopup()->SetString(n,s);
}
{
EnsurePopupControl();
- wxCHECK_RET( (n == wxNOT_FOUND) || IsValid(n), _T("invalid index in wxOwnerDrawnComboBox::Select") );
+ wxCHECK_RET( (n == wxNOT_FOUND) || IsValid(n), wxT("invalid index in wxOwnerDrawnComboBox::Select") );
GetVListBoxComboPopup()->SetSelection(n);
EnsurePopupControl();
const unsigned int count = items.GetCount();
- for( unsigned int i = 0; i < count; ++i, ++pos )
+
+ if ( HasFlag(wxCB_SORT) )
{
- GetVListBoxComboPopup()->Insert(items[i], pos);
- AssignNewItemClientData(pos, clientData, i, type);
+ int n = pos;
+
+ for ( unsigned int i = 0; i < count; ++i )
+ {
+ n = GetVListBoxComboPopup()->Append(items[i]);
+ AssignNewItemClientData(n, clientData, i, type);
+ }
+
+ return n;
}
+ else
+ {
+ for ( unsigned int i = 0; i < count; ++i, ++pos )
+ {
+ GetVListBoxComboPopup()->Insert(items[i], pos);
+ AssignNewItemClientData(pos, clientData, i, type);
+ }
- return pos - 1;
+ return pos - 1;
+ }
}
void wxOwnerDrawnComboBox::DoSetItemClientData(unsigned int n, void* clientData)
{
EnsurePopupControl();
- GetVListBoxComboPopup()->SetItemClientData(n,clientData,m_clientDataItemsType);
+ GetVListBoxComboPopup()->SetItemClientData(n, clientData,
+ GetClientDataType());
}
void* wxOwnerDrawnComboBox::DoGetItemClientData(unsigned int n) const
{
if ( flags & wxODCB_PAINTING_CONTROL )
{
- dc.DrawText( GetValue(),
- rect.x + GetTextIndent(),
+ wxString text;
+
+ if ( !ShouldUseHintText() )
+ {
+ text = GetValue();
+ }
+ else
+ {
+ text = GetHint();
+ wxColour col = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT);
+ dc.SetTextForeground(col);
+ }
+
+ dc.DrawText( text,
+ rect.x + GetMargins().x,
(rect.height-dc.GetCharHeight())/2 + rect.y );
}
else