home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / Pascal / Samples / VIEWS10.ARJ / TP / VIEWS / LOBJECTS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-05  |  88.5 KB  |  2,762 lines

  1. {===========================================================================}
  2. {                                                                           }
  3. {                  █████████████ Unit LObjects  █████████████               }
  4. {                  █████████████  Release 1.0   █████████████               }
  5. {                                                                           }
  6. {             █████████████  CREATED BY Dr. LUIS  VACA  █████████████       }        
  7. {                █████████████  All Rights Reserved  █████████████          }
  8. {                                                                           }
  9. {  " Promote Programming ... Register !!!"                                  }
  10. {===========================================================================}
  11.  
  12. Unit LObjects;
  13.  
  14. INTERFACE
  15.  
  16. USES
  17.     Graph, Emouse;
  18.  
  19.  
  20. VAR
  21.    CMCommand  : Word;
  22.    
  23. CONST
  24.      CanRotate : Boolean = true;
  25.  
  26.  
  27.  
  28. TYPE
  29.      Call  = Function : Word;
  30.  
  31.  
  32. CONST
  33.     CMQuit      = Key_Alt   + Key_X;
  34.     CMSwitch    = Key_Ctrl  + Key_Esc;
  35.     CMRotate    = Key_Shift + Key_Tab;
  36.     CMMenu      = Key_Ctrl  + Key_Space;
  37.     CMPaint     = 1000;
  38.     CMCanClose  = 2000;
  39.     CMClose     = 2001;
  40.     CMMove      = 1001;
  41.     CMResize    = 1002;
  42.     CMMaximize  = 1003;
  43.     CMRestore   = 1004;
  44.  
  45. {     ALL BEGINS WITH THE BASIC OBJECT ++++++LVIEW++++++++  }
  46. {                                                           }
  47. {                       LVIEW                               }
  48. {                         │                                 }
  49. {           ______________│____________                     }
  50. {           │             │           │                     }
  51. {        LCONTROL      LDIALOG      LWINDOW                 }
  52. {           │                         │                     }
  53. {           │                         │                     }
  54. {        LBUTTON                    LTTYWINDOW              }
  55. {                                                           }
  56. { MORE CONTROLS CAN BE DERIVED FROM LCONTROL AND EASILY     }
  57. { INSERTED IN ANY DESCENDANT OF LDIALOG.                    }
  58. { MODIFY THE HANDLEEVENT METHOD OF YOUR OBJECT DERIVED FROM }
  59. { LCONTROL OBJECT TO SUIT YOUR SPECIFIC OBJECT NEEDS.       }
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66. TYPE
  67.              aMaskList              = ARRAY[1..200] of  MaskType;
  68.              aRectList              = ARRAY[1..200] of  Rect;
  69.              aP                     = ARRAY[1..200] of  Point;
  70.              aViewList              = Record
  71.                                             MaskList : aMaskList;
  72.                                             RectList : aRectList;
  73.                                             P        : aP;
  74.                                       end;
  75.  
  76.  
  77.     PLView   =   ^LView;
  78.     LView    =   Object
  79.              ID                    : Integer;
  80.              PaintR                : Rect;
  81.              OwnerR                : Rect;
  82.              MinSize               : Point;
  83.              TempR                 : Rect;
  84.              R, WorkR,
  85.              MenuR                 : Rect;
  86.              MinMaxR               : Rect;
  87.              TitleR                : Rect;
  88.              { RectANGLES FOR RESIZING AREAS }
  89.              R1, R2, R3,
  90.              R4, R5, R6,
  91.              R7, R8, R9,
  92.              R10, R11,
  93.              R12                   : Rect;
  94.              RRestore              : Rect;
  95.              Title                 : String;            
  96.              Margin                : Integer;
  97.              IsMaximizable         : Boolean;
  98.              IsResizable           : Boolean;
  99.              IsMoveable            : Boolean;
  100.              IsCloseable           : Boolean;
  101.              Maximized             : Boolean;
  102.              CWinTitle             : Integer;
  103.              CWinWR                : Integer;
  104.              CTitle                : Integer;
  105.              Place                 : Integer;
  106.              ViewList              : aViewList;
  107.              ViewCount             : Word;
  108.         Constructor Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string);
  109.         Procedure ReportError(n:Integer);                        Virtual;
  110.         Procedure FitR ( VAR RL1, RL2 : Rect);                   Virtual;
  111.         Procedure SetR (anR : Rect);                             Virtual;
  112.         Procedure BevelR(x,y,x1,y1: Integer; topcolor,
  113.                          botcolor,interior,thickness : Word);    Virtual;
  114.         Procedure SetMinMax(VAR P : Point);                      Virtual;
  115.         Procedure CanMaximize (YesNo : Boolean);                 Virtual;
  116.         Procedure CanMove (YesNo : Boolean);                     Virtual;
  117.         Procedure CanResize(YesNo : Boolean);                    Virtual;
  118.         Procedure CanClose(YesNo : Boolean);                     Virtual;
  119.         Procedure Maximize( VAR E : Eventype);                   Virtual;
  120.         Procedure Restore( VAR E : Eventype);                    Virtual;
  121.         Procedure SetAreas;                                      Virtual;
  122.         Procedure Paint;                                         Virtual;
  123.         Procedure MinMaxButton(OnOff : Boolean);                 Virtual;
  124.         Procedure MenuButton(OnOff : Boolean);                   Virtual;
  125.         Procedure Draw;                                          Virtual;
  126.         Procedure GetExtent(VAR Extent: Rect);                   Virtual;
  127.         Procedure GetOwnerR(VAR OwnR : Rect);                    Virtual;
  128.         Procedure FillR (VAR RFill : Rect;
  129.                   color : Integer);                              Virtual;
  130.         Procedure SetFocus(OnOff : Boolean);                     Virtual;
  131.         Procedure Resize(VAR E: Eventype);                       Virtual;
  132.         Procedure Clamp(VAR P : Point);                          Virtual;
  133.         Procedure UnClamp;                                       Virtual;
  134.         Procedure XorBox(VAR RR : Rect);                         Virtual;
  135.         Procedure Move( VAR E : Eventype);                       Virtual;
  136.         Procedure ExplodeR;                                      Virtual;
  137.         Procedure DoMenu( VAR E : EvenType);                     Virtual;
  138.         Procedure HandleEvent(VAR E : Eventype);                 Virtual;
  139.         Procedure Idle;                                          Virtual;
  140.         Procedure MakeLocal(VAR Rin, Rout : Rect);               Virtual;
  141.         Procedure PLine(X, Y, X1, Y1: Integer);                  Virtual;
  142.         Procedure PLineTo(X, Y : Integer);                       Virtual;
  143.         Procedure PBar(X, Y, X1, Y1: Integer);                   Virtual;
  144.         Procedure PMoveto(X, Y: Integer);                        Virtual;
  145.         Procedure PRectangle(X, Y, X1, Y1: Integer);             Virtual;
  146.         Procedure PPutPixel(X, Y: Integer; Pixel: Word);         Virtual;
  147.         Function  PGetPixel(X,Y : Integer): Word;                Virtual;
  148.         Destructor Done;
  149.    END;
  150.  
  151.  
  152.     PLWindow   = ^LWindow;
  153.     LWindow    = Object(LView)
  154.      CONSTructor Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string; color,back:Integer);
  155.      Destructor Done;
  156.     END;
  157.  
  158.  
  159.     PLTTYWindow   =  ^LTTYWindow;
  160.     LTTYWindow    =  Object (LWindow)
  161.     Xpos, Ypos        : Integer;
  162.     textcolor         : integer;
  163.     textbackground    : integer;
  164.      CONSTructor Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string);
  165.      Procedure FitCursorPos;                                  Virtual;
  166.      Procedure SetTextColor (Acolor : integer);               Virtual;
  167.      Procedure SetTextBackground(Acolor : integer);           Virtual;
  168.      Procedure HandleEvent(VAR E : Eventype);                 Virtual;
  169.      Destructor Done;
  170.     END;
  171.  
  172.  
  173.     PLDialog    =  ^LDialog;
  174.     LDialog     = Object(LView)
  175.       ObjCount : Word;
  176.       Focused  : Word;
  177.       ObjList  : Array[1..30] of PLView;
  178.       TempList : Array[1..30] of PLView;
  179.       Constructor Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string);
  180.       Procedure Paint;                                          Virtual;
  181.       Procedure Insert(P : Pointer);                            Virtual;
  182.       Procedure Delete(P : PLView);                             Virtual;
  183.       Procedure Maximize( VAR E : Eventype);                    Virtual;
  184.       Procedure Restore( VAR E : Eventype);                     Virtual;
  185.       Procedure Move( VAR E : Eventype);                        Virtual;
  186.       Procedure Resize( VAR E : Eventype);                      Virtual;
  187.       Function GetDC : PLView;                                  Virtual;
  188.       Function GetView(VAR P:Point): Integer;                   Virtual;
  189.       Procedure Clamp(VAR P : Point);                           Virtual;
  190.       Procedure UnClamp;                                        Virtual;
  191.       Procedure Rotatetop (N:Integer);                          Virtual;
  192.       Procedure HandleEvent(VAR E : Eventype);                  Virtual;
  193.       Destructor Done;
  194.     END;
  195.  
  196.  
  197.      PLControl =  ^LControl;
  198.      LControl  =  Object (LView)
  199.       OffsetX,
  200.       OffsetY  : Integer;
  201.  
  202.      CONSTructor  Init(X,Y,X1,Y1 : Integer);
  203.      Procedure Move(VAR E: EvenType);                 Virtual;
  204.      Procedure SetFocus(OnOff : Boolean);             Virtual;
  205.      Destructor Done;
  206.      END;          
  207.  
  208.  
  209.     PLButton = ^LButton;
  210.     LButton  = Object (LControl)
  211.       Color    : Integer;
  212.       TColor   : Integer;
  213.       ispushed : Boolean;
  214.       Key      : Word;
  215.  
  216.       Constructor Init(X,Y,X1,Y1 : Integer; wide : Integer;
  217.                        Atitle : String; Acolor: Integer);
  218.       Procedure Paint;                                  Virtual;
  219.       Procedure Push;                                   Virtual;
  220.       Procedure Move(VAR E: EvenType);                  Virtual;
  221.       Procedure SetFocus(OnOff : Boolean);              Virtual;
  222.       Function GetAKey: Word;                           Virtual;
  223.       Procedure HandleEvent (VAR E : EvenType);         Virtual;
  224.       Destructor Done;
  225.     END;
  226.  
  227.  
  228.      PLViewLogo = ^LViewLogo;
  229.      LViewLogo  = Object(LDialog)
  230.      Constructor Init;
  231.      Procedure   Draw;                              Virtual;
  232.      Procedure   Idle;                              Virtual;
  233.      Destructor  Done;
  234.      END;
  235.  
  236.  
  237.  
  238.     PLApp = ^LApp;
  239.     LApp  = Object
  240.      VP       : ViewPortType;
  241.      APColor  : Integer;
  242.      TotalR   :  Rect;
  243.      ClipR    :  Rect;
  244.      DL       : PLDialog;
  245.      B1, B2   : PLButton;
  246.      Logo     : PLViewLogo;
  247.      ObjList  : Array[1..300] of PLView;
  248.      TempList : Array[1..300] of PLView;
  249.      ObjCount : Word;
  250.       CONSTructor Init;
  251.       Procedure Insert(P : PLView);            Virtual;
  252.       Procedure FillR (VAR RFill : Rect;
  253.                   color : Integer);            Virtual;
  254.       Procedure Destroy(P : PLView);           Virtual;
  255.       Procedure SetView( VAR R : Rect);        Virtual;
  256.       Function GetDC : PLView;                 Virtual;
  257.       Procedure Rotatetop (N:Integer);         Virtual;
  258.       Function GetView(VAR P:Point): Integer;  Virtual;
  259.       Procedure Draw;                          Virtual;
  260.       Procedure Paint(VAR R : Rect);           Virtual;
  261.       Procedure Idle;                          Virtual;
  262.       Procedure Switch;                        Virtual;
  263.       Function YesNoMsg (Msg : string): Word;  Virtual;
  264.       Procedure Run;                           Virtual;
  265.       Destructor Done;
  266.     END;
  267.  
  268.  
  269. IMPLEMENTATION
  270.  
  271. Constructor LView.Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string);
  272. VAR
  273.     DifX, DifY        : Integer;
  274. BEGIN
  275.      MinSize.X        := 100;
  276.      MinSize.Y        := 60;
  277.      ID               := anID;
  278.      R.A.X            := X;
  279.      R.A.Y            := Y;
  280.      R.B.X            := X1;
  281.      R.B.Y            := Y1;
  282.      Title            := Atitle;
  283.      Margin           := 8;
  284.      IsMaximizable    := True;
  285.      IsMoveable       := True;
  286.      IsResizable      := True;
  287.      IsCloseable      := True;
  288.      Maximized        := False;
  289.      CWinTitle        := Red;
  290.      CWinWR           := LightGray;
  291.      Ctitle           := Black;
  292.      Place            := 0;
  293.      ViewCount        := 16;
  294.      DifX:=(R.B.X-R.A.X);
  295.      DifY:=(R.B.Y-R.A.Y);
  296.      If (DifX < MinSize.X) then R.B.X:= R.A.X + MinSize.X;
  297.      If (DifY < MinSize.Y) then R.B.Y:= R.A.Y + MinSize.Y;
  298.      RRestore  := R;
  299. END;
  300.  
  301. Procedure LView.SetMinMax (VAR P : Point);
  302. BEGIN
  303.     MinSize := P;
  304. END;
  305.  
  306.  
  307. Procedure LView.CanMaximize (YesNo : Boolean);
  308. BEGIN
  309.      ISMaximizable := YesNo;
  310. END;
  311.  
  312.  
  313.  
  314. Procedure LView.CanMove (YesNo : Boolean);
  315. BEGIN
  316.      ISMoveable := YesNo;
  317. END;
  318.  
  319. Procedure LView.CanResize(YesNo : Boolean);
  320. BEGIN
  321.      IsResizable := YesNo;
  322. END;
  323.  
  324. Procedure LView.CanClose(YesNo : Boolean);
  325. BEGIN
  326.      IsCloseable := YesNo;
  327. END;
  328.  
  329. Procedure LView.Maximize( VAR E : Eventype);
  330. VAR
  331.     isDone   : Boolean;
  332.     Event    : Boolean;
  333.     Pressed  : Boolean;
  334. BEGIN
  335.      If MAXIMIZED OR (NOT ISMAXIMIZABLE) THEN EXIT ELSE
  336.      MinMaxButton( False);
  337.      Pressed := false;
  338.      IF (E.Mouse.Event = 1) AND (E.Command <> CMMaximize) then
  339.      REPEAT
  340.            Event := GetEvent (E);
  341.            Pressed := true;
  342.            isDone := (E.Mouse.Event = 2) OR (NOT MouseinR(E.Mouse.P, MinMaxR));
  343.      UNTIL isDone;
  344.      MinMaxButton( true);
  345.      If Pressed AND (NOT MouseinR(E.Mouse.P, MinMaxR)) then EXIT ELSE
  346.      RRestore   := R;
  347.      Maximized  := True;
  348.      R.A.X      := 0;
  349.      R.A.Y      := 0;
  350.      R.B.X      := GetMaxX;
  351.      R.B.Y      := GetMaxY;
  352.      CMCommand := CMPaint;
  353.      PaintR := RRestore;
  354.      SetAreas;
  355. END;
  356.  
  357.  
  358. Procedure LView.Restore( VAR E : Eventype);
  359. VAR
  360.     isDone   : Boolean;
  361.     Event    : Boolean;
  362.     Pressed  : Boolean;
  363.  
  364. BEGIN
  365.      If (NOT MAXIMIZED) OR (NOT ISMAXIMIZABLE) THEN EXIT ELSE
  366.      MinMaxButton( False);
  367.      Pressed := false;
  368.      IF (E.Mouse.Event = 1) AND (E.Command <> CMRestore) then
  369.      REPEAT
  370.            Event := GetEvent (E);
  371.            Pressed := true;
  372.            isDone := (E.Mouse.Event = 2) OR (NOT MouseinR(E.Mouse.P, MinMaxR));
  373.      UNTIL isDone;
  374.      MinMaxButton( true);
  375.      If Pressed AND (NOT MouseinR(E.Mouse.P, MinMaxR)) then EXIT ELSE
  376.      PaintR     := R;
  377.      R          := RRestore;
  378.      Maximized  := False;
  379.      CMCommand  := CMPaint;
  380.      SetAreas;
  381. END;
  382.  
  383.  
  384.  
  385. Procedure LView.BevelR(x,y,x1,y1: Integer; topcolor,botcolor,interior,thickness : Word);
  386. VAR
  387.   OldStyle     : LineSettingsType;
  388.   OldColor     : Word;
  389.   OldFill      : FillSettingsType;
  390.   i            : Word;
  391.   anR          : Rect;
  392. BEGIN
  393.      HideMouse;
  394.      GetFillSettings(oldfill);
  395.      SetfillStyle(1,LIGHTGRAY);
  396.      GetlineSettings(Oldstyle);
  397.      SetlineStyle(0,0,1);
  398.      OldColor:=GetColor;
  399.  
  400.      anR.A.X := X;
  401.      anR.A.Y := Y;
  402.      anR.B.X := X1;
  403.      anR.B.Y := Y1;
  404.  
  405.      FillR(anR, interior);
  406.      SetColor(black);
  407.      Rectangle(x,y,x1,y1);
  408.      Rectangle(x+thickness,y+thickness,x1-thickness,y1-thickness);
  409.  
  410.       for i:=1 to thickness-1 do
  411.      BEGIN
  412.             SetColor(topcolor);
  413.         Line(x+i,y+i,x1-i,y+i);   { top}
  414.             SetColor(botcolor);
  415.         Line(x+i,y1-i,x1-i,y1-i); { bottom }
  416.             SetColor(topcolor);
  417.         Line(x+i,y+i,x+i,y1-i);   { left }
  418.             SetColor(botcolor);
  419.         Line(x1-i,y+i,x1-i,y1-i); { right }
  420.      END;
  421.       SetColor(black);
  422.       Line(x,y,x+thickness,y+thickness);    { upper left }
  423.       Line(x,y1,x+thickness,y1-thickness);    { lower left }
  424.       Line(x1,y,x1-thickness,y+thickness);    { upper right }
  425.       Line(x1,y1,x1-thickness,y1-thickness);    { lower right }
  426.  
  427.      {restore everything}
  428.      Setcolor(OldColor);
  429.      with OldStyle do
  430.      SetLineStyle(LineStyle, Pattern,
  431.                Thickness);
  432.      with OldFill do
  433.      SetFillStyle(Pattern, Color);
  434.      ShowMouse;
  435. END;
  436.  
  437.  
  438.  
  439.  
  440. Procedure LView.SetR( anR : Rect);
  441. BEGIN
  442.      R := anR;
  443. END;
  444.  
  445. Procedure LView.ReportError(n : Integer);
  446. CONST
  447.       ERROR : array [1..5] of string[25] =
  448.       ('No Memory for Operation',
  449.       'Device not Ready',
  450.       'Invalid Pointer',
  451.       'Invalid Object',
  452.       'Message not Found');
  453. VAR
  454.    ErrR              : Rect;
  455.    Difx,len          : Integer;
  456. BEGIN
  457.  
  458. END;
  459.  
  460. Procedure LView.Draw;
  461. VAR
  462.     n : Integer;
  463. BEGIN
  464.  
  465. END;
  466. Procedure LView.GetOwnerR(VAR OwnR : Rect);
  467. BEGIN
  468.      OwnerR := OwnR;
  469. END;
  470.  
  471.  
  472.  
  473. Procedure LView.GetExtent(VAR Extent: Rect);
  474. VAR
  475.    DifX, DifY : Integer;
  476. BEGIN
  477.       Extent.A.X := 0;
  478.       Extent.A.Y := 0;
  479.       DifX := (WorkR.B.X - WorkR.A.X);
  480.       DifY := (WorkR.B.Y - WorkR.A.Y);
  481.       Extent.B.X := DifX;
  482.       Extent.B.Y := DIfY;
  483. END;
  484.  
  485. Procedure LView.FillR (VAR RFill : Rect; color : Integer);
  486. CONST
  487.     Rarea : array[1..4] of PointType =
  488.    ((X: 0; Y: 0),
  489.     (X: 0; Y: 0),
  490.     (X: 0; Y: 0),
  491.     (X: 0; Y: 0));
  492.  
  493. VAR
  494.     OldFill      :  FillSettingsType;
  495.     OldColor     :  Integer;
  496. BEGIN
  497.       HideMouse;
  498.       GetFillSettings(OldFill);
  499.       OldColor := GetColor;
  500.       Setfillstyle(1,Color);
  501.       SetColor(Color);
  502.       Rarea[1].X:= RFill.A.X;
  503.       Rarea[1].Y:= RFill.A.Y;
  504.       Rarea[2].X:= RFill.B.X;
  505.       Rarea[2].Y:= RFill.A.Y;
  506.       Rarea[3].X:= RFill.B.X;
  507.       Rarea[3].Y:= RFill.B.Y;
  508.       Rarea[4].X:= RFill.A.X;
  509.       Rarea[4].Y:= RFill.B.Y;
  510.       FillPoly(SizeOf(Rarea) DIV SizeOf(PointType), Rarea);
  511.       With OldFill do
  512.       SetFillStyle(Pattern, Color);
  513.       SetColor(OldColor);
  514.       ShowMouse;
  515. END;
  516.  
  517.  
  518. Procedure LView.SetAreas;
  519. CONST
  520.      Step = 3;
  521. VAR
  522.    Difx,dify, pos,st,space, tw,th  : Integer;
  523.    TextInfo                        : TextSettingsType;
  524.  
  525. BEGIN
  526.      GetTextSettings(TextInfo);
  527.      SetTextStyle(SmallFont, 0, 5);
  528.      SetTextJustify(LeftText, TopText);
  529.      Tw:=TextWidth('M');
  530.      Th:=TextHeight('M');
  531.  
  532.      TitleR.A.X:=R.A.X + (Margin * 3);
  533.      TitleR.A.Y:=R.A.Y + Margin;
  534.      TitleR.B.X:=R.B.X - (Margin * 3);
  535.      TitleR.B.Y:=R.A.Y + (th * 2) + Margin;
  536.      ViewList.RectList[1] := TitleR;
  537.      ViewList.MaskList[1] := MaskTCROSS;
  538.      ViewList.P[1].X      := 7;
  539.      ViewList.P[1].Y      := 7;
  540.  
  541.      MenuR.A.X:=R.A.X + Margin;
  542.      MenuR.B.X:=R.A.X + (Margin * 3);
  543.      MenuR.A.Y:=R.A.Y + Margin;
  544.      MenuR.B.Y:=TitleR.B.Y;
  545.      ViewList.RectList[2] := MenuR;
  546.      ViewList.MaskList[2] := Standard;
  547.      ViewList.P[2].X      := 1;
  548.      ViewList.P[2].Y      := 1;
  549.  
  550.      MinMaxR.A.X:=R.B.X - (Margin * 3);
  551.      MinMaxR.A.Y:=R.A.Y + Margin;
  552.      MinMaxR.B.X:=R.B.X - Margin;
  553.      MinMaxR.B.Y:=TitleR.B.Y;
  554.      ViewList.RectList[3] := MinMaxR;
  555.      ViewList.MaskList[3] := Standard;
  556.      ViewList.P[3].X      := 1;
  557.      ViewList.P[3].Y      := 1;
  558.  
  559.      WorkR.A.X:=(R.A.X + Margin);
  560.      WorkR.A.Y:=TitleR.B.Y;
  561.      WorkR.B.X:=(R.B.X - Margin);
  562.      WorkR.B.Y:=(R.B.Y - Margin);
  563.      ViewList.RectList[4] := WorkR;
  564.      ViewList.MaskList[4] := Standard;
  565.      ViewList.P[4].X      := 1;
  566.      ViewList.P[4].Y      := 1;
  567.  
  568.  
  569.      {============================ ASSIGN RESIZING AREAS =======================}
  570.  
  571.       {  AREA  }      { MOUSE MASK }
  572.  
  573.       { R1  ╔═  }   { MaskResizeBack }
  574.       R1.A.X := R.A.X;
  575.       R1.B.X := R.A.X + MARGIN;
  576.       R1.A.Y := R.A.Y;
  577.       R1.B.Y := R.A.Y + (MARGIN * STEP);
  578.       ViewList.RectList[5] := R1;
  579.       ViewList.MaskList[5] := MaskResizeBack;
  580.      ViewList.P[5].X      := 7;
  581.      ViewList.P[5].Y      := 7;
  582.  
  583.       { R2  ╔═  }   { MaskResizeBack }
  584.       R2.A.X := R.A.X;
  585.       R2.B.X := R.A.X + (MARGIN * STEP);
  586.       R2.A.Y := R.A.Y;
  587.       R2.B.Y := R.A.Y + MARGIN;
  588.       ViewList.RectList[6] := R2;
  589.       ViewList.MaskList[6] := MaskResizeBack;
  590.      ViewList.P[6].X      := 7;
  591.      ViewList.P[6].Y      := 7;
  592.  
  593.       { R3  ═══ }   { MaskResizeVer }
  594.       R3.A.X := R2.B.X;
  595.       R3.B.X := R2.B.X + ((R.B.X - R.A.X) - (MARGIN * STEP * 2));
  596.       R3.A.Y := R.A.Y;
  597.       R3.B.Y := R.A.Y + MARGIN;
  598.       ViewList.RectList[7] := R3;
  599.       ViewList.MaskList[7] := MaskResizeVert;
  600.      ViewList.P[7].X      := 7;
  601.      ViewList.P[7].Y      := 7;
  602.  
  603.       { R4  ═╗  }   { MaskResizeForw }
  604.       R4.A.X := R3.B.X;
  605.       R4.B.X := R.B.X;
  606.       R4.A.Y := R.A.Y;
  607.       R4.B.Y := R.A.Y + MARGIN;
  608.       ViewList.RectList[8] := R4;
  609.       ViewList.MaskList[8] := MaskResizeForw;
  610.      ViewList.P[8].X      := 7;
  611.      ViewList.P[8].Y      := 7;
  612.  
  613.       { R5  ═╗  }   { MaskResizeForw }
  614.       R5.A.X := R.B.X - MARGIN;
  615.       R5.B.X := R.B.X;
  616.       R5.A.Y := R.A.Y + MARGIN;
  617.       R5.B.Y := R.A.Y + (MARGIN * STEP);
  618.       ViewList.RectList[9] := R5;
  619.       ViewList.MaskList[9] := MaskResizeForw;
  620.      ViewList.P[9].X      := 7;
  621.      ViewList.P[9].Y      := 7;
  622.  
  623.       { R6   ║  }   { MaskResizeHor }
  624.       R6.A.X := R.B.X - MARGIN;
  625.       R6.B.X := R.B.X;
  626.       R6.A.Y := R5.B.Y;
  627.       R6.B.Y := R.B.Y - (MARGIN * STEP);
  628.       ViewList.RectList[10] := R6;
  629.       ViewList.MaskList[10] := MaskResizeHor;
  630.      ViewList.P[10].X      := 7;
  631.      ViewList.P[10].Y      := 7;
  632.  
  633.       { R7   ╝  }   { MaskResizeBack }
  634.       R7.A.X := R.B.X - MARGIN;
  635.       R7.B.X := R.B.X;
  636.       R7.A.Y := R6.B.Y;
  637.       R7.B.Y := R.B.Y;
  638.       ViewList.RectList[11] := R7;
  639.       ViewList.MaskList[11] := MaskResizeBack;
  640.      ViewList.P[11].X      := 7;
  641.      ViewList.P[11].Y      := 7;
  642.  
  643.       { R8  ═╝  }   { MaskResizeBack }
  644.       R8.A.X := R.B.X - (MARGIN * STEP);
  645.       R8.B.X := R.B.X;
  646.       R8.A.Y := R.B.Y - MARGIN;
  647.       R8.B.Y := R.B.Y;
  648.       ViewList.RectList[12] := R8;
  649.       ViewList.MaskList[12] := MaskResizeBack;
  650.      ViewList.P[12].X      := 7;
  651.      ViewList.P[12].Y      := 7;
  652.  
  653.       { R9 ═══  }   { MaskResizeVer }
  654.       R9.A.X := R.A.X + (MARGIN * STEP);
  655.       R9.B.X := R8.A.X;
  656.       R9.A.Y := R.B.Y - MARGIN;
  657.       R9.B.Y := R.B.Y;
  658.       ViewList.RectList[13] := R9;
  659.       ViewList.MaskList[13] := MaskResizeVert;
  660.      ViewList.P[13].X      := 7;
  661.      ViewList.P[13].Y      := 7;
  662.  
  663.       { R10  ╚  }   { MaskResizeForw }
  664.       R10.A.X := R.A.X;
  665.       R10.B.X := R.A.X + (MARGIN * STEP);
  666.       R10.A.Y := R.B.Y - MARGIN;
  667.       R10.B.Y := R.B.Y;
  668.       ViewList.RectList[14] := R10;
  669.       ViewList.MaskList[14] := MaskResizeForw;
  670.      ViewList.P[14].X      := 7;
  671.      ViewList.P[14].Y      := 7;
  672.  
  673.       { R11  ╚  }   { MaskResizeForw }
  674.       R11.A.X := R.A.X;
  675.       R11.B.X := R.A.X + MARGIN;
  676.       R11.A.Y := R.B.Y - (MARGIN * STEP);
  677.       R11.B.Y := R.B.Y - MARGIN;
  678.       ViewList.RectList[15] := R11;
  679.       ViewList.MaskList[15] := MaskResizeForw;
  680.      ViewList.P[15].X      := 7;
  681.      ViewList.P[15].Y      := 7;
  682.  
  683.       { R12  ║  }   { MaskResizeHor }
  684.       R12.A.X := R.A.X;
  685.       R12.B.X := R.A.X + MARGIN;
  686.       R12.A.Y := R1.B.Y;
  687.       R12.B.Y := R11.A.Y;
  688.       ViewList.RectList[16] := R12;
  689.       ViewList.MaskList[16] := MaskResizeHor;
  690.      ViewList.P[16].X      := 7;
  691.      ViewList.P[16].Y      := 7;
  692.  
  693.      {============================ ASSIGN RESIZING AREAS =======================}
  694.  
  695.  
  696.      With TextInfo do
  697.           BEGIN
  698.                SetTextJustify(Horiz, Vert);
  699.                SetTextStyle(Font, DiRection, CharSize);
  700.           END;
  701. END;
  702.  
  703. Procedure Lview.MinMaxButton(OnOff : Boolean);
  704. VAR
  705.    TextInfo                        : TextSettingsType;
  706.    OldColor                        : Integer;
  707. BEGIN
  708.      HideMouse;
  709.      GetTextSettings(TextInfo);
  710.      SetTextJustify(LeftText, TopText);
  711.      OldColor:= GetColor;
  712.      SetColor(Black);
  713.      If OnOff then BevelR(MinMaxR.A.X, MinMaxR.A.Y, MinMaxR.B.X, MinMaxR.B.Y, white, 8, lightgray, 2)
  714.      ELSE BevelR(MinMaxR.A.X, MinMaxR.A.Y, MinMaxR.B.X, MinMaxR.B.Y, 8, white, lightgray, 2);
  715.      SetTextStyle(SmallFont, 1, 5);
  716.      OutTextXY(MinMaxR.A.X + 2, MinMaxR.A.Y + 3, '>');
  717.      OutTextXY(MinMaxR.A.X + 2, MinMaxR.B.Y - 13, '<');
  718.      With TextInfo do
  719.           BEGIN
  720.                SetTextJustify(Horiz, Vert);
  721.                SetTextStyle(Font, DiRection, CharSize);
  722.           END;
  723.      SetColor(OldColor);
  724.      ShowMouse;
  725. END;
  726.  
  727. Procedure Lview.MenuButton(OnOff : Boolean);
  728. VAR
  729.    OldColor : Integer;
  730. BEGIN
  731.      HideMouse;
  732.      OldColor := GetColor;
  733.      if OnOff then BevelR(MenuR.A.X, MenuR.A.Y, MenuR.B.X, MenuR.B.Y, white, 8, lightgray, 2)
  734.      ELSE BevelR(MenuR.A.X, MenuR.A.Y, MenuR.B.X, MenuR.B.Y, 8, White, lightgray, 2);
  735.      SetColor(Black);
  736.      Rectangle(MenuR.A.X + 4, MenuR.A.Y + 4, MenuR.B.X - 6, MenuR.B.Y - 6);
  737.      Rectangle(MenuR.A.X + 6, MenuR.A.Y + 6, MenuR.B.X - 4, MenuR.B.Y - 4);
  738.      SetColor(OldColor);
  739.      ShowMouse;
  740. END;
  741.  
  742.  
  743.  
  744. Procedure LView.SetFocus(OnOff : Boolean);
  745. VAR
  746.    Difx,dify, pos,st,space, tw,th  : Integer;
  747.    Atitle                          : string;
  748.    TextInfo                        : TextSettingsType;
  749.    OldColor                        : Integer;
  750. BEGIN
  751.      HideMouse;
  752.      GetTextSettings(TextInfo);
  753.      OldColor:=GetColor;
  754.      SetTextStyle(SmallFont, 0, 5);
  755.      DifX:=(R.B.X-R.A.X);
  756.      DifY:=(R.B.Y-R.A.Y);
  757.      Tw:=TextWidth('M');
  758.      Th:=TextHeight('M');
  759.      SetColor(CTitle);
  760.      Atitle:=Title;
  761.      St:=Length(Atitle) * Tw;
  762.      Space:=(DifX div Tw)-Margin;
  763.      if St > space then Delete(Atitle, Space+1,(St div Tw) - Space);
  764.      St:=length(atitle) * tw;
  765.      Pos:=(R.A.X + (DifX DIV 2)) - (st DIV 2);
  766.  
  767.      If OnOff then FillR(TitleR,CWinTitle) ELSE FillR(TitleR,White);
  768.      SetColor(Black);
  769.      OutTextXY(pos,R.A.Y + (Th DIV 2) + Margin,atitle);
  770.  
  771.      MinMaxButton(true);
  772.      MenuButton(true);
  773.  
  774.      With TextInfo do
  775.           BEGIN
  776.                SetTextJustify(Horiz, Vert);
  777.                SetTextStyle(Font, DiRection, CharSize);
  778.           END;
  779.      SetColor(OldColor);
  780.      ShowMouse;
  781. END;
  782.  
  783.  
  784.  
  785. Procedure LView.Paint;
  786. VAR
  787.   Oldstyle     : LineSettingsType;
  788.   oldcolor     : Word;
  789.   z            : Integer;
  790.   len          : Integer;
  791. BEGIN
  792.      HideMouse;
  793.      Getlinesettings(Oldstyle);
  794.      Setlinestyle(0,0,1);
  795.      Oldcolor:=Getcolor;
  796.      SetColor(Black);
  797.      SetAreas;
  798.      FillR(WorkR, CWinWR);
  799.      SetFocus(True);
  800.      
  801.      Setcolor(8);
  802.      moveto(R.A.X,R.B.Y);
  803.      lineto(R.A.X,R.A.Y);
  804.      lineto(R.B.X,R.A.Y);
  805.  
  806.      len:=0;
  807.  
  808. For z:=0 to 2 do BEGIN
  809.                       Setcolor(white);
  810.                       moveto(R.A.X+len,R.B.Y);
  811.                       lineto(R.A.X+len,R.A.Y+len);
  812.                       lineto(R.B.X-len,R.A.Y+len);
  813.                       inc(len);
  814.                  END;
  815.      len:=3;
  816. For z:=0 to 2 do BEGIN
  817.                       Setcolor(lightgray);
  818.                       moveto(R.A.X+len,R.B.Y);
  819.                       lineto(R.A.X+len,R.A.Y+len);
  820.                       lineto(R.B.X-len,R.A.Y+len);
  821.                       inc(len);
  822.                  END;
  823.      len:=5;
  824. For z:=0 to 2 do BEGIN
  825.                       Setcolor(8);
  826.                       moveto(R.A.X+len,R.B.Y);
  827.                       lineto(R.A.X+len,R.A.Y+len);
  828.                       lineto(R.B.X-len,R.A.Y+len);
  829.                       inc(len);
  830.                  END;
  831.       len:=0;
  832. For z:=0 to 2 do BEGIN
  833.                       Setcolor(8);
  834.                       moveto(R.A.X+len,R.B.Y-len);
  835.                       lineto(R.B.X-len,R.B.Y-len);
  836.                       lineto(R.B.X-len,R.A.Y+len);
  837.                       inc(len);
  838.                  END;
  839.      len:=3;
  840. For z:=0 to 2 do BEGIN
  841.                       Setcolor(lightgray);
  842.                       moveto(R.A.X+len,R.B.Y-len);
  843.                       lineto(R.B.X-len,R.B.Y-len);
  844.                       lineto(R.B.X-len,R.A.Y+len);
  845.                       inc(len);
  846.                  END;
  847.      len:=5;
  848. For z:=0 to 2 do BEGIN
  849.                       Setcolor(white);
  850.                       moveto(R.A.X+len,R.B.Y-len);
  851.                       lineto(R.B.X-len,R.B.Y-len);
  852.                       lineto(R.B.X-len,R.A.Y+len);
  853.                       inc(len);
  854.                  END;
  855.      Setcolor(8);
  856.      moveto(R.A.X+len,R.B.Y-len);
  857.      lineto(R.B.X-len,R.B.Y-len);
  858.      lineto(R.B.X-len,R.A.Y+len);
  859.      Rectangle(R.A.X,R.A.Y,R.B.X-1,R.B.Y-1);
  860.  
  861.      {restore everything}
  862.      Setcolor(OldColor);
  863.  
  864.      With OldStyle do
  865.      SetLineStyle(LineStyle, Pattern,
  866.                Thickness);
  867.  
  868.      Draw;
  869.      ShowMouse;
  870. END;
  871.  
  872.  
  873. Procedure LView.Move( VAR E : Eventype);
  874. VAR
  875.     TmpR    : Rect;
  876.     DifP    : Point;
  877.     OldP    : Point;
  878.     TempE   : Eventype;
  879.     isDone  : Boolean;
  880.     DifX,
  881.     DifY    : Integer;
  882. LABEL
  883.      NextStep;
  884. BEGIN
  885.      IF (NOT IsMoveable) OR MAXIMIZED THEN EXIT ELSE
  886.      TmpR   := Self.R;
  887.      DIfP.X := TmpR.B.X - TmpR.A.X;
  888.      DifP.Y := TmpR.B.Y - TmpR.A.Y;
  889.      DifX   := (E.Mouse.P.X - TmpR.A.X);
  890.      DIfY   := (E.Mouse.P.Y - TmpR.A.Y);
  891.  
  892.      { IF MOVE METHOD CALLED FROM MENU }
  893.      { MOVE VIEW USING KEYBOARD }
  894.      IF E.Command = CMMove THEN
  895.         BEGIN
  896.              DifX := (TitleR.B.X - TItleR.A.X) DIV 2;
  897.              DifY := (TitleR.B.Y - TitleR.A.Y) DIV 2;
  898.              LView.XorBox(TmpR);
  899.              REPEAT
  900.                    Event := GetEvent(TempE);
  901.                    IF TempE.Key.ScanCode <> 0 THEN
  902.                       BEGIN
  903.                            LView.XorBox(TmpR);
  904.                            Case TempE.Key.Scancode OF
  905.                                 Key_UpArrow    :  If TmpR.A.Y > 1 then
  906.                                                      BEGIN
  907.                                                           Dec(TmpR.A.Y,1);
  908.                                                           Dec(TmpR.B.Y,1);
  909.                                                      END;
  910.                                 Key_DownArrow  :  If TmpR.B.Y < GetMaxY then
  911.                                                      BEGIN
  912.                                                           Inc(TmpR.A.Y,1);
  913.                                                           Inc(TmpR.B.Y,1);
  914.                                                      END;
  915.                                 Key_RightArrow :  If TmpR.B.X < GetMaxX THEN
  916.                                                      BEGIN
  917.                                                           Inc(TmpR.A.X,1);
  918.                                                           Inc(TmpR.B.X,1);
  919.                                                      END;
  920.                                 Key_LeftArrow  :  If TmpR.A.X > 1 THEN
  921.                                                      BEGIN
  922.                                                           Dec(TmpR.A.X,1);
  923.                                                           Dec(TmpR.B.X,1);
  924.                                                      END;
  925.                            END; { CASES }
  926.                            LView.XorBox(TmpR);
  927.                       END;
  928.                    isDone := (TempE.Key.Scancode = Key_Enter) OR (TempE.Mouse.Event = 1);
  929.              UNTIL isDONE;
  930.              GOTO NextStep;
  931.         END;
  932.  
  933.      { MOVE VIEW USING MOUSE }
  934.      OldP   := E.Mouse.P;
  935.      MouseCursor(MaskTCROSS, 7,7);
  936.      MouseMinMax(DifX,DifY, GetMaxX - (DIfP.X - DifX),
  937.      GetMaxY - (DIfP.Y - DifY));
  938.      LView.XorBox(TmpR);
  939.      
  940.      Repeat
  941.            Event := GetEvent(TempE);
  942.            If (OldP.X <> TempE.Mouse.P.X) OR
  943.            (OldP.Y <> TempE.Mouse.P.Y)
  944.            THEN
  945.                    BEGIN
  946.                         LView.XorBox(TmpR);
  947.                         TmpR.A.X := (TempE.Mouse.P.X - DifX);
  948.                         TmpR.A.Y := (TempE.Mouse.P.Y - DIfY);
  949.                         TmpR.B.X := (TmpR.A.X + DIfP.X);
  950.                         TmpR.B.Y := (TmpR.A.Y + DIfP.Y);
  951.                         LView.XorBox(TmpR);
  952.                         OldP := TempE.Mouse.P;
  953.                    END;
  954.            isDone:= (TempE.Mouse.Event <> 1) AND (TempE.Mouse.Event <> 5);
  955.      Until isDone;
  956.      MouseMinMax(0,0,GetMaxX,GetMaxY);
  957.  
  958.      NextStep :
  959.      LView.XorBox(TmpR);
  960.      CMCommand := CMPaint;
  961.      PaintR    := R;
  962.      Self.R    := TmpR;
  963.      SetAreas;
  964. END;
  965.  
  966. Procedure LView.Resize(VAR E: Eventype);
  967. VAR
  968.     TmpR    : Rect;
  969.     DifP    : Point;
  970.     OldP    : Point;
  971.     TempE   : Eventype;
  972.     isDone  : Boolean;
  973.     X       : Integer;
  974. LABEL
  975.      NextStep;
  976.  
  977. BEGIN
  978.      IF (NOT IsResizable) OR MAXIMIZED THEN EXIT ELSE
  979.      TmpR   := R;
  980.      DifP.X := E.Mouse.P.X;
  981.      DifP.Y := E.Mouse.P.Y;
  982.      OldP   := E.Mouse.P;
  983.  
  984.      { IF RESIZE METHOD CALLED FROM MENU }
  985.      { RESIZE VIEW USING KEYBOARD }
  986.      IF E.Command = CMResize THEN
  987.         BEGIN
  988.              LView.XorBox(TmpR);
  989.              REPEAT
  990.                    Event := GetEvent(TempE);
  991.                    IF TempE.Key.ScanCode <> 0 THEN
  992.                       BEGIN
  993.                            LView.XorBox(TmpR);
  994.                            Case TempE.Key.Scancode OF
  995.                                 Key_UpArrow    :  If TmpR.B.Y > (TmpR.A.Y + MinSize.Y) THEN
  996.                                                      BEGIN
  997.                                                           Dec(TmpR.B.Y,1);
  998.                                                      END;
  999.                                 Key_DownArrow  :  If TmpR.B.Y < GetMaxY then
  1000.                                                      BEGIN
  1001.                                                           Inc(TmpR.B.Y,1);
  1002.                                                      END;
  1003.                                 Key_RightArrow :  If TmpR.B.X < GetMaxX THEN
  1004.                                                      BEGIN
  1005.                                                           Inc(TmpR.B.X,1);
  1006.                                                      END;
  1007.                                 Key_LeftArrow  :  If TmpR.B.X > (TmpR.A.X + MinSize.X) THEN
  1008.                                                      BEGIN
  1009.                                                           Dec(TmpR.B.X,1);
  1010.                                                      END;
  1011.                            END; { CASES }
  1012.                            LView.XorBox(TmpR);
  1013.                       END;
  1014.                    isDone := (TempE.Key.Scancode = Key_Enter) OR (TempE.Mouse.Event = 1);
  1015.              UNTIL isDONE;
  1016.              GOTO NextStep;
  1017.         END;
  1018.  
  1019.  
  1020.      { IF RESIZE USING MOUSE THEN }
  1021.      IF MOUSEINR(DIFP, R1) OR MOUSEINR(DIFP, R2) THEN    X:=1;
  1022.      IF MOUSEINR(DIFP, R3) THEN                          X:=2;
  1023.      IF MOUSEINR(DIFP, R4) OR MOUSEINR(DIFP, R5) THEN    X:=3;
  1024.      IF MOUSEINR(DIFP, R6) THEN                          X:=4;
  1025.      IF MOUSEINR(DIFP, R7) OR MOUSEINR(DIFP, R8) THEN    X:=5;
  1026.      IF MOUSEINR(DIFP, R9) THEN                          X:=6;
  1027.      IF MOUSEINR(DIFP, R10) OR MOUSEINR(DIFP, R11) THEN  X:=7;
  1028.      IF MOUSEINR(DIFP, R12) THEN                         X:=8;
  1029.  
  1030.      Case X OF
  1031.              1 : MouseMinMax(0, 0, TmpR.B.X - MinSize.X,TmpR.B.Y - MinSize.Y);
  1032.              2 : MouseMinMax(R3.A.X, 0, R3.B.X,TmpR.B.Y - MinSize.Y);
  1033.              3 : MouseMinMax(TmpR.A.X + MinSize.X, 0, GeTMaxX, TmpR.B.Y - MinSize.Y);
  1034.              4 : MouseMinMax(TmpR.A.X + MinSize.X, R6.A.Y, GetMaxX, R6.B.Y);
  1035.              5 : MouseMinMax(TmpR.A.X + MinSize.X,TmpR.A.Y + MinSize.Y, GetMaxX, GetMaxY);
  1036.              6 : MouseMinMax(R9.A.X , TmpR.A.Y + MinSize.Y, R3.B.X, GetMaxY);
  1037.              7 : MouseMinMax(0, TmpR.A.Y + MinSize.Y, TmpR.B.X - MinSize.X, GetMaxY);
  1038.              8 : MouseMinMax(0, R12.A.Y, TmpR.B.X - MinSize.X, R6.B.Y);
  1039.      END;
  1040.  
  1041.      { SELECT A MOUSE CURSOR DEPENDING ON AREA TO BE RESIZED }
  1042.      Case X OF
  1043.              1,5     : MouseCursor(MaskResizeBack, 7,7);
  1044.              3,7     : MouseCursor(MaskResizeForw, 7,7);
  1045.              2,6     : MouseCursor(MaskResizeVert, 7,7);
  1046.              4,8     : MouseCursor(MaskResizeHor , 7,7);
  1047.      END;
  1048.  
  1049.      LView.XorBox(TmpR);
  1050.      Repeat
  1051.            Event := GetEvent(TempE);
  1052.            If (OldP.X <> TempE.Mouse.P.X) OR
  1053.               (OldP.Y <> TempE.Mouse.P.Y) OR
  1054.               (TempE.Key.Scancode <> 0)
  1055.                then
  1056.                       BEGIN
  1057.                            LView.XorBox(TmpR);
  1058.                            IF X = 1 THEN
  1059.                                         BEGIN
  1060.                                              TmpR.A.X := TempE.Mouse.P.X;
  1061.                                              TmpR.A.Y := TempE.Mouse.P.Y;
  1062.                                              TmpR.B.X := TmpR.B.X;
  1063.                                              TmpR.B.Y := TmpR.B.Y;
  1064.                                         END;
  1065.                            IF X = 2 THEN
  1066.                                         BEGIN
  1067.                                              TmpR.A.X := TmpR.A.X;
  1068.                                              TmpR.A.Y := TempE.Mouse.P.Y;
  1069.                                              TmpR.B.X := TmpR.B.X;
  1070.                                              TmpR.B.Y := TmpR.B.Y;
  1071.                                         END;
  1072.                            IF X = 3 THEN
  1073.                                         BEGIN
  1074.                                              TmpR.A.X := TmpR.A.X;  
  1075.                                              TmpR.A.Y := TempE.Mouse.P.Y;
  1076.                                              TmpR.B.X := TempE.Mouse.P.X;
  1077.                                              TmpR.B.Y := TmpR.B.Y;
  1078.                                         END;
  1079.                            IF X = 4 THEN
  1080.                                         BEGIN
  1081.                                              TmpR.A.X := TmpR.A.X;
  1082.                                              TmpR.A.Y := TmpR.A.Y;
  1083.                                              TmpR.B.X := TempE.Mouse.P.X;
  1084.                                              TmpR.B.Y := TmpR.B.Y;
  1085.                                         END;
  1086.                            IF X = 5 THEN
  1087.                                         BEGIN
  1088.                                              TmpR.A.X := TmpR.A.X;
  1089.                                              TmpR.A.Y := TmpR.A.Y;
  1090.                                              TmpR.B.X := TempE.Mouse.P.X;
  1091.                                              TmpR.B.Y := TempE.Mouse.P.Y;
  1092.                                         END;
  1093.                            IF X = 6 THEN
  1094.                                         BEGIN
  1095.                                              TmpR.A.X := TmpR.A.X;
  1096.                                              TmpR.A.Y := TmpR.A.Y;
  1097.                                              TmpR.B.X := TmpR.B.X;
  1098.                                              TmpR.B.Y := TempE.Mouse.P.Y;
  1099.                                         END;
  1100.                            IF X = 7 THEN
  1101.                                         BEGIN
  1102.                                              TmpR.A.X := TempE.Mouse.P.X;
  1103.                                              TmpR.A.Y := TmpR.A.Y;
  1104.                                              TmpR.B.X := TmpR.B.X;
  1105.                                              TmpR.B.Y := TempE.Mouse.P.Y;
  1106.                                         END;
  1107.                            IF X = 8 THEN
  1108.                                         BEGIN
  1109.                                              TmpR.A.X := TempE.Mouse.P.X;
  1110.                                              TmpR.A.Y := TmpR.A.Y;
  1111.                                              TmpR.B.X := TmpR.B.X;
  1112.                                              TmpR.B.Y := TmpR.B.Y;
  1113.                                         END;
  1114.                            LView.XorBox(TmpR);
  1115.                            OldP := TempE.Mouse.P;
  1116.                       END;
  1117.            isDone:= (TempE.Mouse.Event <> 1) AND (TempE.Mouse.Event <> 5) OR
  1118.                     (TempE.Key.Scancode = Key_Enter);
  1119.      Until isDone;
  1120.      { RESET TO ORIGINAL VALUES ALL MOUSE CONSTANTS }
  1121.      MouseMinMax(0,0,GetMaxX,GetMaxY);
  1122.  
  1123.      NextStep :
  1124.      MouseCursor(Standard, 1,1);
  1125.      LView.XorBox(TmpR);
  1126.      CMCommand := CMPaint;
  1127.      PaintR    := R;
  1128.      Self.R    := TmpR;
  1129.      SetAreas;
  1130. END;
  1131.  
  1132.  
  1133. Procedure LView.Clamp(VAR P : Point);
  1134. VAR
  1135.     DifP  : Point;
  1136. BEGIN
  1137.      DifP.X := (R.B.X - R.A.X);
  1138.      DifP.Y := (R.B.Y - R.A.Y);
  1139.      TempR := R;
  1140.      R.A.X := (R.A.X - P.X);
  1141.      R.A.Y := (R.A.Y - P.Y);
  1142.      R.B.X := (R.A.X + DifP.X);
  1143.      R.B.Y := (R.A.Y + DifP.Y);
  1144. END;
  1145.  
  1146. Procedure LView.UnClamp;
  1147. BEGIN
  1148.      R := TempR;
  1149. END;
  1150.  
  1151. Procedure LView.XorBox(VAR RR : Rect);
  1152. VAR
  1153.   Oldstyle: LineSettingsType;
  1154.   oldcolor: Word;
  1155.  
  1156. BEGIN
  1157.      Getlinesettings(Oldstyle);
  1158.      Setlinestyle(1,0,3);
  1159.                  {^---   CHANGE THIS NUMBER TO 0 IF YOU PREFER A SOLID LINE WHEN MOVING }
  1160.      oldcolor:=getcolor;
  1161.      Setcolor(White);
  1162.      Setwritemode(XORput);
  1163.      HideMouse;
  1164.      Rectangle(RR.A.X,RR.A.Y,RR.B.X,RR.B.Y);
  1165.      ShowMouse;
  1166.      {restore everything}
  1167.      Setcolor(oldcolor);
  1168.      with OldStyle do
  1169.      SetLineStyle(LineStyle, Pattern,
  1170.                Thickness);
  1171.      Setwritemode(Normalput);
  1172.  
  1173. END;
  1174.  
  1175.  
  1176. Procedure LView.ExplodeR;
  1177. CONST
  1178.     Step                : Integer = 20;
  1179. VAR
  1180.   LP, RP, Dif, Center   : Point;
  1181.   isDone                : Boolean;
  1182.   Counter, Iterator     : Integer;
  1183. BEGIN
  1184.      HideMouse;
  1185.      Center.X:=(R.B.X-R.A.X) DIV 2;
  1186.      Center.Y:=(R.B.Y-R.A.Y) DIV 2;
  1187.      Dif.X:= (R.B.X-R.A.X);
  1188.      Dif.Y:= (R.B.Y-R.A.Y);
  1189.      IF Dif.X > Dif.Y THEN Iterator:= Dif.X ELSE Iterator:=Dif.Y;
  1190.      LP.X:= Center.X - Step;
  1191.      LP.Y:= Center.Y - Step;
  1192.      RP.X:= Center.X + Step;
  1193.      RP.Y:= Center.Y + Step;
  1194.      SetWriteMode(XORPut);
  1195.      SetLineStyle(SolidLn,0,ThickWidth);
  1196.      Rectangle(LP.X,LP.Y,RP.X,RP.Y);
  1197.      Counter:=Step*2;
  1198.      REPEAT
  1199.            Rectangle(LP.X,LP.Y,RP.X,RP.Y);
  1200.            Dec(LP.X,Step);
  1201.            Dec(LP.Y,Step);
  1202.            Inc(RP.X,Step);
  1203.            Inc(RP.Y,Step);
  1204.            IF LP.X < R.A.X THEN LP.X :=R.A.X;
  1205.            IF LP.Y < R.A.Y THEN LP.Y :=R.A.Y;
  1206.            IF RP.X > R.B.X THEN RP.X :=R.B.X;
  1207.            IF RP.Y > R.B.Y THEN RP.Y :=R.B.Y;
  1208.            Inc(Counter,step*2);
  1209.            Rectangle(LP.X,LP.Y,RP.X,RP.Y);
  1210.            isDONE:= (Counter >= iterator);
  1211.      UNTIL isDONE;
  1212.     Rectangle(LP.X,LP.Y,RP.X,RP.Y);
  1213.     SetLineStyle(SolidLn,0,NormWidth);
  1214.     SetWriteMode(NORmalPut);
  1215.     ShowMouse;
  1216. END;
  1217.  
  1218.  
  1219. Procedure LView.DoMenu( VAR E : EvenType);
  1220. VAR
  1221.    MR, TPos ,
  1222.    TxtR ,
  1223.    TmpR      : Rect;
  1224.    P         : Pointer;
  1225.    Difx,
  1226.    Dify      : Integer;
  1227.    Size      : Integer;
  1228.    Pos       : Integer;
  1229.    IsDone    : Boolean;
  1230.    Event     : Boolean;
  1231.    Selected  : Boolean;
  1232.    X, N      : Integer;
  1233.    Th, Tw    : Integer;
  1234.   TextInfo   : TextSettingsType;
  1235.   TextYPos   : Integer;
  1236.   OldPos     : Integer;
  1237.   AColor     : Integer;
  1238. CONST
  1239.      MaxPos     : Word = 6;
  1240.  
  1241. TYPE
  1242.      BoolArray = ARRAY[1..6] of Boolean;
  1243.      MenuArray = ARRAY[1..6] of String;
  1244.      MenuForm  = RECORD
  1245.          CanSelect : BoolArray;
  1246.          MenuItem  : MenuArray;
  1247.      end;
  1248. VAR
  1249.     LMenu  : MenuForm;
  1250. BEGIN
  1251.      MouseCursor(Standard, 1,1);
  1252.      GetTextSettings(TextInfo);
  1253.      SetTextStyle(SmallFont, 0, 10);
  1254.      SetTextJustify(LeftText, TopText);
  1255.      { SET UP MENU MATRIX }
  1256.      LMenu.MenuItem [1] := 'Restore';
  1257.      LMenu.CanSelect[1] := Maximized AND IsMaximizable;
  1258.      LMenu.MenuItem [2] := 'Maximize';
  1259.      LMenu.CanSelect[2] := (NOT Maximized) AND IsMaximizable;
  1260.      LMenu.MenuItem [3] := 'Close';
  1261.      LMenu.CanSelect[3] := IsCloseable;
  1262.      LMenu.MenuItem [4] := 'Move';
  1263.      LMenu.CanSelect[4] := IsMoveable   AND (NOT Maximized);
  1264.      LMenu.MenuItem [5] := 'Resize';
  1265.      LMenu.CanSelect[5] := IsResizable AND (NOT Maximized);
  1266.      LMenu.MenuItem [6] := 'Switch';
  1267.      LMenu.CanSelect[6] := True;
  1268.  
  1269.      DifX := 80;
  1270.      DifY := 110;
  1271.      MR.A.X:= MenuR.A.X;
  1272.      MR.B.X:= MenuR.A.X + DifX;
  1273.      MR.A.Y:= MenuR.B.Y;
  1274.      MR.B.Y:= MenuR.B.Y + DifY;
  1275.  
  1276.      { CHECK IF MENU WILL FIT INSIDE SCREEN, IF NOT MAKE IT FIT }
  1277.      If MR.B.X > GetMaxX then
  1278.         BEGIN
  1279.              MR.B.X := MenuR.B.X;
  1280.              MR.A.X := MR.B.X - DifX;
  1281.         END;
  1282.      If MR.B.Y > GetMaxY then
  1283.         BEGIN
  1284.              MR.B.Y := MenuR.A.Y;
  1285.              MR.A.Y := MR.B.Y - DifY;
  1286.         END;
  1287.      { PUSH DOWN THE MENU BUTTON }
  1288.      MenuButton(False);
  1289.      { DETERMINE THE SIZE OF IMAGE TO BE SAVED,
  1290.        !!!!  REMEMBER THE LIMIT IS 64 Kb !!!! }
  1291.      Size := ImageSize(MR.A.X, MR.A.Y, MR.B.X, MR.B.Y);
  1292.      { GET MEMORY CHUNK FROM HEAP }
  1293.      GetMem(P, Size);
  1294.      HideMouse;
  1295.      { SAVE THE IMAGE UNDER THE MENU }
  1296.      GetImage(MR.A.X, MR.A.Y, MR.B.X, MR.B.Y, P^);
  1297.      { DRAW A NICE RECTANGLE FOR MENU }
  1298.      BevelR (MR.A.X, MR.A.Y, MR.B.X, MR.B.Y, White, White, lightgray, 2);
  1299.      TxtR.A.X := MR.A.X+3;
  1300.      TxtR.A.Y := MR.A.Y+3;
  1301.      TxtR.B.X := MR.B.X-3;
  1302.      TxtR.B.Y := MR.B.Y-3;
  1303.      { SET FONT AND STUFF }
  1304.      GetTextSettings(TextInfo);
  1305.      SetTextStyle(SmallFont, 0, 5);
  1306.      SetTextJustify(LeftText, TopText);
  1307.      Tw:=TextWidth('M');
  1308.      Th:=TextHeight('M');
  1309.      DifY := (TxtR.B.Y - TxtR.A.Y);
  1310.      TextYPos:= (DifY DIV MaxPos);
  1311.      N := TxtR.A.Y;
  1312.      { DISPLAY MENU ITEMS IN MENU WINDOW }
  1313.      FOR X:=1 TO MaxPos DO
  1314.          BEGIN
  1315.               If LMenu.CanSelect[X] then AColor := white ELSE AColor := 8;
  1316.               SetColor(AColor);
  1317.               OutTextXY(TxtR.A.X + 10, N, LMenu.MenuItem [X]);
  1318.               N:=(N + TextYPos);
  1319.          END;
  1320.      { CALCULATE THE RECT TO FOLLOW MENU OPTIONS AND DISPLAY STATUS }
  1321.      { THE Y POSITION WILL BE CALCULATED DYNAMICALLY IN LOOP BELOW }
  1322.      Pos := 1;
  1323.      TPos.A.X := TxtR.A.X;
  1324.      TPos.A.Y := TxtR.A.Y;
  1325.      TPos.B.X := TxtR.B.X;
  1326.      TPos.B.Y := TxtR.A.Y + TextYPos; 
  1327.      BevelR(TPos.A.X, TPos.A.Y, TPos.B.X, TPos.B.Y,
  1328.             white, 8, lightgray, 2);
  1329.      If LMenu.CanSelect[Pos] then AColor := white ELSE AColor := 8;
  1330.      SetColor(AColor);
  1331.      OutTextXY(TPos.A.X + 9, TPos.A.Y + 2, LMenu.MenuItem[Pos]);
  1332.      ShowMouse;
  1333.      IF E.Mouse.Event = 1 THEN
  1334.      { IF MOUSE IS MAINTAINED PRESSED, WAIT FOR RELEASE IN THIS LOOP }
  1335.      REPEAT
  1336.            Event := GetEvent (E);
  1337.            { A MOUSE EVENT = 2 IS LEFT MOUSE RELEASED, CHECK EVENT CODES IN EMOUSE LIBRARY }
  1338.      UNTIL (E.Key.ScanCode <> 0) OR (E.Mouse.Event = 2);
  1339.      { CLEAR EVENT TO BEGIN NEW MESSAGING }
  1340.      ClearEvent(E);
  1341.      
  1342.      REPEAT
  1343.            Event := GetEvent (E);
  1344.            { DO THE MENU STUFF HERE }
  1345.            {    POS 1 = RESTORE     }
  1346.            {    POS 2 = MAXIMIZE    }
  1347.            {    POS 3 = CLOSE       }
  1348.            {    POS 4 = MOVE        }
  1349.            {    POS 5 = RESIZE      }
  1350.            {    POS 6 = SWITCH      }
  1351.            If MouseinR(E.Mouse.P, TXTR) THEN
  1352.               BEGIN
  1353.                    TmpR   := Tpos;
  1354.                    OldPos := Pos;
  1355.                    N := TxtR.A.Y;
  1356.                    FOR X :=1 TO MaxPos DO
  1357.                        BEGIN
  1358.                             { FIND IF MOUSE IN SELECTION AREA }
  1359.                             IF (E.Mouse.P.Y > N) AND (E.Mouse.P.Y < N+TextYPos) then Pos := X;
  1360.                             Inc(N,TextYPos);
  1361.                        END;
  1362.                    If Pos < 1 then      Pos := 1;
  1363.                    If Pos > MaxPos then Pos := MaxPos;
  1364.                    If Pos = 1 then TPos.A.Y := TxtR.A.Y ELSE
  1365.                    TPos.A.Y := TxtR.A.Y + (TextYPos * (Pos-1));
  1366.                    TPos.B.Y := (TPos.A.Y + TextYPos);
  1367.                    { IF MOUSE POSITION HAS CHANGED THEN UPDATE SELECTION }
  1368.                    IF (Pos <> OldPos) then
  1369.                       BEGIN
  1370.                            HideMouse;
  1371.                            FillR (TmpR, LightGray);
  1372.                            If LMenu.CanSelect[OldPos] then AColor := white ELSE AColor := 8;
  1373.                            SetColor(AColor);
  1374.                            OutTextXY(TmpR.A.X + 7, TmpR.A.Y + 2, LMenu.MenuItem[OldPos]);
  1375.                            BevelR (TPos.A.X, TPos.A.Y, TPos.B.X, TPos.B.Y,
  1376.                                    white, 8, lightgray, 2);
  1377.                            If LMenu.CanSelect[Pos] then AColor := white ELSE AColor := 8;
  1378.                            SetColor(AColor);
  1379.                            OutTextXY(TPos.A.X + 9, TPos.A.Y + 2, LMenu.MenuItem[Pos]);
  1380.                            ShowMouse;
  1381.                       END;
  1382.               END;
  1383.               { IF USER SELECTED ARROW KEYS THEN BROWSE THROUGH SELECTIONS }
  1384.               Case E.Key.ScanCode of
  1385.                    Key_UpArrow   : Begin
  1386.                                         HideMouse;
  1387.                                         FillR (TPos, LightGray);
  1388.                                         If LMenu.CanSelect[Pos] then AColor := white ELSE AColor := 8;
  1389.                                         SetColor(AColor);
  1390.                                         OutTextXY(TPos.A.X + 7, TPos.A.Y + 2, LMenu.MenuItem[Pos]);
  1391.                                         Dec(Pos);
  1392.                                         If Pos < 1 then Pos := MaxPos;
  1393.                                         If Pos = 1 then TPos.A.Y := TxtR.A.Y ELSE
  1394.                                         TPos.A.Y := TxtR.A.Y+ (TextYPos * (Pos-1));
  1395.                                         TPos.B.Y := (TPos.A.Y + TextYPos);
  1396.                                         BevelR(TPos.A.X, TPos.A.Y, TPos.B.X, TPos.B.Y,
  1397.                                                 white, 8, lightgray, 2);
  1398.                                         If LMenu.CanSelect[Pos] then AColor := white ELSE AColor := 8;
  1399.                                         SetColor(AColor);
  1400.                                         OutTextXY(TPos.A.X + 9, TPos.A.Y + 2, LMenu.MenuItem[Pos]);
  1401.                                         ShowMouse;
  1402.                                    end;
  1403.  
  1404.                    Key_DownArrow : Begin
  1405.                                         HideMouse;
  1406.                                         FillR (TPos, LightGray);
  1407.                                         If LMenu.CanSelect[Pos] then AColor := white ELSE AColor := 8;
  1408.                                         SetColor(AColor);
  1409.                                         OutTextXY(TPos.A.X + 7, TPos.A.Y + 2, LMenu.MenuItem[Pos]);
  1410.                                         Inc(Pos);
  1411.                                         If Pos > MaxPos then Pos := 1;
  1412.                                         If Pos < 1 then Pos := MaxPos;
  1413.                                         If Pos = 1 then TPos.A.Y := TxtR.A.Y ELSE
  1414.                                         TPos.A.Y := TxtR.A.Y + (TextYPos * (Pos-1));
  1415.                                         TPos.B.Y := (TPos.A.Y + TextYPos);
  1416.                                         BevelR(TPos.A.X, TPos.A.Y, TPos.B.X, TPos.B.Y,
  1417.                                                 white, 8, lightgray, 2);
  1418.                                         If LMenu.CanSelect[Pos] then AColor := white ELSE AColor := 8;
  1419.                                         SetColor(AColor);
  1420.                                         OutTextXY(TPos.A.X + 9, TPos.A.Y + 2, LMenu.MenuItem[Pos]);
  1421.                                         ShowMouse;
  1422.                                    end;
  1423.            END;
  1424.            { SELECTED MEANS THE USER CHOOSE A MENU SELECTION WITH MOUSE OR HITTING ENTER KEY }
  1425.            Selected := (E.Key.ScanCode = Key_Enter) OR (E.Mouse.Event = 1) AND MouseinR(E.Mouse.P, TxtR);
  1426.            IsDONE:= (E.Key.ScanCode = Key_Enter) AND LMenu.CanSelect[Pos] OR (E.Key.ScanCode = Key_Esc) OR
  1427.                     (E.Mouse.Event = 1) AND LMenu.CanSelect[Pos] OR (E.Mouse.Event = 1) AND (NOT MouseinR(E.Mouse.P, TxtR));
  1428.      UNTIL IsDONE;
  1429.  
  1430.      { RESTORE SCREEN AREA UNDER MENU }
  1431.      HideMouse;
  1432.      PutImage(MR.A.X, MR.A.Y, P^, NormalPut);
  1433.      ShowMouse;
  1434.      { RELEASE MEMORY FROM HEAP }
  1435.      FreeMem(P, Size);
  1436.      { PUSH UP AGAIN THE MENU BUTTON }
  1437.      MenuButton(True);
  1438.      { RESTORE TEXT SETTINGS }
  1439.      With TextInfo do
  1440.           BEGIN
  1441.                SetTextJustify(Horiz, Vert);
  1442.                SetTextStyle(Font, DiRection, CharSize);
  1443.           END;
  1444.      { HANDLE MENU SELECTION }
  1445.      If Selected then
  1446.         BEGIN
  1447.            {    POS 1 = RESTORE     }
  1448.            {    POS 2 = MAXIMIZE    }
  1449.            {    POS 3 = CLOSE       }
  1450.            {    POS 4 = MOVE        }
  1451.            {    POS 5 = RESIZE      }
  1452.            {    POS 6 = SWITCH      }
  1453.              Case Pos of
  1454.                   1 : BEGIN
  1455.                            { MESSAGE TO VIEW }
  1456.                            E.Command := CMRestore;
  1457.                            Restore(E);
  1458.                       END;
  1459.                   2 : BEGIN
  1460.                            { MESSAGE TO VIEW }
  1461.                            E.Command := CMMaximize;
  1462.                            Maximize(E);
  1463.                       END;
  1464.                       { SEND APPLICATION A CLOSE COMMAND FOR THIS VIEW }
  1465.                   3 : CMCommand := CMClose;
  1466.                   4 : BEGIN
  1467.                            { MESSAGE TO VIEW }
  1468.                            E.Command := CMMove;
  1469.                            Move(E);
  1470.                       END;
  1471.                   5 : BEGIN
  1472.                            { MESSAGE TO VIEW }
  1473.                            E.Command := CMResize;
  1474.                            Resize(E);
  1475.                       END;
  1476.                       { CALL THE SWITCH TASK WINDOW }
  1477.                   6 : CMCommand := CMSwitch;
  1478.              END; { END OF CASES }
  1479.         END;      { END OF SELECTED CHOICE }
  1480. END;    { END OF MENU PROCEDURE }
  1481.  
  1482.  
  1483. Procedure LView.Idle;
  1484. BEGIN
  1485. END;
  1486.  
  1487.  
  1488. Procedure LView.HandleEvent(VAR E : Eventype);
  1489. VAR
  1490.    X         : Integer;
  1491.    TmpR1, TmpR2     : Rect;
  1492.    Found     : Boolean;
  1493.  
  1494.  
  1495. BEGIN
  1496.      PaintR := R;
  1497.  
  1498.      { CHECK FIRST FOR ANY KEY PRESSED }
  1499.      If E.Key.ScanCode <> 0 then
  1500.                                 BEGIN
  1501.                                      IF (E.Key.ScanCode = CMMenu) THEN DoMenu(E);
  1502.                                 END;
  1503.      { IF MOUSE IS MOVING ON ANY OF THE PREDETERMINED AREAS THEN CHANGE MOUSE CURSOR }
  1504.      IF (E.Mouse.Event = 5) THEN
  1505.         BEGIN
  1506.              For X := 1 to ViewCount do
  1507.                  Begin
  1508.                       If MouseinR(E.Mouse.P, ViewList.RectList[X]) AND (Place <> X)
  1509.                       then
  1510.                           Begin
  1511.                                MouseCursor(ViewList.MaskList[X], ViewList.P[X].X, ViewList.P[X].Y);
  1512.                                Place := X;
  1513.                           end;
  1514.                  end;
  1515.              If (NOT MouseinR(E.Mouse.P, R)) AND (Place <> 0)
  1516.                 then
  1517.                     Begin
  1518.                          MouseCursor(Standard,1,1);
  1519.                          Place := 0;
  1520.                     end;
  1521.         END;
  1522.  
  1523.  
  1524.      { IF MOUSE BUTTON PRESSED }
  1525.      If (E.Mouse.Event = 1) THEN
  1526.                                 BEGIN
  1527.                                      { IF MOUSE PRESSED ON MOVE AREA THEN SEND MOVE MESSAGE }
  1528.                                      IF MouseinR(E.Mouse.P, TitleR)
  1529.                                         THEN
  1530.                                             BEGIN
  1531.                                                  Move(E);
  1532.                                                  ClearEvent(E);
  1533.                                             END;
  1534.                                      { IS MOUSE PRESSED ON MENU AREA THEN SEND MENU DISPLAY MESSAGE }
  1535.                                      IF MouseinR(E.Mouse.P, MenuR)
  1536.                                         THEN
  1537.                                              BEGIN
  1538.                                                   DoMenu(E);
  1539.                                                   ClearEvent(E);
  1540.                                              END;
  1541.                                      { IF MOUSE PRESSED ON MAXIMIZE AREA THEN MAXIMIZE OR RESTORE ACCORDINGLY }
  1542.                                      If MouseinR(E.Mouse.P, MinMaxR)
  1543.                                         THEN
  1544.                                             BEGIN
  1545.                                                  IF (NOT MAXIMIZED) THEN Maximize(E)
  1546.                                                  ELSE Restore(E);
  1547.                                                  ClearEvent(E);
  1548.                                             END;
  1549.  
  1550.                                      { IF MOUSE ON ANY OF THE RESIZE AREAS THEN SEND RESIZE MESSAGE }
  1551.                                      If MouseinR(E.Mouse.P, R1)  OR
  1552.                                         MouseinR(E.Mouse.P, R2)  OR
  1553.                                         MouseinR(E.Mouse.P, R3)  OR
  1554.                                         MouseinR(E.Mouse.P, R4)  OR
  1555.                                         MouseinR(E.Mouse.P, R5)  OR
  1556.                                         MouseinR(E.Mouse.P, R6)  OR
  1557.                                         MouseinR(E.Mouse.P, R7)  OR
  1558.                                         MouseinR(E.Mouse.P, R8)  OR
  1559.                                         MouseinR(E.Mouse.P, R9)  OR
  1560.                                         MouseinR(E.Mouse.P, R10) OR
  1561.                                         MouseinR(E.Mouse.P, R11) OR
  1562.                                         MouseinR(E.Mouse.P, R12)   
  1563.                                      THEN { RESIZE VIEW IF VIEW NOT MAXIMIZED }
  1564.                                          BEGIN
  1565.                                                Resize(E);
  1566.                                                ClearEvent(E);
  1567.                                          END;
  1568.                                 END;
  1569.  
  1570.     LView.Idle;
  1571. END;
  1572.  
  1573.  
  1574. Procedure LView.MakeLocal(VAR Rin, Rout : Rect);
  1575. BEGIN
  1576.      { CLIP DRAWING COORDINATES TO CURRRENT VIEW }
  1577.      Rout.A.X := (WorkR.A.X + Rin.A.X);
  1578.      Rout.A.Y := (WorkR.A.Y + Rin.A.Y);
  1579.      Rout.B.X := (WorkR.A.X + Rin.B.X);
  1580.      Rout.B.Y := (WorkR.A.Y + Rin.B.Y);
  1581.      IF Rout.A.X > WorkR.B.X THEN Rout.A.X := WorkR.B.X;
  1582.      IF Rout.A.Y > WorkR.B.Y THEN Rout.A.Y := WorkR.B.Y;
  1583.      IF Rout.A.X < WorkR.A.X THEN Rout.A.X := WorkR.A.X;
  1584.      IF Rout.A.Y < WorkR.A.Y THEN Rout.A.Y := WorkR.A.Y;
  1585.  
  1586.      IF Rout.B.X > WorkR.B.X THEN Rout.B.X := WorkR.B.X;
  1587.      IF Rout.B.Y > WorkR.B.Y THEN Rout.B.Y := WorkR.B.Y;
  1588.      IF Rout.B.X < WorkR.A.X THEN Rout.B.X := WorkR.A.X;
  1589.      IF Rout.B.Y < WorkR.A.Y THEN Rout.B.Y := WorkR.A.Y;
  1590. END;
  1591.  
  1592. Procedure LView.FitR ( VAR RL1, RL2 : Rect);
  1593. VAR
  1594.    TP : Point;
  1595. BEGIN
  1596.      TP.X := (RL1.B.X - RL1.A.X);
  1597.      TP.Y := (RL1.B.Y - RL1.A.Y);
  1598.      IF RL2.A.X < 0 THEN RL2.A.X := 0;
  1599.      IF RL2.A.Y < 0 THEN RL2.A.Y := 0;
  1600.      IF RL2.A.X > TP.X THEN RL2.A.X := TP.X;
  1601.      IF RL2.A.Y > TP.Y THEN RL2.A.Y := TP.Y;
  1602.  
  1603.      IF RL2.B.X < 0 THEN RL2.B.X := 0;
  1604.      IF RL2.B.Y < 0 THEN RL2.B.Y := 0;
  1605.      IF RL2.B.X > TP.X THEN RL2.B.X := TP.X;
  1606.      IF RL2.B.Y > TP.Y THEN RL2.B.Y := TP.Y;
  1607. END;
  1608.  
  1609.  
  1610. Procedure LView.PLine(X, Y, X1, Y1: Integer);
  1611. VAR
  1612.    Rin, Rout  : Rect;
  1613. BEGIN
  1614.      Rin.A.X := X;
  1615.      Rin.A.Y := Y;
  1616.      Rin.B.X := X1;
  1617.      Rin.B.Y := Y1;
  1618.      MakeLocal (Rin, Rout);
  1619.      Graph.Line(Rout.A.X, Rout.A.Y, Rout.B.X, Rout.B.Y);
  1620. END;
  1621.  
  1622. Procedure LView.PLineTo(X, Y : Integer);
  1623. VAR
  1624.    Rin, Rout  : Rect;
  1625. BEGIN
  1626.      Rin.A.X := X;
  1627.      Rin.A.Y := Y;
  1628.      MakeLocal (Rin, Rout);
  1629.      Graph.Lineto(Rout.A.X, Rout.A.Y);
  1630. END;
  1631.  
  1632. Procedure LView.PBar(X, Y, X1, Y1: Integer);
  1633. VAR
  1634.    Rin, Rout  : Rect;
  1635. BEGIN
  1636.      Rin.A.X := X;
  1637.      Rin.A.Y := Y;
  1638.      Rin.B.X := X1;
  1639.      Rin.B.Y := Y1;
  1640.      MakeLocal (Rin, Rout);
  1641.      FillR(Rout, GetColor);
  1642. END;
  1643.  
  1644. Procedure LView.PMoveto(X, Y: Integer);
  1645. VAR
  1646.    Rin, Rout  : Rect;
  1647. BEGIN
  1648.      Rin.A.X := X;
  1649.      Rin.A.Y := Y;
  1650.      MakeLocal (Rin, Rout);
  1651.      Graph.Moveto(Rout.A.X, Rout.A.Y);
  1652. END;
  1653.  
  1654. Procedure LView.PRectangle(X, Y, X1, Y1: Integer);
  1655. VAR
  1656.    Rin, Rout  : Rect;
  1657. BEGIN
  1658.      Rin.A.X := X;
  1659.      Rin.A.Y := Y;
  1660.      Rin.B.X := X1;
  1661.      Rin.B.Y := Y1;
  1662.      MakeLocal (Rin, Rout);
  1663.      Graph.Rectangle(Rout.A.X, Rout.A.Y, Rout.B.X, Rout.B.Y);
  1664. END;
  1665.  
  1666.  
  1667. Procedure LView.PPutPixel(X, Y: Integer; Pixel: Word);
  1668. VAR
  1669.    Rin, Rout  : Rect;
  1670. BEGIN
  1671.      Rin.A.X := X;
  1672.      Rin.A.Y := Y;
  1673.      MakeLocal (Rin, Rout);
  1674.      Graph.PutPixel(Rout.A.X, Rout.A.Y, Pixel);
  1675. END;
  1676.  
  1677. Function LView.PGetPixel(X,Y : Integer): Word;
  1678. VAR
  1679.    Rin, Rout  : Rect;
  1680. BEGIN
  1681.      Rin.A.X := X;
  1682.      Rin.A.Y := Y;
  1683.      MakeLocal (Rin, Rout);
  1684.      PGetPixel:=Graph.GetPixel(Rout.A.X, Rout.A.Y);
  1685. END;
  1686.  
  1687.  
  1688.  
  1689. Destructor LView.Done;
  1690. BEGIN
  1691. END;
  1692.  
  1693.  
  1694.  
  1695. CONSTructor LWindow.Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string; color,back:Integer);
  1696. BEGIN
  1697.      LView.Init(X,Y,X1,Y1, anID, atitle);
  1698. END;
  1699.  
  1700. Destructor LWindow.Done;
  1701. BEGIN
  1702.      LView.Done;
  1703. END;
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709. CONSTructor LTTYWindow.Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string);
  1710. BEGIN
  1711.      LView.Init(X,Y,X1,Y1, anID, atitle);
  1712.      TextBackground := Black;
  1713.      TextColor      := White;
  1714.      CWinWR         := Black;
  1715.      Xpos := WorkR.A.X;
  1716.      Ypos := WorkR.A.Y;
  1717. END;
  1718.  
  1719. Procedure LTTYWindow.FitCursorPos;
  1720. BEGIN
  1721.      { FORCE CURSOR POSITION INTO VIEW }
  1722.      IF Xpos < WorkR.A.X THEN Xpos := WorkR.A.X;
  1723.      IF Ypos < WorkR.A.Y THEN Ypos := WorkR.A.Y;
  1724.      IF Xpos > WorkR.B.X THEN Xpos := WorkR.B.X;
  1725.      IF Ypos > WorkR.B.Y THEN Ypos := WorkR.B.Y;
  1726. END;
  1727.  
  1728. Procedure LTTYWindow.SetTextColor (Acolor : integer);
  1729. BEGIN
  1730.       TextColor := Acolor;
  1731. END;
  1732.  
  1733. Procedure LTTYWindow.SetTextBackground (Acolor : integer);
  1734. BEGIN
  1735.       TextBackGround := Acolor;
  1736.       CWinWR         := Acolor;
  1737. END;
  1738.  
  1739.  
  1740. Procedure LTTYWindow.HandleEvent(VAR E : Eventype);
  1741. VAR
  1742.     tw,th              : Integer;
  1743.     TextInfo           : TextSettingsType;
  1744.     ClearR             : Rect;
  1745.     OldColor           : Integer;
  1746.     OldFill            :  FillSettingsType;
  1747. CONST
  1748.      space : integer = 3;
  1749. BEGIN
  1750.       LView.HandleEvent(E);
  1751.       GetTextSettings(TextInfo);
  1752.       SetTextStyle(SmallFont, 0, 5);
  1753.       SetTextJustify(LeftText, TopText);
  1754.       Tw:=TextWidth('M');
  1755.       Th:=TextHeight('M');
  1756.       Th := Th + space;
  1757.       OldColor := GetColor;
  1758.       GetFillSettings(OldFill);
  1759.       Setfillstyle(1,TextBackGround);
  1760.       SetColor(TextColor);
  1761.       FitCursorPos;
  1762.       If (E.Key.ScanCode <> 0) AND E.Key.ASCII then
  1763.          BEGIN
  1764.               Moveto(Xpos,Ypos);
  1765.               Inc(Xpos,Tw);
  1766.               If Xpos > (WorkR.B.X - Tw) then
  1767.                  Begin
  1768.                       Xpos:=WorkR.A.X;
  1769.                       Inc(Ypos, Th);
  1770.                  end;
  1771.               If Ypos > (WorkR.B.Y - Th) then
  1772.                  Begin
  1773.                       Xpos := WorkR.A.X;
  1774.                       Ypos := WorkR.A.Y;
  1775.                  end;
  1776.               HideMouse;
  1777.               ClearR.A.X := Xpos;
  1778.               ClearR.A.Y := Ypos;
  1779.               ClearR.B.X := Xpos + Tw;
  1780.               ClearR.B.Y := Ypos + Th;
  1781.               Bar(ClearR.A.X, ClearR.A.Y + 2, ClearR.B.X - 1, ClearR.B.Y);
  1782.               OutTextXY(Xpos,Ypos,E.Key.CharCode);
  1783.               ShowMouse;
  1784.          END;
  1785.       SetColor(OldColor);
  1786.       With TextInfo do
  1787.            BEGIN
  1788.                 SetTextJustify(Horiz, Vert);
  1789.                 SetTextStyle(Font, DiRection, CharSize);
  1790.            END;
  1791.       With OldFill do
  1792.       SetFillStyle(Pattern, Color);
  1793. END;
  1794.  
  1795.  
  1796. Destructor LTTYWindow.Done;
  1797. BEGIN
  1798.      LView.Done;
  1799. END;
  1800.  
  1801.  
  1802.  
  1803. CONSTructor LDialog.Init (X,Y,X1,Y1 : Integer; anID : Integer; atitle: string);
  1804. BEGIN
  1805.      LView.Init (X,Y,X1,Y1 ,anID,atitle);
  1806.      ObjCount := 0;
  1807.      Focused  := 0;
  1808.      { DIALOGS BY DEFAULT CAN NOT BE RESIZED, THIS CAN BE OVERRIDE YF YOU DECIDE TO RESIZE }
  1809.      CanResize (FALSE);
  1810. END;
  1811.  
  1812. Procedure LDialog.Paint;
  1813. VAR
  1814.    N : Integer;
  1815. BEGIN
  1816.       LView.Paint;
  1817.       IF ObjCount = 0 THEN EXIT ELSE
  1818.       { IF NO CONTROLS ADDED TO WINDOW THEN EXIT HERE }
  1819.       FOR N := 1 to ObjCount do
  1820.       { ELSE PAINT AND SET FOCUS TO CONTROLS }
  1821.           BEGIN
  1822.                 ObjList[N]^.GetOwnerR(R);
  1823.                 ObjList[N]^.Paint;
  1824.                 ObjList[N]^.SetFocus(false);
  1825.       { BY DEFAULT ALL CONTROLS ARE DISABLE TO BEGIN WITH }
  1826.           END;
  1827. END;
  1828.  
  1829. Procedure LDialog.Insert(P : Pointer);
  1830. VAR
  1831.    TmpE : Eventype;
  1832.    TmpR  : Rect;
  1833. BEGIN
  1834.      if ObjCount <> 0 then
  1835.         ObjList[ObjCount]^.SetFocus(False);
  1836.      { CHANGE FOCUS TO NEW CONTROL }
  1837.      Inc(ObjCount,1);
  1838.      Focused :=  ObjCount;
  1839.      ObjList[ObjCount] := P;
  1840.      { ADD THE CONTROL TO PointER LIST }
  1841.      ObjList[ObjCount]^.GetOwnerR (WorkR);
  1842.      TmpR:= ObjList[ObjCount]^.R;
  1843.      FitR (WorkR, TmpR);
  1844.      ObjList[ObjCount]^.SetR (TmpR);
  1845.      ObjList[ObjCount]^.Move (TmpE);
  1846.      { MAKE SURE CONTROL WILL INSIDE WINDOW }
  1847.      ObjList[ObjCount]^.Paint;
  1848.      { PAINT THE CONTROL }
  1849. END;
  1850.  
  1851. Procedure LDialog.Delete(P : PLView);
  1852. BEGIN
  1853.      IF ObjCount = 0 THEN EXIT ELSE
  1854.      ObjList[ObjCount]^.Done;
  1855.      Dispose(ObjList[ObjCount],Done);
  1856.      { DELETE THE CONTROL WITH FOCUS }
  1857.      Dec(ObjCount,1);
  1858.      { DECREMENT THE CONTROL LIST NUMBER }
  1859.      Focused := ObjCount;
  1860. END;
  1861.  
  1862.  
  1863. Procedure LDialog.Move( VAR E : Eventype);
  1864. VAR
  1865.    N      : Integer;
  1866. BEGIN
  1867.      LView.Move(E);
  1868.      { GET NEW WINDOW LOCATION }
  1869.      IF ObjCount = 0 THEN EXIT ELSE
  1870.         For N:=1 to ObjCount do
  1871.         { MOVE ALL THE CONTROLS WITH WINDOW }
  1872.             BEGIN
  1873.                  ObjList[N]^.GetOwnerR(WorkR);
  1874.                  ObjList[N]^.Move(E);
  1875.             END;
  1876. END;
  1877.  
  1878. Procedure LDialog.Resize( VAR E : Eventype);
  1879. VAR
  1880.    N      : Integer;
  1881.    TmpR   : Rect;
  1882. BEGIN
  1883.      LView.Resize(E);
  1884. END;
  1885.  
  1886. Procedure LDialog.Maximize;
  1887. VAR
  1888.    N : Integer;
  1889. BEGIN
  1890.      LView.Maximize(E);
  1891.      IF ObjCount = 0 THEN EXIT ELSE
  1892.         For N:=1 to ObjCount do
  1893.         { MOVE ALL THE CONTROLS WITH WINDOW }
  1894.             BEGIN
  1895.                  ObjList[N]^.GetOwnerR(WorkR);
  1896.                  ObjList[N]^.Move(E);
  1897.             END;
  1898. END;
  1899.  
  1900. Procedure LDialog.Restore;
  1901. VAR
  1902.    N : Integer;
  1903. BEGIN
  1904.      LView.Restore(E);
  1905.      IF ObjCount = 0 THEN EXIT ELSE
  1906.         For N:=1 to ObjCount do
  1907.         { MOVE ALL THE CONTROLS WITH WINDOW }
  1908.             BEGIN
  1909.                  ObjList[N]^.GetOwnerR(WorkR);
  1910.                  ObjList[N]^.Move(E);
  1911.             END;
  1912. END;
  1913.  
  1914.  
  1915. Function LDialog.GetDC : PLView;
  1916. BEGIN
  1917.      If ObjCount = 0 then GetDC := NIL ELSE
  1918.      GetDC:= ObjList[ObjCount];
  1919. END;
  1920.  
  1921.  
  1922. Function LDialog.GetView(VAR P:Point): Integer;
  1923. VAR
  1924.    n          : Integer;
  1925.    isdone,
  1926.    inr        : Boolean;
  1927.    RR         : Rect;
  1928.    WinFound   : Integer;
  1929. BEGIN
  1930.      IF ObjCount = 0 THEN EXIT ELSE
  1931.      { IF STACK IS EMPTY THEN EXIT ELSE }
  1932.      N:=ObjCount;
  1933.      WinFound:=0;
  1934.      InR := False;
  1935.      
  1936.      REPEAT
  1937.            RR := ObjList[N]^.R;
  1938.            InR:=MouseinR(P, RR);
  1939.            If InR then WinFound:=N;
  1940.            Dec(N);
  1941.            IsDONE:=InR or (N = 0);
  1942.      UNTIL IsDONE;
  1943.  
  1944.      If InR then GetView := WinFound else GetView := 0;
  1945.      GetView := WinFound;
  1946. END;
  1947.  
  1948. Procedure LDialog.Clamp(VAR P : Point);
  1949. VAR
  1950.     N : Integer;
  1951. BEGIN
  1952.      LView.Clamp(P);
  1953.      { CLAMP TO VIEWPORT FOR REDRAWING }
  1954.      IF ObjCount = 0 THEN EXIT ELSE
  1955.      { CLAMP ALL CONTROLS TO VIEWPORT FOR REDRAWING }
  1956.         for n:= 1 to ObjCount do
  1957.             ObjList[N]^.Clamp(P);
  1958. END;
  1959.  
  1960. Procedure LDialog.UnClamp;
  1961. VAR
  1962.    N : Integer;
  1963. BEGIN
  1964.      LView.UnClamp;
  1965.      { RESTORE VIEWPORT TO WHOLE SCREEN }
  1966.      IF ObjCount = 0 THEN EXIT ELSE
  1967.         for n:= 1 to ObjCount do
  1968.         { SAME FOR ALL CONTROLS }
  1969.             ObjList[N]^.UnClamp;
  1970. END;
  1971.  
  1972. Procedure LDialog.RotateTop(N:Integer);
  1973. VAR
  1974.    X,Z      : Integer;
  1975. BEGIN
  1976.      IF ObjCount = 0 THEN EXIT ELSE
  1977.      Z:=1;
  1978.      { SAME AS IN APPLICATION }
  1979.      For X:=1 to ObjCount do
  1980.               if X <> N then
  1981.                             BEGIN
  1982.                                  TempList[Z] := ObjList[X];
  1983.                                  Inc(Z);
  1984.                             END;
  1985.     TempList[ObjCount] := ObjList[N];
  1986.     For Z:=1 to ObjCount do Objlist[Z]:= TempList[Z];
  1987. END;
  1988.  
  1989.  
  1990. Procedure LDialog.HandleEvent(VAR E : Eventype);
  1991. VAR
  1992.    N : Integer;
  1993.    P : PLView;
  1994.  
  1995. BEGIN
  1996.      LView.HandleEvent(E);
  1997.      IF ObjCount = 0 THEN EXIT ELSE
  1998.      If (E.Key.ScanCode = Key_Tab)
  1999.      AND (ObjCount <> 0) then
  2000.      { TAB ONE BY ONE ALL THE CONTROLS, CHANGE FOCUS }
  2001.         BEGIN
  2002.              ObjList[ObjCount]^.SetFocus(False);
  2003.              Dec (Focused,1);
  2004.              If Focused < 1 then Focused := ObjCount;
  2005.              If Focused > ObjCount then Focused := 1;
  2006.              ObjList[Focused]^.SetFocus(True);
  2007.              RotateTop(Focused);
  2008.         END;
  2009.  
  2010.      IF (E.Mouse.Event = 1) AND MouseInR(E.Mouse.P, R)
  2011.         then
  2012.      { GET CONTROL WITH MOUSE CLICK }
  2013.         BEGIN
  2014.              N := GetView(E.Mouse.P);
  2015.              IF N <> 0 THEN
  2016.                            BEGIN
  2017.                                 ObjList[ObjCount]^.SetFocus(FALSE);
  2018.                                 { DISABLE THE CONTROL WITH FOCUS }
  2019.                                 ObjList[N]^.Paint;
  2020.                                 { PAINT THE NEW CONTROL }
  2021.                                 RotateTop(N);
  2022.                                 { ROTSTE THE FOCUS TO THE CONTROL }
  2023.                                 P := GetDC;
  2024.                                 IF P <> NIL then
  2025.                                 P^.HandleEvent (E);
  2026.                            END;
  2027.         END;
  2028.      IF (E.Key.ScanCode <> 0) then
  2029.      { SEND KEY PRESSED TO CONTROL HANDLE EVENT METHOD }
  2030.         BEGIN
  2031.              P := GetDC;
  2032.              IF P <> NIL then
  2033.                 P^.HandleEvent (E);
  2034.         END;
  2035. END;
  2036.  
  2037. Destructor LDialog.Done;
  2038. VAR
  2039.    N : Integer;
  2040. BEGIN
  2041.      IF ObjCount <> 0 THEN 
  2042.      { DESTROY ALL CONTROL AND RELEASE MEMORY }
  2043.        for N :=1 to ObjCount do ObjList[N]^.Done;
  2044.      LView.Done;
  2045.      { DESTROY DIALOG }
  2046. END;
  2047.  
  2048.  
  2049.  
  2050. CONSTructor LControl.Init(X,Y,X1,Y1 : Integer);
  2051. VAR
  2052.     DifX, DifY : Integer;
  2053.  
  2054. BEGIN
  2055.      R.A.X := X;
  2056.      R.A.Y := Y;
  2057.      R.B.X := X1;
  2058.      R.B.Y := Y1;
  2059.      { SET RectANGLE LIMITS }
  2060.      MinSize.X := 40;
  2061.      MinSize.Y := 40;
  2062.      DifX:=(R.B.X-R.A.X);
  2063.      DifY:=(R.B.Y-R.A.Y);
  2064.      { SET MINIMUM SIZE OF CONTROL }
  2065.      If (DifX < MinSize.X) then R.B.X:= R.A.X + MinSize.X;
  2066.      If (DifY < MinSize.Y) then R.B.Y:= R.A.Y + MinSize.Y;
  2067.      { OFFSET FROM SCREEN ORIGIN }
  2068.      OffsetX := R.A.X;
  2069.      OffSetY := R.A.Y;
  2070.      If OffsetX < 0 then OffsetX := 0;
  2071.      If OffsetY < 0 then OffsetY := 0;
  2072. END;
  2073.  
  2074. Procedure LControl.Move(VAR E: EvenType);
  2075. VAR
  2076.    DIF   : Point;
  2077. BEGIN
  2078.      { MOVE CONTROL RELATIVE TO OWNER }
  2079.      DIF.X := (R.B.X - R.A.X);
  2080.      DIF.Y := (R.B.Y - R.A.Y);
  2081.      R.A.X := (OwnerR.A.X + OffSetX);
  2082.      R.A.Y := (OwnerR.A.Y + OffSetY);
  2083.      { THE OFFSET IS THE DIFFERENCE BETWEEN THE REAL SCREEN ORIGIN AND THE ACTUAL
  2084.        POSITION OF THE CONTROL }
  2085.      R.B.X := (R.A.X + DIF.X);
  2086.      R.B.Y := (R.A.Y + DIF.Y);
  2087. END;
  2088.  
  2089. Procedure LControl.SetFocus(OnOff : Boolean);
  2090. BEGIN
  2091.      { OVERRIDE THIS METHOD DEPENDING ON THE CONTROL TYPE }
  2092. END;
  2093.  
  2094.  
  2095. Destructor LControl.Done;
  2096. BEGIN
  2097. END;
  2098.  
  2099.  
  2100.  
  2101.  
  2102. CONSTructor LButton.Init(X,Y,X1,Y1 : Integer; wide : Integer; Atitle : String; Acolor: Integer);
  2103. VAR
  2104.     DifX, DifY : Integer;
  2105. BEGIN
  2106.      LControl.Init(X,Y,X1,Y1);
  2107.      Title  := ATitle;
  2108.      Color  := Acolor;
  2109.      TColor := 8;
  2110.      Ispushed := False;
  2111.      Margin := Wide;
  2112.      Key:=GetAKey;
  2113. END;
  2114.  
  2115.  
  2116. Procedure LButton.Paint;
  2117. VAR
  2118.    OldFill      :  FillSettingsType;
  2119.    OldColor     : Integer;
  2120.    Difx,dify,
  2121.    Xpos, Ypos,
  2122.    st, space,
  2123.    tw,th        : Integer;
  2124.    Atitle       : string;
  2125.    TextInfo     : TextSettingsType;
  2126. BEGIN
  2127.      IF (R.A.X < OWNERR.A.X) OR (R.B.X > OWNERR.B.X)
  2128.      OR (R.A.Y < OWNERR.A.Y) OR (R.B.Y > OWNERR.B.Y) THEN EXIT;
  2129.      HideMouse;
  2130.      GetTextSettings(TextInfo);
  2131.      SetTextStyle(SmallFont, 0, 5);
  2132.      OldColor:=GetColor;
  2133.      BevelR(R.A.X, R.A.Y, R.B.X, R.B.Y, white, 8, lightgray, Margin);
  2134.      DifX:=(R.B.X-R.A.X);
  2135.      DifY:=(R.B.Y-R.A.Y);
  2136.      Tw:=TextWidth('M');
  2137.      Th:=TextHeight('M');
  2138.      Atitle := Title;
  2139.      St:=Length(Atitle) * Tw;
  2140.      Space:=(DifX div Tw) - Margin;
  2141.      if St > Space then Delete(Atitle,Space+1,(St div Tw) - Space);
  2142.      St:=length(Atitle) * Tw;
  2143.      Xpos:=(R.A.X + (DifX DIV 2)) - (St DIV 2);
  2144.      Ypos:=(R.A.Y + (DifY DiV 2)) - Th;
  2145.      SetColor(TColor);
  2146.      OutTextXY(Xpos,Ypos, Atitle);
  2147.      SetColor(OldColor);
  2148.      With TextInfo do
  2149.           BEGIN
  2150.                SetTextJustify(Horiz, Vert);
  2151.                SetTextStyle(Font, DiRection, CharSize);
  2152.           END;
  2153.      ShowMouse;
  2154. END;
  2155.      
  2156.  
  2157.  
  2158. Procedure LButton.Push;
  2159. VAR
  2160.    OldFill      :  FillSettingsType;
  2161.    OldColor     : Integer;
  2162.    Difx,dify,
  2163.    Xpos, Ypos,
  2164.    st, space,
  2165.    tw,th        : Integer;
  2166.    Atitle       : string;
  2167.    TextInfo     : TextSettingsType;
  2168. BEGIN
  2169.      IF (R.A.X < OWNERR.A.X) OR (R.B.X > OWNERR.B.X)
  2170.      OR (R.A.Y < OWNERR.A.Y) OR (R.B.Y > OWNERR.B.Y) THEN EXIT;
  2171.      HideMouse;
  2172.      GetTextSettings(TextInfo);
  2173.      SetTextStyle(SmallFont, 0, 5);
  2174.      OldColor:=GetColor;
  2175.      BevelR(R.A.X, R.A.Y, R.B.X, R.B.Y, 8, white, lightgray, Margin);
  2176.      difx:=(R.B.X-R.A.X);
  2177.      dify:=(R.B.Y-R.A.Y);
  2178.      Tw:=TextWidth('M');
  2179.      Th:=TextHeight('M');
  2180.      Atitle := Title;
  2181.      St:=length(Atitle) * Tw;
  2182.      Space:=(difx div Tw)-Margin;
  2183.      if St > Space then Delete(Atitle,Space+1,(St div Tw) - Space);
  2184.      St:=Length(Atitle) * Tw;
  2185.      Xpos:=(R.A.X + (DifX DIV 2)) - (St DIV 2);
  2186.      Ypos:=(R.A.Y + (DifY DiV 2)) - Th;
  2187.      SetColor(Black);
  2188.      OutTextXY(Xpos+5,Ypos+5, Atitle);
  2189.      SetColor(OldColor);
  2190.      ShowMouse;
  2191.      IsPushed := True;
  2192.      With TextInfo do
  2193.           BEGIN
  2194.                SetTextJustify(Horiz, Vert);
  2195.                SetTextStyle(Font, DiRection, CharSize);
  2196.           END;
  2197. END;
  2198.  
  2199. Procedure LButton.SetFocus(OnOff : Boolean);
  2200. BEGIN
  2201.      { CHANGE FOCUS IN BUTTON }
  2202.      { OVERRIDE TO DO SOMETHING DIFFERENT WITH EACH CONTROL TYPE }
  2203.      Case OnOff of
  2204.           TRUE   :
  2205.                  BEGIN
  2206.                       TColor := 8;
  2207.                       Paint;
  2208.                  END;
  2209.  
  2210.           FALSE  :
  2211.                  BEGIN
  2212.                       TColor := White;
  2213.                       Paint;
  2214.                       TColor := 8;
  2215.                  END;
  2216.      END;
  2217.  
  2218. END;
  2219.  
  2220.  
  2221.  
  2222. Function LButton.GetAKey: Word;
  2223.  
  2224. VAR
  2225.     position : byte;
  2226.     achar    : char;
  2227.     N        : Integer;
  2228. BEGIN
  2229.      { CHECK FOR SHORTCUT KEY IN BUTTON }
  2230.      position := Pos('&', Title);
  2231.      If position = 0 then EXIT
  2232.      ELSE
  2233.      for N:=1 to (position + 1) do achar:=Title[N];
  2234.      Delete(Title, position, 1);
  2235.      GetAKey := Word(achar);
  2236. END;
  2237.  
  2238.  
  2239. Procedure LButton.Move(VAR E: EvenType);
  2240. BEGIN
  2241.      LControl.Move(E);
  2242. END;
  2243.  
  2244. Procedure LButton.HandleEvent (VAR E : EvenType);
  2245. VAR
  2246.    TempE     :  Eventype;
  2247.    TmpR      :  Rect;
  2248.    DifP      :  Point;
  2249.    OldP      :  Point;
  2250.    DifX,
  2251.    DifY      :  Integer;
  2252.    Event     :  Boolean;
  2253.    isDone    :  Boolean;
  2254. BEGIN
  2255.      { THE HANDLEEVENT ONLY PUSHES IN AND OUT THE BUTTON }
  2256.      If ((E.Mouse.Event = 1) AND (MouseinR(E.Mouse.P, R)))
  2257.      OR (E.Key.ScanCode = Key_Enter) then
  2258.          BEGIN
  2259.               Push;
  2260.               Wait(100);
  2261.               Paint;
  2262.          END;
  2263.  
  2264. END;
  2265.  
  2266. Destructor LButton.Done;
  2267. BEGIN
  2268. END;
  2269.  
  2270.  
  2271. Constructor LViewLogo.Init;
  2272. BEGIN
  2273.       LDialog.Init(0,0,150,200, 0,'VIEWS-Manager');
  2274.       MinSize.X        := 150;
  2275.       MinSize.Y        := 80;
  2276.       LDIalog.CanClose(False);
  2277.       LDIalog.CanResize(True);
  2278. END;
  2279.  
  2280. Procedure LViewLogo.Draw;
  2281. VAR
  2282.    DifX                          : Word;
  2283.    Th, Tw, OldColor              : Word;
  2284.    MultX, MultY                  : Word;
  2285.    TextInfo                      : TextSettingsType;
  2286.  
  2287. BEGIN
  2288.      GetTextSettings(TextInfo);
  2289.      SetTextStyle(TriplexFont , 0, 1);
  2290.      SetTextJustify(LeftText, TopText);
  2291.      MultX := (WorkR.B.X - WorkR.A.X) DIV 90;
  2292.      MultY := (WorkR.B.Y - WorkR.A.Y) DIV 30;
  2293.      SetUserCharSize(MultX, 1, MultY, 1);
  2294.      Tw:=TextWidth('M');
  2295.      Th:=TextHeight('M');
  2296.      DifX := 20;
  2297.      SetColor(White);
  2298.      OutTextXY(WorkR.A.X + DifX, WorkR.A.Y, 'Views');
  2299.      SetColor(8);
  2300.      Inc(DifX);
  2301.      OutTextXY(WorkR.A.X + DifX, WorkR.A.Y + 1, 'Views');
  2302.      Inc(DifX);
  2303.      OutTextXY(WorkR.A.X + DIfX, WorkR.A.Y + 2, 'Views');
  2304.      Inc(DifX);
  2305.      OutTextXY(WorkR.A.X + DIfX, WorkR.A.Y + 3, 'Views');
  2306.      With TextInfo do
  2307.           BEGIN
  2308.                SetTextJustify(Horiz, Vert);
  2309.                SetTextStyle(Font, DiRection, CharSize);
  2310.           END;
  2311.      SetColor(OldColor);
  2312. END;
  2313.  
  2314. Procedure LViewLogo.Idle;
  2315. Begin
  2316.      ExplodeR;
  2317.      beep;
  2318. end;
  2319.  
  2320. Destructor LViewLogo.Done;
  2321. BEGIN
  2322.  
  2323. END;
  2324.  
  2325.  
  2326.  
  2327.  
  2328. Function OkMsg (Msg : string): Word;
  2329. VAR
  2330.     DL       : PLDialog;
  2331.     B1, B2   : PLButton;
  2332.  
  2333. BEGIN
  2334.  
  2335. END;
  2336.  
  2337.  
  2338.  
  2339. CONSTructor LApp.Init;
  2340. VAR
  2341.    Gd       : Integer;
  2342.    ErrMsg   : String;
  2343.  
  2344. {############ MODE VIDEO TO GRAPHICS MODE, INITIALIZE AND LOAD BGI DRIVER ############}
  2345. FUNCTION InitDevice(Selection:Integer; GraphDriver,GraphMode:Integer) : Integer;
  2346. VAR
  2347.     GrDriver : Integer;
  2348.     GrMode   : Integer;
  2349.     ErrCode  : Integer;
  2350.  
  2351. BEGIN
  2352.  
  2353. { ALL GRAPHICS MODES SUPPORTED BY THE DIFFERENT BGI DRIVERS }
  2354. { Constant    │ Value and Comment
  2355. ══════════════╪════════════════════════════
  2356.  CurrentDriver│-128  For GetModeRange
  2357.  Detect       │   0  Requests autodetection
  2358.  CGA          │   1
  2359.  MCGA         │   2
  2360.  EGA          │   3
  2361.  EGA64        │   4
  2362.  EGAMono      │   5
  2363.  IBM8514      │   6
  2364.  HercMono     │   7
  2365.  ATT400       │   8
  2366.  VGA          │   9
  2367.  PC3270       │  10                         }   
  2368.  
  2369.  ErrCode:=0;
  2370.     Case Selection of
  2371.                      { AUTODETECT }
  2372.                      0: BEGIN
  2373.                              GrDriver := Detect;
  2374.                              InitGraph(GrDriver,GrMode,'');
  2375.                              ErrCode := GraphResult;
  2376.                         END;
  2377.                      { FORCE GRAPHICS MODE }
  2378.                      1: BEGIN
  2379.                              InitGraph(GraphDriver,GraphMode,'');
  2380.                              ErrCode := GraphResult;
  2381.                         END;
  2382.     END; { CASES }
  2383.    InitDevice:= ErrCode;  { CHECK IF ERROR }
  2384. END;
  2385.  
  2386. BEGIN
  2387.      Gd:= InitDevice(0,3,1);
  2388.                     {^-- 0 = AUTODETECT; 1 = FORCE MODE; SEE MODES IN TABLE ABOVE }
  2389.      { MOVE DEVICE TO GRAPHICS }
  2390.      ErrMsg := 'Graphics Device Error...  '+GraphErrorMsg(Gd);
  2391.      If Gd <> 0 then Quit(ErrMsg)
  2392.      { IF AN ERROR OCCURED THEN HALT PROGRAM AND PRINT ERROR }
  2393.      ELSE
  2394.      GraphicsMouse(standard,1,1);
  2395.      ShowMouse;
  2396.      { INITIALIZE MOUSE WITH PointTING ARROW }
  2397.      ObjCount:=0;
  2398.      APColor:=Black;
  2399.      TotalR.A.X := 0;
  2400.      TotalR.A.Y := 0;
  2401.      TotalR.B.X := GetMaxX;
  2402.      TotalR.B.Y := GetMaxY;
  2403.      New(Logo, Init);
  2404.      LApp.Insert(Logo);
  2405. END;
  2406.  
  2407. Procedure LApp.FillR (VAR RFill : Rect; color : Integer);
  2408. CONST
  2409.     Rarea : array[1..4] of PointType =
  2410.    ((X: 0; Y: 0),
  2411.     (X: 0; Y: 0),
  2412.     (X: 0; Y: 0),
  2413.     (X: 0; Y: 0));
  2414.  
  2415. VAR
  2416.     OldFill      :  FillSettingsType;
  2417.     OldColor     :  Integer;
  2418. BEGIN
  2419.       { SAME AS LVIEW }
  2420.       GetFillSettings(OldFill);
  2421.       OldColor := GetColor;
  2422.       Setfillstyle(1,Color);
  2423.       Rarea[1].X:= RFill.A.X;
  2424.       Rarea[1].Y:= RFill.A.Y;
  2425.       Rarea[2].X:= RFill.B.X;
  2426.       Rarea[2].Y:= RFill.A.Y;
  2427.       Rarea[3].X:= RFill.B.X;
  2428.       Rarea[3].Y:= RFill.B.Y;
  2429.       Rarea[4].X:= RFill.A.X;
  2430.       Rarea[4].Y:= RFill.B.Y;
  2431.       FillPoly(SizeOf(Rarea) DIV SizeOf(PointType), Rarea);
  2432.       With OldFill do
  2433.       SetFillStyle(Pattern, Color);
  2434.       SetColor(OldColor);
  2435. END;
  2436.  
  2437. Procedure LApp.Insert (P : PLView);
  2438. BEGIN
  2439.      { CHECK IF ENOUGH MEMORY FOR OPERATION }
  2440.      If MemAvail < 100 then
  2441.                            BEGIN
  2442.                                 Beep;
  2443.                                 EXIT;
  2444.                            END;
  2445.  
  2446.  
  2447.      { GET A NEW PLVIEW OBJECT IN ARRAY LIST }
  2448.      if ObjCount <> 0 then
  2449.      ObjList[ObjCount]^.SetFocus(False);
  2450.      Inc(ObjCount,1);
  2451.      ObjList[ObjCount] := P; { insert Pointer in object list of Pointers }
  2452.      ObjList[ObjCount]^.FitR (TotalR, ObjList[ObjCount]^.R);
  2453.      ObjList[ObjCount]^.SetR(ObjList[ObjCount]^.R);
  2454.      ObjList[ObjCount]^.Paint;
  2455. END;
  2456.  
  2457. Procedure LApp.Destroy(P : PLView);
  2458. BEGIN
  2459.      { DISPOSE OF PLVIEW FROM ARRAY LIST }
  2460.      If ObjCount = 0 then EXIT ELSE
  2461.      ObjList[ObjCount]^.Done;
  2462.      Dispose(ObjList[ObjCount],Done);
  2463.      Dec(ObjCount,1);
  2464. END;
  2465.  
  2466.  
  2467.  
  2468. Function LApp.GetDC : PLView;
  2469. BEGIN
  2470.      If ObjCount = 0 then GetDC := NIL ELSE
  2471.      GetDC:= ObjList[ObjCount];
  2472. END;
  2473.  
  2474. Procedure LApp.Draw;
  2475. VAR
  2476.     N  :  Integer;
  2477. BEGIN
  2478.      If ObjCount = 0 then EXIT ELSE
  2479.      HideMouse;
  2480.      ClearDevice;
  2481.      ShowMouse;
  2482.      for N:=1 to ObjCount-1 do
  2483.          BEGIN
  2484.               ObjList[N]^.Paint;
  2485.               ObjList[N]^.SetFocus(False);
  2486.          END;
  2487.      ObjList[ObjCount]^.Paint;
  2488. END;
  2489.  
  2490.  
  2491. Procedure LApp.Idle;
  2492. BEGIN
  2493.      { PUT ANYTHING HERE TO MIMICK MULTITASKING }
  2494. END;
  2495.  
  2496. Procedure LApp.RotateTop(n:Integer);
  2497. VAR
  2498.    X,Z      : Integer;
  2499. BEGIN
  2500.      Z:=1;
  2501.      { FIND THE VIEW TO ROTATE IN THE PointER ARRAY }
  2502.      For X:=1 to ObjCount do
  2503.               if X <> N then
  2504.                             BEGIN
  2505.                                  TempList[Z] := ObjList[X];
  2506.                                  Inc(Z);
  2507.                             END;
  2508.     TempList[ObjCount] := ObjList[N];
  2509.     For Z:=1 to ObjCount do Objlist[Z]:= TempList[Z];
  2510. END;
  2511.  
  2512. Function LApp.YesNoMsg (Msg : string): Word;
  2513. VAR
  2514.     Size                : Integer;
  2515.     Dx, Dy              : Integer;
  2516.     X, Y, X1, Y1        : Integer;
  2517.     Th, Tw              : Integer;
  2518.     TextInfo            : TextSettingsType;
  2519.     Width, OldColor     : Integer;
  2520. BEGIN
  2521.      GetTextSettings(TextInfo);
  2522.      SetTextStyle(SmallFont, 0, 5);
  2523.      SetTextJustify(LeftText, TopText);
  2524.      OldColor := GetColor;
  2525.      Tw:=TextWidth('M');
  2526.      Th:=TextHeight('M');
  2527.      
  2528.      Size  := Length(Msg);
  2529.      Width := Size * Tw;
  2530.  
  2531.      If Width > GetMaxX THEN
  2532.         BEGIN
  2533.              Delete(Msg,(Width DIV Tw) - Size, Size - ((Width DIV Tw) - 9));
  2534.              Size  := Length(Msg);
  2535.              Width := Size * Tw;
  2536.         END;
  2537.  
  2538.      X  := (GetMaxX DIV 2) - Width;
  2539.      X1 := X + (Width * 2);
  2540.      Y  := (GetMaxY DIV 2) - 60;
  2541.      Y1 := Y + 120;
  2542.  
  2543.      New(DL, Init(X, Y, X1, Y1, -1, Msg));
  2544.      DL^.CanMove    (False);
  2545.      DL^.CanResize  (False);
  2546.      DL^.CanMaximize(False);
  2547.      CanRotate := False;
  2548.      LApp.Insert(DL);
  2549.      SetColor(White);
  2550.      OutTextXY((X1-X) DIV 2 - (Width DIV 2), Y + 30, Msg);
  2551.  
  2552.      With TextInfo do
  2553.           BEGIN
  2554.                SetTextJustify(Horiz, Vert);
  2555.                SetTextStyle(Font, DiRection, CharSize);
  2556.           END;
  2557. END;
  2558.  
  2559.  
  2560.  
  2561.  
  2562. Function LApp.GetView(VAR P:Point): Integer;
  2563. VAR
  2564.    n          : Integer;
  2565.    isdone,
  2566.    inr        : Boolean;
  2567.    R          : Rect;
  2568.    WinFound   : Integer;
  2569. BEGIN
  2570.      If ObjCount = 0 then EXIT;
  2571.      { IF STACK IS EMPTY THEN EXIT ELSE }
  2572.      N:=ObjCount;
  2573.      WinFound:=0;
  2574.      InR := False;
  2575.      
  2576.      REPEAT
  2577.            { REPEAT UNTIL WINDOW IS FOUND OR EVENT IS ABANDONED }
  2578.            R := ObjList[N]^.R;
  2579.            { IS MOUSE CLICK IN WINDOW AREA ? }
  2580.            InR:=MouseinR(P, R);
  2581.            If InR then WinFound:=N;
  2582.            { SCAN FROM TOP OF STACK TO BOTTOM }
  2583.            Dec(N);
  2584.            IsDONE:=InR or (N = 0);
  2585.      UNTIL IsDONE;
  2586.      
  2587.      If InR and (WinFound <> ObjCount) then
  2588.      { IF WINDOW IS NOT FOCUSED ALREADY THEN }
  2589.                                            BEGIN
  2590.                                                 IF NOT CanRotate then
  2591.                                                 { FOCUS IS GRABED BY A WINDOW THEN }
  2592.                                                    BEGIN
  2593.                                                         Beep;
  2594.                                                         EXIT;
  2595.                                                    END;
  2596.                                                 { ELSE IS OK TO ROTATE FOCUS THEN }
  2597.                                                 ObjList[ObjCount]^.SetFocus(FALSE);
  2598.                                                 ObjList[WinFound]^.Paint;
  2599.                                                 LApp.RotateTop(WinFound);
  2600.                                            END;
  2601.      GetView := WinFound;
  2602. END;
  2603.  
  2604.  
  2605. Procedure LApp.SetView( VAR R : Rect);
  2606. BEGIN
  2607.      With VP do
  2608.      { WITH CURRENT VIEWPOORT DO }
  2609.           BEGIN
  2610.                { FRAME RectANGLE }
  2611.                SetViewPort(R.A.X, R.A.Y, R.B.X, R.B.Y, TRUE);
  2612.           END;
  2613. END;
  2614.  
  2615. Procedure LApp.Paint (VAR R : Rect);
  2616. VAR
  2617.     N          :  Integer;
  2618.     ViewPoint  :  Point;
  2619. BEGIN
  2620.      If ObjCount = 0 then
  2621.      { CLEAR DEVICE, NO WINDOWS LEFT }
  2622.         BEGIN
  2623.              Hidemouse;
  2624.              ClearDevice;
  2625.              ShowMouse;
  2626.              EXIT
  2627.         END ELSE
  2628.      ClipR := R;
  2629.      { GET CLIP RectANGLE }
  2630.      ViewPoint.X := ClipR.A.X;
  2631.      ViewPoint.Y := ClipR.A.Y;
  2632.      SetView(ClipR);
  2633.      HideMouse;
  2634.      ClearViewPort;
  2635.      { CLEAN VIEWPORT TO UPDATE }
  2636.      ShowMouse;
  2637.  
  2638.      { THIS IS THE HEART OF THE REDRAWING TECHNIQUE }
  2639.      For N:=1 to ObjCount-1 do
  2640.      { FOR ALL WINDOWS-1 DO }
  2641.          BEGIN
  2642.                HideMouse;
  2643.                ObjList[N]^.Clamp (ViewPoint);
  2644.                { GET AREA OF WINDOW TO PAINT }
  2645.                ObjList[N]^.Paint;
  2646.                ObjList[N]^.SetFocus(False);
  2647.                ObjList[N]^.UnClamp;
  2648.                SetView(ClipR);
  2649.                ShowMouse;
  2650.          END;
  2651.      SetView(TotalR);
  2652.      { RESTORE VIEWPORT TO WHOLE SCREEN }
  2653.      ObjList[ObjCount]^.Paint;
  2654.      { PAINT TOP MOST WINDOW WITH FOCUS ON }
  2655. END;
  2656.  
  2657. Procedure LApp.Switch;
  2658. BEGIN
  2659.      { CALL THE TASK SWITCHER WINDOW }
  2660.      Beep;
  2661. END;
  2662.  
  2663.  
  2664. Procedure LApp.Run;
  2665. VAR
  2666.    Event    : Boolean;
  2667.    E        : Eventype;
  2668.    isE      : Boolean;
  2669.    N        : Integer;
  2670.    P        : PLView;
  2671.    PaintR   : Rect;
  2672.    NR       : Integer;
  2673. BEGIN
  2674.      NR := ObjCount;
  2675.      REPEAT
  2676.      { REPEAT THE APPLICATION MAIN LOOP UNTIL A QUIT COMMAND ARRIVES }
  2677.            CMCommand := 0;
  2678.            { RESET THE COMMAND BUFFER }
  2679.            Event:= GetEvent (E);
  2680.            { GET EVENT METHOD, CHECK EMOUSE.PAS LIBRARY }
  2681.            If Event then
  2682.                         { APPLICATION HANDLE EVENTS METHOD }
  2683.                         BEGIN
  2684.                              { HANDLE SPECIAL EVENTS FIRST }
  2685.                              If E.Key.Extended AND (E.Key.ScanCode = CMSwitch) THEN Switch;
  2686.                              { IF USER ROTATES VIEWS WITH KEYBOARD THEN }
  2687.                              If E.Key.Extended AND (E.Key.ScanCode = CMRotate) AND (ObjCount > 1) AND CanRotate
  2688.                              THEN
  2689.                                 BEGIN
  2690.                                       MouseCursor(Standard, 1,1);
  2691.                                       ObjList[ObjCount]^.SetFocus(False);
  2692.                                       Dec (NR,1);
  2693.                                       If NR < 1 then NR := ObjCount-1;
  2694.                                       ObjList[NR]^.Paint;
  2695.                                       RotateTop(NR);
  2696.                                 END;
  2697.                              If E.Key.Extended AND (E.Key.ScanCode = CMQuit) then LApp.Done;
  2698.                              { IF ALT-X PRESSED THEN QUIT }
  2699.                              
  2700.  
  2701.                              { IF MOUSE EVENT GET VIEW WITH MOUSE CLICK}
  2702.                              If (E.Mouse.Event <> 0) OR (E.Key.ScanCode <> 0)
  2703.                                      then
  2704.                                           BEGIN
  2705.                                                If E.Mouse.Event = 1 then
  2706.                                                N := LApp.GetView(E.Mouse.P);
  2707.                                                P := LApp.GetDC;
  2708.                                                if P <> NIL then
  2709.                                                { SEND MESSAGE TO VIEW AND LET IT HANDLE IT }
  2710.                                                P^.HandleEvent (E);
  2711.                                           END;
  2712.  
  2713.                              If CMCommand <> 0 then
  2714.                                 BEGIN
  2715.                                      Case CMCommand of
  2716.                                      { PROCESS MESSAGES FROM VIEWS }
  2717.                                         CMPaint     :
  2718.                                         { A VIEW SAYS PAINT AREA OF SCREEN }
  2719.                                                     BEGIN
  2720.                                                          P := LApp.GetDC;
  2721.                                                          if P <> NIL then
  2722.                                                          PaintR := P^.PaintR;
  2723.                                                          LApp.Paint (PaintR);
  2724.                                                     END;
  2725.                                         { SOMEBODY WANTS TO CLOSE VIEW WITH FOCUS }
  2726.                                         CMClose     :
  2727.                                         { CLOSE THIS VIEW }
  2728.                                                     BEGIN
  2729.                                                          P := LApp.GetDC;
  2730.                                                          if P <> NIL then
  2731.                                                          { IF WINDOW CAN BE CLOSED THEN }
  2732.                                                          If P^.IsCloseable then
  2733.                                                             BEGIN
  2734.                                                                  PaintR := P^.PaintR;
  2735.                                                                  LApp.Destroy(P);
  2736.                                                                  LApp.Paint(PaintR);
  2737.                                                                  CanRotate := True;
  2738.                                                             END;
  2739.                                                     END;
  2740.                                      END; { Cases }
  2741.                                 END;
  2742.  
  2743.                         END;
  2744.            { PROCESS IDLE EVENTS AT THE END }
  2745.            LApp.Idle;
  2746.      UNTIL FALSE;
  2747. END;
  2748.  
  2749. Destructor LApp.Done;
  2750. BEGIN
  2751.      CloseGraph;
  2752.      { CLOSE GRAPHICS }
  2753.      Quit(' Thanks for using Views');
  2754.      { HALT WITH SOME MESSAGE }
  2755. END;
  2756.  
  2757. BEGIN
  2758.  
  2759. END.
  2760.  
  2761.  
  2762.