void RoutineView::HandleEvent(TEvent& Event) { int resetSearch = 1; EModel::HandleEvent(Event); switch (Event.What) { case evKeyUp: resetSearch = 0; break; case evKeyDown: switch (kbCode(Event.Key.Code)) { case kbBackSp: resetSearch = 0; if (SearchLen > 0) { SearchString[--SearchLen] = 0; Row = SearchPos[SearchLen]; Msg(S_INFO, "Search: [%s]", SearchString); } else Msg(S_INFO, ""); break; case kbEsc: Msg(S_INFO, ""); break; default: resetSearch = 0; if (isAscii(Event.Key.Code) && (SearchLen < MAXISEARCH)) { char Ch = (char)Event.Key.Code; SearchPos[SearchLen] = Row; SearchString[SearchLen] = Ch; SearchString[++SearchLen] = 0; int i = GetMatchingLine(Row, 1); if (i == -1) SearchString[--SearchLen] = 0; else Row = i; Msg(S_INFO, "Search: [%s]", SearchString); } break; } } if (resetSearch) { SearchLen = 0; } }
int BufferView::ExecCommand(int Command, ExState &State) { switch (Command) { case ExCloseActivate: { EModel *B; CancelSearch(); B = GetBufferById(Row); if (B && B != this) { View->SwitchToModel(B); delete this; return ErOK; } } return ErFAIL; case ExBufListFileClose: { EModel *B = GetBufferById(Row); CancelSearch(); if (B && B != this && Count > 1) { if (B->ConfQuit(View->MView->Win)) { View->DeleteModel(B); } UpdateList(); return ErOK; } } return ErFAIL; case ExBufListFileSave: { EModel *B = GetBufferById(Row); if (B && B->GetContext() == CONTEXT_FILE) if (((EBuffer *)B)->Save()) return ErOK; } return ErFAIL; case ExActivateInOtherWindow: { EModel *B = GetBufferById(Row); CancelSearch(); if (B) { View->Next->SwitchToModel(B); return ErOK; } } return ErFAIL; case ExBufListSearchCancel: CancelSearch(); return ErOK; case ExBufListSearchNext: // Find next matching line if (SearchLen) { int i = Row + 1; i = GetMatchingLine(i == BCount ? 0 : i, 1); // Never returns -1 since something already found before call Row = SearchPos[SearchLen] = i; } return ErOK; case ExBufListSearchPrev: // Find prev matching line if (SearchLen) { int i = Row - 1; i = GetMatchingLine(i == -1 ? BCount - 1 : i, -1); // Never returns -1 since something already found before call Row = SearchPos[SearchLen] = i; } return ErOK; } return EList::ExecCommand(Command, State); }