// Author: Jaakko Salli
// Modified by:
// Created: Apr-30-2006
-// RCS-ID: $Id$
// Copyright: (c) 2005 Jaakko Salli
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
{
wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo;
- wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)),
+ wxASSERT_MSG( wxDynamicCast(combo, wxOwnerDrawnComboBox),
wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") );
wxCoord h = combo->OnMeasureItem(n);
{
wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo;
- wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)),
+ wxASSERT_MSG( wxDynamicCast(combo, wxOwnerDrawnComboBox),
wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") );
return combo->OnMeasureItemWidth(n);
{
wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo;
- wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)),
+ wxASSERT_MSG( wxDynamicCast(combo, wxOwnerDrawnComboBox),
wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") );
if ( IsCurrent((size_t)item) && !(flags & wxODCB_PAINTING_CONTROL) )
{
wxOwnerDrawnComboBox* combo = (wxOwnerDrawnComboBox*) m_combo;
- wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)),
+ wxASSERT_MSG( wxDynamicCast(combo, wxOwnerDrawnComboBox),
wxT("you must subclass wxVListBoxComboPopup for drawing and measuring methods") );
combo->OnDrawItem(dc,rect,item,flags);
m_stringValue = wxEmptyString;
if ( m_stringValue != m_combo->GetValue() )
- m_combo->SetValueWithEvent(m_stringValue);
+ m_combo->SetValueByUser(m_stringValue);
m_value = selection;
void wxVListBoxComboPopup::SendComboBoxEvent( int selection )
{
- wxCommandEvent evt(wxEVT_COMMAND_COMBOBOX_SELECTED,m_combo->GetId());
+ wxCommandEvent evt(wxEVT_COMBOBOX,m_combo->GetId());
evt.SetEventObject(m_combo);
keychar = 0;
}
- if ( keycode == WXK_DOWN || keycode == WXK_NUMPAD_DOWN || keycode == WXK_RIGHT )
+ const bool readOnly = (comboStyle & wxCB_READONLY) != 0;
+
+ if ( keycode == WXK_DOWN || keycode == WXK_NUMPAD_DOWN || ( keycode == WXK_RIGHT && readOnly ) )
{
value++;
StopPartialCompletion();
}
- else if ( keycode == WXK_UP || keycode == WXK_NUMPAD_UP || keycode == WXK_LEFT )
+ else if ( keycode == WXK_UP || keycode == WXK_NUMPAD_UP || ( keycode == WXK_LEFT && readOnly ) )
{
value--;
StopPartialCompletion();
value-=10;
StopPartialCompletion();
}
- else if ( keycode == WXK_HOME || keycode == WXK_NUMPAD_HOME )
+ else if ( ( keycode == WXK_HOME || keycode == WXK_NUMPAD_HOME ) && readOnly )
{
value=0;
StopPartialCompletion();
}
- else if ( keycode == WXK_END || keycode == WXK_NUMPAD_END )
+ else if ( ( keycode == WXK_END || keycode == WXK_NUMPAD_END ) && readOnly )
{
value=itemCount-1;
StopPartialCompletion();
}
- else if ( keychar && (comboStyle & wxCB_READONLY) )
+ else if ( keychar && readOnly )
{
// Try partial completion
// (good for consistency)
return true;
- m_value = value;
-
if ( value >= 0 )
- m_combo->SetValue(m_strings[value]);
+ m_combo->ChangeValue(m_strings[value]);
+
+ // The m_combo->SetValue() call above sets m_value to the index of this
+ // string. But if there are more identical string, the index is of the
+ // first occurrence, which may be wrong, so set the index explicitly here,
+ // _after_ the SetValue() call.
+ m_value = value;
SendComboBoxEvent(m_value);
for ( i=0; i<strings.GetCount(); i++ )
{
- if ( item.CmpNoCase(strings.Item(i)) < 0 )
+ if ( item.CmpNoCase(strings.Item(i)) <= 0 )
{
pos = (int)i;
break;
return m_strings.Index(s, bCase);
}
+bool wxVListBoxComboPopup::FindItem(const wxString& item, wxString* trueItem)
+{
+ int idx = m_strings.Index(item, false);
+ if ( idx == wxNOT_FOUND )
+ return false;
+ if ( trueItem != NULL )
+ *trueItem = m_strings[idx];
+ return true;
+}
+
unsigned int wxVListBoxComboPopup::GetCount() const
{
return m_strings.GetCount();
// wxWindow::GetTextExtent (assuming same dc is used
// for all calls, as we do here).
wxClientDC dc(m_combo);
+ if ( !m_useFont.IsOk() )
+ m_useFont = m_combo->GetFont();
dc.SetFont(m_useFont);
for ( i=0; i<n; i++ )
// Find initial selection
wxString strValue = m_combo->GetValue();
- if ( strValue.length() )
+ if ( !strValue.empty() )
m_value = m_strings.Index(strValue);
}
BEGIN_EVENT_TABLE(wxOwnerDrawnComboBox, wxComboCtrl)
END_EVENT_TABLE()
-
-#if wxUSE_EXTENDED_RTTI
-IMPLEMENT_DYNAMIC_CLASS2_XTI(wxOwnerDrawnComboBox, wxComboCtrl, wxControlWithItems, "wx/odcombo.h")
-
-wxBEGIN_PROPERTIES_TABLE(wxOwnerDrawnComboBox)
-wxEND_PROPERTIES_TABLE()
-
-wxBEGIN_HANDLERS_TABLE(wxOwnerDrawnComboBox)
-wxEND_HANDLERS_TABLE()
-
-wxCONSTRUCTOR_5( wxOwnerDrawnComboBox , wxWindow* , Parent , wxWindowID , Id , wxString , Value , wxPoint , Position , wxSize , Size )
-#else
-IMPLEMENT_DYNAMIC_CLASS2(wxOwnerDrawnComboBox, wxComboCtrl, wxControlWithItems)
-#endif
-
void wxOwnerDrawnComboBox::Init()
{
}
long style,
const wxValidator& validator,
const wxString& name)
- : wxComboCtrl()
{
Init();
GetVListBoxComboPopup()->Clear();
+ // NB: This really needs to be SetValue() instead of ChangeValue(),
+ // as wxTextEntry API expects an event to be sent.
SetValue(wxEmptyString);
}
+void wxOwnerDrawnComboBox::Clear()
+{
+ DoClear();
+}
+
void wxOwnerDrawnComboBox::DoDeleteOneItem(unsigned int n)
{
wxCHECK_RET( IsValid(n), wxT("invalid index in wxOwnerDrawnComboBox::Delete") );
if ( GetSelection() == (int) n )
- SetValue(wxEmptyString);
+ ChangeValue(wxEmptyString);
GetVListBoxComboPopup()->Delete(n);
}
// Refresh text portion in control
if ( m_text )
- m_text->SetValue( str );
+ m_text->ChangeValue( str );
else
m_valueString = str;
return GetVListBoxComboPopup()->GetSelection();
}
+void wxOwnerDrawnComboBox::GetSelection(long *from, long *to) const
+{
+ wxComboCtrl::GetSelection(from, to);
+}
+
int wxOwnerDrawnComboBox::DoInsertItems(const wxArrayStringsAdapter& items,
unsigned int pos,
void **clientData,
return -1;
}
+wxSize wxOwnerDrawnComboBox::DoGetBestSize() const
+{
+ wxSize best( wxComboCtrlBase::DoGetBestSize() );
+
+ if ( GetCount() > 0 )
+ {
+ wxOwnerDrawnComboBox* odc = const_cast<wxOwnerDrawnComboBox*>(this);
+ best.x = odc->GetWidestItemWidth();
+ // TODO: this class may also have GetHightestItemHeight() and
+ // GetHightestItem() methods, and so set the whole (edit part + arrow)
+ // control's height according with this max height, not only max width.
+ }
+
+ return GetSizeFromTextSize(best.x);
+}
+
void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc,
const wxRect& rect,
int WXUNUSED(item),