OSDN Git Service

履歴を別クラス(THistoryList)に分離
[gikonavigoeson/gikonavi.git] / HistoryList.pas
1 unit HistoryList;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Classes, Graphics, Controls,
7     BoardGroup, Favorite, ComCtrls, GikoXMLDoc;
8
9 type
10         TGikoTreeType = (gttNone, gtt2ch, gttHistory, gttFavorite);
11
12         THistoryList = class(TList)
13     public
14         function AddHistory( favItem : TFavoriteThreadItem; TreeView : TTreeView;
15             TreeType: TGikoTreeType): Boolean;
16         procedure DeleteHistory( threadItem: TThreadItem; TreeView : TTreeView;
17             TreeType: TGikoTreeType );
18         procedure Clear; override;
19         procedure SaveToFile(const FileName: String);
20         procedure LoadFromFile(const FileName: String;
21             TreeView : TTreeView; TreeType: TGikoTreeType);
22     end;
23
24
25 implementation
26
27 uses
28     Giko, GikoSystem, Setting, YofUtils, MojuUtils;
29
30 const
31         ITEM_ICON_THREADLOG1            = 6;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
32         ITEM_ICON_THREADLOG2            = 7;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
33
34
35 function THistoryList.AddHistory(
36     favItem : TFavoriteThreadItem; TreeView : TTreeView;
37     TreeType: TGikoTreeType ): Boolean;
38 var
39         i: Integer;
40         Item: TFavoriteThreadItem;
41         Node: TTreeNode;
42 begin
43         Result := True;
44         if TreeType = gttHistory then
45         TreeView.Selected := nil;
46
47         for i := 0 to Self.Count - 1 do begin
48                 if TObject(Self[i]) is TFavoriteThreadItem then begin
49                         Item := TFavoriteThreadItem(Self[i]);
50                         if Item.URL = favItem.URL then begin
51                                 Self.Move(i, 0);
52                                 if TreeType = gttHistory then
53                                         if TreeView.Items.GetFirstNode <> TreeView.Items[ i ] then
54                                                 TreeView.Items[ i ].MoveTo( TreeView.Items.GetFirstNode, naInsert );
55                                                                 Result := false;
56                                 Exit;
57                         end;
58                 end;
59         end;
60
61         if Self.Count > 0 then
62                 Self.Insert( 0, favItem )
63         else
64                 Self.Add( favItem );
65
66         while GikoSys.Setting.MaxRecordCount < Self.Count do begin
67                 i := Self.Count - 1;
68                 TObject( Self.Items[ i ] ).Free;
69                 Self.Delete( i );
70         end;
71
72         if TreeType = gttHistory then begin
73                 Node := TreeView.Items.Add( nil, favItem.Title );
74                 Node.MoveTo( TreeView.Items.GetFirstNode, naInsert );
75                 {
76                 if favItem.NewArrival then begin
77                         Node.ImageIndex := ITEM_ICON_THREADNEW1;
78                         Node.SelectedIndex := ITEM_ICON_THREADNEW2;
79                 end else begin
80                         Node.ImageIndex := ITEM_ICON_THREADLOG1;
81                         Node.SelectedIndex := ITEM_ICON_THREADLOG2;
82                 end;
83                 }
84                 // \95\89\89×\82ð\82©\82¯\82½\82­\82È\82¢\82Ì\82Å NewArrival \82Ì\83`\83F\83b\83N\82ð\8ds\82í\82È\82¢
85                 // \81¦favItem.Item \83v\83\8d\83p\83e\83B\82Í dat \82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\95K\97v\82Æ\82·\82é
86                 Node.ImageIndex := ITEM_ICON_THREADLOG1;
87                 Node.SelectedIndex := ITEM_ICON_THREADLOG2;
88                 Node.Data := favItem;
89                 //while GikoSys.Setting.AddressHistoryCount < TreeView.Items.Count do begin
90                 while GikoSys.Setting.MaxRecordCount < TreeView.Items.Count do begin
91                         i := TreeView.Items.Count - 1;
92                         TreeView.Items.Item[ i ].Delete;
93                 end;
94         end;
95 end;
96
97 procedure THistoryList.DeleteHistory( threadItem: TThreadItem;
98     TreeView : TTreeView; TreeType: TGikoTreeType );
99 var
100         i: Integer;
101         node: TTreeNode;
102 begin
103         // \83L\83\83\83r\83l\83b\83g\82É\97\9a\97ð\82ª\95\\8e¦\82³\82ê\82Ä\82¢\82½\82ç\81A
104         // \83L\83\83\83r\83l\83b\83g\93à\82Ì\83A\83C\83e\83\80\82à\8dí\8f\9c\82·\82é\81B
105         if (TreeType = gttHistory) then begin
106                 node := TreeView.Items.GetFirstNode;
107                 while (node <> nil) do begin
108                         if ( TFavoriteThreadItem(node.Data).Item  = threadItem ) then begin
109                                 TreeView.Items.Delete(node);
110                                 TreeView.Refresh;
111                                 node := nil;
112                         end else begin
113                                 node := node.GetNext;
114                         end;
115                 end;
116         end;
117         for i := 0 to Self.Count - 1 do begin
118                 if threadItem = TFavoriteThreadItem( Self.Items[i] ).Item then begin
119                         TFavoriteThreadItem( Self.Items[ i ] ).Free;
120                         Self.Delete(i);
121                         Self.Capacity := Self.Count;
122                         Break;
123                 end;
124         end;
125 end;
126
127 procedure THistoryList.Clear;
128 var
129         i : Integer;
130 begin
131         try
132                 for i := Self.Count - 1 downto 0 do begin
133                         if TObject(Self[ i ]) is TFavoriteThreadItem then
134                 TFavoriteThreadItem(Self[ i ]).Free
135             else if TObject(Self[ i ]) is TFavoriteBoardItem then
136                 TFavoriteBoardItem(Self[ i ]).Free;
137         end;
138         except
139         end;
140
141         inherited Clear;
142     Self.Capacity := Self.Count;
143
144 end;
145
146 procedure THistoryList.SaveToFile(const FileName: String);
147 var
148         i, bound        : Integer;
149         saveList        : TstringList;
150 begin
151
152         saveList := TStringList.Create;
153         try
154                 Self.Pack;
155         Self.Capacity := Self.Count;
156                 saveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
157                 saveList.Add('<address>');
158                 bound := Self.Count - 1;
159                 for i := bound downto 0 do begin
160                         // title \82Í\8d¡\82Ì\82Æ\82±\82ë\8eg\82Á\82Ä\82¢\82È\82¢
161                         saveList.Add(
162                                 '<history url="' + HtmlEncode( TFavoriteThreadItem( Self[ i ] ).URL ) + '"' +
163                                 ' title="' + HtmlEncode( MojuUtils.Sanitize(TFavoriteThreadItem( Self[ i ] ).Title )) + '"/>');
164                 end;
165                 saveList.Add('</address>');
166                 saveList.SaveToFile( FileName );
167         finally
168                 saveList.Free;
169         end;
170
171 end;
172
173 procedure THistoryList.LoadFromFile(const FileName: String;
174     TreeView : TTreeView; TreeType: TGikoTreeType);
175 var
176         i, bound                : Integer;
177         XMLDoc                  : IXMLDocument;
178         XMLNode                 : IXMLNode;
179         HistoryNode     : IXMLNode;
180         s                                               : string;
181         favItem                 : TFavoriteThreadItem;
182 {$IFDEF DEBUG}
183         st, rt : Cardinal;
184 {$ENDIF}
185 begin
186 {$IFDEF DEBUG}
187         st := GetTickCount;
188 {$ENDIF}
189         if FileExists( FileName ) then begin
190                 try
191                         XMLDoc := IXMLDocument.Create;
192                         //XMLDoc := LoadXMLDocument(FileName);
193                         LoadXMLDocument(FileName, XMLDoc);
194                         try
195                                 XMLNode := XMLDoc.DocumentElement;
196
197                                 if XMLNode.NodeName = 'address' then begin
198                                         bound := XMLNode.ChildNodes.Count - 1;
199                                         for i := 0 to bound do begin
200                                                 HistoryNode := XMLNode.ChildNodes[i];
201                                                 if HistoryNode.NodeName = 'history' then begin
202                                                         //if FReadCount >= sl.Count then begin
203                                                                 s := Trim(HistoryNode.Attributes['url']);
204                                                                 if s <> '' then begin
205                                                                         favItem := TFavoriteThreadItem.Create(
206                                                                                 s, MojuUtils.UnSanitize(HistoryNode.Attributes[ 'title' ]) );
207                                                                         if not AddHistory( favItem, TreeView, TreeType ) then
208                                                                                 favItem.Free;
209                                                                 end;
210                                                         //end;
211                                                 end;
212                                         end;
213                                 end;
214                         finally
215                                 XMLDoc.Free;
216                         end;
217                 except
218                 end;
219         end;
220 {$IFDEF DEBUG}
221         rt := GetTickCount - st;
222         Writeln('Runtime(Load Histroy) : ' + IntToStr(rt) + ' ms');
223 {$ENDIF}
224
225 end;
226
227 end.