home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / AW20.ZIP / AW.C < prev    next >
Text File  |  1989-11-28  |  15KB  |  489 lines

  1. #define INCL_WIN
  2. #define INCL_GPI
  3. #define INCL_DOS
  4. #define INCL_VIO
  5. #define INCL_AVIO
  6. #include <os2.h>
  7. #include <mt\stdlib.h>
  8. #include <mt\string.h>
  9. #include <mt\process.h>
  10. #include "aw.h"
  11. #define NUMLINES 60
  12. #define MAXWIDTH 80
  13.  
  14. HAB    hAB;
  15. HMQ    hmqaw;
  16. HWND    hwndaw;
  17. HWND    hwndawFrame;
  18. HWND   hwndHscroll,hwndVscroll;
  19. HPS    hps;
  20. HVPS   hvps;
  21.  
  22. CHAR    szClassName[] = "aw";
  23. char far filename[20];
  24. SHORT    iSel = 0;
  25. USHORT all = TRUE;
  26. char drive_str[27][4];
  27. USHORT drive_sel[27];
  28. USHORT num_drive = 0;
  29. LONG SecSem;
  30. TID idThread;
  31. UCHAR cThreadStack[9216];
  32. USHORT busy = FALSE;
  33. USHORT file_attr = 0x0000;
  34. SHORT  sHscrollPos,sVscrollPos,cxChar,cyChar,cxClient,cyClient;
  35. SHORT cyPage = 0;
  36. BYTE bBlankCell[2] = " ";
  37. USHORT row = 0;
  38. SWP swp;
  39. USHORT szswp;
  40. RECTL rect;
  41.  
  42. SHORT cdecl main( )
  43. {
  44.    QMSG qmsg;
  45.    ULONG ctldata;
  46.  
  47.    hAB = WinInitialize(NULL);
  48.  
  49.    hmqaw = WinCreateMsgQueue(hAB, 0);
  50.  
  51.    if (!WinRegisterClass( hAB,
  52.                (PCH)szClassName,
  53.                (PFNWP)awWndProc,
  54.                CS_SYNCPAINT | CS_SIZEREDRAW,
  55.                0))
  56.     return( 0 );
  57.  
  58.    ctldata = FCF_STANDARD & ~FCF_SHELLPOSITION | FCF_VERTSCROLL | FCF_HORZSCROLL;
  59.  
  60.    hwndawFrame = WinCreateStdWindow( HWND_DESKTOP,
  61.                      WS_VISIBLE,
  62.                      &ctldata,
  63.                      (PCH)szClassName,
  64.                      NULL,
  65.                      0L,
  66.                      (HMODULE)NULL,
  67.                      AWICON,
  68.                      (HWND FAR *)&hwndaw );
  69.    szswp = sizeof(swp);
  70.    if(!WinQueryProfileData(hAB,szClassName,"POSITION",(PVOID)&swp,&szswp))
  71.    {
  72.       WinQueryWindowRect( HWND_DESKTOP, (PRECTL)&rect );
  73.       WinSetWindowPos(hwndawFrame,HWND_TOP,
  74.          (SHORT)rect.xLeft,(SHORT)rect.yTop  - 270,230,
  75.          (SHORT)270,
  76.          SWP_SIZE | SWP_MOVE |SWP_ACTIVATE);
  77.    }
  78.    else
  79.        WinSetWindowPos(hwndawFrame,HWND_TOP,
  80.          (SHORT)swp.x,(SHORT)swp.y,swp.cx,
  81.          (SHORT)swp.cy,
  82.          SWP_SIZE | SWP_MOVE |SWP_ACTIVATE);
  83.  
  84.    WinShowWindow( hwndawFrame, TRUE );
  85.  
  86.    while( WinGetMsg( hAB, (PQMSG)&qmsg, (HWND)NULL, 0, 0 ) )
  87.    {
  88.        WinDispatchMsg( hAB, (PQMSG)&qmsg );
  89.    }
  90.    DosSuspendThread(idThread);
  91.    WinDestroyWindow( hwndawFrame );
  92.    WinDestroyMsgQueue( hmqaw );
  93.    WinTerminate( hAB );
  94. }
  95. BYTE RgbToVioColor(COLOR clrRgb)
  96. {
  97.    BYTE bIrgb = 0;
  98.    RGB rgb;
  99.  
  100.    rgb = MAKETYPE(clrRgb,RGB);
  101.    if(rgb.bBlue >= 0x80)
  102.        bIrgb |= '\x01';
  103.    if(rgb.bGreen >= 0x80)
  104.        bIrgb |= '\x02';
  105.    if(rgb.bRed >= 0x80)
  106.        bIrgb |= '\x04';
  107.    if(rgb.bBlue >= 0xC0 || rgb.bGreen >= 0xC0 || rgb.bRed >= 0xC0)
  108.        bIrgb |= 8;
  109.    if(bIrgb == 0 && rgb.bBlue >= 0x40 && rgb.bGreen >= 0x40 && rgb.bRed >= 0x40)
  110.        bIrgb = 8;
  111.    return(bIrgb);
  112. }
  113. BYTE ConstructDefaultAttribute(VOID)
  114. {
  115.    return RgbToVioColor( WinQuerySysColor(HWND_DESKTOP,SYSCLR_WINDOW,0L)) << 4 |
  116.        RgbToVioColor(WinQuerySysColor(HWND_DESKTOP,SYSCLR_WINDOWTEXT,0L));
  117. }
  118. VOID WndCreate(hWnd)
  119. HWND hWnd;
  120. {
  121.    HDC hdc;
  122.    SIZEL sizl;
  123.  
  124.    hdc = WinOpenWindowDC(hWnd);
  125.    sizl.cx = sizl.cy = 0;
  126.    hps = GpiCreatePS(hAB,hdc,&sizl,PU_PELS | GPIF_DEFAULT |
  127.                              GPIT_MICRO | GPIA_ASSOC);
  128.    VioCreatePS(&hvps,NUMLINES,MAXWIDTH,0,1,NULL);
  129.    VioAssociate(hdc,hvps);
  130.    VioGetDeviceCellSize(&cyChar,&cxChar,hvps);
  131.    bBlankCell[1] = ConstructDefaultAttribute();
  132.    VioScrollUp(0,0,-1,-1,-1,bBlankCell,hvps);
  133.    hwndHscroll = WinWindowFromID(WinQueryWindow(hWnd,QW_PARENT,
  134.                  FALSE),FID_HORZSCROLL);
  135.    WinSendMsg(hwndHscroll,SBM_SETSCROLLBAR,
  136.           MPFROM2SHORT(sHscrollPos,0),
  137.           MPFROM2SHORT(0,MAXWIDTH - 1));
  138.    hwndVscroll = WinWindowFromID(WinQueryWindow(hWnd,QW_PARENT,
  139.                  FALSE),FID_VERTSCROLL);
  140.    WinSendMsg(hwndVscroll,SBM_SETSCROLLBAR,
  141.               MPFROM2SHORT(sVscrollPos,0),
  142.               MPFROM2SHORT(0,NUMLINES - 1));
  143.    DosSemSet(&SecSem);
  144.    _beginthread((void(_CDECL far *)(void far *))SecondThread,cThreadStack,sizeof(cThreadStack),NULL);
  145. }
  146. VOID gotoxy(row,col,hvps)
  147. SHORT row,col;
  148. HVPS hvps;
  149. {
  150.        SHORT trow,tcol;
  151.  
  152.        VioGetCurPos(&trow,&tcol,hvps);
  153.        if(row != -1)
  154.        WinSendMsg(hwndVscroll,SBM_SETPOS,
  155.                  MPFROM2SHORT(row,0),NULL);
  156.        else
  157.            row = trow;
  158.        if(col != -1)
  159.        WinSendMsg(hwndHscroll,SBM_SETPOS,
  160.                  MPFROM2SHORT(col,0),NULL);
  161.        else
  162.            col = tcol;
  163.        VioSetCurPos(row,col,hvps);
  164. }
  165.  
  166. VOID adj_view()
  167. {
  168.    USHORT row,col;
  169.  
  170.    VioGetCurPos(&row,&col,hvps);
  171.    if (sVscrollPos + cyPage < row + 2 )
  172.    {
  173.        sVscrollPos = (row - cyPage) + 1;
  174.        VioSetOrg(sVscrollPos,sHscrollPos,hvps);
  175.    }
  176.    else if (sVscrollPos > row )
  177.    {
  178.        sVscrollPos = row;        
  179.        VioSetOrg(sVscrollPos,sHscrollPos,hvps);
  180.    }
  181. }
  182.  
  183.  
  184. MRESULT EXPENTRY awWndProc( hWnd, msg, mp1, mp2 )
  185. HWND   hWnd;
  186. USHORT msg;
  187. MPARAM mp1;
  188. MPARAM mp2;
  189. {
  190.    RECTL rclInvalid;
  191.    SHORT cyTemp,cxTemp;
  192.  
  193.    if(!busy)
  194.        EnableMenuItem(hwndaw,IDM_PARA,TRUE);
  195.    switch (msg)
  196.    {
  197.        case WM_CREATE:
  198.             WndCreate(hWnd);
  199.         break;
  200.         case WM_COMMAND:
  201.             switch(LOUSHORT(mp1))
  202.            {
  203.                case IDM_EXITAW:
  204.                     WinPostMsg( hWnd, WM_QUIT, 0L, 0L );
  205.                 break;
  206.                case IDM_RESUME:
  207.                break;
  208.                case IDMABOUT:
  209.                    WinDlgBox(HWND_DESKTOP,hWnd,(PFNWP)AboutDlg,NULL,IDD_ABOUT, NULL );
  210.                break;
  211.                case IDM_PARA:
  212.                    WinDlgBox(HWND_DESKTOP,hWnd,(PFNWP)ParaDlg,NULL,IDD_PARA, NULL );
  213.                break;
  214.                case IDM_DEFAULTS:
  215.                    WinQueryWindowRect( HWND_DESKTOP, (PRECTL)&rect );
  216.                    WinSetWindowPos(hwndawFrame,HWND_TOP,
  217.                        (SHORT)rect.xLeft,(SHORT)rect.yTop    - 270,230,
  218.                        (SHORT)270,SWP_SIZE | SWP_MOVE |SWP_ACTIVATE);
  219.                break;
  220.            }
  221.        break;
  222.        case WM_SIZE:
  223.            cxTemp = cxClient;
  224.            cyTemp = cyClient;
  225.            cxClient = SHORT1FROMMP(mp2);
  226.            cyClient = SHORT2FROMMP(mp2);
  227.            cyPage = cyClient / cyChar;
  228.            sVscrollPos = 0;
  229.            sHscrollPos = 0;
  230.            gotoxy(0,0,hvps);
  231.            VioSetOrg(sVscrollPos,sHscrollPos,hvps);
  232.            WinDefAVioWindowProc(hWnd,msg,mp1,mp2);
  233.        break;
  234.        case WM_DESTROY:
  235.            WinQueryWindowPos(hwndawFrame,&swp);
  236.            szswp = sizeof(swp);
  237.            WinWriteProfileData(hAB,szClassName,"POSITION",(PVOID)&swp,szswp);
  238.            VioAssociate(NULL,hvps);
  239.            VioDestroyPS(hvps);
  240.            GpiDestroyPS(hps);
  241.        break;
  242.        case WM_HSCROLL:
  243.            switch(SHORT2FROMMP(mp2))
  244.            {
  245.                case SB_LINELEFT:
  246.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndHscroll,
  247.                        SBM_QUERYPOS,NULL,NULL));
  248.                    cyTemp--;
  249.                    if(cyTemp >= 0)
  250.                        gotoxy(-1,cyTemp,hvps);
  251.                    sHscrollPos -= 1;
  252.                break;
  253.                case SB_LINERIGHT:
  254.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndHscroll,
  255.                        SBM_QUERYPOS,NULL,NULL));
  256.                    cyTemp++;
  257.                    if(cyTemp <= MAXWIDTH)
  258.                        gotoxy(-1,cyTemp,hvps);
  259.                    sHscrollPos += 1;
  260.                break;
  261.                case SB_PAGELEFT:
  262.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndHscroll,
  263.                        SBM_QUERYPOS,NULL,NULL));
  264.                    cyTemp -= 1;
  265.                    if(cyTemp < 0)
  266.                        cyTemp = 0;
  267.                    if(cyTemp <= MAXWIDTH)
  268.                        gotoxy(-1,cyTemp,hvps);
  269.                    sHscrollPos -= 1;
  270.                break;
  271.                case SB_PAGERIGHT:
  272.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndHscroll,
  273.                        SBM_QUERYPOS,NULL,NULL));
  274.                    cyTemp += 1;
  275.                    if(cyTemp >= MAXWIDTH)
  276.                        cyTemp = MAXWIDTH - 1;
  277.                    gotoxy(-1,cyTemp,hvps);
  278.                    sHscrollPos += 1;
  279.                break;
  280.                case SB_SLIDERPOSITION:
  281.                    sHscrollPos = SHORT1FROMMP(mp2);
  282.                    gotoxy(-1,sHscrollPos,hvps);
  283.                break;
  284.            }
  285.            sHscrollPos = max(0,min(sHscrollPos,MAXWIDTH-(cxClient/cxChar)));
  286.            VioSetOrg(sVscrollPos,sHscrollPos,hvps);
  287.        break;
  288.        case WM_VSCROLL:
  289.            switch(SHORT2FROMMP(mp2))
  290.            {
  291.                case SB_LINEUP:
  292.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndVscroll,
  293.                        SBM_QUERYPOS,NULL,NULL));
  294.                    cyTemp--;
  295.                    if(cyTemp >= 0 && cyTemp <= NUMLINES)
  296.                        gotoxy(cyTemp,-1,hvps);
  297.                    sVscrollPos -= 1;
  298.                break;
  299.                case SB_LINEDOWN:
  300.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndVscroll,
  301.                        SBM_QUERYPOS,NULL,NULL));
  302.                    cyTemp++;
  303.                    if(cyTemp > 0 && cyTemp <= NUMLINES)
  304.                        gotoxy(cyTemp,-1,hvps);
  305.                    sVscrollPos += 1;
  306.                break;
  307.                case SB_PAGEUP:
  308.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndVscroll,
  309.                        SBM_QUERYPOS,NULL,NULL));
  310.                    cyTemp -= cyPage;
  311.                    if(cyTemp < 0)
  312.                        cyTemp = 0;
  313.                    if(cyTemp <= NUMLINES)
  314.                        gotoxy(cyTemp,-1,hvps);
  315.                    sVscrollPos -= cyPage;
  316.                break;
  317.                case SB_PAGEDOWN:
  318.                    cyTemp = SHORT1FROMMP(WinSendMsg(hwndVscroll,
  319.                        SBM_QUERYPOS,NULL,NULL));
  320.                    cyTemp += cyPage;
  321.                    if(cyTemp >= NUMLINES)
  322.                        cyTemp = NUMLINES - 1;
  323.                    gotoxy(cyTemp,-1,hvps);
  324.                    sVscrollPos += cyPage;
  325.                break;
  326.                case SB_SLIDERPOSITION:
  327.                    sVscrollPos = SHORT1FROMMP(mp2);
  328.                    gotoxy(sVscrollPos,-1,hvps);
  329.                break;
  330.            }
  331.            sVscrollPos = max(0, min(sVscrollPos,NUMLINES - cyPage));
  332.            VioSetOrg(sVscrollPos,sHscrollPos,hvps);
  333.        break;
  334.        case WM_CHAR:
  335.            switch(CHARMSG(&msg)->vkey)
  336.            {
  337.                case VK_LEFT:
  338.                case VK_RIGHT:
  339.                    return(WinSendMsg(hwndHscroll,msg,mp1,mp2));
  340.                case VK_UP:
  341.                case VK_DOWN:
  342.                case VK_PAGEUP:
  343.                case VK_PAGEDOWN:
  344.                    return(WinSendMsg(hwndVscroll,msg,mp1,mp2));
  345.            }
  346.        break;
  347.        case WM_PAINT:
  348.            hps = WinBeginPaint( hWnd, NULL, &rclInvalid );
  349.            VioShowBuf(0,NUMLINES * MAXWIDTH * 2,hvps);
  350.            WinEndPaint(hps);
  351.        break;
  352.        case WM_PAINT_TTY:
  353.            if(row >= NUMLINES)
  354.            {
  355.                VioScrollUp(0,0,NUMLINES,MAXWIDTH,1,bBlankCell,hvps);
  356.                row--;
  357.            }
  358.            VioWrtCharStr(mp1,strlen(mp1),row,0,hvps);
  359.            VioSetCurPos(row,strlen(mp1),hvps);
  360.            WinSendMsg(hwndVscroll,SBM_SETPOS,
  361.                MPFROM2SHORT(row++,0),NULL);
  362.            WinSendMsg(hwndHscroll,SBM_SETPOS,
  363.                MPFROM2SHORT(strlen(mp1),0),NULL);
  364.            adj_view();
  365.            DosSemClear(&SecSem);
  366.        break;
  367.        default:
  368.            return( WinDefWindowProc( hWnd, msg, mp1, mp2 ) );
  369.        break;
  370.    }
  371.    return(0L);
  372. }
  373.  
  374. MRESULT EXPENTRY AboutDlg( hWndDlg, message, mp1, mp2 )
  375. HWND   hWndDlg;
  376. USHORT message;
  377. MPARAM mp1;
  378. MPARAM mp2;
  379. {
  380.    switch( message )
  381.    {
  382.        case WM_COMMAND:
  383.            switch( SHORT1FROMMP( mp1 ) )
  384.            {
  385.                case DID_OK:
  386.                case DID_CANCEL:
  387.                    WinDismissDlg( hWndDlg, TRUE );
  388.                break;
  389.                default:
  390.                    return( FALSE );
  391.            }
  392.        break;
  393.        default:
  394.            return( WinDefDlgProc( hWndDlg, message, mp1, mp2 ) );
  395.    }
  396.    return( FALSE );
  397. }
  398.  
  399. MRESULT EXPENTRY ParaDlg( hWndDlg, message, mp1, mp2 )
  400. HWND   hWndDlg;
  401. USHORT message;
  402. MPARAM mp1;
  403. MPARAM mp2;
  404. {
  405.    char drives;
  406.    char str[5];
  407.    USHORT indx;
  408.    USHORT disk;
  409.    ULONG drivemap;
  410.    USHORT con;
  411.  
  412.    switch( message )
  413.    {
  414.        case WM_INITDLG:
  415.            DosQCurDisk(&disk,&drivemap);
  416.         for(drives = 'A'; drives <= 'Z'; drives++)
  417.         {
  418.                if(drivemap & 1)
  419.                {
  420.                    str[0] = drives;
  421.                    str[1] = ':';
  422.                    str[2] = 0;
  423.                    WinSendDlgItemMsg( hWndDlg, IDD_LISTBOX, LM_INSERTITEM,
  424.                        (MPARAM)LIT_END, (MPARAM)(PCH)str );
  425.                }
  426.                drivemap >>= 1;
  427.            }
  428.            for(indx = 0;indx < num_drive;indx++)
  429.            WinSendDlgItemMsg( hWndDlg, IDD_LISTBOX, LM_SELECTITEM,
  430.                (MPARAM)(drive_sel[indx]), (MPARAM)TRUE );
  431.            if(indx == 0)
  432.                WinSendDlgItemMsg( hWndDlg, IDD_LISTBOX, LM_SELECTITEM,
  433.                    (MPARAM)(disk - 1), (MPARAM)TRUE );
  434.            WinSetWindowText(WinWindowFromID(hWndDlg,IDD_FILE),filename);
  435.            if(file_attr & 0x0004)
  436.                WinSendDlgItemMsg(hWndDlg,IDD_SYS,BM_SETCHECK,(MPARAM)TRUE,0L);
  437.            if(file_attr & 0x0002)
  438.                WinSendDlgItemMsg(hWndDlg,IDD_HID,BM_SETCHECK,(MPARAM)TRUE,0L);
  439.            if(all)
  440.                WinSendDlgItemMsg(hWndDlg,IDD_ALL,BM_SETCHECK,(MPARAM)TRUE,0L);
  441.            WinSendDlgItemMsg(hWndDlg,IDD_FILE,EM_SETTEXTLIMIT,(MPARAM)12,0L);
  442.        break;
  443.        case WM_COMMAND:
  444.            switch( SHORT1FROMMP( mp1 ) )
  445.         {
  446.          case DID_OK:
  447.               file_attr = 0x0000;
  448.               all = FALSE;
  449.               WinQueryDlgItemText(hWndDlg,IDD_FILE,sizeof(filename),(PCH)filename);
  450.               iSel =LIT_FIRST;
  451.               for(indx = 0,con = 1;con == 1;indx++)
  452.               {
  453.                iSel =  (SHORT)WinSendDlgItemMsg( hWndDlg, IDD_LISTBOX,
  454.                    LM_QUERYSELECTION,(MPARAM)iSel, 0L);
  455.                if(iSel != LIT_NONE)
  456.                {
  457.                 WinSendDlgItemMsg(hWndDlg,IDD_LISTBOX,LM_QUERYITEMTEXT,
  458.                      MPFROM2SHORT((SHORT)iSel, (SHORT)3), drive_str[indx]);
  459.                 drive_sel[indx] = iSel;
  460.                }
  461.                else
  462.                 con = 0;
  463.                }
  464.                num_drive = indx - 1;
  465.                if(WinSendDlgItemMsg(hWndDlg,IDD_SYS,BM_QUERYCHECK,0L,0L) == 1)
  466.                 file_attr = file_attr | 0x0004;
  467.                if(WinSendDlgItemMsg(hWndDlg,IDD_HID,BM_QUERYCHECK,0L,0L) == 1)
  468.                 file_attr = file_attr | 0x0002;
  469.                if(WinSendDlgItemMsg(hWndDlg,IDD_ALL,BM_QUERYCHECK,0L,0L) == 1)
  470.                        all = TRUE;
  471.                WinDismissDlg( hWndDlg, TRUE );
  472.                WinSendMsg(hwndaw,WM_PAINT_TTY,"Starting search...",0L);
  473.                busy = TRUE;
  474.                EnableMenuItem(hwndaw,IDM_PARA,FALSE);
  475.                DosSemClear(&SecSem);
  476.          break;
  477.          case DID_CANCEL:
  478.                WinDismissDlg( hWndDlg, TRUE );
  479.          break;
  480.          default:
  481.                return( FALSE );
  482.         }
  483.        break;
  484.        default:
  485.         return( WinDefDlgProc( hWndDlg, message, mp1, mp2 ) );
  486.    }
  487.    return( FALSE );
  488. }
  489.