void wxListCtrlEx::HandlePrefixSearch(wxChar character) { wxASSERT(character); // Keyboard navigation within items wxDateTime now = wxDateTime::UNow(); if (m_prefixSearch_lastKeyPress.IsValid()) { wxTimeSpan span = now - m_prefixSearch_lastKeyPress; if (span.GetSeconds() >= 1) m_prefixSearch_prefix = _T(""); } m_prefixSearch_lastKeyPress = now; wxString newPrefix = m_prefixSearch_prefix + character; bool beep = false; int item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item != -1) { wxString text = GetItemText(item, 0); if (text.Length() >= m_prefixSearch_prefix.Length() && !m_prefixSearch_prefix.CmpNoCase(text.Left(m_prefixSearch_prefix.Length()))) beep = true; } else if (m_prefixSearch_prefix == _T("")) beep = true; int start = item; if (start < 0) start = 0; int newPos = FindItemWithPrefix(newPrefix, start); if (newPos == -1 && m_prefixSearch_prefix[0] == character && !m_prefixSearch_prefix[1] && item != -1 && beep) { // Search the next item that starts with the same letter newPrefix = m_prefixSearch_prefix; newPos = FindItemWithPrefix(newPrefix, item + 1); } m_prefixSearch_prefix = newPrefix; if (newPos == -1) { if (beep) wxBell(); return; } item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); while (item != -1) { SetItemState(item, 0, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } SetItemState(newPos, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); EnsureVisible(newPos); }
void CLocalListView::OnChar(wxKeyEvent& event) { int code = event.GetKeyCode(); if (code == WXK_DELETE) { if (GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) == -1) { wxBell(); return; } wxCommandEvent tmp; OnMenuDelete(tmp); } else if (code == WXK_F2) { wxCommandEvent tmp; OnMenuRename(tmp); } else if (code == WXK_BACK) { if (!m_hasParent) { wxBell(); return; } wxString error; if (!m_pState->SetLocalDir(_T(".."), &error)) { if (error != _T("")) wxMessageBox(error, _("Failed to change directory"), wxICON_INFORMATION); else wxBell(); } } else if (code > 32 && code < 300 && !event.HasModifiers()) { // Keyboard navigation within items wxDateTime now = wxDateTime::UNow(); if (m_lastKeyPress.IsValid()) { wxTimeSpan span = now - m_lastKeyPress; if (span.GetSeconds() >= 1) m_prefix = _T(""); } m_lastKeyPress = now; wxChar tmp[2]; #if wxUSE_UNICODE tmp[0] = event.GetUnicodeKey(); #else tmp[0] = code; #endif tmp[1] = 0; wxString newPrefix = m_prefix + tmp; bool beep = false; int item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item != -1) { wxString text = GetData(item)->name; if (text.Length() >= m_prefix.Length() && !m_prefix.CmpNoCase(text.Left(m_prefix.Length()))) beep = true; } else if (m_prefix == _T("")) beep = true; int start = item; if (start < 0) start = 0; int newPos = FindItemWithPrefix(newPrefix, start); if (newPos == -1 && m_prefix == tmp && item != -1 && beep) { // Search the next item that starts with the same letter newPrefix = m_prefix; newPos = FindItemWithPrefix(newPrefix, item + 1); } m_prefix = newPrefix; if (newPos == -1) { if (beep) wxBell(); return; } item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); while (item != -1) { SetItemState(item, 0, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } SetItemState(newPos, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); EnsureVisible(newPos); } else event.Skip(); }
void wxListCtrlEx::HandlePrefixSearch(wxChar character) { wxASSERT(character); // Keyboard navigation within items wxDateTime now = wxDateTime::UNow(); if (m_prefixSearch_lastKeyPress.IsValid()) { wxTimeSpan span = now - m_prefixSearch_lastKeyPress; if (span.GetSeconds() >= 1) m_prefixSearch_prefix = _T(""); } m_prefixSearch_lastKeyPress = now; wxString newPrefix = m_prefixSearch_prefix + character; int item; #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (!GetSelectedItemCount()) item = -1; else #endif { item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } bool beep = false; if (item != -1) { wxString text = GetItemText(item, 0); if (text.Length() >= m_prefixSearch_prefix.Length() && !m_prefixSearch_prefix.CmpNoCase(text.Left(m_prefixSearch_prefix.Length()))) beep = true; } else if (m_prefixSearch_prefix.empty()) beep = true; int start = item; if (start < 0) start = 0; int newPos = FindItemWithPrefix(newPrefix, start); if (newPos == -1 && (m_prefixSearch_prefix.Len() == 1 && m_prefixSearch_prefix[0] == character) && item != -1 && beep) { // Search the next item that starts with the same letter newPrefix = m_prefixSearch_prefix; newPos = FindItemWithPrefix(newPrefix, item + 1); } m_prefixSearch_prefix = newPrefix; if (newPos == -1) { if (beep) wxBell(); return; } while (item != -1) { SetItemState(item, 0, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } SetItemState(newPos, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); #ifdef __WXMSW__ // SetItemState does not move the selection mark, that is the item from // which a multiple selection starts (e.g. shift+up/down) HWND hWnd = (HWND)GetHandle(); ::SendMessage(hWnd, LVM_SETSELECTIONMARK, 0, newPos); #endif EnsureVisible(newPos); }