app.pas 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213
  1. {********[ SOURCE FILE OF GRAPHICAL FREE VISION ]**********}
  2. { }
  3. { System independent GRAPHICAL clone of APP.PAS }
  4. { }
  5. { Interface Copyright (c) 1992 Borland International }
  6. { }
  7. { Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer }
  8. { [email protected] - primary e-mail addr }
  9. { [email protected] - backup e-mail addr }
  10. { }
  11. {****************[ THIS CODE IS FREEWARE ]*****************}
  12. { }
  13. { This sourcecode is released for the purpose to }
  14. { promote the pascal language on all platforms. You may }
  15. { redistribute it and/or modify with the following }
  16. { DISCLAIMER. }
  17. { }
  18. { This SOURCE CODE is distributed "AS IS" WITHOUT }
  19. { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
  20. { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
  21. { }
  22. {*****************[ SUPPORTED PLATFORMS ]******************}
  23. { }
  24. { Only Free Pascal Compiler supported }
  25. { }
  26. {**********************************************************}
  27. UNIT App;
  28. {2.0 compatibility}
  29. {$ifdef VER2_0}
  30. {$macro on}
  31. {$define resourcestring := const}
  32. {$endif}
  33. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  34. INTERFACE
  35. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  36. {====Include file to sort compiler platform out =====================}
  37. {$I platform.inc}
  38. {====================================================================}
  39. {==== Compiler directives ===========================================}
  40. {$X+} { Extended syntax is ok }
  41. {$R-} { Disable range checking }
  42. {$S-} { Disable Stack Checking }
  43. {$I-} { Disable IO Checking }
  44. {$Q-} { Disable Overflow Checking }
  45. {$V-} { Turn off strict VAR strings }
  46. {====================================================================}
  47. USES
  48. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  49. Windows, { Standard units }
  50. {$ENDIF}
  51. {$IFDEF OS_OS2} { OS2 CODE }
  52. {$IFDEF PPC_FPC}
  53. Os2Def, DosCalls, PmWin, { Standard units }
  54. {$ELSE}
  55. Os2Def, Os2Base, OS2PmApi, { Standard units }
  56. {$ENDIF}
  57. {$ENDIF}
  58. Dos,
  59. Video,
  60. FVCommon, {Memory,} { GFV standard units }
  61. Objects, Drivers, Views, Menus, HistList, Dialogs,
  62. msgbox, fvconsts;
  63. {***************************************************************************}
  64. { PUBLIC CONSTANTS }
  65. {***************************************************************************}
  66. {---------------------------------------------------------------------------}
  67. { STANDARD APPLICATION COMMAND CONSTANTS }
  68. {---------------------------------------------------------------------------}
  69. CONST
  70. cmNew = 30; { Open new file }
  71. cmOpen = 31; { Open a file }
  72. cmSave = 32; { Save current }
  73. cmSaveAs = 33; { Save current as }
  74. cmSaveAll = 34; { Save all files }
  75. cmChangeDir = 35; { Change directories }
  76. cmDosShell = 36; { Dos shell }
  77. cmCloseAll = 37; { Close all windows }
  78. {---------------------------------------------------------------------------}
  79. { TApplication PALETTE ENTRIES }
  80. {---------------------------------------------------------------------------}
  81. CONST
  82. apColor = 0; { Coloured app }
  83. apBlackWhite = 1; { B&W application }
  84. apMonochrome = 2; { Monochrome app }
  85. {---------------------------------------------------------------------------}
  86. { TBackGround PALETTES }
  87. {---------------------------------------------------------------------------}
  88. CONST
  89. CBackground = #1; { Background colour }
  90. {---------------------------------------------------------------------------}
  91. { TApplication PALETTES }
  92. {---------------------------------------------------------------------------}
  93. CONST
  94. { Turbo Vision 1.0 Color Palettes }
  95. CColor =
  96. #$81#$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
  97. #$37#$3F#$3A#$13#$13#$3E#$21#$3F#$70#$7F#$7A#$13#$13#$70#$7F#$7E +
  98. #$70#$7F#$7A#$13#$13#$70#$70#$7F#$7E#$20#$2B#$2F#$78#$2E#$70#$30 +
  99. #$3F#$3E#$1F#$2F#$1A#$20#$72#$31#$31#$30#$2F#$3E#$31#$13#$38#$00;
  100. CBlackWhite =
  101. #$70#$70#$78#$7F#$07#$07#$0F#$07#$0F#$07#$70#$70#$07#$70#$0F +
  102. #$07#$0F#$07#$70#$70#$07#$70#$0F#$70#$7F#$7F#$70#$07#$70#$07#$0F +
  103. #$70#$7F#$7F#$70#$07#$70#$70#$7F#$7F#$07#$0F#$0F#$78#$0F#$78#$07 +
  104. #$0F#$0F#$0F#$70#$0F#$07#$70#$70#$70#$07#$70#$0F#$07#$07#$78#$00;
  105. CMonochrome =
  106. #$70#$07#$07#$0F#$70#$70#$70#$07#$0F#$07#$70#$70#$07#$70#$00 +
  107. #$07#$0F#$07#$70#$70#$07#$70#$00#$70#$70#$70#$07#$07#$70#$07#$00 +
  108. #$70#$70#$70#$07#$07#$70#$70#$70#$0F#$07#$07#$0F#$70#$0F#$70#$07 +
  109. #$0F#$0F#$07#$70#$07#$07#$70#$07#$07#$07#$70#$0F#$07#$07#$70#$00;
  110. { Turbo Vision 2.0 Color Palettes }
  111. CAppColor =
  112. #$71#$70#$78#$74#$20#$28#$24#$17#$1F#$1A#$31#$31#$1E#$71#$1F +
  113. #$37#$3F#$3A#$13#$13#$3E#$21#$3F#$70#$7F#$7A#$13#$13#$70#$7F#$7E +
  114. #$70#$7F#$7A#$13#$13#$70#$70#$7F#$7E#$20#$2B#$2F#$78#$2E#$70#$30 +
  115. #$3F#$3E#$1F#$2F#$1A#$20#$72#$31#$31#$30#$2F#$3E#$31#$13#$38#$00 +
  116. #$17#$1F#$1A#$71#$71#$1E#$17#$1F#$1E#$20#$2B#$2F#$78#$2E#$10#$30 +
  117. #$3F#$3E#$70#$2F#$7A#$20#$12#$31#$31#$30#$2F#$3E#$31#$13#$38#$00 +
  118. #$37#$3F#$3A#$13#$13#$3E#$30#$3F#$3E#$20#$2B#$2F#$78#$2E#$30#$70 +
  119. #$7F#$7E#$1F#$2F#$1A#$20#$32#$31#$71#$70#$2F#$7E#$71#$13#$38#$00;
  120. CAppBlackWhite =
  121. #$70#$70#$78#$7F#$07#$07#$0F#$07#$0F#$07#$70#$70#$07#$70#$0F +
  122. #$07#$0F#$07#$70#$70#$07#$70#$0F#$70#$7F#$7F#$70#$07#$70#$07#$0F +
  123. #$70#$7F#$7F#$70#$07#$70#$70#$7F#$7F#$07#$0F#$0F#$78#$0F#$78#$07 +
  124. #$0F#$0F#$0F#$70#$0F#$07#$70#$70#$70#$07#$70#$0F#$07#$07#$78#$00 +
  125. #$07#$0F#$0F#$07#$70#$07#$07#$0F#$0F#$70#$78#$7F#$08#$7F#$08#$70 +
  126. #$7F#$7F#$7F#$0F#$70#$70#$07#$70#$70#$70#$07#$7F#$70#$07#$78#$00 +
  127. #$70#$7F#$7F#$70#$07#$70#$70#$7F#$7F#$07#$0F#$0F#$78#$0F#$78#$07 +
  128. #$0F#$0F#$0F#$70#$0F#$07#$70#$70#$70#$07#$70#$0F#$07#$07#$78#$00;
  129. CAppMonochrome =
  130. #$70#$07#$07#$0F#$70#$70#$70#$07#$0F#$07#$70#$70#$07#$70#$00 +
  131. #$07#$0F#$07#$70#$70#$07#$70#$00#$70#$70#$70#$07#$07#$70#$07#$00 +
  132. #$70#$70#$70#$07#$07#$70#$70#$70#$0F#$07#$07#$0F#$70#$0F#$70#$07 +
  133. #$0F#$0F#$07#$70#$07#$07#$70#$07#$07#$07#$70#$0F#$07#$07#$70#$00 +
  134. #$70#$70#$70#$07#$07#$70#$70#$70#$0F#$07#$07#$0F#$70#$0F#$70#$07 +
  135. #$0F#$0F#$07#$70#$07#$07#$70#$07#$07#$07#$70#$0F#$07#$07#$70#$00 +
  136. #$70#$70#$70#$07#$07#$70#$70#$70#$0F#$07#$07#$0F#$70#$0F#$70#$07 +
  137. #$0F#$0F#$07#$70#$07#$07#$70#$07#$07#$07#$70#$0F#$07#$07#$70#$00;
  138. {---------------------------------------------------------------------------}
  139. { STANDRARD HELP CONTEXT CONSTANTS }
  140. {---------------------------------------------------------------------------}
  141. CONST
  142. { Note: range $FF00 - $FFFF of help contexts are reserved by Borland }
  143. hcNew = $FF01; { New file help }
  144. hcOpen = $FF02; { Open file help }
  145. hcSave = $FF03; { Save file help }
  146. hcSaveAs = $FF04; { Save file as help }
  147. hcSaveAll = $FF05; { Save all files help }
  148. hcChangeDir = $FF06; { Change dir help }
  149. hcDosShell = $FF07; { Dos shell help }
  150. hcExit = $FF08; { Exit program help }
  151. hcUndo = $FF10; { Clipboard undo help }
  152. hcCut = $FF11; { Clipboard cut help }
  153. hcCopy = $FF12; { Clipboard copy help }
  154. hcPaste = $FF13; { Clipboard paste help }
  155. hcClear = $FF14; { Clipboard clear help }
  156. hcTile = $FF20; { Desktop tile help }
  157. hcCascade = $FF21; { Desktop cascade help }
  158. hcCloseAll = $FF22; { Desktop close all }
  159. hcResize = $FF23; { Window resize help }
  160. hcZoom = $FF24; { Window zoom help }
  161. hcNext = $FF25; { Window next help }
  162. hcPrev = $FF26; { Window previous help }
  163. hcClose = $FF27; { Window close help }
  164. {***************************************************************************}
  165. { PUBLIC OBJECT DEFINITIONS }
  166. {***************************************************************************}
  167. {---------------------------------------------------------------------------}
  168. { TBackGround OBJECT - BACKGROUND OBJECT }
  169. {---------------------------------------------------------------------------}
  170. TYPE
  171. TBackGround = OBJECT (TView)
  172. Pattern: Char; { Background pattern }
  173. CONSTRUCTOR Init (Var Bounds: TRect; APattern: Char);
  174. CONSTRUCTOR Load (Var S: TStream);
  175. FUNCTION GetPalette: PPalette; Virtual;
  176. PROCEDURE Draw; Virtual;
  177. PROCEDURE Store (Var S: TStream);
  178. END;
  179. PBackGround = ^TBackGround;
  180. {---------------------------------------------------------------------------}
  181. { TDeskTop OBJECT - DESKTOP OBJECT }
  182. {---------------------------------------------------------------------------}
  183. TYPE
  184. TDeskTop = OBJECT (TGroup)
  185. Background : PBackground; { Background view }
  186. TileColumnsFirst: Boolean; { Tile direction }
  187. CONSTRUCTOR Init (Var Bounds: TRect);
  188. CONSTRUCTOR Load (Var S: TStream);
  189. PROCEDURE TileError; Virtual;
  190. PROCEDURE InitBackGround; Virtual;
  191. PROCEDURE Tile (Var R: TRect);
  192. PROCEDURE Store (Var S: TStream);
  193. PROCEDURE Cascade (Var R: TRect);
  194. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  195. END;
  196. PDeskTop = ^TDeskTop;
  197. {---------------------------------------------------------------------------}
  198. { TProgram OBJECT - PROGRAM ANCESTOR OBJECT }
  199. {---------------------------------------------------------------------------}
  200. TYPE
  201. TProgram = OBJECT (TGroup)
  202. CONSTRUCTOR Init;
  203. DESTRUCTOR Done; Virtual;
  204. FUNCTION GetPalette: PPalette; Virtual;
  205. FUNCTION CanMoveFocus: Boolean;
  206. FUNCTION ValidView (P: PView): PView;
  207. FUNCTION InsertWindow (P: PWindow): PWindow;
  208. FUNCTION ExecuteDialog (P: PDialog; Data: Pointer): Word;
  209. PROCEDURE Run; Virtual;
  210. PROCEDURE Idle; Virtual;
  211. PROCEDURE InitScreen; Virtual;
  212. { procedure DoneScreen; virtual;}
  213. PROCEDURE InitDeskTop; Virtual;
  214. PROCEDURE OutOfMemory; Virtual;
  215. PROCEDURE InitMenuBar; Virtual;
  216. PROCEDURE InitStatusLine; Virtual;
  217. PROCEDURE SetScreenMode (Mode: Word);
  218. PROCEDURE SetScreenVideoMode(const Mode: TVideoMode);
  219. PROCEDURE PutEvent (Var Event: TEvent); Virtual;
  220. PROCEDURE GetEvent (Var Event: TEvent); Virtual;
  221. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  222. END;
  223. PProgram = ^TProgram;
  224. {---------------------------------------------------------------------------}
  225. { TApplication OBJECT - APPLICATION OBJECT }
  226. {---------------------------------------------------------------------------}
  227. TYPE
  228. TApplication = OBJECT (TProgram)
  229. CONSTRUCTOR Init;
  230. DESTRUCTOR Done; Virtual;
  231. PROCEDURE Tile;
  232. PROCEDURE Cascade;
  233. PROCEDURE DosShell;
  234. PROCEDURE GetTileRect (Var R: TRect); Virtual;
  235. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  236. procedure WriteShellMsg; virtual;
  237. END;
  238. PApplication = ^TApplication; { Application ptr }
  239. {***************************************************************************}
  240. { INTERFACE ROUTINES }
  241. {***************************************************************************}
  242. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  243. { STANDARD MENU AND STATUS LINES ROUTINES }
  244. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  245. {-StdStatusKeys------------------------------------------------------
  246. Returns a pointer to a linked list of commonly used status line keys.
  247. The default status line for TApplication uses StdStatusKeys as its
  248. complete list of status keys.
  249. 22Oct99 LdB
  250. ---------------------------------------------------------------------}
  251. FUNCTION StdStatusKeys (Next: PStatusItem): PStatusItem;
  252. {-StdFileMenuItems---------------------------------------------------
  253. Returns a pointer to a list of menu items for a standard File menu.
  254. The standard File menu items are New, Open, Save, Save As, Save All,
  255. Change Dir, OS Shell, and Exit.
  256. 22Oct99 LdB
  257. ---------------------------------------------------------------------}
  258. FUNCTION StdFileMenuItems (Next: PMenuItem): PMenuItem;
  259. {-StdEditMenuItems---------------------------------------------------
  260. Returns a pointer to a list of menu items for a standard Edit menu.
  261. The standard Edit menu items are Undo, Cut, Copy, Paste, and Clear.
  262. 22Oct99 LdB
  263. ---------------------------------------------------------------------}
  264. FUNCTION StdEditMenuItems (Next: PMenuItem): PMenuItem;
  265. {-StdWindowMenuItems-------------------------------------------------
  266. Returns a pointer to a list of menu items for a standard Window menu.
  267. The standard Window menu items are Tile, Cascade, Close All,
  268. Size/Move, Zoom, Next, Previous, and Close.
  269. 22Oct99 LdB
  270. ---------------------------------------------------------------------}
  271. FUNCTION StdWindowMenuItems (Next: PMenuItem): PMenuItem;
  272. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  273. { OBJECT REGISTER ROUTINES }
  274. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  275. {-RegisterApp--------------------------------------------------------
  276. Calls RegisterType for each of the object types defined in this unit.
  277. 22oct99 LdB
  278. ---------------------------------------------------------------------}
  279. PROCEDURE RegisterApp;
  280. {***************************************************************************}
  281. { OBJECT REGISTRATION }
  282. {***************************************************************************}
  283. {---------------------------------------------------------------------------}
  284. { TBackGround STREAM REGISTRATION }
  285. {---------------------------------------------------------------------------}
  286. CONST
  287. RBackGround: TStreamRec = (
  288. ObjType: idBackground; { Register id = 30 }
  289. VmtLink: TypeOf(TBackGround);
  290. Load: @TBackGround.Load; { Object load method }
  291. Store: @TBackGround.Store { Object store method }
  292. );
  293. {---------------------------------------------------------------------------}
  294. { TDeskTop STREAM REGISTRATION }
  295. {---------------------------------------------------------------------------}
  296. CONST
  297. RDeskTop: TStreamRec = (
  298. ObjType: idDesktop; { Register id = 31 }
  299. VmtLink: TypeOf(TDeskTop);
  300. Load: @TDeskTop.Load; { Object load method }
  301. Store: @TDeskTop.Store { Object store method }
  302. );
  303. {***************************************************************************}
  304. { INITIALIZED PUBLIC VARIABLES }
  305. {***************************************************************************}
  306. {---------------------------------------------------------------------------}
  307. { INITIALIZED PUBLIC VARIABLES }
  308. {---------------------------------------------------------------------------}
  309. CONST
  310. AppPalette: Integer = apColor; { Application colour }
  311. Desktop: PDeskTop = Nil; { Desktop object }
  312. MenuBar: PMenuView = Nil; { Application menu }
  313. StatusLine: PStatusLine = Nil; { App status line }
  314. Application : PApplication = Nil; { Application object }
  315. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  316. IMPLEMENTATION
  317. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  318. uses Mouse{,Resource};
  319. resourcestring sVideoFailed='Video initialization failed.';
  320. sTypeExitOnReturn='Type EXIT to return...';
  321. {***************************************************************************}
  322. { PRIVATE DEFINED CONSTANTS }
  323. {***************************************************************************}
  324. {***************************************************************************}
  325. { PRIVATE INITIALIZED VARIABLES }
  326. {***************************************************************************}
  327. {---------------------------------------------------------------------------}
  328. { INITIALIZED PRIVATE VARIABLES }
  329. {---------------------------------------------------------------------------}
  330. CONST Pending: TEvent = (What: evNothing); { Pending event }
  331. {---------------------------------------------------------------------------}
  332. { Tileable -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  333. {---------------------------------------------------------------------------}
  334. FUNCTION Tileable (P: PView): Boolean;
  335. BEGIN
  336. Tileable := (P^.Options AND ofTileable <> 0) AND { View is tileable }
  337. (P^.State AND sfVisible <> 0); { View is visible }
  338. END;
  339. {---------------------------------------------------------------------------}
  340. { ISqr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  341. {---------------------------------------------------------------------------}
  342. FUNCTION ISqr (X: Sw_Integer): Sw_Integer;
  343. VAR I: Sw_Integer;
  344. BEGIN
  345. I := 0; { Set value to zero }
  346. Repeat
  347. Inc(I); { Inc value }
  348. Until (I * I > X); { Repeat till Sqr > X }
  349. ISqr := I - 1; { Return result }
  350. END;
  351. {---------------------------------------------------------------------------}
  352. { MostEqualDivisors -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  353. {---------------------------------------------------------------------------}
  354. PROCEDURE MostEqualDivisors (N: Integer; Var X, Y: Integer; FavorY: Boolean);
  355. VAR I: Integer;
  356. BEGIN
  357. I := ISqr(N); { Int square of N }
  358. If ((N MOD I) <> 0) Then { Initial guess }
  359. If ((N MOD (I+1)) = 0) Then Inc(I); { Add one row/column }
  360. If (I < (N DIV I)) Then I := N DIV I; { In first page }
  361. If FavorY Then Begin { Horz preferred }
  362. X := N DIV I; { Calc x position }
  363. Y := I; { Set y position }
  364. End Else Begin { Vert preferred }
  365. Y := N DIV I; { Calc y position }
  366. X := I; { Set x position }
  367. End;
  368. END;
  369. {***************************************************************************}
  370. { OBJECT METHODS }
  371. {***************************************************************************}
  372. {--TBackGround--------------------------------------------------------------}
  373. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  374. {---------------------------------------------------------------------------}
  375. CONSTRUCTOR TBackGround.Init (Var Bounds: TRect; APattern: Char);
  376. BEGIN
  377. Inherited Init(Bounds); { Call ancestor }
  378. GrowMode := gfGrowHiX + gfGrowHiY; { Set grow modes }
  379. Pattern := APattern; { Hold pattern }
  380. END;
  381. {--TBackGround--------------------------------------------------------------}
  382. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  383. {---------------------------------------------------------------------------}
  384. CONSTRUCTOR TBackGround.Load (Var S: TStream);
  385. BEGIN
  386. Inherited Load(S); { Call ancestor }
  387. S.Read(Pattern, SizeOf(Pattern)); { Read pattern data }
  388. END;
  389. {--TBackGround--------------------------------------------------------------}
  390. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  391. {---------------------------------------------------------------------------}
  392. FUNCTION TBackGround.GetPalette: PPalette;
  393. CONST P: String[Length(CBackGround)] = CbackGround; { Always normal string }
  394. BEGIN
  395. GetPalette := PPalette(@P); { Return palette }
  396. END;
  397. {--TBackGround--------------------------------------------------------------}
  398. { DrawBackground -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  399. {---------------------------------------------------------------------------}
  400. PROCEDURE TBackground.Draw;
  401. VAR B: TDrawBuffer;
  402. BEGIN
  403. MoveChar(B, Pattern, GetColor($01), Size.X); { Fill draw buffer }
  404. WriteLine(0, 0, Size.X, Size.Y, B); { Draw to area }
  405. END;
  406. {--TBackGround--------------------------------------------------------------}
  407. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  408. {---------------------------------------------------------------------------}
  409. PROCEDURE TBackGround.Store (Var S: TStream);
  410. BEGIN
  411. TView.Store(S); { TView store called }
  412. S.Write(Pattern, SizeOf(Pattern)); { Write pattern data }
  413. END;
  414. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  415. { TDesktop OBJECT METHODS }
  416. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  417. {--TDesktop-----------------------------------------------------------------}
  418. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  419. {---------------------------------------------------------------------------}
  420. CONSTRUCTOR TDesktop.Init (Var Bounds: Objects.TRect);
  421. BEGIN
  422. Inherited Init(Bounds); { Call ancestor }
  423. GrowMode := gfGrowHiX + gfGrowHiY; { Set growmode }
  424. InitBackground; { Create background }
  425. If (Background <> Nil) Then Insert(Background); { Insert background }
  426. END;
  427. {--TDesktop-----------------------------------------------------------------}
  428. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  429. {---------------------------------------------------------------------------}
  430. CONSTRUCTOR TDesktop.Load (Var S: TStream);
  431. BEGIN
  432. Inherited Load(S); { Call ancestor }
  433. GetSubViewPtr(S, Background); { Load background }
  434. S.Read(TileColumnsFirst, SizeOf(TileColumnsFirst));{ Read data }
  435. END;
  436. {--TDesktop-----------------------------------------------------------------}
  437. { TileError -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  438. {---------------------------------------------------------------------------}
  439. PROCEDURE TDeskTop.TileError;
  440. BEGIN { Abstract method }
  441. END;
  442. {--TDesktop-----------------------------------------------------------------}
  443. { InitBackGround -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  444. {---------------------------------------------------------------------------}
  445. PROCEDURE TDesktop.InitBackground;
  446. CONST Ch: Char = #176;
  447. VAR R: TRect;
  448. BEGIN
  449. GetExtent(R); { Get desktop extents }
  450. BackGround := New(PBackground, Init(R, Ch)); { Insert a background }
  451. END;
  452. {--TDesktop-----------------------------------------------------------------}
  453. { Tile -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  454. {---------------------------------------------------------------------------}
  455. PROCEDURE TDeskTop.Tile (Var R: TRect);
  456. VAR NumCols, NumRows, NumTileable, LeftOver, TileNum: Integer;
  457. FUNCTION DividerLoc (Lo, Hi, Num, Pos: Integer): Integer;
  458. BEGIN
  459. DividerLoc := LongInt( LongInt(Hi - Lo) * Pos)
  460. DIV Num + Lo; { Calc position }
  461. END;
  462. PROCEDURE DoCountTileable (P: PView); {$IFNDEF PPC_FPC}FAR;{$ENDIF}
  463. BEGIN
  464. If Tileable(P) Then Inc(NumTileable); { Count tileable views }
  465. END;
  466. PROCEDURE CalcTileRect (Pos: Integer; Var NR: TRect);
  467. VAR X, Y, D: Integer;
  468. BEGIN
  469. D := (NumCols - LeftOver) * NumRows; { Calc d value }
  470. If (Pos<D) Then Begin
  471. X := Pos DIV NumRows; Y := Pos MOD NumRows; { Calc positions }
  472. End Else Begin
  473. X := (Pos - D) div (NumRows + 1) +
  474. (NumCols - LeftOver); { Calc x position }
  475. Y := (Pos - D) mod (NumRows + 1); { Calc y position }
  476. End;
  477. NR.A.X := DividerLoc(R.A.X, R.B.X, NumCols, X); { Top left x position }
  478. NR.B.X := DividerLoc(R.A.X, R.B.X, NumCols, X+1);{ Right x position }
  479. If (Pos >= D) Then Begin
  480. NR.A.Y := DividerLoc(R.A.Y, R.B.Y,NumRows+1,Y);{ Top y position }
  481. NR.B.Y := DividerLoc(R.A.Y, R.B.Y, NumRows+1,
  482. Y+1); { Bottom y position }
  483. End Else Begin
  484. NR.A.Y := DividerLoc(R.A.Y, R.B.Y,NumRows,Y); { Top y position }
  485. NR.B.Y := DividerLoc(R.A.Y, R.B.Y, NumRows,
  486. Y+1); { Bottom y position }
  487. End;
  488. END;
  489. PROCEDURE DoTile(P: PView); {$IFNDEF PPC_FPC}FAR;{$ENDIF}
  490. VAR PState: Word; R: TRect;
  491. BEGIN
  492. If Tileable(P) Then Begin
  493. CalcTileRect(TileNum, R); { Calc tileable area }
  494. PState := P^.State; { Hold view state }
  495. P^.State := P^.State AND NOT sfVisible; { Temp not visible }
  496. P^.Locate(R); { Locate view }
  497. P^.State := PState; { Restore view state }
  498. Dec(TileNum); { One less to tile }
  499. End;
  500. END;
  501. BEGIN
  502. NumTileable := 0; { Zero tileable count }
  503. ForEach(@DoCountTileable); { Count tileable views }
  504. If (NumTileable>0) Then Begin
  505. MostEqualDivisors(NumTileable, NumCols, NumRows,
  506. NOT TileColumnsFirst); { Do pre calcs }
  507. If ((R.B.X - R.A.X) DIV NumCols = 0) OR
  508. ((R.B.Y - R.A.Y) DIV NumRows = 0) Then TileError { Can't tile }
  509. Else Begin
  510. LeftOver := NumTileable MOD NumCols; { Left over count }
  511. TileNum := NumTileable-1; { Tileable views }
  512. ForEach(@DoTile); { Tile each view }
  513. DrawView; { Now redraw }
  514. End;
  515. End;
  516. END;
  517. {--TDesktop-----------------------------------------------------------------}
  518. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  519. {---------------------------------------------------------------------------}
  520. PROCEDURE TDesktop.Store (Var S: TStream);
  521. BEGIN
  522. TGroup.Store(S); { Call group store }
  523. PutSubViewPtr(S, Background); { Store background }
  524. S.Write(TileColumnsFirst,SizeOf(TileColumnsFirst));{ Write data }
  525. END;
  526. {--TDesktop-----------------------------------------------------------------}
  527. { Cascade -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  528. {---------------------------------------------------------------------------}
  529. PROCEDURE TDeskTop.Cascade (Var R: TRect);
  530. VAR CascadeNum: Integer; LastView: PView; Min, Max: TPoint;
  531. PROCEDURE DoCount (P: PView); {$IFNDEF PPC_FPC}FAR;{$ENDIF}
  532. BEGIN
  533. If Tileable(P) Then Begin
  534. Inc(CascadeNum); LastView := P; { Count cascadable }
  535. End;
  536. END;
  537. PROCEDURE DoCascade (P: PView); {$IFNDEF PPC_FPC}FAR;{$ENDIF}
  538. VAR PState: Word; NR: TRect;
  539. BEGIN
  540. If Tileable(P) AND (CascadeNum >= 0) Then Begin { View cascadable }
  541. NR.Copy(R); { Copy rect area }
  542. Inc(NR.A.X, CascadeNum); { Inc x position }
  543. Inc(NR.A.Y, CascadeNum); { Inc y position }
  544. PState := P^.State; { Hold view state }
  545. P^.State := P^.State AND NOT sfVisible; { Temp stop draw }
  546. P^.Locate(NR); { Locate the view }
  547. P^.State := PState; { Now allow draws }
  548. Dec(CascadeNum); { Dec count }
  549. End;
  550. END;
  551. BEGIN
  552. CascadeNum := 0; { Zero cascade count }
  553. ForEach(@DoCount); { Count cascadable }
  554. If (CascadeNum>0) Then Begin
  555. LastView^.SizeLimits(Min, Max); { Check size limits }
  556. If (Min.X > R.B.X - R.A.X - CascadeNum) OR
  557. (Min.Y > R.B.Y - R.A.Y - CascadeNum) Then
  558. TileError Else Begin { Check for error }
  559. Dec(CascadeNum); { One less view }
  560. ForEach(@DoCascade); { Cascade view }
  561. DrawView; { Redraw now }
  562. End;
  563. End;
  564. END;
  565. {--TDesktop-----------------------------------------------------------------}
  566. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 11May98 LdB }
  567. {---------------------------------------------------------------------------}
  568. PROCEDURE TDesktop.HandleEvent (Var Event: TEvent);
  569. BEGIN
  570. Inherited HandleEvent(Event); { Call ancestor }
  571. If (Event.What = evCommand) Then Begin
  572. Case Event.Command of { Command event }
  573. cmNext: FocusNext(False); { Focus next view }
  574. cmPrev: If (BackGround <> Nil) Then Begin
  575. If Valid(cmReleasedFocus) Then
  576. Current^.PutInFrontOf(Background); { Focus last view }
  577. End Else FocusNext(True); { Focus prior view }
  578. Else Exit;
  579. End;
  580. ClearEvent(Event); { Clear the event }
  581. End;
  582. END;
  583. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  584. { TProgram OBJECT METHODS }
  585. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  586. {--TProgram-----------------------------------------------------------------}
  587. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  588. {---------------------------------------------------------------------------}
  589. CONSTRUCTOR TProgram.Init;
  590. VAR R: TRect;
  591. BEGIN
  592. R.Assign(0, 0, ScreenWidth, ScreenHeight); { Full screen area }
  593. Inherited Init(R); { Call ancestor }
  594. Application := PApplication(@Self); { Set application ptr }
  595. InitScreen; { Initialize screen }
  596. State := sfVisible + sfSelected + sfFocused +
  597. sfModal + sfExposed; { Deafult states }
  598. Options := 0; { No options set }
  599. Size.X := ScreenWidth; { Set x size value }
  600. Size.Y := ScreenHeight; { Set y size value }
  601. InitStatusLine; { Create status line }
  602. InitMenuBar; { Create a bar menu }
  603. InitDesktop; { Create desktop }
  604. If (Desktop <> Nil) Then Insert(Desktop); { Insert desktop }
  605. If (StatusLine <> Nil) Then Insert(StatusLine); { Insert status line }
  606. If (MenuBar <> Nil) Then Insert(MenuBar); { Insert menu bar }
  607. END;
  608. {--TProgram-----------------------------------------------------------------}
  609. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  610. {---------------------------------------------------------------------------}
  611. DESTRUCTOR TProgram.Done;
  612. BEGIN
  613. { Do not free the Buffer of Video Unit }
  614. If Buffer = Views.PVideoBuf(VideoBuf) then
  615. Buffer:=nil;
  616. If (Desktop <> Nil) Then Dispose(Desktop, Done); { Destroy desktop }
  617. If (MenuBar <> Nil) Then Dispose(MenuBar, Done); { Destroy menu bar }
  618. If (StatusLine <> Nil) Then
  619. Dispose(StatusLine, Done); { Destroy status line }
  620. Application := Nil; { Clear application }
  621. Inherited Done; { Call ancestor }
  622. END;
  623. {--TProgram-----------------------------------------------------------------}
  624. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  625. {---------------------------------------------------------------------------}
  626. FUNCTION TProgram.GetPalette: PPalette;
  627. CONST P: Array[apColor..apMonochrome] Of String = (CAppColor, CAppBlackWhite,
  628. CAppMonochrome);
  629. BEGIN
  630. GetPalette := @P[AppPalette]; { Return palette }
  631. END;
  632. {--TProgram-----------------------------------------------------------------}
  633. { CanMoveFocus -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep97 LdB }
  634. {---------------------------------------------------------------------------}
  635. FUNCTION TProgram.CanMoveFocus: Boolean;
  636. BEGIN
  637. If (Desktop <> Nil) Then { Valid desktop view }
  638. CanMovefocus := DeskTop^.Valid(cmReleasedFocus) { Check focus move }
  639. Else CanMoveFocus := True; { No desktop who cares! }
  640. END;
  641. {--TProgram-----------------------------------------------------------------}
  642. { ValidView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  643. {---------------------------------------------------------------------------}
  644. FUNCTION TProgram.ValidView (P: PView): PView;
  645. BEGIN
  646. ValidView := Nil; { Preset failure }
  647. If (P <> Nil) Then Begin
  648. (*
  649. If LowMemory Then Begin { Check memroy }
  650. Dispose(P, Done); { Dispose view }
  651. OutOfMemory; { Call out of memory }
  652. Exit; { Now exit }
  653. End;
  654. *)
  655. If NOT P^.Valid(cmValid) Then Begin { Check view valid }
  656. Dispose(P, Done); { Dipose view }
  657. Exit; { Now exit }
  658. End;
  659. ValidView := P; { Return view }
  660. End;
  661. END;
  662. {--TProgram-----------------------------------------------------------------}
  663. { InsertWindow -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  664. {---------------------------------------------------------------------------}
  665. FUNCTION TProgram.InsertWindow (P: PWindow): PWindow;
  666. BEGIN
  667. InsertWindow := Nil; { Preset failure }
  668. If (ValidView(P) <> Nil) Then { Check view valid }
  669. If (CanMoveFocus) AND (Desktop <> Nil) { Can we move focus }
  670. Then Begin
  671. Desktop^.Insert(P); { Insert window }
  672. InsertWindow := P; { Return view ptr }
  673. End Else Dispose(P, Done); { Dispose view }
  674. END;
  675. {--TProgram-----------------------------------------------------------------}
  676. { ExecuteDialog -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  677. {---------------------------------------------------------------------------}
  678. FUNCTION TProgram.ExecuteDialog (P: PDialog; Data: Pointer): Word;
  679. VAR ExecResult: Word;
  680. BEGIN
  681. ExecuteDialog := cmCancel; { Preset cancel }
  682. If (ValidView(P) <> Nil) Then Begin { Check view valid }
  683. If (Data <> Nil) Then P^.SetData(Data^); { Set data }
  684. If (P <> Nil) Then P^.SelectDefaultView; { Select default }
  685. ExecResult := Desktop^.ExecView(P); { Execute view }
  686. If (ExecResult <> cmCancel) AND (Data <> Nil)
  687. Then P^.GetData(Data^); { Get data back }
  688. Dispose(P, Done); { Dispose of dialog }
  689. ExecuteDialog := ExecResult; { Return result }
  690. End;
  691. END;
  692. {--TProgram-----------------------------------------------------------------}
  693. { Run -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  694. {---------------------------------------------------------------------------}
  695. PROCEDURE TProgram.Run;
  696. BEGIN
  697. Execute; { Call execute }
  698. END;
  699. {--TProgram-----------------------------------------------------------------}
  700. { Idle -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Oct99 LdB }
  701. {---------------------------------------------------------------------------}
  702. PROCEDURE TProgram.Idle;
  703. BEGIN
  704. If (StatusLine <> Nil) Then StatusLine^.Update; { Update statusline }
  705. If CommandSetChanged Then Begin { Check command change }
  706. Message(@Self, evBroadcast, cmCommandSetChanged,
  707. Nil); { Send message }
  708. CommandSetChanged := False; { Clear flag }
  709. End;
  710. GiveUpTimeSlice;
  711. END;
  712. {--TProgram-----------------------------------------------------------------}
  713. { InitScreen -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  714. {---------------------------------------------------------------------------}
  715. PROCEDURE TProgram.InitScreen;
  716. {Initscreen is passive only, i.e. it detects the video size and capabilities
  717. after initalization. Active video initalization is the task of Tapplication.}
  718. BEGIN
  719. { the orginal code can't be used here because of the limited
  720. video unit capabilities, the mono modus can't be handled
  721. }
  722. Drivers.DetectVideo;
  723. if (ScreenMode.Col div ScreenMode.Row<2) then
  724. ShadowSize.X := 1
  725. else
  726. ShadowSize.X := 2;
  727. ShadowSize.Y := 1;
  728. ShowMarkers := False;
  729. if ScreenMode.color then
  730. AppPalette := apColor
  731. else
  732. AppPalette := apBlackWhite;
  733. Buffer := Views.PVideoBuf(VideoBuf);
  734. END;
  735. {procedure TProgram.DoneScreen;
  736. begin
  737. Drivers.DoneVideo;
  738. Buffer:=nil;
  739. end;}
  740. {--TProgram-----------------------------------------------------------------}
  741. { InitDeskTop -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  742. {---------------------------------------------------------------------------}
  743. PROCEDURE TProgram.InitDesktop;
  744. VAR R: TRect;
  745. BEGIN
  746. GetExtent(R); { Get view extent }
  747. If (MenuBar <> Nil) Then Inc(R.A.Y); { Adjust top down }
  748. If (StatusLine <> Nil) Then Dec(R.B.Y); { Adjust bottom up }
  749. DeskTop := New(PDesktop, Init(R)); { Create desktop }
  750. END;
  751. {--TProgram-----------------------------------------------------------------}
  752. { OutOfMemory -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 08May98 LdB }
  753. {---------------------------------------------------------------------------}
  754. PROCEDURE TProgram.OutOfMemory;
  755. BEGIN { Abstract method }
  756. END;
  757. {--TProgram-----------------------------------------------------------------}
  758. { InitMenuBar -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  759. {---------------------------------------------------------------------------}
  760. PROCEDURE TProgram.InitMenuBar;
  761. VAR R: TRect;
  762. BEGIN
  763. GetExtent(R); { Get view extents }
  764. R.B.Y := R.A.Y + 1; { One line high }
  765. MenuBar := New(PMenuBar, Init(R, Nil)); { Create menu bar }
  766. END;
  767. {--TProgram-----------------------------------------------------------------}
  768. { InitStatusLine -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  769. {---------------------------------------------------------------------------}
  770. PROCEDURE TProgram.InitStatusLine;
  771. VAR R: TRect;
  772. BEGIN
  773. GetExtent(R); { Get view extents }
  774. R.A.Y := R.B.Y - 1; { One line high }
  775. New(StatusLine, Init(R,
  776. NewStatusDef(0, $FFFF,
  777. NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
  778. StdStatusKeys(Nil)), Nil))); { Default status line }
  779. END;
  780. {--TProgram-----------------------------------------------------------------}
  781. { SetScreenMode -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Oct99 LdB }
  782. {---------------------------------------------------------------------------}
  783. PROCEDURE TProgram.SetScreenMode (Mode: Word);
  784. var
  785. R: TRect;
  786. begin
  787. HideMouse;
  788. { DoneMemory;}
  789. { InitMemory;}
  790. InitScreen;
  791. Buffer := Views.PVideoBuf(VideoBuf);
  792. R.Assign(0, 0, ScreenWidth, ScreenHeight);
  793. ChangeBounds(R);
  794. ShowMouse;
  795. end;
  796. procedure TProgram.SetScreenVideoMode(const Mode: TVideoMode);
  797. var
  798. R: TRect;
  799. begin
  800. hidemouse;
  801. { DoneMouse;
  802. DoneMemory;}
  803. ScreenMode:=Mode;
  804. { InitMouse;
  805. InitMemory;}
  806. { InitScreen;
  807. Warning: InitScreen calls DetectVideo which
  808. resets ScreenMode to old value, call it after
  809. video mode was changed instead of before }
  810. Video.SetVideoMode(Mode);
  811. { Update ScreenMode to new value }
  812. InitScreen;
  813. ScreenWidth:=Video.ScreenWidth;
  814. ScreenHeight:=Video.ScreenHeight;
  815. Buffer := Views.PVideoBuf(VideoBuf);
  816. R.Assign(0, 0, ScreenWidth, ScreenHeight);
  817. ChangeBounds(R);
  818. ShowMouse;
  819. end;
  820. {--TProgram-----------------------------------------------------------------}
  821. { PutEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  822. {---------------------------------------------------------------------------}
  823. PROCEDURE TProgram.PutEvent (Var Event: TEvent);
  824. BEGIN
  825. Pending := Event; { Set pending event }
  826. END;
  827. {--TProgram-----------------------------------------------------------------}
  828. { GetEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 10May98 LdB }
  829. {---------------------------------------------------------------------------}
  830. PROCEDURE TProgram.GetEvent (Var Event: TEvent);
  831. BEGIN
  832. Event.What := evNothing;
  833. If (Event.What = evNothing) Then Begin
  834. If (Pending.What <> evNothing) Then Begin { Pending event }
  835. Event := Pending; { Load pending event }
  836. Pending.What := evNothing; { Clear pending event }
  837. End Else Begin
  838. NextQueuedEvent(Event); { Next queued event }
  839. If (Event.What = evNothing) Then Begin
  840. GetKeyEvent(Event); { Fetch key event }
  841. If (Event.What = evKeyDown) then
  842. Begin
  843. if Event.keyCode = kbAltF12 then
  844. ReDraw;
  845. End;
  846. If (Event.What = evNothing) Then Begin { No mouse event }
  847. Drivers.GetMouseEvent(Event); { Load mouse event }
  848. If (Event.What = evNothing) Then
  849. begin
  850. {$IFNDEF HASAMIGA}
  851. { due to isses with the event handling in FV itself,
  852. we skip this here, and let the IDE to handle it
  853. directly on Amiga-like systems. The FV itself cannot
  854. handle the System Events anyway. (KB) }
  855. Drivers.GetSystemEvent(Event); { Load system event }
  856. If (Event.What = evNothing) Then
  857. {$ENDIF}
  858. Idle; { Idle if no event }
  859. end;
  860. End;
  861. End;
  862. End;
  863. End;
  864. END;
  865. {--TProgram-----------------------------------------------------------------}
  866. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  867. {---------------------------------------------------------------------------}
  868. PROCEDURE TProgram.HandleEvent (Var Event: TEvent);
  869. VAR C: Char;
  870. BEGIN
  871. If (Event.What = evKeyDown) Then Begin { Key press event }
  872. C := GetAltChar(Event.KeyCode); { Get alt char code }
  873. If (C >= '1') AND (C <= '9') Then
  874. If (Message(Desktop, evBroadCast, cmSelectWindowNum,
  875. Pointer(Byte(C) - $30)) <> Nil) { Select window }
  876. Then ClearEvent(Event); { Clear event }
  877. End;
  878. Inherited HandleEvent(Event); { Call ancestor }
  879. If (Event.What = evCommand) AND { Command event }
  880. (Event.Command = cmQuit) Then Begin { Quit command }
  881. EndModal(cmQuit); { Endmodal operation }
  882. ClearEvent(Event); { Clear event }
  883. End;
  884. END;
  885. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  886. { TApplication OBJECT METHODS }
  887. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  888. {--TApplication-------------------------------------------------------------}
  889. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  890. {---------------------------------------------------------------------------}
  891. CONSTRUCTOR TApplication.Init;
  892. BEGIN
  893. { InitMemory;} { Start memory up }
  894. { if not(InitResource) then
  895. begin
  896. writeln('Fatal: Can''t init resources');
  897. halt(1);
  898. end;}
  899. initkeyboard;
  900. if not Drivers.InitVideo then { Start video up }
  901. begin
  902. donekeyboard;
  903. writeln(sVideoFailed);
  904. halt(1);
  905. end;
  906. Drivers.InitEvents; { Start event drive }
  907. Drivers.InitSysError; { Start system error }
  908. InitHistory; { Start history up }
  909. Inherited Init; { Call ancestor }
  910. InitMsgBox;
  911. { init mouse and cursor }
  912. Video.SetCursorType(crHidden);
  913. Mouse.SetMouseXY(1,1);
  914. END;
  915. {--TApplication-------------------------------------------------------------}
  916. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  917. {---------------------------------------------------------------------------}
  918. DESTRUCTOR TApplication.Done;
  919. BEGIN
  920. Inherited Done; { Call ancestor }
  921. DoneHistory; { Close history }
  922. Drivers.DoneSysError; { Close system error }
  923. Drivers.DoneEvents; { Close event drive }
  924. drivers.donevideo;
  925. { DoneMemory;} { Close memory }
  926. donekeyboard;
  927. { DoneResource;}
  928. END;
  929. {--TApplication-------------------------------------------------------------}
  930. { Tile -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  931. {---------------------------------------------------------------------------}
  932. PROCEDURE TApplication.Tile;
  933. VAR R: TRect;
  934. BEGIN
  935. GetTileRect(R); { Tileable area }
  936. If (Desktop <> Nil) Then Desktop^.Tile(R); { Tile desktop }
  937. END;
  938. {--TApplication-------------------------------------------------------------}
  939. { Cascade -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  940. {---------------------------------------------------------------------------}
  941. PROCEDURE TApplication.Cascade;
  942. VAR R: TRect;
  943. BEGIN
  944. GetTileRect(R); { Cascade area }
  945. If (Desktop <> Nil) Then Desktop^.Cascade(R); { Cascade desktop }
  946. END;
  947. {--TApplication-------------------------------------------------------------}
  948. { DosShell -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Oct99 LdB }
  949. {---------------------------------------------------------------------------}
  950. PROCEDURE TApplication.DosShell;
  951. {$ifdef unix}
  952. var s:string;
  953. {$endif}
  954. BEGIN { Compatability only }
  955. DoneSysError;
  956. DoneEvents;
  957. drivers.donevideo;
  958. drivers.donekeyboard;
  959. { DoneDosMem;}
  960. WriteShellMsg;
  961. {$ifdef Unix}
  962. s:=getenv('SHELL');
  963. if s='' then
  964. s:='/bin/sh';
  965. exec(s,'');
  966. {$else}
  967. SwapVectors;
  968. Exec(GetEnv('COMSPEC'), '');
  969. SwapVectors;
  970. {$endif}
  971. { InitDosMem;}
  972. drivers.initkeyboard;
  973. drivers.initvideo;
  974. Video.SetCursorType(crHidden);
  975. InitScreen;
  976. InitEvents;
  977. InitSysError;
  978. Redraw;
  979. END;
  980. {--TApplication-------------------------------------------------------------}
  981. { GetTileRect -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  982. {---------------------------------------------------------------------------}
  983. PROCEDURE TApplication.GetTileRect (Var R: TRect);
  984. BEGIN
  985. If (DeskTop <> Nil) Then Desktop^.GetExtent(R) { Desktop extents }
  986. Else GetExtent(R); { Our extents }
  987. END;
  988. {--TApplication-------------------------------------------------------------}
  989. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  990. {---------------------------------------------------------------------------}
  991. PROCEDURE TApplication.HandleEvent (Var Event: TEvent);
  992. BEGIN
  993. Inherited HandleEvent(Event); { Call ancestor }
  994. If (Event.What = evCommand) Then Begin
  995. Case Event.Command Of
  996. cmTile: Tile; { Tile request }
  997. cmCascade: Cascade; { Cascade request }
  998. cmDosShell: DosShell; { DOS shell request }
  999. Else Exit; { Unhandled exit }
  1000. End;
  1001. ClearEvent(Event); { Clear the event }
  1002. End;
  1003. END;
  1004. procedure TApplication.WriteShellMsg;
  1005. begin
  1006. writeln(sTypeExitOnReturn);
  1007. end;
  1008. {***************************************************************************}
  1009. { INTERFACE ROUTINES }
  1010. {***************************************************************************}
  1011. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1012. { STANDARD MENU AND STATUS LINES ROUTINES }
  1013. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1014. {---------------------------------------------------------------------------}
  1015. { StdStatusKeys -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  1016. {---------------------------------------------------------------------------}
  1017. FUNCTION StdStatusKeys (Next: PStatusItem): PStatusItem;
  1018. BEGIN
  1019. StdStatusKeys :=
  1020. NewStatusKey('', kbAltX, cmQuit,
  1021. NewStatusKey('', kbF10, cmMenu,
  1022. NewStatusKey('', kbAltF3, cmClose,
  1023. NewStatusKey('', kbF5, cmZoom,
  1024. NewStatusKey('', kbCtrlF5, cmResize,
  1025. NewStatusKey('', kbF6, cmNext,
  1026. NewStatusKey('', kbShiftF6, cmPrev,
  1027. Next)))))));
  1028. END;
  1029. {---------------------------------------------------------------------------}
  1030. { StdFileMenuItems -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  1031. {---------------------------------------------------------------------------}
  1032. FUNCTION StdFileMenuItems (Next: PMenuItem): PMenuItem;
  1033. BEGIN
  1034. StdFileMenuItems :=
  1035. NewItem('~N~ew', '', kbNoKey, cmNew, hcNew,
  1036. NewItem('~O~pen...', 'F3', kbF3, cmOpen, hcOpen,
  1037. NewItem('~S~ave', 'F2', kbF2, cmSave, hcSave,
  1038. NewItem('S~a~ve as...', '', kbNoKey, cmSaveAs, hcSaveAs,
  1039. NewItem('Save a~l~l', '', kbNoKey, cmSaveAll, hcSaveAll,
  1040. NewLine(
  1041. NewItem('~C~hange dir...', '', kbNoKey, cmChangeDir, hcChangeDir,
  1042. NewItem('OS shell', '', kbNoKey, cmDosShell, hcDosShell,
  1043. NewItem('E~x~it', 'Alt+X', kbAltX, cmQuit, hcExit,
  1044. Next)))))))));
  1045. END;
  1046. {---------------------------------------------------------------------------}
  1047. { StdEditMenuItems -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  1048. {---------------------------------------------------------------------------}
  1049. FUNCTION StdEditMenuItems (Next: PMenuItem): PMenuItem;
  1050. BEGIN
  1051. StdEditMenuItems :=
  1052. NewItem('~U~ndo', '', kbAltBack, cmUndo, hcUndo,
  1053. NewLine(
  1054. NewItem('Cu~t~', 'Shift+Del', kbShiftDel, cmCut, hcCut,
  1055. NewItem('~C~opy', 'Ctrl+Ins', kbCtrlIns, cmCopy, hcCopy,
  1056. NewItem('~P~aste', 'Shift+Ins', kbShiftIns, cmPaste, hcPaste,
  1057. NewItem('C~l~ear', 'Ctrl+Del', kbCtrlDel, cmClear, hcClear,
  1058. Next))))));
  1059. END;
  1060. {---------------------------------------------------------------------------}
  1061. { StdWindowMenuItems -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  1062. {---------------------------------------------------------------------------}
  1063. FUNCTION StdWindowMenuItems (Next: PMenuItem): PMenuItem;
  1064. BEGIN
  1065. StdWindowMenuItems :=
  1066. NewItem('~T~ile', '', kbNoKey, cmTile, hcTile,
  1067. NewItem('C~a~scade', '', kbNoKey, cmCascade, hcCascade,
  1068. NewItem('Cl~o~se all', '', kbNoKey, cmCloseAll, hcCloseAll,
  1069. NewLine(
  1070. NewItem('~S~ize/Move','Ctrl+F5', kbCtrlF5, cmResize, hcResize,
  1071. NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcZoom,
  1072. NewItem('~N~ext', 'F6', kbF6, cmNext, hcNext,
  1073. NewItem('~P~revious', 'Shift+F6', kbShiftF6, cmPrev, hcPrev,
  1074. NewItem('~C~lose', 'Alt+F3', kbAltF3, cmClose, hcClose,
  1075. Next)))))))));
  1076. END;
  1077. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1078. { OBJECT REGISTER ROUTINES }
  1079. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1080. {---------------------------------------------------------------------------}
  1081. { RegisterApp -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  1082. {---------------------------------------------------------------------------}
  1083. PROCEDURE RegisterApp;
  1084. BEGIN
  1085. RegisterType(RBackground); { Register background }
  1086. RegisterType(RDesktop); { Register desktop }
  1087. END;
  1088. END.