source: trunk/dll/command.c@ 618

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

Add more drag/drop error checking
Use FreeDragInfoData
Sync with NumItemsToUnhilite AcceptOneDrop GetOneDrop mods

  • 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 618 2007-04-20 19:19:03Z stevenhl $
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 19 Apr 07 SHL Sync with AcceptOneDrop GetOneDrop mods
22
23***********************************************************************/
24
25#define INCL_DOS
26#define INCL_WIN
27#include <os2.h>
28
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <ctype.h>
33#include <share.h>
34
35#include "fm3dll.h"
36#include "fm3dlg.h"
37#include "fm3str.h"
38#include "tools.h"
39
40typedef struct
41{
42 CHAR cl[1001];
43 INT flags;
44 CHAR title[34];
45}
46COMMAND;
47
48#pragma data_seg(DATA1)
49
50static PSZ pszSrcFile = __FILE__;
51
52#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
53#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
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];
566
567 *filename = 0;
568 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
569 strcat(filename, " %a");
570 WinSetDlgItemText(hwnd, CMD_CL, filename);
571 }
572 }
573 break;
574
575 case CMD_REORDER:
576 if (!cmdhead || !cmdhead->next) {
577 Runtime_Error(pszSrcFile, __LINE__, "no cmd");
578 break;
579 }
580 if (WinDlgBox(HWND_DESKTOP, hwnd, ReOrderProc, FM3ModHandle,
581 RE_FRAME, MPVOID)) {
582 WinSendDlgItemMsg(hwnd, CMD_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
583 WinSetDlgItemText(hwnd, CMD_CL, NullStr);
584 WinSetDlgItemText(hwnd, CMD_TITLE, NullStr);
585 info = cmdhead;
586 while (info) {
587 x = (SHORT) WinSendDlgItemMsg(hwnd,
588 CMD_LISTBOX,
589 LM_INSERTITEM,
590 MPFROM2SHORT(LIT_END, 0),
591 MPFROMP(info->title));
592 if (x >= 0)
593 WinSendDlgItemMsg(hwnd,
594 CMD_LISTBOX,
595 LM_SETITEMHANDLE,
596 MPFROMSHORT(x), MPFROMP(info));
597 info = info->next;
598 }
599 WinSendDlgItemMsg(hwnd,
600 CMD_LISTBOX,
601 LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
602 WinCheckButton(hwnd, CMD_DEFAULT, TRUE);
603 WinCheckButton(hwnd, CMD_PROMPT, FALSE);
604 WinCheckButton(hwnd, CMD_ONCE, FALSE);
605 save_commands();
606 }
607 break;
608
609 case DID_OK:
610 {
611 x = (SHORT) WinSendDlgItemMsg(hwnd,
612 CMD_LISTBOX,
613 LM_QUERYSELECTION, MPVOID, MPVOID);
614 if (x == LIT_NONE)
615 x = (SHORT) WinSendDlgItemMsg(hwnd,
616 CMD_LISTBOX,
617 LM_SELECTITEM,
618 MPFROMSHORT(0), MPFROMSHORT(TRUE));
619 }
620 {
621 COMMAND temp;
622
623 memset(&temp, 0, sizeof(COMMAND));
624 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
625 bstrip(temp.cl);
626 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
627 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
628 temp.flags = 0;
629 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
630 temp.flags = FULLSCREEN;
631 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
632 temp.flags = MINIMIZED;
633 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
634 temp.flags = MAXIMIZED;
635 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
636 temp.flags = INVISIBLE;
637 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
638 temp.flags |= KEEP;
639 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
640 temp.flags |= PROMPT;
641 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
642 temp.flags |= ONCE;
643 info = add_command(&temp);
644 if (!info)
645 {
646 WinDismissDlg(hwnd, 0);
647 /*saymsg(MB_ENTER, hwnd,
648 GetPString(IDS_ERRORTEXT),
649 GetPString(IDS_CANTADDCOMMANDTEXT),
650 temp.title);*/
651 }
652 else {
653 CHAR env[1002];
654
655 *env = 0;
656 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
657 bstripcr(env);
658 if (*env) {
659 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
660 }
661 x = (SHORT) WinSendDlgItemMsg(hwnd,
662 CMD_LISTBOX,
663 LM_INSERTITEM,
664 MPFROM2SHORT(LIT_END, 0),
665 MPFROMP(temp.title));
666 if (x >= 0) {
667 WinSendDlgItemMsg(hwnd,
668 CMD_LISTBOX,
669 LM_SETITEMHANDLE,
670 MPFROMSHORT(x), MPFROMP(info));
671 WinSendDlgItemMsg(hwnd,
672 CMD_LISTBOX,
673 LM_SELECTITEM,
674 MPFROMSHORT(x), MPFROMSHORT(TRUE));
675 save_commands();
676 }
677 }
678 }
679 x = (SHORT) WinSendDlgItemMsg(hwnd,
680 CMD_LISTBOX,
681 LM_QUERYSELECTION,
682 MPFROMSHORT(LIT_FIRST), MPVOID);
683 WinDismissDlg(hwnd, 0);
684 break;
685
686 case DID_CANCEL:
687 WinDismissDlg(hwnd, 0);
688 break;
689
690 case IDM_HELP:
691 if (hwndHelp)
692 WinSendMsg(hwndHelp,
693 HM_DISPLAY_HELP,
694 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
695 break;
696
697 case CMD_ADD:
698 {
699 COMMAND temp;
700
701 memset(&temp, 0, sizeof(COMMAND));
702 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
703 bstrip(temp.cl);
704 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
705 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
706 temp.flags = 0;
707 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
708 temp.flags = FULLSCREEN;
709 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
710 temp.flags = MINIMIZED;
711 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
712 temp.flags = MAXIMIZED;
713 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
714 temp.flags = INVISIBLE;
715 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
716 temp.flags |= KEEP;
717 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
718 temp.flags |= PROMPT;
719 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
720 temp.flags |= ONCE;
721 info = add_command(&temp);
722 if (!info) {
723 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
724 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
725 }
726 else {
727 CHAR env[1002];
728
729 *env = 0;
730 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
731 bstripcr(env);
732 if (*env) {
733 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
734 }
735 x = (SHORT) WinSendDlgItemMsg(hwnd,
736 CMD_LISTBOX,
737 LM_INSERTITEM,
738 MPFROM2SHORT(LIT_END, 0),
739 MPFROMP(temp.title));
740 if (x >= 0) {
741 WinSendDlgItemMsg(hwnd,
742 CMD_LISTBOX,
743 LM_SETITEMHANDLE,
744 MPFROMSHORT(x), MPFROMP(info));
745 WinSendDlgItemMsg(hwnd,
746 CMD_LISTBOX,
747 LM_SELECTITEM,
748 MPFROMSHORT(x), MPFROMSHORT(TRUE));
749 save_commands();
750 }
751 }
752 }
753 break;
754
755 case CMD_DELETE:
756 {
757 CHAR temp[34];
758
759 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
760 bstrip(temp);
761 if (!kill_command(temp))
762 Runtime_Error(pszSrcFile, __LINE__, "kill_command");
763 else {
764 x = (SHORT) WinSendDlgItemMsg(hwnd,
765 CMD_LISTBOX,
766 LM_QUERYSELECTION,
767 MPFROMSHORT(LIT_FIRST), MPVOID);
768 if (x >= 0) {
769 WinSendDlgItemMsg(hwnd,
770 CMD_LISTBOX,
771 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
772 WinSendDlgItemMsg(hwnd,
773 CMD_LISTBOX,
774 LM_SELECTITEM,
775 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
776 }
777 save_commands();
778 }
779 }
780 break;
781 case CMD_REPLACE:
782 {
783 CHAR temp[34];
784 y = (SHORT) WinSendDlgItemMsg(hwnd,
785 CMD_LISTBOX,
786 LM_QUERYSELECTION,
787 MPFROMSHORT(LIT_CURSOR), MPVOID);
788 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
789 bstrip(temp);
790 if (kill_command(temp))
791 {
792 x = (SHORT) WinSendDlgItemMsg(hwnd,
793 CMD_LISTBOX,
794 LM_QUERYSELECTION,
795 MPFROMSHORT(LIT_FIRST), MPVOID);
796 if (x >= 0) {
797 WinSendDlgItemMsg(hwnd,
798 CMD_LISTBOX,
799 LM_DELETEITEM, MPFROMSHORT(x), MPVOID);
800 WinSendDlgItemMsg(hwnd,
801 CMD_LISTBOX,
802 LM_SELECTITEM,
803 MPFROMSHORT(LIT_NONE), MPFROMSHORT(FALSE));
804 }
805 save_commands();
806 }
807 }
808 {
809 COMMAND temp;
810
811 memset(&temp, 0, sizeof(COMMAND));
812 WinQueryDlgItemText(hwnd, CMD_CL, sizeof(temp.cl), temp.cl);
813 bstrip(temp.cl);
814 WinQueryDlgItemText(hwnd, CMD_TITLE, sizeof(temp.title), temp.title);
815 if (WinQueryButtonCheckstate(hwnd, CMD_DEFAULT))
816 temp.flags = 0;
817 else if (WinQueryButtonCheckstate(hwnd, CMD_FULLSCREEN))
818 temp.flags = FULLSCREEN;
819 else if (WinQueryButtonCheckstate(hwnd, CMD_MINIMIZED))
820 temp.flags = MINIMIZED;
821 else if (WinQueryButtonCheckstate(hwnd, CMD_MAXIMIZED))
822 temp.flags = MAXIMIZED;
823 else if (WinQueryButtonCheckstate(hwnd, CMD_INVISIBLE))
824 temp.flags = INVISIBLE;
825 if (WinQueryButtonCheckstate(hwnd, CMD_KEEP))
826 temp.flags |= KEEP;
827 if (WinQueryButtonCheckstate(hwnd, CMD_PROMPT))
828 temp.flags |= PROMPT;
829 if (WinQueryButtonCheckstate(hwnd, CMD_ONCE))
830 temp.flags |= ONCE;
831 info = add_command(&temp);
832 if (!info) {
833 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT),
834 GetPString(IDS_CANTADDCOMMANDTEXT),
835 temp.title);
836 }
837 else {
838 CHAR env[1002];
839
840 *env = 0;
841 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
842 bstripcr(env);
843 if (*env) {
844 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
845 }
846 x = (SHORT) WinSendDlgItemMsg(hwnd,
847 CMD_LISTBOX,
848 LM_INSERTITEM,
849 MPFROM2SHORT(y, 0),
850 MPFROMP(temp.title));
851 if (x >= 0) {
852 WinSendDlgItemMsg(hwnd,
853 CMD_LISTBOX,
854 LM_SETITEMHANDLE,
855 MPFROMSHORT(x), MPFROMP(info));
856 WinSendDlgItemMsg(hwnd,
857 CMD_LISTBOX,
858 LM_SELECTITEM,
859 MPFROMSHORT(x), MPFROMSHORT(TRUE));
860 {
861 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
862 SHORT sSelect, numitems;
863
864 sSelect = 0;
865 numitems = (SHORT) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
866 LM_QUERYITEMCOUNT,
867 MPVOID, MPVOID);
868 while (numitems) {
869 info = (LINKCMDS *) WinSendDlgItemMsg(hwnd, CMD_LISTBOX,
870 LM_QUERYITEMHANDLE,
871 MPFROMSHORT(sSelect++),
872 MPVOID);
873 if (info) {
874 if (!temphead) {
875 temphead = info;
876 info->prev = NULL;
877 }
878 else {
879 last->next = info;
880 info->prev = last;
881 }
882 temptail = info;
883 last = info;
884 info->next = NULL;
885 }
886 numitems--;
887 }
888 }
889 save_commands();
890 }
891 }
892 }
893 break;
894 }
895 return 0;
896 }
897 return WinDefDlgProc(hwnd, msg, mp1, mp2);
898}
899
900VOID RunCommand(HWND hwnd, INT cx)
901{
902 INT x;
903 CHAR **list;
904 LINKCMDS *info;
905
906 list = BuildList(hwnd);
907 if (!list || !list[0])
908 return;
909 x = 0;
910 info = cmdhead;
911 while (info) {
912 x++;
913 if (x == cx)
914 break;
915 info = info->next;
916 }
917 if (info) {
918
919 INT flags;
920
921 x--;
922 flags = info->flags;
923 if (!(flags & FULLSCREEN))
924 flags |= WINDOWED;
925 if (flags & KEEP)
926 flags |= SEPARATEKEEP;
927 else
928 flags |= SEPARATE;
929 flags &= ~(KEEP | DIEAFTER);
930 if ((flags & ONCE) && list && list[0]) {
931
932 CHAR *fakelist[2];
933 INT cntr;
934
935 flags &= (~ONCE);
936 for (cntr = 0; list[cntr]; cntr++) {
937 *fakelist = list[cntr];
938 fakelist[1] = NULL;
939 ExecOnList(hwnd,
940 info->cl,
941 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT));
942 }
943 }
944 else
945 ExecOnList(hwnd,
946 info->cl,
947 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT));
948 }
949 FreeList(list);
950 DosPostEventSem(CompactSem);
951}
952
953VOID EditCommands(HWND hwnd)
954{
955 static CHAR stop = 0;
956
957 if (stop)
958 return;
959 stop++;
960 if (!cmdloaded)
961 load_commands();
962 WinDlgBox(HWND_DESKTOP,
963 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
964 stop = 0;
965}
Note: See TracBrowser for help on using the repository browser.