lazarus/examples/dockmanager/easyedit/feditbook.pas
2010-05-05 12:26:23 +00:00

129 lines
2.7 KiB
ObjectPascal

unit fEditBook;
(* Maintain a chain of active (editor) windows.
Move form to front whenever activated.
Dequeue form when destroyed.
The queue head is stored in the global variable MRUEdit.
The EditBook should become a frame, embeddable without docking.
*)
{$mode objfpc}{$H+}
{ TODO : figure out what's wrong with the mru list - with multiple windows }
{.$DEFINE mru} //problems with MRU list???
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
SynEdit,
fDockBook;
type
TEditPage = class(TSynEdit)
protected
function GetFloatingDockSiteClass: TWinControlClass; override;
public
FileName: string;
procedure LoadFile(const AName: string);
end;
TEditBook = class(TEasyDockBook)
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
private
{ private declarations }
protected
NRUEdit: TEditBook; //Next Recently Used EditBook
public
constructor Create(TheOwner: TComponent); override;
function OpenFile(const AName: string): boolean;
end;
var
MRUEdit: TEditBook; //Most Recently Used EditBook
implementation
uses
uMakeSite;
{ TEditBook }
constructor TEditBook.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
//DockMaster.AddElasticSites(self, [alLeft, alRight, alBottom]);
end;
procedure TEditBook.FormActivate(Sender: TObject);
var
prev: TEditBook;
begin
//enQ self as first
if MRUEdit = Self then
exit; //is alread head
prev := MRUEdit;
{$IFDEF mru}
while (prev <> nil) and (prev.NRUEdit <> self) do
prev := prev.NRUEdit;
if prev <> nil then
prev.NRUEdit := self.NRUEdit; //was already in Q
NRUEdit := MRUEdit; //old head
MRUEdit := self; //become head
{$ELSE}
{$ENDIF}
end;
procedure TEditBook.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
prev: TEditBook;
begin
//deQ self
prev := MRUEdit;
{$IFDEF mru}
if prev = self then
MRUEdit := NRUEdit
else begin
while (prev <> nil) and (prev.NRUEdit <> self) do
prev := prev.NRUEdit;
if prev.NRUEdit = self then
prev.NRUEdit := NRUEdit;
//else not in chain?
end;
NRUEdit := nil;
{$ELSE}
{$ENDIF}
end;
function TEditBook.OpenFile(const AName: string): boolean;
var
se: TEditPage;
begin
se := TEditPage.Create(Owner);
se.ManualDock(self);
se.LoadFile(AName);
Result := True;
end;
{ TEditPage }
function TEditPage.GetFloatingDockSiteClass: TWinControlClass;
begin
//Result:=inherited GetFloatingDockSiteClass;
Result := TEditBook; //try auto-wrap
end;
procedure TEditPage.LoadFile(const AName: string);
begin
FileName := AName;
Lines.LoadFromFile(AName);
end;
initialization
{$I feditbook.lrs}
end.