-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConfigManager.pas
113 lines (91 loc) · 3.35 KB
/
ConfigManager.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
unit ConfigManager;
interface
uses
ConfigState, PCRE,
Classes, SysUtils, Dialogs, StrUtils;
type
// Observer interface
TConfigManager = class; // Forward declaration
IConfigObserver = interface
['{38E93441-E02B-4F88-9718-4204AE5F085B}']
procedure Update(Subject: TConfigManager);
end;
// Main ConfigManager class, the Subject of the Observer pattern
TConfigManager = class(TObject)
private
FObservers: IInterfaceList;
FCurrentState: TConfigState;
procedure NotifyObservers;
procedure SetState(const NewState: TConfigState);
class function DateReplaceCallback(Match: IMatch): String;
published
constructor Create;
procedure AttachObserver(NewObserver: IConfigObserver);
procedure DetachObserver(Observer: IConfigObserver);
class function ApplyDateMask(const MaskString: String): String;
property CurrentState: TConfigState read FCurrentState write SetState;
end;
var
TheConfigManager: TConfigManager;
implementation
constructor TConfigManager.Create;
begin
FCurrentState := TConfigState.Create;
end;
// Observer handling functions
procedure TConfigManager.AttachObserver(NewObserver: IConfigObserver);
begin
if FObservers = nil then
begin
FObservers := TInterfaceList.Create;
end;
FObservers.Add(NewObserver);
NotifyObservers;
end;
procedure TConfigManager.DetachObserver(Observer: IConfigObserver);
begin
if FObservers <> nil then
begin
FObservers.Remove(Observer);
if FObservers.Count = 0 then
begin
FObservers := nil;
end;
end;
end;
procedure TConfigManager.NotifyObservers;
var
i: Integer;
begin
if fObservers <> nil then
begin
for i := 0 to FObservers.Count - 1
do begin
(FObservers[i] as IConfigObserver).Update( Self );
end;
end;
end;
procedure TConfigManager.SetState(const NewState: TConfigState);
begin
FCurrentState.Free;
// Take a clone of the new state, leaving the caller to free the original
FCurrentState := TConfigState.Clone(NewState);
NotifyObservers;
end;
class function TConfigManager.DateReplaceCallback(Match: IMatch): String;
begin
DateTimeToString(Result, Match.Value, Now());
// Strip the { and } off
// [Delphi strings are indexed 1..N, we want 2..N-1, which has length N-2]
Result := MidStr(Result, 2, Length(Result)-2);
end;
class function TConfigManager.ApplyDateMask(const MaskString: String): String;
var
ReplaceRegex: IRegex;
Callback: TRegexMatchEvaluator;
begin
ReplaceRegex := RegexCreate('{.*?}');
Callback := DateReplaceCallback;
Result := ReplaceRegex.Replace(MaskString, Callback);
end;
end.