|
|
1.1 ! root 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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.