OSDN Git Service

dat落ちスレの区別を追加
[gikonavigoeson/gikonavi.git] / ListViewUtils.pas
1 unit ListViewUtils;
2
3 interface
4
5 uses
6         Windows, Messages, SysUtils, Classes, Graphics, Controls,
7         BoardGroup, StdCtrls, ComCtrls;
8
9 type
10         TListViewUtils = class(TObject)
11         private
12                 {Private \90é\8c¾}
13
14                 class procedure DrawCategoryItem(BBS: TBBS; Item: TListItem; ListView: TListView);
15                 class procedure DrawBoardItem(Category: TCategory; Item: TListItem; ListView: TListView);
16                 class procedure DrawThreadItem(Board: TBoard; Item: TListItem; ListView: TListView);
17                 class procedure DrawItemLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
18                 class procedure DrawItemNoLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
19         public
20                 {Public \90é\8c¾}
21                 class procedure SetBoardTreeNode(inBBS : TBBS; treeView: TTreeView);
22                 class function SetCategoryListItem(ABBS2ch: TBBS; ListView: TListView;
23                         NumberVisible: Boolean): Integer;
24                 class procedure ListViewSort(Sender: TObject; ListView: TListView; Column: TListColumn;
25                         NumberVisible: Boolean; vSortOrder: Boolean);
26                 class function  ActiveListTrueColumn( column : TListColumn ) : TListColumn;
27                 class function SetBoardListItem(Category: TCategory; ListView: TListView;
28                         NumberVisible: Boolean): Integer;
29                 class function SetThreadListItem(Board: TBoard; ListView: TListView;
30                         NumberVisible: Boolean): Integer;
31                 class procedure ListViewData(Sender: TObject; Item: TListItem);
32         end;
33
34 implementation
35
36 uses
37         GikoSystem, Sort, Setting, Giko, MojuUtils, GikoDataModule, DateUtils, Math;
38
39 const
40         //\83c\83\8a\81[\81E\83\8a\83X\83g\83A\83C\83R\83\93
41         ITEM_ICON_2CH1                                  = 0;            //2ch\83A\83C\83R\83\93
42         ITEM_ICON_2CH2                                  = 1;            //2ch\83A\83C\83R\83\93
43         ITEM_ICON_CATEGORY1                     = 2;            //\83J\83e\83S\83\8a\83A\83C\83R\83\93
44         ITEM_ICON_CATEGORY2                     = 3;            //\83J\83e\83S\83\8a\83A\83C\83R\83\93
45         ITEM_ICON_BOARD_NOSUBJECT       = 3;    //\93Ç\82Ý\8d\9e\82Ü\82ê\82Ä\82¢\82È\82¢\94Â\83A\83C\83R\83\93
46         ITEM_ICON_BOARD1                                = 4;            //\94Â\83A\83C\83R\83\93
47         ITEM_ICON_BOARD2                                = 5;            //\94Â\83A\83C\83R\83\93
48         ITEM_ICON_THREADLOG1            = 6;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
49         ITEM_ICON_THREADLOG2            = 7;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82 \82è\81j
50         ITEM_ICON_THREAD1                               = 8;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82È\82µ\81j
51         ITEM_ICON_THREAD2                               = 9;            //\83X\83\8c\83A\83C\83R\83\93\81i\83\8d\83O\82È\82µ\81j
52         ITEM_ICON_THREADNEW1            = 10;           //\83X\83\8c\83A\83C\83R\83\93\81i\90V\92\85\81j
53         ITEM_ICON_THREADNEW2            = 11;           //\83X\83\8c\83A\83C\83R\83\93\81i\90V\92\85\81j
54         ITEM_ICON_SORT1                                 = 12;           //\83\\81[\83g\83A\83C\83R\83\93
55         ITEM_ICON_SORT2                                 = 13;           //\83\\81[\83g\83A\83C\83R\83\93
56         ITEM_ICON_BOARD_LOG                     = 17;           //\83X\83\8c\83\8d\83O\82 \82è\94Â\83A\83C\83R\83\93
57         ITEM_ICON_BOARD_NEW                     = 18;           //\83X\83\8c\90V\92\85\94Â\83A\83C\83R\83\93
58
59
60 //\83{\81[\83h\83c\83\8a\81[\90Ý\92è
61 class procedure TListViewUtils.SetBoardTreeNode(
62         inBBS : TBBS;
63         treeView : TTreeView
64 );
65 var
66         i, j, k: integer;
67         Root: TTreeNode;
68         CategoryNode: TTreeNode;
69         BoardNode: TTreeNode;
70         Category: TCategory;
71         Board: TBoard;
72 begin
73         // \94Â\83\8a\83X\83g\82Ì\90Ý\92è
74
75         TreeView.Items.BeginUpdate;
76         TreeView.Items.Clear;
77         try
78                 if not inBBS.IsBoardFileRead then
79                         GikoSys.ReadBoardFile( inBBS );
80
81                 // \83L\83\83\83r\83l\83b\83g\95\\8e¦\91O\82É\8dÄ\83\\81[\83g
82                 if ( GikoSys.Setting.BBSSortIndex <> 0 ) or ( GikoSys.Setting.BBSSortOrder <> true ) then begin
83                         Sort.SortOrder := true;
84                         Sort.SortIndex := 0;
85                         Sort.SortNoFlag := true;
86                         inBBS.Sort(CategorySortProc);
87                 end;
88
89                 Root                                                            := TreeView.Items.Add( nil, inBBS.Title );
90                 Root.ImageIndex                 := ITEM_ICON_2CH1;
91                 Root.SelectedIndex      := ITEM_ICON_2CH2;
92                 Root.Data                                               := inBBS;
93                 for i := inBBS.Count - 1 downto 0 do begin
94                         Category := TCategory(inBBS.Items[i]);
95                         CategoryNode := TreeView.Items.AddChildFirst(Root, Category.Title);
96                         CategoryNode.Data := Category;
97                         CategoryNode.ImageIndex := ITEM_ICON_CATEGORY1;
98                         CategoryNode.SelectedIndex := ITEM_ICON_CATEGORY2;
99
100                         // \83L\83\83\83r\83l\83b\83g\95\\8e¦\91O\82É\8dÄ\83\\81[\83g
101                         if ( GikoSys.Setting.CategorySortIndex <> 0 ) or ( GikoSys.Setting.CategorySortOrder <> true ) then begin
102                                 Sort.SortOrder := true;
103                                 Sort.SortIndex := 0;
104                                 Sort.SortNoFlag := true;
105                                 Category.CustomSort(BoardSortProc);
106                         end;
107
108                         for j := Category.Count - 1 downto 0 do begin
109                                 Board := TBoard(Category.Items[j]);
110                                 Board.BeginUpdate;
111                                 BoardNode := TreeView.Items.AddChildFirst(CategoryNode, Board.Title);
112                                 BoardNode.Data := Board;
113                                 //if (Board.LastGetTime = 0) or (Board.LastGetTime = ZERO_DATE) then begin
114                                 if not Board.IsLogFile then begin
115                                         BoardNode.ImageIndex := ITEM_ICON_BOARD_NOSUBJECT;
116                                         BoardNode.SelectedIndex := ITEM_ICON_BOARD_NOSUBJECT;
117                                 end else begin
118                                         BoardNode.ImageIndex := ITEM_ICON_BOARD1;
119                                         BoardNode.SelectedIndex := ITEM_ICON_BOARD2;
120                                         for k := 0 to Board.Count - 1 do begin
121                                                 if Board.Items[ k ].IsLogFile then begin
122                                                         BoardNode.ImageIndex := ITEM_ICON_BOARD_LOG;
123                                                         BoardNode.SelectedIndex := ITEM_ICON_BOARD_LOG;
124
125                                                         Break;
126                                                 end;
127                                         end;
128                                 end;
129                                 Board.EndUpdate;
130                         end;
131
132                         CategoryNode.Expanded := Category.NodeExpand;
133
134                 end;
135         finally
136                 TreeView.Items.EndUpdate;
137         end;
138 end;
139
140 //ListView\82É\83J\83e\83S\83\8a\82ð\90Ý\92è\82·\82é
141 class function TListViewUtils.SetCategoryListItem(
142         ABBS2ch: TBBS;
143         ListView: TListView;
144         NumberVisible: Boolean
145 ): Integer;
146 var
147         TitleColumn     : TListColumn;
148         ListColumn      : TListColumn;
149         i, id, idx      : Integer;
150 begin
151         ListView.Items.BeginUpdate;
152         try
153                 ListView.Columns.Clear;
154                 TitleColumn := ListView.Columns.Add;
155                 TitleColumn.Caption := GikoBBSColumnCaption[ Ord( gbbscTitle ) ];
156                 TitleColumn.Width := GikoSys.Setting.BBSColumnWidth[ Ord( gbbscTitle ) ];
157                 idx := 0;
158                 for i := 0 to GikoSys.Setting.BBSColumnOrder.Count - 1 do begin
159                         if GikoSys.Setting.BBSColumnOrder[ i ] = gbbscTitle then begin
160                                 TitleColumn.Tag := i;
161                                 idx := i;
162                         end else begin
163                                 id := Ord( GikoSys.Setting.BBSColumnOrder[ i ] );
164                                 if (Integer( Low( TGikoBBSColumnID ) ) <= id) and
165                                         (id <= Integer( High( TGikoBBSColumnID ) )) then begin
166                                         ListColumn := ListView.Columns.Add;
167         //                                      ListColumn.Tag := id;
168                                                 ListColumn.Tag := i;
169                                         ListColumn.Caption := GikoBBSColumnCaption[ id ];
170                                         ListColumn.Width := GikoSys.Setting.BBSColumnWidth[ id ];
171                                 end;
172                         end;
173                 end;
174                 TitleColumn.Index := idx;
175
176                 ListView.Items.Count := 0;
177                 ListView.Items.Clear;
178                 ListView.Items.Count := ABBS2ch.Count;
179
180                 GikoForm.ListNameLabel.Caption := ABBS2ch.Title;
181                 GikoForm.FolderImage.Picture := nil;
182                 GikoForm.ItemIcon16.GetBitmap(1, GikoForm.FolderImage.Picture.Bitmap);
183
184                 for i := ListView.Columns.Count - 1 downto 0 do begin
185                         if (GikoSys.Setting.BBSSortIndex
186                                         = Integer(GikoSys.Setting.BBSColumnOrder[ ListView.Column[ i ].Tag ])) then begin
187                                 ListViewSort( nil, ListView, ListView.Column[ i ],
188                                          NumberVisible, GikoSys.Setting.BBSSortOrder);
189                                 Break;
190                         end;
191                 end;
192
193                 Result := ABBS2ch.Count;
194         finally
195                 ListView.Items.EndUpdate;
196         end;
197 end;
198
199 class procedure TListViewUtils.ListViewSort(
200         Sender: TObject;
201         ListView: TListView;
202         Column: TListColumn;
203         NumberVisible: Boolean;
204         vSortOrder: Boolean
205 );
206 var
207         i, idx  : Integer;
208         orderList               : TList;
209         wkBBS: TBBS;
210         wkCategory: TCategory;
211         wkBoard: TBoard;
212 begin
213         idx := ActiveListTrueColumn( Column ).Tag;
214
215         for i := 0 to ListView.Columns.Count - 1 do begin
216                 ListView.Column[i].ImageIndex := -1;
217         end;
218         if vSortOrder then
219                 ListView.Column[ idx ].ImageIndex := ITEM_ICON_SORT1
220         else
221                 ListView.Column[ idx ].ImageIndex := ITEM_ICON_SORT2;
222
223
224         Sort.SortNoFlag := NumberVisible;
225
226         if TObject( GikoForm.ActiveList ) is TBBS then begin
227                 wkBBS := TBBS( GikoForm.ActiveList );
228                 orderList := GikoSys.Setting.BBSColumnOrder;
229                 Sort.SortOrder := vSortOrder;
230                 Sort.SortIndex := Integer( orderList[ idx ] );
231                 GikoSys.Setting.BBSSortIndex := Sort.SortIndex;
232                 GikoSys.Setting.BBSSortOrder := Sort.SortOrder;
233                 wkBBS.Sort(Sort.CategorySortProc);
234         end else if TObject( GikoForm.ActiveList ) is TCategory then begin
235                 wkCategory := TCategory( GikoForm.ActiveList );
236                 orderList := GikoSys.Setting.CategoryColumnOrder;
237                 Sort.SortOrder := vSortOrder;
238                 Sort.SortIndex := Integer( orderList[ idx ] );
239                 GikoSys.Setting.CategorySortIndex := Sort.SortIndex;
240                 GikoSys.Setting.CategorySortOrder := Sort.SortOrder;
241                 wkCategory.CustomSort(BoardSortProc);
242         end else if TObject( GikoForm.ActiveList ) is TBoard then begin
243                 wkBoard := TBoard( GikoForm.ActiveList );
244                 orderList := GikoSys.Setting.BoardColumnOrder;
245                 Sort.SortOrder := vSortOrder;
246                 Sort.SortIndex := Integer( orderList[ idx ] );
247                 GikoSys.Setting.BoardSortIndex := Sort.SortIndex;
248                 GikoSys.Setting.BoardSortOrder := Sort.SortOrder;
249                 wkBoard.CustomSort(ThreadItemSortProc);
250         end;
251
252         ListView.Refresh;
253 end;
254
255 {!
256 \brief          ListView \82Ì Column \82ð\90^\82Ì\83J\83\89\83\80\82É\95Ï\8a·
257
258 Delphi 6 Personal \82Å\82Ì ListView \82Å\82Í ListViewColumnClick \83C\83x\83\93\83g\82Å
259 \90³\82µ\82¢\83J\83\89\83\80\82ª\93n\82³\82ê\82È\82¢\82½\82ß\81A\90³\82µ\82¢\83J\83\89\83\80\82É\95Ï\8a·\82µ\82Ü\82·\81B
260 }
261 class function  TListViewUtils.ActiveListTrueColumn( column : TListColumn ) : TListColumn;
262 begin
263         // \90³\82µ\82­\95Ï\8a·\82·\82é\95û\96@\82ª\95ª\82©\82ç\82È\82¢\82Ì\82Å\95Û\97¯
264         Result := column;
265         Exit;
266 end;
267 //ListView\82ÉBoardItem\82ð\90Ý\92è\82·\82é
268 class function TListViewUtils.SetBoardListItem(
269         Category: TCategory;
270         ListView: TListView;
271         NumberVisible: Boolean
272 ): Integer;
273 var
274         TitleColumn     : TListColumn;
275         ListColumn      : TListColumn;
276         i, id, idx      : Integer;
277 begin
278         ListView.Items.BeginUpdate;
279         try
280                 ListView.Columns.Clear;
281                 TitleColumn := ListView.Columns.Add;
282                 TitleColumn.Caption := GikoCategoryColumnCaption[ Ord( gccTitle ) ];
283                 TitleColumn.Width := GikoSys.Setting.CategoryColumnWidth[ Ord( gccTitle ) ];
284                 idx := 0;
285                 for i := 0 to GikoSys.Setting.CategoryColumnOrder.Count - 1 do begin
286                         if GikoSys.Setting.CategoryColumnOrder[ i ] = gccTitle then begin
287                                 TitleColumn.Tag := i;
288                                 idx := i;
289                         end else begin
290                                 id := Ord( GikoSys.Setting.CategoryColumnOrder[ i ] );
291                                 if (Integer( Low( TGikoCategoryColumnID ) ) <= id) and
292                                         (id <= Integer( High( TGikoCategoryColumnID ) )) then begin
293                                         ListColumn := ListView.Columns.Add;
294 //                                              ListColumn.Tag := id;
295                                         ListColumn.Tag := i;
296                                         ListColumn.Caption := GikoCategoryColumnCaption[ id ];
297                                         ListColumn.Width := GikoSys.Setting.CategoryColumnWidth[ id ];
298                                 end;
299                         end;
300                 end;
301                 TitleColumn.Index := idx;
302
303                 ListView.Items.Count := 0;
304                 ListView.Items.Clear;
305                 ListView.Items.Count := Category.Count;
306
307                 for i := Category.Count - 1 downto 0 do begin
308                         if( Category.Items[i].ParentCategory <> Category ) then begin
309                                 Category.Items[i].ParentCategory        := Category;
310                                 Category.Items[i].No                            := i + 1;
311                         end;
312                 end;
313 //              UpFolderAction.Enabled := True;
314 //              AllItemAction.Enabled := False;
315 //              LogItemAction.Enabled := False;
316 //              NewItemAction.Enabled := False;
317 //              SelectItemAction.Enabled := False;
318 //              ListDownloadToolButton.Enabled := False;
319 //              BoardReservToolButton.Enabled := False;
320 //              ListThreadDownloadToolButton.Enabled := False;
321
322                 GikoForm.ListNameLabel.Caption := Category.Title;
323                 GikoForm.FolderImage.Picture := nil;
324                 GikoForm.ItemIcon16.GetBitmap(3, GikoForm.FolderImage.Picture.Bitmap);
325
326                 for i := ListView.Columns.Count - 1 downto 0 do begin
327                         if (GikoSys.Setting.CategorySortIndex =
328                                 Integer( GikoSys.Setting.CategoryColumnOrder[ ListView.Columns[i].Tag ] )) then begin
329                                 ListViewSort( nil, ListView, ListView.Column[ i ],
330                                          NumberVisible, GikoSys.Setting.CategorySortOrder);
331                                 Break;
332                         end;
333                 end;
334
335                 Result := Category.Count;
336         finally
337                 ListView.Items.EndUpdate;
338         end;
339 end;
340 //ListView\82ÉThreadItem\82ð\90Ý\92è\82·\82é
341 class function TListViewUtils.SetThreadListItem(
342         Board: TBoard;
343         ListView: TListView;
344         NumberVisible: Boolean
345 ): Integer;
346 var
347         TitleColumn     : TListColumn;
348         ListColumn      : TListColumn;
349         i, id, idx      : Integer;
350 begin
351         ListView.Items.BeginUpdate;
352         try
353                 //Screen.Cursor := crHourGlass;
354
355 {*
356                 // \83`\83\89\82Â\82«\96h\8e~\82Ì\82½\82ß\81A\95Ï\8dX\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Ì\82Ý
357                 // \81¦\96¼\8fÌ\82Í\88á\82¤\82ª\83J\83\89\83\80\90\94\82ª\93¯\82\81A\82Æ\82¢\82Á\82½\8fê\8d\87\82É\91Î\8f\88\82Å\82«\82È\82¢\82Ì\82Å\92\8d\88Ó
358                 if ListView.Columns.Count <> GikoSys.Setting.BoardColumnOrder.Count then
359 *}
360                 begin
361                         ListView.Columns.Clear;
362                         TitleColumn := ListView.Columns.Add;
363                         TitleColumn.Caption := GikoBoardColumnCaption[ Ord( gbcTitle ) ];
364                         TitleColumn.Width := GikoSys.Setting.BoardColumnWidth[ Ord( gbcTitle ) ];
365                         idx := 0;
366                         for i := 0 to GikoSys.Setting.BoardColumnOrder.Count - 1 do begin
367                                 if GikoSys.Setting.BoardColumnOrder[ i ] = gbcTitle then begin
368                                         TitleColumn.Tag := i;
369                                         idx := i;
370                                 end else begin
371                                         id := Ord( GikoSys.Setting.BoardColumnOrder[ i ] );
372                                         if (Integer( Low( TGikoBoardColumnID ) ) <= id) and
373                                                 (id <= Integer( High( TGikoBoardColumnID ) )) then begin
374                                                 ListColumn := ListView.Columns.Add;
375                                                 ListColumn.Caption := GikoBoardColumnCaption[ id ];
376         //                                      ListColumn.Tag := id;
377                                                 ListColumn.Tag := i;
378                                                 ListColumn.Width := GikoSys.Setting.BoardColumnWidth[ id ];
379                                                 ListColumn.Alignment := GikoBoardColumnAlignment[ id ];
380                                         end;
381                                 end;
382                         end;
383                         TitleColumn.Index := idx;
384                 end;
385
386                 ListView.Items.Count := 0;
387                 ListView.Items.Clear;
388
389                 {case GikoForm.ViewType of
390                         gvtAll: ListView.Items.Count := Board.Count;
391                         gvtLog: ListView.Items.Count := Board.GetLogThreadCount;
392                         gvtNew: ListView.Items.Count := Board.GetNewThreadCount;
393                         gvtUser: ListView.Items.Count := Board.GetUserThreadCount;
394                 end;
395                 }
396                 case GikoForm.ViewType of
397                         gvtAll: ListView.Items.Count := Board.Count;
398                         gvtLog:
399                         begin
400                                 Board.LogThreadCount := Board.GetLogThreadCount;
401                                 ListView.Items.Count := Board.LogThreadCount;
402                         end;
403                         gvtNew:
404                         begin
405                                 Board.NewThreadCount := Board.GetNewThreadCount;
406                                 ListView.Items.Count := Board.NewThreadCount;
407                         end;
408                         gvtUser:
409                         begin
410                                 Board.UserThreadCount:= Board.GetUserThreadCount;
411                                 ListView.Items.Count := Board.UserThreadCount;
412                         end;
413                 end;
414
415                 GikoForm.ListNameLabel.Caption := Board.Title;
416                 GikoForm.FolderImage.Picture := nil;
417                 GikoForm.ItemIcon16.GetBitmap(5, GikoForm.FolderImage.Picture.Bitmap);
418
419                 for i := ListView.Columns.Count - 1 downto 0 do begin
420                         if (GikoSys.Setting.BoardSortIndex
421                                 = Integer( GikoSys.Setting.BoardColumnOrder[ ListView.Columns[ i ].Tag ] )) then begin
422                                 ListViewSort( nil, ListView, ListView.Column[ i ],
423                                          NumberVisible, GikoSys.Setting.BoardSortOrder);
424                                 Break;
425                         end;
426                 end;
427
428                 Result := Board.Count;
429         finally
430                 ListView.Items.EndUpdate;
431         end;
432 end;
433
434 class procedure TListViewUtils.ListViewData(Sender: TObject; Item: TListItem);
435 var
436         ActivListObj : TObject;
437         ListView : TListView;
438 begin
439         if (Sender <> nil) and (Sender is TListView) then begin
440                 ListView := TListView(Sender);
441                 ActivListObj := GikoForm.ActiveList;
442                 if ActivListObj is TBBS then begin
443                         DrawCategoryItem(TBBS(ActivListObj), Item, ListView);
444                 end else if ActivListObj is TCategory then begin
445                         DrawBoardItem(TCategory(ActivListObj), Item, ListView);
446                 end else if ActivListObj is TBoard then begin
447                         DrawThreadItem(TBoard(ActivListObj), Item, ListView);
448                 end;
449         end;
450 end;
451 //! \83\8a\83X\83g\83r\83\85\81[\82Ì\83A\83C\83e\83\80\82ð\95`\89æ\82·\82é\81i\83J\83e\83S\83\8a\81[\97p\81j
452 class procedure TListViewUtils.DrawCategoryItem(
453         BBS: TBBS; Item: TListItem; ListView: TListView
454 );
455 var
456         Category : TCategory;
457 begin
458
459         //===== \83J\83e\83S\83\8a\83\8a\83X\83g =====
460         ListView.StateImages := nil;
461
462         if (BBS = nil) or (BBS.Count <= 0) or (Item = nil)
463                 or (Item.Index >= BBS.Count) or (ListView.Items.Count = 0)
464                 or (not (BBS.Items[Item.index] is TCategory)) then Exit;
465
466         Category := TCategory(BBS.Items[Item.index]);
467
468         if (Category = nil) then Exit;
469
470     if GikoDM.ListNumberVisibleAction.Checked then
471                 Item.Caption := IntToStr(Category.No) + ': ' + Category.Title
472         else
473                 Item.Caption := Category.Title;
474
475         Item.ImageIndex := ITEM_ICON_CATEGORY1;
476         Item.Data := Category;
477 end;
478 //! \83\8a\83X\83g\83r\83\85\81[\82Ì\83A\83C\83e\83\80\82ð\95`\89æ\82·\82é\81i\94Â\97p\81j
479 class procedure TListViewUtils.DrawBoardItem(
480         Category: TCategory; Item: TListItem; ListView: TListView
481 );
482 var
483         Board: TBoard;
484         i, idx : Integer;
485 begin
486         //===== \94Â\83\8a\83X\83g =====
487         ListView.StateImages := nil;
488
489         if (Category = nil) or (Category.Count <= 0) or (Item = nil)
490                 or (Item.Index >= Category.Count) or (ListView.Items.Count = 0)
491                 or (not (Category.Items[Item.Index] is TBoard))  then Exit;
492
493         Board := TBoard(Category.Items[Item.Index]);
494
495         if (Board = nil)  then Exit;
496
497         if GikoDM.ListNumberVisibleAction.Checked then
498                 Item.Caption := IntToStr(Board.No) + ': ' + Board.Title
499         else
500                 Item.Caption := Board.Title;
501
502         if Item.SubItems.Count <> ListView.Columns.Count then begin
503                 Item.SubItems.Clear;
504                 Item.SubItems.Capacity := GikoSys.Setting.CategoryColumnOrder.Count;
505                 for i := GikoSys.Setting.CategoryColumnOrder.Count - 1 downto 1 do
506                         Item.SubItems.Add('');
507         end;
508
509         Item.ImageIndex := ITEM_ICON_BOARD1;
510         idx := 0;
511         for i := 0 to ListView.Columns.Count - 1 do begin
512                 if GikoSys.Setting.CategoryColumnOrder.Count <= i then
513                         Break;
514                 case GikoSys.Setting.CategoryColumnOrder[ i ] of
515                 gccTitle:
516                         // Item.Caption \82Í SubItems \82É\8aÜ\82Ü\82ê\96³\82¢\82Ì\82Å
517                         Dec( idx );
518
519                 gccRoundName:
520                         if Board.Round then
521                                 Item.SubItems[ idx ] := Board.RoundName // '\97\\96ñ'
522                         else
523                                 Item.SubItems[ idx ] := '';
524
525                 gccLastModified:
526                         if Board.RoundDate = ZERO_DATE then begin
527                                 Item.SubItems[ idx ] := '';
528                         end else
529                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Board.RoundDate);
530                 end;
531                 Inc( idx );
532         end;
533
534         Item.Data := Board;
535
536 end;
537 //! \83\8a\83X\83g\83r\83\85\81[\82Ì\83A\83C\83e\83\80\82ð\95`\89æ\82·\82é\81i\83X\83\8c\83b\83h\97p\81j
538 class procedure TListViewUtils.DrawThreadItem(
539         Board: TBoard; Item: TListItem;ListView : TListView
540 );
541 var
542         ThreadItem: TThreadItem;
543         BoardCnt: Integer;
544         RepStr: String;
545         i: Integer;
546 begin
547         //===== \83X\83\8c\83\8a\83X\83g =====
548         if GikoSys.Setting.ListIconVisible then
549                 ListView.StateImages := GikoForm.StateIconImageList
550         else
551                 ListView.StateImages := nil;
552
553
554         case GikoForm.ViewType of
555                 gvtAll: BoardCnt := Board.Count;
556                 gvtLog: BoardCnt := Board.LogThreadCount;
557                 gvtNew: BoardCnt := Board.NewThreadCount;
558                 gvtUser: BoardCnt := Board.UserThreadCount;
559                 else
560                         BoardCnt := 0;
561         end;
562
563         if (BoardCnt <= 0) or (Item = nil) or (Item.Index > BoardCnt)
564                 or (ListView.Items.Count = 0) or (not (Board.Items[Item.Index] is TThreadItem)) then Exit;
565
566         //\89ü\91P\82·\82×\82«\83u\83\8d\83b\83N/////////////////////////////////////////////////////
567         ThreadItem := nil;
568         case GikoForm.ViewType of
569                 gvtAll: if Item.Index >= Board.Count then Exit else
570                                                         ThreadItem := TThreadItem(Board.Items[Item.Index]);
571                 gvtLog:         ThreadItem := Board.GetLogThread(Item.Index);
572                 gvtNew:         ThreadItem := Board.GetNewThread(Item.Index);
573                 gvtUser:        ThreadItem := Board.GetUserThread(Item.Index);
574         end;
575         //////////////////////////////////////////////////////////////////////////
576
577         if (ThreadItem = nil)  then Exit;
578
579         RepStr := CustomStringReplace(ThreadItem.Title, '&lt;', '<' );
580         RepStr := CustomStringReplace(RepStr, '&gt;', '>' );
581         RepStr := CustomStringReplace(RepStr, '&quot;', '"' );
582         RepStr := CustomStringReplace(RepStr, '&amp;', '&' );
583         //RepStr := StringReplace(RepStr, '\81\97\81M', ',', [rfReplaceAll]);
584         if Item.SubItems.Count <> ListView.Columns.Count then begin
585                 Item.SubItems.Clear;
586                 Item.SubItems.Capacity := GikoSys.Setting.BoardColumnOrder.Count;
587                 for i := GikoSys.Setting.BoardColumnOrder.Count - 1 downto 1 do
588                         Item.SubItems.Add('');
589         end;
590
591         if GikoDM.ListNumberVisibleAction.Checked then
592                 Item.Caption := IntToStr(ThreadItem.No) + ': ' + RepStr
593         else
594                 Item.Caption := RepStr;
595
596         case ThreadItem.AgeSage of
597                 gasNone: Item.StateIndex := -1;
598                 gasNew: Item.StateIndex := 0;
599                 gasAge: Item.StateIndex := 1;
600                 gasSage: Item.StateIndex := 2;
601                 gasArch: Item.StateIndex := 3;
602         end;
603
604         if ThreadItem.IsLogFile then begin
605                 DrawItemLogThread(ThreadItem, Item, ListView.Columns.Count);
606         end else begin
607                 DrawItemNoLogThread(ThreadItem, Item, GikoSys.Setting.BoardColumnOrder.Count);
608         end;
609
610         Item.Data := ThreadItem;
611 end;
612 //! \83\8d\83O\97L\82è\83X\83\8c\83b\83h\82ð\95`\89æ\82·\82é
613 class procedure TListViewUtils.DrawItemLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
614 var
615         i, idx : Integer;
616         spanday: Double;
617 begin
618         idx := 0;
619         for i := 0 to ColumnCount - 1 do begin
620                 if GikoSys.Setting.BoardColumnOrder.Count <= i then
621                         Break;
622
623                 case GikoSys.Setting.BoardColumnOrder[ i ] of
624                 gbcTitle:
625                         // Item.Caption \82Í SubItems \82É\8aÜ\82Ü\82ê\96³\82¢\82Ì\82Å
626                         Dec( idx );
627                 gbcAllCount:
628                         Item.SubItems[ idx ] := IntToStr(Thread.AllResCount);
629                 gbcLocalCount:
630                         Item.SubItems[ idx ] := IntToStr(Thread.Count);
631                 gbcNonAcqCount:
632                         Item.SubItems[ idx ] := IntToStr(Thread.AllResCount - Thread.Count);
633                 gbcNewCount:
634                         if Thread.NewResCount = 0 then
635                                 Item.SubItems[ idx ] := ''
636                         else
637                                 Item.SubItems[ idx ] := IntToStr(Thread.NewResCount);
638                 gbcUnReadCount:
639                         Item.SubItems[ idx ] := '';
640                 gbcRoundName:
641                         if Thread.Round then
642                                 Item.SubItems[ idx ] := Thread.RoundName
643                         else
644                                 Item.SubItems[ idx ] := '';
645                 gbcRoundDate://gbcLastModified:
646                         if (Thread.RoundDate = ZERO_DATE)  then begin
647                                 Item.SubItems[ idx ] := '';
648                         end else
649                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.RoundDate);
650                 gbcCreated:
651                         if Thread.CreateDate = ZERO_DATE then begin
652                                 Item.SubItems[ idx ] := '';
653                         end else
654                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.CreateDate);
655                 gbcLastModified:
656                         if (Thread.LastModified = ZERO_DATE)  then begin
657                                 Item.SubItems[ idx ] := '';
658                         end else
659                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.LastModified);
660                 gbcVigor:
661                         begin
662                                 spanday := DaySpan(Sort.GetSortDate, Thread.CreateDate);
663                                 if (spanday > 0) then begin
664                                         Item.SubItems[ idx ] := Format('%f', [Thread.AllResCount / spanday]);
665                                 end else begin
666                                         Item.SubItems[ idx ] := '';
667                                 end;
668
669                         end;
670                 end;
671                 Inc( idx );
672         end;
673
674         if Thread.NewArrival then
675                 Item.ImageIndex := ITEM_ICON_THREADNEW1
676         else
677                 Item.ImageIndex := ITEM_ICON_THREADLOG1;
678 end;
679 //! \83\8d\83O\82È\82µ\83X\83\8c\83b\83h\82ð\95`\89æ\82·\82é
680 class procedure TListViewUtils.DrawItemNoLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
681 var
682         i, idx: Integer;
683         spanday: Double;
684 begin
685         idx := 0;
686         for i := 0 to ColumnCount - 1do begin
687                 case GikoSys.Setting.BoardColumnOrder[ i ] of
688                 gbcTitle:
689                         // Item.Caption \82Í SubItems \82É\8aÜ\82Ü\82ê\96³\82¢\82Ì\82Å
690                         Dec( idx );
691                 gbcAllCount:
692                         Item.SubItems[ idx ] := IntToStr(Thread.AllResCount);
693                 gbcRoundDate://gbcLastModified:
694                         Item.SubItems[ idx ] := '';
695                 gbcCreated:
696                         if Thread.CreateDate = ZERO_DATE then begin
697                                 Item.SubItems[ idx ] := '';
698                         end else
699                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.CreateDate);
700                 gbcLastModified:
701                         Item.SubItems[ idx ] := '';
702                 gbcVigor:
703                         begin
704                                 spanday := DaySpan(Sort.GetSortDate, Thread.CreateDate);
705                                 if (spanday > 0) then begin
706                                         Item.SubItems[ idx ] := Format('%f', [Thread.AllResCount / spanday]);
707                                 end else begin
708                                         Item.SubItems[ idx ] := '';
709                                 end;
710
711                         end;
712                 else
713                         Item.SubItems[ idx ] := '';
714                 end;
715
716                 Inc( idx );
717         end;
718         if Thread.NewArrival then
719                 Item.ImageIndex := ITEM_ICON_THREADNEW1
720         else
721                 Item.ImageIndex := ITEM_ICON_THREAD1;
722 end;
723
724 end.