2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
5 Desc: RequestChoice CLI command
9 /*****************************************************************************
17 TITLE/A,BODY/A,GADGETS/A/M,PUBSCREEN/K
25 Allows AmigaDOS scripts to have access to the EasyRequest() function
30 TITLE - The text to display in the title bar of the requester.
32 BODY - The text to display in the body of the requester.
34 GADGETS - The text for each of the buttons.
36 PUBSCREEN - The name of the public screen to open the requester
41 Standard DOS return codes.
45 To place a newline into the body of the requester use *n or *N.
47 To place a quotation mark in the body of the requester use *".
49 The CLI template gives the GADGETS option as ALWAYS given; this
50 is different from the original program. This way, we do not have
51 to check to see if the gadgets have been given.
55 RequestChoice "This is a title" "This is*Na body" Okay|Cancel
57 This is self-explanitory, except for the "*N". This is the
58 equivalent of using a '\n' in C to get a newline in the body
59 of the requester. This requester will open on the Workbench
62 RequestChoice Title="This is a title" Body="This is*Na body"
63 Gadgets=Okay|Cancel PubScreen=DOPUS.1
65 This will do exactly the same as before except that it will
66 open on the Directory Opus public screen.
72 intuition.library/EasyRequestArgs()
78 ******************************************************************************/
80 #include <proto/dos.h>
81 #include <proto/exec.h>
82 #include <proto/intuition.h>
85 #include <dos/rdargs.h>
86 #include <exec/libraries.h>
87 #include <exec/memory.h>
88 #include <exec/types.h>
89 #include <intuition/intuition.h>
90 #include <intuition/screens.h>
94 #define ARG_TEMPLATE "TITLE/A,BODY/A,GADGETS/A/M,PUBSCREEN/K"
98 #define ARG_PUBSCREEN 3
101 const TEXT version
[] = "$VER: RequestChoice 41.2 (01.05.2011)\n";
103 static char ERROR_HEADER
[] = "RequestChoice";
105 static int Do_RequestChoice(STRPTR
, STRPTR
, STRPTR
*, STRPTR
);
106 static STRPTR
FilterBodyText(STRPTR Body
);
107 static STRPTR
ComposeGadgetText(STRPTR
* Gadgets
);
114 IPTR
* args
[TOTAL_ARGS
] = { NULL
, NULL
, NULL
, NULL
};
117 Return_Value
= RETURN_OK
;
119 rda
= ReadArgs(ARG_TEMPLATE
, (IPTR
*)args
, NULL
);
122 Return_Value
= Do_RequestChoice((STRPTR
)args
[ARG_TITLE
],
123 (STRPTR
)args
[ARG_BODY
],
124 (STRPTR
*)args
[ARG_GADGETS
],
125 (STRPTR
)args
[ARG_PUBSCREEN
]);
130 PrintFault(IoErr(), ERROR_HEADER
);
131 Return_Value
= RETURN_FAIL
;
134 return (Return_Value
);
138 STRPTR
ComposeGadgetText(STRPTR
*);
140 int Do_RequestChoice(STRPTR Title
,
146 struct EasyStruct ChoiceES
;
153 Return_Value
= RETURN_OK
;
156 GadgetText
= ComposeGadgetText(Gadgets
);
160 BodyText
= FilterBodyText(Body
);
164 /* Make sure we can open the requester on the specified screen.
166 * If the PubScreen argument is not specified it will contain
167 * NULL, and hence open on the Workbench screen.
169 Scr
= (struct Screen
*)LockPubScreen((UBYTE
*)PubScreen
);
172 ChoiceES
.es_StructSize
= sizeof(struct EasyStruct
);
173 ChoiceES
.es_Flags
= 0L;
174 ChoiceES
.es_Title
= Title
;
175 ChoiceES
.es_TextFormat
= BodyText
;
176 ChoiceES
.es_GadgetFormat
= GadgetText
;
178 /* Open the requester.
180 Result
= EasyRequestArgs(Scr
->FirstWindow
, &ChoiceES
, NULL
, NULL
);
183 args
[0] = (IPTR
)Result
;
185 VPrintf("%ld\n", args
);
189 Return_Value
= RETURN_FAIL
;
190 SetIoErr(ERROR_NO_FREE_STORE
);
191 PrintFault(IoErr(), ERROR_HEADER
);
193 UnlockPubScreen(NULL
, Scr
);
197 Return_Value
= RETURN_FAIL
;
198 SetIoErr(ERROR_NO_FREE_STORE
);
199 PrintFault(IoErr(), ERROR_HEADER
);
207 } /* Do_RequestChoice */
210 // Combine gadget strings and separate them by "|".
211 // Replace all "%" by "%%" because EasyRequest
212 // uses printf-like formatting.
213 static STRPTR
ComposeGadgetText(STRPTR
* Gadgets
)
215 STRPTR GadgetText
, BufferPos
;
216 int GadgetLength
= 0;
222 for (CurrentGadget
= 0; Gadgets
[CurrentGadget
]; CurrentGadget
++)
224 StrLen
= strlen(Gadgets
[CurrentGadget
]);
225 GadgetLength
+= StrLen
+ 1;
228 for (i
= 0; i
< StrLen
; i
++)
230 if (Gadgets
[CurrentGadget
][i
] == '%')
237 GadgetLength
+= PercentCnt
;
239 GadgetText
= AllocVec(GadgetLength
, MEMF_ANY
);
242 SetIoErr(ERROR_NO_FREE_STORE
);
243 PrintFault(IoErr(), ERROR_HEADER
);
247 BufferPos
= GadgetText
;
248 for (CurrentGadget
= 0; Gadgets
[CurrentGadget
]; CurrentGadget
++)
250 int LabelLength
= strlen(Gadgets
[CurrentGadget
]);
252 for (i
= 0; i
< LabelLength
; i
++)
254 if (Gadgets
[CurrentGadget
][i
] == '%')
263 *BufferPos
= Gadgets
[CurrentGadget
][i
];
267 if (Gadgets
[CurrentGadget
+ 1])
278 } /* ComposeGadgetText */
281 // Replace % by %% because EasyRequest uses
282 // printf-like formatting characters.
283 // Result string must be freed with FreeVec().
284 static STRPTR
FilterBodyText(STRPTR Body
)
287 int GadgetLength
= 0;
295 // Count % characters
296 StrLen
= strlen(Body
);
297 for (i
= 0; i
< StrLen
; i
++)
305 GadgetLength
= StrLen
+ PercentCnt
+ 1;
307 GadgetText
= AllocVec(GadgetLength
, MEMF_ANY
);
310 SetIoErr(ERROR_NO_FREE_STORE
);
311 PrintFault(IoErr(), ERROR_HEADER
);
315 for (i
= 0, j
= 0; i
< StrLen
; i
++)
319 GadgetText
[j
++] = '%';
320 GadgetText
[j
++] = '%';
324 GadgetText
[j
++] = Body
[i
];
328 GadgetText
[j
] = '\0';
332 } /* FilterBodyText */