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.2.3 by yoffy, Fri Oct 8 05:44:48 2004 UTC revision 1.55 by h677, Sun May 24 14:05:14 2009 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, BoardGroup, windows,          GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup, windows;
     MojuUtils;  
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
                 FItem                           : TBoard;  
16                  FURL                            : string;                  FURL                            : string;
17                  FTitle                  : string;                  FTitle                  : string;
18            public
19                    function GetItemTitle : string; virtual;abstract;
20                    property URL                            : string        read FURL write FURL;   // Item が取得できなくても URL は常に保持される
21                    property Title                  : string        read FTitle write FTitle;
22            end;
23            TFavoriteBoardItem = class(TFavoriteItem)
24            private
25                    FItem                           : TBoard;
26                  function        GetItem : TBoard;                  function        GetItem : TBoard;
27          public          public
28                  constructor Create( inURL : string; inTitle : string = ''; inItem : TBoard = nil );                  constructor Create( inURL : string; inTitle : string = ''; inItem : TBoard = nil );
29                  constructor CreateWithItem( inItem : TBoard );                  constructor CreateWithItem( inItem : TBoard );
30          destructor Destory;                  destructor Destory;
31                    function GetItemTitle : string; override;
32                  property Item                           : TBoard        read GetItem write FItem;                  property Item                           : TBoard        read GetItem write FItem;
                 property URL                            : string        read FURL write FURL;   // Item が取得できなくても URL は常に保持される  
                 property Title                  : string        read FTitle write FTitle;  
33          end;          end;
34    
35          TFavoriteThreadItem = class          TFavoriteThreadItem = class(TFavoriteItem)
36          private          private
37                  FItem                           : TThreadItem;                  FItem                           : TThreadItem;
                 FURL                            : string;  
                 FTitle                  : string;  
38                  function        GetItem : TThreadItem;                  function        GetItem : TThreadItem;
39          public          public
40                  constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil );                  constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil );
41                  constructor CreateWithItem( inItem : TThreadItem );                  constructor CreateWithItem( inItem : TThreadItem );
42          destructor Destory;                  destructor Destory;
43                    function GetItemTitle : string; override;
44                  property Item                           : TThreadItem   read GetItem write FItem;                  property Item                           : TThreadItem   read GetItem write FItem;
                 property URL                            : string                        read FURL write FURL;   // Item が取得できなくても URL は常に保持される  
                 property Title                  : string                        read FTitle write FTitle;  
45          end;          end;
46    
47          TFavoriteDM = class(TDataModule)          TFavoriteDM = class(TDataModule)
                 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;                  procedure Clear;
58                                  function GetFavoriteFilePath() : String;                  function GetFavoriteFilePath() : String;
59                                  function SaveFavoriteFile(FileName: String) : Boolean;                  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);                  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;  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    
# Line 113  begin Line 111  begin
111                  FItem.Free;                  FItem.Free;
112          inherited;          inherited;
113  end;  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;  function        TFavoriteBoardItem.GetItem : TBoard;
134  var  var
135          protocol, host, path, document, port, bookmark : string;          protocol, host, path, document, port, bookmark : string;
136          BBSID{, BBSKey} : string;          BBSID   : string;
137          tmpURL, boardURL                : string;          tmpURL  : string;
 //      category : TCategory;  
         i, bi: Integer;  
         tmpThread: TThreadItem;  
         tmpBoard: TBoard;  
138  begin  begin
139    
140          if FItem = nil then begin          if FItem = nil then begin
141                  FItem := BBSsFindBoardFromURL( URL );                  FItem := BBSsFindBoardFromURL( URL );
142                  if FItem = nil then begin                  if FItem = nil then begin
                         //===== プラグイン  
                         try  
                                 //作業中//  
                                 bi := High( BoardPlugIns );  
                                 for i := Low( BoardPlugIns ) to bi do begin  
                                         if Assigned( Pointer( BoardPlugIns[ i ].Module ) ) then begin  
                                                 case BoardPlugIns[ i ].AcceptURL( URL ) of  
                                                 atThread:  
                                                         begin  
                                                                 tmpThread               := TThreadItem.Create( BoardPlugIns[ i ], URL );  
                                                                 boardURL                := tmpThread.BoardPlugIn.GetBoardURL( DWORD( tmpThread ) );  
                                                                 FItem                           := BBSsFindBoardFromURL( boardURL );  
                                                                 URL := FItem.URL;  
                                                                 tmpThread.Free;  
                                                                 break;  
                                                         end;  
                                                 atBoard:  
                                                         begin  
                                                                 tmpBoard := TBoard.Create(BoardPlugIns[ i ], URL);  
                                                                 FItem := BBSsFindBoardFromURL( tmpBoard.URL );  
                                                                 tmpBoard.Free;  
                                                                 if FItem <> nil then begin  
                                                                         URL := FItem.URL;  
                                                                 end;  
                                                                 break;  
                                                         end;  
                                                 end;  
                                         end;  
                                 end;  
                         except  
                                 // exception が発生した場合は内部処理に任せたいのでここでは何もしない  
                         end;  
                 end;  
                 if FItem = nil then begin  
143                          tmpURL := URL;                          tmpURL := URL;
144                          GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );                          GikoSys.ParseURI( tmpURL, protocol, host, path, document, port, bookmark );
145                          if GikoSys.Is2chHost( host ) then begin                          if GikoSys.Is2chHost( host ) then begin
# Line 210  begin Line 189  begin
189          FItem.Free;          FItem.Free;
190      inherited;      inherited;
191  end;  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;  function        TFavoriteThreadItem.GetItem : TThreadItem;
205  var  var
# Line 256  begin Line 246  begin
246                  end;                  end;
247    
248                  if FItem = nil then begin                  if FItem = nil then begin
249                          FItem := TThreadItem.Create( board.BoardPlugIn, browsableURL );                          FItem := TThreadItem.Create( board.BoardPlugIn, board, browsableURL );
250    
251                          FItem.Title := Title;                          FItem.Title := Title;
252                          board.Add( FItem );                          board.Add( FItem );
# Line 267  begin Line 257  begin
257    
258  end;  end;
259    
 procedure TFavoriteDM.DataModuleDestroy(Sender: TObject);  
 //var  
 //      i: Integer;  
 begin  
 {    TreeView.Items.BeginUpdate;  
         for i := TreeView.Items.Count - 1 downto 0 do begin  
            //   if TObject(TreeView.Items[i].Data) <> nil then  
        //       TObject(TreeView.Items[i].Data).Free;  
         end;  
     TreeView.Items.Clear;  
     TreeView.Items.EndUpdate;  
 }    //TreeView.Free;  
 end;  
260  procedure TFavoriteDM.Clear;  procedure TFavoriteDM.Clear;
261  var  var
262          Node    : TTreeNode;          Node    : TTreeNode;
# Line 293  begin Line 270  begin
270          end;          end;
271                  TreeView.Items.Clear;                  TreeView.Items.Clear;
272                  TreeView.Items.EndUpdate;                  TreeView.Items.EndUpdate;
273      //TreeView.Free;  
274        FavoriteDM.Modified := true;
275  end;  end;
276    
277  procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);  procedure TFavoriteDM.SetFavTreeView(TreeView: TTreeView);
# Line 310  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;
# Line 326  begin Line 307  begin
307              LoadXMLDocument(FileName, XMLDoc);              LoadXMLDocument(FileName, XMLDoc);
308                          XMLNode := XMLDoc.DocumentElement;                          XMLNode := XMLDoc.DocumentElement;
309    
310                          FStack := TStack.Create;                          Stack := TStack.Create;
311                          try                          try
312                                  FStack.Push(Node);                                  Stack.Push(Node);
313                                  LinkExists := False;                                  LinkExists := False;
314                                  if XMLNode.NodeName = 'favorite' then begin                                  if XMLNode.NodeName = 'favorite' then begin
315                                          for i := XMLNode.ChildNodes.Count - 1 downto 0 do begin                                          for i := XMLNode.ChildNodes.Count - 1 downto 0 do begin
316                                                  ReadNode(XMLNode.ChildNodes[i]);                                                  ReadNode(XMLNode.ChildNodes[i], Stack, FTreeView);
317                                                  if (XMLNode.ChildNodes[i].NodeName = 'folder') and                                                  if (XMLNode.ChildNodes[i].NodeName = 'folder') and
318                                                           (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin                                                           (XMLNode.ChildNodes[i].Attributes['title'] = FAVORITE_LINK_NAME) then begin
319                                                          LinkExists := True;                                                          LinkExists := True;
# Line 345  begin Line 326  begin
326                                          Node.ImageIndex := 14;                                          Node.ImageIndex := 14;
327                                          Node.SelectedIndex := 14;                                          Node.SelectedIndex := 14;
328                                  end;                                  end;
329    
330                          finally                          finally
331                                  FStack.Free;                                  Stack.Free;
332                  XMLDoc.Free;                  XMLDoc.Free;
333                          end;                          end;
334                  except                  except
335                on e : Exception do begin
336                    FABend := True;
337                end;
338                  end;                  end;
339          end;          end;
340    
 {  
         FavFolder := TFavoriteFolder.Create;  
         Node := FTreeView.Items.AddChildObjectFirst(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 388  var Line 353  var
353          threadItem      : TThreadItem;          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.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavFolder);                          CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavFolder);
361                          CurrentNode.ImageIndex := 14;                          CurrentNode.ImageIndex := 14;
362                          CurrentNode.SelectedIndex := 14;                          CurrentNode.SelectedIndex := 14;
363                          FStack.Push(CurrentNode);                          Stack.Push(CurrentNode);
364                  end;                  end;
365                  for i := Node.ChildNodes.Count - 1 downto 0 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 TObject(ParentNode.Data) is TFavoriteFolder then                  if CurrentNode <> nil then
369                          CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true';                          CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true';
370                  if FStack.Count <> 0 then                  if Stack.Count <> 0 then
371                          FStack.Pop;                          Stack.Pop;
372          end else if Node.NodeName = 'favitem' then begin          end else if Node.NodeName = 'favitem' then begin
373                  try                  try
374                          ParentNode := FStack.Peek;                          ParentNode := Stack.Peek;
375                          if TObject(ParentNode.Data) is TFavoriteFolder then begin                          if TObject(ParentNode.Data) is TFavoriteFolder then begin
376                                  if Node.Attributes['favtype'] = 'board' then begin                                  if Node.Attributes['favtype'] = 'board' then begin
377                                          FavBoard := nil;                                          FavBoard := nil;
# Line 414  begin Line 380  begin
380                                                  board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );                                                  board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
381                                                  if board <> nil then                                                  if board <> nil then
382                                                          FavBoard := TFavoriteBoardItem.Create(                                                          FavBoard := TFavoriteBoardItem.Create(
383                                                                  board.URL, Node.Attributes[ 'title' ], board );                                                                  board.URL, MojuUtils.UnSanitize(Node.Attributes[ 'title' ]), board );
384                                          end else begin                                          end else begin
385                                                  FavBoard := TFavoriteBoardItem.Create(                                                  FavBoard := TFavoriteBoardItem.Create(
386                                                          Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );                                                          Node.Attributes[ 'url' ], MojuUtils.UnSanitize(Node.Attributes[ 'title' ]), nil );
387                                          end;                                          end;
388                                          CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavBoard);                                          CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, UnSanitize(Node.Attributes['title']), FavBoard);
389                                          CurrentNode.ImageIndex := 15;                                          CurrentNode.ImageIndex := 15;
390                                          CurrentNode.SelectedIndex := 15;                                          CurrentNode.SelectedIndex := 15;
391                                  end else if Node.Attributes['favtype'] = 'thread' then begin                                  end else if Node.Attributes['favtype'] = 'thread' then begin
# Line 435  begin Line 401  begin
401                                                  if threadItem = nil then begin                                                  if threadItem = nil then begin
402                                                          threadItem := TThreadItem.Create(                                                          threadItem := TThreadItem.Create(
403                                                                  board.BoardPlugIn,                                                                  board.BoardPlugIn,
404                                    board,
405                                                                  GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) );                                                                  GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) );
406                                                          threadItem.Title := Node.Attributes[ 'title' ];                                                          threadItem.Title := UnSanitize(Node.Attributes[ 'title' ]);
407                                                          board.Add( threadItem );                                                          board.Add( threadItem );
408                                                  end;                                                  end;
409                                                  FavThread := TFavoriteThreadItem.Create(                                                  FavThread := TFavoriteThreadItem.Create(
410                                                          threadItem.URL, Node.Attributes[ 'title' ], threadItem );                                                          threadItem.URL, UnSanitize(Node.Attributes[ 'title' ]), threadItem );
411                          threadItem.Free;                          threadItem.Free;
412                                          end else begin                                          end else begin
413                                                  FavThread := TFavoriteThreadItem.Create(                                                  FavThread := TFavoriteThreadItem.Create(
414                                                          Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], nil );                                                          Node.Attributes[ 'url' ], UnSanitize(Node.Attributes[ 'title' ]), nil );
415                                          end;                                          end;
416                                          CurrentNode := FTreeView.Items.AddChildObjectFirst(ParentNode, Node.Attributes['title'], FavThread);                                          CurrentNode := TreeView.Items.AddChildObjectFirst(ParentNode, UnSanitize(Node.Attributes['title']), FavThread);
417                                          CurrentNode.ImageIndex := 16;                                          CurrentNode.ImageIndex := 16;
418                                          CurrentNode.SelectedIndex := 16;                                          CurrentNode.SelectedIndex := 16;
419                                  end;                                  end;
# Line 458  begin Line 425  begin
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, tmpFileName: 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;
         if FileExists(FileName) then begin  
                 tmpFileName := GikoSys.GetConfigDir + '~' + FAVORITE_FILE_NAME;  
                 if FileExists(tmpFileName) then  
                         SysUtils.DeleteFile(tmpFileName); //SysUtils.をつけないとWinAPIと区別できないので  
                 RenameFile(FileName, tmpFileName);  
         end;  
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.getFirstChild, 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    
 {  
 procedure TFavoriteDM.AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);  
 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;  
 }  
   
472  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);
473  var  var
474          s: string;          s: string;
# Line 557  begin Line 489  begin
489                  end else if TObject(data) is TFavoriteBoardItem then begin                  end else if TObject(data) is TFavoriteBoardItem then begin
490                          FavBoard := TFavoriteBoardItem(data);                          FavBoard := TFavoriteBoardItem(data);
491                          s := Format('<favitem type="2ch" favtype="board" url="%s" title="%s"/>',                          s := Format('<favitem type="2ch" favtype="board" url="%s" title="%s"/>',
492                                                                          [HtmlEncode( FavBoard.URL ), HtmlEncode(Node.Text)]);                                                                          [HtmlEncode( FavBoard.URL ), HtmlEncode(MojuUtils.Sanitize(Node.Text))]);
493                          SaveList.Add(s);                          SaveList.Add(s);
494                  end else if TObject(data) is TFavoriteThreadItem then begin                  end else if TObject(data) is TFavoriteThreadItem then begin
495                          FavThread := TFavoriteThreadItem(data);                          FavThread := TFavoriteThreadItem(data);
496                          s := Format('<favitem type="2ch" favtype="thread" url="%s" title="%s"/>',                          s := Format('<favitem type="2ch" favtype="thread" url="%s" title="%s"/>',
497                                                                          [HtmlEncode( FavThread.URL ), HtmlEncode(Node.Text)]);                                                                          [HtmlEncode( FavThread.URL ), HtmlEncode(MojuUtils.Sanitize(Node.Text))]);
498                          SaveList.Add(s);                          SaveList.Add(s);
499                  end;                  end;
500                  Node := Node.getNextSibling;                  Node := Node.getNextSibling;
501          end;          end;
502  end;  end;
503    
 {  
 procedure TFavoriteDM.SAXStartDocument(Sender: TObject);  
 begin  
         FStack := TStack.Create;  
         FStack.Push(FTreeView.Items.GetFirstNode);  
 end;  
   
 procedure TFavoriteDM.SAXEndDocument(Sender: TObject);  
 begin  
         FStack.Free;  
 end;  
   
 procedure TFavoriteDM.SAXStartElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString;  
         const Atts: IAttributes);  
 var  
         FavType: string;  
         ParentNode: TTreeNode;  
         CurrentNode: TTreeNode;  
         FavFolder: TFavoriteFolder;  
         FavBoard: TFavoriteBoardItem;  
         FavThread: TFavoriteThreadItem;  
 begin  
         if QName = 'folder' then begin  
                 ParentNode := FStack.Peek;  
                 if TObject(ParentNode.Data) is TFavoriteFolder then begin  
                         FavFolder := TFavoriteFolder.Create;  
                         CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavFolder);  
                         CurrentNode.ImageIndex := 12;  
                         CurrentNode.SelectedIndex := 13;  
                         FStack.Push(CurrentNode);  
                 end;  
         end else if QName = 'favitem' then begin  
                 ParentNode := FStack.Peek;  
                 if TObject(ParentNode.Data) is TFavoriteFolder then begin  
                         FavType := Atts.getValue('favtype');  
                         if FavType = 'board' then begin  
                                 FavBoard := TFavoriteBoardItem.Create;  
                                 FavBoard.BBSID := Atts.getValue('bbs');  
                                 FavBoard.BoardName := Atts.getValue('boardname');  
                                 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavBoard);  
                                 CurrentNode.ImageIndex := 14;  
                                 CurrentNode.SelectedIndex := 15;  
                         end else if FavType = 'thread' then begin  
                                 FavThread := TFavoriteThreadItem.Create;  
                                 FavThread.BBSID := Atts.getValue('bbs');  
                                 FavThread.ThreadID := Atts.getValue('thread');  
                                 FavThread.ThreadName := Atts.getValue('threadname');  
                                 CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Atts.getValue('title'), FavThread);  
                                 CurrentNode.ImageIndex := 16;  
                                 CurrentNode.SelectedIndex := 17;  
                         end;  
                 end;  
         end;  
 end;  
   
 procedure TFavoriteDM.SAXEndElement(Sender: TObject; const NamespaceURI, LocalName, QName: SAXString);  
 begin  
         if QName = 'folder' then begin  
                 if FStack.Count <> 0 then  
                         FStack.Pop;  
         end;  
 end;  
   
 procedure TFavoriteDM.SAXCharacters(Sender: TObject; const PCh: SAXString);  
 begin  
 //  
 end;  
 }  
504  function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;  function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;
505  var  var
506          FavoriteFilePath: string;          FavoriteFilePath: string;

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

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