// implementation
// ============================================================================
+// time in milliseconds before partial completion buffer drops
+#define wxODCB_PARTIAL_COMPLETION_TIME 1000
// ----------------------------------------------------------------------------
// wxVListBoxComboPopup is a wxVListBox customized to act as a popup control
m_value = -1;
m_itemHover = -1;
m_clientDataItemsType = wxClientData_None;
+ m_partialCompletionString = wxEmptyString;
}
bool wxVListBoxComboPopup::Create(wxWindow* parent)
void wxVListBoxComboPopup::DismissWithEvent()
{
+ StopPartialCompletion();
+
int selection = wxVListBox::GetSelection();
Dismiss();
}
// returns true if key was consumed
-bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate )
+bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode )
{
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))
+ {
+ keychar = (wxChar)keycode;
+ }
+ else if (unicode>0)
+ {
+ keychar = unicode;
+ }
if ( keycode == WXK_DOWN || keycode == WXK_RIGHT )
{
value++;
+ StopPartialCompletion();
}
else if ( keycode == WXK_UP || keycode == WXK_LEFT )
{
value--;
+ StopPartialCompletion();
}
else if ( keycode == WXK_PAGEDOWN )
{
value+=10;
+ StopPartialCompletion();
}
else if ( keycode == WXK_PAGEUP )
{
value-=10;
+ StopPartialCompletion();
+ }
+ 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();
+ int i;
+ for (i=0; i<itemCount; i++)
+ {
+ wxString item=GetString(i);
+ if (( item.Length() >=length) && (! m_partialCompletionString.CmpNoCase(item.Left(length))))
+ {
+ found=i;
+ break;
+ }
+ }
+
+ if (found<0)
+ {
+ StopPartialCompletion();
+ ::wxBell();
+ return true; // to stop the first value being set
+ }
+ else
+ {
+ value=i;
+#if wxUSE_TIMER
+ m_partialCompletionTimer.Start(wxODCB_PARTIAL_COMPLETION_TIME, true);
+#endif // wxUSE_TIMER
+ }
}
else
return false;
return true;
}
+// stop partial completion
+void wxVListBoxComboPopup::StopPartialCompletion()
+{
+ m_partialCompletionString = wxEmptyString;
+#if wxUSE_TIMER
+ m_partialCompletionTimer.Stop();
+#endif // wxUSE_TIMER
+}
+
void wxVListBoxComboPopup::OnComboDoubleClick()
{
// Cycle on dclick (disable saturation to allow true cycling).
void wxVListBoxComboPopup::OnComboKeyEvent( wxKeyEvent& event )
{
// Saturated key movement on
- if ( !HandleKey(event.GetKeyCode(),true) )
+ if ( !HandleKey(event.GetKeyCode(),true,
+#if wxUSE_UNICODE
+ event.GetUnicodeKey()
+#else
+ 0
+#endif
+ ) )
event.Skip();
}
}
// Hide popup if ESC is pressed
else if ( event.GetKeyCode() == WXK_ESCAPE )
+ {
+ StopPartialCompletion();
Dismiss();
+ }
else
- event.Skip();
+ {
+ 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) &&
+ (keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode))
+ {
+ OnComboKeyEvent(event);
+ SetSelection(m_value); // ensure the highlight bar moves
+ }
+ else
+ event.Skip();
+ }
}
void wxVListBoxComboPopup::Insert( const wxString& item, int pos )