source: trunk/dll/command.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

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