home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / ftes46b5.zip / ftes46b5 / src / i_search.cpp < prev    next >
C/C++ Source or Header  |  1997-05-30  |  4KB  |  156 lines

  1. /*    i_search.cpp
  2.  *
  3.  *    Copyright (c) 1994-1996, Marko Macek
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. #include "fte.h"
  11.  
  12. #ifdef CONFIG_I_SEARCH
  13.  
  14. static char PrevISearch[MAXISEARCH] = "";
  15.  
  16. ExISearch::ExISearch(EBuffer *B) {
  17.     Buffer = B;
  18.     strcpy(ISearchStr, "");
  19.     len = 0;
  20.     stacklen = 0;
  21.     Orig = Buffer->CP; // ?
  22.     Direction = 0;
  23.     state = INoMatch;
  24. }
  25.  
  26. ExISearch::~ExISearch() {
  27.     if (ISearchStr[0] != 0)
  28.         strcpy(PrevISearch, ISearchStr);
  29. }
  30.  
  31. void ExISearch::Activate(int gotfocus) {
  32.     ExView::Activate(gotfocus);
  33. }
  34.  
  35. int ExISearch::BeginMacro() { return 1; }
  36.  
  37. void ExISearch::HandleEvent(TEvent &Event) {
  38.     int Case = BFI(Buffer, BFI_MatchCase) ? 0 : SEARCH_NCASE;
  39.     
  40.     ExView::HandleEvent(Event);
  41.     switch (Event.What) {
  42.     case evKeyDown:
  43.         SetState(IOk);
  44.         switch (kbCode(Event.Key.Code)) {
  45.         case kbEsc: 
  46.             Buffer->SetPos(Orig.Col, Orig.Row);
  47.             EndExec(0); 
  48.             break;
  49.         case kbEnter: EndExec(1); break;
  50.         case kbBackSp:
  51.             if (len > 0) {
  52.                 if (stacklen > 0) {
  53.                     stacklen--;
  54.                     if (Buffer->CenterPos(stack[stacklen].Col, stack[stacklen].Row) == 0) return;
  55.                 }
  56.                 len--;
  57.                 ISearchStr[len] = 0;
  58.                 if (len > 0 && Buffer->FindStr(ISearchStr, len, Case | Direction) == 0) {
  59.                     SetState(INoMatch);
  60.                 }
  61.             } else {
  62.                 if (Buffer->CenterPos(Orig.Col, Orig.Row) == 0) return;
  63.             }
  64.             break;
  65.         case kbUp:
  66.             Direction = SEARCH_BACK;
  67.             if (len == 0) {
  68.                 strcpy(ISearchStr, PrevISearch);
  69.                 len = strlen(ISearchStr);
  70.                 if (len == 0)
  71.                     break;
  72.             }
  73.             if (Buffer->FindStr(ISearchStr, len, Case | Direction | SEARCH_NEXT) == 0) {
  74.                 Buffer->FindStr(ISearchStr, len, Case);
  75.                 SetState(INoPrev);
  76.             }
  77.             break;
  78.         case kbDown:
  79.             Direction = 0;
  80.             if (len == 0) {
  81.                 strcpy(ISearchStr, PrevISearch);
  82.                 len = strlen(ISearchStr);
  83.                 if (len == 0)
  84.                     break;
  85.             }
  86.             if (Buffer->FindStr(ISearchStr, len, Case | Direction | SEARCH_NEXT) == 0) {
  87.                 Buffer->FindStr(ISearchStr, len, Case);
  88.                 SetState(INoNext);
  89.             }
  90.             break;
  91.         default:
  92.             if (isAscii(Event.Key.Code) && (len < MAXISEARCH)) {
  93.                 char Ch = (char) Event.Key.Code;
  94.                 
  95.                 stack[stacklen] = Buffer->CP;
  96.                 ISearchStr[len++] = Ch;
  97.                 ISearchStr[len] = 0;
  98.                 if (Buffer->FindStr(ISearchStr, len, Case | Direction) == 0) {
  99.                     SetState(INoMatch);
  100.                     len--;
  101.                     stacklen--;
  102.                     ISearchStr[len] = 0;
  103.                     Buffer->FindStr(ISearchStr, len, Case | Direction);
  104.                 } else {
  105.                 }
  106.             }
  107.             break;
  108.         }
  109.     }
  110. }
  111.  
  112. void ExISearch::UpdateView() {
  113.     if (Next) {
  114.         Next->UpdateView();
  115.     }
  116. }
  117.  
  118. void ExISearch::RepaintView() {
  119.     if (Next) {
  120.         Next->RepaintView();
  121.     }
  122. }
  123.  
  124. void ExISearch::UpdateStatus() {
  125.     RepaintStatus();
  126. }
  127.  
  128. void ExISearch::RepaintStatus() {
  129.     TDrawBuffer B;
  130.     char s[MAXISEARCH + 1];
  131.     char *p;
  132.     int W, H;
  133.     
  134.     ConQuerySize(&W, &H);
  135.     
  136.     switch (state) {
  137.     case INoMatch: p = " No Match. "; break;
  138.     case INoPrev: p = " No Prev Match. "; break;
  139.     case INoNext: p = " No Next Match. "; break;
  140.     case IOk: default: p = ""; break;
  141.     }
  142.     
  143.     sprintf(s, "ISearch [%s]%s", ISearchStr, p);
  144.     MoveCh(B, ' ', 0x17, W);
  145.     MoveStr(B, 0, W, s, 0x17, W);
  146.     ConPutBox(0, H - 1, W, 1, B);
  147.     ConSetCursorPos(strlen(s) - 1, H - 1);
  148.     ConShowCursor();
  149. }
  150.  
  151. void ExISearch::SetState(IState s) {
  152.     state = s;
  153.     RepaintView();
  154. }
  155. #endif
  156.