mirror of https://gitlab.com/basile.b/dexed.git
250 lines
5.2 KiB
Plaintext
250 lines
5.2 KiB
Plaintext
unit u_mru;
|
|
|
|
{$I u_defines.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,
|
|
u_interfaces, u_observer, u_synmemo, u_common;
|
|
|
|
type
|
|
|
|
(**
|
|
* 'Most Recently Used' list for strings.
|
|
*)
|
|
TMruList = class(TStringList)
|
|
private
|
|
fMaxCount: Integer;
|
|
fObj: TObject;
|
|
protected
|
|
fChecking: boolean;
|
|
procedure clearOutOfRange;
|
|
procedure setMaxCount(value: Integer);
|
|
function checkItem(const value: string): boolean; virtual;
|
|
procedure Put(index: Integer; const value: string); override;
|
|
procedure InsertItem(index: Integer; const value: string); override;
|
|
published
|
|
property maxCount: Integer read fMaxCount write setMaxCount;
|
|
public
|
|
constructor create; virtual;
|
|
procedure Insert(index: Integer; const value: string); override;
|
|
property objectTag: TObject read fObj write fObj;
|
|
end;
|
|
|
|
(**
|
|
* MRU list for filenames.
|
|
*)
|
|
TMRUFileList = class(TMruList)
|
|
private
|
|
fRemoveNotExisting: boolean;
|
|
protected
|
|
function checkItem(const value: string): boolean; override;
|
|
public
|
|
constructor create; override;
|
|
procedure assign(source: TPersistent); override;
|
|
property removeNotExisting: boolean read fRemoveNotExisting write fRemoveNotExisting;
|
|
end;
|
|
|
|
(**
|
|
* MRU list for D/text files.
|
|
* Insertion is automatic (IDocumentObserver).
|
|
*)
|
|
TMRUDocumentList = class(TMRUFileList, IDocumentObserver)
|
|
private
|
|
procedure docNew(document: TDexedMemo);
|
|
procedure docFocused(document: TDexedMemo);
|
|
procedure docChanged(document: TDexedMemo);
|
|
procedure docClosing(document: TDexedMemo);
|
|
public
|
|
constructor create; override;
|
|
destructor destroy; override;
|
|
end;
|
|
|
|
(**
|
|
* MRU list for the ceodit projects.
|
|
* Insertion is automatic (IProjectObserver).
|
|
*)
|
|
TMRUProjectList = class(TMRUFileList, IProjectObserver)
|
|
private
|
|
procedure projNew(project: ICommonProject);
|
|
procedure projChanged(project: ICommonProject);
|
|
procedure projClosing(project: ICommonProject);
|
|
procedure projFocused(project: ICommonProject);
|
|
procedure projCompiling(project: ICommonProject);
|
|
procedure projCompiled(project: ICommonProject; success: boolean);
|
|
public
|
|
constructor create; override;
|
|
destructor destroy; override;
|
|
end;
|
|
|
|
(**
|
|
* MRU list for the ceodit projects group.
|
|
* Managed manually since only 1 group exists.
|
|
*)
|
|
TMRUProjectsGroupList = class(TMRUFileList)
|
|
end;
|
|
|
|
implementation
|
|
|
|
constructor TMruList.Create;
|
|
begin
|
|
fMaxCount := 10;
|
|
end;
|
|
|
|
procedure TMruList.clearOutOfRange;
|
|
begin
|
|
while Count > fMaxCount do
|
|
delete(Count-1);
|
|
end;
|
|
|
|
procedure TMruList.setMaxCount(value: Integer);
|
|
begin
|
|
if value < 0 then
|
|
value := 0;
|
|
if fMaxCount = value then
|
|
exit;
|
|
fMaxCount := value;
|
|
clearOutOfRange;
|
|
end;
|
|
|
|
function TMruList.checkItem(const value: string): boolean;
|
|
var
|
|
i: integer;
|
|
begin
|
|
i := indexOf(value);
|
|
if i = -1 then
|
|
exit(true);
|
|
if i = 0 then
|
|
exit(false);
|
|
if Count < 2 then
|
|
exit(false);
|
|
exchange(i, i-1);
|
|
exit( false);
|
|
end;
|
|
|
|
procedure TMruList.Put(index: Integer; const value: string);
|
|
begin
|
|
if not (checkItem(value)) then
|
|
exit;
|
|
inherited;
|
|
clearOutOfRange;
|
|
end;
|
|
|
|
procedure TMruList.InsertItem(index: Integer; const value: string);
|
|
begin
|
|
if not (checkItem(value)) then
|
|
exit;
|
|
inherited;
|
|
clearOutOfRange;
|
|
end;
|
|
|
|
procedure TMruList.Insert(index: Integer; const value: string);
|
|
begin
|
|
if not (checkItem(value)) then
|
|
exit;
|
|
inherited;
|
|
clearOutOfRange;
|
|
end;
|
|
|
|
constructor TMRUFileList.create;
|
|
begin
|
|
inherited;
|
|
{$IFDEF WINDOWS}
|
|
CaseSensitive := true;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
procedure TMRUFileList.assign(source: TPersistent);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
inherited;
|
|
for i := Count-1 downto 0 do
|
|
if not Strings[i].fileExists then
|
|
Delete(i);
|
|
end;
|
|
|
|
function TMRUFileList.checkItem(const value: string): boolean;
|
|
begin
|
|
result := inherited checkItem(value);
|
|
if fRemoveNotExisting then
|
|
result := result and value.fileExists;
|
|
end;
|
|
|
|
constructor TMRUDocumentList.create;
|
|
begin
|
|
inherited;
|
|
EntitiesConnector.addObserver(self);
|
|
end;
|
|
|
|
destructor TMRUDocumentList.destroy;
|
|
begin
|
|
EntitiesConnector.removeObserver(self);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TMRUDocumentList.docNew(document: TDexedMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUDocumentList.docFocused(document: TDexedMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUDocumentList.docChanged(document: TDexedMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUDocumentList.docClosing(document: TDexedMemo);
|
|
begin
|
|
if document.fileName.fileExists and not document.isTemporary then
|
|
Insert(0, document.fileName);
|
|
end;
|
|
|
|
constructor TMRUProjectList.create;
|
|
begin
|
|
inherited;
|
|
EntitiesConnector.addObserver(self);
|
|
end;
|
|
|
|
destructor TMRUProjectList.destroy;
|
|
begin
|
|
EntitiesConnector.removeObserver(self);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TMRUProjectList.projNew(project: ICommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUProjectList.projFocused(project: ICommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUProjectList.projChanged(project: ICommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUProjectList.projCompiling(project: ICommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUProjectList.projCompiled(project: ICommonProject; success: boolean);
|
|
begin
|
|
end;
|
|
|
|
procedure TMRUProjectList.projClosing(project: ICommonProject);
|
|
var
|
|
fname: string;
|
|
begin
|
|
if project = nil then
|
|
exit;
|
|
|
|
fname := project.filename;
|
|
if fname.fileExists then
|
|
Insert(0, fname);
|
|
end;
|
|
|
|
end.
|