Develop and Download Open Source Software

Browse CVS Repository

Diff of /gikonavigoeson/gikonavi/Favorite.pas

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

revision 1.3 by yoffy, Sun Sep 21 08:46:17 2003 UTC revision 1.3.2.3 by yoffy, Fri Oct 8 05:44:48 2004 UTC
# Line 4  interface Line 4  interface
4    
5  uses  uses
6          Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,          Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
7          GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc;          GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup, windows,
8        MojuUtils;
9          {SAX, SAXHelpers, SAXComps, SAXKW;}          {SAX, SAXHelpers, SAXComps, SAXKW;}
10    
11  type  type
# Line 13  type Line 14  type
14    
15          TFavoriteBoardItem = class          TFavoriteBoardItem = class
16          private          private
17                  FBBSID: string;                  FItem                           : TBoard;
18                  FBoardName: string;                  FURL                            : string;
19                    FTitle                  : string;
20                    function        GetItem : TBoard;
21          public          public
22                  property BBSID: string read FBBSID write FBBSID;                  constructor Create( inURL : string; inTitle : string = ''; inItem : TBoard = nil );
23                  property BoardName: string read FBoardName write FBoardName;                  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;          end;
29    
30          TFavoriteThreadItem = class          TFavoriteThreadItem = class
31          private          private
32                  FBBSID: string;                  FItem                           : TThreadItem;
33                  FThreadID: string;                  FURL                            : string;
34                  FThreadName: string;                  FTitle                  : string;
35                    function        GetItem : TThreadItem;
36          public          public
37                  property BBSID: string read FBBSID write FBBSID;                  constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil );
38                  property ThreadID: string read FThreadID write FThreadID;                  constructor CreateWithItem( inItem : TThreadItem );
39                  property ThreadName: string read FThreadName write FThreadName;          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;          end;
44    
45          TFavoriteDM = class(TDataModule)          TFavoriteDM = class(TDataModule)
                 procedure DataModuleCreate(Sender: TObject);  
46                  procedure DataModuleDestroy(Sender: TObject);                  procedure DataModuleDestroy(Sender: TObject);
47          private          private
48                  { Private 宣言 }                  { Private 宣言 }
# Line 49  type Line 59  type
59  //              procedure SAXCharacters(Sender: TObject; const PCh: SAXString);  //              procedure SAXCharacters(Sender: TObject; const PCh: SAXString);
60          public          public
61                  { Public 宣言 }                  { Public 宣言 }
62            procedure Clear;
63                                    function GetFavoriteFilePath() : String;
64                                    function SaveFavoriteFile(FileName: String) : Boolean;
65                  procedure SetFavTreeView(TreeView: TTreeView);                  procedure SetFavTreeView(TreeView: TTreeView);
66                  procedure ReadFavorite;                  procedure ReadFavorite;
67                  procedure WriteFavorite;                  procedure WriteFavorite;
68            procedure URLReplace(oldURLs: TStringList; newURLs: TStringList);
69                  property TreeView: TTreeView read FTreeView;                  property TreeView: TTreeView read FTreeView;
70          end;          end;
71    
# Line 62  const Line 76  const
76    
77  implementation  implementation
78    
79    uses    ExternalBoardManager, ExternalBoardPlugInMain;
80    
81  const  const
82          FAVORITE_ROOT_NAME = 'お気に入り';          FAVORITE_ROOT_NAME = 'お気に入り';
83          FAVORITE_FILE_NAME = 'Favorite.xml';          FAVORITE_FILE_NAME = 'Favorite.xml';
84    
85  {$R *.dfm}  {$R *.dfm}
86    
87  procedure TFavoriteDM.DataModuleCreate(Sender: TObject);  constructor TFavoriteBoardItem.Create(
88            inURL           : string;
89            inTitle : string = '';
90            inItem  : TBoard = nil
91    );
92  begin  begin
93          //FTreeView := TreeView;  
94          //FTreeView := GikoForm.FavoriteTreeView;          inherited Create;
95    
96            URL             := inURL;
97            Title   := inTitle;
98            Item    := inItem;
99    
100  end;  end;
101    
102  procedure TFavoriteDM.DataModuleDestroy(Sender: TObject);  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  var
118          i: Integer;          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                            //===== プラグイン
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                                                                    tmpThread               := TThreadItem.Create( BoardPlugIns[ i ], URL );
140                                                                    boardURL                := tmpThread.BoardPlugIn.GetBoardURL( DWORD( tmpThread ) );
141                                                                    FItem                           := BBSsFindBoardFromURL( boardURL );
142                                                                    URL := FItem.URL;
143                                                                    tmpThread.Free;
144                                                                    break;
145                                                            end;
146                                                    atBoard:
147                                                            begin
148                                                                    tmpBoard := TBoard.Create(BoardPlugIns[ i ], URL);
149                                                                    FItem := BBSsFindBoardFromURL( tmpBoard.URL );
150                                                                    tmpBoard.Free;
151                                                                    if FItem <> nil then begin
152                                                                            URL := FItem.URL;
153                                                                    end;
154                                                                    break;
155                                                            end;
156                                                    end;
157                                            end;
158                                    end;
159                            except
160                                    // exception が発生した場合は内部処理に任せたいのでここでは何もしない
161                            end;
162                    end;
163                    if FItem = nil then begin
164                            tmpURL := URL;
165                            GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
166                            if GikoSys.Is2chHost( host ) then begin
167                                    BBSID := GikoSys.URLToID( tmpURL );
168                                    FItem := BBSs[ 0 ].FindBBSID( BBSID );
169                                    if FItem <> nil then
170                                            URL := FItem.URL;
171                            end;
172                            {
173                            // ※作っても、追加するカテゴリが無いので激しく保留
174                            FItem                           := GikoSys.GetUnknownBoard( nil, URL );
175                            FItem.Title     := Title;
176                            }
177                    end;
178            end;
179    
180            Result := FItem;
181    
182    end;
183    
184    constructor TFavoriteThreadItem.Create(
185            inURL           : string;
186            inTitle : string = '';
187            inItem  : TThreadItem = nil
188    );
189  begin  begin
190          for i := 0 to TreeView.Items.Count - 1 do begin  
191                  TObject(TreeView.Items[i].Data).Free;          inherited Create;
192            URL             := inURL;
193    
194            Title   := inTitle;
195            Item    := inItem;
196    
197    end;
198    
199    constructor TFavoriteThreadItem.CreateWithItem(
200            inItem  : TThreadItem
201    );
202    begin
203    
204            Create( inItem.URL, inItem.Title, inItem );
205    
206    end;
207    destructor TFavoriteThreadItem.Destory;
208    begin
209            if FItem <> nil then
210            FItem.Free;
211        inherited;
212    end;
213    
214    function        TFavoriteThreadItem.GetItem : TThreadItem;
215    var
216            board                                   : TBoard;
217            boardURL                        : string;
218            browsableURL    : string;
219            protocol, host, path, document, port, bookmark : string;
220            BBSID, BBSKey   : string;
221            tmpURL                          : string;
222    begin
223    
224            Result := nil;
225            if FItem = nil then begin
226                    browsableURL    := GikoSys.GetBrowsableThreadURL( URL );
227                    boardURL                        := GikoSys.GetThreadURL2BoardURL( browsableURL );
228                    board                                   := BBSsFindBoardFromURL( boardURL );
229    
230                    if board = nil then begin
231                            tmpURL := URL;
232                            GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
233                            if GikoSys.Is2chHost( host ) then begin
234                                    GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
235                                    board := BBSs[ 0 ].FindBBSID( BBSID );
236                            end;
237    
238                            if board = nil then begin
239                                    Exit;
240                                    // ※作っても、追加するカテゴリが無いので激しく保留
241                                    //board := GikoSys.GetUnknownBoard( nil, boardURL )
242                            end;
243                    end;
244    
245                    FItem := board.FindThreadFromURL( browsableURL );
246    
247                    if FItem = nil then begin
248                            tmpURL := URL;
249                            GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
250                            if GikoSys.Is2chHost( host ) then begin
251                                    GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
252                                    FItem := BBSs[ 0 ].FindThreadItem( BBSID, BBSKey + '.dat' );
253                                    if FItem <> nil then
254                                            URL := FItem.URL;
255                            end;
256                    end;
257    
258                    if FItem = nil then begin
259                            FItem := TThreadItem.Create( board.BoardPlugIn, browsableURL );
260    
261                            FItem.Title := Title;
262                            board.Add( FItem );
263                    end;
264          end;          end;
265    
266            Result := FItem;
267    
268    end;
269    
270    procedure TFavoriteDM.DataModuleDestroy(Sender: TObject);
271    //var
272    //      i: Integer;
273    begin
274    {    TreeView.Items.BeginUpdate;
275            for i := TreeView.Items.Count - 1 downto 0 do begin
276               //   if TObject(TreeView.Items[i].Data) <> nil then
277           //       TObject(TreeView.Items[i].Data).Free;
278            end;
279        TreeView.Items.Clear;
280        TreeView.Items.EndUpdate;
281    }    //TreeView.Free;
282    end;
283    procedure TFavoriteDM.Clear;
284    var
285            Node    : TTreeNode;
286    begin
287            TreeView.Items.BeginUpdate;
288            Node    := TreeView.Items.GetFirstNode;
289            while Node <> nil do begin
290                    if TObject(Node.Data) <> nil then
291                                    TObject(Node.Data).Free;
292                    Node := Node.GetNext;
293            end;
294                    TreeView.Items.Clear;
295                    TreeView.Items.EndUpdate;
296        //TreeView.Free;
297  end;  end;
298    
299  procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);  procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);
# Line 102  begin Line 315  begin
315          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
316    
317          FavFolder := TFavoriteFolder.Create;          FavFolder := TFavoriteFolder.Create;
318          Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder);          Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder);
319          Node.ImageIndex := 14;          Node.ImageIndex := 14;
320          Node.SelectedIndex := 14;          Node.SelectedIndex := 14;
321    
322          if FileExists(FileName) then begin          if FileExists(FileName) then begin
323                  try                  try
324                          XMLDoc := LoadXMLDocument(FileName);              XMLDoc := IXMLDocument.Create;
325                            //XMLDoc := LoadXMLDocument(FileName);
326                LoadXMLDocument(FileName, XMLDoc);
327                          XMLNode := XMLDoc.DocumentElement;                          XMLNode := XMLDoc.DocumentElement;
328    
329                          FStack := TStack.Create;                          FStack := TStack.Create;
# Line 116  begin Line 331  begin
331                                  FStack.Push(Node);                                  FStack.Push(Node);
332                                  LinkExists := False;                                  LinkExists := False;
333                                  if XMLNode.NodeName = 'favorite' then begin                                  if XMLNode.NodeName = 'favorite' then begin
334                                          for i := 0 to XMLNode.ChildNodes.Count - 1 do begin                                          for i := XMLNode.ChildNodes.Count - 1 downto 0 do begin
335                                                  ReadNode(XMLNode.ChildNodes[i]);                                                  ReadNode(XMLNode.ChildNodes[i]);
336                                                  if (XMLNode.ChildNodes[i].NodeName = 'folder') and                                                  if (XMLNode.ChildNodes[i].NodeName = 'folder') and
337                                                           (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin                                                           (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin
# Line 126  begin Line 341  begin
341                                  end;                                  end;
342                                  if not LinkExists then begin                                  if not LinkExists then begin
343                                          FavFolder := TFavoriteFolder.Create;                                          FavFolder := TFavoriteFolder.Create;
344                                          Node := FTreeView.Items.AddChildObject(Node, FAVORITE_LINK_NAME, FavFolder);                                          Node := FTreeView.Items.AddChildObjectFirst(Node, FAVORITE_LINK_NAME, FavFolder);
345                                          Node.ImageIndex := 14;                                          Node.ImageIndex := 14;
346                                          Node.SelectedIndex := 14;                                          Node.SelectedIndex := 14;
347                                  end;                                  end;
348                          finally                          finally
349                                  FStack.Free;                                  FStack.Free;
350                    XMLDoc.Free;
351                          end;                          end;
352                  except                  except
353                  end;                  end;
# Line 139  begin Line 355  begin
355    
356  {  {
357          FavFolder := TFavoriteFolder.Create;          FavFolder := TFavoriteFolder.Create;
358          Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder);          Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder);
359          Node.ImageIndex := 12;          Node.ImageIndex := 12;
360          Node.SelectedIndex := 13;          Node.SelectedIndex := 13;
361    
# Line 168  var Line 384  var
384          FavFolder: TFavoriteFolder;          FavFolder: TFavoriteFolder;
385          FavBoard: TFavoriteBoardItem;          FavBoard: TFavoriteBoardItem;
386          FavThread: TFavoriteThreadItem;          FavThread: TFavoriteThreadItem;
387            board                           : TBoard;
388            threadItem      : TThreadItem;
389  begin  begin
390          if Node.NodeName = 'folder' then begin          if Node.NodeName = 'folder' then begin
391                  ParentNode := FStack.Peek;                  ParentNode := FStack.Peek;
392                  if TObject(ParentNode.Data) is TFavoriteFolder then begin                  if TObject(ParentNode.Data) is TFavoriteFolder then begin
393                          FavFolder := TFavoriteFolder.Create;                          FavFolder := TFavoriteFolder.Create;
394                          CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavFolder);                          CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavFolder);
395                          CurrentNode.ImageIndex := 14;                          CurrentNode.ImageIndex := 14;
396                          CurrentNode.SelectedIndex := 14;                          CurrentNode.SelectedIndex := 14;
397                          FStack.Push(CurrentNode);                          FStack.Push(CurrentNode);
398                  end;                  end;
399                  for i := 0 to Node.ChildNodes.Count - 1 do begin                  for i := Node.ChildNodes.Count - 1 downto 0 do begin
400                          ReadNode(Node.ChildNodes[i]);                          ReadNode(Node.ChildNodes[i]);
401                  end;                  end;
402                    if TObject(ParentNode.Data) is TFavoriteFolder then
403                            CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true';
404                  if FStack.Count <> 0 then                  if FStack.Count <> 0 then
405                          FStack.Pop;                          FStack.Pop;
406          end else if Node.NodeName = 'favitem' then begin          end else if Node.NodeName = 'favitem' then begin
407                  ParentNode := FStack.Peek;                  try
408                  if TObject(ParentNode.Data) is TFavoriteFolder then begin                          ParentNode := FStack.Peek;
409                          if Node.Attributes['favtype'] = 'board' then begin                          if TObject(ParentNode.Data) is TFavoriteFolder then begin
410                                  FavBoard := TFavoriteBoardItem.Create;                                  if Node.Attributes['favtype'] = 'board' then begin
411                                  FavBoard.BBSID := Node.Attributes['bbs'];                                          FavBoard := nil;
412                                  FavBoard.BoardName := Node.Attributes['boardname'];                                          // 旧式のお気に入りとの互換性のため
413                                  CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavBoard);                                          if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
414                                  CurrentNode.ImageIndex := 15;                                                  board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
415                                  CurrentNode.SelectedIndex := 15;                                                  if board <> nil then
416                          end else if Node.Attributes['favtype'] = 'thread' then begin                                                          FavBoard := TFavoriteBoardItem.Create(
417                                  FavThread := TFavoriteThreadItem.Create;                                                                  board.URL, Node.Attributes[ 'title' ], board );
418                                  FavThread.BBSID := Node.Attributes['bbs'];                                          end else begin
419                                  FavThread.ThreadID := Node.Attributes['thread'];                                                  FavBoard := TFavoriteBoardItem.Create(
420                                  FavThread.ThreadName := Node.Attributes['threadname'];                                                          Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );
421                                  CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavThread);                                          end;
422                                  CurrentNode.ImageIndex := 16;                                          CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavBoard);
423                                  CurrentNode.SelectedIndex := 16;                                          CurrentNode.ImageIndex := 15;
424                                            CurrentNode.SelectedIndex := 15;
425                                    end else if Node.Attributes['favtype'] = 'thread' then begin
426                                            // 旧式のお気に入りとの互換性のため
427                                            if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
428                                                    board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
429                                                    if board = nil then
430                                                            Exit;
431    
432                                                    if not board.IsThreadDatRead then
433                                                            GikoSys.ReadSubjectFile( board );
434                                                    threadItem := board.FindThreadFromFileName( Node.Attributes[ 'thread' ] );
435                                                    if threadItem = nil then begin
436                                                            threadItem := TThreadItem.Create(
437                                                                    board.BoardPlugIn,
438                                                                    GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) );
439                                                            threadItem.Title := Node.Attributes[ 'title' ];
440                                                            board.Add( threadItem );
441                                                    end;
442                                                    FavThread := TFavoriteThreadItem.Create(
443                                                            threadItem.URL, Node.Attributes[ 'title' ], threadItem );
444                            threadItem.Free;
445                                            end else begin
446                                                    FavThread := TFavoriteThreadItem.Create(
447                                                            Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );
448                                            end;
449                                            CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavThread);
450                                            CurrentNode.ImageIndex := 16;
451                                            CurrentNode.SelectedIndex := 16;
452                                    end;
453                          end;                          end;
454                    except
455                            // このアイテムで問題が起きても他のアイテムに影響を与えたくないので
456                  end;                  end;
457          end;          end;
458  end;  end;
# Line 218  var Line 469  var
469          XMLNode: IXMLNode;          XMLNode: IXMLNode;
470  //      FavoNode: IXMLNode;  //      FavoNode: IXMLNode;
471  begin  begin
472          XMLDoc :=  NewXMLDocument;          XMLDoc :=       NewXMLDocument;
473          XMLDoc.Encoding := 'Shift_JIS';          XMLDoc.Encoding := 'Shift_JIS';
474          XMLDoc.StandAlone := 'yes';          XMLDoc.StandAlone := 'yes';
475          XMLNode := XMLDoc.AddChild('favorite');          XMLNode := XMLDoc.AddChild('favorite');
# Line 227  begin Line 478  begin
478          XMLDoc.SaveToFile(FileName);          XMLDoc.SaveToFile(FileName);
479  }  }
480  var  var
481          FileName: string;          FileName, tmpFileName: string;
482          SaveList: TStringList;          SaveList: TStringList;
483    
484  begin  begin
485          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
486            if FileExists(FileName) then begin
487                    tmpFileName := GikoSys.GetConfigDir + '~' + FAVORITE_FILE_NAME;
488                    if FileExists(tmpFileName) then
489                            SysUtils.DeleteFile(tmpFileName); //SysUtils.をつけないとWinAPIと区別できないので
490                    RenameFile(FileName, tmpFileName);
491            end;
492          SaveList := TStringList.Create;          SaveList := TStringList.Create;
493          try          try
494                  SaveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');                  SaveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
495                  SaveList.Add('<favorite>');                  SaveList.Add('<favorite>');
496                  AddSaveString(TreeView.Items.GetFirstNode, SaveList);                  AddSaveString(TreeView.Items.GetFirstNode.getFirstChild, SaveList);
497                  SaveList.Add('</favorite>');                  SaveList.Add('</favorite>');
498                  SaveList.SaveToFile(FileName);                  SaveList.SaveToFile(FileName);
499          finally          finally
# Line 281  end; Line 539  end;
539    
540  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);
541  var  var
         i: Integer;  
542          s: string;          s: string;
543          FavBoard: TFavoriteBoardItem;          FavBoard: TFavoriteBoardItem;
544          FavThread: TFavoriteThreadItem;          FavThread: TFavoriteThreadItem;
545            data : Pointer;
546  begin  begin
547          for i := 0 to Node.Count - 1 do begin          while Node <> nil do begin
548                  if TObject(Node.Item[i].Data) is TFavoriteFolder then begin                  data := Node.Data;
549                          s := Format('<folder title="%s">', [HtmlEncode(Node.Item[i].Text)]);                  if TObject(data) is TFavoriteFolder then begin
550                            if Node.Expanded then
551                                    s := Format('<folder title="%s" expanded="true">', [HtmlEncode(Node.Text)])
552                            else
553                                    s := Format('<folder title="%s" expanded="false">', [HtmlEncode(Node.Text)]);
554                          SaveList.Add(s);                          SaveList.Add(s);
555                          AddSaveString(Node.Item[i], SaveList);                          AddSaveString(Node.getFirstChild, SaveList);
556                          SaveList.Add('</folder>');                          SaveList.Add('</folder>');
557                  end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin                  end else if TObject(data) is TFavoriteBoardItem then begin
558                          FavBoard := TFavoriteBoardItem(Node.Item[i].Data);                          FavBoard := TFavoriteBoardItem(data);
559                          s := Format('<favitem type="2ch" favtype="board" bbs="%s" title="%s" boardname="%s"/>',                          s := Format('<favitem type="2ch" favtype="board" url="%s" title="%s"/>',
560                                                                          [FavBoard.BBSID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavBoard.BoardName)]);                                                                          [HtmlEncode( FavBoard.URL ), HtmlEncode(Node.Text)]);
561                          SaveList.Add(s);                          SaveList.Add(s);
562                  end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin                  end else if TObject(data) is TFavoriteThreadItem then begin
563                          FavThread := TFavoriteThreadItem(Node.Item[i].Data);                          FavThread := TFavoriteThreadItem(data);
564                          s := Format('<favitem type="2ch" favtype="thread" bbs="%s" thread="%s" title="%s" threadname="%s"/>',                          s := Format('<favitem type="2ch" favtype="thread" url="%s" title="%s"/>',
565                                                                          [FavThread.BBSID, FavThread.ThreadID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavThread.ThreadName)]);                                                                          [HtmlEncode( FavThread.URL ), HtmlEncode(Node.Text)]);
566                          SaveList.Add(s);                          SaveList.Add(s);
567                  end;                  end;
568                    Node := Node.getNextSibling;
569          end;          end;
570  end;  end;
571    
# Line 374  begin Line 637  begin
637  //  //
638  end;  end;
639  }  }
640    function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;
641    var
642            FavoriteFilePath: string;
643                    tempStringList: TStringList;
644    begin
645            WriteFavorite;
646            FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
647    
648            if FileExists( FavoriteFilePath ) then begin
649                    tempStringList := TStringList.Create;
650                    try
651                            tempStringList.LoadFromFile( FavoriteFilePath );
652                            tempStringList.SaveToFile( FileName );
653                    finally
654                            tempStringList.Free;
655                    end;
656                    Result := true;
657            end else begin
658                    Result := false;
659            end;
660    end;
661    
662    procedure TFavoriteDM.URLReplace(oldURLs: TStringList; newURLs: TStringList);
663    var
664            i                                       : Integer;
665                    tmpURL: string;
666        oldHost: string;
667        oldBoardName: string;
668        newHost: string;
669        newBoardName: string;
670                    tempString: string;
671            favBoard        : TFavoriteBoardItem;
672            favThread       : TFavoriteThreadItem;
673            favorites       : TTreeNodes;
674            Node                    : TTreeNode;
675    begin
676    
677            // 面倒だけどthreadはそれぞれURLをチェックしながらやってかなきゃいけない。
678            favorites := FavoriteDM.FTreeView.Items;
679            for i := 0 to oldURLs.Count - 1 do begin
680                    try
681                            tmpURL                  := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1);
682                            oldHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
683                            oldBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
684                            tmpURL                  := Copy(newURLs[i], 1, Length(newURLs[i]) -1);
685                            newHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
686                            newBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
687    
688                            Node := favorites.GetFirstNode.getFirstChild;
689                            while Node <> nil do begin
690                                    try
691                                            if TObject( Node.Data ) is TFavoriteBoardItem then begin
692                                                    favBoard := TFavoriteBoardItem( Node.Data );
693                                                    if favBoard = nil then continue;
694                                                    tempString := favBoard.URL;
695                                                    if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
696                                                            tempString              := StringReplace(tempString, oldHost, newHost,[]);
697                                                            favBoard.URL    := tempString;
698                                                    end;
699                                            end else if TObject( Node.Data ) is TFavoriteThreadItem then begin
700                                                    favThread := TFavoriteThreadItem( Node.Data );
701                                                    if favThread = nil then continue;
702                                                    tempString := favThread.URL;
703                                                    if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
704                                                            tempString              := StringReplace(tempString, oldHost, newHost,[]);
705                                                            favThread.URL   := tempString;
706                                                    end;
707                                            end;
708                                    except
709                                    end;
710                                    Node := Node.GetNext;
711                            end;
712                    except
713                    end;
714            end;
715    
716    end;
717    
718    function TFavoriteDM.GetFavoriteFilePath() : String;
719    begin
720            Result := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
721    end;
722    
723  end.  end.

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.3.2.3

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