OSDN Git Service

・お気に入りの名前を変更したときに変更が適用されるように修正。
[gikonavigoeson/gikonavi.git] / Favorite.pas
index 87b2135..cdd6670 100644 (file)
@@ -4,7 +4,7 @@ interface
 
 uses
        Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
-       GikoSystem{, XMLIntf, XMLDoc};
+       GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup;
        {SAX, SAXHelpers, SAXComps, SAXKW;}
 
 type
@@ -13,22 +13,30 @@ type
 
        TFavoriteBoardItem = class
        private
-               FBBSID: string;
-               FBoardName: string;
+               FItem                           : TBoard;
+               FURL                            : string;
+               FTitle                  : string;
+               function        GetItem : TBoard;
        public
-               property BBSID: string read FBBSID write FBBSID;
-               property BoardName: string read FBoardName write FBoardName;
+               constructor Create( inURL : string; inTitle : string = ''; inItem : TBoard = nil );
+               constructor CreateWithItem( inItem : TBoard );
+               property Item                           : TBoard        read GetItem write FItem;
+               property URL                            : string        read FURL write FURL;   // Item \82ª\8eæ\93¾\82Å\82«\82È\82­\82Ä\82à URL \82Í\8fí\82É\95Û\8e\9d\82³\82ê\82é
+               property Title                  : string        read FTitle write FTitle;
        end;
 
        TFavoriteThreadItem = class
        private
-               FBBSID: string;
-               FThreadID: string;
-               FThreadName: string;
+               FItem                           : TThreadItem;
+               FURL                            : string;
+               FTitle                  : string;
+               function        GetItem : TThreadItem;
        public
-               property BBSID: string read FBBSID write FBBSID;
-               property ThreadID: string read FThreadID write FThreadID;
-               property ThreadName: string read FThreadName write FThreadName;
+               constructor Create( inURL : string; inTitle : string = ''; inItem : TThreadItem = nil );
+               constructor CreateWithItem( inItem : TThreadItem );
+               property Item                           : TThreadItem   read GetItem write FItem;
+               property URL                            : string                        read FURL write FURL;   // Item \82ª\8eæ\93¾\82Å\82«\82È\82­\82Ä\82à URL \82Í\8fí\82É\95Û\8e\9d\82³\82ê\82é
+               property Title                  : string                        read FTitle write FTitle;
        end;
 
        TFavoriteDM = class(TDataModule)
@@ -49,6 +57,8 @@ type
 //             procedure SAXCharacters(Sender: TObject; const PCh: SAXString);
        public
                { Public \90é\8c¾ }
+                               function GetFavoriteFilePath() : String;
+                               function SaveFavoriteFile(FileName: String) : Boolean;
                procedure SetFavTreeView(TreeView: TTreeView);
                procedure ReadFavorite;
                procedure WriteFavorite;
@@ -62,12 +72,107 @@ const
 
 implementation
 
+uses   ExternalBoardManager, ExternalBoardPlugInMain;
+
 const
        FAVORITE_ROOT_NAME = '\82¨\8bC\82É\93ü\82è';
        FAVORITE_FILE_NAME = 'Favorite.xml';
 
 {$R *.dfm}
 
+constructor TFavoriteBoardItem.Create(
+       inURL           : string;
+       inTitle : string = '';
+       inItem  : TBoard = nil
+);
+begin
+
+       inherited Create;
+
+       URL             := inURL;
+       Title   := inTitle;
+       Item    := inItem;
+
+end;
+
+constructor TFavoriteBoardItem.CreateWithItem(
+       inItem  : TBoard
+);
+begin
+
+       Create( inItem.URL, inItem.Title, inItem );
+
+end;
+
+function       TFavoriteBoardItem.GetItem : TBoard;
+begin
+
+       if FItem = nil then begin
+               FItem := BBSsFindBoardFromURL( URL );
+               // \8b\8c\8e®\82Ì\82¨\8bC\82É\93ü\82è\82Æ\82Ì\8cÝ\8a·\90«\82Ì\82½\82ß
+               if FItem = nil then
+                       // \81¦\8dì\82Á\82Ä\82à\81A\92Ç\89Á\82·\82é\83J\83e\83S\83\8a\82ª\96³\82¢\82Ì\82Å\8c\83\82µ\82­\95Û\97¯
+                       FItem := TBoard.Create( nil, URL );
+       end;
+
+       Result := FItem;
+
+end;
+
+constructor TFavoriteThreadItem.Create(
+       inURL           : string;
+       inTitle : string = '';
+       inItem  : TThreadItem = nil
+);
+begin
+
+       inherited Create;
+
+       URL             := inURL;
+       Title   := inTitle;
+       Item    := inItem;
+
+end;
+
+constructor TFavoriteThreadItem.CreateWithItem(
+       inItem  : TThreadItem
+);
+begin
+
+       Create( inItem.URL, inItem.Title, inItem );
+
+end;
+
+function       TFavoriteThreadItem.GetItem : TThreadItem;
+var
+       threadItem      : TThreadItem;
+       board                           : TBoard;
+       boardURL                : string;
+       i                                               : Integer;
+begin
+
+       if FItem = nil then begin
+               boardURL        := GikoSys.GetThreadURL2BoardURL( URL );
+               board                   := BBSsFindBoardFromURL( boardURL );
+
+               if board = nil then
+                       // \81¦\8dì\82Á\82Ä\82à\81A\92Ç\89Á\82·\82é\83J\83e\83S\83\8a\82ª\96³\82¢\82Ì\82Å\8c\83\82µ\82­\95Û\97¯
+                       board := TBoard.Create( nil, boardURL )
+               else
+                       FItem := board.FindThreadFromURL( URL );
+
+               if FItem = nil then begin
+                       FItem := TThreadItem.Create( board.BoardPlugIn, URL );
+
+                       FItem.Title := Title;
+                       board.Add( FItem );
+               end;
+       end;
+
+       Result := FItem;
+
+end;
+
 procedure TFavoriteDM.DataModuleCreate(Sender: TObject);
 begin
        //FTreeView := TreeView;
@@ -162,12 +267,16 @@ end;
 procedure TFavoriteDM.ReadNode(Node: IXMLNode);
 var
        i: Integer;
+       j, jBound : Integer;
 
        ParentNode: TTreeNode;
        CurrentNode: TTreeNode;
        FavFolder: TFavoriteFolder;
        FavBoard: TFavoriteBoardItem;
        FavThread: TFavoriteThreadItem;
+       board                           : TBoard;
+       threadItem      : TThreadItem;
+       url                                     : string;
 begin
        if Node.NodeName = 'folder' then begin
                ParentNode := FStack.Peek;
@@ -176,6 +285,7 @@ begin
                        CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavFolder);
                        CurrentNode.ImageIndex := 14;
                        CurrentNode.SelectedIndex := 14;
+                       CurrentNode.Expanded := Node.Attributes[ 'expanded' ] = 'true';
                        FStack.Push(CurrentNode);
                end;
                for i := 0 to Node.ChildNodes.Count - 1 do begin
@@ -187,17 +297,41 @@ begin
                ParentNode := FStack.Peek;
                if TObject(ParentNode.Data) is TFavoriteFolder then begin
                        if Node.Attributes['favtype'] = 'board' then begin
-                               FavBoard := TFavoriteBoardItem.Create;
-                               FavBoard.BBSID := Node.Attributes['bbs'];
-                               FavBoard.BoardName := Node.Attributes['boardname'];
+                               // \8b\8c\8e®\82Ì\82¨\8bC\82É\93ü\82è\82Æ\82Ì\8cÝ\8a·\90«\82Ì\82½\82ß
+                               if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
+                                       board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
+                                       FavBoard := TFavoriteBoardItem.Create(
+                                               board.URL, Node.Attributes[ 'title' ], board );
+                               end else begin
+                                       FavBoard := TFavoriteBoardItem.Create(
+                                               Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], board );
+                               end;
                                CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavBoard);
                                CurrentNode.ImageIndex := 15;
                                CurrentNode.SelectedIndex := 15;
                        end else if Node.Attributes['favtype'] = 'thread' then begin
-                               FavThread := TFavoriteThreadItem.Create;
-                               FavThread.BBSID := Node.Attributes['bbs'];
-                               FavThread.ThreadID := Node.Attributes['thread'];
-                               FavThread.ThreadName := Node.Attributes['threadname'];
+                               // \8b\8c\8e®\82Ì\82¨\8bC\82É\93ü\82è\82Æ\82Ì\8cÝ\8a·\90«\82Ì\82½\82ß
+                               if Length( Node.Attributes[ 'bbs' ] ) > 0 then begin
+                                       board := BBSsFindBoardFromBBSID( Node.Attributes[ 'bbs' ] );
+                                       if board = nil then
+                                               Exit;
+
+                                       if not board.IsThreadDatRead then
+                                               GikoSys.ReadSubjectFile( board );
+                                       threadItem := board.Find( Node.Attributes[ 'thread' ] );
+                                       if threadItem = nil then begin
+                                               threadItem := TThreadItem.Create(
+                                                       board.BoardPlugIn,
+                                                       GikoSys.Get2chBoard2ThreadURL( board, ChangeFileExt( Node.Attributes[ 'thread' ], '' ) ) );
+                                               threadItem.Title := Node.Attributes[ 'title' ];
+                                               board.Add( threadItem );
+                                       end;
+                                       FavThread := TFavoriteThreadItem.Create(
+                                               threadItem.URL, Node.Attributes[ 'title' ], threadItem );
+                               end else begin
+                                       FavThread := TFavoriteThreadItem.Create(
+                                               Node.Attributes[ 'url' ], Node.Attributes[ 'title' ], threadItem );
+                               end;
                                CurrentNode := FTreeView.Items.AddChildObject(ParentNode, Node.Attributes['title'], FavThread);
                                CurrentNode.ImageIndex := 16;
                                CurrentNode.SelectedIndex := 16;
@@ -218,7 +352,7 @@ var
        XMLNode: IXMLNode;
 //     FavoNode: IXMLNode;
 begin
-       XMLDoc :=  NewXMLDocument;
+       XMLDoc :=       NewXMLDocument;
        XMLDoc.Encoding := 'Shift_JIS';
        XMLDoc.StandAlone := 'yes';
        XMLNode := XMLDoc.AddChild('favorite');
@@ -288,19 +422,22 @@ var
 begin
        for i := 0 to Node.Count - 1 do begin
                if TObject(Node.Item[i].Data) is TFavoriteFolder then begin
-                       s := Format('<folder title="%s">', [HtmlEncode(Node.Item[i].Text)]);
+                       if Node.Item[ i ].Expanded then
+                               s := Format('<folder title="%s" expanded="true">', [HtmlEncode(Node.Item[i].Text)])
+                       else
+                               s := Format('<folder title="%s" expanded="false">', [HtmlEncode(Node.Item[i].Text)]);
                        SaveList.Add(s);
                        AddSaveString(Node.Item[i], SaveList);
                        SaveList.Add('</folder>');
                end else if TObject(Node.Item[i].Data) is TFavoriteBoardItem then begin
                        FavBoard := TFavoriteBoardItem(Node.Item[i].Data);
-                       s := Format('<favitem type="2ch" favtype="board" bbs="%s" title="%s" boardname="%s"/>',
-                                                                       [FavBoard.BBSID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavBoard.BoardName)]);
+                       s := Format('<favitem type="2ch" favtype="board" url="%s" title="%s"/>',
+                                                                       [HtmlEncode( FavBoard.URL ), HtmlEncode(Node.Item[ i ].Text)]);
                        SaveList.Add(s);
                end else if TObject(Node.Item[i].Data) is TFavoriteThreadItem then begin
                        FavThread := TFavoriteThreadItem(Node.Item[i].Data);
-                       s := Format('<favitem type="2ch" favtype="thread" bbs="%s" thread="%s" title="%s" threadname="%s"/>',
-                                                                       [FavThread.BBSID, FavThread.ThreadID, HtmlEncode(Node.Item[i].Text), HtmlEncode(FavThread.ThreadName)]);
+                       s := Format('<favitem type="2ch" favtype="thread" url="%s" title="%s"/>',
+                                                                       [HtmlEncode( FavThread.URL ), HtmlEncode(Node.Item[ i ].Text)]);
                        SaveList.Add(s);
                end;
        end;
@@ -374,4 +511,31 @@ begin
 //
 end;
 }
+function TFavoriteDM.SaveFavoriteFile(FileName: String) : Boolean;
+var
+       FavoriteFilePath: string;
+               tempStringList: TStringList;
+begin
+
+       FavoriteFilePath := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
+
+       if FileExists( FavoriteFilePath ) then begin
+               tempStringList := TStringList.Create;
+               try
+                       tempStringList.LoadFromFile( FavoriteFilePath );
+                       tempStringList.SaveToFile( FileName );
+               finally
+                       tempStringList.Free;
+               end;
+               Result := true;
+       end else begin
+               Result := false;
+       end;
+end;
+
+function TFavoriteDM.GetFavoriteFilePath() : String;
+begin
+       Result := GikoSys.GetConfigDir + FAVORITE_FILE_NAME;
+end;
+
 end.