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
RevLine 
[123]1
2/***********************************************************************
3
4 $Id: command.c 618 2007-04-20 19:19:03Z stevenhl $
5
[347]6 Custom commands
7
[123]8 Copyright (c) 1993-98 M. Kimes
[552]9 Copyright (c) 2004, 2007 Steven H. Levine
[123]10
[204]11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 06 Jun 05 SHL Drop unused code
[347]13 14 Jul 06 SHL Use Runtime_Error
[406]14 29 Jul 06 SHL Use xfgets_bstripcr
[445]15 15 Aug 06 SHL Better can't add message
[507]16 18 Sep 06 GKY Add replace command and update okay to add if changed
[552]17 17 Feb 07 GKY Move error messages etc to string file
[574]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
[618]21 19 Apr 07 SHL Sync with AcceptOneDrop GetOneDrop mods
[123]22
23***********************************************************************/
24
[2]25#define INCL_DOS
26#define INCL_WIN
[347]27#include <os2.h>
[2]28
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <ctype.h>
33#include <share.h>
[347]34
[2]35#include "fm3dll.h"
36#include "fm3dlg.h"
37#include "fm3str.h"
38#include "tools.h"
39
[551]40typedef struct
41{
42 CHAR cl[1001];
43 INT flags;
44 CHAR title[34];
45}
46COMMAND;
[2]47
48#pragma data_seg(DATA1)
[347]49
50static PSZ pszSrcFile = __FILE__;
51
[2]52#pragma alloc_text(COMMAND,command_title,free_commands,add_command,kill_command)
53#pragma alloc_text(COMMAND,CommandDlgProc,EditCommands,ReOrderProc,CommandTextProc)
54
[551]55MRESULT EXPENTRY CommandTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[347]56{
[574]57 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]58 static BOOL emphasized = FALSE;
59
[551]60 switch (msg) {
61 case DM_DRAGOVER:
62 if (!emphasized) {
63 emphasized = TRUE;
64 DrawTargetEmphasis(hwnd, emphasized);
65 }
[618]66 if (AcceptOneDrop(hwnd, mp1, mp2))
[551]67 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
68 return MRFROM2SHORT(DOR_NEVERDROP, 0);
[2]69
[551]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) {
[445]86 emphasized = FALSE;
[551]87 DrawTargetEmphasis(hwnd, emphasized);
[2]88 }
[618]89 if (GetOneDrop(hwnd, mp1, mp2, szFrom, CCHMAXPATH)) {
[551]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);
[2]106 break;
[551]107 }
108 {
109 LINKCMDS *info;
110 SHORT x;
[2]111
[551]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);
[445]120 }
[551]121 else {
122 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SETITEMHANDLE,
123 MPFROMSHORT(x), MPFROMP(info));
[445]124 }
[551]125 info = info->next;
[2]126 }
[551]127 }
128 break;
[2]129
[551]130 case WM_CONTROL:
131 return 0;
[2]132
[551]133 case WM_COMMAND:
134 switch (SHORT1FROMMP(mp1)) {
135 case DID_CANCEL:
136 WinDismissDlg(hwnd, 0);
137 break;
138
139 case DID_OK:
[2]140 {
[551]141 LINKCMDS *temphead = NULL, *info, *last = NULL, *temptail = NULL;
142 SHORT sSelect, numitems;
[2]143
[551]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;
[347]165 }
[551]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;
[347]189 }
[551]190 numitems--;
[445]191 }
[551]192 cmdhead = temphead;
193 cmdtail = temptail;
[2]194 }
[551]195 WinDismissDlg(hwnd, 1);
[2]196 break;
197
[551]198 case IDM_HELP:
199 if (hwndHelp)
200 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
201 MPFROM2SHORT(HELP_REORDERCOMMANDS, 0),
202 MPFROMSHORT(HM_RESOURCEID));
203 break;
[2]204
[551]205 case RE_ADD:
206 {
207 SHORT sSelect, x;
208 LINKCMDS *info;
[2]209
[551]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);
[445]228 }
229 }
[551]230 else
231 WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX, LM_SELECTITEM,
232 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
233 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
[445]234 LM_QUERYSELECTION,
235 MPFROMSHORT(LIT_FIRST),
236 MPVOID);
[551]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);
[445]264 }
265 }
[551]266 else
267 WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX, LM_SELECTITEM,
268 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
269 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
[445]270 LM_QUERYSELECTION,
271 MPFROMSHORT(LIT_FIRST),
272 MPVOID);
[551]273 }
[2]274 }
[551]275 break;
276 }
277 return 0;
[2]278 }
[551]279 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]280}
281
[551]282CHAR *command_title(INT cx)
[347]283{
[551]284 static CHAR duh[] = "???";
285 LINKCMDS *info;
286 INT x = 0;
[2]287
[551]288 if (!cmdloaded)
[2]289 load_commands();
290 info = cmdhead;
[551]291 while (info) {
292 if (x == cx)
[2]293 return info->title;
294 info = info->next;
295 }
296 return duh;
297}
298
[551]299VOID free_commands(VOID)
[347]300{
[551]301 LINKCMDS *info, *next;
[2]302
303 info = cmdhead;
[551]304 while (info) {
[2]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
[551]314VOID load_commands(VOID)
[347]315{
[551]316 FILE *fp;
[2]317 LINKCMDS *info;
[551]318 CHAR cl[1024];
319 CHAR title[100];
320 CHAR flags[72];
[2]321
[551]322 if (cmdhead)
[2]323 free_commands();
324 cmdloaded = TRUE;
325 save_dir2(cl);
[551]326 if (cl[strlen(cl) - 1] != '\\')
327 strcat(cl, "\\");
328 strcat(cl, "COMMANDS.DAT");
329 fp = _fsopen(cl, "r", SH_DENYWR);
330 if (fp) {
[406]331 while (!feof(fp)) {
[551]332 if (!xfgets_bstripcr(title, sizeof(title), fp, pszSrcFile, __LINE__))
[445]333 break;
[406]334 title[34] = 0; // fixme to know why chopped this way?
[123]335 bstripcr(title);
[406]336 if (!*title || *title == ';')
[445]337 continue;
[551]338 if (!xfgets(cl, sizeof(cl), fp, pszSrcFile, __LINE__))
339 break; /* error! */
340 if (!xfgets(flags, 72, fp, pszSrcFile, __LINE__))
341 break; /* error! */
[406]342 cl[1000] = 0; // fixme to know why chopped this way?
343 bstripcr(cl);
[2]344 flags[34] = 0;
[123]345 bstripcr(flags);
[551]346 if (!*cl)
[445]347 continue;
[551]348 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
[406]349 if (info) {
[551]350 info->cl = xstrdup(cl, pszSrcFile, __LINE__);
351 info->title = xstrdup(title, pszSrcFile, __LINE__);
[445]352 info->flags = atol(flags);
[551]353 if (!info->cl || !info->title) {
354 if (info->cl)
[445]355 free(info->cl);
[551]356 if (info->title)
[445]357 free(info->title);
358 free(info);
359 break;
360 }
[551]361 if (!cmdhead)
[445]362 cmdhead = info;
363 else {
364 cmdtail->next = info;
365 info->prev = cmdtail;
366 }
367 cmdtail = info;
[2]368 }
369 }
370 fclose(fp);
371 }
372}
373
[551]374VOID save_commands(VOID)
[347]375{
[2]376 LINKCMDS *info;
[551]377 FILE *fp;
378 CHAR s[CCHMAXPATH + 14];
[2]379
[551]380 if (!cmdloaded || !cmdhead)
[2]381 return;
382 info = cmdhead;
383 save_dir2(s);
[551]384 if (s[strlen(s) - 1] != '\\')
385 strcat(s, "\\");
386 strcat(s, "COMMANDS.DAT");
387 fp = xfopen(s, "w", pszSrcFile, __LINE__);
[347]388 if (fp) {
[551]389 fputs(GetPString(IDS_COMMANDFILETEXT), fp);
[2]390 info = cmdhead;
[551]391 while (info) {
[2]392 fprintf(fp,
[445]393 ";\n%0.34s\n%0.1000s\n%lu\n",
[551]394 info->title, info->cl, info->flags);
[2]395 info = info->next;
396 }
397 fclose(fp);
398 }
399}
400
[445]401//== add_command() Add command to list ==
402
[551]403LINKCMDS *add_command(COMMAND * addme)
[347]404{
[2]405 LINKCMDS *info;
406
[445]407 if (!addme || !*addme->cl || !*addme->title)
[551]408 return NULL; // No data
[445]409 info = cmdhead;
410 while (info) {
[551]411 if (!stricmp(info->title, addme->title))
412 return NULL; // Got a dup
[445]413 info = info->next;
[2]414 }
[551]415 info = xmallocz(sizeof(LINKCMDS), pszSrcFile, __LINE__);
[445]416 if (!info)
417 return NULL;
[551]418 info->cl = xstrdup(addme->cl, pszSrcFile, __LINE__);
419 info->title = xstrdup(addme->title, pszSrcFile, __LINE__);
[445]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;
[2]437}
438
[551]439BOOL kill_command(CHAR * killme)
[347]440{
[2]441 LINKCMDS *info;
442
[551]443 if (killme && *killme) {
[2]444 info = cmdhead;
[551]445 while (info) {
446 if (!stricmp(info->title, killme)) {
447 if (info == cmdhead) {
[445]448 cmdhead = info->next;
[551]449 if (info == cmdtail)
[445]450 cmdtail = info->prev;
451 }
452 else {
[551]453 if (info->next)
[445]454 (info->next)->prev = info->prev;
[551]455 if (info->prev)
[445]456 (info->prev)->next = info->next;
[551]457 if (info == cmdtail)
[445]458 cmdtail = info->prev;
459 }
460 free(info->cl);
461 free(info->title);
462 free(info);
463 return TRUE;
[2]464 }
465 info = info->next;
466 }
467 }
468 return FALSE;
469}
470
[551]471MRESULT EXPENTRY CommandDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[347]472{
[574]473 SHORT x, y;
[2]474 LINKCMDS *info;
475
[551]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)
[574]506 WinSetWindowPtr(WinWindowFromID(hwnd, CMD_CL), QWL_USER, (PVOID) oldproc);
[551]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;
[2]557 }
[551]558 }
559 return 0;
560
561 case WM_COMMAND:
562 switch (SHORT1FROMMP(mp1)) {
563 case CMD_FIND:
[2]564 {
[551]565 CHAR filename[CCHMAXPATH + 9];
[2]566
[551]567 *filename = 0;
568 if (insert_filename(hwnd, filename, 2, FALSE) && *filename) {
569 strcat(filename, " %a");
570 WinSetDlgItemText(hwnd, CMD_CL, filename);
571 }
[2]572 }
573 break;
574
[551]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;
[445]598 }
[551]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();
[2]606 }
[551]607 break;
[2]608
[551]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;
[2]622
[551]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)
[552]645 {
[551]646 WinDismissDlg(hwnd, 0);
[574]647 /*saymsg(MB_ENTER, hwnd,
[551]648 GetPString(IDS_ERRORTEXT),
[552]649 GetPString(IDS_CANTADDCOMMANDTEXT),
[574]650 temp.title);*/
[552]651 }
[551]652 else {
653 CHAR env[1002];
[2]654
[551]655 *env = 0;
656 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
657 bstripcr(env);
658 if (*env) {
659 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]660 }
[551]661 x = (SHORT) WinSendDlgItemMsg(hwnd,
662 CMD_LISTBOX,
663 LM_INSERTITEM,
664 MPFROM2SHORT(LIT_END, 0),
665 MPFROMP(temp.title));
666 if (x >= 0) {
[445]667 WinSendDlgItemMsg(hwnd,
668 CMD_LISTBOX,
[551]669 LM_SETITEMHANDLE,
670 MPFROMSHORT(x), MPFROMP(info));
[445]671 WinSendDlgItemMsg(hwnd,
672 CMD_LISTBOX,
673 LM_SELECTITEM,
[551]674 MPFROMSHORT(x), MPFROMSHORT(TRUE));
[445]675 save_commands();
676 }
[551]677 }
678 }
679 x = (SHORT) WinSendDlgItemMsg(hwnd,
680 CMD_LISTBOX,
681 LM_QUERYSELECTION,
682 MPFROMSHORT(LIT_FIRST), MPVOID);
683 WinDismissDlg(hwnd, 0);
684 break;
[2]685
[551]686 case DID_CANCEL:
687 WinDismissDlg(hwnd, 0);
688 break;
[507]689
[551]690 case IDM_HELP:
691 if (hwndHelp)
692 WinSendMsg(hwndHelp,
693 HM_DISPLAY_HELP,
694 MPFROM2SHORT(HELP_COMMAND, 0), MPFROMSHORT(HM_RESOURCEID));
695 break;
[507]696
[551]697 case CMD_ADD:
698 {
699 COMMAND temp;
[2]700
[551]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),
[552]724 GetPString(IDS_CANTADDCOMMANDTEXTDUP), temp.title);
[551]725 }
726 else {
727 CHAR env[1002];
[2]728
[551]729 *env = 0;
730 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
731 bstripcr(env);
732 if (*env) {
733 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[445]734 }
[551]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;
[2]754
[551]755 case CMD_DELETE:
756 {
757 CHAR temp[34];
[2]758
[551]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));
[445]776 }
[551]777 save_commands();
778 }
779 }
780 break;
781 case CMD_REPLACE:
782 {
783 CHAR temp[34];
[574]784 y = (SHORT) WinSendDlgItemMsg(hwnd,
785 CMD_LISTBOX,
786 LM_QUERYSELECTION,
787 MPFROMSHORT(LIT_CURSOR), MPVOID);
[551]788 WinQueryDlgItemText(hwnd, CMD_TITLE, 34, temp);
789 bstrip(temp);
[552]790 if (kill_command(temp))
791 {
[551]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));
[507]804 }
[551]805 save_commands();
806 }
807 }
808 {
809 COMMAND temp;
[507]810
[551]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),
[552]834 GetPString(IDS_CANTADDCOMMANDTEXT),
835 temp.title);
[551]836 }
837 else {
838 CHAR env[1002];
[507]839
[551]840 *env = 0;
841 WinQueryDlgItemText(hwnd, CMD_ENVIRON, 1000, env);
842 bstripcr(env);
843 if (*env) {
844 PrfWriteProfileString(fmprof, FM3Str, temp.cl, env);
[507]845 }
[551]846 x = (SHORT) WinSendDlgItemMsg(hwnd,
847 CMD_LISTBOX,
848 LM_INSERTITEM,
[574]849 MPFROM2SHORT(y, 0),
[551]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,
[574]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 }
[551]889 save_commands();
890 }
891 }
[2]892 }
[551]893 break;
894 }
895 return 0;
[2]896 }
[551]897 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]898}
899
[551]900VOID RunCommand(HWND hwnd, INT cx)
[347]901{
[551]902 INT x;
903 CHAR **list;
904 LINKCMDS *info;
[2]905
906 list = BuildList(hwnd);
[551]907 if (!list || !list[0])
[2]908 return;
909 x = 0;
910 info = cmdhead;
[551]911 while (info) {
[2]912 x++;
[551]913 if (x == cx)
[2]914 break;
915 info = info->next;
916 }
[551]917 if (info) {
[2]918
[551]919 INT flags;
[2]920
921 x--;
922 flags = info->flags;
[551]923 if (!(flags & FULLSCREEN))
[2]924 flags |= WINDOWED;
[551]925 if (flags & KEEP)
[2]926 flags |= SEPARATEKEEP;
927 else
928 flags |= SEPARATE;
[204]929 flags &= ~(KEEP | DIEAFTER);
[551]930 if ((flags & ONCE) && list && list[0]) {
[2]931
[551]932 CHAR *fakelist[2];
933 INT cntr;
[2]934
935 flags &= (~ONCE);
[551]936 for (cntr = 0; list[cntr]; cntr++) {
[445]937 *fakelist = list[cntr];
938 fakelist[1] = NULL;
939 ExecOnList(hwnd,
940 info->cl,
[551]941 flags, NULL, fakelist, GetPString(IDS_EXECCMDTITLETEXT));
[2]942 }
943 }
944 else
945 ExecOnList(hwnd,
[445]946 info->cl,
[551]947 flags, NULL, list, GetPString(IDS_EXECCMDTITLETEXT));
[2]948 }
949 FreeList(list);
950 DosPostEventSem(CompactSem);
951}
952
[551]953VOID EditCommands(HWND hwnd)
[347]954{
[2]955 static CHAR stop = 0;
956
[551]957 if (stop)
[2]958 return;
959 stop++;
[551]960 if (!cmdloaded)
[2]961 load_commands();
962 WinDlgBox(HWND_DESKTOP,
[551]963 hwnd, CommandDlgProc, FM3ModHandle, CMD_FRAME, MPFROMP(&hwnd));
[2]964 stop = 0;
965}
Note: See TracBrowser for help on using the repository browser.