home *** CD-ROM | disk | FTP | other *** search
/ swCHIP 1991 January / swCHIP_95-1.bin / chip / tvgenpas / demo3pas.exe / SUPPLY3.PAS < prev    next >
Pascal/Delphi Source File  |  1994-12-01  |  16KB  |  638 lines

  1. {**************************************************************************}
  2. {            Unit for use with TVGen 3.0 source code generator             }
  3. {                     (c) 1992,94 BOCIAN Software                          }
  4. {**************************************************************************}
  5. {$X+}
  6.  
  7. unit Supply3;
  8.  
  9. interface
  10. uses Drivers, Menus, Objects, Views, Dialogs;
  11.  
  12. const
  13.       MaxStars = 20;
  14.  
  15. type
  16.       TChars = set of Char;
  17.  
  18.       PCharacterLine = ^TCharacterLine;
  19.       TCharacterLine = object(TInputLine)
  20.                  LineCharSet : TChars;
  21.                  constructor Init(var Bounds: TRect; AMaxLen: Integer; ASet : TChars);
  22.                  procedure HandleEvent(var Event: TEvent); virtual;
  23.                  constructor Load(var S : TStream);
  24.                  procedure Store(var S: TStream);
  25.                end;
  26.  
  27.       PFramedView = ^TFramedView;
  28.       TFramedView = object(TView)
  29.                  constructor Init(Bounds : TRect);
  30.                end;
  31.  
  32.       PComboBox = ^TComboBox;
  33.       TComboBox = object(TView)
  34.                     Strings : PStringCollection;
  35.                     Value   : Word;
  36.                     constructor Load(var S : TStream);
  37.                     procedure Store(var S : TStream);
  38.                     constructor Init(var Bounds : TRect; AStrings : PSItem);
  39.                     destructor Done; virtual;
  40.                     procedure Draw; virtual;
  41.                     procedure HandleEvent(var Event : TEvent); virtual;
  42.                     function GetPalette : PPalette; virtual;
  43.                     procedure SetState(AState : Word; Enable : Boolean); virtual;
  44.                     procedure GetData(var Rec); virtual;
  45.                     procedure SetData(var Rec); virtual;
  46.                     function DataSize : Word; virtual;
  47.                   end;
  48.  
  49.       PComboViewer = ^TComboViewer;
  50.       TComboViewer = object(TListViewer)
  51.                     List : PStringCollection;
  52.                     constructor Init(var Bounds: TRect;AHScrollBar,AVScrollBar: PScrollBar; AList: PStringCollection);
  53.                     procedure HandleEvent(var Event : TEvent); virtual;
  54.                     function GetPalette : PPalette; virtual;
  55.                     function GetText(Item,MaxLen : integer): string; virtual;
  56.                     function GetWidth : integer;
  57.                   end;
  58.  
  59.       PComboWindow = ^TComboWindow;
  60.       TComboWindow = object(TWindow)
  61.                        Viewer   : PComboViewer;
  62.                        ComboBox : PComboBox;
  63.                        constructor Init(var Bounds : TRect; ACombo : PComboBox);
  64.                        function GetPalette : PPalette; virtual;
  65.                        function GetNumber : integer; virtual;
  66.                      end;
  67.  
  68.  
  69.       PHintStatusLine = ^THintStatusLine;
  70.       THintStatusLine = object(TStatusLine)
  71.                  Hints : PStringList;
  72.                  constructor Load(var S : TStream);
  73.                  procedure Store(var S : TStream);
  74.                  procedure NewHintList(AList : PStringList);
  75.                  function Hint(AHelpCtx : Word): string; virtual;
  76.                end;
  77.  
  78.       PLongint = ^Longint;
  79.  
  80.       TStar = record
  81.                  XPos,YPos : Byte;
  82.                  XDir,YDir : ShortInt;
  83.                  Color     : Byte;
  84.               end;
  85.  
  86.       PScreenSaver = ^TScreenSaver;
  87.       TScreenSaver = object(TView)
  88.                        LastTick      : Longint;
  89.                        LastEventTick : Longint;
  90.                        Delay         : Word;
  91.                        Active        : Boolean;
  92.                        Tick          : PLongint;
  93.                        Stars         : array[1..MaxStars] of TStar;
  94.                        constructor Init(var Bounds : TRect; ADelay : Word);
  95.                        procedure Update; virtual;
  96.                        procedure Draw; virtual;
  97.                        procedure Setup; virtual;
  98.                        procedure ShutDown; virtual;
  99.                        procedure CheckEvent(var Event : TEvent); virtual;
  100.                      end;
  101.  
  102. const
  103.  
  104.      RHintStatusLine : TStreamRec = (
  105.       ObjType : 58000;
  106.       VmtLink : Ofs(TypeOf(THintStatusLine)^);
  107.       Load    : @THintStatusLine.Load;
  108.       Store   : @THintStatusLine.Store);
  109.  
  110.      RCharacterLine : TStreamRec = (
  111.       ObjType : 58001;
  112.       VmtLink : Ofs(TypeOf(TCharacterLine)^);
  113.       Load    : @TCharacterLine.Load;
  114.       Store   : @TCharacterLine.Store);
  115.  
  116.      RFramedView : TStreamRec = (
  117.       ObjType : 58002;
  118.       VmtLink : Ofs(TypeOf(TFramedView)^);
  119.       Load    : @TFramedView.Load;
  120.       Store   : @TFramedView.Store);
  121.  
  122.      RComboBox : TStreamRec = (
  123.       ObjType : 58003;
  124.       VmtLink : Ofs(TypeOf(TComboBox)^);
  125.       Load    : @TComboBox.Load;
  126.       Store   : @TComboBox.Store);
  127.  
  128.       CComboBox    = #16#17#22#23;
  129.       CComboWindow = #16#17#17#4#5#16#27;
  130.       CComboViewer = #6#6#7#6#6;
  131.  
  132.       hcHelpWindowActive = $FEFF;               { Help Window is open }
  133.  
  134.  
  135. function  OpenFile(Wild,Title : string): string;
  136. procedure ChangeDir;
  137. function  MakeStringList(AFileName : string): PStrListMaker;
  138. function  GetRscString(ANumber : Word): string;
  139. function  Min(X, Y: Integer): Integer;
  140. function  Max(X, Y: Integer): Integer;
  141. procedure RegisterSupply3;
  142.  
  143. var RscStringList : PStringList;
  144.  
  145. implementation
  146. uses StdDlg, Dos, App;
  147.  
  148. {****************** TScreenSaver *******************}
  149.  
  150. constructor TScreenSaver.Init;
  151. var i : Byte;
  152. begin
  153.   TView.Init(Bounds);
  154.   Delay:=Round(ADelay*18.2);
  155.   Active:=False;
  156. {$IFDEF VER70}
  157.   Tick:=Ptr(Seg0040,$6C);
  158. {$ELSE}
  159.   Tick:=Ptr($40,$6C);
  160. {$ENDIF}
  161.   LastEventTick:=Tick^;
  162.   Hide;
  163.   for i:=1 to MaxStars do
  164.    with Stars[i] do
  165.      begin
  166.        XPos:=Random(ScreenWidth);
  167.        YPos:=Random(ScreenHeight);
  168.        XDir:=Random(2); if XDir=0 then XDir:=-1;
  169.        YDir:=Random(2); if YDir=0 then YDir:=-1;
  170.        Color:=Random(15)+1;
  171.      end;
  172. end;
  173.  
  174. procedure TScreenSaver.Draw;
  175. var i : Byte;
  176.     B,S : Word;
  177. begin
  178.  if Active then
  179.   if Tick^-LastTick>1 then
  180.     begin
  181.       MoveChar(B,' ',1,1);
  182.       LastTick:=Tick^;
  183.       for i:=1 to MaxStars do
  184.          with Stars[i] do
  185.            begin
  186.              MoveChar(S,'*',Color,1);
  187.              WriteBuf(Xpos,YPos,1,1,B);
  188.              if XPos in [0,ScreenWidth-1] then XDir:=-XDir;
  189.              if YPos in [0,ScreenHeight-1] then YDir:=-YDir;
  190.              Inc(XPos,XDir);
  191.              Inc(YPos,YDir);
  192.              WriteBuf(Xpos,YPos,1,1,S);
  193.            end;
  194.     end;
  195. end;
  196.  
  197. procedure TScreenSaver.Update;
  198. begin
  199.   if Active then DrawView else
  200.     begin
  201.       if Tick^-LastEventTick>Delay then Setup;
  202.     end;
  203. end;
  204.  
  205. procedure TScreenSaver.CheckEvent(var Event : TEvent);
  206. begin
  207.   if Event.What<>evNothing then
  208.     begin
  209.       if Active then ShutDown;
  210.       LastEventTick:=Tick^;
  211.     end;
  212. end;
  213.  
  214. procedure TScreenSaver.Setup;
  215. begin
  216.   Active:=True;
  217.   LastTick:=0;
  218.   MakeFirst;
  219.   HideMouse;
  220.   ClearScreen;
  221.   Show;
  222.   Draw;
  223. end;
  224.  
  225. procedure TScreenSaver.ShutDown;
  226. begin
  227.   Active:=False;
  228.   Hide;
  229.   ShowMouse;
  230.   Owner^.Redraw;
  231. end;
  232.  
  233. {**************** THintStatusLine ******************}
  234.  
  235. procedure THintStatusLine.NewHintList;
  236. begin
  237.   if Hints<>NIL then Dispose(Hints,Done);
  238.   Hints:=AList;
  239. end;
  240.  
  241. function THintStatusLine.Hint;
  242. begin
  243.   if Hints<>NIL then Hint:=Hints^.Get(AHelpCtx)
  244.                 else Hint:='';
  245. end;
  246.  
  247. constructor THintStatusLine.Load;
  248. begin
  249.   TStatusLine.Load(S);
  250.   S.Read(Hints,SizeOf(Hints));
  251. end;
  252.  
  253. procedure THintStatusLine.Store;
  254. begin
  255.   TStatusLine.Store(S);
  256.   S.Write(Hints,SizeOf(Hints));
  257. end;
  258.  
  259. {**************************************************}
  260.  
  261. constructor TComboBox.Init;
  262. var X,Y : PSItem;
  263.     i   : Byte;
  264. begin
  265.   TView.Init(Bounds);
  266.   Options:=Options or ofSelectable or ofPostProcess or ofFirstClick;
  267.   Value:=0;
  268.   i:=0;
  269.   X:=AStrings;
  270.   while X<>nil do
  271.     begin
  272.       X:=X^.Next;
  273.       Inc(i);
  274.     end;
  275.   New(Strings,Init(i,0));
  276.   X:=AStrings;
  277.   while X<>nil do
  278.     begin
  279.       Y:=X^.Next;
  280.       Strings^.AtInsert(Strings^.Count,X^.Value);
  281.       Dispose(X);
  282.       X:=Y;
  283.     end;
  284. end;
  285.  
  286. destructor TComboBox.Done;
  287. begin
  288.   Dispose(Strings,Done);
  289.   TView.Done;
  290. end;
  291.  
  292. constructor TComboBox.Load;
  293. begin
  294.   TView.Load(S);
  295.   Strings:=New(PStringCollection,Load(S));
  296.   S.Read(Value,SizeOf(Value));
  297. end;
  298.  
  299. procedure TComboBox.Store;
  300. begin
  301.   TView.Store(S);
  302.   Strings^.Store(S);
  303.   S.Write(Value,SizeOf(Value));
  304. end;
  305.  
  306. function TComboBox.GetPalette;
  307. const P : string[Length(CComboBox)] = CComboBox;
  308. begin
  309.   GetPalette:=@P;
  310. end;
  311.  
  312. procedure TComboBox.Draw;
  313. var B : TDrawBuffer;
  314.     C : Byte;
  315. begin
  316.   if State and sfFocused <> 0 then C:=GetColor(2) else C:=GetColor(1);
  317.   MoveChar(B,' ',C,Size.X);
  318.   MoveStr(B[1],PString(Strings^.At(Value))^,C);
  319.   MoveCStr(B[Size.X-3], #222'~'#25'~'#221, GetColor($0304));
  320.   WriteLine(0, 0, Size.X, Size.Y, B);
  321. end;
  322.  
  323. procedure TComboBox.SetState;
  324. begin
  325.   TView.SetState(AState,Enable);
  326.   if AState and sfFocused <> 0 then DrawView;
  327. end;
  328.  
  329. procedure TComboBox.HandleEvent;
  330. var R,P : TRect;
  331.     W   : PComboWindow;
  332.     C   : Word;
  333.  
  334.   function LocalX(P : TPoint): Byte;
  335.   var LP : TPoint;
  336.   begin
  337.     MakeLocal(P,LP);
  338.     LocalX:=LP.X;
  339.   end;
  340.  
  341. begin
  342.   TView.HandleEvent(Event);
  343.   if (Event.What = evMouseDown) and (LocalX(Event.Where)>=(Size.X-3)) or
  344.      ((Event.What = evKeyDown) and (CtrlToArrow(Event.KeyCode) = kbDown) and
  345.       (State and sfFocused <> 0)) then
  346.   begin
  347. {$IFDEF VER70}
  348.     if not Focus then
  349. {$ELSE}
  350.     Select;
  351.     if State and sfSelected <> 0 then
  352. {$ENDIF}
  353.       begin
  354.         ClearEvent(Event);
  355.         Exit;
  356.       end;
  357.     GetBounds(R);
  358.     Dec(R.A.X); Inc(R.B.Y,Min(7,Strings^.Count+1)); Dec(R.A.Y,1);
  359.     Owner^.GetExtent(P);
  360.     R.Intersect(P);
  361.     Dec(R.B.Y,1);
  362.     New(W,Init(R,@Self));
  363.     if W <> nil then
  364.     begin
  365.       W^.HelpCTX:=HelpCtx;
  366.       C := Owner^.ExecView(W);
  367.       if C = cmOk then
  368.       begin
  369.         Value := W^.GetNumber;
  370.         DrawView;
  371.       end;
  372.       Dispose(W, Done);
  373.     end;
  374.     ClearEvent(Event);
  375.   end;
  376. end;
  377.  
  378. procedure TComboBox.GetData;
  379. begin
  380.   Word(Rec):=Value;
  381. end;
  382.  
  383. procedure TComboBox.SetData;
  384. begin
  385.   Value:=Word(Rec);
  386.   if Value>=Strings^.Count then Value:=0;
  387.   DrawView;
  388. end;
  389.  
  390. function TComboBox.DataSize;
  391. begin
  392.   DataSize:=SizeOf(Word);
  393. end;
  394.  
  395. {***************** TComboWindow *******************}
  396.  
  397. constructor TComboWindow.Init;
  398. var R : TRect;
  399. begin
  400.   TWindow.Init(Bounds,'',wnNoNumber);
  401.   Flags:=wfClose;
  402.   ComboBox:=ACombo;
  403.   GetExtent(R);
  404.   R.Grow(-1,-1);
  405.   Viewer := New(PComboViewer, Init(R,
  406.     StandardScrollBar(sbHorizontal + sbHandleKeyboard),
  407.     StandardScrollBar(sbVertical + sbHandleKeyboard),ComboBox^.Strings));
  408.   Insert(Viewer);
  409.   Viewer^.FocusItem(ComboBox^.Value);
  410. end;
  411.  
  412. function TComboWindow.GetPalette;
  413. const P : string[Length(CComboWindow)] = CComboWindow;
  414. begin
  415.   GetPalette:=@P;
  416. end;
  417.  
  418. function TComboWindow.GetNumber;
  419. begin
  420.   GetNumber:=Viewer^.Focused;
  421. end;
  422.  
  423. {****************** TComboViewer *****************}
  424.  
  425. constructor TComboViewer.Init;
  426. begin
  427.   TListViewer.Init(Bounds, 1, AHScrollBar, AVScrollBar);
  428.   List:=AList;
  429.   SetRange(List^.Count);
  430.   HScrollBar^.SetRange(1, GetWidth-Size.X + 3);
  431. end;
  432.  
  433. function TComboViewer.GetPalette;
  434. const
  435.   P: String[Length(CComboViewer)] = CComboViewer;
  436. begin
  437.   GetPalette := @P;
  438. end;
  439.  
  440. function TComboViewer.GetText;
  441. begin
  442.   GetText := PString(List^.At(Item))^;
  443. end;
  444.  
  445. procedure TComboViewer.HandleEvent;
  446. begin
  447.   if ((Event.What = evMouseDown) and (Event.Double)) or
  448.      ((Event.What = evKeyDown) and (Event.KeyCode = kbEnter)) then
  449.   begin
  450.     EndModal(cmOk);
  451.     ClearEvent(Event);
  452.   end else if ((Event.What = evKeyDown) and (Event.KeyCode = kbEsc)) or
  453.     ((Event.What = evCommand) and (Event.Command = cmCancel)) then
  454.   begin
  455.     EndModal(cmCancel);
  456.     ClearEvent(Event);
  457.   end else TListViewer.HandleEvent(Event);
  458. end;
  459.  
  460. function TComboViewer.GetWidth;
  461. var L : integer;
  462.  
  463.   procedure GetLength(X : PString); far;
  464.   begin
  465.     if L<Length(X^) then L:=Length(X^);
  466.   end;
  467.  
  468. begin
  469.   L:=0;
  470.   List^.ForEach(@GetLength);
  471.   GetWidth:=L;
  472. end;
  473.  
  474. {**************** TCharacterLine ******************}
  475.  
  476. constructor TCharacterLine.Init;
  477. begin
  478.   TInputLine.Init(Bounds,AMaxLen);
  479.   LineCharSet:=ASet;
  480. end;
  481.  
  482. procedure TCharacterLine.HandleEvent;
  483. begin
  484.    if Event.What = evKeyDown then
  485.         if ord(Event.CharCode)>31 then
  486.               begin
  487.                 if not (Event.CharCode in LineCharSet) then ClearEvent(Event);
  488.               end;
  489.    TInputLine.HandleEvent(Event);
  490. end;
  491.  
  492. constructor TCharacterLine.Load;
  493. begin
  494.   TInputLine.Load(S);
  495.   S.Read(LineCharSet,SizeOf(LineCharSet));
  496. end;
  497.  
  498. procedure TCharacterLine.Store; 
  499. begin
  500.   TInputLine.Store(S);
  501.   S.Write(LineCharSet,SizeOf(LineCharSet));
  502. end;
  503.  
  504. {**************** TFramedView ******************}
  505.  
  506. constructor TFramedView.Init;
  507. begin
  508.   TView.Init(Bounds);
  509.   Options:=Options or ofFramed;
  510. end;
  511.  
  512. {********** OpenFile and ChangeDir ************}
  513.  
  514. {$IFDEF VER70}
  515.  
  516. function OpenFile(Wild,Title : string): string;
  517. var
  518.   D: PFileDialog;
  519.   FN: PathStr;
  520.   FileName : Pointer;
  521. begin
  522.   FN:='';
  523.   FileName:=@FN;
  524.   D := New(PFileDialog,Init(Wild,Title,'~N~ame', fdOkButton, cmOpen));
  525.   Application^.ExecuteDialog(D,FileName);
  526.   OpenFile:=FN;
  527. end;
  528.  
  529. procedure ChangeDir;
  530. var
  531.   D: PChDirDialog;
  532. begin
  533.   D := New(PChDirDialog, Init(cdNormal,cmChangeDir));
  534.   Application^.ExecuteDialog(D,NIL);
  535. end;
  536.  
  537. {$ELSE}
  538.  
  539. function OpenFile(Wild,Title : string): string;
  540. var
  541.   D: PFileDialog;
  542.   FileName: PathStr;
  543. begin
  544.   FileName:='';
  545.   D := PFileDialog(Application^.ValidView(New(PFileDialog,
  546.         Init(Wild,Title,'~N~ame', fdOkButton, 100))));
  547.   if D <> nil then
  548.    begin
  549.       if Desktop^.ExecView(D) <> cmCancel then D^.GetData(FileName);
  550.       Dispose(D, Done);
  551.    end;
  552.   OpenFile:=FileName;
  553. end;
  554.  
  555. procedure ChangeDir;
  556. var
  557.   D: PChDirDialog;
  558. begin
  559.   D := PChDirDialog(Application^.ValidView(New(PChDirDialog, Init(0,cmChangeDir))));
  560.   if D <> nil then
  561.   begin
  562.     DeskTop^.ExecView(D);
  563.     Dispose(D, Done);
  564.   end;
  565. end;
  566. {$ENDIF}
  567.  
  568. function MakeStringList;
  569. var f    : text;
  570.     i    : word;
  571.     Size : word;
  572.     S    : string;
  573.     X : PStrListMaker;
  574. begin
  575.   i:=0;
  576.   Assign(f,AFileName);
  577.   {$I-}
  578.   Reset(f);
  579.   {$I+}
  580.   if IOResult=0 then
  581.     begin
  582.       while not Eof(f) do
  583.         begin
  584.           Readln(f,S);
  585.           Size:=Size+Length(S);
  586.           Inc(i);
  587.         end;
  588.     end
  589.       else Size:=0;
  590.   New(X,Init(Size,i));
  591.   i:=1;
  592.   if Size<>0 then
  593.     begin
  594.       Reset(f);
  595.       while not Eof(f) do
  596.         begin
  597.           Readln(f,S);
  598.           X^.Put(i,S);
  599.           Inc(i);
  600.         end;
  601.       Close(f);
  602.     end;
  603.   MakeStringList:=X;
  604. end;
  605.  
  606. function GetRscString;
  607. begin
  608.   GetRscString:=RscStringList^.Get(ANumber);
  609. end;
  610.  
  611. function Min(X, Y: Integer): Integer; assembler;
  612. asm
  613.         MOV     AX,X
  614.         CMP     AX,Y
  615.         JLE     @@1
  616.         MOV     AX,Y
  617. @@1:
  618. end;
  619.  
  620. function Max(X, Y: Integer): Integer; assembler;
  621. asm
  622.         MOV     AX,X
  623.         CMP     AX,Y
  624.         JNLE    @@1
  625.         MOV     AX,Y
  626. @@1:
  627. end;
  628.  
  629. procedure RegisterSupply3;
  630. begin
  631.   RegisterType(RComboBox);
  632.   RegisterType(RFramedView);
  633.   RegisterType(RCharacterLine);
  634. end;
  635.  
  636. begin
  637.   Randomize;
  638. end.