source: trunk/dll/command.c@ 911

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

Commenting, help file, history update for recent changes; Minor clean up.

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