source: trunk/dll/command.c@ 574

Last change on this file since 574 was 574, checked in by Gregg Young, 18 years ago

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 23.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: command.c 574 2007-03-23 22:37:07Z gyoung $
5
6 Custom commands
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2007 Steven H. Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 06 Jun 05 SHL Drop unused code
13 14 Jul 06 SHL Use Runtime_Error
14 29 Jul 06 SHL Use xfgets_bstripcr
15 15 Aug 06 SHL Better can't add message
16 18 Sep 06 GKY Add replace command and update okay to add if changed
17 17 Feb 07 GKY Move error messages etc to string file
18 22 Mar 07 GKY Use QWL_USER
19 23 Mar 07 GKY Replace doesn't change item position
20 23 Mar 07 GKY Okay fails silently when item not changed
21
22***********************************************************************/
23
24#define INCL_DOS
25#define INCL_WIN
26#include <os2.h>
27
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31#include <ctype.h>
32#include <share.h>
33
34#include "fm3dll.h"
35#include "fm3dlg.h"
36#include "fm3str.h"
37#include "tools.h"
38
39typedef struct
40{
41 CHAR cl[1001];
42 INT flags;
43 CHAR title[34];
44}
45COMMAND;
46
47#pragma data_seg(DATA1)
48
49static PSZ pszSrcFile = __FILE__;
50
51#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
52#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
53
54MRESULT EXPENTRY CommandTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
55{
56 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
57 static BOOL emphasized = FALSE;
58
59 switch (msg) {
60 case DM_DRAGOVER:
61 if (!emphasized) {
62 emphasized = TRUE;
63 DrawTargetEmphasis(hwnd, emphasized);
64 }
65 if (AcceptOneDrop(mp1, mp2))
66 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
67 return MRFROM2SHORT(DOR_NEVERDROP, 0);
68
69 case DM_DRAGLEAVE:
70 if (emphasized) {
71 emphasized = FALSE;
72 DrawTargetEmphasis(hwnd, emphasized);
73 }
74 break;
75
76 case DM_DROPHELP:
77 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DROPCMDHELPTEXT));
78 return 0;
79
80 case DM_DROP:
81 {
82 char szFrom[CCHMAXPATH + 5];
83
84 if (emphasized) {
85 emphasized = FALSE;
86 DrawTargetEmphasis(hwnd, emphasized);
87 }
88 if (GetOneDrop(mp1, mp2, szFrom, CCHMAXPATH)) {
89 strcat(szFrom, " %a");
90 WinSetWindowText(hwnd, szFrom);
91 }
92 }
93 return 0;
94 }
95 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
96 WinDefWindowProc(hwnd, msg, mp1, mp2);
97}
98
99MRESULT EXPENTRY ReOrderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
100{
101 switch (msg) {
102 case WM_INITDLG:
103 if (!cmdhead) {
104 WinDismissDlg(hwnd, 0);
105 break;
106 }
107 {
108 LINKCMDS *info;
109 SHORT x;
110
111 info = cmdhead;
112 while (info) {
113 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_INSERTITEM,
114 MPFROMSHORT(LIT_END),
115 MPFROMP(info->title));
116 if (x < 0) {
117 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
118 WinDismissDlg(hwnd, 0);
119 }
120 else {
121 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SETITEMHANDLE,
122 MPFROMSHORT(x), MPFROMP(info));
123 }
124 info = info->next;
125 }
126 }
127 break;
128
129 case WM_CONTROL:
130 return 0;
131
132 case WM_COMMAND:
133 switch (SHORT1FROMMP(mp1)) {
134 case DID_CANCEL:
135 WinDismissDlg(hwnd, 0);
136 break;
137
138 case DID_OK:
139 {
140 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
141 SHORT sSelect, numitems;
142
143 sSelect = 0;
144 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
145 LM_QUERYITEMCOUNT,
146 MPVOID, MPVOID);
147 while (numitems) {
148 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
149 LM_QUERYITEMHANDLE,
150 MPFROMSHORT(sSelect++),
151 MPVOID);
152 if (info) {
153 if (!temphead) {
154 temphead = info;
155 info->prev = NULL;
156 }
157 else {
158 last->next = info;
159 info->prev = last;
160 }
161 temptail = info;
162 last = info;
163 info->next = NULL;
164 }
165 numitems--;
166 }
167 sSelect = 0;
168 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
169 LM_QUERYITEMCOUNT,
170 MPVOID, MPVOID);
171 while (numitems) {
172 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
173 LM_QUERYITEMHANDLE,
174 MPFROMSHORT(sSelect++),
175 MPVOID);
176 if (info) {
177 if (!temphead) {
178 temphead = info;
179 info->prev = NULL;
180 }
181 else {
182 last->next = info;
183 info->prev = last;
184 }
185 temptail = info;
186 last = info;
187 info->next = NULL;
188 }
189 numitems--;
190 }
191 cmdhead = temphead;
192 cmdtail = temptail;
193 }
194 WinDismissDlg(hwnd, 1);
195 break;
196
197 case IDM_HELP:
198 if (hwndHelp)
199 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
200 MPFROM2SHORT(HELP_REORDERCOMMANDS, 0),
201 MPFROMSHORT(HM_RESOURCEID));
202 break;
203
204 case RE_ADD:
205 {
206 SHORT sSelect, x;
207 LINKCMDS *info;
208
209 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
210 LM_QUERYSELECTION,
211 MPFROMSHORT(LIT_FIRST), MPVOID);
212 while (sSelect >= 0) {
213 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
214 LM_QUERYITEMHANDLE,
215 MPFROMSHORT(sSelect), MPVOID);
216 if (info) {
217 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
218 LM_INSERTITEM,
219 MPFROM2SHORT(LIT_END, 0),
220 MPFROMP(info->title));
221 if (x >= 0) {
222 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
223 LM_SETITEMHANDLE,
224 MPFROMSHORT(x), MPFROMP(info));
225 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_DELETEITEM,
226 MPFROMSHORT(sSelect), MPVOID);
227 }
228 }
229 else
230 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SELECTITEM,
231 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
232 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
233 LM_QUERYSELECTION,
234 MPFROMSHORT(LIT_FIRST),
235 MPVOID);
236 }
237 }
238 break;
239
240 case RE_REMOVE:
241 {
242 SHORT sSelect, x;
243 LINKCMDS *info;
244
245 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
246 LM_QUERYSELECTION,
247 MPFROMSHORT(LIT_FIRST), MPVOID);
248 while (sSelect >= 0) {
249 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
250 LM_QUERYITEMHANDLE,
251 MPFROMSHORT(sSelect), MPVOID);
252 if (info) {
253 x = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
254 LM_INSERTITEM,
255 MPFROM2SHORT(LIT_END, 0),
256 MPFROMP(info->title));
257 if (x >= 0) {
258 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
259 LM_SETITEMHANDLE,
260 MPFROMSHORT(x), MPFROMP(info));
261 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_DELETEITEM,
262 MPFROMSHORT(sSelect), MPVOID);
263 }
264 }
265 else
266 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_SELECTITEM,
267 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
268 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
269 LM_QUERYSELECTION,
270 MPFROMSHORT(LIT_FIRST),
271 MPVOID);
272 }
273 }
274 break;
275 }
276 return 0;
277 }
278 return WinDefDlgProc(hwnd, msg, mp1, mp2);
279}
280
281CHAR *command_title(INT cx)
282{
283 static CHAR duh[] = "???";
284 LINKCMDS *info;
285 INT x = 0;
286
287 if (!cmdloaded)
288 load_commands();
289 info = cmdhead;
290 while (info) {
291 if (x == cx)
292 return info->title;
293 info = info->next;
294 }
295 return duh;
296}
297
298VOID free_commands(VOID)
299{
300 LINKCMDS *info, *next;
301
302 info = cmdhead;
303 while (info) {
304 next = info->next;
305 free(info->title);
306 free(info->cl);
307 free(info);
308 info = next;
309 }
310 cmdhead = cmdtail = NULL;
311}
312
313VOID load_commands(VOID)
314{
315 FILE *fp;
316 LINKCMDS *info;
317 CHAR cl[1024];
318 CHAR title[100];
319 CHAR flags[72];
320
321 if (cmdhead)
322 free_commands();
323 cmdloaded = TRUE;
324 save_dir2(cl);
325 if (cl[strlen(cl) - 1] != '\\')
326 strcat(cl, "\\");
327 strcat(cl, "COMMANDS.DAT");
328 fp = _fsopen(cl, "r", SH_DENYWR);
329 if (fp) {
330 while (!feof(fp)) {
331 if (!xfgets_bstripcr(title, sizeof(title), fp, pszSrcFile, __LINE__))
332 break;
333 title[34] = 0; // fixme to know why chopped this way?
334 bstripcr(title);
335 if (!*title || *title == ';')
336 continue;
337 if (!xfgets(cl, sizeof(cl), fp, pszSrcFile, __LINE__))
338 break; /* error! */
339 if (!xfgets(flags, 72, fp, pszSrcFile, __LINE__))
340 break; /* error! */
341 cl[1000] = 0; // fixme to know why chopped this way?
342 bstripcr(cl);
343 flags[34] = 0;
344 bstripcr(flags);
345 if (!*cl)
346 continue;
347 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
348 if (info) {
349 info->cl = xstrdup(cl, pszSrcFile, __LINE__);
350 info->title = xstrdup(title, pszSrcFile, __LINE__);
351 info->flags = atol(flags);
352 if (!info->cl || !info->title) {
353 if (info->cl)
354 free(info->cl);
355 if (info->title)
356 free(info->title);
357 free(info);
358 break;
359 }
360 if (!cmdhead)
361 cmdhead = info;
362 else {
363 cmdtail->next = info;
364 info->prev = cmdtail;
365 }
366 cmdtail = info;
367 }
368 }
369 fclose(fp);
370 }
371}
372
373VOID save_commands(VOID)
374{
375 LINKCMDS *info;
376 FILE *fp;
377 CHAR s[CCHMAXPATH + 14];
378
379 if (!cmdloaded || !cmdhead)
380 return;
381 info = cmdhead;
382 save_dir2(s);
383 if (s[strlen(s) - 1] != '\\')
384 strcat(s, "\\");
385 strcat(s, "COMMANDS.DAT");
386 fp = xfopen(s, "w", pszSrcFile, __LINE__);
387 if (fp) {
388 fputs(GetPString(IDS_COMMANDFILETEXT), fp);
389 info = cmdhead;
390 while (info) {
391 fprintf(fp,
392 ";\n%0.34s\n%0.1000s\n%lu\n",
393 info->title, info->cl, info->flags);
394 info = info->next;
395 }
396 fclose(fp);
397 }
398}
399
400//== add_command() Add command to list ==
401
402LINKCMDS *add_command(COMMAND * addme)
403{
404 LINKCMDS *info;
405
406 if (!addme || !*addme->cl || !*addme->title)
407 return NULL; // No data
408 info = cmdhead;
409 while (info) {
410 if (!stricmp(info->title, addme->title))
411 return NULL; // Got a dup
412 info = info->next;
413 }
414 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
415 if (!info)
416 return NULL;
417 info->cl = xstrdup(addme->cl, pszSrcFile, __LINE__);
418 info->title = xstrdup(addme->title, pszSrcFile, __LINE__);
419 if (addme->flags)
420 info->flags = addme->flags;
421 if (!info->cl || !info->title) {
422 xfree(info->cl);
423 xfree(info->title);
424 free(info);
425 return NULL;
426 }
427 if (!cmdhead) /* only item in list */
428 cmdhead = cmdtail = info;
429 else {
430 /* place at tail */
431 cmdtail->next = info;
432 info->prev = cmdtail;
433 cmdtail = info;
434 }
435 return info;
436}
437
438BOOL kill_command(CHAR * killme)
439{
440 LINKCMDS *info;
441
442 if (killme && *killme) {
443 info = cmdhead;
444 while (info) {
445 if (!stricmp(info->title, killme)) {
446 if (info == cmdhead) {
447 cmdhead = info->next;
448 if (info == cmdtail)
449 cmdtail = info->prev;
450 }
451 else {
452 if (info->next)
453 (info->next)->prev = info->prev;
454 if (info->prev)
455 (info->prev)->next = info->next;
456 if (info == cmdtail)
457 cmdtail = info->prev;
458 }
459 free(info->cl);
460 free(info->title);
461 free(info);
462 return TRUE;
463 }
464 info = info->next;
465 }
466 }
467 return FALSE;
468}
469
470MRESULT EXPENTRY CommandDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
471{
472 SHORT x, y;
473 LINKCMDS *info;
474
475 switch (msg) {
476 case WM_INITDLG:
477 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
478 WinSendDlgItemMsg(hwnd, CMD_CL, EM_SETTEXTLIMIT,
479 MPFROM2SHORT(1000, 0), MPVOID);
480 WinSendDlgItemMsg(hwnd, CMD_TITLE, EM_SETTEXTLIMIT,
481 MPFROM2SHORT(33, 0), MPVOID);
482 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
483 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
484 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
485 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
486 WinCheckButton(hwnd, CMD_ONCE, FALSE);
487 info = cmdhead;
488 while (info) {
489 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_INSERTITEM,
490 MPFROM2SHORT(LIT_END, 0),
491 MPFROMP(info->title));
492 if (x >= 0)
493 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SETITEMHANDLE,
494 MPFROMSHORT(x), MPFROMP(info));
495 info = info->next;
496 }
497 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_SELECTITEM,
498 MPFROMSHORT(0), MPFROMSHORT(TRUE));
499 {
500 PFNWP oldproc;
501
502 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, CMD_CL),
503 (PFNWP) CommandTextProc);
504 if (oldproc)
505 WinSetWindowPtr(WinWindowFromID(hwnd, CMD_CL), QWL_USER, (PVOID) oldproc);
506 }
507 break;
508
509 case WM_CONTROL:
510 if (SHORT1FROMMP(mp1) == CMD_LISTBOX) {
511 switch (SHORT2FROMMP(mp1)) {
512 case LN_ENTER:
513 case LN_SELECT:
514 x = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
515 LM_QUERYSELECTION,
516 MPFROMSHORT(LIT_FIRST), MPVOID);
517 if (x >= 0) {
518 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
519 LM_QUERYITEMHANDLE,
520 MPFROMSHORT(x), MPVOID);
521 if (!info) {
522 Runtime_Error(pszSrcFile, __LINE__, "LM_QUERYITEMHANDLE");
523 break;
524 }
525 WinSetDlgItemText(hwnd, CMD_CL, info->cl);
526 if (!(info->flags & 1023))
527 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
528 else {
529 if (info->flags & FULLSCREEN)
530 WinCheckButton(hwnd, CMD_FULLSCREEN, TRUE);
531 else if (info->flags & MINIMIZED)
532 WinCheckButton(hwnd, CMD_MINIMIZED, TRUE);
533 else if (info->flags & MAXIMIZED)
534 WinCheckButton(hwnd, CMD_MAXIMIZED, TRUE);
535 else if (info->flags & INVISIBLE)
536 WinCheckButton(hwnd, CMD_INVISIBLE, TRUE);
537 }
538 WinCheckButton(hwnd, CMD_PROMPT, ((info->flags & PROMPT) != 0));
539 WinCheckButton(hwnd, CMD_KEEP, ((info->flags & KEEP) != 0));
540 WinCheckButton(hwnd, CMD_ONCE, ((info->flags & ONCE) != 0));
541 WinSetDlgItemText(hwnd, CMD_TITLE, info->title);
542 {
543 CHAR env[1002];
544 ULONG size;
545
546 *env = 0;
547 size = sizeof(env) - 1;
548 if (PrfQueryProfileData(fmprof, FM3Str, info->cl, env, &size) &&
549 *env)
550 WinSetDlgItemText(hwnd, CMD_ENVIRON, env);
551 else
552 WinSetDlgItemText(hwnd, CMD_ENVIRON, NullStr);
553 }
554 }
555 break;
556 }
557 }
558 return 0;
559
560 case WM_COMMAND:
561 switch (SHORT1FROMMP(mp1)) {
562 case CMD_FIND:
563 {
564 CHAR filename[CCHMAXPATH + 9];
565
566 *filename = 0;
567 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
568 strcat(filename, " %a");
569 WinSetDlgItemText(hwnd, CMD_CL, filename);
570 }
571 }
572 break;
573
574 case CMD_REORDER:
575 if (!cmdhead || !cmdhead->next) {
576 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
577 break;
578 }
579 if (WinDlgBox(HWND_DESKTOP, hwnd, ReOrderProc, FM3ModHandle,
580 RE_FRAME, MPVOID)) {
581 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
582 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
583 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
584 info = cmdhead;
585 while (info) {
586 x = (SHORT) WinSendDlgItemMsg(hwnd,
587 CMD_LISTBOX,
588 LM_INSERTITEM,
589 MPFROM2SHORT(LIT_END, 0),
590 MPFROMP(info->title));
591 if (x >= 0)
592 WinSendDlgItemMsg(hwnd,
593 CMD_LISTBOX,
594 LM_SETITEMHANDLE,
595 MPFROMSHORT(x), MPFROMP(info));
596 info = info->next;
597 }
598 WinSendDlgItemMsg(hwnd,
599 CMD_LISTBOX,
600 LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
601 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
602 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
603 WinCheckButton(hwnd, CMD_ONCE, FALSE);
604 save_commands();
605 }
606 break;
607
608 case DID_OK:
609 {
610 x = (SHORT) WinSendDlgItemMsg(hwnd,
611 CMD_LISTBOX,
612 LM_QUERYSELECTION, MPVOID, MPVOID);
613 if (x == LIT_NONE)
614 x = (SHORT) WinSendDlgItemMsg(hwnd,
615 CMD_LISTBOX,
616 LM_SELECTITEM,
617 MPFROMSHORT(0), MPFROMSHORT(TRUE));
618 }
619 {
620 COMMAND temp;
621
622 memset(&temp, 0, sizeof(COMMAND));
623 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
624 bstrip(temp.cl);
625 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
626 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
627 temp.flags = 0;
628 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
629 temp.flags = FULLSCREEN;
630 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
631 temp.flags = MINIMIZED;
632 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
633 temp.flags = MAXIMIZED;
634 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
635 temp.flags = INVISIBLE;
636 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
637 temp.flags |= KEEP;
638 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
639 temp.flags |= PROMPT;
640 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
641 temp.flags |= ONCE;
642 info = add_command(&temp);
643 if (!info)
644 {
645 WinDismissDlg(hwnd, 0);
646 /*saymsg(MB_ENTER, hwnd,
647 GetPString(IDS_ERRORTEXT),
648 GetPString(IDS_CANTADDCOMMANDTEXT),
649 temp.title);*/
650 }
651 else {
652 CHAR env[1002];
653
654 *env = 0;
655 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
656 bstripcr(env);
657 if (*env) {
658 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
659 }
660 x = (SHORT) WinSendDlgItemMsg(hwnd,
661 CMD_LISTBOX,
662 LM_INSERTITEM,
663 MPFROM2SHORT(LIT_END, 0),
664 MPFROMP(temp.title));
665 if (x >= 0) {
666 WinSendDlgItemMsg(hwnd,
667 CMD_LISTBOX,
668 LM_SETITEMHANDLE,
669 MPFROMSHORT(x), MPFROMP(info));
670 WinSendDlgItemMsg(hwnd,
671 CMD_LISTBOX,
672 LM_SELECTITEM,
673 MPFROMSHORT(x), MPFROMSHORT(TRUE));
674 save_commands();
675 }
676 }
677 }
678 x = (SHORT) WinSendDlgItemMsg(hwnd,
679 CMD_LISTBOX,
680 LM_QUERYSELECTION,
681 MPFROMSHORT(LIT_FIRST), MPVOID);
682 WinDismissDlg(hwnd, 0);
683 break;
684
685 case DID_CANCEL:
686 WinDismissDlg(hwnd, 0);
687 break;
688
689 case IDM_HELP:
690 if (hwndHelp)
691 WinSendMsg(hwndHelp,
692 HM_DISPLAY_HELP,
693 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
694 break;
695
696 case CMD_ADD:
697 {
698 COMMAND temp;
699
700 memset(&temp, 0, sizeof(COMMAND));
701 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
702 bstrip(temp.cl);
703 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
704 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
705 temp.flags = 0;
706 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
707 temp.flags = FULLSCREEN;
708 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
709 temp.flags = MINIMIZED;
710 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
711 temp.flags = MAXIMIZED;
712 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
713 temp.flags = INVISIBLE;
714 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
715 temp.flags |= KEEP;
716 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
717 temp.flags |= PROMPT;
718 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
719 temp.flags |= ONCE;
720 info = add_command(&temp);
721 if (!info) {
722 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
723 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
724 }
725 else {
726 CHAR env[1002];
727
728 *env = 0;
729 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
730 bstripcr(env);
731 if (*env) {
732 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
733 }
734 x = (SHORT) WinSendDlgItemMsg(hwnd,
735 CMD_LISTBOX,
736 LM_INSERTITEM,
737 MPFROM2SHORT(LIT_END, 0),
738 MPFROMP(temp.title));
739 if (x >= 0) {
740 WinSendDlgItemMsg(hwnd,
741 CMD_LISTBOX,
742 LM_SETITEMHANDLE,
743 MPFROMSHORT(x), MPFROMP(info));
744 WinSendDlgItemMsg(hwnd,
745 CMD_LISTBOX,
746 LM_SELECTITEM,
747 MPFROMSHORT(x), MPFROMSHORT(TRUE));
748 save_commands();
749 }
750 }
751 }
752 break;
753
754 case CMD_DELETE:
755 {
756 CHAR temp[34];
757
758 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
759 bstrip(temp);
760 if (!kill_command(temp))
761 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
762 else {
763 x = (SHORT) WinSendDlgItemMsg(hwnd,
764 CMD_LISTBOX,
765 LM_QUERYSELECTION,
766 MPFROMSHORT(LIT_FIRST), MPVOID);
767 if (x >= 0) {
768 WinSendDlgItemMsg(hwnd,
769 CMD_LISTBOX,
770 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
771 WinSendDlgItemMsg(hwnd,
772 CMD_LISTBOX,
773 LM_SELECTITEM,
774 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
775 }
776 save_commands();
777 }
778 }
779 break;
780 case CMD_REPLACE:
781 {
782 CHAR temp[34];
783 y = (SHORT) WinSendDlgItemMsg(hwnd,
784 CMD_LISTBOX,
785 LM_QUERYSELECTION,
786 MPFROMSHORT(LIT_CURSOR), MPVOID);
787 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
788 bstrip(temp);
789 if (kill_command(temp))
790 {
791 x = (SHORT) WinSendDlgItemMsg(hwnd,
792 CMD_LISTBOX,
793 LM_QUERYSELECTION,
794 MPFROMSHORT(LIT_FIRST), MPVOID);
795 if (x >= 0) {
796 WinSendDlgItemMsg(hwnd,
797 CMD_LISTBOX,
798 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
799 WinSendDlgItemMsg(hwnd,
800 CMD_LISTBOX,
801 LM_SELECTITEM,
802 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
803 }
804 save_commands();
805 }
806 }
807 {
808 COMMAND temp;
809
810 memset(&temp, 0, sizeof(COMMAND));
811 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
812 bstrip(temp.cl);
813 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
814 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
815 temp.flags = 0;
816 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
817 temp.flags = FULLSCREEN;
818 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
819 temp.flags = MINIMIZED;
820 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
821 temp.flags = MAXIMIZED;
822 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
823 temp.flags = INVISIBLE;
824 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
825 temp.flags |= KEEP;
826 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
827 temp.flags |= PROMPT;
828 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
829 temp.flags |= ONCE;
830 info = add_command(&temp);
831 if (!info) {
832 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
833 GetPString(IDS_CANTADDCOMMANDTEXT),
834 temp.title);
835 }
836 else {
837 CHAR env[1002];
838
839 *env = 0;
840 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
841 bstripcr(env);
842 if (*env) {
843 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
844 }
845 x = (SHORT) WinSendDlgItemMsg(hwnd,
846 CMD_LISTBOX,
847 LM_INSERTITEM,
848 MPFROM2SHORT(y, 0),
849 MPFROMP(temp.title));
850 if (x >= 0) {
851 WinSendDlgItemMsg(hwnd,
852 CMD_LISTBOX,
853 LM_SETITEMHANDLE,
854 MPFROMSHORT(x), MPFROMP(info));
855 WinSendDlgItemMsg(hwnd,
856 CMD_LISTBOX,
857 LM_SELECTITEM,
858 MPFROMSHORT(x), MPFROMSHORT(TRUE));
859 {
860 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
861 SHORT sSelect, numitems;
862
863 sSelect = 0;
864 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
865 LM_QUERYITEMCOUNT,
866 MPVOID, MPVOID);
867 while (numitems) {
868 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
869 LM_QUERYITEMHANDLE,
870 MPFROMSHORT(sSelect++),
871 MPVOID);
872 if (info) {
873 if (!temphead) {
874 temphead = info;
875 info->prev = NULL;
876 }
877 else {
878 last->next = info;
879 info->prev = last;
880 }
881 temptail = info;
882 last = info;
883 info->next = NULL;
884 }
885 numitems--;
886 }
887 }
888 save_commands();
889 }
890 }
891 }
892 break;
893 }
894 return 0;
895 }
896 return WinDefDlgProc(hwnd, msg, mp1, mp2);
897}
898
899VOID RunCommand(HWND hwnd, INT cx)
900{
901 INT x;
902 CHAR **list;
903 LINKCMDS *info;
904
905 list = BuildList(hwnd);
906 if (!list || !list[0])
907 return;
908 x = 0;
909 info = cmdhead;
910 while (info) {
911 x++;
912 if (x == cx)
913 break;
914 info = info->next;
915 }
916 if (info) {
917
918 INT flags;
919
920 x--;
921 flags = info->flags;
922 if (!(flags & FULLSCREEN))
923 flags |= WINDOWED;
924 if (flags & KEEP)
925 flags |= SEPARATEKEEP;
926 else
927 flags |= SEPARATE;
928 flags &= ~(KEEP | DIEAFTER);
929 if ((flags & ONCE) && list && list[0]) {
930
931 CHAR *fakelist[2];
932 INT cntr;
933
934 flags &= (~ONCE);
935 for (cntr = 0; list[cntr]; cntr++) {
936 *fakelist = list[cntr];
937 fakelist[1] = NULL;
938 ExecOnList(hwnd,
939 info->cl,
940 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT));
941 }
942 }
943 else
944 ExecOnList(hwnd,
945 info->cl,
946 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT));
947 }
948 FreeList(list);
949 DosPostEventSem(CompactSem);
950}
951
952VOID EditCommands(HWND hwnd)
953{
954 static CHAR stop = 0;
955
956 if (stop)
957 return;
958 stop++;
959 if (!cmdloaded)
960 load_commands();
961 WinDlgBox(HWND_DESKTOP,
962 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
963 stop = 0;
964}
Note: See TracBrowser for help on using the repository browser.