wxChar keychar=0;
if ((keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode))
{
- keychar = keycode;
+ keychar = (wxChar)keycode;
}
else if (unicode>0)
{
- keychar = unicode;
+ keychar = unicode;
}
if ( keycode == WXK_DOWN || keycode == WXK_RIGHT )
value-=10;
StopPartialCompletion();
}
- else if ( comboStyle && wxCB_READONLY )
+ else if ( comboStyle & wxCB_READONLY )
{
// Try partial completion
// find the new partial completion string
+#if wxUSE_TIMER
if (m_partialCompletionTimer.IsRunning())
m_partialCompletionString+=wxString(keychar);
else
+#endif // wxUSE_TIMER
m_partialCompletionString=wxString(keychar);
// now search through the values to see if this is found
int found = -1;
- unsigned int length=m_partialCompletionString.Length();
+ unsigned int length=m_partialCompletionString.length();
int i;
for (i=0; i<itemCount; i++)
{
wxString item=GetString(i);
- if (( item.Length() >=length) && (! m_partialCompletionString.CmpNoCase(item.Left(length))))
+ if (( item.length() >= length) && (! m_partialCompletionString.CmpNoCase(item.Left(length))))
{
found=i;
break;
else
{
value=i;
+#if wxUSE_TIMER
m_partialCompletionTimer.Start(wxODCB_PARTIAL_COMPLETION_TIME, true);
+#endif // wxUSE_TIMER
}
}
else
void wxVListBoxComboPopup::StopPartialCompletion()
{
m_partialCompletionString = wxEmptyString;
+#if wxUSE_TIMER
m_partialCompletionTimer.Stop();
+#endif // wxUSE_TIMER
}
void wxVListBoxComboPopup::OnComboDoubleClick()
void wxVListBoxComboPopup::OnKey(wxKeyEvent& event)
{
- // Select item if ENTER is pressed
- if ( event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER )
- {
- DismissWithEvent();
- }
- // Hide popup if ESC is pressed
- else if ( event.GetKeyCode() == WXK_ESCAPE )
+ // Hide popup if certain key or key combination was pressed
+ if ( m_combo->IsKeyPopupToggle(event) )
{
StopPartialCompletion();
Dismiss();
}
+ else if ( event.AltDown() )
+ {
+ // On both wxGTK and wxMSW, pressing Alt down seems to
+ // completely freeze things in popup (ie. arrow keys and
+ // enter won't work).
+ return;
+ }
+ // Select item if ENTER is pressed
+ else if ( event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER )
+ {
+ DismissWithEvent();
+ }
else
{
int comboStyle = m_combo->GetWindowStyle();
int keycode = event.GetKeyCode();
// Process partial completion key codes here, but not the arrow keys as the base class will do that for us
- if ((comboStyle && wxCB_READONLY) &&
+ if ((comboStyle & wxCB_READONLY) &&
(keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode))
{
OnComboKeyEvent(event);
if ( (int)item == m_widestItem )
m_findWidest = true;
+ int sel = GetSelection();
+
if ( IsCreated() )
wxVListBox::SetItemCount( wxVListBox::GetItemCount()-1 );
+
+ // Fix selection
+ if ( (int)item < sel )
+ SetSelection(sel-1);
+ else if ( (int)item == sel )
+ SetSelection(wxNOT_FOUND);
}
int wxVListBoxComboPopup::FindString(const wxString& s, bool bCase) const
void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc, const wxRect& rect, int item, int flags) const
{
// we need to render selected and current items differently
- if ( GetVListBoxComboPopup()->IsCurrent((size_t)item) )
+ if ( GetVListBoxComboPopup()->IsCurrent((size_t)item) ||
+ (flags & wxODCB_PAINTING_CONTROL) )
{
- DrawFocusBackground(dc,
- rect,
- (flags&wxODCB_PAINTING_CONTROL?0:wxCONTROL_ISSUBMENU) |
- wxCONTROL_SELECTED);
+ int bgFlags = wxCONTROL_SELECTED;
+
+ if ( (flags & wxODCB_PAINTING_CONTROL) != wxODCB_PAINTING_CONTROL )
+ {
+ bgFlags |= wxCONTROL_ISSUBMENU;
+ PrepareBackground(dc, rect, bgFlags);
+ }
+ else if ( HasFlag(wxCB_READONLY) )
+ PrepareBackground(dc, rect, bgFlags);
}
//else: do nothing for the normal items
}