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