home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / iniedit1.zip / INIEDIT.C < prev    next >
C/C++ Source or Header  |  1989-02-24  |  26KB  |  706 lines

  1. /******************************* Module Header ******************************\
  2. * Module Name: IniEdit.c
  3. *
  4. *
  5. * PM OS2.ini Editor
  6. *
  7. * Allows adding, deleting and modifying of os2.ini entries through PM
  8. * interface
  9. *
  10. *
  11. \***************************************************************************/
  12.  
  13.  
  14. #define LINT_ARGS                           // Include needed parts of PM
  15. #define INCL_WININPUT                       //    definitions
  16. #define INCL_WINSYS
  17. #define INCL_WINMESSAGEMGR
  18. #define INCL_WINBUTTONS
  19. #define INCL_WINPOINTERS
  20. #define INCL_WINHEAP
  21. #define INCL_WINSHELLDATA
  22. #define INCL_WINMENUS
  23. #define INCL_WINFRAMEMGR
  24. #define INCL_WINDIALOGS
  25. #define INCL_WINLISTBOXES
  26. #define INCL_WINENTRYFIELDS
  27. #define INCL_DOSMEMMGR
  28. #define INCL_WINSWITCHLIST
  29. #define INCL_DOSPROCESS
  30. #define INCL_GPIBITMAPS
  31. #define INCL_GPIREGIONS
  32. #define INCL_GPILCIDS
  33. #define INCL_GPIPRIMITIVES
  34. #define INCL_DEV
  35.  
  36. #include <string.h>
  37. #include <stdio.h>
  38.  
  39. #include <os2.h>
  40.  
  41. #include "IniEdit.h"
  42.  
  43.  
  44. /******************************* Constants **********************************/
  45.  
  46. #define STACK_SIZE            0x2000        // Stack size for second thread
  47. #define UPPER_SEGMENT_LIMIT   0xFD00        // Amount of Segment used
  48.  
  49. /******************************** Globals **********************************/
  50.  
  51. char szIniEdit[] = "IniEdit";               // App String Name
  52.  
  53. HAB       habIniEdit;                       // Handle Anchor Block
  54. HMQ       hmqIniEdit;                       // Handle Message Queue
  55. HWND      hwndIniEdit;                      // Main Client Window
  56. HWND      hwndIniEditFrame;                 // Frame Window
  57. HDC       hdcScreen;                        // DC for Client Window
  58. HPS       hpsScreen;                        // PS for Client Window
  59.  
  60.  
  61. USHORT    cAppNames = 0;                    // Count of App names in os2.ini
  62. USHORT    usShift = 0;                      // DosHugeAlloc segment offsets
  63. HWND      FocusWindow = (HWND)NULL;         // Focus of Dialog Box
  64.  
  65. USHORT    usFormat = APP_FORM;              // Current Display format
  66. USHORT    usPrintFormat = APP_FORM;         // Format for Printing
  67. USHORT    usLineHeight = 12;                // Current font Height
  68. HWND      hwndList = (HWND)NULL;            // Handle of Main ListBox
  69. HWND      hwndMenu = (HWND)NULL;            // Handle of Main Menu
  70.  
  71. PGROUPSTRUCT  pGroups;                      // Pointer to String Groups
  72. PPAIRSTRUCT   pPairsBase;                   // Pointer to Key-Value Pairs
  73. PPAIRSTRUCT   pPairsAlloc;                  // Pointer to next Avail Memory
  74. PBYTE         pPrintStack;                  // Pointer to Print Thread Stack
  75.  
  76. #define    HOLD_LEN 4096
  77. CHAR          achNames[HOLD_LEN];        // Array of Character from Query
  78. CHAR          szBuf[MAX_STRING_LEN];        // Character buffer for Pairs
  79.  
  80.  
  81. /***************************** Function Decls ******************************/
  82.  
  83. VOID    ProcessMenuItem( HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2 );
  84. VOID    cdecl main( VOID );
  85. VOID    IniEditPaint( VOID );
  86. VOID    ReadIni( VOID );
  87. VOID    OldProfilePrint( VOID );
  88. VOID    UpdateListBox( BOOL fRead, USHORT usForm );
  89.  
  90. MRESULT CALLBACK IniEditWndProc(HWND, USHORT, MPARAM, MPARAM);
  91.  
  92.  
  93. /***************************** Function Header *****************************\
  94. *
  95. * main
  96. *
  97. *
  98. * Do initialization then do a message loop
  99. *
  100. \***************************************************************************/
  101.  
  102. VOID cdecl main()
  103. {
  104.  
  105.     QMSG         qmsg;                      // Current Queue Message
  106.     ULONG        fcf;                       // Frame Control Flags
  107.     SIZEL        sizel;                     // Size of PS
  108.     RECTL        rclWindow;                 // Size Rect for ListBox Window
  109.     SEL          sel;                       // Selector of allocated segments
  110.     SWCNTRL      swcntrl;                   // Switch Control Block
  111.     FONTMETRICS  fmetrics;                  // FontMetrics of current font
  112.  
  113.  
  114.     /*** Set up and Initialization ***/
  115.  
  116.     /* Initialize the anchor block handle */
  117.     habIniEdit = WinInitialize(NULL);
  118.  
  119.     /* Create the message queue */
  120.     hmqIniEdit = WinCreateMsgQueue(habIniEdit, 0);
  121.  
  122.     /* Register the window class for the IniEdit window */
  123.     WinRegisterClass(habIniEdit, (PCH)szIniEdit, IniEditWndProc,
  124.             CS_SIZEREDRAW, 0);
  125.  
  126.     /* Create the window for IniEdit */
  127.     fcf = FCF_TITLEBAR | FCF_MINMAX | FCF_SYSMENU | FCF_SIZEBORDER | FCF_MENU
  128.         | FCF_SHELLPOSITION | FCF_ACCELTABLE | FCF_ICON;
  129.  
  130.     hwndIniEditFrame = WinCreateStdWindow( HWND_DESKTOP, WS_VISIBLE,
  131.         (PVOID)&fcf, (PSZ)szIniEdit, (PSZ)szIniEdit, WS_VISIBLE,
  132.         (HMODULE)NULL, IDI_INIEDIT, (PHWND)&hwndIniEdit);
  133.  
  134.     /* Create a DC for the IniEdit window */
  135.     hdcScreen = WinOpenWindowDC(hwndIniEdit);
  136.  
  137.     /* also create a screen PS */
  138.  
  139.     sizel.cx= 0L;   // To use the default screen page size.
  140.     sizel.cy= 0L;
  141.  
  142.     if( (hpsScreen = GpiCreatePS( habIniEdit, hdcScreen, &sizel,
  143.             (PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC ))) == (HPS)NULL )
  144.         {
  145.         ;
  146.         }
  147.  
  148.  
  149.     /* Initially set the keyboard focus to us */
  150.     WinSetFocus(HWND_DESKTOP, hwndIniEdit);
  151.  
  152.     /* get the font size */
  153.     GpiQueryFontMetrics( hpsScreen, (LONG)sizeof( FONTMETRICS ), &fmetrics );
  154.     usLineHeight = (USHORT)(fmetrics.lMaxDescender + fmetrics.lMaxBaselineExt);
  155.  
  156.     /* this menu handle is often used */
  157.     hwndMenu = WinWindowFromID( hwndIniEditFrame, FID_MENU );
  158.  
  159.     /* add program to switch list */
  160.     swcntrl.hwnd             = hwndIniEditFrame;
  161.     swcntrl.hwndIcon         = NULL;
  162.     swcntrl.hprog            = NULL;
  163.     swcntrl.idProcess        = NULL;
  164.     swcntrl.idSession        = NULL;
  165.     swcntrl.uchVisibility    = NULL;
  166.     swcntrl.fbJump           = NULL;
  167.     strcpy( swcntrl.szSwtitle, szIniEdit);
  168.     swcntrl.fReserved        = NULL;
  169.  
  170.     WinAddSwitchEntry( &swcntrl );
  171.  
  172.     /* Create main list box in main window */
  173.     WinQueryWindowRect( hwndIniEdit, &rclWindow);
  174.     rclWindow.yTop -= usLineHeight;
  175.     hwndList = WinCreateWindow( hwndIniEdit,            // parent
  176.                                 WC_LISTBOX,             // class
  177.                                 (PSZ)"Scroll",          // name
  178.                                 LS_NOADJUSTPOS,         // style
  179.                                 0, 0,                   // position
  180.                                 (USHORT)rclWindow.xRight,
  181.                                 (USHORT)rclWindow.yTop,
  182.                                 hwndIniEditFrame,       // Owner
  183.                                 HWND_TOP,               // InsertBehind
  184.                                 IDI_LIST,               // ID
  185.                                 (PVOID)NULL,            // pCtlData,
  186.                                 (PVOID)NULL);
  187.  
  188.  
  189.     /*** Memory Allocation ***/
  190.  
  191.     /* Alloc the needed space for the groups */
  192.     if( DosAllocSeg( 32000, &sel, 0) )
  193.         ErrMessage( "main: DosAlloc for pGroup failed" );
  194.     pGroups = MAKEP( sel, 0);
  195.  
  196.     if( DosAllocHuge( 4, 0, &sel, 0, 0) )
  197.         ErrMessage( "main: DosAlloc for pPairs failed" );
  198.     pPairsAlloc = pPairsBase = MAKEP( sel, 0);
  199.  
  200.     /* create a stack for second thread */
  201.     if( DosAllocSeg( STACK_SIZE, &sel, 0) )
  202.         ErrMessage( "main: DosAlloc for Stack failed" );
  203.     pPrintStack = MAKEP( sel, 0);
  204.  
  205.     DosGetHugeShift( &usShift );
  206.  
  207.     /* read in os2.ini and fill in list box */
  208.     UpdateListBox( TRUE, APP_FORM );
  209.  
  210.     WinShowWindow( hwndList, TRUE );
  211.  
  212.     /* Process messages for the window */
  213.     while ( WinGetMsg(habIniEdit, (PQMSG)&qmsg, (HWND)NULL, 0, 0 ) )
  214.         {
  215.  
  216.         /* Dispatch the message */
  217.         WinDispatchMsg(habIniEdit, (PQMSG)&qmsg);
  218.         }
  219.  
  220.  
  221.     /*** CleanUp ***/
  222.  
  223.     /* Destroy the IniEdit window and message queue */
  224.     GpiDestroyPS( hpsScreen );
  225.     WinDestroyWindow(hwndIniEditFrame);
  226.     WinDestroyMsgQueue(hmqIniEdit);
  227.  
  228.     /* Exit PM */
  229.     WinTerminate( habIniEdit );
  230.     DosExit( EXIT_PROCESS, 0 );
  231.  
  232. }  /* main */
  233.  
  234.  
  235. /****************************** Function Header ****************************\
  236. *
  237. * ReadIni
  238. *
  239. *
  240. * Reads in OS2.ini
  241. *
  242. \***************************************************************************/
  243.  
  244. VOID ReadIni()
  245. {
  246. //    CHAR      achNames[HOLD_LEN];           // Array of Character from Query
  247.     USHORT    cchNames;                     // Count of Character from Query
  248.     USHORT    Index[MAX_APP_NAMES];         // Index of Names into achNames
  249.     USHORT    cPairs;                       // Count of pairs in current AppName
  250.     INT       i,j;                          // Loop Counters
  251.  
  252.  
  253.     /* Reset Count of App Names */
  254.     cAppNames = 0;
  255.  
  256.     /* Reset memory available pointer to Base */
  257.     pPairsAlloc = pPairsBase;
  258.  
  259.     /* Determine number of characters in app Names Strings */
  260.     WinQueryProfileSize( habIniEdit, NULL, NULL, &cchNames );
  261.  
  262.     /* Read in the App Name strings */
  263.     WinQueryProfileString( habIniEdit, NULL, NULL, " ", achNames, cchNames );
  264.  
  265.     /*** Find the starting index of each App ***/
  266.  
  267.     /* step through each string in set of app characters
  268.      * adding length of current string to find begining of next string
  269.      * also store each App Name into szAppName element of Group
  270.      */
  271.     for( i=0; i<cchNames; i += (strlen(pGroups[cAppNames-1].szAppName)+1) )
  272.         {
  273.         if( achNames[i] != (char)0 )
  274.             {
  275.             strcpy( pGroups[cAppNames++].szAppName, &achNames[i]);
  276.             }  /* if */
  277.         else
  278.             if( achNames[i+1] == (char)0 )
  279.                 break;
  280.         }  /* for */
  281.  
  282.  
  283.     /*** Read elements of each App Name ***/
  284.     for( i=0; i<cAppNames; i++ )
  285.         {
  286.         /* Get number of Character Associated with App Name */
  287.         WinQueryProfileSize( habIniEdit, pGroups[i].szAppName, NULL, &cchNames );
  288.  
  289.         /* Enumerate all KeyNames for this app name */
  290.         WinQueryProfileString( habIniEdit, pGroups[i].szAppName, NULL, " ", achNames, HOLD_LEN );
  291.  
  292.         /* Count the number of key Names */
  293.         cPairs = 0;
  294.         for( j=0; j<cchNames; j++)
  295.             if( achNames[j] != (CHAR)0 )
  296.                 {
  297.                 Index[cPairs++] = j;
  298.                 j += strlen( &achNames[j] );
  299.                 }
  300.  
  301.         pGroups[i].cKeys = cPairs;
  302.  
  303.         /* Allocate the number of pair structures for the current group */
  304.         pGroups[i].pPairs = pPairsAlloc;
  305.  
  306.         pPairsAlloc += sizeof(PAIRSTRUCT)*cPairs;
  307.  
  308.         /* Step to next segment if near end of current segment */
  309.         if( LOUSHORT(pPairsAlloc) > UPPER_SEGMENT_LIMIT)
  310.             {
  311.             pPairsAlloc = MAKEP( (HIUSHORT(pPairsAlloc)+(1<<usShift)), 0);
  312.             }
  313.  
  314.         /* Store the KeyName into the pair structure */
  315.         for( j=0; j<cPairs; j++ )
  316.             {
  317.             strcpy( pGroups[i].pPairs[j].szKey, &achNames[Index[j]] );
  318.  
  319.             /* store the key value */
  320.             WinQueryProfileString( habIniEdit, pGroups[i].szAppName,
  321.              pGroups[i].pPairs[j].szKey, " ",
  322.              pGroups[i].pPairs[j].szValue, MAX_STRING_LEN );
  323.  
  324.             }
  325.         }  /* each App Name */
  326.  
  327. }  /* ReadIni */
  328.  
  329.  
  330. /****************************** Function Header ****************************\
  331. *
  332. * ProcessMenuItem
  333. *
  334. *
  335. * Act on the corresponding Menu Item Choosen
  336. *
  337. \***************************************************************************/
  338.  
  339. VOID ProcessMenuItem( HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2 )
  340. {
  341.     TID  Tid;                               // ID of new thread; Not used
  342.  
  343.  
  344.     /* Switch on the Menu Item choosen */
  345.     switch( LOUSHORT( mp1 ) )
  346.         {
  347.         case IDMI_SHOW_ALL:
  348.         case IDMI_SHOW_APPNAMES:
  349.             usFormat = (LOUSHORT(mp1) == IDMI_SHOW_ALL);
  350.             UpdateListBox( FALSE, usFormat ? ALL_FORM : APP_FORM );
  351.             break;
  352.  
  353.         case IDM_SEARCH:
  354.             WinDlgBox(HWND_DESKTOP, hwndIniEditFrame, (PFNWP)SearchWndProc,
  355.                             (HMODULE)NULL, IDD_SEARCH, (PVOID)NULL);
  356.             break;
  357.  
  358.         case IDMI_EDIT_DELETE_KEY:
  359.             WinDlgBox(HWND_DESKTOP, hwndIniEditFrame, (PFNWP)DelKeyWndProc,
  360.                             (HMODULE)NULL, IDD_DEL_KEY, (PVOID)NULL);
  361.             UpdateListBox( TRUE, usFormat ? ALL_FORM : APP_FORM );
  362.             break;
  363.  
  364.         case IDMI_EDIT_DELETE_APP:
  365.             WinDlgBox(HWND_DESKTOP, hwndIniEditFrame, (PFNWP)DelAppWndProc,
  366.                             (HMODULE)NULL, IDD_DEL_APP, (PVOID)NULL);
  367.             UpdateListBox( TRUE, usFormat ? ALL_FORM : APP_FORM );
  368.             break;
  369.  
  370.         case IDMI_EDIT_ADD_KEY:
  371.             WinDlgBox(HWND_DESKTOP, hwndIniEditFrame, (PFNWP)AddKeyWndProc,
  372.                             (HMODULE)NULL, IDD_ADD_KEY, (PVOID)NULL);
  373.             UpdateListBox( TRUE, usFormat ? ALL_FORM : APP_FORM );
  374.             break;
  375.  
  376.         case IDMI_EDIT_CHANGE:
  377.             WinDlgBox(HWND_DESKTOP, hwndIniEditFrame, (PFNWP)ChangeKeyWndProc,
  378.                             (HMODULE)NULL, IDD_CHANGE_KEY, (PVOID)NULL);
  379.             UpdateListBox( TRUE, usFormat ? ALL_FORM : APP_FORM );
  380.             break;
  381.  
  382.         case IDMI_PRINT_ALL:
  383.         case IDMI_PRINT_APP:
  384.             usPrintFormat = LOUSHORT(mp1) == IDMI_PRINT_ALL ? ALL_FORM : APP_FORM;
  385.             if( DosCreateThread( PrintThread, &Tid, ((PBYTE)(pPrintStack)+STACK_SIZE) ) )
  386.                 ErrMessage("StartThread2: DosCreateThread Failed");
  387.             break;
  388.  
  389.         case IDMI_REFRESH:
  390.             UpdateListBox( TRUE, usFormat );
  391.             break;
  392.  
  393.         case IDMI_ABOUT:
  394.             WinDlgBox(HWND_DESKTOP, hwndIniEditFrame, (PFNWP)DelAppWndProc,
  395.                             (HMODULE)NULL, IDD_ABOUT, (PVOID)NULL);
  396.             break;
  397.  
  398.         default:
  399.             WinDefWindowProc(hwnd, msg, mp1, mp2);
  400.  
  401.             break;
  402.  
  403.         }  /* switch */
  404.  
  405. }  /* ProcessMenuItem */
  406.  
  407.  
  408. /****************************** Function Header ****************************\
  409. *
  410. * UpdateListBox
  411. *
  412. *
  413. * Update Main List Box to correct state
  414. *    May Also:
  415. *    - Check correct menu item
  416. *    - Repaint title of List Box
  417. *    - ReRead os2.ini file
  418. *
  419. \***************************************************************************/
  420.  
  421. VOID UpdateListBox( BOOL fReadIni, USHORT usNewFormat )
  422. {
  423.     INT       i,j;                          // Loop Counters
  424.     USHORT    Index;                        // Index into ListBox
  425.     static    USHORT    usLastFormat = -1;  // Last displayed format
  426.  
  427.  
  428.     /* Check the correct item if format changed */
  429.     if( usLastFormat != usNewFormat )
  430.         {
  431.         WinSendMsg( hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDMI_SHOW_ALL, TRUE),
  432.                 MPFROM2SHORT(MIA_CHECKED, usFormat ? MIA_CHECKED:FALSE));
  433.  
  434.         WinSendMsg( hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDMI_SHOW_APPNAMES, TRUE),
  435.                 MPFROM2SHORT(MIA_CHECKED, (!usFormat) ? MIA_CHECKED:FALSE));
  436.         usLastFormat = usNewFormat;
  437.  
  438.         WinSendMsg( hwndIniEdit, WM_PAINT, (MPARAM)NULL, (MPARAM)NULL );
  439.         }
  440.  
  441.  
  442.     /* Turn off list box updates */
  443.     WinEnableWindowUpdate( hwndList, FALSE );
  444.  
  445.     /* Remove all items from list box */
  446.     WinSendMsg( hwndList, LM_DELETEALL, (MPARAM)0, (MPARAM)0 );
  447.  
  448.     /* ReRead os2.ini if needed */
  449.     if( fReadIni )
  450.         ReadIni();
  451.  
  452.     /* Add elements to listbox */
  453.     if( usNewFormat == ALL_FORM )
  454.         {
  455.  
  456.         /* Insert all app Names */
  457.         for( i=0; i<cAppNames; i++ )
  458.             {
  459.             Index = (USHORT)WinSendMsg( hwndList, LM_INSERTITEM,
  460.                     MPFROM2SHORT(LIT_END, NULL),
  461.                     MPFROMP(pGroups[i].szAppName) );
  462.  
  463.             WinSendMsg( hwndList, LM_SETITEMHANDLE,
  464.                     MPFROMSHORT(Index),
  465.                     MPFROMSHORT(i) );
  466.  
  467.             /* Insert Key Value Pairs for App Name */
  468.             for( j=0; j<pGroups[i].cKeys; j++ )
  469.                 {
  470.                 sprintf( szBuf, "     %s: %s", pGroups[i].pPairs[j].szKey,
  471.                         pGroups[i].pPairs[j].szValue );
  472.                 Index = (USHORT)WinSendMsg( hwndList, LM_INSERTITEM,
  473.                         MPFROM2SHORT(LIT_END, NULL),
  474.                         MPFROMP(szBuf) );
  475.  
  476.                 WinSendMsg( hwndList, LM_SETITEMHANDLE,
  477.                         MPFROMSHORT(Index),
  478.                         MPFROM2SHORT(i,j) );
  479.  
  480.                 }
  481.             }
  482.         }  /* if */
  483.     else
  484.         {
  485.         /* Insert all app Names */
  486.         for( i=0; i<cAppNames; i++ )
  487.             {
  488.             WinSendMsg( hwndList, LM_INSERTITEM,
  489.                     MPFROM2SHORT(LIT_SORTASCENDING, NULL),
  490.                     MPFROMP(pGroups[i].szAppName) );
  491.             }
  492.         }  /* else */
  493.  
  494.     /* Do All repainting of ListBox */
  495.     WinEnableWindowUpdate( hwndList, TRUE );
  496.  
  497. }  /* UpdateListBox */
  498.  
  499.  
  500. /****************************** Function Header ****************************\
  501. *
  502. * IniEditPaint
  503. *
  504. *
  505. * Window Paint Routine
  506. *
  507. \***************************************************************************/
  508.  
  509. VOID IniEditPaint()
  510. {
  511.     RECTL     rclWindow;                    // Current size of Main Window
  512.     RECTL     rclBlit;                      // Size of Area to Blank for Title
  513.     CHAR      szShowMode[MAX_STRING_LEN];   // String Description of mode
  514.  
  515.  
  516.     /* Get the size of the whole window */
  517.     WinQueryWindowRect( hwndIniEdit, &rclWindow );
  518.  
  519.     /* Paint the window Title Area */
  520.     rclBlit = rclWindow;
  521.     rclBlit.yBottom = rclBlit.yTop - usLineHeight;
  522.  
  523.     GpiBitBlt( hpsScreen, (HPS)NULL, 2L, (PPOINTL)&rclBlit, ROP_ONE, (LONG)NULL);
  524.  
  525.     /* Write the Title */
  526.     strcpy( szShowMode, usFormat == APP_FORM ? SZAPP : SZALL );
  527.     WinDrawText( hpsScreen, strlen(szShowMode), szShowMode, &rclWindow,
  528.             CLR_BLUE, CLR_WHITE, DT_CENTER|DT_TOP);
  529.  
  530. }  /* IniEditPaint */
  531.  
  532.  
  533. /****************************** Function Header ****************************\
  534. *
  535. * IniEditWndProc
  536. *
  537. *
  538. * Window Proc for IniEdit
  539. *
  540. \***************************************************************************/
  541.  
  542. MRESULT CALLBACK IniEditWndProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  543. {
  544.  
  545.     CHAR      szBuf[MAX_STRING_LEN];        // Input character Buffer
  546.     CHAR      szBuf2[MAX_STRING_LEN];       // Second Input Character Buffer
  547.     USHORT    Index;                        // Index of Current ListBox Item
  548.     USHORT    TopIndex;                     // Current Top Item in ListBox
  549.     ULONG     Handle;                       // ListBox Item Handle Info
  550.     HWND      hwndDialog;                   // Window handle of Dailog Box
  551.     HWND      hwndText;                     // Handle of current text window
  552.     HPS       hpsPaint;                     // PS to Paint
  553.     RECTL     rclPaint;                     // Rect in hpsPaint to Paint
  554.     BOOL      fScroll = FALSE;              // Scroll List Box Flag
  555.  
  556.  
  557.     /* Switch on message being processed */
  558.     switch( msg )
  559.         {
  560.         case WM_PAINT:
  561.             /* Paint the IniEdit window portion not covered by List Box */
  562.             hpsPaint = WinBeginPaint(hwnd, (HPS)NULL, &rclPaint);
  563.             IniEditPaint();
  564.             WinEndPaint(hpsPaint);
  565.             break;
  566.  
  567.         case WM_COMMAND:
  568.             /* If menu item call Processing Routine */
  569.             if( LOUSHORT( mp2 ) == CMDSRC_MENU )
  570.                 ProcessMenuItem( hwnd, msg, mp1, mp2 );
  571.  
  572.             /* If accelorator call appropriate routine */
  573.             if( LOUSHORT( mp2 ) == CMDSRC_ACCELERATOR )
  574.                 {
  575.                 switch( LOUSHORT( mp1 ) )
  576.                     {
  577.                     case IDDI_SEARCH_NEXT:
  578.                         FindNext();
  579.                         break;
  580.                     }
  581.                 }
  582.             break;
  583.  
  584.         case WM_SIZE:
  585.             /* Put the list box in the correct location of the window */
  586.             if( hwndList != (HWND)NULL )
  587.                 WinSetWindowPos( hwndList, HWND_TOP, 0, 0,
  588.                         SHORT1FROMMP(mp2), SHORT2FROMMP(mp2)-usLineHeight, SWP_SIZE );
  589.             break;
  590.  
  591.         case WM_CONTROL:
  592.             /* Switch on Control activated */
  593.             switch( SHORT1FROMMP(mp1) )
  594.                 {
  595.  
  596.                 /*** Process List Box Activity ***/
  597.                 case IDI_LIST:
  598.                     /* was it a double click? */
  599.                     if( SHORT2FROMMP(mp1) == LN_ENTER )
  600.                         {
  601.                         /* get the item clicked on */
  602.                         Index = (USHORT)WinSendMsg( hwndList, LM_QUERYSELECTION,
  603.                                 (MPARAM)0, (MPARAM)0 );
  604.  
  605.                         /* grab its text */
  606.                         WinSendMsg( hwndList, LM_QUERYITEMTEXT,
  607.                                 MPFROM2SHORT(Index, MAX_STRING_LEN), MPFROMP(szBuf) );
  608.  
  609.                         /* if in APP form toggle to ALL form */
  610.                         if( usFormat == APP_FORM )
  611.                             {
  612.                             usFormat = ALL_FORM;
  613.                             fScroll = TRUE;
  614.                             }
  615.                         else
  616.                             {
  617.                             /* if an App name was choosen then go to APP form */
  618.                             if( szBuf[0] != ' ')
  619.                                 {
  620.                                 usFormat = APP_FORM;
  621.                                 fScroll = TRUE;
  622.                                 }
  623.                             else
  624.                                 /* A Key Value Pair was double clicked
  625.                                  * allow editing of key Value
  626.                                  */
  627.                                 {
  628.  
  629.                                 FocusWindow = (HWND)1;
  630.  
  631.                                 hwndDialog = WinLoadDlg( HWND_DESKTOP,
  632.                                     hwndIniEditFrame, ChangeKeyWndProc,
  633.                                     (HMODULE)NULL, IDD_CHANGE_KEY, NULL);
  634.  
  635.                                 Handle = (ULONG)WinSendMsg( hwndList, LM_QUERYITEMHANDLE,
  636.                                     MPFROMSHORT(Index), (MPARAM)NULL );
  637.  
  638.                                 hwndText = WinWindowFromID( hwndDialog, IDDI_CHANGE_KEY_TEXT_APP );
  639.                                 WinSetWindowText( hwndText, pGroups[LOUSHORT(Handle)].szAppName);
  640.  
  641.                                 /* note bug in PMWin GPs if full segment */
  642.                                 hwndText = WinWindowFromID( hwndDialog, IDDI_CHANGE_KEY_TEXT_KEY );
  643.                                 strcpy( szBuf2, pGroups[LOUSHORT(Handle)].pPairs[HIUSHORT(Handle)].szKey );
  644.                                 WinSetWindowText( hwndText, szBuf2 );
  645.  
  646.                                 hwndText = WinWindowFromID( hwndDialog, IDDI_CHANGE_KEY_TEXT_VAL );
  647.                                 strcpy( szBuf2, pGroups[LOUSHORT(Handle)].pPairs[HIUSHORT(Handle)].szValue );
  648.                                 WinSetWindowText( hwndText, szBuf2 );
  649.  
  650.                                 WinPostMsg( hwndText, EM_SETSEL,
  651.                                         MPFROM2SHORT(0, strlen(szBuf2)), (MPARAM)0 );
  652.  
  653.                                 if( WinProcessDlg( hwndDialog ) == IDDI_CHANGE_KEY_OK )
  654.                                     {
  655.                                     TopIndex = (USHORT)WinSendMsg( hwndList, LM_QUERYTOPINDEX,
  656.                                          (MPARAM)NULL, (MPARAM)NULL );
  657.  
  658.                                     UpdateListBox( TRUE, usFormat );
  659.  
  660.                                     /* scroll to top */
  661.                                     WinSendMsg( hwndList, LM_SETTOPINDEX,
  662.                                          MPFROMSHORT(TopIndex), (MPARAM)NULL );
  663.  
  664.                                     /* make the item selected */
  665.                                     WinSendMsg( hwndList, LM_SELECTITEM,
  666.                                             MPFROMSHORT(Index), MPFROMSHORT(TRUE) );
  667.  
  668.                                     /* make selected */
  669.                                     }
  670.  
  671.                                 WinDestroyWindow( hwndDialog );
  672.                                 }
  673.                             }
  674.  
  675.                         /* Make the double clicked item selected in new form */
  676.                         if( fScroll )
  677.                             {
  678.                             /* put in correct form */
  679.                             UpdateListBox( FALSE, usFormat );
  680.  
  681.                             /* get the index of the item clicked on */
  682.                             Index = (USHORT)WinSendMsg( hwndList, LM_SEARCHSTRING,
  683.                                     MPFROM2SHORT(LSS_SUBSTRING, LIT_FIRST),
  684.                                     MPFROMP(szBuf) );
  685.  
  686.                             /* scroll that item to the top */
  687.                             WinSendMsg( hwndList, LM_SETTOPINDEX,
  688.                                     MPFROMSHORT(Index), (MPARAM)NULL );
  689.  
  690.                             /* make the item selected */
  691.                             WinSendMsg( hwndList, LM_SELECTITEM,
  692.                                     MPFROMSHORT(Index), MPFROMSHORT(TRUE) );
  693.                             }
  694.                         }  /* if ENTER */
  695.                 }
  696.             break;
  697.  
  698.         default:
  699.             return WinDefWindowProc(hwnd, msg, mp1, mp2);
  700.             break;
  701.         }
  702.  
  703.     return 0L;
  704.  
  705. }  /* IniEditWndProc */
  706.