6 Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
7 GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc;
8 {SAX, SAXHelpers, SAXComps, SAXKW;}
11 TFavoriteFolder = class
14 TFavoriteBoardItem = class
19 property BBSID: string read FBBSID write FBBSID;
20 property BoardName: string read FBoardName write FBoardName;
23 TFavoriteThreadItem = class
29 property BBSID: string read FBBSID write FBBSID;
30 property ThreadID: string read FThreadID write FThreadID;
31 property ThreadName: string read FThreadName write FThreadName;
34 TFavoriteDM = class(TDataModule)
35 procedure DataModuleCreate(Sender: TObject);
36 procedure DataModuleDestroy(Sender: TObject);
42 procedure ReadNode(Node: IXMLNode);
43 procedure AddSaveString(Node: TTreeNode; SaveList: TStringList);
44 // procedure AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);
45 // procedure SAXStartDocument(Sender: TObject);
46 // procedure SAXEndDocument(Sender: TObject);
47 // procedure SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; const Atts: IAttributes);
48 // procedure SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
49 // procedure SAXCharacters(Sender: TObject; const PCh: SAXString);
52 function GetFavoriteFilePath() : String;
53 function SaveFavoriteFile(FileName: String) : Boolean;
54 procedure SetFavTreeView(TreeView: TTreeView);
55 procedure ReadFavorite;
56 procedure WriteFavorite;
57 property TreeView: TTreeView read FTreeView;
61 FavoriteDM: TFavoriteDM;
63 FAVORITE_LINK_NAME = '
\83\8a\83\93\83N';
68 FAVORITE_ROOT_NAME = '
\82¨
\8bC
\82É
\93ü
\82è';
69 FAVORITE_FILE_NAME = 'Favorite.xml';
73 procedure TFavoriteDM.DataModuleCreate(Sender: TObject);
75 //FTreeView := TreeView;
76 //FTreeView := GikoForm.FavoriteTreeView;
79 procedure TFavoriteDM.DataModuleDestroy(Sender: TObject);
83 for i := 0 to TreeView.Items.Count - 1 do begin
84 TObject(TreeView.Items[i].Data).Free;
88 procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);
90 FTreeView := TreeView;
93 procedure TFavoriteDM.ReadFavorite;
100 FavFolder: TFavoriteFolder;
104 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
106 FavFolder := TFavoriteFolder.Create;
107 Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder);
108 Node.ImageIndex := 14;
109 Node.SelectedIndex := 14;
111 if FileExists(FileName) then begin
113 XMLDoc := LoadXMLDocument(FileName);
114 XMLNode := XMLDoc.DocumentElement;
116 FStack := TStack.Create;
120 if XMLNode.NodeName = 'favorite' then begin
121 for i := 0 to XMLNode.ChildNodes.Count - 1 do begin
122 ReadNode(XMLNode.ChildNodes[i]);
123 if (XMLNode.ChildNodes[i].NodeName = 'folder') and
124 (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin
129 if not LinkExists then begin
130 FavFolder := TFavoriteFolder.Create;
131 Node := FTreeView.Items.AddChildObject(Node, FAVORITE_LINK_NAME, FavFolder);
132 Node.ImageIndex := 14;
133 Node.SelectedIndex := 14;
143 FavFolder := TFavoriteFolder.Create;
144 Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder);
145 Node.ImageIndex := 12;
146 Node.SelectedIndex := 13;
148 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
149 if not FileExists(FileName) then
152 FavSAXHandler.OnStartDocument := SAXStartDocument;
153 FavSAXHandler.OnEndDocument := SAXEndDocument;
154 FavSAXHandler.OnStartElement := SAXStartElement;
155 FavSAXHandler.OnStartElement := SAXStartElement;
156 FavSAXHandler.OnEndElement := SAXEndElement;
157 FavSAXHandler.OnCharacters := SAXCharacters;
159 FavSAXReader.Vendor := 'Keith Wood';
160 FavSAXReader.URL := FileName;
164 procedure TFavoriteDM.ReadNode(Node: IXMLNode);
168 ParentNode: TTreeNode;
169 CurrentNode: TTreeNode;
170 FavFolder: TFavoriteFolder;
171 FavBoard: TFavoriteBoardItem;
172 FavThread: TFavoriteThreadItem;
174 if Node.NodeName = 'folder' then begin
175 ParentNode := FStack.Peek;
176 if TObject(ParentNode.Data) is TFavoriteFolder then begin
177 FavFolder := TFavoriteFolder.Create;
178 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavFolder);
179 CurrentNode.ImageIndex := 14;
180 CurrentNode.SelectedIndex := 14;
181 FStack.Push(CurrentNode);
183 for i := 0 to Node.ChildNodes.Count - 1 do begin
184 ReadNode(Node.ChildNodes[i]);
186 if FStack.Count <> 0 then
188 end else if Node.NodeName = 'favitem' then begin
189 ParentNode := FStack.Peek;
190 if TObject(ParentNode.Data) is TFavoriteFolder then begin
191 if Node.Attributes['favtype'] = 'board' then begin
192 FavBoard := TFavoriteBoardItem.Create;
193 FavBoard.BBSID := Node.Attributes['bbs'];
194 FavBoard.BoardName := Node.Attributes['boardname'];
195 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavBoard);
196 CurrentNode.ImageIndex := 15;
197 CurrentNode.SelectedIndex := 15;
198 end else if Node.Attributes['favtype'] = 'thread' then begin
199 FavThread := TFavoriteThreadItem.Create;
200 FavThread.BBSID := Node.Attributes['bbs'];
201 FavThread.ThreadID := Node.Attributes['thread'];
202 FavThread.ThreadName := Node.Attributes['threadname'];
203 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavThread);
204 CurrentNode.ImageIndex := 16;
205 CurrentNode.SelectedIndex := 16;
211 procedure TFavoriteDM.WriteFavorite;
215 // SaveList: TStringList;
219 XMLDoc: IXMLDocument;
221 // FavoNode: IXMLNode;
223 XMLDoc := NewXMLDocument;
224 XMLDoc.Encoding := 'Shift_JIS';
225 XMLDoc.StandAlone := 'yes';
226 XMLNode := XMLDoc.AddChild('favorite');
227 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
228 AddSaveString(TreeView.Items.GetFirstNode, XMLNode);
229 XMLDoc.SaveToFile(FileName);
233 SaveList: TStringList;
235 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
236 SaveList := TStringList.Create;
238 SaveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
239 SaveList.Add('<favorite>');
240 AddSaveString(TreeView.Items.GetFirstNode, SaveList);
241 SaveList.Add('</favorite>');
242 SaveList.SaveToFile(FileName);
249 procedure TFavoriteDM.AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);
253 FavBoard: TFavoriteBoardItem;
254 FavThread: TFavoriteThreadItem;
257 for i := 0 to Node.Count - 1 do begin
258 if TObject(Node.Item[i].Data) is TFavoriteFolder then begin
259 FavNode := XMLNode.AddChild('folder');
260 FavNode.Attributes['title'] := Node.Item[i].Text;
261 AddSaveString(Node.Item[i], FavNode);
262 end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin
263 FavBoard := TFavoriteBoardItem(Node.Item[i].Data);
264 FavNode := XMLNode.AddChild('favitem');
265 FavNode.Attributes['type'] := '2ch';
266 FavNode.Attributes['favtype'] := 'board';
267 FavNode.Attributes['bbs'] := FavBoard.BBSID;
268 FavNode.Attributes['title'] := Node.Item[i].Text;
269 FavNode.Attributes['boardname'] := FavBoard.BoardName;
270 end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin
271 FavThread := TFavoriteThreadItem(Node.Item[i].Data);
272 FavNode := XMLNode.AddChild('favitem');
273 FavNode.Attributes['type'] := '2ch';
274 FavNode.Attributes['favtype'] := 'thread';
275 FavNode.Attributes['bbs'] := FavThread.BBSID;
276 FavNode.Attributes['thread'] := FavThread.ThreadID;
277 FavNode.Attributes['title'] := Node.Item[i].Text;
278 FavNode.Attributes['threadname'] := FavThread.ThreadName;
284 procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);
288 FavBoard: TFavoriteBoardItem;
289 FavThread: TFavoriteThreadItem;
291 for i := 0 to Node.Count - 1 do begin
292 if TObject(Node.Item[i].Data) is TFavoriteFolder then begin
293 s := Format('<folder title="%s">', [HtmlEncode(Node.Item[i].Text)]);
295 AddSaveString(Node.Item[i], SaveList);
296 SaveList.Add('</folder>');
297 end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin
298 FavBoard := TFavoriteBoardItem(Node.Item[i].Data);
299 s := Format('<favitem type="2ch" favtype="board" bbs="%s" title="%s" boardname="%s"/>',
300 [FavBoard.BBSID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavBoard.BoardName)]);
302 end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin
303 FavThread := TFavoriteThreadItem(Node.Item[i].Data);
304 s := Format('<favitem type="2ch" favtype="thread" bbs="%s" thread="%s" title="%s" threadname="%s"/>',
305 [FavThread.BBSID, FavThread.ThreadID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavThread.ThreadName)]);
312 procedure TFavoriteDM.SAXStartDocument(Sender: TObject);
314 FStack := TStack.Create;
315 FStack.Push(FTreeView.Items.GetFirstNode);
318 procedure TFavoriteDM.SAXEndDocument(Sender: TObject);
323 procedure TFavoriteDM.SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString;
324 const Atts: IAttributes);
327 ParentNode: TTreeNode;
328 CurrentNode: TTreeNode;
329 FavFolder: TFavoriteFolder;
330 FavBoard: TFavoriteBoardItem;
331 FavThread: TFavoriteThreadItem;
333 if QName = 'folder' then begin
334 ParentNode := FStack.Peek;
335 if TObject(ParentNode.Data) is TFavoriteFolder then begin
336 FavFolder := TFavoriteFolder.Create;
337 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavFolder);
338 CurrentNode.ImageIndex := 12;
339 CurrentNode.SelectedIndex := 13;
340 FStack.Push(CurrentNode);
342 end else if QName = 'favitem' then begin
343 ParentNode := FStack.Peek;
344 if TObject(ParentNode.Data) is TFavoriteFolder then begin
345 FavType := Atts.getValue('favtype');
346 if FavType = 'board' then begin
347 FavBoard := TFavoriteBoardItem.Create;
348 FavBoard.BBSID := Atts.getValue('bbs');
349 FavBoard.BoardName := Atts.getValue('boardname');
350 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavBoard);
351 CurrentNode.ImageIndex := 14;
352 CurrentNode.SelectedIndex := 15;
353 end else if FavType = 'thread' then begin
354 FavThread := TFavoriteThreadItem.Create;
355 FavThread.BBSID := Atts.getValue('bbs');
356 FavThread.ThreadID := Atts.getValue('thread');
357 FavThread.ThreadName := Atts.getValue('threadname');
358 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavThread);
359 CurrentNode.ImageIndex := 16;
360 CurrentNode.SelectedIndex := 17;
366 procedure TFavoriteDM.SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
368 if QName = 'folder' then begin
369 if FStack.Count <> 0 then
374 procedure TFavoriteDM.SAXCharacters(Sender: TObject; const PCh: SAXString);
379 function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;
381 FavoriteFilePath: string;
382 tempStringList: TStringList;
385 FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
387 if FileExists( FavoriteFilePath ) then begin
388 tempStringList := TStringList.Create;
390 tempStringList.LoadFromFile( FavoriteFilePath );
391 tempStringList.SaveToFile( FileName );
401 function TFavoriteDM.GetFavoriteFilePath() : String;
403 Result := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;