Apply patch 1520776, partial completion on wxOwnerDrawnComboBox

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40085 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Alex Bligh
2006-07-13 22:06:32 +00:00
parent 0d02dd54a0
commit dc8a1aa53d
2 changed files with 98 additions and 4 deletions

View File

@@ -110,7 +110,7 @@ public:
protected: protected:
// Called by OnComboDoubleClick and OnComboKeyEvent // Called by OnComboDoubleClick and OnComboKeyEvent
bool HandleKey( int keycode, bool saturate ); bool HandleKey( int keycode, bool saturate, wxChar unicode = 0 );
// sends combobox select event from the parent combo control // sends combobox select event from the parent combo control
void SendComboBoxEvent( int selection ); void SendComboBoxEvent( int selection );
@@ -163,6 +163,9 @@ protected:
// Return the index of the widest item (recalculating it if necessary) // Return the index of the widest item (recalculating it if necessary)
int GetWidestItem() { CalcWidths(); return m_widestItem; } int GetWidestItem() { CalcWidths(); return m_widestItem; }
// Stop partial completion (when some other event occurs)
void StopPartialCompletion();
wxArrayString m_strings; wxArrayString m_strings;
wxArrayPtrVoid m_clientDatas; wxArrayPtrVoid m_clientDatas;
@@ -198,6 +201,12 @@ private:
// Recalculate widths if they are dirty // Recalculate widths if they are dirty
void CalcWidths(); void CalcWidths();
// Partial completion string
wxString m_partialCompletionString;
// Partial completion timer
wxTimer m_partialCompletionTimer;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };

View File

@@ -41,6 +41,8 @@
// implementation // 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 // wxVListBoxComboPopup is a wxVListBox customized to act as a popup control
@@ -65,6 +67,7 @@ void wxVListBoxComboPopup::Init()
m_value = -1; m_value = -1;
m_itemHover = -1; m_itemHover = -1;
m_clientDataItemsType = wxClientData_None; m_clientDataItemsType = wxClientData_None;
m_partialCompletionString = wxEmptyString;
} }
bool wxVListBoxComboPopup::Create(wxWindow* parent) bool wxVListBoxComboPopup::Create(wxWindow* parent)
@@ -183,6 +186,8 @@ void wxVListBoxComboPopup::OnDrawItem( wxDC& dc, const wxRect& rect, int item, i
void wxVListBoxComboPopup::DismissWithEvent() void wxVListBoxComboPopup::DismissWithEvent()
{ {
StopPartialCompletion();
int selection = wxVListBox::GetSelection(); int selection = wxVListBox::GetSelection();
Dismiss(); Dismiss();
@@ -223,26 +228,78 @@ void wxVListBoxComboPopup::SendComboBoxEvent( int selection )
} }
// returns true if key was consumed // 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 value = m_value;
int itemCount = GetCount(); 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 = keycode;
}
else if (unicode>0)
{
keychar = unicode;
}
if ( keycode == WXK_DOWN || keycode == WXK_RIGHT ) if ( keycode == WXK_DOWN || keycode == WXK_RIGHT )
{ {
value++; value++;
StopPartialCompletion();
} }
else if ( keycode == WXK_UP || keycode == WXK_LEFT ) else if ( keycode == WXK_UP || keycode == WXK_LEFT )
{ {
value--; value--;
StopPartialCompletion();
} }
else if ( keycode == WXK_PAGEDOWN ) else if ( keycode == WXK_PAGEDOWN )
{ {
value+=10; value+=10;
StopPartialCompletion();
} }
else if ( keycode == WXK_PAGEUP ) else if ( keycode == WXK_PAGEUP )
{ {
value-=10; value-=10;
StopPartialCompletion();
}
else if ( comboStyle && wxCB_READONLY )
{
// Try partial completion
// find the new partial completion string
if (m_partialCompletionTimer.IsRunning())
m_partialCompletionString+=wxString(keychar);
else
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;
m_partialCompletionTimer.Start(wxODCB_PARTIAL_COMPLETION_TIME, true);
}
} }
else else
return false; return false;
@@ -277,6 +334,13 @@ bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate )
return true; return true;
} }
// stop partial completion
void wxVListBoxComboPopup::StopPartialCompletion()
{
m_partialCompletionString = wxEmptyString;
m_partialCompletionTimer.Stop();
}
void wxVListBoxComboPopup::OnComboDoubleClick() void wxVListBoxComboPopup::OnComboDoubleClick()
{ {
// Cycle on dclick (disable saturation to allow true cycling). // Cycle on dclick (disable saturation to allow true cycling).
@@ -289,7 +353,13 @@ void wxVListBoxComboPopup::OnComboDoubleClick()
void wxVListBoxComboPopup::OnComboKeyEvent( wxKeyEvent& event ) void wxVListBoxComboPopup::OnComboKeyEvent( wxKeyEvent& event )
{ {
// Saturated key movement on // Saturated key movement on
if ( !HandleKey(event.GetKeyCode(),true) ) if ( !HandleKey(event.GetKeyCode(),true,
#if wxUSE_UNICODE
event.GetUnicodeKey()
#else
0
#endif
) )
event.Skip(); event.Skip();
} }
@@ -341,9 +411,24 @@ void wxVListBoxComboPopup::OnKey(wxKeyEvent& event)
} }
// Hide popup if ESC is pressed // Hide popup if ESC is pressed
else if ( event.GetKeyCode() == WXK_ESCAPE ) else if ( event.GetKeyCode() == WXK_ESCAPE )
{
StopPartialCompletion();
Dismiss(); Dismiss();
}
else 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 ) void wxVListBoxComboPopup::Insert( const wxString& item, int pos )