home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 January (DVD) / VPR980100.ISO / OLS / WIN16 / HMIZE120 / HMIZE120.LZH / SOURCE.LZH / LISTHOOK.CPP < prev    next >
C/C++ Source or Header  |  1994-09-14  |  6KB  |  290 lines

  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "hidemize.h"
  6. #include "listhook.h"
  7. #include "..\hidemaru\menu.h"
  8.  
  9. static BOOL    fComboBox;
  10.  
  11. static char    szSearch[100];
  12. static HWND    hwndSearch;
  13. static char    chSearch;
  14.  
  15. int CALLBACK _export SearchDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
  16.     switch( message ) {
  17.         case WM_INITDIALOG:
  18.             {
  19.                 RECT    rc;
  20.                 GetWindowRect( hwndSearch, &rc);
  21.                 SetWindowPos( hwnd, NULL, rc.left, rc.top, 0, 0
  22.                     , SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER );
  23.             }
  24.             SendDlgItemMessage( hwnd, IDE_SEARCH, EM_LIMITTEXT, (WPARAM)(sizeof(szSearch)-1), 0L );
  25.             SetFocus( GetDlgItem( hwnd, IDE_SEARCH ) );
  26.             if( chSearch != '\0' ) {
  27.                 SendDlgItemMessage( hwnd, IDE_SEARCH, WM_CHAR, chSearch, 1L );
  28.             }
  29.             return FALSE;
  30.  
  31.         case WM_COMMAND:
  32.             if( wParam == IDOK ) {
  33.                 GetDlgItemText( hwnd, IDE_SEARCH, szSearch, sizeof(szSearch) );
  34.                 EndDialog( hwnd, IDOK );
  35.             } else if( wParam == IDCANCEL ) {
  36.                 EndDialog( hwnd, IDCANCEL );
  37.             }
  38.             break;
  39.     }
  40.     return 0;
  41. }
  42.  
  43. static void ToUpper( char* psz ) {
  44.     while( *psz != '\0' ) {
  45.         if( *psz >= 'a' && *psz <= 'z' ) {
  46.             *psz = *psz - 'a' + 'A';
  47.         }
  48.         psz ++;
  49.     }
  50. }
  51.  
  52. static BOOL IsSearchAble( void ) {
  53.     if( fComboBox ) {
  54.         return FALSE;
  55.     }
  56.     DWORD    dwStyle = GetWindowLong( hwndSearch, GWL_STYLE );
  57.     if( dwStyle & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE) ) {
  58.         if( (dwStyle & LBS_HASSTRINGS) == 0 ) {
  59.             return FALSE;
  60.         }
  61.     }
  62.     return TRUE;
  63. }
  64.  
  65. static void SearchDown( void ) {
  66.     if( !IsSearchAble()
  67.      || szSearch[0] == '\0' ) {
  68.         MessageBeep(0);
  69.         return;
  70.     }
  71.     int    i = (int)SendMessage( hwndSearch, LB_GETCURSEL, 0, 0L );
  72.     if( i < 0 ) {
  73.         i = 0;
  74.     } else {
  75.         i ++;
  76.     }
  77.     for(;;) {
  78.         char    sz[200];
  79.         int    cch;
  80.         cch = (int)SendMessage( hwndSearch, LB_GETTEXTLEN, (WPARAM)i, 0L );
  81.         if( cch < 0 ) {
  82.             MessageBeep(0);
  83.             return;
  84.         }
  85.         if( cch < sizeof(sz) - 1 ) {
  86.             SendMessage( hwndSearch, LB_GETTEXT, (WPARAM)i, (LPARAM)(LPSTR)sz );
  87.             ToUpper( sz );
  88.             if( strstr( sz, szSearch ) != NULL ) {
  89.                 SendMessage( hwndSearch, LB_SETCURSEL, (WPARAM)i, 0L );
  90.                 SendMessage( GetParent( hwndSearch ), WM_COMMAND
  91.                     , GetWindowWord( hwndSearch, GWW_ID )
  92.                     , MAKELONG( hwndSearch, LBN_SELCHANGE ) );
  93.                 break;
  94.             }
  95.         }
  96.         i ++;
  97.     }
  98. }
  99.  
  100. static void SearchUp( void ) {
  101.     if( !IsSearchAble()
  102.      || szSearch[0] == '\0' ) {
  103.         MessageBeep(0);
  104.         return;
  105.     }
  106.     int    i = (int)SendMessage( hwndSearch, LB_GETCURSEL, 0, 0L );
  107.     if( i < 0 ) {
  108.         i = (int)SendMessage( hwndSearch, LB_GETCOUNT, 0, 0L ) - 1;
  109.     } else {
  110.         i --;
  111.     }
  112.     for(;;) {
  113.         char    sz[200];
  114.         int    cch;
  115.         if( i < 0 ) {
  116.             MessageBeep(0);
  117.             return;
  118.         }
  119.         cch = (int)SendMessage( hwndSearch, LB_GETTEXTLEN, (WPARAM)i, 0L );
  120.         if( cch < 0 ) {
  121.             MessageBeep(0);
  122.             return;
  123.         }
  124.         if( cch < sizeof(sz) - 1 ) {
  125.             SendMessage( hwndSearch, LB_GETTEXT, (WPARAM)i, (LPARAM)(LPSTR)sz );
  126.             ToUpper( sz );
  127.             if( strstr( sz, szSearch ) != NULL ) {
  128.                 SendMessage( hwndSearch, LB_SETCURSEL, (WPARAM)i, 0L );
  129.                 SendMessage( GetParent( hwndSearch ), WM_COMMAND
  130.                     , GetWindowWord( hwndSearch, GWW_ID )
  131.                     , MAKELONG( hwndSearch, LBN_SELCHANGE ) );
  132.                 break;
  133.             }
  134.         }
  135.         i --;
  136.     }
  137. }
  138.  
  139. static BOOL Search( char chSearchIn = '\0' ) {
  140.     chSearch = chSearchIn;
  141.     hwndSearch = hwndTarget;
  142.     if( !IsSearchAble() ) {
  143.         DebugOut( "IsSearchAble() returns FALSE.\x0d\x0a" );
  144.         return FALSE;
  145.     }
  146.     if( DialogBox( hInstance, "SEARCH", NULL, (DLGPROC)SearchDlgProc ) == IDOK ) {
  147.         ToUpper( szSearch );
  148.         SearchDown();
  149.     }
  150.     return TRUE;
  151. }
  152.  
  153. BOOL ProcessListBoxCommand( int cmd ) {
  154.     DebugOut( "ListBoxCommand: " );
  155.     {
  156.         char    sz[20];
  157.         itoa( cmd, sz, 10 );
  158.         DebugOut( sz );
  159.         DebugOut( "\x0d\x0a" );
  160.     }
  161.     switch( cmd ) {
  162.         case CMD_CURSOR_UP:
  163.         case CMD_FAST_UP:
  164.             SendVKey( VK_UP );
  165.             break;
  166.  
  167.         case CMD_CURSOR_DOWN:
  168.         case CMD_FAST_DOWN:
  169.             SendVKey( VK_DOWN );
  170.             break;
  171.  
  172.         case CMD_CURSOR_RIGHT:
  173.             SendVKey( VK_RIGHT );
  174.             break;
  175.  
  176.         case CMD_CURSOR_LEFT:
  177.             SendVKey( VK_LEFT );
  178.             break;
  179.  
  180.         case CMD_GO_LINE_TOP:
  181.         case CMD_GO_LINE_TOP2:
  182.         case CMD_GO_FILE_TOP:
  183.             SendVKey( VK_HOME );
  184.             break;
  185.  
  186.         case CMD_GO_LINE_END:
  187.         case CMD_GO_LINE_END2:
  188.         case CMD_GO_FILE_END:
  189.             SendVKey( VK_END );
  190.             break;
  191.  
  192.         case CMD_NEXT_PAGE:
  193.         case CMD_HALF_NEXT_PAGE:
  194.             SendVKey( VK_NEXT );
  195.             break;
  196.  
  197.         case CMD_PREV_PAGE:
  198.         case CMD_HALF_PREV_PAGE:
  199.             SendVKey( VK_PRIOR );
  200.             break;
  201.  
  202.         case CMD_FIND:
  203.         case CMD_FIND_DEFAULT_UP:
  204.             if( !Search() ) {
  205.                 MessageBeep(0);
  206.             }
  207.             break;
  208.  
  209.         case CMD_FIND_UP:
  210.             SearchUp();
  211.             break;
  212.  
  213.         case CMD_FIND_DOWN:
  214.             SearchDown();
  215.             break;
  216.  
  217.         default:
  218.             if( cmd >= CMD_MENU_1 && cmd <= CMD_MENU_8 ) {
  219.                 CommandKeyMenu( cmd );
  220.                 break;
  221.             }
  222.             MessageBeep(0);
  223.             return FALSE;
  224.     }
  225.     return TRUE;
  226. }
  227.  
  228. BOOL ListBoxHookProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
  229.     static int    cmd;
  230.     fComboBox = FALSE;
  231.     switch( message ) {
  232.         case WM_KEYDOWN:
  233.             if( wParam >= VK_F1 ) {
  234.                 cmd = GetCommand( wParam );
  235.                 if( cmd != 0 ) {
  236.                     if( ProcessListBoxCommand( cmd ) ) {
  237.                         return TRUE;
  238.                     }
  239.                 }
  240.             }
  241.             break;
  242.  
  243.         case WM_CHAR:
  244.             if( wParam < ' ' ) {
  245.                 cmd = GetCommand( wParam + '@' );
  246.                 if( cmd != 0 ) {
  247.                     if( ProcessListBoxCommand( cmd ) ) {
  248.                         return TRUE;
  249.                     }
  250.                 }
  251.             } else if( wParam > ' ' && (afConfig & FLAG_HOOK_LISTBOX_SEARCH) != 0 ) {
  252.                 DebugOut( "ListBox: search\x0d\x0a" );
  253.                 if( Search( wParam ) ) {
  254.                     return TRUE;
  255.                 }
  256.             }
  257.             break;
  258.     }
  259.     return FALSE;
  260. }
  261.  
  262. BOOL ComboBoxHookProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
  263.     static int    cmd;
  264.     fComboBox = TRUE;
  265.     switch( message ) {
  266.         case WM_KEYDOWN:
  267.             if( wParam >= VK_F1 ) {
  268.                 cmd = GetCommand( wParam );
  269.                 if( cmd != 0 ) {
  270.                     if( ProcessListBoxCommand( cmd ) ) {
  271.                         return TRUE;
  272.                     }
  273.                 }
  274.             }
  275.             break;
  276.  
  277.         case WM_CHAR:
  278.             if( wParam < ' ' ) {
  279.                 cmd = GetCommand( wParam + '@' );
  280.                 if( cmd != 0 ) {
  281.                     if( ProcessListBoxCommand( cmd ) ) {
  282.                         return TRUE;
  283.                     }
  284.                 }
  285.             }
  286.             break;
  287.     }
  288.     return FALSE;
  289. }
  290.