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.1.1.1 by hi_, Sat Aug 9 13:50:43 2003 UTC revision 1.55 by h677, Sun May 24 14:05:14 2009 UTC
# Line 3  unit Favorite; Line 3  unit Favorite;
3  interface  interface
4    
5  uses  uses
6          Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,}          Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
7          GikoSystem, XMLIntf, XMLDoc;          GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup, windows;
8          {SAX, SAXHelpers, SAXComps, SAXKW;}          {SAX, SAXHelpers, SAXComps, SAXKW;}
9    
10  type  type
11          TFavoriteFolder = class          TFavoriteFolder = class
12          end;          end;
13    
14          TFavoriteBoardItem = class          TFavoriteItem = class(TObject)
15          private          private
16                  FBBSID: string;                  FURL                            : string;
17                  FBoardName: string;                  FTitle                  : string;
18          public          public
19                  property BBSID: string read FBBSID write FBBSID;                  function GetItemTitle : string; virtual;abstract;
20                  property BoardName: string read FBoardName write FBoardName;                  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;          end;
34    
35          TFavoriteThreadItem = class          TFavoriteThreadItem = class(TFavoriteItem)
36          private          private
37                  FBBSID: string;                  FItem                           : TThreadItem;
38                  FThreadID: string;                  function        GetItem : TThreadItem;
                 FThreadName: string;  
39          public          public
40                  property BBSID: string read FBBSID write FBBSID;                  constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil );
41                  property ThreadID: string read FThreadID write FThreadID;                  constructor CreateWithItem( inItem : TThreadItem );
42                  property ThreadName: string read FThreadName write FThreadName;                  destructor Destory;
43                    function GetItemTitle : string; override;
44                    property Item                           : TThreadItem   read GetItem write FItem;
45          end;          end;
46    
47          TFavoriteDM = class(TDataModule)          TFavoriteDM = class(TDataModule)
                 procedure DataModuleCreate(Sender: TObject);  
                 procedure DataModuleDestroy(Sender: TObject);  
48          private          private
49                  { Private 宣言 }                  { Private 宣言 }
50                  FStack: TStack;          FAbEnd: Boolean;
51                  FTreeView: TTreeView;                  FTreeView: TTreeView;
52                    FModified: boolean;
53                  procedure ReadNode(Node: IXMLNode);                  procedure ReadNode(Node: IXMLNode; Stack: TStack; TreeView: TTreeView);
54  //              procedure AddSaveString(Node: TTreeNode; SaveList: TStringList);                  procedure AddSaveString(Node: TTreeNode; SaveList: TStringList);
                 procedure AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);  
 //              procedure SAXStartDocument(Sender: TObject);  
 //              procedure SAXEndDocument(Sender: TObject);  
 //              procedure SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString; const Atts: IAttributes);  
 //              procedure SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);  
 //              procedure SAXCharacters(Sender: TObject; const PCh: SAXString);  
55          public          public
56                  { Public 宣言 }                  { Public 宣言 }
57                    procedure Clear;
58                    function GetFavoriteFilePath() : String;
59                    function SaveFavoriteFile(FileName: String) : Boolean;
60                  procedure SetFavTreeView(TreeView: TTreeView);                  procedure SetFavTreeView(TreeView: TTreeView);
61                  procedure ReadFavorite;                  procedure ReadFavorite;
62                  procedure WriteFavorite;                  procedure WriteFavorite;
63                    procedure URLReplace(oldURLs: TStringList; newURLs: TStringList);
64                  property TreeView: TTreeView read FTreeView;                  property TreeView: TTreeView read FTreeView;
65                    property Modified: boolean read FModified write FModified;
66            property AbEnd: Boolean read FAbEnd write FAbEnd;
67          end;          end;
68    
69  var  var
70          FavoriteDM: TFavoriteDM;          FavoriteDM: TFavoriteDM;
71  const  const
72          FAVORITE_LINK_NAME = 'リンク';          FAVORITE_LINK_NAME = 'リンク';
73            FAVORITE_FILE_NAME = 'Favorite.xml';
74    
75  implementation  implementation
76    
77    uses    ExternalBoardManager, ExternalBoardPlugInMain,  MojuUtils;
78    
79  const  const
80          FAVORITE_ROOT_NAME = 'お気に入り';          FAVORITE_ROOT_NAME = 'お気に入り';
81          FAVORITE_FILE_NAME = 'Favorite.xml';  
82    
83  {$R *.dfm}  {$R *.dfm}
84    
85  procedure TFavoriteDM.DataModuleCreate(Sender: TObject);  constructor TFavoriteBoardItem.Create(
86            inURL           : string;
87            inTitle : string = '';
88            inItem  : TBoard = nil
89    );
90  begin  begin
91          //FTreeView := TreeView;  
92          //FTreeView := GikoForm.FavoriteTreeView;          inherited Create;
93    
94            URL             := inURL;
95            Title   := inTitle;
96            Item    := inItem;
97    
98  end;  end;
99    
100  procedure TFavoriteDM.DataModuleDestroy(Sender: TObject);  constructor TFavoriteBoardItem.CreateWithItem(
101            inItem  : TBoard
102    );
103    begin
104    
105            Create( inItem.URL, inItem.Title, inItem );
106    
107    end;
108    destructor TFavoriteBoardItem.Destory;
109    begin
110            if FItem <> nil then
111                    FItem.Free;
112            inherited;
113    end;
114    //! 保持している板のタイトルを返す
115    function TFavoriteBoardItem.GetItemTitle : string;
116    begin
117            Result := '';
118            //一度も板を開いていないとき(起動時にキャビネットをお気に入りとか)
119            //のときにFItemがnilなのでそのときはべっと検索
120            if FItem = nil then begin
121                    FItem := BBSsFindBoardFromURL(URL);
122            end;
123            if FItem <> nil then begin
124                    try
125                            if not FItem.IsThreadDatRead then begin
126                                    GikoSys.ReadSubjectFile(FItem);
127                            end;
128                    except
129                    end;
130                    Result := FItem.Title;
131            end;
132    end;
133    function        TFavoriteBoardItem.GetItem : TBoard;
134  var  var
135          i: Integer;          protocol, host, path, document, port, bookmark : string;
136            BBSID   : string;
137            tmpURL  : string;
138    begin
139    
140            if FItem = nil then begin
141                    FItem := BBSsFindBoardFromURL( URL );
142                    if FItem = nil then begin
143                            tmpURL := URL;
144                            GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
145                            if GikoSys.Is2chHost( host ) then begin
146                                    BBSID := GikoSys.URLToID( tmpURL );
147                                    FItem := BBSs[ 0 ].FindBBSID( BBSID );
148                                    if FItem <> nil then
149                                            URL := FItem.URL;
150                            end;
151                            {
152                            // ※作っても、追加するカテゴリが無いので激しく保留
153                            FItem                           := GikoSys.GetUnknownBoard( nil, URL );
154                            FItem.Title     := Title;
155                            }
156                    end;
157            end;
158    
159            Result := FItem;
160    
161    end;
162    
163    constructor TFavoriteThreadItem.Create(
164            inURL           : string;
165            inTitle : string = '';
166            inItem  : TThreadItem = nil
167    );
168    begin
169    
170            inherited Create;
171            URL             := inURL;
172    
173            Title   := inTitle;
174            Item    := inItem;
175    
176    end;
177    
178    constructor TFavoriteThreadItem.CreateWithItem(
179            inItem  : TThreadItem
180    );
181  begin  begin
182          for i := 0 to TreeView.Items.Count - 1 do begin  
183                  TObject(TreeView.Items[i].Data).Free;          Create( inItem.URL, inItem.Title, inItem );
184    
185    end;
186    destructor TFavoriteThreadItem.Destory;
187    begin
188            if FItem <> nil then
189            FItem.Free;
190        inherited;
191    end;
192    //! 保持しているスレのタイトルを返す
193    function TFavoriteThreadItem.GetItemTitle : string;
194    begin
195            Result := '';
196            if FItem = nil then begin
197                    FItem := BBSsFindThreadFromURL(URL);
198            end;
199            if FItem <> nil then begin
200                    Result := FItem.Title;
201            end;
202    end;
203    
204    function        TFavoriteThreadItem.GetItem : TThreadItem;
205    var
206            board                                   : TBoard;
207            boardURL                        : string;
208            browsableURL    : string;
209            protocol, host, path, document, port, bookmark : string;
210            BBSID, BBSKey   : string;
211            tmpURL                          : string;
212    begin
213    
214            Result := nil;
215            if FItem = nil then begin
216                    browsableURL    := GikoSys.GetBrowsableThreadURL( URL );
217                    boardURL                        := GikoSys.GetThreadURL2BoardURL( browsableURL );
218                    board                                   := BBSsFindBoardFromURL( boardURL );
219    
220                    if board = nil then begin
221                            tmpURL := URL;
222                            GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
223                            if GikoSys.Is2chHost( host ) then begin
224                                    GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
225                                    board := BBSs[ 0 ].FindBBSID( BBSID );
226                            end;
227    
228                            if board = nil then begin
229                                    Exit;
230                                    // ※作っても、追加するカテゴリが無いので激しく保留
231                                    //board := GikoSys.GetUnknownBoard( nil, boardURL )
232                            end;
233                    end;
234    
235                    FItem := board.FindThreadFromURL( browsableURL );
236    
237                    if FItem = nil then begin
238                            tmpURL := URL;
239                            GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
240                            if GikoSys.Is2chHost( host ) then begin
241                                    GikoSys.Parse2chURL( tmpURL, path, document, BBSID, BBSKey );
242                                    FItem := BBSs[ 0 ].FindThreadItem( BBSID, BBSKey + '.dat' );
243                                    if FItem <> nil then
244                                            URL := FItem.URL;
245                            end;
246                    end;
247    
248                    if FItem = nil then begin
249                            FItem := TThreadItem.Create( board.BoardPlugIn, board, browsableURL );
250    
251                            FItem.Title := Title;
252                            board.Add( FItem );
253                    end;
254          end;          end;
255    
256            Result := FItem;
257    
258    end;
259    
260    procedure TFavoriteDM.Clear;
261    var
262            Node    : TTreeNode;
263    begin
264            TreeView.Items.BeginUpdate;
265            Node    := TreeView.Items.GetFirstNode;
266            while Node <> nil do begin
267                    if TObject(Node.Data) <> nil then
268                                    TObject(Node.Data).Free;
269                    Node := Node.GetNext;
270            end;
271                    TreeView.Items.Clear;
272                    TreeView.Items.EndUpdate;
273    
274        FavoriteDM.Modified := true;
275  end;  end;
276    
277  procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);  procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);
# Line 89  begin Line 280  begin
280  end;  end;
281    
282  procedure TFavoriteDM.ReadFavorite;  procedure TFavoriteDM.ReadFavorite;
 {var  
         FileName: string;  
         Node: TTreeNode;  
         FavFolder: TFavoriteFolder;}  
283  var  var
284          FileName: string;          FileName: string;
285          XMLDoc: IXMLDocument;          XMLDoc: IXMLDocument;
# Line 101  var Line 288  var
288          i: Integer;          i: Integer;
289          FavFolder: TFavoriteFolder;          FavFolder: TFavoriteFolder;
290          LinkExists: Boolean;          LinkExists: Boolean;
291        Stack: TStack;
292  begin  begin
293        FABend := False;
294        
295            FavoriteDM.Modified := true;
296          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
297    
298          FavFolder := TFavoriteFolder.Create;          FavFolder := TFavoriteFolder.Create;
299          Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder);          Node := FTreeView.Items.AddChildObjectFirst(nil, FAVORITE_ROOT_NAME, FavFolder);
300          Node.ImageIndex := 12;          Node.ImageIndex := 14;
301          Node.SelectedIndex := 13;          Node.SelectedIndex := 14;
302    
303          if FileExists(FileName) then begin          if FileExists(FileName) then begin
                 XMLDoc := LoadXMLDocument(FileName);  
                 XMLNode := XMLDoc.DocumentElement;  
   
                 FStack := TStack.Create;  
304                  try                  try
305                          FStack.Push(Node);              XMLDoc := IXMLDocument.Create;
306                          LinkExists := False;                          //XMLDoc := LoadXMLDocument(FileName);
307                          if XMLNode.NodeName = 'favorite' then begin              LoadXMLDocument(FileName, XMLDoc);
308                                  for i := 0 to XMLNode.ChildNodes.Count - 1 do begin                          XMLNode := XMLDoc.DocumentElement;
309                                          ReadNode(XMLNode.ChildNodes[i]);  
310                                          if (XMLNode.ChildNodes[i].NodeName = 'folder') and                          Stack := TStack.Create;
311                                                   (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin                          try
312                                                  LinkExists := True;                                  Stack.Push(Node);
313                                    LinkExists := False;
314                                    if XMLNode.NodeName = 'favorite' then begin
315                                            for i := XMLNode.ChildNodes.Count - 1 downto 0 do begin
316                                                    ReadNode(XMLNode.ChildNodes[i], Stack, FTreeView);
317                                                    if (XMLNode.ChildNodes[i].NodeName = 'folder') and
318                                                             (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin
319                                                            LinkExists := True;
320                                                    end;
321                                          end;                                          end;
322                                  end;                                  end;
323                                    if not LinkExists then begin
324                                            FavFolder := TFavoriteFolder.Create;
325                                            Node := FTreeView.Items.AddChildObjectFirst(Node, FAVORITE_LINK_NAME, FavFolder);
326                                            Node.ImageIndex := 14;
327                                            Node.SelectedIndex := 14;
328                                    end;
329    
330                            finally
331                                    Stack.Free;
332                    XMLDoc.Free;
333                          end;                          end;
334                          if not LinkExists then begin                  except
335                                  FavFolder := TFavoriteFolder.Create;              on e : Exception do begin
336                                  Node := FTreeView.Items.AddChildObject(Node, FAVORITE_LINK_NAME, FavFolder);                  FABend := True;
337                                  Node.ImageIndex := 12;              end;
                                 Node.SelectedIndex := 13;  
                         end;  
                 finally  
                         FStack.Free;  
338                  end;                  end;
339          end;          end;
340    
 {       FavFolder := TFavoriteFolder.Create;  
         Node := FTreeView.Items.AddChildObject(nil, FAVORITE_ROOT_NAME, FavFolder);  
         Node.ImageIndex := 12;  
         Node.SelectedIndex := 13;  
   
         FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;  
         if not FileExists(FileName) then  
                 Exit;  
   
                 FavSAXHandler.OnStartDocument := SAXStartDocument;  
                 FavSAXHandler.OnEndDocument := SAXEndDocument;  
                 FavSAXHandler.OnStartElement := SAXStartElement;  
                 FavSAXHandler.OnStartElement := SAXStartElement;  
                 FavSAXHandler.OnEndElement := SAXEndElement;  
                 FavSAXHandler.OnCharacters := SAXCharacters;  
   
                 FavSAXReader.Vendor := 'Keith Wood';  
                 FavSAXReader.URL := FileName;  
                 FavSAXReader.Parse;}  
341  end;  end;
342    
343  procedure TFavoriteDM.ReadNode(Node: IXMLNode);  procedure TFavoriteDM.ReadNode(Node: IXMLNode; Stack: TStack; TreeView: TTreeView);
344  var  var
345          i: Integer;          i: Integer;
346    
# Line 167  var Line 349  var
349          FavFolder: TFavoriteFolder;          FavFolder: TFavoriteFolder;
350          FavBoard: TFavoriteBoardItem;          FavBoard: TFavoriteBoardItem;
351          FavThread: TFavoriteThreadItem;          FavThread: TFavoriteThreadItem;
352            board                           : TBoard;
353            threadItem      : TThreadItem;
354  begin  begin
355          if Node.NodeName = 'folder' then begin          if Node.NodeName = 'folder' then begin
356                  ParentNode := FStack.Peek;          CurrentNode := nil;
357                    ParentNode := Stack.Peek;
358                  if TObject(ParentNode.Data) is TFavoriteFolder then begin                  if TObject(ParentNode.Data) is TFavoriteFolder then begin
359                          FavFolder := TFavoriteFolder.Create;                          FavFolder := TFavoriteFolder.Create;
360                          CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavFolder);                          CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavFolder);
361                          CurrentNode.ImageIndex := 12;                          CurrentNode.ImageIndex := 14;
362                          CurrentNode.SelectedIndex := 13;                          CurrentNode.SelectedIndex := 14;
363                          FStack.Push(CurrentNode);                          Stack.Push(CurrentNode);
364                  end;                  end;
365                  for i := 0 to Node.ChildNodes.Count - 1 do begin                  for i := Node.ChildNodes.Count - 1 downto 0 do begin
366                          ReadNode(Node.ChildNodes[i]);                          ReadNode(Node.ChildNodes[i], Stack, TreeView);
367                  end;                  end;
368                  if FStack.Count <> 0 then                  if CurrentNode <> nil then
369                          FStack.Pop;                          CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true';
370                    if Stack.Count <> 0 then
371                            Stack.Pop;
372          end else if Node.NodeName = 'favitem' then begin          end else if Node.NodeName = 'favitem' then begin
373                  ParentNode := FStack.Peek;                  try
374                  if TObject(ParentNode.Data) is TFavoriteFolder then begin                          ParentNode := Stack.Peek;
375                          if Node.Attributes['favtype'] = 'board' then begin                          if TObject(ParentNode.Data) is TFavoriteFolder then begin
376                                  FavBoard := TFavoriteBoardItem.Create;                                  if Node.Attributes['favtype'] = 'board' then begin
377                                  FavBoard.BBSID := Node.Attributes['bbs'];                                          FavBoard := nil;
378                                  FavBoard.BoardName := Node.Attributes['boardname'];                                          // 旧式のお気に入りとの互換性のため
379                                  CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavBoard);                                          if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
380                                  CurrentNode.ImageIndex := 14;                                                  board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
381                                  CurrentNode.SelectedIndex := 15;                                                  if board <> nil then
382                          end else if Node.Attributes['favtype'] = 'thread' then begin                                                          FavBoard := TFavoriteBoardItem.Create(
383                                  FavThread := TFavoriteThreadItem.Create;                                                                  board.URL, MojuUtils.UnSanitize(Node.Attributes[ 'title' ]), board );
384                                  FavThread.BBSID := Node.Attributes['bbs'];                                          end else begin
385                                  FavThread.ThreadID := Node.Attributes['thread'];                                                  FavBoard := TFavoriteBoardItem.Create(
386                                  FavThread.ThreadName := Node.Attributes['threadname'];                                                          Node.Attributes[ 'url' ], MojuUtils.UnSanitize(Node.Attributes[ 'title' ]), nil );
387                                  CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavThread);                                          end;
388                                  CurrentNode.ImageIndex := 16;                                          CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, UnSanitize(Node.Attributes['title']), FavBoard);
389                                  CurrentNode.SelectedIndex := 17;                                          CurrentNode.ImageIndex := 15;
390                                            CurrentNode.SelectedIndex := 15;
391                                    end else if Node.Attributes['favtype'] = 'thread' then begin
392                                            // 旧式のお気に入りとの互換性のため
393                                            if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
394                                                    board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
395                                                    if board = nil then
396                                                            Exit;
397    
398                                                    if not board.IsThreadDatRead then
399                                                            GikoSys.ReadSubjectFile( board );
400                                                    threadItem := board.FindThreadFromFileName( Node.Attributes[ 'thread' ] );
401                                                    if threadItem = nil then begin
402                                                            threadItem := TThreadItem.Create(
403                                                                    board.BoardPlugIn,
404                                    board,
405                                                                    GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) );
406                                                            threadItem.Title := UnSanitize(Node.Attributes[ 'title' ]);
407                                                            board.Add( threadItem );
408                                                    end;
409                                                    FavThread := TFavoriteThreadItem.Create(
410                                                            threadItem.URL, UnSanitize(Node.Attributes[ 'title' ]), threadItem );
411                            threadItem.Free;
412                                            end else begin
413                                                    FavThread := TFavoriteThreadItem.Create(
414                                                            Node.Attributes[ 'url' ], UnSanitize(Node.Attributes[ 'title' ]), nil );
415                                            end;
416                                            CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, UnSanitize(Node.Attributes['title']), FavThread);
417                                            CurrentNode.ImageIndex := 16;
418                                            CurrentNode.SelectedIndex := 16;
419                                    end;
420                          end;                          end;
421                    except
422                            // このアイテムで問題が起きても他のアイテムに影響を与えたくないので
423                  end;                  end;
424          end;          end;
425  end;  end;
426    
427  procedure TFavoriteDM.WriteFavorite;  procedure TFavoriteDM.WriteFavorite;
428  var  var
429          FileName: string;          FileName, tmpFileName, bakFileName: string;
 //      SaveList: TStringList;  
 //      i: Integer;  
 //      Count: Integer;  
   
         XMLDoc: IXMLDocument;  
         XMLNode: IXMLNode;  
 //      FavoNode: IXMLNode;  
 begin  
         XMLDoc :=  NewXMLDocument;  
         XMLDoc.Encoding := 'Shift_JIS';  
         XMLDoc.StandAlone := 'yes';  
         XMLNode := XMLDoc.AddChild('favorite');  
         FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;  
         AddSaveString(TreeView.Items.GetFirstNode, XMLNode);  
         XMLDoc.SaveToFile(FileName);  
 {var  
         FileName: string;  
430          SaveList: TStringList;          SaveList: TStringList;
431        Buffer: array[0..MAX_PATH] of Char;   // バッファ
432        FileRep : Boolean;
433  begin  begin
434        FavoriteDM.Modified := true;
435          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;          FileName := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
436          SaveList := TStringList.Create;          SaveList := TStringList.Create;
437          try      tmpFileName := '';
438                  SaveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');      // 書き込み用一時ファイル取得
439                  SaveList.Add('<favorite>');      if GetTempFileName(PChar(GikoSys.GetConfigDir), PChar('fav'), 0, Buffer) <> 0 then begin
440                  AddSaveString(TreeView.Items.GetFirstNode, SaveList);          tmpFileName := Buffer;
441                  SaveList.Add('</favorite>');          try
442                  SaveList.SaveToFile(FileName);              try
443          finally                  SaveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
444                  SaveList.Free;                  SaveList.Add('<favorite>');
445          end;}                  AddSaveString(TreeView.Items.GetFirstNode.getFirstChild, SaveList);
446                    SaveList.Add('</favorite>');
447                    // 一時ファイルとして保存
448                    SaveList.SaveToFile(tmpFileName);
449                    FileRep := True;
450                    // 前のファイルを移動する
451                    if FileExists(FileName) then begin
452                        bakFileName := GikoSys.GetConfigDir + '~' + FAVORITE_FILE_NAME;
453                        if FileExists(bakFileName) then begin
454                            FileRep := SysUtils.DeleteFile(bakFileName); //SysUtils.をつけないとWinAPIと区別できないので
455                        end;
456                        if FileRep then begin
457                            FileRep := RenameFile(FileName, bakFileName);
458                        end;
459                    end;
460                    // 正規のファイル名にリネームする
461                    if FileRep then begin
462                        FileRep := RenameFile(tmpFileName, FileName);
463                    end;
464                except
465                end;
466            finally
467                SaveList.Free;
468            end;
469        end;
470  end;  end;
471    
472  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);
473  var  var
         i: Integer;  
 //      s: string;  
         FavBoard: TFavoriteBoardItem;  
         FavThread: TFavoriteThreadItem;  
         FavNode: IXMLNode;  
 begin  
         for i := 0 to Node.Count - 1 do begin  
                 if TObject(Node.Item[i].Data) is TFavoriteFolder then begin  
                         FavNode := XMLNode.AddChild('folder');  
                         FavNode.Attributes['title'] := Node.Item[i].Text;  
                         AddSaveString(Node.Item[i], FavNode);  
                 end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin  
                         FavBoard := TFavoriteBoardItem(Node.Item[i].Data);  
                         FavNode := XMLNode.AddChild('favitem');  
                         FavNode.Attributes['type'] := '2ch';  
                         FavNode.Attributes['favtype'] := 'board';  
                         FavNode.Attributes['bbs'] := FavBoard.BBSID;  
                         FavNode.Attributes['title'] := Node.Item[i].Text;  
                         FavNode.Attributes['boardname'] := FavBoard.BoardName;  
                 end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin  
                         FavThread := TFavoriteThreadItem(Node.Item[i].Data);  
                         FavNode := XMLNode.AddChild('favitem');  
                         FavNode.Attributes['type'] := '2ch';  
                         FavNode.Attributes['favtype'] := 'thread';  
                         FavNode.Attributes['bbs'] := FavThread.BBSID;  
                         FavNode.Attributes['thread'] := FavThread.ThreadID;  
                         FavNode.Attributes['title'] := Node.Item[i].Text;  
                         FavNode.Attributes['threadname'] := FavThread.ThreadName;  
                 end;  
         end;  
 end;  
   
 {procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);  
 var  
         i: Integer;  
474          s: string;          s: string;
475          FavBoard: TFavoriteBoardItem;          FavBoard: TFavoriteBoardItem;
476          FavThread: TFavoriteThreadItem;          FavThread: TFavoriteThreadItem;
477            data : Pointer;
478  begin  begin
479          for i := 0 to Node.Count - 1 do begin          while Node <> nil do begin
480                  if TObject(Node.Item[i].Data) is TFavoriteFolder then begin                  data := Node.Data;
481                          s := Format('<folder title="%s">', [HtmlEncode(Node.Item[i].Text)]);                  if TObject(data) is TFavoriteFolder then begin
482                            if Node.Expanded then
483                                    s := Format('<folder title="%s" expanded="true">', [HtmlEncode(Node.Text)])
484                            else
485                                    s := Format('<folder title="%s" expanded="false">', [HtmlEncode(Node.Text)]);
486                          SaveList.Add(s);                          SaveList.Add(s);
487                          AddSaveString(Node.Item[i], SaveList);                          AddSaveString(Node.getFirstChild, SaveList);
488                          SaveList.Add('</folder>');                          SaveList.Add('</folder>');
489                  end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin                  end else if TObject(data) is TFavoriteBoardItem then begin
490                          FavBoard := TFavoriteBoardItem(Node.Item[i].Data);                          FavBoard := TFavoriteBoardItem(data);
491                          s := Format('<favitem type="2ch" favtype="board" bbs="%s" title="%s" boardname="%s"/>',                          s := Format('<favitem type="2ch" favtype="board" url="%s" title="%s"/>',
492                                                                          [FavBoard.BBSID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavBoard.BoardName)]);                                                                          [HtmlEncode( FavBoard.URL ), HtmlEncode(MojuUtils.Sanitize(Node.Text))]);
493                          SaveList.Add(s);                          SaveList.Add(s);
494                  end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin                  end else if TObject(data) is TFavoriteThreadItem then begin
495                          FavThread := TFavoriteThreadItem(Node.Item[i].Data);                          FavThread := TFavoriteThreadItem(data);
496                          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"/>',
497                                                                          [FavThread.BBSID, FavThread.ThreadID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavThread.ThreadName)]);                                                                          [HtmlEncode( FavThread.URL ), HtmlEncode(MojuUtils.Sanitize(Node.Text))]);
498                          SaveList.Add(s);                          SaveList.Add(s);
499                  end;                  end;
500                    Node := Node.getNextSibling;
501          end;          end;
 end;}  
   
 {  
 procedure TFavoriteDM.SAXStartDocument(Sender: TObject);  
 begin  
         FStack := TStack.Create;  
         FStack.Push(FTreeView.Items.GetFirstNode);  
502  end;  end;
503    
504  procedure TFavoriteDM.SAXEndDocument(Sender: TObject);  function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;
505    var
506            FavoriteFilePath: string;
507                    tempStringList: TStringList;
508  begin  begin
509          FStack.Free;          WriteFavorite;
510            FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
511    
512            if FileExists( FavoriteFilePath ) then begin
513                    tempStringList := TStringList.Create;
514                    try
515                            tempStringList.LoadFromFile( FavoriteFilePath );
516                            tempStringList.SaveToFile( FileName );
517                    finally
518                            tempStringList.Free;
519                    end;
520                    Result := true;
521            end else begin
522                    Result := false;
523            end;
524  end;  end;
525    
526  procedure TFavoriteDM.SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString;  procedure TFavoriteDM.URLReplace(oldURLs: TStringList; newURLs: TStringList);
         const Atts: IAttributes);  
527  var  var
528          FavType: string;          i                                       : Integer;
529          ParentNode: TTreeNode;                  tmpURL: string;
530          CurrentNode: TTreeNode;      oldHost: string;
531          FavFolder: TFavoriteFolder;      oldBoardName: string;
532          FavBoard: TFavoriteBoardItem;      newHost: string;
533          FavThread: TFavoriteThreadItem;      newBoardName: string;
534  begin                  tempString: string;
535          if QName = 'folder' then begin          favBoard        : TFavoriteBoardItem;
536                  ParentNode := FStack.Peek;          favThread       : TFavoriteThreadItem;
537                  if TObject(ParentNode.Data) is TFavoriteFolder then begin          favorites       : TTreeNodes;
538                          FavFolder := TFavoriteFolder.Create;          Node                    : TTreeNode;
539                          CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavFolder);  begin
540                          CurrentNode.ImageIndex := 12;  
541                          CurrentNode.SelectedIndex := 13;          // 面倒だけどthreadはそれぞれURLをチェックしながらやってかなきゃいけない。
542                          FStack.Push(CurrentNode);          favorites := FavoriteDM.FTreeView.Items;
543                  end;          for i := 0 to oldURLs.Count - 1 do begin
544          end else if QName = 'favitem' then begin                  try
545                  ParentNode := FStack.Peek;                          tmpURL                  := Copy(oldURLs[i], 1, Length(oldURLs[i]) -1);
546                  if TObject(ParentNode.Data) is TFavoriteFolder then begin                          oldHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
547                          FavType := Atts.getValue('favtype');                          oldBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
548                          if FavType = 'board' then begin                          tmpURL                  := Copy(newURLs[i], 1, Length(newURLs[i]) -1);
549                                  FavBoard := TFavoriteBoardItem.Create;                          newHost                 := Copy(tmpURL, 1, LastDelimiter('/', tmpURL) );
550                                  FavBoard.BBSID := Atts.getValue('bbs');                          newBoardName    := Copy(tmpURL, LastDelimiter('/', tmpURL), Length(tmpURL) ) + '/';
551                                  FavBoard.BoardName := Atts.getValue('boardname');  
552                                  CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavBoard);                          Node := favorites.GetFirstNode.getFirstChild;
553                                  CurrentNode.ImageIndex := 14;                          while Node <> nil do begin
554                                  CurrentNode.SelectedIndex := 15;                                  try
555                          end else if FavType = 'thread' then begin                                          if TObject( Node.Data ) is TFavoriteBoardItem then begin
556                                  FavThread := TFavoriteThreadItem.Create;                                                  favBoard := TFavoriteBoardItem( Node.Data );
557                                  FavThread.BBSID := Atts.getValue('bbs');                                                  if favBoard = nil then continue;
558                                  FavThread.ThreadID := Atts.getValue('thread');                                                  tempString := favBoard.URL;
559                                  FavThread.ThreadName := Atts.getValue('threadname');                                                  if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
560                                  CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavThread);                                                          tempString              := StringReplace(tempString, oldHost, newHost,[]);
561                                  CurrentNode.ImageIndex := 16;                                                          favBoard.URL    := tempString;
562                                  CurrentNode.SelectedIndex := 17;                                                  end;
563                                            end else if TObject( Node.Data ) is TFavoriteThreadItem then begin
564                                                    favThread := TFavoriteThreadItem( Node.Data );
565                                                    if favThread = nil then continue;
566                                                    tempString := favThread.URL;
567                                                    if ( AnsiPos(oldBoardName, tempString) <> 0 ) and ( AnsiPos(oldHost, tempString ) <> 0 ) then begin
568                                                            tempString              := StringReplace(tempString, oldHost, newHost,[]);
569                                                            favThread.URL   := tempString;
570                                                    end;
571                                            end;
572                                    except
573                                    end;
574                                    Node := Node.GetNext;
575                          end;                          end;
576                    except
577                  end;                  end;
578          end;          end;
 end;  
579    
 procedure TFavoriteDM.SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);  
 begin  
         if QName = 'folder' then begin  
                 if FStack.Count <> 0 then  
                         FStack.Pop;  
         end;  
580  end;  end;
581    
582  procedure TFavoriteDM.SAXCharacters(Sender: TObject; const PCh: SAXString);  function TFavoriteDM.GetFavoriteFilePath() : String;
583  begin  begin
584  //          Result := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
585  end;  end;
586  }  
587  end.  end.

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.55

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