home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / f / flxhdr.zip / FLEXHDR.PAS next >
Pascal/Delphi Source File  |  1992-10-21  |  6KB  |  215 lines

  1. (*
  2.   Demonstrates how to derive a new header type from the existing HeaderNode
  3.   object. This unit provides a simple header type that uses FlexWrite instead
  4.   of FastWrite, so that headers can appear in more than one color. Headers can
  5.   be positioned at custom locations with InitCustom or at standard locations
  6.   (like top center, etc.) with Init.
  7.  
  8.   Written 3/9/90.
  9. *)
  10.  
  11. {$S-,R-,V-,I-,B-,F+,O+,A-}
  12.  
  13. {Conditional defines that may affect this unit}
  14. {$I OPDEFINE.INC}
  15.  
  16. unit FlexHdr;
  17.   {-Demonstrate how to add new header types for windows}
  18.  
  19. interface
  20.  
  21. uses
  22.   OpConst, {!!.20}
  23.   OpRoot,
  24.   OpString,
  25.   OpCrt,
  26.   {$IFDEF UseMouse}
  27.   OpMouse,
  28.   {$ENDIF}
  29.   OpFrame;
  30.  
  31. const
  32.   otFlexHeader = 2999;            {Stream code for FlexHeader}
  33.   veFlexHeader = 00;              {Stream version for FlexHeader}
  34.  
  35. type
  36.   FlexHeaderPtr  = ^FlexHeader;
  37.   FlexHeader     =
  38.     object(HeaderNode)
  39.       flColor : FlexAttrs;        {Flex attributes in color mode}
  40.       flMono : FlexAttrs;         {Flex attributes in mono mode}
  41.       flDummy : record end;       {Makes stream routines cleaner}
  42.       constructor Init(Name : String;
  43.                        var AttrColor, AttrMono : FlexAttrs;
  44.                        hType : HeaderPosType;
  45.                        FPtr : FramePtr);
  46.         {-Initialize a FlexHeader in a position relative to a frame}
  47.       constructor InitCustom(Name : String;
  48.                              var AttrColor, AttrMono : FlexAttrs;
  49.                              DX, DY : Integer;
  50.                              hPosn : FrameCharType);
  51.         {-Initialize header node}
  52.       procedure Draw(XL, YL, XH, YH : Byte; Framed : Boolean); virtual;
  53.         {-Draw one header node}
  54.       procedure Update(XL, YL, XH, YH : Byte; Framed : Boolean); virtual; {!!.01}
  55.         {-Adjust internal string and coords based on given frame coords}
  56.       procedure Coordinates(XL, YL, XH, YH : Byte;
  57.                             var heXL, heYL, heXH, heYH : Byte); virtual;
  58.         {-Return the absolute coordinates of a rectangle surrounding header}
  59.  
  60. {$IFDEF UseStreams}
  61.       {... stream methods ...}
  62.       constructor Load(var S : IdStream);
  63.         {-Load from stream}
  64.       procedure Store(var S : IdStream);
  65.         {-Store to stream}
  66. {$ENDIF}
  67.     end;
  68.  
  69. {$IFDEF UseStreams}
  70.   procedure FlexHeaderStream(SPtr : IdStreamPtr);
  71.     {-Register types needed for streams containing FlexHeaders}
  72. {$ENDIF}
  73.  
  74.   {======================================================================}
  75.  
  76. implementation
  77.  
  78.   constructor FlexHeader.Init(Name : String;
  79.                               var AttrColor, AttrMono : FlexAttrs;
  80.                               hType : HeaderPosType;
  81.                               FPtr : FramePtr);
  82.     {-Initialize a FlexHeader in a position relative to a frame}
  83.   begin
  84.     if hType = heSpan then
  85.       {Spans not allowed here}
  86.       Fail;
  87.     flColor := AttrColor;
  88.     flMono := AttrMono;
  89.     if not HeaderNode.Init(Name, AttrColor[0], AttrMono[0],
  90.                            0, 0, hType, frTL) then
  91.       Fail;
  92.     with FPtr^ do
  93.       Update(frXL, frYL, frXH, frYH, frFramed);
  94.   end;
  95.  
  96.   constructor FlexHeader.InitCustom(Name : String;
  97.                                     var AttrColor, AttrMono : FlexAttrs;
  98.                                     DX, DY : Integer;
  99.                                     hPosn : FrameCharType);
  100.     {-Initialize header node}
  101.   begin
  102.     flColor := AttrColor;
  103.     flMono := AttrMono;
  104.     if not HeaderNode.Init(Name, AttrColor[0], AttrMono[0],
  105.                            DX, DY, heCustom, hPosn) then
  106.       Fail;
  107.   end;
  108.  
  109.   procedure FlexHeader.Update(XL, YL, XH, YH : Byte; Framed : Boolean);
  110.     {-Adjust internal string and coords based on given frame coords}
  111.   var
  112.     SaveLen : Byte;
  113.   begin
  114.     SaveLen := Byte(heName^[0]);
  115.     Byte(heName^[0]) := FlexLen(heName^);
  116.     HeaderNode.Update(XL, YL, XH, YH, Framed);
  117.     Byte(heName^[0]) := SaveLen;
  118.   end;
  119.  
  120.   procedure FlexHeader.Draw(XL, YL, XH, YH : Byte; Framed : Boolean);
  121.     {-Draw one header node}
  122.   var
  123.     X : Integer;
  124.     Y : Integer;
  125.     {$IFDEF UseMouse}
  126.     MOn : Boolean;
  127.     {$ENDIF}
  128.   begin
  129.     if Disabled then
  130.       Exit;
  131.     case hePosn of
  132.       frTL, frTT, frBB, frLL, frRR :
  133.         begin
  134.           X := XL; Y := YL;
  135.         end;
  136.       frBL :
  137.         begin
  138.           X := XL; Y := YH;
  139.         end;
  140.       frTR :
  141.         begin
  142.           X := XH; Y := YL;
  143.         end;
  144.       frBR :
  145.         begin
  146.           X := XH; Y := YH;
  147.         end;
  148.     end;
  149.     inc(Y, heDY);
  150.     inc(X, heDX);
  151.     if (Y < 1) or (X < 1) then
  152.       Exit;
  153.  
  154.     {$IFDEF UseMouse}
  155.     HideMousePrim(MOn);
  156.     {$ENDIF}
  157.  
  158.     {No clipping support}
  159.     if UseColor then
  160.       FlexWrite(heName^, Y, X, flColor)
  161.     else
  162.       FlexWrite(heName^, Y, X, flMono);
  163.  
  164.     {$IFDEF UseMouse}
  165.     ShowMousePrim(MOn);
  166.     {$ENDIF}
  167.   end;
  168.  
  169.   procedure FlexHeader.Coordinates(XL, YL, XH, YH : Byte;
  170.                                    var heXL, heYL, heXH, heYH : Byte);
  171.     {-Return the absolute coordinates of a rectangle surrounding header}
  172.   var
  173.     SaveLen : Byte;
  174.   begin
  175.     SaveLen := Byte(heName^[0]);
  176.     Byte(heName^[0]) := FlexLen(heName^);
  177.     HeaderNode.Coordinates(XL, YL, XH, YH, heXL, heYL, heXH, heYH);
  178.     Byte(heName^[0]) := SaveLen;
  179.   end;
  180.  
  181. {$IFDEF UseStreams}
  182.   constructor FlexHeader.Load(var S : IdStream);
  183.     {-Load from stream}
  184.   begin
  185.     if not HeaderNode.Load(S) then
  186.       Fail;
  187.     S.ReadRange(flColor, flDummy);
  188.     if S.PeekStatus <> 0 then begin
  189.       Done;
  190.       Fail;
  191.     end;
  192.   end;
  193.  
  194.   procedure FlexHeader.Store(var S : IdStream);
  195.     {-Store to stream}
  196.   begin
  197.     HeaderNode.Store(S);
  198.     S.WriteRange(flColor, flDummy);
  199.   end;
  200.  
  201.   procedure FlexHeaderStream(SPtr : IdStreamPtr);
  202.     {-Register types needed for streams containing FlexHeaders}
  203.   begin
  204.     DoubleListStream(SPtr);
  205.     with SPtr^ do begin
  206.       RegisterType(otHeaderNode, veHeaderNode,
  207.                    TypeOf(HeaderNode), @HeaderNode.Store, @HeaderNode.Load);
  208.       RegisterType(otFlexHeader, veFlexHeader,
  209.                    TypeOf(FlexHeader), @FlexHeader.Store, @FlexHeader.Load);
  210.     end;
  211.   end;
  212. {$ENDIF}
  213.  
  214. end.
  215.