mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 02:01:46 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			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.
 | |
| 
 | 
