|
|
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.