home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / wp_dtp / proan111.lha / AutoMenu.ProANSI < prev    next >
Text File  |  1992-05-28  |  8KB  |  374 lines

  1. /*
  2.  * file  : AutoMenu.ProANSI
  3.  * auteur: Marcel Offermans
  4.  * $VER: AutoMenu.ProANSI V1.02 (28.5.92)
  5.  *
  6.  * Copyright © 1992 Marcel Offermans (Sillysoft)
  7.  *
  8.  * Dit programma is bedoeld om het genereren van `standaard' menu's te
  9.  * vereenvoudigen. Je maakt de menu definities aan in een soort script
  10.  * en dat script `voer' je dan aan dit programma, dat het omzet in de
  11.  * gewenste schermen. Die schermen worden dan automatisch gesaved naar
  12.  * de van te voren aangegeven files. Je roept dit programma als volgt
  13.  * aan (vanuit een Shell):
  14.  *
  15.  * 1> rx AutoMenu.ProANSI <scriptfile>
  16.  *
  17.  * Waarbij je voor die scriptfile natuurlijk je eigen script invult.
  18.  * Dat is alles. Volgens mij gaat het niet veel eenvoudiger.
  19.  *
  20.  * Het programma kan eenvoudig uitgebreid worden omdat je de parser
  21.  * niet hoeft aan te passen als je een nieuw commando toevoegt. Je
  22.  * kunt dus volstaan met het toevoegen van het commando, en de parser
  23.  * zal het automatisch herkennen.
  24.  *
  25.  * NOTE TO ENGLISH SPEAKING USERS:
  26.  *
  27.  * If you don't understand dutch I will be happy to help you with this
  28.  * program. Unfortunately I don't have time to translate everything into
  29.  * english at the moment.
  30.  *
  31.  * - Marcel
  32.  */
  33.  
  34. /* Stuur commando's naar ProANSI, onze host. */
  35. address 'REXX_ProANSI'
  36.  
  37. /* We willen ook graag antwoord terug hebben. */
  38. options results
  39.  
  40. /* Lees het commando achter AUTOMENU, de naam van de scriptfile. */
  41. parse arg menufile
  42.  
  43. /* Als die filenaam niet opgegeven was, geef dan een melding uit. */
  44. if (menufile == '') then
  45. do
  46.     say
  47.     say 'AutoMenu.ProANSI, Copyright © 1992 Marcel Offermans (Sillysoft)'
  48.     say 'Usage: rx AutoMenu.ProANSI FILENAME/A'
  49.     say
  50.     exit 5
  51. end
  52.  
  53. /* Als de filenaam niet bestaat, protesteren we ook. */
  54. if (exists(menufile) ~= 1) then
  55. do
  56.     say 'Error finding ' || menufile || ', please check path & spelling.'
  57.     exit 10
  58. end
  59.  
  60. /* Nu openen we de file, en `ontleden' we hem in commando's. */
  61. if (open('fin', menufile, 'Read') == 0) then
  62. do
  63.     /* Dat ging blijkbaar niet?! */
  64.     say
  65.     say 'Error opening ' || menufile || '. The file is available, but I'
  66.     say 'cannot open it, check if some other task has it open.'
  67.     say
  68.     /* exit with returncode FAIL */
  69.     exit 20
  70. end
  71.  
  72. /* Nu eerst een paar globale var. van een default waarde voorzien. */
  73.  
  74. menutitel = 'Menu'
  75. menufcol = 9
  76. menubcol = 4
  77. menualign = 'center'
  78. menux = 5
  79. menuxsize = 70
  80. menuy = 2
  81.  
  82. itemfcol = 15
  83. itembcol = 4
  84. itemx = 10
  85. itemxsize = 60
  86. itemy = 5
  87. itemalign = 'left'
  88.  
  89. hotkeyfcol = 11
  90. hotkeybcol = 0
  91.  
  92. bracketfcol = 9
  93. bracketbcol = 0
  94. bracketopen = '['
  95. bracketclose = ']'
  96.  
  97. nrofcolumns = 1
  98.  
  99. boxfcol = 12
  100. boxbcol = 0
  101.  
  102. /* `Tijdelijke' waarden, zoals tellers e.d. */
  103. itemnum = 0
  104.  
  105. /* Lees de file regel voor regel. */
  106. instring = readln('fin')
  107.  
  108. /* Net zolang tot we een lege regel tegenkomen. */
  109. do while (~eof('fin'))
  110.  
  111.     /* Verwijder eventueel commentaar achteraan de regel. */
  112.     parse var instring command ';' comment
  113.  
  114.     /* Kijk of er dan nog een commando overblijft. */
  115.     if (length(command) > 0) then
  116.     do
  117.         /* Ontleed het commando in commando en argumenten. */
  118.         parse var command cmd par
  119.  
  120.         /* Als dat lukte, dan voeren we het commando uit. */
  121.         if (length(cmd) > 0) then
  122.         do
  123.             interpret 'call ' || cmd || '(par)'
  124.         end
  125.     end
  126.  
  127.     /* Lees de volgende regel uit de file. */
  128.     instring = readln('fin')
  129. end
  130.  
  131. /* Sluit de file. */
  132. close('fin')
  133.  
  134. /* Verlaat het programma. */
  135. exit 0
  136.  
  137. /*************************************************************************\
  138. *                                                                         *
  139. * Hieronder volgen de commando's die door automenu herkend worden als     *
  140. * scriptcommando's. Deze lijst is zonder meer uit te breiden met alle     *
  141. * mogelijke commando's, want de dispatcher hierboven kan het niet sche-   *
  142. * len of/welke commando's er bestaan. Hij stopt gewoon als hij iets       *
  143. * tegenkomt wat niet bestaat.                                             *
  144. *                                                                         *
  145. * Als je zelf commando's toevoegt, dan zou ik die graag ook krijgen,      *
  146. * zodat ook anderen daarvan kunnen profiteren, en omdat je dan een        *
  147. * beetje een standaard aan kunt houden. Ik hoop hierbij op een ieders     *
  148. * medewerking.                                                            *
  149. *                                                                         *
  150. *   Marcel                                                                *
  151. *                                                                         *
  152. \*************************************************************************/
  153.  
  154. menu:
  155. parse arg titel
  156.  
  157. itemnum = 0
  158. parse var titel naam
  159. menutitel = strip(naam,'b')
  160. 'set_pos' menux menuy
  161. 'select_col' menufcol menubcol
  162. if (menualign == 'center') then
  163. do
  164.     'print_string' Center(menutitel, menuxsize)
  165. end
  166. if (menualign == 'left') then
  167. do
  168.     'print_string' Left(menutitel, menuxsize)
  169. end
  170.  
  171. return
  172.  
  173. menuoptions:
  174. parse arg titel
  175.  
  176. parse var titel fcol bcol align x xs y
  177. if ((align ~= 'left') & (align ~= 'center')) then
  178. do
  179.     say 'Unsupported menu align parameter (' || align || ').'
  180.     return
  181. end
  182. menualign = align
  183. if ((fcol >= 0) & (fcol <= 15)) then
  184. do
  185.     menufcol = fcol
  186. end
  187. if ((bcol >= 0) & (bcol <= 7)) then
  188. do
  189.     menubcol = bcol
  190. end
  191. if ((x >= 0) & (x <= 79)) then
  192. do
  193.     menux = x
  194. end
  195. if ((xs >= 0) & (xs <= 79)) then
  196. do
  197.     menuxsize = xs
  198. end
  199. if ((y >= 0) & (y <= 60)) then
  200. do
  201.     menuy = y
  202. end
  203. return
  204.  
  205. single_box:
  206. arg xmin, ymin, xmax, ymax
  207.  
  208. 'set_pos' xmin ymin
  209.  
  210. if ((xmax <= xmin) || (ymax <= ymin)) then
  211. do
  212.     return
  213. end
  214.  
  215. /* Maak een string met lengte xmax-xmin */
  216. topline = 'da'x || Copies('c4'x, xmax-xmin-1) || 'bf'x
  217. 'print_string' topline
  218.  
  219. do y = ymin+1 to ymax-1
  220.     'set_pos' xmin y
  221.     'print_string' 'b3'x
  222.     'set_pos' xmax y
  223.     'print_string' 'b3'x
  224. end
  225.  
  226. 'set_pos' xmin ymax
  227.  
  228. /* Maak een string met lengte xmax-xmin */
  229. bottomline = 'c0'x || Copies('c4'x, xmax-xmin-1) || 'd9'x
  230. 'print_string' bottomline
  231.  
  232. return
  233.  
  234. /*
  235.     Een nieuw item toevoegen aan een menu.
  236. */
  237. item:
  238. parse arg hotkey naam
  239.  
  240. /* kijk of het een leeg item was, want dan zijn we snel klaar */
  241. if (length(naam) == 0) then
  242. do
  243.     itemnum = itemnum + 1
  244.     return
  245. end
  246.  
  247. xp = (itemnum - nrofcolumns * trunc(itemnum / nrofcolumns)) * trunc(itemxsize / nrofcolumns)
  248. xs = trunc(itemxsize / nrofcolumns)
  249. yp = trunc(itemnum / nrofcolumns)
  250.  
  251. 'set_pos' (itemx + xp) (itemy + yp)
  252. 'select_col' bracketfcol bracketbcol
  253. 'print_string' bracketopen
  254. 'select_col' hotkeyfcol hotkeybcol
  255. 'print_string' hotkey
  256. 'select_col' bracketfcol bracketbcol
  257. 'print_string' bracketclose || ' '
  258. 'select_col' itemfcol itembcol
  259. naam = strip(naam,'b')
  260. rest = xs - 3 - length(hotkey)
  261. if (itemalign == 'center') then
  262. do
  263.     'print_string' Center(naam, rest)
  264. end
  265. if (itemalign == 'left') then
  266. do
  267.     'print_string' Left(naam, rest)
  268. end
  269. itemnum = itemnum + 1
  270. return
  271.  
  272. itemoptions:
  273. parse arg titel
  274.  
  275. parse var titel fcol bcol align x xs y cols
  276. if ~((align ~= 'left') & (align ~= 'center')) then
  277. do
  278.     itemalign = align
  279. end
  280.  
  281. if ((fcol >= 0) & (fcol <= 15)) then
  282. do
  283.     itemfcol = fcol
  284. end
  285. if ((bcol >= 0) & (bcol <= 7)) then
  286. do
  287.     itembcol = bcol
  288. end
  289. if ((x >= 0) & (x <= 79)) then
  290. do
  291.     itemx = x
  292. end
  293. if ((xs >= 0) & (xs <= 79)) then
  294. do
  295.     itemxsize = xs
  296. end
  297. if ((y >= 0) & (y <= 60)) then
  298. do
  299.     itemy = y
  300. end
  301. if ((cols >= 1) & (cols <= 10)) then
  302. do
  303.     nrofcolumns = cols
  304. end
  305. return
  306.  
  307. boxitems:
  308.  
  309. 'select_col' boxfcol boxbcol
  310. call single_box(itemx-2,itemy-1,itemx+itemxsize+1,itemy+trunc((itemnum + (nrofcolumns - 1)) / nrofcolumns))
  311.  
  312. return
  313.  
  314. boxmenu:
  315.  
  316. 'select_col' boxfcol boxbcol
  317. call single_box(menux-2,menuy-1,menux+menuxsize+1,menuy+1)
  318.  
  319. return
  320.  
  321. save:
  322. parse arg titel
  323.  
  324. parse var titel mode filenaam
  325. filenaam = strip(filenaam,'b')
  326. mode = strip(mode,'b')
  327. if (mode == 'ascii') then
  328. do
  329.     'save_ascii' filenaam
  330. end
  331. if (mode == 'ansi') then
  332. do
  333.     'save_ansi' filenaam
  334. end
  335. if (mode == 'anim') then
  336. do
  337.     'save_ansi_anim' filenaam
  338. end
  339.  
  340. return
  341.  
  342. /* load a (background) picture */
  343. loadpic:
  344.     parse arg filename
  345.     filename = strip(filename)
  346.     'include_file' filename
  347. return
  348.  
  349. /* change hotkey colors */
  350. hotkeyoptions:
  351.     parse arg fc bc bfc bbc bopen bclose
  352.  
  353.     if ((bc >= 0) & (bc <= 7)) then
  354.         hotkeybcol = bc
  355.     if ((fc >= 0) & (fc <= 15)) then
  356.         hotkeyfcol = fc
  357.  
  358.     if ((bbc >= 0) & (bbc <= 7)) then
  359.         bracketbcol = bbc
  360.     if ((bfc >= 0) & (bfc <= 15)) then
  361.         bracketfcol = bfc
  362.  
  363.     if (bopen != '') then
  364.         bracketopen = bopen
  365.  
  366.     if (bclose != '') then
  367.         bracketclose = bclose
  368.  
  369. return
  370.  
  371. newmenu:
  372.     'new'
  373. return
  374.