X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0847e36eff0512bf3c50c01e8d9dcff5e693ada5..0547ad09ccbc8f853502bf496f411c1623a68382:/src/generic/odcombo.cpp diff --git a/src/generic/odcombo.cpp b/src/generic/odcombo.cpp index 1d912e19c0..fb9d6b43af 100644 --- a/src/generic/odcombo.cpp +++ b/src/generic/odcombo.cpp @@ -54,6 +54,7 @@ BEGIN_EVENT_TABLE(wxVListBoxComboPopup, wxVListBox) EVT_MOTION(wxVListBoxComboPopup::OnMouseMove) EVT_KEY_DOWN(wxVListBoxComboPopup::OnKey) + EVT_CHAR(wxVListBoxComboPopup::OnChar) EVT_LEFT_UP(wxVListBoxComboPopup::OnLeftClick) END_EVENT_TABLE() @@ -95,6 +96,18 @@ wxVListBoxComboPopup::~wxVListBoxComboPopup() Clear(); } +void wxVListBoxComboPopup::SetFocus() +{ + // Suppress SetFocus() warning by simply not calling it. This combo popup + // has already been designed with the assumption that SetFocus() may not + // do anything useful, so it really doesn't need to be called. +#ifdef __WXMSW__ + // +#else + wxVListBox::SetFocus(); +#endif +} + bool wxVListBoxComboPopup::LazyCreate() { // NB: There is a bug with wxVListBox that can be avoided by creating @@ -244,7 +257,7 @@ void wxVListBoxComboPopup::SendComboBoxEvent( int selection ) } // returns true if key was consumed -bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode ) +bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar keychar ) { const int itemCount = GetCount(); @@ -256,41 +269,44 @@ bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode int value = m_value; int comboStyle = m_combo->GetWindowStyle(); - // this is the character equivalent of the code - wxChar keychar = 0; - if ( keycode < WXK_START ) + if ( keychar > 0 ) { - if ( unicode > 0 ) - { - if ( wxIsprint(unicode) ) - keychar = unicode; - } - else if ( wxIsprint(keycode) ) - { - keychar = (wxChar) keycode; - } + // we have character equivalent of the keycode; filter out these that + // are not printable characters + if ( !wxIsprint(keychar) ) + keychar = 0; } - if ( keycode == WXK_DOWN || keycode == WXK_RIGHT ) + if ( keycode == WXK_DOWN || keycode == WXK_NUMPAD_DOWN || keycode == WXK_RIGHT ) { value++; StopPartialCompletion(); } - else if ( keycode == WXK_UP || keycode == WXK_LEFT ) + else if ( keycode == WXK_UP || keycode == WXK_NUMPAD_UP || keycode == WXK_LEFT ) { value--; StopPartialCompletion(); } - else if ( keycode == WXK_PAGEDOWN ) + else if ( keycode == WXK_PAGEDOWN || keycode == WXK_NUMPAD_PAGEDOWN ) { value+=10; StopPartialCompletion(); } - else if ( keycode == WXK_PAGEUP ) + else if ( keycode == WXK_PAGEUP || keycode == WXK_NUMPAD_PAGEUP ) { value-=10; StopPartialCompletion(); } + else if ( keycode == WXK_HOME || keycode == WXK_NUMPAD_HOME ) + { + value=0; + StopPartialCompletion(); + } + else if ( keycode == WXK_END || keycode == WXK_NUMPAD_END ) + { + value=itemCount-1; + StopPartialCompletion(); + } else if ( keychar && (comboStyle & wxCB_READONLY) ) { // Try partial completion @@ -354,11 +370,15 @@ bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode // (good for consistency) return true; - m_value = value; - if ( value >= 0 ) m_combo->SetValue(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 occurence, which may be wrong, so set the index explicitly here, + // _after_ the SetValue() call. + m_value = value; + SendComboBoxEvent(m_value); return true; @@ -385,13 +405,21 @@ void wxVListBoxComboPopup::OnComboDoubleClick() void wxVListBoxComboPopup::OnComboKeyEvent( wxKeyEvent& event ) { // Saturated key movement on - if ( !HandleKey(event.GetKeyCode(),true, + if ( !HandleKey(event.GetKeyCode(), true) ) + event.Skip(); +} + +void wxVListBoxComboPopup::OnComboCharEvent( wxKeyEvent& event ) +{ + // unlike in OnComboKeyEvent, wxEVT_CHAR contains meaningful + // printable character information, so pass it #if wxUSE_UNICODE - event.GetUnicodeKey() + const wxChar charcode = event.GetUnicodeKey(); #else - 0 + const wxChar charcode = (wxChar)event.GetKeyCode(); #endif - ) ) + + if ( !HandleKey(event.GetKeyCode(), true, charcode) ) event.Skip(); } @@ -456,18 +484,31 @@ void wxVListBoxComboPopup::OnKey(wxKeyEvent& event) } 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) && - (keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode)) + // completion is handled in OnChar() below + event.Skip(); + } +} + +void wxVListBoxComboPopup::OnChar(wxKeyEvent& event) +{ + if ( m_combo->GetWindowStyle() & wxCB_READONLY ) + { + // Process partial completion key codes here, but not the arrow keys as + // the base class will do that for us +#if wxUSE_UNICODE + const wxChar charcode = event.GetUnicodeKey(); +#else + const wxChar charcode = (wxChar)event.GetKeyCode(); +#endif + if ( wxIsprint(charcode) ) { - OnComboKeyEvent(event); + OnComboCharEvent(event); SetSelection(m_value); // ensure the highlight bar moves + return; // don't skip the event } - else - event.Skip(); } + + event.Skip(); } void wxVListBoxComboPopup::Insert( const wxString& item, int pos ) @@ -760,6 +801,11 @@ wxSize wxVListBoxComboPopup::GetAdjustedSize( int minWidth, int prefHeight, int 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; @@ -1084,7 +1130,20 @@ void wxOwnerDrawnComboBox::OnDrawItem( wxDC& dc, { if ( flags & wxODCB_PAINTING_CONTROL ) { - dc.DrawText( GetValue(), + 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 ); }