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.46.4.1 - (show annotations) (download) (as text)
Wed May 4 06:26:03 2005 UTC (18 years, 11 months ago) by h677
Branch: remodeling
Changes since 1.46: +10 -8 lines
File MIME type: text/x-pascal
ThreadItemの持っていたプロパティを削って、省メモリ化

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

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