easyasl.pas 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. {
  2. This file is part of the Free Pascal run time library.
  3. A file in Amiga system run time library.
  4. Copyright (c) 1998-2003 by Nils Sjoholm
  5. member of the Amiga RTL development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {
  13. An easy way to use asl.library, no need to open asl.library,
  14. unit asl will open it for you.
  15. A lot of overlay functions here.:)
  16. One remark, be aware of that GetMultiFiles use linklist for the
  17. linked list of files, you can't use your own list with ordinary
  18. nodes.
  19. 26 Oct 1998
  20. Removed amigaoverlays, use smartlink instead.
  21. 05 Nov 2002.
  22. Added the define use_amiga_smartlink.
  23. 13 Jan 2003.
  24. [email protected]
  25. }
  26. {$I useamigasmartlink.inc}
  27. {$ifdef use_amiga_smartlink}
  28. {$smartlink on}
  29. {$endif use_amiga_smartlink}
  30. unit easyasl;
  31. interface
  32. uses exec, asl, utility, amigautils,strings, workbench, linklist;
  33. TYPE
  34. pFPCFontInfo = ^tFPCFontInfo;
  35. tFPCFontInfo = RECORD
  36. nfi_Name : String[40];
  37. nfi_Size : Word;
  38. nfi_Style : Byte;
  39. nfi_Flags : Byte;
  40. nfi_FrontPen : Byte;
  41. nfi_BackPen : Byte;
  42. nfi_DrawMode : Byte;
  43. END;
  44. FUNCTION GetFileAsl(title : PChar; VAR path, fname : PChar; thepatt : PChar;win : Pointer): Boolean;
  45. FUNCTION GetFontAsl(title : PChar;VAR finfo : tFPCFontInfo; win : Pointer): Boolean;
  46. FUNCTION GetMultiAsl(title : PChar; VAR path : PChar; VAR Thelist : pList; thepatt : PChar;win : Pointer): Boolean;
  47. FUNCTION GetPathAsl(title : PChar; VAR path : PChar; win : Pointer): Boolean;
  48. FUNCTION SaveFileAsl(title : PChar; VAR path, fname : PChar; win : Pointer): Boolean;
  49. FUNCTION GetFileAsl(title : PChar; VAR path, fname : PChar; thepatt : String;win : Pointer): Boolean;
  50. FUNCTION GetFileAsl(title : String; VAR path, fname : PChar; thepatt : PChar;win : Pointer): Boolean;
  51. FUNCTION GetFileAsl(title : String; VAR path, fname : PChar; thepatt : String;win : Pointer): Boolean;
  52. FUNCTION GetFontAsl(title : String;VAR finfo : tFPCFontInfo; win : Pointer): Boolean;
  53. FUNCTION GetMultiAsl(title : PChar; VAR path : PChar; VAR Thelist : pList; thepatt : String;win : Pointer): Boolean;
  54. FUNCTION GetMultiAsl(title : String; VAR path : PChar; VAR Thelist : pList; thepatt : PChar;win : Pointer): Boolean;
  55. FUNCTION GetMultiAsl(title : String; VAR path : PChar; VAR Thelist : pList; thepatt : String;win : Pointer): Boolean;
  56. FUNCTION GetPathAsl(title : String; VAR path : PChar; win : Pointer): Boolean;
  57. FUNCTION SaveFileAsl(title : String; VAR path, fname : PChar; win : Pointer): Boolean;
  58. implementation
  59. uses pastoc;
  60. FUNCTION GetFileAsl(title : PChar; VAR path, fname : PChar; thepatt : PChar;win : Pointer): Boolean;
  61. VAR
  62. fr : pFileRequester;
  63. result : Boolean;
  64. mytags : ARRAY[0..7] OF tTagItem;
  65. BEGIN
  66. result := false;
  67. IF strlen(fname) >0 THEN begin
  68. mytags[0].ti_Tag := ASLFR_InitialFile;
  69. mytags[0].ti_Data := Longint(fname);
  70. END ELSE begin
  71. mytags[0].ti_Tag := TAG_IGNORE;
  72. END;
  73. IF (strlen(path) > 0) and (FileType(path) = 2) THEN begin
  74. mytags[1].ti_Tag := ASLFR_InitialDrawer;
  75. mytags[1].ti_Data := Longint(path);
  76. END ELSE begin
  77. mytags[1].ti_Tag := ASLFR_InitialDrawer;
  78. mytags[1].ti_Data := Longint(pas2c('Sys:'));
  79. END;
  80. IF win <> nil THEN begin
  81. mytags[2].ti_Tag := ASLFR_Window;
  82. mytags[2].ti_Data := Longint(win);
  83. END ELSE begin
  84. mytags[2].ti_Tag := TAG_IGNORE;
  85. END;
  86. IF win <> nil THEN begin
  87. mytags[3].ti_Tag := ASLFR_SleepWindow;
  88. mytags[3].ti_Data := Longint(Byte(true));
  89. END ELSE begin
  90. mytags[3].ti_Tag := TAG_IGNORE;
  91. END;
  92. IF title <> nil THEN begin
  93. mytags[4].ti_Tag := ASLFR_TitleText;
  94. mytags[4].ti_Data := Longint(title);
  95. END ELSE begin
  96. mytags[4].ti_Tag := TAG_IGNORE;
  97. END;
  98. IF thepatt <> nil THEN begin
  99. mytags[5].ti_Tag := ASLFR_InitialPattern;
  100. mytags[5].ti_Data := Longint(thepatt);
  101. END ELSE begin
  102. mytags[5].ti_Tag := TAG_IGNORE;
  103. END;
  104. IF thepatt <> nil THEN begin
  105. mytags[6].ti_Tag := ASLFR_DoPatterns;
  106. mytags[6].ti_Data := Longint(Byte(true));
  107. END ELSE begin
  108. mytags[6].ti_Tag := TAG_IGNORE;
  109. END;
  110. mytags[7].ti_Tag := TAG_DONE;
  111. fr := AllocAslRequest(ASL_FileRequest,@mytags);
  112. IF fr <> NIL THEN BEGIN
  113. IF AslRequest(fr,NIL) THEN BEGIN
  114. IF (strlen(fr^.rf_Dir) >0) and (strlen(fr^.rf_File) > 0) THEN begin
  115. strcopy(path,fr^.rf_Dir);
  116. strcopy(fname,fr^.rf_File);
  117. result := true;
  118. END ELSE begin
  119. result := false;
  120. end;
  121. END ELSE BEGIN
  122. result := false;
  123. END;
  124. FreeAslRequest(fr);
  125. END ELSE BEGIN
  126. result := false;
  127. END;
  128. GetFileAsl := result;
  129. END;
  130. FUNCTION GetFontAsl(title : PChar;VAR finfo : tFPCFontInfo; win : Pointer): Boolean;
  131. VAR
  132. fr : pFontRequester;
  133. result : boolean;
  134. mytags : ARRAY[0..14] OF tTagItem;
  135. BEGIN
  136. result := false;
  137. IF win <> nil THEN begin
  138. mytags[0].ti_Tag := ASLFR_Window;
  139. mytags[0].ti_Data := Longint(win);
  140. END ELSE begin
  141. mytags[0].ti_Tag := TAG_IGNORE;
  142. END;
  143. IF win <> nil THEN begin
  144. mytags[1].ti_Tag := ASLFR_SleepWindow;
  145. mytags[1].ti_Data := Longint(Byte(true));
  146. END ELSE begin
  147. mytags[1].ti_Tag := TAG_IGNORE;
  148. END;
  149. IF title <> nil THEN begin
  150. mytags[2].ti_Tag := ASLFR_TitleText;
  151. mytags[2].ti_Data := Longint(title);
  152. END ELSE begin
  153. mytags[2].ti_Tag := TAG_IGNORE;
  154. END;
  155. IF length(finfo.nfi_Name) > 0 THEN BEGIN
  156. mytags[3].ti_Tag := ASLFO_InitialName;
  157. mytags[3].ti_Data := Longint(pas2c(finfo.nfi_Name));
  158. END ELSE BEGIN
  159. finfo.nfi_Name := 'topaz.font';
  160. mytags[3].ti_Tag := ASLFO_InitialName;
  161. mytags[3].ti_Data := Longint(pas2c('topaz.font'));
  162. END;
  163. IF finfo.nfi_Size <= 4 THEN BEGIN
  164. mytags[4].ti_Tag := ASLFO_InitialSize;
  165. mytags[4].ti_Data := 9;
  166. END ELSE BEGIN
  167. mytags[4].ti_Tag := ASLFO_InitialSize;
  168. mytags[4].ti_Data := Longint(finfo.nfi_Size);
  169. END;
  170. IF finfo.nfi_Style >= 0 THEN BEGIN
  171. mytags[5].ti_Tag := ASLFO_InitialStyle;
  172. mytags[5].ti_Data := Longint(finfo.nfi_Style);
  173. END ELSE BEGIN
  174. mytags[5].ti_Tag := TAG_IGNORE;
  175. END;
  176. IF finfo.nfi_Flags >= 0 THEN BEGIN
  177. mytags[6].ti_Tag := ASLFO_InitialFlags;
  178. mytags[6].ti_Data := Longint(finfo.nfi_Flags);
  179. END ELSE BEGIN
  180. mytags[6].ti_Tag := TAG_IGNORE;
  181. END;
  182. IF finfo.nfi_BackPen >=0 THEN BEGIN
  183. mytags[7].ti_Tag := ASLFO_InitialBackPen;
  184. mytags[7].ti_Data := Longint(finfo.nfi_BackPen);
  185. END ELSE BEGIN
  186. mytags[7].ti_Tag := ASLFO_InitialBackPen;
  187. mytags[7].ti_Data := 0;
  188. END;
  189. IF (finfo.nfi_FrontPen = 0) and (finfo.nfi_BackPen = 0) THEN BEGIN
  190. mytags[8].ti_Tag := ASLFO_InitialFrontPen;
  191. mytags[8].ti_Data := 1;
  192. END ELSE BEGIN
  193. mytags[8].ti_Tag := ASLFO_InitialFrontPen;
  194. mytags[8].ti_Data := Longint(finfo.nfi_FrontPen);
  195. END;
  196. IF finfo.nfi_DrawMode >= 0 THEN BEGIN
  197. mytags[9].ti_Tag := ASLFO_InitialDrawMode;
  198. mytags[9].ti_Data := Longint(finfo.nfi_DrawMode);
  199. END ELSE BEGIN
  200. mytags[9].ti_Tag := ASLFO_InitialDrawMode;
  201. mytags[9].ti_Data := 0;
  202. END;
  203. mytags[10].ti_Tag := ASLFO_DoFrontPen;
  204. mytags[10].ti_Data := Longint(Byte(true));
  205. mytags[11].ti_Tag := ASLFO_DoBackPen;
  206. mytags[11].ti_Data := Longint(Byte(true));
  207. mytags[12].ti_Tag := ASLFO_DoStyle;
  208. mytags[12].ti_Data := Longint(Byte(true));
  209. mytags[13].ti_Tag := ASLFO_DoDrawMode;
  210. mytags[13].ti_Data := Longint(Byte(true));
  211. mytags[14].ti_Tag := TAG_DONE;
  212. fr := AllocAslRequest(ASL_FontRequest,@mytags);
  213. IF fr <> NIL THEN BEGIN
  214. IF AslRequest(fr,NIL) THEN BEGIN
  215. WITH finfo DO BEGIN
  216. nfi_Name := strpas(fr^.fo_Attr.ta_Name);
  217. nfi_Size := fr^.fo_Attr.ta_YSize;
  218. nfi_Style := fr^.fo_Attr.ta_Style;
  219. nfi_Flags := fr^.fo_Attr.ta_Flags;
  220. nfi_FrontPen := fr^.fo_FrontPen;
  221. nfi_BackPen := fr^.fo_BackPen;
  222. nfi_DrawMode := fr^.fo_DrawMode;
  223. END;
  224. result := true;
  225. END ELSE BEGIN
  226. result := false;
  227. END;
  228. FreeAslRequest(fr);
  229. END ELSE BEGIN
  230. result := false;
  231. END;
  232. GetFontAsl := result;
  233. END;
  234. FUNCTION GetMultiAsl(title : PChar; VAR path : PChar; VAR Thelist : pList; thepatt : PChar;win : Pointer): Boolean;
  235. VAR
  236. fr : pFileRequester;
  237. result : Boolean;
  238. mytags : ARRAY[0..7] OF tTagItem;
  239. index : Longint;
  240. tempnode : pFPCNode;
  241. BEGIN
  242. IF (strlen(path) > 0) and (FileType(path) = 2) THEN begin
  243. mytags[0].ti_Tag := ASLFR_InitialDrawer;
  244. mytags[0].ti_Data := Longint(path);
  245. END ELSE begin
  246. mytags[0].ti_Tag := ASLFR_InitialDrawer;
  247. mytags[0].ti_Data := Longint(pas2c('Sys:'));
  248. END;
  249. IF win <> nil THEN begin
  250. mytags[1].ti_Tag := ASLFR_Window;
  251. mytags[1].ti_Data := Longint(win);
  252. END ELSE begin
  253. mytags[1].ti_Tag := TAG_IGNORE;
  254. END;
  255. IF win <> nil THEN begin
  256. mytags[2].ti_Tag := ASLFR_SleepWindow;
  257. mytags[2].ti_Data := Longint(Byte(true));
  258. END ELSE begin
  259. mytags[2].ti_Tag := TAG_IGNORE;
  260. END;
  261. IF title <> nil THEN begin
  262. mytags[3].ti_Tag := ASLFR_TitleText;
  263. mytags[3].ti_Data := Longint(title);
  264. END ELSE begin
  265. mytags[3].ti_Tag := TAG_IGNORE;
  266. END;
  267. IF thepatt <> nil THEN begin
  268. mytags[4].ti_Tag := ASLFR_InitialPattern;
  269. mytags[4].ti_Data := Longint(thepatt);
  270. END ELSE begin
  271. mytags[4].ti_Tag := TAG_IGNORE;
  272. END;
  273. IF thepatt <> nil THEN begin
  274. mytags[5].ti_Tag := ASLFR_DoPatterns;
  275. mytags[5].ti_Data := Longint(Byte(true));
  276. END ELSE begin
  277. mytags[5].ti_Tag := TAG_IGNORE;
  278. END;
  279. mytags[6].ti_Tag := ASLFR_DoMultiSelect;
  280. mytags[6].ti_Data := Longint(Byte(true));
  281. mytags[7].ti_Tag := TAG_DONE;
  282. fr := AllocAslRequest(ASL_FileRequest,@mytags);
  283. IF fr <> NIL THEN BEGIN
  284. IF AslRequest(fr,NIL) THEN BEGIN
  285. IF (strlen(fr^.rf_Dir) >0) THEN begin
  286. strcopy(path,fr^.rf_Dir);
  287. result := true;
  288. FOR index := 1 to (fr^.rf_NumArgs) do begin
  289. tempnode := AddNewnode(TheList,fr^.rf_ArgList^[index].wa_Name);
  290. end;
  291. END ELSE begin
  292. result := false;
  293. end;
  294. END ELSE BEGIN
  295. result := false;
  296. END;
  297. FreeAslRequest(fr);
  298. END ELSE BEGIN
  299. result := false;
  300. END;
  301. GetMultiAsl := result;
  302. END;
  303. FUNCTION GetPathAsl(title : PChar; VAR path : PChar; win : Pointer): Boolean;
  304. VAR
  305. fr : pFileRequester;
  306. result : Boolean;
  307. mytags : ARRAY[0..5] OF tTagItem;
  308. BEGIN
  309. result := false;
  310. IF (strlen(path) > 0) and (FileType(path) = 2) THEN begin
  311. mytags[0].ti_Tag := ASLFR_InitialDrawer;
  312. mytags[0].ti_Data := Longint(path);
  313. END ELSE begin
  314. mytags[0].ti_Tag := ASLFR_InitialDrawer;
  315. mytags[0].ti_Data := Longint(pas2c('Sys:'));
  316. END;
  317. IF win <> nil THEN begin
  318. mytags[1].ti_Tag := ASLFR_Window;
  319. mytags[1].ti_Data := Longint(win);
  320. END ELSE begin
  321. mytags[1].ti_Tag := TAG_IGNORE;
  322. END;
  323. IF win <> nil THEN begin
  324. mytags[2].ti_Tag := ASLFR_SleepWindow;
  325. mytags[2].ti_Data := Longint(Byte(true));
  326. END ELSE begin
  327. mytags[2].ti_Tag := TAG_IGNORE;
  328. END;
  329. IF title <> nil THEN begin
  330. mytags[3].ti_Tag := ASLFR_TitleText;
  331. mytags[3].ti_Data := Longint(title);
  332. END ELSE begin
  333. mytags[3].ti_Tag := TAG_IGNORE;
  334. END;
  335. mytags[4].ti_Tag := ASLFR_DrawersOnly;
  336. mytags[4].ti_Data := Longint(Byte(true));
  337. mytags[5].ti_Tag := TAG_DONE;
  338. fr := AllocAslRequest(ASL_FileRequest,@mytags);
  339. IF fr <> NIL THEN BEGIN
  340. IF AslRequest(fr,NIL) THEN BEGIN
  341. IF (strlen(fr^.rf_Dir) >0) THEN begin
  342. strcopy(path,fr^.rf_Dir);
  343. result := true;
  344. END ELSE begin
  345. result := false;
  346. end;
  347. END ELSE BEGIN
  348. result := false;
  349. END;
  350. FreeAslRequest(fr);
  351. END ELSE BEGIN
  352. result := false;
  353. END;
  354. GetPathAsl := result;
  355. END;
  356. FUNCTION SaveFileAsl(title : PChar; VAR path, fname : PChar; win : Pointer): Boolean;
  357. VAR
  358. fr : pFileRequester;
  359. result : Boolean;
  360. mytags : ARRAY[0..6] OF tTagItem;
  361. BEGIN
  362. result := false;
  363. IF strlen(fname) >0 THEN begin
  364. mytags[0].ti_Tag := ASLFR_InitialFile;
  365. mytags[0].ti_Data := Longint(fname);
  366. END ELSE begin
  367. mytags[0].ti_Tag := TAG_IGNORE;
  368. END;
  369. IF (strlen(path) > 0) and (FileType(path) = 2) THEN begin
  370. mytags[1].ti_Tag := ASLFR_InitialDrawer;
  371. mytags[1].ti_Data := Longint(path);
  372. END ELSE begin
  373. mytags[1].ti_Tag := ASLFR_InitialDrawer;
  374. mytags[1].ti_Data := Longint(pas2c('Sys:'));
  375. END;
  376. IF win <> nil THEN begin
  377. mytags[2].ti_Tag := ASLFR_Window;
  378. mytags[2].ti_Data := Longint(win);
  379. END ELSE begin
  380. mytags[2].ti_Tag := TAG_IGNORE;
  381. END;
  382. IF win <> nil THEN begin
  383. mytags[3].ti_Tag := ASLFR_SleepWindow;
  384. mytags[3].ti_Data := Longint(Byte(true));
  385. END ELSE begin
  386. mytags[3].ti_Tag := TAG_IGNORE;
  387. END;
  388. IF title <> nil THEN begin
  389. mytags[4].ti_Tag := ASLFR_TitleText;
  390. mytags[4].ti_Data := Longint(title);
  391. END ELSE begin
  392. mytags[4].ti_Tag := TAG_IGNORE;
  393. END;
  394. mytags[5].ti_Tag := ASLFR_DoSaveMode;
  395. mytags[5].ti_Data := Longint(Byte(true));
  396. mytags[6].ti_Tag := TAG_DONE;
  397. fr := AllocAslRequest(ASL_FileRequest,@mytags);
  398. IF fr <> NIL THEN BEGIN
  399. IF AslRequest(fr,NIL) THEN BEGIN
  400. IF (strlen(fr^.rf_Dir) >0) and (strlen(fr^.rf_File) > 0) THEN begin
  401. strcopy(path,fr^.rf_Dir);
  402. strcopy(fname,fr^.rf_File);
  403. result := true;
  404. END ELSE begin
  405. result := false;
  406. end;
  407. END ELSE BEGIN
  408. result := false;
  409. END;
  410. FreeAslRequest(fr);
  411. END ELSE BEGIN
  412. result := false;
  413. END;
  414. SaveFileAsl := result;
  415. END;
  416. FUNCTION GetFileAsl(title : String; VAR path, fname : PChar; thepatt : PChar;win : Pointer): Boolean;
  417. begin
  418. GetFileAsl := GetFileAsl(pas2c(title),path,fname,thepatt,win);
  419. end;
  420. FUNCTION GetFileAsl(title : String; VAR path, fname : PChar; thepatt : String;win : Pointer): Boolean;
  421. begin
  422. GetFileAsl := GetFileAsl(pas2c(title),path,fname,pas2c(thepatt),win);
  423. end;
  424. FUNCTION GetFileAsl(title : PChar; VAR path, fname : PChar; thepatt : String;win : Pointer): Boolean;
  425. begin
  426. GetFileAsl := GetFileAsl(title,path,fname,pas2c(thepatt),win);
  427. end;
  428. FUNCTION GetFontAsl(title : String;VAR finfo : tFPCFontInfo; win : Pointer): Boolean;
  429. begin
  430. GetFontAsl := GetFontAsl(pas2c(title),finfo,win);
  431. end;
  432. FUNCTION GetMultiAsl(title : String; VAR path : PChar; VAR Thelist : pList; thepatt : PChar;win : Pointer): Boolean;
  433. begin
  434. GetMultiAsl := GetMultiAsl(pas2c(title),path,TheList,thepatt,win);
  435. end;
  436. FUNCTION GetMultiAsl(title : String; VAR path : PChar; VAR Thelist : pList; thepatt : String;win : Pointer): Boolean;
  437. begin
  438. GetMultiAsl := GetMultiAsl(pas2c(title),path,TheList,pas2c(thepatt),win);
  439. end;
  440. FUNCTION GetMultiAsl(title : PChar; VAR path : PChar; VAR Thelist : pList; thepatt : String;win : Pointer): Boolean;
  441. begin
  442. GetMultiAsl := GetMultiAsl(title,path,TheList,pas2c(thepatt),win);
  443. end;
  444. FUNCTION GetPathAsl(title : String; VAR path : PChar; win : Pointer): Boolean;
  445. begin
  446. GetPathAsl := GetPathAsl(pas2c(title),path,win);
  447. end;
  448. FUNCTION SaveFileAsl(title : String; VAR path, fname : PChar; win : Pointer): Boolean;
  449. begin
  450. SaveFileAsl := SaveFileAsl(pas2c(title),path,fname,win);
  451. end;
  452. end.