app.pas 55 KB

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