1 unit fEditBook;
2 (* Maintain a chain of active (editor) windows.
3   Move form to front whenever activated.
4   Dequeue form when destroyed.
5 
6   The queue head is stored in the global variable MRUEdit.
7 
8   The EditBook should become a frame, embeddable without docking.
9 *)
10 
11 {$mode objfpc}{$H+}
12 
13 { TODO : figure out what's wrong with the mru list - with multiple windows }
14 {.$DEFINE mru} //problems with MRU list???
15 
16 interface
17 
18 uses
19   Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
20   SynEdit,
21   fDockBook;
22 
23 type
24   TEditPage = class(TSynEdit)
25   protected
GetFloatingDockSiteClassnull26     function  GetFloatingDockSiteClass: TWinControlClass; override;
27   public
28     FileName: string;
29     procedure LoadFile(const AName: string);
30   end;
31 
32   TEditBook = class(TEasyDockBook)
33     procedure FormActivate(Sender: TObject);
34     procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
35   private
36     { private declarations }
37   protected
38     NRUEdit: TEditBook; //Next Recently Used EditBook
39   public
40     constructor Create(TheOwner: TComponent); override;
OpenFilenull41     function OpenFile(const AName: string): boolean;
42   end;
43 
44 var
45   MRUEdit: TEditBook; //Most Recently Used EditBook
46 
47 implementation
48 
49 {$R feditbook.lfm}
50 
51 uses
52   uMakeSite;
53 
54 { TEditBook }
55 
56 constructor TEditBook.Create(TheOwner: TComponent);
57 begin
58   inherited Create(TheOwner);
59   //DockMaster.AddElasticSites(self, [alLeft, alRight, alBottom]);
60 end;
61 
62 procedure TEditBook.FormActivate(Sender: TObject);
63 var
64   prev: TEditBook;
65 begin
66 //enQ self as first
67   if MRUEdit = Self then
68     exit; //is alread head
69   prev := MRUEdit;
70 {$IFDEF mru}
71   while (prev <> nil) and (prev.NRUEdit <> self) do
72     prev := prev.NRUEdit;
73   if prev <> nil then
74     prev.NRUEdit := self.NRUEdit; //was already in Q
75   NRUEdit := MRUEdit; //old head
76   MRUEdit := self;  //become head
77 {$ELSE}
78 {$ENDIF}
79 end;
80 
81 procedure TEditBook.FormClose(Sender: TObject; var CloseAction: TCloseAction);
82 var
83   prev: TEditBook;
84 begin
85 //deQ self
86   prev := MRUEdit;
87 {$IFDEF mru}
88   if prev = self then
89     MRUEdit := NRUEdit
90   else begin
91     while (prev <> nil) and (prev.NRUEdit <> self) do
92       prev := prev.NRUEdit;
93     if prev.NRUEdit = self then
94       prev.NRUEdit := NRUEdit;
95     //else not in chain?
96   end;
97   NRUEdit := nil;
98 {$ELSE}
99 {$ENDIF}
100 end;
101 
TEditBook.OpenFilenull102 function TEditBook.OpenFile(const AName: string): boolean;
103 var
104   se: TEditPage;
105 begin
106   se := TEditPage.Create(Owner);
107   se.ManualDock(self);
108   se.LoadFile(AName);
109   Result := True;
110 end;
111 
112 { TEditPage }
113 
TEditPage.GetFloatingDockSiteClassnull114 function TEditPage.GetFloatingDockSiteClass: TWinControlClass;
115 begin
116   //Result:=inherited GetFloatingDockSiteClass;
117   Result := TEditBook; //try auto-wrap
118 end;
119 
120 procedure TEditPage.LoadFile(const AName: string);
121 begin
122   FileName := AName;
123   Lines.LoadFromFile(AName);
124 end;
125 
126 end.
127 
128