OSDN Git Service

This commit was manufactured by cvs2svn to create branch 'Bb62'.
[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.SetSortOrder(true);
84                         Sort.SetSortIndex(0);
85                         Sort.SetSortNoFlag(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.SetSortOrder(true);
103                                 Sort.SetSortIndex(0);
104                                 Sort.SetSortNoFlag(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.SetSortNoFlag(NumberVisible);
225
226         if TObject( GikoForm.ActiveList ) is TBBS then begin
227                 wkBBS := TBBS( GikoForm.ActiveList );
228                 orderList := GikoSys.Setting.BBSColumnOrder;
229                 Sort.SetSortOrder(vSortOrder);
230                 Sort.SetSortIndex(Integer( orderList[ idx ] ));
231                 GikoSys.Setting.BBSSortIndex := Sort.GetSortIndex;
232                 GikoSys.Setting.BBSSortOrder := Sort.GetSortOrder;
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.SetSortOrder(vSortOrder);
238                 Sort.SetSortIndex(Integer( orderList[ idx ] ));
239                 GikoSys.Setting.CategorySortIndex := Sort.GetSortIndex;
240                 GikoSys.Setting.CategorySortOrder := Sort.GetSortOrder;
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.SetSortOrder(vSortOrder);
246                 Sort.SetSortIndex(Integer( orderList[ idx ] ));
247                 GikoSys.Setting.BoardSortIndex := Sort.GetSortIndex;
248                 GikoSys.Setting.BoardSortOrder := Sort.GetSortOrder;
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                         gvtArch:
409                         begin
410                                 Board.ArchiveThreadCount := Board.GetArchiveThreadCount;
411                                 ListView.Items.Count := Board.ArchiveThreadCount;
412                         end;
413                         gvtLive:
414                         begin
415                                 Board.LiveThreadCount := Board.GetLiveThreadCount;
416                                 ListView.Items.Count := Board.LiveThreadCount;
417                         end;
418                         gvtUser:
419                         begin
420                                 Board.UserThreadCount:= Board.GetUserThreadCount;
421                                 ListView.Items.Count := Board.UserThreadCount;
422                         end;
423                 end;
424
425                 GikoForm.ListNameLabel.Caption := Board.Title;
426                 GikoForm.FolderImage.Picture := nil;
427                 GikoForm.ItemIcon16.GetBitmap(5, GikoForm.FolderImage.Picture.Bitmap);
428
429                 for i := ListView.Columns.Count - 1 downto 0 do begin
430                         if (GikoSys.Setting.BoardSortIndex
431                                 = Integer( GikoSys.Setting.BoardColumnOrder[ ListView.Columns[ i ].Tag ] )) then begin
432                                 ListViewSort( nil, ListView, ListView.Column[ i ],
433                                          NumberVisible, GikoSys.Setting.BoardSortOrder);
434                                 Break;
435                         end;
436                 end;
437
438                 Result := Board.Count;
439         finally
440                 ListView.Items.EndUpdate;
441         end;
442 end;
443
444 class procedure TListViewUtils.ListViewData(Sender: TObject; Item: TListItem);
445 var
446         ActivListObj : TObject;
447         ListView : TListView;
448 begin
449         if (Sender <> nil) and (Sender is TListView) then begin
450                 ListView := TListView(Sender);
451                 ActivListObj := GikoForm.ActiveList;
452                 if ActivListObj is TBBS then begin
453                         DrawCategoryItem(TBBS(ActivListObj), Item, ListView);
454                 end else if ActivListObj is TCategory then begin
455                         DrawBoardItem(TCategory(ActivListObj), Item, ListView);
456                 end else if ActivListObj is TBoard then begin
457                         DrawThreadItem(TBoard(ActivListObj), Item, ListView);
458                 end;
459         end;
460 end;
461 //! \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
462 class procedure TListViewUtils.DrawCategoryItem(
463         BBS: TBBS; Item: TListItem; ListView: TListView
464 );
465 var
466         Category : TCategory;
467 begin
468
469         //===== \83J\83e\83S\83\8a\83\8a\83X\83g =====
470         ListView.StateImages := nil;
471
472         if (BBS = nil) or (BBS.Count <= 0) or (Item = nil)
473                 or (Item.Index >= BBS.Count) or (ListView.Items.Count = 0)
474                 or (not (BBS.Items[Item.index] is TCategory)) then Exit;
475
476         Category := TCategory(BBS.Items[Item.index]);
477
478         if (Category = nil) then Exit;
479
480     if GikoDM.ListNumberVisibleAction.Checked then
481                 Item.Caption := IntToStr(Category.No) + ': ' + Category.Title
482         else
483                 Item.Caption := Category.Title;
484
485         Item.ImageIndex := ITEM_ICON_CATEGORY1;
486         Item.Data := Category;
487 end;
488 //! \83\8a\83X\83g\83r\83\85\81[\82Ì\83A\83C\83e\83\80\82ð\95`\89æ\82·\82é\81i\94Â\97p\81j
489 class procedure TListViewUtils.DrawBoardItem(
490         Category: TCategory; Item: TListItem; ListView: TListView
491 );
492 var
493         Board: TBoard;
494         i, idx : Integer;
495 begin
496         //===== \94Â\83\8a\83X\83g =====
497         ListView.StateImages := nil;
498
499         if (Category = nil) or (Category.Count <= 0) or (Item = nil)
500                 or (Item.Index >= Category.Count) or (ListView.Items.Count = 0)
501                 or (not (Category.Items[Item.Index] is TBoard))  then Exit;
502
503         Board := TBoard(Category.Items[Item.Index]);
504
505         if (Board = nil)  then Exit;
506
507         if GikoDM.ListNumberVisibleAction.Checked then
508                 Item.Caption := IntToStr(Board.No) + ': ' + Board.Title
509         else
510                 Item.Caption := Board.Title;
511
512         if Item.SubItems.Count <> ListView.Columns.Count then begin
513                 Item.SubItems.Clear;
514                 Item.SubItems.Capacity := GikoSys.Setting.CategoryColumnOrder.Count;
515                 for i := GikoSys.Setting.CategoryColumnOrder.Count - 1 downto 1 do
516                         Item.SubItems.Add('');
517         end;
518
519         Item.ImageIndex := ITEM_ICON_BOARD1;
520         idx := 0;
521         for i := 0 to ListView.Columns.Count - 1 do begin
522                 if GikoSys.Setting.CategoryColumnOrder.Count <= i then
523                         Break;
524                 case GikoSys.Setting.CategoryColumnOrder[ i ] of
525                 gccTitle:
526                         // Item.Caption \82Í SubItems \82É\8aÜ\82Ü\82ê\96³\82¢\82Ì\82Å
527                         Dec( idx );
528
529                 gccRoundName:
530                         if Board.Round then
531                                 Item.SubItems[ idx ] := Board.RoundName // '\97\\96ñ'
532                         else
533                                 Item.SubItems[ idx ] := '';
534
535                 gccLastModified:
536                         if Board.RoundDate = ZERO_DATE then begin
537                                 Item.SubItems[ idx ] := '';
538                         end else
539                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Board.RoundDate);
540                 end;
541                 Inc( idx );
542         end;
543
544         Item.Data := Board;
545
546 end;
547 //! \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
548 class procedure TListViewUtils.DrawThreadItem(
549         Board: TBoard; Item: TListItem;ListView : TListView
550 );
551 var
552         ThreadItem: TThreadItem;
553         BoardCnt: Integer;
554         RepStr: String;
555         i: Integer;
556 begin
557         //===== \83X\83\8c\83\8a\83X\83g =====
558         if GikoSys.Setting.ListIconVisible then
559                 ListView.StateImages := GikoForm.StateIconImageList
560         else
561                 ListView.StateImages := nil;
562
563
564         case GikoForm.ViewType of
565                 gvtAll: BoardCnt := Board.Count;
566                 gvtLog: BoardCnt := Board.LogThreadCount;
567                 gvtNew: BoardCnt := Board.NewThreadCount;
568                 gvtArch: BoardCnt := Board.ArchiveThreadCount;
569                 gvtLive: BoardCnt := Board.LiveThreadCount;
570                 gvtUser: BoardCnt := Board.UserThreadCount;
571                 else
572                         BoardCnt := 0;
573         end;
574
575         if (BoardCnt <= 0) or (Item = nil) or (Item.Index >= BoardCnt)
576                 or (ListView.Items.Count = 0) or (not (Board.Items[Item.Index] is TThreadItem)) then Exit;
577
578         //\89ü\91P\82·\82×\82«\83u\83\8d\83b\83N/////////////////////////////////////////////////////
579         ThreadItem := nil;
580         case GikoForm.ViewType of
581                 gvtAll: if Item.Index >= Board.Count then Exit else
582                                                         ThreadItem := TThreadItem(Board.Items[Item.Index]);
583                 gvtLog:         ThreadItem := Board.GetLogThread(Item.Index);
584                 gvtNew:         ThreadItem := Board.GetNewThread(Item.Index);
585                 gvtArch:    ThreadItem := Board.GetArchiveThread(Item.Index);
586                 gvtLive:    ThreadItem := Board.GetLiveThread(Item.Index);
587                 gvtUser:        ThreadItem := Board.GetUserThread(Item.Index);
588         end;
589         //////////////////////////////////////////////////////////////////////////
590
591         if (ThreadItem = nil)  then Exit;
592
593         RepStr := CustomStringReplace(ThreadItem.Title, '&lt;', '<' );
594         RepStr := CustomStringReplace(RepStr, '&gt;', '>' );
595         RepStr := CustomStringReplace(RepStr, '&quot;', '"' );
596         RepStr := CustomStringReplace(RepStr, '&amp;', '&' );
597         //RepStr := StringReplace(RepStr, '\81\97\81M', ',', [rfReplaceAll]);
598         if Item.SubItems.Count <> ListView.Columns.Count then begin
599                 Item.SubItems.Clear;
600                 Item.SubItems.Capacity := GikoSys.Setting.BoardColumnOrder.Count;
601                 for i := GikoSys.Setting.BoardColumnOrder.Count - 1 downto 1 do
602                         Item.SubItems.Add('');
603         end;
604
605         if GikoDM.ListNumberVisibleAction.Checked then
606                 Item.Caption := IntToStr(ThreadItem.No) + ': ' + RepStr
607         else
608                 Item.Caption := RepStr;
609
610         case ThreadItem.AgeSage of
611                 gasNone: Item.StateIndex := -1;
612                 gasNew: Item.StateIndex := 0;
613                 gasAge: Item.StateIndex := 1;
614                 gasSage: Item.StateIndex := 2;
615                 gasArch: Item.StateIndex := 3;
616         end;
617
618         if ThreadItem.IsLogFile then begin
619                 DrawItemLogThread(ThreadItem, Item, ListView.Columns.Count);
620         end else begin
621                 DrawItemNoLogThread(ThreadItem, Item, GikoSys.Setting.BoardColumnOrder.Count);
622         end;
623
624         Item.Data := ThreadItem;
625 end;
626 //! \83\8d\83O\97L\82è\83X\83\8c\83b\83h\82ð\95`\89æ\82·\82é
627 class procedure TListViewUtils.DrawItemLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
628 var
629         i, idx : Integer;
630         spanday: Double;
631 begin
632         idx := 0;
633         for i := 0 to ColumnCount - 1 do begin
634                 if GikoSys.Setting.BoardColumnOrder.Count <= i then
635                         Break;
636
637                 case GikoSys.Setting.BoardColumnOrder[ i ] of
638                 gbcTitle:
639                         // Item.Caption \82Í SubItems \82É\8aÜ\82Ü\82ê\96³\82¢\82Ì\82Å
640                         Dec( idx );
641                 gbcAllCount:
642                         Item.SubItems[ idx ] := IntToStr(Thread.AllResCount);
643                 gbcLocalCount:
644                         Item.SubItems[ idx ] := IntToStr(Thread.Count);
645                 gbcNonAcqCount:
646                         Item.SubItems[ idx ] := IntToStr(Thread.AllResCount - Thread.Count);
647                 gbcNewCount:
648                         if Thread.NewResCount = 0 then
649                                 Item.SubItems[ idx ] := ''
650                         else
651                                 Item.SubItems[ idx ] := IntToStr(Thread.NewResCount);
652                 gbcUnReadCount:
653                         Item.SubItems[ idx ] := '';
654                 gbcRoundName:
655                         if Thread.Round then
656                                 Item.SubItems[ idx ] := Thread.RoundName
657                         else
658                                 Item.SubItems[ idx ] := '';
659                 gbcRoundDate://gbcLastModified:
660                         if (Thread.RoundDate = ZERO_DATE)  then begin
661                                 Item.SubItems[ idx ] := '';
662                         end else
663                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.RoundDate);
664                 gbcCreated:
665                         if Thread.CreateDate = ZERO_DATE then begin
666                                 Item.SubItems[ idx ] := '';
667                         end else
668                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.CreateDate);
669                 gbcLastModified:
670                         if (Thread.LastModified = ZERO_DATE)  then begin
671                                 Item.SubItems[ idx ] := '';
672                         end else
673                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.LastModified);
674                 gbcVigor:
675                         begin
676                                 if (Thread.CreateDate <> ZERO_DATE)  then begin
677                                         if (Thread.AgeSage <> gasArch) then begin
678                                                 spanday := DaySpan(Sort.GetSortDate, Thread.CreateDate);
679                                         end else begin
680                                                 spanday := DaySpan(Thread.LastModified, Thread.CreateDate);
681                                         end;
682                                         if (spanday > 0) then begin
683                                                 Item.SubItems[ idx ] := Format('%f', [Thread.AllResCount / spanday]);
684                                         end else begin
685                                                 Item.SubItems[ idx ] := '';
686                                         end;
687                                 end else begin
688                                         Item.SubItems[ idx ] := '';
689                                 end;
690                         end;
691                 end;
692                 Inc( idx );
693         end;
694
695         if Thread.NewArrival then
696                 Item.ImageIndex := ITEM_ICON_THREADNEW1
697         else
698                 Item.ImageIndex := ITEM_ICON_THREADLOG1;
699 end;
700 //! \83\8d\83O\82È\82µ\83X\83\8c\83b\83h\82ð\95`\89æ\82·\82é
701 class procedure TListViewUtils.DrawItemNoLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
702 var
703         i, idx: Integer;
704         spanday: Double;
705 begin
706         idx := 0;
707         for i := 0 to ColumnCount - 1do begin
708                 case GikoSys.Setting.BoardColumnOrder[ i ] of
709                 gbcTitle:
710                         // Item.Caption \82Í SubItems \82É\8aÜ\82Ü\82ê\96³\82¢\82Ì\82Å
711                         Dec( idx );
712                 gbcAllCount:
713                         Item.SubItems[ idx ] := IntToStr(Thread.AllResCount);
714                 gbcRoundDate://gbcLastModified:
715                         Item.SubItems[ idx ] := '';
716                 gbcCreated:
717                         if Thread.CreateDate = ZERO_DATE then begin
718                                 Item.SubItems[ idx ] := '';
719                         end else
720                                 Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.CreateDate);
721                 gbcLastModified:
722                         Item.SubItems[ idx ] := '';
723                 gbcVigor:
724                         begin
725                                 if (Thread.CreateDate <> ZERO_DATE)  then begin
726                                         if (Thread.AgeSage <> gasArch) then begin
727                                                 spanday := DaySpan(Sort.GetSortDate, Thread.CreateDate);
728                                         end else begin
729                                                 spanday := DaySpan(Thread.LastModified, Thread.CreateDate);
730                                         end;
731
732                                         if (spanday > 0) then begin
733                                                 Item.SubItems[ idx ] := Format('%f', [Thread.AllResCount / spanday]);
734                                         end else begin
735                                                 Item.SubItems[ idx ] := '';
736                                         end;
737                                 end else begin
738                                         Item.SubItems[ idx ] := '';
739                                 end;
740                         end;
741                 else
742                         Item.SubItems[ idx ] := '';
743                 end;
744
745                 Inc( idx );
746         end;
747         if Thread.NewArrival then
748                 Item.ImageIndex := ITEM_ICON_THREADNEW1
749         else
750                 Item.ImageIndex := ITEM_ICON_THREAD1;
751 end;
752
753 end.