home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TPASCAL3.ZIP / TVDEMOS.ZIP / TVRDEMO.PAS < prev    next >
Pascal/Delphi Source File  |  1991-06-11  |  12KB  |  519 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Pascal 6.0                             }
  4. {   Turbo Vision Demo                            }
  5. {   Copyright (c) 1990 by Borland International  }
  6. {                                                }
  7. {************************************************}
  8.  
  9. { Turbo Vision demo program. This program demonstrates the use of
  10.   resource files and overlays to build a Turbo Vision application.
  11.   This program duplicates the functionality of TVDEMO but gets the
  12.   definition of menus, status line, and various dialogs off of a
  13.   resource file. GENRDEMO.PAS generates the resource file that is used
  14.   by this program.  To build this program, execute the batch file,
  15.   MKRDEMO.BAT which will create the resource file and overlay file
  16.   and copy them into the TVRDEMO.EXE file where this program looks
  17.   for them.
  18. }
  19.  
  20. program TVRDemo;
  21.  
  22. {$X+,S-}
  23. {$M 16384,8192,655360}
  24.  
  25. uses
  26.   Dos, Objects, Drivers, Memory, Views, Menus, Dialogs, StdDlg, MsgBox, App,
  27.   DemoCmds, Gadgets, Puzzle, Calendar, AsciiTab, Calc, FViewer, HelpFile,
  28.   DemoHelp, ColorSel, MouseDlg, Overlay;
  29.  
  30. {$O Views}
  31. {$O Menus}
  32. {$O Dialogs}
  33. {$O StdDlg}
  34. {$O MsgBox}
  35. {$O App}
  36. {$O HelpFile}
  37. {$O Gadgets}
  38. {$O Puzzle}
  39. {$O Calendar}
  40. {$O AsciiTab}
  41. {$O Calc}
  42. {$O FViewer}
  43. {$O ColorSel}
  44. {$O MouseDlg}
  45.  
  46. type
  47.  
  48.   { TTVDemo }
  49.  
  50.   PTVDemo = ^TTVDemo;
  51.   TTVDemo = object(TApplication)
  52.     Clock: PClockView;
  53.     Heap: PHeapView;
  54.     constructor Init;
  55.     procedure FileOpen(WildCard: PathStr);
  56.     procedure GetEvent(var Event: TEvent); virtual;
  57.     function GetPalette: PPalette; virtual;
  58.     procedure HandleEvent(var Event: TEvent); virtual;
  59.     procedure Idle; virtual;
  60.     procedure InitMenuBar; virtual;
  61.     procedure InitStatusLine; virtual;
  62.     procedure LoadDesktop(var S: TStream);
  63.     procedure OutOfMemory; virtual;
  64.     procedure StoreDesktop(var S: TStream);
  65.     procedure ViewFile(FileName: PathStr);
  66.   end;
  67.  
  68. type
  69.   PProtectedStream = ^TProtectedStream;
  70.   TProtectedStream = object(TBufStream)
  71.     procedure Error(Code, Info: Integer); virtual;
  72.   end;
  73.  
  74. var
  75.   EXEName: PathStr;
  76.   RezFile: TResourceFile;
  77.   RezStream: PStream;
  78.  
  79. { CalcHelpName }
  80.  
  81. function CalcHelpName: String;
  82. var
  83.   Dir: DirStr;
  84.   Name: NameStr;
  85.   Ext: ExtStr;
  86. begin
  87.   FSplit(EXEName, Dir, Name, Ext);
  88.   if Dir[Length(Dir)] = '\' then Dec(Dir[0]);
  89.   CalcHelpName := FSearch('DEMOHELP.HLP', Dir);
  90. end;
  91.  
  92. { TProtectedStream }
  93.  
  94. procedure TProtectedStream.Error(Code, Info: Integer);
  95. begin
  96.   RunError(255);
  97. end;
  98.  
  99. { TTVDemo }
  100. constructor TTVDemo.Init;
  101. var
  102.   R: TRect;
  103.   I: Integer;
  104.   FileName: PathStr;
  105. begin
  106.   { Initialize resource file }
  107.  
  108.   RezStream := New(PProtectedStream, Init(EXEName, stOpenRead, 4096));
  109.   RezFile.Init(RezStream);
  110.  
  111.   RegisterObjects;
  112.   RegisterViews;
  113.   RegisterMenus;
  114.   RegisterDialogs;
  115.   RegisterApp;
  116.   RegisterStdDlg;
  117.   RegisterColorSel;
  118.  
  119.   RegisterHelpFile;
  120.   RegisterPuzzle;
  121.   RegisterCalendar;
  122.   RegisterAsciiTab;
  123.   RegisterCalc;
  124.   RegisterFViewer;
  125.  
  126.   TApplication.Init;
  127.  
  128.   { Initialize demo gadgets }
  129.  
  130.   GetExtent(R);
  131.   R.A.X := R.B.X - 9; R.B.Y := R.A.Y + 1;
  132.   Clock := New(PClockView, Init(R));
  133.   Insert(Clock);
  134.  
  135.   GetExtent(R);
  136.   Dec(R.B.X);
  137.   R.A.X := R.B.X - 9; R.A.Y := R.B.Y - 1;
  138.   Heap := New(PHeapView, Init(R));
  139.   Insert(Heap);
  140.  
  141.   for I := 1 to ParamCount do
  142.   begin
  143.     FileName := ParamStr(I);
  144.     if FileName[Length(FileName)] = '\' then
  145.       FileName := FileName + '*.*';
  146.     if (Pos('?', FileName) = 0) and (Pos('*', FileName) = 0) then
  147.       ViewFile(FExpand(FileName))
  148.     else FileOpen(FileName);
  149.   end;
  150. end;
  151.  
  152. procedure TTVDemo.FileOpen(WildCard: PathStr);
  153. var
  154.   D: PFileDialog;
  155.   FileName: PathStr;
  156. begin
  157.   D := PFileDialog(RezFile.Get('FileOpenDialog'));
  158.   if ValidView(D) <> nil then
  159.   begin
  160.     if Desktop^.ExecView(D) <> cmCancel then
  161.     begin
  162.       D^.GetFileName(FileName);
  163.       ViewFile(FileName);
  164.     end;
  165.     Dispose(D, Done);
  166.   end;
  167. end;
  168.  
  169. procedure TTVDemo.GetEvent(var Event: TEvent);
  170. var
  171.   W: PWindow;
  172.   HFile: PHelpFile;
  173.   HelpStrm: PDosStream;
  174. const
  175.   HelpInUse: Boolean = False;
  176. begin
  177.   TApplication.GetEvent(Event);
  178.   case Event.What of
  179.     evCommand:
  180.       if (Event.Command = cmHelp) and not HelpInUse then
  181.       begin
  182.         HelpInUse := True;
  183.         HelpStrm := New(PDosStream, Init(CalcHelpName, stOpenRead));
  184.         HFile := New(PHelpFile, Init(HelpStrm));
  185.         if HelpStrm^.Status <> stOk then
  186.         begin
  187.           MessageBox('Could not open help file.', nil, mfError + mfOkButton);
  188.           Dispose(HFile, Done);
  189.         end
  190.         else
  191.         begin
  192.           W := New(PHelpWindow,Init(HFile, GetHelpCtx));
  193.           if ValidView(W) <> nil then
  194.           begin
  195.             ExecView(W);
  196.             Dispose(W, Done);
  197.           end;
  198.           ClearEvent(Event);
  199.         end;
  200.         HelpInUse := False;
  201.       end;
  202.     evMouseDown:
  203.       if Event.Buttons <> 1 then Event.What := evNothing;
  204.   end;
  205. end;
  206.  
  207. function TTVDemo.GetPalette: PPalette;
  208. const
  209.   CNewColor = CColor + CHelpColor;
  210.   CNewBlackWhite = CBlackWhite + CHelpBlackWhite;
  211.   CNewMonochrome = CMonochrome + CHelpMonochrome;
  212.   P: array[apColor..apMonochrome] of string[Length(CNewColor)] =
  213.     (CNewColor, CNewBlackWhite, CNewMonochrome);
  214. begin
  215.   GetPalette := @P[AppPalette];
  216. end;
  217.  
  218. procedure TTVDemo.HandleEvent(var Event: TEvent);
  219.  
  220. procedure ChangeDir;
  221. var
  222.   D: PChDirDialog;
  223. begin
  224.   D := PChDirDialog(RezFile.Get('ChDirDialog'));
  225.   if ValidView(D) <> nil then
  226.   begin
  227.     DeskTop^.ExecView(D);
  228.     Dispose(D, Done);
  229.   end;
  230. end;
  231.  
  232. procedure Tile;
  233. var
  234.   R: TRect;
  235. begin
  236.   Desktop^.GetExtent(R);
  237.   Desktop^.Tile(R);
  238. end;
  239.  
  240. procedure Cascade;
  241. var
  242.   R: TRect;
  243. begin
  244.   Desktop^.GetExtent(R);
  245.   Desktop^.Cascade(R);
  246. end;
  247.  
  248. procedure Puzzle;
  249. var
  250.   P: PPuzzleWindow;
  251. begin
  252.   P := New(PPuzzleWindow, Init);
  253.   P^.HelpCtx := hcPuzzle;
  254.   Desktop^.Insert(ValidView(P));
  255. end;
  256.  
  257. procedure Calendar;
  258. var
  259.   P: PCalendarWindow;
  260. begin
  261.   P := New(PCalendarWindow, Init);
  262.   P^.HelpCtx := hcCalendar;
  263.   Desktop^.Insert(ValidView(P));
  264. end;
  265.  
  266. procedure About;
  267. var
  268.   D: PDialog;
  269.   Control: PView;
  270.   R: TRect;
  271. begin
  272.   D := PDialog(RezFile.Get('AboutDialog'));
  273.   if ValidView(D) <> nil then
  274.   begin
  275.     Desktop^.ExecView(D);
  276.     Dispose(D, Done);
  277.   end;
  278. end;
  279.  
  280. procedure AsciiTab;
  281. var
  282.   P: PAsciiChart;
  283. begin
  284.   P := New(PAsciiChart, Init);
  285.   P^.HelpCtx := hcAsciiTable;
  286.   Desktop^.Insert(ValidView(P));
  287. end;
  288.  
  289. procedure Calculator;
  290. var
  291.   P: PCalculator;
  292. begin
  293.   P := New(PCalculator, Init);
  294.   P^.HelpCtx := hcCalculator;
  295.   if ValidView(P) <> nil then
  296.     Desktop^.Insert(P);
  297. end;
  298.  
  299. procedure Colors;
  300. var
  301.   D: PColorDialog;
  302. begin
  303.   D := PColorDialog(RezFile.Get('ColorSelectDialog'));
  304.   if ValidView(D) <> nil then
  305.   begin
  306.     D^.SetData(Application^.GetPalette^);
  307.     if Desktop^.ExecView(D) <> cmCancel then
  308.     begin
  309.       Application^.GetPalette^ := D^.Pal;
  310.       DoneMemory;  { Dispose all group buffers }
  311.       ReDraw;      { Redraw application with new palette }
  312.     end;
  313.     Dispose(D, Done);
  314.   end;
  315. end;
  316.  
  317. procedure Mouse;
  318. var
  319.   D: PDialog;
  320. begin
  321.   D := New(PMouseDialog, Init);
  322.   D^.HelpCtx := hcOMMouseDBox;
  323.   if ValidView(D) <> nil then
  324.   begin
  325.     D^.SetData(MouseReverse);
  326.     if Desktop^.ExecView(D) <> cmCancel then
  327.       D^.GetData(MouseReverse);
  328.   end;
  329. end;
  330.  
  331. procedure DosShell;
  332. begin
  333.   DoneSysError;
  334.   DoneEvents;
  335.   DoneVideo;
  336.   DoneMemory;
  337.   SetMemTop(HeapPtr);
  338.   PrintStr('Type EXIT to return...');
  339.   SwapVectors;
  340.   Exec(GetEnv('COMSPEC'), '');
  341.   SwapVectors;
  342.   SetMemTop(HeapEnd);
  343.   InitMemory;
  344.   InitVideo;
  345.   InitEvents;
  346.   InitSysError;
  347.   Redraw;
  348. end;
  349.  
  350. procedure RetrieveDesktop;
  351. var
  352.   S: PStream;
  353. begin
  354.   S := New(PBufStream, Init('TVDEMO.DSK', stOpenRead, 1024));
  355.   if LowMemory then OutOfMemory
  356.   else if S^.Status <> stOk then
  357.     MessageBox('Could not open desktop file', nil, mfOkButton + mfError)
  358.   else
  359.   begin
  360.     LoadDesktop(S^);
  361.     if S^.Status <> stOk then
  362.       MessageBox('Error reading desktop file', nil, mfOkButton + mfError);
  363.   end;
  364.   Dispose(S, Done);
  365. end;
  366.  
  367. procedure SaveDesktop;
  368. var
  369.   S: PStream;
  370.   F: File;
  371. begin
  372.   S := New(PBufStream, Init('TVDEMO.DSK', stCreate, 1024));
  373.   if not LowMemory and (S^.Status = stOk) then
  374.   begin
  375.     StoreDesktop(S^);
  376.     if S^.Status <> stOk then
  377.     begin
  378.       MessageBox('Could not create TVDEMO.DSK.', nil, mfOkButton + mfError);
  379.       {$I-}
  380.       Dispose(S, Done);
  381.       Assign(F, 'TVDEMO.DSK');
  382.       Erase(F);
  383.       Exit;
  384.     end;
  385.   end;
  386.   Dispose(S, Done);
  387. end;
  388.  
  389.  
  390. begin
  391.   TApplication.HandleEvent(Event);
  392.   case Event.What of
  393.     evCommand:
  394.       begin
  395.         case Event.Command of
  396.           cmFOpen: FileOpen('*.*');
  397.           cmChDir: ChangeDir;
  398.           cmCascade: Cascade;
  399.           cmTile: Tile;
  400.           cmAbout: About;
  401.           cmPuzzle: Puzzle;
  402.           cmCalendar: Calendar;
  403.           cmAsciiTab: AsciiTab;
  404.           cmCalculator: Calculator;
  405.           cmColors: Colors;
  406.           cmMouse: Mouse;
  407.           cmDosShell: DosShell;
  408.           cmSaveDesktop: SaveDesktop;
  409.           cmRetrieveDesktop: RetrieveDesktop;
  410.         else
  411.           Exit;
  412.         end;
  413.         ClearEvent(Event);
  414.       end;
  415.   end;
  416. end;
  417.  
  418. procedure TTVDemo.Idle;
  419.  
  420. function IsTileable(P: PView): Boolean; far;
  421. begin
  422.   IsTileable := P^.Options and ofTileable <> 0;
  423. end;
  424.  
  425. begin
  426.   TApplication.Idle;
  427.   Clock^.Update;
  428.   Heap^.Update;
  429.   if Desktop^.FirstThat(@IsTileable) <> nil then
  430.     EnableCommands([cmTile, cmCascade])
  431.   else
  432.     DisableCommands([cmTile, cmCascade]);
  433. end;
  434.  
  435. procedure TTVDemo.InitMenuBar;
  436. begin
  437.   MenuBar := PMenuBar(RezFile.Get('MenuBar'));
  438. end;
  439.  
  440. procedure TTVDemo.InitStatusLine;
  441. begin
  442.   StatusLine := PStatusLine(RezFile.Get('StatusLine'));
  443. end;
  444.  
  445. procedure TTVDemo.OutOfMemory;
  446. begin
  447.   MessageBox('Not enough memory available to complete operation.',
  448.     nil, mfError + mfOkButton);
  449. end;
  450.  
  451. { Since the safety pool is only large enough to guarantee that allocating
  452.   a window will not run out of memory, loading the entire desktop without
  453.   checking LowMemory could cause a heap error.  This means that each
  454.   window should be read individually, instead of using Desktop's Load.
  455. }
  456.  
  457. procedure TTVDemo.LoadDesktop(var S: TStream);
  458. var
  459.   P: PView;
  460.  
  461. procedure CloseView(P: PView); far;
  462. begin
  463.   Message(P, evCommand, cmClose, nil);
  464. end;
  465.  
  466. begin
  467.   if Desktop^.Valid(cmClose) then
  468.   begin
  469.     Desktop^.ForEach(@CloseView); { Clear the desktop }
  470.     repeat
  471.       P := PView(S.Get);
  472.       Desktop^.InsertBefore(ValidView(P), Desktop^.Last);
  473.     until P = nil;
  474.   end;
  475. end;
  476.  
  477. procedure TTVDemo.StoreDesktop(var S: TStream);
  478.  
  479. procedure WriteView(P: PView); far;
  480. begin
  481.   if P <> Desktop^.Last then S.Put(P);
  482. end;
  483.  
  484. begin
  485.   Desktop^.ForEach(@WriteView);
  486.   S.Put(nil);
  487. end;
  488.  
  489. procedure TTVDemo.ViewFile(FileName: PathStr);
  490. var
  491.   W: PWindow;
  492. begin
  493.   W := New(PFileWindow,Init(FileName));
  494.   W^.HelpCtx := hcViewer;
  495.   if ValidView(W) <> nil then
  496.     Desktop^.Insert(W);
  497. end;
  498.  
  499. var
  500.   Demo: TTVDemo;
  501. begin
  502.   if Lo(DosVersion) >= 3 then EXEName := ParamStr(0)
  503.   else
  504.   begin
  505.     EXEName := FSearch('TVDEMO.EXE', GetEnv('PATH'));
  506.     if EXEName = '' then PrintStr('TVDEMO.EXE could not be found.'#13#10);
  507.   end;
  508.   OvrInit(EXEName);
  509.   OvrSetBuf(58 * 1024);
  510.   if OvrResult <> ovrOk then
  511.   begin
  512.     PrintStr('No overlays found in .EXE file.  Must use MKRDEMO.BAT to build.'#13#10);
  513.     Halt(1);
  514.   end;
  515.   Demo.Init;
  516.   Demo.Run;
  517.   Demo.Done;
  518. end.
  519.