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.46.4.3 by h677, Tue May 17 14:32:51 2005 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
# Line 176  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 233  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 259  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 276  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 292  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 311  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 354  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 380  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 403  begin Line 403  begin
403                                                                  board.BoardPlugIn,                                                                  board.BoardPlugIn,
404                                  board,                                  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 425  begin Line 425  begin
425  end;  end;
426    
427  procedure TFavoriteDM.WriteFavorite;  procedure TFavoriteDM.WriteFavorite;
 {  
 var  
         FileName: 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);  
 }  
428  var  var
429          FileName, tmpFileName: string;          FileName, tmpFileName, bakFileName: 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  end;                  SaveList.Add('</favorite>');
447                    // 一時ファイルとして保存
448  {                  SaveList.SaveToFile(tmpFileName);
449  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; XMLNode: IXMLNode);                  FileRep := True;
450  var                  // 前のファイルを移動する
451          i: Integer;                  if FileExists(FileName) then begin
452  //      s: string;                      bakFileName := GikoSys.GetConfigDir + '~' + FAVORITE_FILE_NAME;
453          FavBoard: TFavoriteBoardItem;                      if FileExists(bakFileName) then begin
454          FavThread: TFavoriteThreadItem;                          FileRep := SysUtils.DeleteFile(bakFileName); //SysUtils.をつけないとWinAPIと区別できないので
455          FavNode: IXMLNode;                      end;
456  begin                      if FileRep then begin
457          for i := 0 to Node.Count - 1 do begin                          FileRep := RenameFile(FileName, bakFileName);
458                  if TObject(Node.Item[i].Data) is TFavoriteFolder then begin                      end;
459                          FavNode := XMLNode.AddChild('folder');                  end;
460                          FavNode.Attributes['title'] := Node.Item[i].Text;                  // 正規のファイル名にリネームする
461                          AddSaveString(Node.Item[i], FavNode);                  if FileRep then begin
462                  end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin                      FileRep := RenameFile(tmpFileName, FileName);
463                          FavBoard := TFavoriteBoardItem(Node.Item[i].Data);                  end;
464                          FavNode := XMLNode.AddChild('favitem');              except
465                          FavNode.Attributes['type'] := '2ch';              end;
466                          FavNode.Attributes['favtype'] := 'board';          finally
467                          FavNode.Attributes['bbs'] := FavBoard.BBSID;              SaveList.Free;
468                          FavNode.Attributes['title'] := Node.Item[i].Text;          end;
469                          FavNode.Attributes['boardname'] := FavBoard.BoardName;      end;
                 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;  
470  end;  end;
 }  
471    
472  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);  procedure TFavoriteDM.AddSaveString(Node: TTreeNode; SaveList: TStringList);
473  var  var
# Line 524  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.46.4.3  
changed lines
  Added in v.1.55

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