source: trunk/Units/Project.pas

Last change on this file was 24, checked in by chronos, 12 days ago
  • Fixed: Test cases executed with FormTests form from Common package.
File size: 4.5 KB
Line 
1unit Project;
2
3interface
4
5uses
6 Classes, SysUtils, VCS, Backend, Generics.Collections, DOM, XMLRead, XMLWrite,
7 XML, LazFileUtils;
8
9type
10
11{ TProject }
12
13 TProject = class
14 private
15 FBackend: TBackend;
16 function GetDirectory: string;
17 function GetRepositoryURL: string;
18 procedure SetDirectory(AValue: string);
19 procedure SetRepositoryURL(AValue: string);
20 procedure SetBackend(AValue: TBackend);
21 public
22 WorkingCopy: TWorkingCopy;
23 Repository: TRepository;
24 procedure Open(Directory: string);
25 constructor Create;
26 destructor Destroy; override;
27 procedure LoadXMLNOde(Node: TDOMNode);
28 procedure SaveXMLNOde(Node: TDOMNode);
29 property Backend: TBackend read FBackend write SetBackend;
30 property Directory: string read GetDirectory write SetDirectory;
31 property RepositoryURL: string read GetRepositoryURL write SetRepositoryURL;
32 end;
33
34 { TProjects }
35
36 TProjects = class(TObjectList<TProject>)
37 procedure LoadXMLNode(Node: TDOMNode);
38 procedure SaveXMLNode(Node: TDOMNode);
39 end;
40
41 { TProjectGroup }
42
43 TProjectGroup = class
44 FileName: string;
45 Projects: TProjects;
46 constructor Create;
47 destructor Destroy; override;
48 procedure LoadFromFile(FileName: string);
49 procedure SaveToFile(FileName: string);
50 end;
51
52
53implementation
54
55resourcestring
56 SWrongFileFormat = 'Wrong file format';
57
58{ TProjects }
59
60procedure TProjects.LoadXMLNode(Node: TDOMNode);
61var
62 NewProject: TProject;
63 Node2: TDOMNode;
64begin
65 Node2 := Node.FirstChild;
66 while Assigned(Node2) and (Node2.NodeName = 'Project') do begin
67 NewProject := TProject.Create;
68 NewProject.LoadXMLNode(Node2);
69 Add(NewProject);
70 Node2 := Node2.NextSibling;
71 end;
72end;
73
74procedure TProjects.SaveXMLNode(Node: TDOMNode);
75var
76 I: Integer;
77 NewNode: TDOMNode;
78begin
79 for I := 0 to Count - 1 do begin;
80 NewNode := Node.OwnerDocument.CreateElement('Project');
81 Node.AppendChild(NewNode);
82 Items[I].SaveXMLNode(NewNode);
83 end;
84end;
85
86{ TProjectGroup }
87
88constructor TProjectGroup.Create;
89begin
90 Projects := TProjects.Create;
91end;
92
93destructor TProjectGroup.Destroy;
94begin
95 FreeAndNil(Projects);
96 inherited;
97end;
98
99procedure TProjectGroup.LoadFromFile(FileName: string);
100var
101 Doc: TXMLDocument;
102 RootNode: TDOMNode;
103 Node: TDOMNode;
104 Node2: TDOMNode;
105begin
106 Self.FileName := FileName;
107 ReadXMLFile(Doc, UTF8Decode(FileName));
108 with Doc do try
109 if Doc.DocumentElement.NodeName <> 'ProjectGroup' then
110 raise Exception.Create(SWrongFileFormat);
111 RootNode := Doc.DocumentElement;
112 with RootNode do begin
113 Node := FindNode('Projects');
114 if Assigned(Node) then Projects.LoadXMLNode(Node);
115 end;
116 finally
117 Doc.Free;
118 end;
119end;
120
121procedure TProjectGroup.SaveToFile(FileName: string);
122var
123 NewNode: TDOMNode;
124 Doc: TXMLDocument;
125 RootNode: TDOMNode;
126begin
127 if FileName = '' then Exit;
128 Self.FileName := FileName;
129 Doc := TXMLDocument.Create;
130 with Doc do try
131 RootNode := CreateElement('ProjectGroup');
132 AppendChild(RootNode);
133 with RootNode do begin
134 NewNode := OwnerDocument.CreateElement('Projects');
135 AppendChild(NewNode);
136 Projects.SaveXMLNode(NewNode);
137 end;
138 ForceDirectories(ExtractFileDir(FileName));
139 WriteXMLFile(Doc, FileName);
140 finally
141 Doc.Free;
142 end;
143end;
144
145{ TProject }
146
147procedure TProject.SetBackend(AValue: TBackend);
148begin
149 if FBackend = AValue then Exit;
150 FBackend := AValue;
151 FreeAndNil(WorkingCopy);
152 WorkingCopy := AValue.WorkingCopyClass.Create;
153 FreeAndNil(Repository);
154 Repository := AValue.RepositoryClass.Create;
155end;
156
157function TProject.GetDirectory: string;
158begin
159 Result := WorkingCopy.Path;
160end;
161
162function TProject.GetRepositoryURL: string;
163begin
164 Result := WorkingCopy.RepositoryURL;
165end;
166
167procedure TProject.SetDirectory(AValue: string);
168begin
169 WorkingCopy.Path := AValue;
170end;
171
172procedure TProject.SetRepositoryURL(AValue: string);
173begin
174 WorkingCopy.RepositoryURL := AValue;
175 Repository.Path := AValue;
176end;
177
178procedure TProject.Open(Directory: string);
179begin
180 WorkingCopy.Path := Directory;
181end;
182
183constructor TProject.Create;
184begin
185 WorkingCopy := TWorkingCopy.Create;
186 Repository := TRepository.Create;
187end;
188
189destructor TProject.Destroy;
190begin
191 FreeAndNil(WorkingCopy);
192 FreeAndNil(Repository);
193 inherited;
194end;
195
196procedure TProject.LoadXMLNOde(Node: TDOMNode);
197begin
198 RepositoryURL := ReadString(Node, 'RepositoryURL', '');
199 Directory := ReadString(Node, 'Directory', '');
200end;
201
202procedure TProject.SaveXMLNOde(Node: TDOMNode);
203begin
204 WriteString(Node, 'RepositoryURL', RepositoryURL);
205 WriteString(Node, 'Directory', Directory);
206end;
207
208end.
209
Note: See TracBrowser for help on using the repository browser.