Develop and Download Open Source Software

Browse CVS Repository

Contents of /gikonavigoeson/gikonavi/Favorite.pas

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.49 - (show annotations) (download) (as text)
Sat Dec 10 16:11:30 2005 UTC (18 years, 4 months ago) by h677
Branch: MAIN
CVS Tags: v1_51_0_626, v1_51_0_627
Changes since 1.48: +2 -3 lines
File MIME type: text/x-pascal
1.51.0.626

1 unit Favorite;
2
3 interface
4
5 uses
6 Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
7 GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup, windows;
8 {SAX, SAXHelpers, SAXComps, SAXKW;}
9
10 type
11 TFavoriteFolder = class
12 end;
13
14 TFavoriteItem = class(TObject)
15 private
16 FURL : string;
17 FTitle : string;
18 public
19 function GetItemTitle : string; virtual;abstract;
20 property URL : string read FURL write FURL; // Item ‚ŞŽć“ž‚Ĺ‚Ť‚Č‚­‚Ä‚ŕ URL ‚͏í‚ɕێ‚ł‚ę‚é
21 property Title : string read FTitle write FTitle;
22 end;
23 TFavoriteBoardItem = class(TFavoriteItem)
24 private
25 FItem : TBoard;
26 function GetItem : TBoard;
27 public
28 constructor Create( inURL : string; inTitle : string = ''; inItem : TBoard = nil );
29 constructor CreateWithItem( inItem : TBoard );
30 destructor Destory;
31 function GetItemTitle : string; override;
32 property Item : TBoard read GetItem write FItem;
33 end;
34
35 TFavoriteThreadItem = class(TFavoriteItem)
36 private
37 FItem : TThreadItem;
38 function GetItem : TThreadItem;
39 public
40 constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil );
41 constructor CreateWithItem( inItem : TThreadItem );
42 destructor Destory;
43 function GetItemTitle : string; override;
44 property Item : TThreadItem read GetItem write FItem;
45 end;
46
47 TFavoriteDM = class(TDataModule)
48 procedure DataModuleDestroy(Sender: TObject);
49 private
50 { Private éŒž }
51 FStack: TStack;
52 FTreeView: TTreeView;
53
54 procedure ReadNode(Node: IXMLNode);
55 procedure AddSaveString(Node: TTreeNode; SaveList: TStringList);
56 // procedure AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);
57 // procedure SAXStartDocument(Sender: TObject);
58 // procedure SAXEndDocument(Sender: TObject);
59 // procedure SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; const Atts: IAttributes);
60 // procedure SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
61 // procedure SAXCharacters(Sender: TObject; const PCh: SAXString);
62 public
63 { Public éŒž }
64 procedure Clear;
65 function GetFavoriteFilePath() : String;
66 function SaveFavoriteFile(FileName: String) : Boolean;
67 procedure SetFavTreeView(TreeView: TTreeView);
68 procedure ReadFavorite;
69 procedure WriteFavorite;
70 procedure URLReplace(oldURLs: TStringList; newURLs: TStringList);
71 property TreeView: TTreeView read FTreeView;
72 end;
73
74 var
75 FavoriteDM: TFavoriteDM;
76 const
77 FAVORITE_LINK_NAME = 'ƒŠƒ“ƒN';
78
79 implementation
80
81 uses ExternalBoardManager, ExternalBoardPlugInMain, MojuUtils;
82
83 const
84 FAVORITE_ROOT_NAME = '‚¨‹C‚É“ü‚č';
85 FAVORITE_FILE_NAME = 'Favorite.xml';
86
87 {$R *.dfm}
88
89 constructor TFavoriteBoardItem.Create(
90 inURL : string;
91 inTitle : string = '';
92 inItem : TBoard = nil
93 );
94 begin
95
96 inherited Create;
97
98 URL := inURL;
99 Title := inTitle;
100 Item := inItem;
101
102 end;
103
104 constructor TFavoriteBoardItem.CreateWithItem(
105 inItem : TBoard
106 );
107 begin
108
109 Create( inItem.URL, inItem.Title, inItem );
110
111 end;
112 destructor TFavoriteBoardItem.Destory;
113 begin
114 if FItem <> nil then
115 FItem.Free;
116 inherited;
117 end;
118 //! •ŰŽ‚ľ‚Ä‚˘‚é”Â‚Ěƒ^ƒCƒgƒ‹‚đ•Ô‚ˇ
119 function TFavoriteBoardItem.GetItemTitle : string;
120 begin
121 Result := '';
122 //ˆę“x‚ŕ”‚đŠJ‚˘‚Ä‚˘‚Č‚˘‚Ć‚Ťi‹N“ŽŽž‚ɃLƒƒƒrƒlƒbƒg‚đ‚¨‹C‚É“ü‚č‚ÂЁj
123 //‚̂ƂŤ‚ÉFItem‚Şnil‚Ȃ̂łť‚̂ƂŤ‚ׂ͂Á‚ĆŒŸő
124 if FItem = nil then begin
125 FItem := BBSsFindBoardFromURL(URL);
126 end;
127 if FItem <> nil then begin
128 try
129 if not FItem.IsThreadDatRead then begin
130 GikoSys.ReadSubjectFile(FItem);
131 end;
132 except
133 end;
134 Result := FItem.Title;
135 end;
136 end;
137 function TFavoriteBoardItem.GetItem : TBoard;
138 var
139 protocol, host, path, document, port, bookmark : string;
140 BBSID : string;
141 tmpURL : string;
142 begin
143
144 if FItem = nil then begin
145 FItem := BBSsFindBoardFromURL( URL );
146 if FItem = nil then begin
147 tmpURL := URL;
148 GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
149 if GikoSys.Is2chHost( host ) then begin
150 BBSID := GikoSys.URLToID( tmpURL );
151 FItem := BBSs[ 0 ].FindBBSID( BBSID );
152 if FItem <> nil then
153 URL := FItem.URL;
154 end;
155 {
156 // Śě‚Á‚Ä‚ŕA’ljÁ‚ˇ‚éƒJƒeƒSƒŠ‚Ş–ł‚˘‚Ě‚ĹŒƒ‚ľ‚­•Ű—Ż
157 FItem := GikoSys.GetUnknownBoard( nil, URL );
158 FItem.Title := Title;
159 }
160 end;
161 end;
162
163 Result := FItem;
164
165 end;
166
167 constructor TFavoriteThreadItem.Create(
168 inURL : string;
169 inTitle : string = '';
170 inItem : TThreadItem = nil
171 );
172 begin
173
174 inherited Create;
175 URL := inURL;
176
177 Title := inTitle;
178 Item := inItem;
179
180 end;
181
182 constructor TFavoriteThreadItem.CreateWithItem(
183 inItem : TThreadItem
184 );
185 begin
186
187 Create( inItem.URL, inItem.Title, inItem );
188
189 end;
190 destructor TFavoriteThreadItem.Destory;
191 begin
192 if FItem <> nil then
193 FItem.Free;
194 inherited;
195 end;
196 //! •ŰŽ‚ľ‚Ä‚˘‚éƒXƒŒ‚Ěƒ^ƒCƒgƒ‹‚đ•Ô‚ˇ
197 function TFavoriteThreadItem.GetItemTitle : string;
198 begin
199 Result := '';
200 if FItem = nil then begin
201 FItem := BBSsFindThreadFromURL(URL);
202 end;
203 if FItem <> nil then begin
204 Result := FItem.Title;
205 end;
206 end;
207
208 function TFavoriteThreadItem.GetItem : TThreadItem;
209 var
210 board : TBoard;
211 boardURL : string;
212 browsableURL : string;
213 protocol, host, path, document, port, bookmark : string;
214 BBSID, BBSKey : string;
215 tmpURL : string;
216 begin
217
218 Result := nil;
219 if FItem = nil then begin
220 browsableURL := GikoSys.GetBrowsableThreadURL( URL );
221 boardURL := GikoSys.GetThreadURL2BoardURL( browsableURL );
222 board := BBSsFindBoardFromURL( boardURL );
223
224 if board = nil then begin
225 tmpURL := URL;
226 GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
227 if GikoSys.Is2chHost( host ) then begin
228 GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
229 board := BBSs[ 0 ].FindBBSID( BBSID );
230 end;
231
232 if board = nil then begin
233 Exit;
234 // Śě‚Á‚Ä‚ŕA’ljÁ‚ˇ‚éƒJƒeƒSƒŠ‚Ş–ł‚˘‚Ě‚ĹŒƒ‚ľ‚­•Ű—Ż
235 //board := GikoSys.GetUnknownBoard( nil, boardURL )
236 end;
237 end;
238
239 FItem := board.FindThreadFromURL( browsableURL );
240
241 if FItem = nil then begin
242 tmpURL := URL;
243 GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
244 if GikoSys.Is2chHost( host ) then begin
245 GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
246 FItem := BBSs[ 0 ].FindThreadItem( BBSID, BBSKey + '.dat' );
247 if FItem <> nil then
248 URL := FItem.URL;
249 end;
250 end;
251
252 if FItem = nil then begin
253 FItem := TThreadItem.Create( board.BoardPlugIn, board, browsableURL );
254
255 FItem.Title := Title;
256 board.Add( FItem );
257 end;
258 end;
259
260 Result := FItem;
261
262 end;
263
264 procedure TFavoriteDM.DataModuleDestroy(Sender: TObject);
265 //var
266 // i: Integer;
267 begin
268 { TreeView.Items.BeginUpdate;
269 for i := TreeView.Items.Count - 1 downto 0 do begin
270 // if TObject(TreeView.Items[i].Data) <> nil then
271 // TObject(TreeView.Items[i].Data).Free;
272 end;
273 TreeView.Items.Clear;
274 TreeView.Items.EndUpdate;
275 } //TreeView.Free;
276 end;
277 procedure TFavoriteDM.Clear;
278 var
279 Node : TTreeNode;
280 begin
281 TreeView.Items.BeginUpdate;
282 Node := TreeView.Items.GetFirstNode;
283 while Node <> nil do begin
284 if TObject(Node.Data) <> nil then
285 TObject(Node.Data).Free;
286 Node := Node.GetNext;
287 end;
288 TreeView.Items.Clear;
289 TreeView.Items.EndUpdate;
290 //TreeView.Free;
291 end;
292
293 procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);
294 begin
295 FTreeView := TreeView;
296 end;
297
298 procedure TFavoriteDM.ReadFavorite;
299 var
300 FileName: string;
301 XMLDoc: IXMLDocument;
302 XMLNode: IXMLNode;
303 Node: TTreeNode;
304 i: Integer;
305 FavFolder: TFavoriteFolder;
306 LinkExists: Boolean;
307 begin
308
309 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
310
311 FavFolder := TFavoriteFolder.Create;
312 Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder);
313 Node.ImageIndex := 14;
314 Node.SelectedIndex := 14;
315
316 if FileExists(FileName) then begin
317 try
318 XMLDoc := IXMLDocument.Create;
319 //XMLDoc := LoadXMLDocument(FileName);
320 LoadXMLDocument(FileName, XMLDoc);
321 XMLNode := XMLDoc.DocumentElement;
322
323 FStack := TStack.Create;
324 try
325 FStack.Push(Node);
326 LinkExists := False;
327 if XMLNode.NodeName = 'favorite' then begin
328 for i := XMLNode.ChildNodes.Count - 1 downto 0 do begin
329 ReadNode(XMLNode.ChildNodes[i]);
330 if (XMLNode.ChildNodes[i].NodeName = 'folder') and
331 (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin
332 LinkExists := True;
333 end;
334 end;
335 end;
336 if not LinkExists then begin
337 FavFolder := TFavoriteFolder.Create;
338 Node := FTreeView.Items.AddChildObjectFirst(Node, FAVORITE_LINK_NAME, FavFolder);
339 Node.ImageIndex := 14;
340 Node.SelectedIndex := 14;
341 end;
342 finally
343 FStack.Free;
344 XMLDoc.Free;
345 end;
346 except
347 end;
348 end;
349
350 {
351 FavFolder := TFavoriteFolder.Create;
352 Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder);
353 Node.ImageIndex := 12;
354 Node.SelectedIndex := 13;
355
356 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
357 if not FileExists(FileName) then
358 Exit;
359
360 FavSAXHandler.OnStartDocument := SAXStartDocument;
361 FavSAXHandler.OnEndDocument := SAXEndDocument;
362 FavSAXHandler.OnStartElement := SAXStartElement;
363 FavSAXHandler.OnStartElement := SAXStartElement;
364 FavSAXHandler.OnEndElement := SAXEndElement;
365 FavSAXHandler.OnCharacters := SAXCharacters;
366
367 FavSAXReader.Vendor := 'Keith Wood';
368 FavSAXReader.URL := FileName;
369 FavSAXReader.Parse;}
370 end;
371
372 procedure TFavoriteDM.ReadNode(Node: IXMLNode);
373 var
374 i: Integer;
375
376 ParentNode: TTreeNode;
377 CurrentNode: TTreeNode;
378 FavFolder: TFavoriteFolder;
379 FavBoard: TFavoriteBoardItem;
380 FavThread: TFavoriteThreadItem;
381 board : TBoard;
382 threadItem : TThreadItem;
383 begin
384 if Node.NodeName = 'folder' then begin
385 ParentNode := FStack.Peek;
386 if TObject(ParentNode.Data) is TFavoriteFolder then begin
387 FavFolder := TFavoriteFolder.Create;
388 CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavFolder);
389 CurrentNode.ImageIndex := 14;
390 CurrentNode.SelectedIndex := 14;
391 FStack.Push(CurrentNode);
392 end;
393 for i := Node.ChildNodes.Count - 1 downto 0 do begin
394 ReadNode(Node.ChildNodes[i]);
395 end;
396 if TObject(ParentNode.Data) is TFavoriteFolder then
397 CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true';
398 if FStack.Count <> 0 then
399 FStack.Pop;
400 end else if Node.NodeName = 'favitem' then begin
401 try
402 ParentNode := FStack.Peek;
403 if TObject(ParentNode.Data) is TFavoriteFolder then begin
404 if Node.Attributes['favtype'] = 'board' then begin
405 FavBoard := nil;
406 // ‹ŒŽŽ‚Ě‚¨‹C‚É“ü‚č‚Ć‚ĚŒÝŠˇŤ‚Ě‚˝‚ß
407 if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
408 board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
409 if board <> nil then
410 FavBoard := TFavoriteBoardItem.Create(
411 board.URL, Node.Attributes[ 'title' ], board );
412 end else begin
413 FavBoard := TFavoriteBoardItem.Create(
414 Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );
415 end;
416 CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavBoard);
417 CurrentNode.ImageIndex := 15;
418 CurrentNode.SelectedIndex := 15;
419 end else if Node.Attributes['favtype'] = 'thread' then begin
420 // ‹ŒŽŽ‚Ě‚¨‹C‚É“ü‚č‚Ć‚ĚŒÝŠˇŤ‚Ě‚˝‚ß
421 if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
422 board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
423 if board = nil then
424 Exit;
425
426 if not board.IsThreadDatRead then
427 GikoSys.ReadSubjectFile( board );
428 threadItem := board.FindThreadFromFileName( Node.Attributes[ 'thread' ] );
429 if threadItem = nil then begin
430 threadItem := TThreadItem.Create(
431 board.BoardPlugIn,
432 board,
433 GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) );
434 threadItem.Title := Node.Attributes[ 'title' ];
435 board.Add( threadItem );
436 end;
437 FavThread := TFavoriteThreadItem.Create(
438 threadItem.URL, Node.Attributes[ 'title' ], threadItem );
439 threadItem.Free;
440 end else begin
441 FavThread := TFavoriteThreadItem.Create(
442 Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );
443 end;
444 CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavThread);
445 CurrentNode.ImageIndex := 16;
446 CurrentNode.SelectedIndex := 16;
447 end;
448 end;
449 except
450 // ‚ą‚ĚƒAƒCƒeƒ€‚Ĺ–â‘肪‹N‚Ť‚Ä‚ŕ‘ź‚ĚƒAƒCƒeƒ€‚ɉe‹ż‚đ—^‚Ś‚˝‚­‚Č‚˘‚Ě‚Ĺ
451 end;
452 end;
453 end;
454
455 procedure TFavoriteDM.WriteFavorite;
456 {
457 var
458 FileName: string;
459 // SaveList: TStringList;
460 // i: Integer;
461 // Count: Integer;
462
463 XMLDoc: IXMLDocument;
464 XMLNode: IXMLNode;
465 // FavoNode: IXMLNode;
466 begin
467 XMLDoc := NewXMLDocument;
468 XMLDoc.Encoding := 'Shift_JIS';
469 XMLDoc.StandAlone := 'yes';
470 XMLNode := XMLDoc.AddChild('favorite');
471 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
472 AddSaveString(TreeView.Items.GetFirstNode, XMLNode);
473 XMLDoc.SaveToFile(FileName);
474 }
475 var
476 FileName, tmpFileName: string;
477 SaveList: TStringList;
478
479 begin
480 FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
481 if FileExists(FileName) then begin
482 tmpFileName := GikoSys.GetConfigDir + '~' + FAVORITE_FILE_NAME;
483 if FileExists(tmpFileName) then
484 SysUtils.DeleteFile(tmpFileName); //SysUtils.‚đ‚Â‚Ż‚Č‚˘‚ĆWinAPI‚Ć‹ć•ʂłŤ‚Č‚˘‚Ě‚Ĺ
485 RenameFile(FileName, tmpFileName);
486 end;
487 SaveList := TStringList.Create;
488 try
489 SaveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
490 SaveList.Add('<favorite>');
491 AddSaveString(TreeView.Items.GetFirstNode.getFirstChild, SaveList);
492 SaveList.Add('</favorite>');
493 SaveList.SaveToFile(FileName);
494 finally
495 SaveList.Free;
496 end;
497 end;
498
499 {
500 procedure TFavoriteDM.AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);
501 var
502 i: Integer;
503 // s: string;
504 FavBoard: TFavoriteBoardItem;
505 FavThread: TFavoriteThreadItem;
506 FavNode: IXMLNode;
507 begin
508 for i := 0 to Node.Count - 1 do begin
509 if TObject(Node.Item[i].Data) is TFavoriteFolder then begin
510 FavNode := XMLNode.AddChild('folder');
511 FavNode.Attributes['title'] := Node.Item[i].Text;
512 AddSaveString(Node.Item[i], FavNode);
513 end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin
514 FavBoard := TFavoriteBoardItem(Node.Item[i].Data);
515 FavNode := XMLNode.AddChild('favitem');
516 FavNode.Attributes['type'] := '2ch';
517 FavNode.Attributes['favtype'] := 'board';
518 FavNode.Attributes['bbs'] := FavBoard.BBSID;
519 FavNode.Attributes['title'] := Node.Item[i].Text;
520 FavNode.Attributes['boardname'] := FavBoard.BoardName;
521 end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin
522 FavThread := TFavoriteThreadItem(Node.Item[i].Data);
523 FavNode := XMLNode.AddChild('favitem');
524 FavNode.Attributes['type'] := '2ch';
525 FavNode.Attributes['favtype'] := 'thread';
526 FavNode.Attributes['bbs'] := FavThread.BBSID;
527 FavNode.Attributes['thread'] := FavThread.ThreadID;
528 FavNode.Attributes['title'] := Node.Item[i].Text;
529 FavNode.Attributes['threadname'] := FavThread.ThreadName;
530 end;
531 end;
532 end;
533 }
534
535 procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);
536 var
537 s: string;
538 FavBoard: TFavoriteBoardItem;
539 FavThread: TFavoriteThreadItem;
540 data : Pointer;
541 begin
542 while Node <> nil do begin
543 data := Node.Data;
544 if TObject(data) is TFavoriteFolder then begin
545 if Node.Expanded then
546 s := Format('<folder title="%s" expanded="true">', [HtmlEncode(Node.Text)])
547 else
548 s := Format('<folder title="%s" expanded="false">', [HtmlEncode(Node.Text)]);
549 SaveList.Add(s);
550 AddSaveString(Node.getFirstChild, SaveList);
551 SaveList.Add('</folder>');
552 end else if TObject(data) is TFavoriteBoardItem then begin
553 FavBoard := TFavoriteBoardItem(data);
554 s := Format('<favitem type="2ch" favtype="board" url="%s" title="%s"/>',
555 [HtmlEncode( FavBoard.URL ), HtmlEncode(Node.Text)]);
556 SaveList.Add(s);
557 end else if TObject(data) is TFavoriteThreadItem then begin
558 FavThread := TFavoriteThreadItem(data);
559 s := Format('<favitem type="2ch" favtype="thread" url="%s" title="%s"/>',
560 [HtmlEncode( FavThread.URL ), HtmlEncode(Node.Text)]);
561 SaveList.Add(s);
562 end;
563 Node := Node.getNextSibling;
564 end;
565 end;
566
567 {
568 procedure TFavoriteDM.SAXStartDocument(Sender: TObject);
569 begin
570 FStack := TStack.Create;
571 FStack.Push(FTreeView.Items.GetFirstNode);
572 end;
573
574 procedure TFavoriteDM.SAXEndDocument(Sender: TObject);
575 begin
576 FStack.Free;
577 end;
578
579 procedure TFavoriteDM.SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString;
580 const Atts: IAttributes);
581 var
582 FavType: string;
583 ParentNode: TTreeNode;
584 CurrentNode: TTreeNode;
585 FavFolder: TFavoriteFolder;
586 FavBoard: TFavoriteBoardItem;
587 FavThread: TFavoriteThreadItem;
588 begin
589 if QName = 'folder' then begin
590 ParentNode := FStack.Peek;
591 if TObject(ParentNode.Data) is TFavoriteFolder then begin
592 FavFolder := TFavoriteFolder.Create;
593 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavFolder);
594 CurrentNode.ImageIndex := 12;
595 CurrentNode.SelectedIndex := 13;
596 FStack.Push(CurrentNode);
597 end;
598 end else if QName = 'favitem' then begin
599 ParentNode := FStack.Peek;
600 if TObject(ParentNode.Data) is TFavoriteFolder then begin
601 FavType := Atts.getValue('favtype');
602 if FavType = 'board' then begin
603 FavBoard := TFavoriteBoardItem.Create;
604 FavBoard.BBSID := Atts.getValue('bbs');
605 FavBoard.BoardName := Atts.getValue('boardname');
606 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavBoard);
607 CurrentNode.ImageIndex := 14;
608 CurrentNode.SelectedIndex := 15;
609 end else if FavType = 'thread' then begin
610 FavThread := TFavoriteThreadItem.Create;
611 FavThread.BBSID := Atts.getValue('bbs');
612 FavThread.ThreadID := Atts.getValue('thread');
613 FavThread.ThreadName := Atts.getValue('threadname');
614 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavThread);
615 CurrentNode.ImageIndex := 16;
616 CurrentNode.SelectedIndex := 17;
617 end;
618 end;
619 end;
620 end;
621
622 procedure TFavoriteDM.SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);
623 begin
624 if QName = 'folder' then begin
625 if FStack.Count <> 0 then
626 FStack.Pop;
627 end;
628 end;
629
630 procedure TFavoriteDM.SAXCharacters(Sender: TObject; const PCh: SAXString);
631 begin
632 //
633 end;
634 }
635 function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;
636 var
637 FavoriteFilePath: string;
638 tempStringList: TStringList;
639 begin
640 WriteFavorite;
641 FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
642
643 if FileExists( FavoriteFilePath ) then begin
644 tempStringList := TStringList.Create;
645 try
646 tempStringList.LoadFromFile( FavoriteFilePath );
647 tempStringList.SaveToFile( FileName );
648 finally
649 tempStringList.Free;
650 end;
651 Result := true;
652 end else begin
653 Result := false;
654 end;
655 end;
656
657 procedure TFavoriteDM.URLReplace(oldURLs: TStringList; newURLs: TStringList);
658 var
659 i : Integer;
660 tmpURL: string;
661 oldHost: string;
662 oldBoardName: string;
663 newHost: string;
664 newBoardName: string;
665 tempString: string;
666 favBoard : TFavoriteBoardItem;
667 favThread : TFavoriteThreadItem;
668 favorites : TTreeNodes;
669 Node : TTreeNode;
670 begin
671
672 // –Ę“|‚ž‚Ż‚Çthread‚Í‚ť‚ꂟ‚ęURL‚đƒ`ƒFƒbƒN‚ľ‚Č‚Ş‚ç‚â‚Á‚ĂЂȂŤ‚Ⴂ‚݂Ȃ˘B
673 favorites := FavoriteDM.FTreeView.Items;
674 for i := 0 to oldURLs.Count - 1 do begin
675 try
676 tmpURL := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1);
677 oldHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
678 oldBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
679 tmpURL := Copy(newURLs[i], 1, Length(newURLs[i]) -1);
680 newHost := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
681 newBoardName := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
682
683 Node := favorites.GetFirstNode.getFirstChild;
684 while Node <> nil do begin
685 try
686 if TObject( Node.Data ) is TFavoriteBoardItem then begin
687 favBoard := TFavoriteBoardItem( Node.Data );
688 if favBoard = nil then continue;
689 tempString := favBoard.URL;
690 if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
691 tempString := StringReplace(tempString, oldHost, newHost,[]);
692 favBoard.URL := tempString;
693 end;
694 end else if TObject( Node.Data ) is TFavoriteThreadItem then begin
695 favThread := TFavoriteThreadItem( Node.Data );
696 if favThread = nil then continue;
697 tempString := favThread.URL;
698 if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
699 tempString := StringReplace(tempString, oldHost, newHost,[]);
700 favThread.URL := tempString;
701 end;
702 end;
703 except
704 end;
705 Node := Node.GetNext;
706 end;
707 except
708 end;
709 end;
710
711 end;
712
713 function TFavoriteDM.GetFavoriteFilePath() : String;
714 begin
715 Result := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
716 end;
717
718 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26