uses
Messages, SysUtils, Classes, Contnrs, ComCtrls, {HttpApp,} YofUtils,
- GikoSystem{, XMLIntf, XMLDoc};
+ GikoSystem{, XMLIntf, XMLDoc}, GikoXMLDoc, BoardGroup;
{SAX, SAXHelpers, SAXComps, SAXKW;}
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)
// 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;
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;
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;
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
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;
XMLNode: IXMLNode;
// FavoNode: IXMLNode;
begin
- XMLDoc := NewXMLDocument;
+ XMLDoc := NewXMLDocument;
XMLDoc.Encoding := 'Shift_JIS';
XMLDoc.StandAlone := 'yes';
XMLNode := XMLDoc.AddChild('favorite');
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;
//
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.