OSDN Git Service

・スレタイの特定ワードを非表示にする機能に「©bbspink.com」も追加
[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         procedure SetTreeNode( TreeView : TTreeView );
23
24     end;
25
26
27 implementation
28
29 uses
30     Giko, GikoSystem, Setting, YofUtils, MojuUtils;
31
32 const
33         ITEM_ICON_THREADLOG1            = 6;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
34         ITEM_ICON_THREADLOG2            = 7;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
35
36
37 function THistoryList.AddHistory(
38     favItem : TFavoriteThreadItem; TreeView : TTreeView;
39     TreeType: TGikoTreeType ): Boolean;
40 var
41         i: Integer;
42         Item: TFavoriteThreadItem;
43         Node: TTreeNode;
44 begin
45         Result := True;
46         if TreeType = gttHistory then
47         TreeView.Selected := nil;
48
49         for i := 0 to Self.Count - 1 do begin
50                 if TObject(Self[i]) is TFavoriteThreadItem then begin
51                         Item := TFavoriteThreadItem(Self[i]);
52                         if Item.URL = favItem.URL then begin
53                                 Self.Move(i, 0);
54                                 if TreeType = gttHistory then
55                                         if TreeView.Items.GetFirstNode <> TreeView.Items[ i ] then
56                                                 TreeView.Items[ i ].MoveTo( TreeView.Items.GetFirstNode, naInsert );
57                                                                 Result := false;
58                                 Exit;
59                         end;
60                 end;
61         end;
62
63         if Self.Count > 0 then
64                 Self.Insert( 0, favItem )
65         else
66                 Self.Add( favItem );
67
68         while GikoSys.Setting.MaxRecordCount < Self.Count do begin
69                 i := Self.Count - 1;
70                 TObject( Self.Items[ i ] ).Free;
71                 Self.Delete( i );
72         end;
73
74         if TreeType = gttHistory then begin
75                 Node := TreeView.Items.Add( nil, favItem.Title );
76                 Node.MoveTo( TreeView.Items.GetFirstNode, naInsert );
77                 {
78                 if favItem.NewArrival then begin
79                         Node.ImageIndex := ITEM_ICON_THREADNEW1;
80                         Node.SelectedIndex := ITEM_ICON_THREADNEW2;
81                 end else begin
82                         Node.ImageIndex := ITEM_ICON_THREADLOG1;
83                         Node.SelectedIndex := ITEM_ICON_THREADLOG2;
84                 end;
85                 }
86                 // \95\89\89×\82ð\82©\82¯\82½\82­\82È\82¢\82Ì\82Å NewArrival \82Ì\83`\83F\83b\83N\82ð\8ds\82í\82È\82¢
87                 // \81¦favItem.Item \83v\83\8d\83p\83e\83B\82Í dat \82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\95K\97v\82Æ\82·\82é
88                 Node.ImageIndex := ITEM_ICON_THREADLOG1;
89                 Node.SelectedIndex := ITEM_ICON_THREADLOG2;
90                 Node.Data := favItem;
91                 //while GikoSys.Setting.AddressHistoryCount < TreeView.Items.Count do begin
92                 while GikoSys.Setting.MaxRecordCount < TreeView.Items.Count do begin
93                         i := TreeView.Items.Count - 1;
94                         TreeView.Items.Item[ i ].Delete;
95                 end;
96         end;
97 end;
98
99 procedure THistoryList.DeleteHistory( threadItem: TThreadItem;
100     TreeView : TTreeView; TreeType: TGikoTreeType );
101 var
102         i: Integer;
103         node: TTreeNode;
104 begin
105         // \83L\83\83\83r\83l\83b\83g\82É\97\9a\97ð\82ª\95\\8e¦\82³\82ê\82Ä\82¢\82½\82ç\81A
106         // \83L\83\83\83r\83l\83b\83g\93à\82Ì\83A\83C\83e\83\80\82à\8dí\8f\9c\82·\82é\81B
107         if (TreeType = gttHistory) then begin
108                 node := TreeView.Items.GetFirstNode;
109                 while (node <> nil) do begin
110                         if ( TFavoriteThreadItem(node.Data).Item  = threadItem ) then begin
111                                 TreeView.Items.Delete(node);
112                                 TreeView.Refresh;
113                                 node := nil;
114                         end else begin
115                                 node := node.GetNext;
116                         end;
117                 end;
118         end;
119         for i := 0 to Self.Count - 1 do begin
120                 if threadItem = TFavoriteThreadItem( Self.Items[i] ).Item then begin
121                         TFavoriteThreadItem( Self.Items[ i ] ).Free;
122                         Self.Delete(i);
123                         Self.Capacity := Self.Count;
124                         Break;
125                 end;
126         end;
127 end;
128
129 procedure THistoryList.Clear;
130 var
131         i : Integer;
132 begin
133         try
134                 for i := Self.Count - 1 downto 0 do begin
135                         if TObject(Self[ i ]) is TFavoriteThreadItem then
136                 TFavoriteThreadItem(Self[ i ]).Free
137             else if TObject(Self[ i ]) is TFavoriteBoardItem then
138                 TFavoriteBoardItem(Self[ i ]).Free;
139         end;
140         except
141         end;
142
143         inherited Clear;
144     Self.Capacity := Self.Count;
145
146 end;
147
148 procedure THistoryList.SaveToFile(const FileName: String);
149 var
150         i, bound        : Integer;
151         saveList        : TstringList;
152 begin
153
154         saveList := TStringList.Create;
155         try
156                 Self.Pack;
157         Self.Capacity := Self.Count;
158                 saveList.Add('<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>');
159                 saveList.Add('<address>');
160                 bound := Self.Count - 1;
161                 for i := bound downto 0 do begin
162                         // title \82Í\8d¡\82Ì\82Æ\82±\82ë\8eg\82Á\82Ä\82¢\82È\82¢
163                         saveList.Add(
164                                 '<history url="' + HtmlEncode( TFavoriteThreadItem( Self[ i ] ).URL ) + '"' +
165                                 ' title="' + HtmlEncode( MojuUtils.Sanitize(TFavoriteThreadItem( Self[ i ] ).Title )) + '"/>');
166                 end;
167                 saveList.Add('</address>');
168                 saveList.SaveToFile( FileName );
169         finally
170                 saveList.Free;
171         end;
172
173 end;
174
175 procedure THistoryList.LoadFromFile(const FileName: String;
176     TreeView : TTreeView; TreeType: TGikoTreeType);
177 var
178         i, bound                : Integer;
179         XMLDoc                  : IXMLDocument;
180         XMLNode                 : IXMLNode;
181         HistoryNode     : IXMLNode;
182         s                                               : string;
183         favItem                 : TFavoriteThreadItem;
184 {$IFDEF DEBUG}
185         st, rt : Cardinal;
186 {$ENDIF}
187 begin
188 {$IFDEF DEBUG}
189         st := GetTickCount;
190 {$ENDIF}
191         if FileExists( FileName ) then begin
192                 try
193                         XMLDoc := IXMLDocument.Create;
194                         //XMLDoc := LoadXMLDocument(FileName);
195                         LoadXMLDocument(FileName, XMLDoc);
196                         try
197                                 XMLNode := XMLDoc.DocumentElement;
198
199                                 if XMLNode.NodeName = 'address' then begin
200                                         bound := XMLNode.ChildNodes.Count - 1;
201                                         for i := 0 to bound do begin
202                                                 HistoryNode := XMLNode.ChildNodes[i];
203                                                 if HistoryNode.NodeName = 'history' then begin
204                                                         //if FReadCount >= sl.Count then begin
205                                                                 s := Trim(HistoryNode.Attributes['url']);
206                                                                 if s <> '' then begin
207                                                                         favItem := TFavoriteThreadItem.Create(
208                                                                                 s, MojuUtils.UnSanitize(HistoryNode.Attributes[ 'title' ]) );
209                                                                         if not AddHistory( favItem, TreeView, TreeType ) then
210                                                                                 favItem.Free;
211                                                                 end;
212                                                         //end;
213                                                 end;
214                                         end;
215                                 end;
216                         finally
217                                 XMLDoc.Free;
218                         end;
219                 except
220                 end;
221         end;
222 {$IFDEF DEBUG}
223         rt := GetTickCount - st;
224         Writeln('Runtime(Load Histroy) : ' + IntToStr(rt) + ' ms');
225 {$ENDIF}
226
227 end;
228 procedure THistoryList.SetTreeNode(
229     TreeView : TTreeView );
230 var
231         i: Integer;
232         Node: TTreeNode;
233         Item: TFavoriteThreadItem;
234 begin
235         TreeView.Items.BeginUpdate;
236         try
237                 TreeView.Items.Clear;
238                 for i := 0 to Self.Count - 1 do begin
239                         Item := TFavoriteThreadItem(Self[i]);
240                         Node := TreeView.Items.Add(nil, Item.Title);
241                         {
242                         if Item.Item.NewArrival then begin
243                                 Node.ImageIndex := ITEM_ICON_THREADNEW1;
244                                 Node.SelectedIndex := ITEM_ICON_THREADNEW2;
245                         end else begin
246                                 Node.ImageIndex := ITEM_ICON_THREADLOG1;
247                                 Node.SelectedIndex := ITEM_ICON_THREADLOG2;
248                         end;
249                         }
250                         // \95\89\89×\82ð\82©\82¯\82½\82­\82È\82¢\82Ì\82Å NewArrival \82Ì\83`\83F\83b\83N\82ð\8ds\82í\82È\82¢
251                         // \81¦Item.Item \83v\83\8d\83p\83e\83B\82Í dat \82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\95K\97v\82Æ\82·\82é
252                         Node.ImageIndex := ITEM_ICON_THREADLOG1;
253                         Node.SelectedIndex := ITEM_ICON_THREADLOG2;
254                         Node.Data := Item;
255                 end;
256         finally
257                 TreeView.Items.EndUpdate;
258         end;
259 end;
260
261 end.