OSDN Git Service

新規作成
[gikonavigoeson/gikonavi.git] / RoundData.pas
1 unit RoundData;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Classes,
7         GikoSystem, BoardGroup;
8
9 type
10         TGikoRoundType = (grtBoard, grtItem);
11         TRoundItem = class;
12
13         TRoundList = class(TObject)
14         private
15                 FBoardList: TList;
16                 FItemList: TList;
17                 function GetCount(RoundType: TGikoRoundType): Integer;
18                 function GetRoundItem(Index: Integer; RoundType: TGikoRoundType): TRoundItem;
19                 function ParseRoundLine(Line: string; RoundType: TGikoRoundType): TRoundItem;
20         public
21                 RoundNameList: TStringList;
22
23                 constructor Create;
24                 destructor Destroy; override;
25                 function Add(Board: TBoard): Integer; overload;
26                 function Add(ThreadItem: TThreadItem): Integer; overload;
27                 procedure Delete(Board: TBoard); overload;
28                 procedure Delete(ThreadItem: TThreadItem); overload;
29                 procedure Clear;
30                 function Find(Board: TBoard): Integer; overload;
31                 function Find(ThreadItem: TThreadItem): Integer; overload;
32                 property Count[RoundType: TGikoRoundType]: Integer read GetCount;
33                 property Items[Index: integer; RoundType: TGikoRoundType]: TRoundItem read GetRoundItem;
34                 procedure SetRoundName(Board: TBoard; RoundName: string); overload;
35                 procedure SetRoundName(ThreadItem: TThreadItem; RoundName: string); overload;
36
37                 procedure LoadRoundFile;
38                 procedure SaveRoundFile;
39         end;
40
41         TRoundItem = class(TObject)
42         private
43 //              FBBSType: TGikoBBSType;
44                 FRoundName: string;
45                 FRoundType: TGikoRoundType;
46                 FBBSID: string;
47                 FBoardTitle: string;
48                 FThreadTitle: string;
49                 FFileName: string;
50                 FBoolData: Boolean;             //\82¢\82ë\82¢\82ë\8eg\82¤\82å\82£
51         public
52 //              property BBSType: TGikoBBSType read FBBSType write FBBSType;
53                 property RoundName: string read FRoundName write FRoundName;
54                 property RoundType: TGikoRoundType read FRoundType write FRoundType;
55                 property BBSID: string read FBBSID write FBBSID;
56                 property BoardTitle: string read FBoardTitle write FBoardTitle;
57                 property ThreadTitle: string read FThreadTitle write FThreadTitle;
58                 property FileName: string read FFileName write FFileName;
59                 property BoolData: Boolean read FBoolData write FBoolData;
60         end;
61
62 var
63         RoundList: TRoundList;
64
65 implementation
66 const
67         ROUND_BOARD_FILENAME: string = 'RoundBoard.2ch';        //\82 \82Æ\82ÅBoardGroup\82Ö\88Ú\93®
68         ROUND_ITEM_FILENAME: string  = 'RoundItem.2ch';         //\93¯\8fã
69         ROUND_INDEX_VERSION: string = '1.00';
70
71 constructor TRoundList.Create;
72 begin
73         inherited;
74         FBoardList := TList.Create;
75         FItemList := TList.Create;
76         RoundNameList := TStringList.Create;
77         RoundNameList.Sorted := True;
78         RoundNameList.Duplicates := dupIgnore;
79 end;
80
81 destructor TRoundList.Destroy;
82 begin
83         RoundNameList.Free;
84         Clear;
85         FBoardList.Free;
86         FItemList.Free;
87         inherited;
88 end;
89
90 function TRoundList.Add(Board: TBoard): Integer;
91 var
92         idx: Integer;
93         Item: TRoundItem;
94 begin
95         idx := Find(Board);
96         if idx = -1 then begin
97                 Item := TRoundItem.Create;
98 //              Item.BBSType := gbt2ch; //\82Æ\82è\82 \82¦\82¸
99                 Item.RoundType := grtBoard;
100                 Item.BBSID := Board.BBSID;
101                 Item.BoardTitle := Board.Title;
102                 Item.ThreadTitle := '';
103                 Item.FileName := '';
104                 Item.RoundName := Board.RoundName;
105                 FBoardList.Add(Item);
106         end;
107 end;
108
109 function TRoundList.Add(ThreadItem: TThreadItem): Integer;
110 var
111         idx: Integer;
112         Item: TRoundItem;
113 begin
114         idx := Find(ThreadItem);
115         if idx = -1 then begin
116                 Item := TRoundItem.Create;
117 //              Item.BBSType := gbt2ch; //\82Æ\82è\82 \82¦\82¸
118                 Item.RoundType := grtItem;
119                 Item.BBSID := ThreadItem.ParentBoard.BBSID;
120                 Item.BoardTitle := ThreadItem.ParentBoard.Title;
121                 Item.ThreadTitle := ThreadItem.Title;
122                 Item.FileName := ThreadItem.FileName;
123                 Item.RoundName := ThreadItem.RoundName;
124                 FItemList.Add(Item);
125         end;
126 end;
127
128 procedure TRoundList.Delete(Board: TBoard);
129 var
130         idx: Integer;
131         Item: TRoundItem;
132 begin
133         idx := Find(Board);
134         if idx <> -1 then begin
135                 Item := TRoundItem(FBoardList[idx]);
136                 Item.Free;
137                 FBoardList.Delete(idx);
138         end;
139 end;
140
141 procedure TRoundList.Delete(ThreadItem: TThreadItem);
142 var
143         idx: Integer;
144         Item: TRoundItem;
145 begin
146         idx := Find(ThreadItem);
147         if idx <> -1 then begin
148                 Item := TRoundItem(FItemList[idx]);
149                 Item.Free;
150                 FItemList.Delete(idx);
151         end;
152 end;
153
154 procedure TRoundList.Clear;
155 var
156         i: Integer;
157 begin
158         for i := FBoardList.Count - 1 downto 0 do begin
159                 TRoundItem(FBoardList[i]).Free;
160                 FBoardList.Delete(i);
161         end;
162         for i := FItemList.Count - 1 downto 0 do begin
163                 TRoundItem(FItemList[i]).Free;
164                 FItemList.Delete(i);
165         end;
166 end;
167
168 function TRoundList.Find(Board: TBoard): Integer;
169 var
170         i: Integer;
171         Item: TRoundItem;
172 begin
173         Result := -1;
174         for i := 0 to FBoardList.Count - 1 do begin
175                 Item := TRoundItem(FBoardList[i]);
176                 if Item.FRoundType <> grtBoard then Continue;
177                 if Item.FBBSID = Board.BBSID then begin
178                         Result := i;
179                         Exit;
180                 end;
181         end;
182 end;
183
184 function TRoundList.Find(ThreadItem: TThreadItem): Integer;
185 var
186         i: Integer;
187         Item: TRoundItem;
188 begin
189         Result := -1;
190         for i := 0 to FItemList.Count - 1 do begin
191                 Item := TRoundItem(FItemList[i]);
192                 if Item.FRoundType <> grtItem then Continue;
193                 if (Item.FBBSID = ThreadItem.ParentBoard.BBSID) and (Item.FFileName = ThreadItem.FileName) then begin
194                         Result := i;
195                         Exit;
196                 end;
197         end;
198 end;
199
200 procedure TRoundList.SetRoundName(Board: TBoard; RoundName: string);
201 var
202         idx: Integer;
203         Item: TRoundItem;
204 begin
205         idx := Find(Board);
206         if idx <> -1 then begin
207                 Item := TRoundItem(FBoardList[idx]);
208                 Item.RoundName := RoundName;
209         end;
210 end;
211
212 procedure TRoundList.SetRoundName(ThreadItem: TThreadItem; RoundName: string);
213 var
214         idx: Integer;
215         Item: TRoundItem;
216 begin
217         idx := Find(ThreadItem);
218         if idx <> -1 then begin
219                 Item := TRoundItem(FItemList[idx]);
220                 Item.RoundName := RoundName;
221         end;
222 end;
223
224 function TRoundList.GetCount(RoundType: TGikoRoundType): Integer;
225 begin
226         Result := 0;
227         if RoundType = grtBoard then
228                 Result := FBoardList.Count
229         else if RoundType = grtItem then
230                 Result := FItemList.Count;
231 end;
232
233 function TRoundList.GetRoundItem(Index: Integer; RoundType: TGikoRoundType): TRoundItem;
234 begin
235         Result := nil;
236         if RoundType = grtBoard then begin
237                 if (Index >= 0) and (Index < FBoardList.Count) then
238                         Result := TRoundItem(FBoardList[Index]);
239         end else if RoundType = grtItem then begin
240                 if (Index >= 0) and (Index < FItemList.Count) then
241                         Result := TRoundItem(FItemList[Index]);
242         end;
243 end;
244
245 procedure TRoundList.LoadRoundFile;
246 var
247         i: Integer;
248         sl: TStringList;
249         FileName: string;
250         Item: TRoundItem;
251 begin
252         sl := TStringList.Create;
253         try
254                 //\83{\81[\83h\8f\84\89ñ\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
255                 FileName := GikoSys.GetConfigDir + ROUND_BOARD_FILENAME;
256                 if FileExists(FileName) then begin
257                         sl.LoadFromFile(FileName);
258                         //\82P\8ds\96Ú\82Í\83o\81[\83W\83\87\83\93\82È\82Ì\82Å\96³\8e\8b
259                         for i := 1 to sl.Count - 1 do begin
260                                 Item := ParseRoundLine(sl[i], grtBoard);
261                                 FBoardList.Add(Item);
262                                 RoundNameList.Add(Item.RoundName);
263                         end;
264                 end;
265                 //\83X\83\8c\8f\84\89ñ\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
266                 FileName := GikoSys.GetConfigDir + ROUND_ITEM_FILENAME;
267                 if FileExists(FileName) then begin
268                         sl.LoadFromFile(FileName);
269                         //\82P\8ds\96Ú\82Í\83o\81[\83W\83\87\83\93\82È\82Ì\82Å\96³\8e\8b
270                         for i := 1 to sl.Count - 1 do begin
271                                 Item := ParseRoundLine(sl[i], grtItem);
272                                 FItemList.Add(Item);
273                                 RoundNameList.Add(Item.RoundName);
274                         end;
275                 end;
276         finally
277                 sl.Free;
278         end;
279 end;
280
281 procedure TRoundList.SaveRoundFile;
282 var
283         i: integer;
284         FileName: string;
285         sl: TStringList;
286         s: string;
287         Item: TRoundItem;
288 begin
289         GikoSys.ForceDirectoriesEx(GikoSys.GetConfigDir);
290
291         sl := TStringList.Create;
292         try
293                 FileName := GikoSys.GetConfigDir + ROUND_BOARD_FILENAME;
294                 sl.Add(ROUND_INDEX_VERSION);
295                 for i := 0 to FBoardList.Count - 1 do begin
296                         Item := TRoundItem(FBoardList[i]);
297                         s := Item.BBSID + #1
298                                  + Item.BoardTitle + #1
299                                  + Item.RoundName;
300                         sl.Add(s);
301                 end;
302                 sl.SaveToFile(FileName);
303                 sl.Clear;
304                 FileName := GikoSys.GetConfigDir + ROUND_ITEM_FILENAME;
305                 sl.Add(ROUND_INDEX_VERSION);
306                 for i := 0 to FItemList.Count - 1 do begin
307                         Item := TRoundItem(FItemList[i]);
308                         s := Item.BBSID + #1
309                                  + Item.BoardTitle + #1
310                                  + Item.FileName + #1
311                                  + Item.ThreadTitle + #1
312                                  + Item.RoundName;
313                         sl.Add(s);
314                 end;
315                 sl.SaveToFile(FileName);
316         finally
317                 sl.Free;
318         end;
319 end;
320
321 function TRoundList.ParseRoundLine(Line: string; RoundType: TGikoRoundType): TRoundItem;
322 var
323         s: string;
324         i: Integer;
325 begin
326         Result := TRoundItem.Create;
327         if RoundType = grtBoard then begin
328                 Result.ThreadTitle := '';
329                 Result.FileName := '';
330                 Result.RoundType := grtBoard;
331                 for i := 0 to 2 do begin
332                         s := GikoSys.GetTokenIndex(Line, #1, i);
333                         case i of
334                                 0: Result.BBSID := s;
335                                 1: Result.BoardTitle := s;
336                                 2: Result.RoundName := s;
337                         end;
338                 end;
339         end else if RoundType = grtItem then begin
340                 Result.RoundType := grtItem;
341                 for i := 0 to 4 do begin
342                         s := GikoSys.GetTokenIndex(Line, #1, i);
343                         case i of
344                                 0: Result.BBSID := s;
345                                 1: Result.BoardTitle := s;
346                                 2: Result.FileName := s;
347                                 3: Result.ThreadTitle := s;
348                                 4: Result.RoundName := s;
349                         end;
350                 end;
351         end;
352 end;
353
354 end.